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

Source Code for Module stocks3.core.source

  1  # -*- coding: utf-8 -*- 
  2   
  3  u""" 
  4  Источник - объект, из которого возможно получение данных о котировках. Это 
  5  может быть база данных, сервер HTTP, файл, что угодно. 
  6   
  7  Основной класс этого модуля - L{Source}. Основной метод этого класса - 
  8  L{Source.runImport}. Этот метод запускает процесс импорта данных. 
  9  """ 
 10   
 11  __author__ = "Zasimov Alexey" 
 12  __email__ = "zasimov-a@yandex-team.ru" 
 13   
 14   
 15  from stocks3.core.config import Configurable, ConfigurationError 
 16  from stocks3.core import factories # подключаем фабрики 
 17  from stocks3.core.default import Default 
 18   
 19   
20 -class Source(Configurable):
21 u""" 22 Из источника данные сначала забираются (это делает транспорт), потом 23 разбираются (это делает парсер), потом вычисляются вычисляемые поля (каждый 24 объект, выданные парсером, обрабатывается калькулятором), потом приводится 25 в форму, понятную модулю записи в БД. 26 27 Задача объекта класса L{Source} - создать транспорт, парсер, калькуляторы и 28 модуль записи. То есть этот класс управляет процессом импорта 29 (L{Source.runImport}). 30 """
31 - def makeConfig(self):
32 self.default = Default() # конфигурация по умолчанию 33 34 self.active = self.readBool("", "active", True) 35 # Считываем параметры источника. 36 self._readSourceParams() 37 # Считываем параметры транспортов. 38 self._readTransports() 39 # Считываем параметры парсера. 40 self._readParser() 41 # Считываем параметры калькулятора. 42 self._readCalculators() 43 # Считываем параметры места, куда будут загружаться данные. 44 self._readPlace() 45 # Считываем параметра saver'a. 46 self._readSaver() 47 return self
48 49 # Функции для обработки XML-файла с конфигурацией
50 - def _readSourceParams(self):
51 u""" 52 Обработка <source/>. Могут присутствовать параметры: 53 - id - идентификатор источника; 54 - weight - вес источника; 55 - active - активен источник или нет? 56 """ 57 self.sourceId = self.readString("/source", "id") 58 # Человеческое имя источника. 59 self.name = self.readString("/source", "name") 60 self.weight = self.readInt("/source", "weight") 61 self.active = self.readBool("/source", "active", True)
62
63 - def _readTransports(self):
64 u""" 65 Считываем списка транспортов, используя которые можно достучаться до 66 данных котировок. 67 68 Все транспорты описываются в секции transports/transport. 69 """ 70 self.transports = self.createObjects(factories.transports, "transports/transport")
71
72 - def _readParser(self):
73 parsers = self.createObjects(factories.parsers, "parser") 74 if len(parsers) != 1: 75 raise ConfigurationError("Please, check parser configuration.") 76 self.parser = parsers[0]
77
78 - def _readSaver(self):
79 savers = self.createObjects(factories.savers, "saver", self) 80 if len(savers) != 1: 81 raise ConfigurationError("Please, check saver configuration.") 82 self.saver = savers[0]
83
84 - def _readCalculators(self):
85 calculatorsNode = self.node.find("calculators") 86 if calculatorsNode: 87 dontUseDefaultsCalculators = calculators.attrib.get("dont-use-default", False) 88 else: 89 dontUseDefaultsCalculators = False 90 if not dontUseDefaultsCalculators: 91 self.calculators = self.default.getDefaultCalculators() 92 else: 93 self.calculators = [] 94 self.calculators.extend(self.createObjects(factories.calculators, "calculators/calculator"))
95
96 - def _readPlace(self):
97 places = self.createObjects(factories.places, "place") 98 if len(places) != 1: 99 # Пытаемся взять Place из конфигурации по умолчанию 100 self.place = self.default.getDefaultPlace() 101 if self.place is None: 102 raise ConfigurationError("Please, check place configuration.") 103 else: 104 self.place = places[0]
105
106 - def process(self, transport):
107 u""" 108 Запускает процесс импорта данных из источника с использованием 109 транспорта transport. 110 """ 111 transport.transfer(self.place) 112 try: 113 # Парсем данные источника 114 for stock in self.parser.parse(self.place): 115 # Расчитываем поля. При это объект идет как по конвейеру. 116 for calculator in self.calculators: 117 stock = calculator.calc(stock) 118 # Сохраняем данные котировки 119 self.saver.save(stock) 120 self.saver.flush() 121 finally: 122 # Очищаем ресурсы, занятые транспортом 123 transport.clean()
124
125 - def transfer(self):
126 for transport in self.transports: 127 self.process(transport)
128
129 - def clean(self):
130 self.place.clean()
131 132 133 factories.sources.register("stocks3.sources.Standart", Source) 134