1
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
17
19 u"""
20 Парсер - разбирает данные, забранные из источника.
21 """
22
23 DEFAULT_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
24
25 places = []
26
27
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
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
50 return datetime.strptime(date+' '+self.closetime, self.dateTimeFormat)
51
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
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
77 tz = node.attrib.get("timezone", None)
78 if tz is not None:
79 self._exotic_tz[from_] = tz
80
82 u"""
83 По внешнему идентификатору котировки возвращает внутренний
84 идентификатор котировки.
85 """
86 return self._id_map[externalQouteId]
87
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
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