Package stocks3 :: Package core :: Module parser
[hide private]
[frames] | no frames]

Source Code for Module stocks3.core.parser

  1  # -*- coding: utf-8 -*- 
  2   
  3  u""" 
  4  Базовый класс для парсеров. 
  5  """ 
  6   
  7  __author__ = "Zasimov Alexey" 
  8  __email__ = "zasimov-a@yandex-team.ru" 
  9   
 10   
 11  from stocks3.core.config import Configurable 
 12  from stocks3.core.quotemaker import QuoteMaker, QuoteError 
 13  from datetime import datetime 
 14   
 15   
16 -class ParserError(Exception): pass
17
18 -class Parser(Configurable):
19 u""" 20 Парсер - разбирает данные, забранные из источника. 21 """ 22 23 DEFAULT_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" 24 25 places = [] # список классов мест (Places), с которыми может работать этот 26 # транспорт 27
28 - def makeConfig(self):
29 u""" 30 Читаем стандартные параметры парсера. 31 """ 32 self.dateTimeFormat = self.readString('', "datetime-format", self.DEFAULT_DATETIME_FORMAT) 33 self.skipUnknownQuotes = self.readBool('', 'skip-unknown-quotes', False) 34 self.closetime = self.readString('', 'closetime', '') or None 35 self._id_map = {} 36 self._exotic_tz = {} # Экзотические зоны для конкретных котировок 37 self._load_id_map() 38 return self
39
40 - def strpdate(self, dt):
41 u""" 42 Разбор времени. 43 """ 44 if self.closetime is not None: 45 return self._strpdate_with_closetime(dt) 46 else: 47 return datetime.strptime(dt, self.dateTimeFormat)
48
49 - def _strpdate_with_closetime(self, date):
50 return datetime.strptime(date+' '+self.closetime, self.dateTimeFormat)
51
52 - def parse(self, place):
53 u""" 54 Проверяет, может ли парсер работать с переданным местом (place). 55 """ 56 for validPlace in self.places: 57 if not isinstance(place, validPlace): 58 raise ParserError("Invalid place: %s" % str(place))
59
60 - def _load_id_map(self):
61 u""" 62 Загружает словарь отображений внешних идентификаторов котировок на 63 внутренние. Дело в том, что часто в данных источника котировки как-то 64 идентифицируются. Внутренние же идентификаторы котировок отличаются от 65 внешних. Словарь используется для преобразования идентификаторов. 66 """ 67 idmap = self._get_nodes_by_path("id-map/id") 68 for node in idmap: 69 if node.attrib.has_key("dual"): 70 from_ = node.attrib["dual"] 71 to = from_ 72 else: 73 from_ = node.attrib["from"] 74 to = node.attrib["to"] 75 self._id_map[from_] = to 76 # FIXME: сделать проверку корректности зоны 77 tz = node.attrib.get("timezone", None) 78 if tz is not None: 79 self._exotic_tz[from_] = tz
80
81 - def getQouteName(self, externalQouteId):
82 u""" 83 По внешнему идентификатору котировки возвращает внутренний 84 идентификатор котировки. 85 """ 86 return self._id_map[externalQouteId]
87
88 - def _getQuote(self, externalQouteId):
89 try: 90 name = self.getQouteName(externalQouteId) 91 except KeyError, e: 92 if self.skipUnknownQuotes: 93 return None 94 else: 95 raise QuoteError("Unknown quote %s" % e) 96 quoteMaker = QuoteMaker() 97 try: 98 return quoteMaker.getQuote(name) 99 except QuoteError: 100 if self.skipUnknownQuotes: 101 return None 102 else: 103 raise
104
105 - def _correct_tz(self, externalQouteId, price):
106 tz = self._exotic_tz.get(externalQouteId, None) 107 if tz is not None: 108 price.setTimezone(tz) 109 return price
110
111 - def makePrice(self, externalQouteId, date, value):
112 u""" 113 Настоятельно рекомендуется использовать именно этот метод для создания 114 котировки. Учитывает exotic_tz. 115 """ 116 quote = self._getQuote(externalQouteId) 117 if quote is None: 118 return quote 119 else: 120 price = quote.makePrice(date, value) 121 return self._correct_tz(externalQouteId, price)
122
123 - def makeDualPrice(self, externalQouteId, date, sell_value, buy_value):
124 u""" 125 Настоятельно рекомендуется использовать именно этот метод для создания 126 двойной котировки. Учитывает exotic_tz. 127 """ 128 quote = self._getQuote(externalQouteId) 129 if quote is None: 130 return qoute 131 else: 132 price = quote.makeDualPrice(date, sell_value, buy_value) 133 return self._correct_tz(externalQouteId, price)
134