Browse Source

Add SourceProvider : phase 2

Olivier Marty 8 years ago
parent
commit
3962f205ce
2 changed files with 45 additions and 43 deletions
  1. 4 19
      find.py
  2. 41 24
      source.py

+ 4 - 19
find.py

@@ -1,21 +1,15 @@
 import config
 from class_xml import XML
+from source import *
 
 
 def find_id():
   t = int(input('Sélectionnez la source :\n\t1 : ratp\n\t2 : transilien\n\t3 : jcdecaux_vls (vélos en libre service)\n'))
   if t == 1: # RATP
-    print('Téléchargement de la liste des lignes...')
-    xml = XML(url='http://www.ratp.fr/meteo/', lang='html')
-    dic = {tag['id']: tag['id'].replace('_', ' ') for tag in xml.data.select('.encadre_ligne')}
+    dic = SourceProvider_ratp().dic_of_names()
 
   elif t == 2: # transilien
-    print('Téléchargement de la liste des lignes...')
-    xml = XML(url='http://www.transilien.com/info-trafic/temps-reel', lang='html')
-    dic = {}
-    for line in xml.data.select('div.b_info_trafic')[0].find_all('div', recursive=False):
-      id = line.select('.picto-transport')[1].get_text()
-      dic[id] = id.replace('-', ' ')
+    dic = SourceProvider_transilien().dic_of_names()
 
   elif t == 3: # jcdecaux_vls
     print('Téléchargment de la liste des villes...')
@@ -33,16 +27,7 @@ def find_id():
       if contract in contracts:
         break;
       print("Ville inconnue !\n\n")
-    print('Téléchargement de la liste des stations...')
-    if contract:
-      xml = XML(url='https://api.jcdecaux.com/vls/v1/stations?contract=' + contract + '&apiKey=' + config.api_key['jcdecaux_vls'], lang='json')
-    else:
-      xml = XML(url='https://api.jcdecaux.com/vls/v1/stations?apiKey=' + config.api_key['jcdecaux_vls'], lang='json')
-    dic = {}
-    for sta in xml.data.json.find_all("item", recursive=False):
-      dic[sta.contract_name.string.lower() + '_' + sta.number.string] =\
-        sta.find('name').string + ' (' + sta.address.get_text() + ')'
-      # we use find('name') because .name is the current tag name
+    dic = SourceProvider_jcdecaux_vls().dic_of_names(contract)
   else:
     raise ValueError('mauvaise réponse !')
 

+ 41 - 24
source.py

@@ -9,7 +9,7 @@ class Source:
   pass
 
 class SourceProvider:
-  def dic_of_name(self):
+  def dic_of_names(self):
     """Returns a dictionnary mapping ids to name (for find.py)"""
     return []
 
@@ -21,6 +21,9 @@ class SourceProvider:
     """Returns a generator of Source these ids"""
     return []
 
+
+############## RATP ##############
+
 class Source_ratp(Source):
   def __init__(self, ident, status, message):
     self.source = 'ratp_trafic'
@@ -36,16 +39,13 @@ class SourceProvider_ratp(SourceProvider):
     self.names = None
     self.positions = None
 
-  def get_names(self):
+  def dic_of_names(self):
     if not self.names:
       print('Téléchargement de la liste des lignes ratp...')
       xml = XML(url='http://www.ratp.fr/meteo/', lang='html')
       self.names = {tag['id']: tag['id'].replace('_', ' ') for tag in xml.data.select('.encadre_ligne')}
     return self.names
 
-  def dic_of_name(self):
-    return get_names()
-
   def dic_of_positions(self):
     return {} # TODO API ratp
 
@@ -56,6 +56,8 @@ class SourceProvider_ratp(SourceProvider):
           tag['id'].replace('_', ' ') + ' : ' + tag.select('span.perturb_message')[0].string)
 
 
+############## JCDECAUX_VLS ##############
+
 class Source_jcdecaux_vls(Source):
   def __init__(self, ident, nom, timestamp, status):
     self.source = 'jcdecaux_vls'
@@ -108,10 +110,21 @@ class Source_jcdecaux_vls_empty(Source_jcdecaux_vls):
 
 class SourceProvider_jcdecaux_vls(SourceProvider):
   def __init__(self):
-    pass
+    self.names = None
 
-  def dic_of_name(self):
-    return {} # TODO
+  def dic_of_names(self, contract=None):
+    if not self.names:
+      print('Téléchargement de la liste des stations...')
+      if contract:
+        xml = XML(url='https://api.jcdecaux.com/vls/v1/stations?contract=' + contract + '&apiKey=' + config.api_key['jcdecaux_vls'], lang='json')
+      else:
+        xml = XML(url='https://api.jcdecaux.com/vls/v1/stations?apiKey=' + config.api_key['jcdecaux_vls'], lang='json')
+      self.names = {}
+      for sta in xml.data.json.find_all("item", recursive=False):
+        self.names[sta.contract_name.string.lower() + '_' + sta.number.string] =\
+          sta.find('name').string + ' (' + sta.address.get_text() + ')'
+        # we use find('name') because .name is the current tag name
+    return self.names
 
   def dic_of_positions(self):
     return {} # TODO
@@ -127,32 +140,36 @@ class SourceProvider_jcdecaux_vls(SourceProvider):
       if contract + '_' + number + '_empty' in ids:
         yield Source_jcdecaux_vls_empty(contract + '_' + number, tag.find('name').string, tag.last_update.string, tag.available_bikes.string, tag.status.string)
 
-class SourceProvider_transilien(SourceProvider):
-  class Source_transilien(Source):
-    def __init__(self, ident, message):
-      self.source = 'transilien'
-      self.id = ident
-      self.message = message
 
-    def problem(self):
-      return self.message != 'Trafic normal'
+############## TRANSILIEN ##############
+
+class Source_transilien(Source):
+  def __init__(self, ident, message):
+    self.source = 'transilien'
+    self.id = ident
+    self.message = message
+
+  def problem(self):
+    return self.message != 'Trafic normal'
+
+class SourceProvider_transilien(SourceProvider):
 
   def __init__(self):
     self.names = None
     self.positions = None
 
-  def get_names(self):
+  def dic_of_names(self):
     if not self.names:
-      print('Téléchargement de la liste des lignes ratp...')
-      xml = XML(url='http://www.ratp.fr/meteo/', lang='html')
-      self.names = {tag['id']: tag['id'].replace('_', ' ') for tag in xml.data.select('.encadre_ligne')}
+      print('Téléchargement de la liste des lignes transilien...')
+      xml = XML(url='http://www.transilien.com/info-trafic/temps-reel', lang='html')
+      self.names = {}
+      for line in xml.data.select('div.b_info_trafic')[0].find_all('div', recursive=False):
+        id = line.select('.picto-transport')[1].get_text()
+        self.names[id] = id.replace('-', ' ')
     return self.names
 
-  def dic_of_name(self):
-    return get_names()
-
   def dic_of_positions(self):
-    return {} # TODO API ratp
+    return {} # TODO
 
   def sources_of_ids(self, ids):
     xml = XML(url="http://www.transilien.com/info-trafic/temps-reel", lang="html").data