Package stocks3 :: Package transports :: Module http
[hide private]
[frames] | no frames]

Source Code for Module stocks3.transports.http

  1  # -*- coding: utf-8 -*- 
  2   
  3  u""" 
  4  HTTP-транспорт. 
  5  """ 
  6   
  7  # Для совместимости с Python 2.5 
  8  from __future__ import with_statement 
  9   
 10  __author__ = "Zasimov Alexey" 
 11  __email__ = "zasimov-a@yandex-team.ru" 
 12   
 13  from stocks3.core.factories import transports 
 14  from stocks3.core.transport import Transport 
 15  from stocks3.core.place import FilePlace 
 16  from stocks3.share.curl import loadUrlData 
 17  from stocks3.core.config import ConfigurationError 
 18  from datetime import datetime 
 19  from stocks3.share.dateandtime import str_to_timedelta 
 20   
 21   
22 -class HTTPTransport(Transport):
23 u""" 24 Загружает файл или файлы по протоколу HTTP. 25 """ 26 27 places = [FilePlace] 28
29 - def makeConfig(self):
30 self.url = self.readString("query", "url") 31 self.username = self.readString("query", "username", '') or None 32 self.password = self.readString("query", "password", '') or None 33 return self
34
35 - def transfer(self, place):
36 data = loadUrlData(self.url, self.username, self.password) 37 with open(place.filename, "wb") as fd: 38 fd.write(data)
39
40 -class HTTPTransportWithDateTime(HTTPTransport):
41 u""" 42 Транспорт, который умеет обрабатывать URL, добавляя в него дату и время. 43 44 В конфигурационной ветке query могут быть указаны параметры: 45 - start и end, если в шаблоне URL присутствует параметр %{end}. 46 47 В шаблоне можно использовать параметр %{today}, если необходимо вставить 48 текущую дату. 49 50 Формат даты берется из output-datetime-format, но параметры start и end не 51 обрабатывается. Заметка: параметр end может содержать %{today} и тогда 52 будет добавлено текущее время. Вместо параметров start и end можно 53 использовать start-delta и end-delta. 54 """ 55 56 DEF_INPUT_DATETIME_FORMAT = "%d.%m.%Y %H:%M:%S" 57
58 - def makeConfig(self):
59 def to_date(ds): 60 u""" 61 Вспомогательная функция для перегонки строк в время и дату. 62 """ 63 if ds is None: 64 return None 65 if ds == "today": 66 return datetime.today() 67 else: 68 return datetime.strptime(ds, self.input_datetime_format)
69 70 HTTPTransport.makeConfig(self) 71 self.output_datetime_format = self.readString("query", "output-datetime-format") 72 self.input_datetime_format = self.readString("query", "input-datetime-format", self.DEF_INPUT_DATETIME_FORMAT) 73 74 # Определяем start и end. 75 start = self.readString("query", "start", "") or None 76 end = self.readString("query", "end", "") or None 77 start_delta = self.readString("query", "start-delta", "") or None 78 end_delta = self.readString("query", "end-delta", "") or None 79 80 start_date = to_date(start) 81 end_date = to_date(end) 82 83 84 if self.url.find("%{start}") != -1: 85 if start is None: 86 if end is None or start_delta is None: 87 raise ConfigurationError("Expected: start or end and start-delta.") 88 start_date = end_date - str_to_timedelta(start_delta) 89 90 if self.url.find("%{end}") != -1: 91 if start is None or end_delta is None: 92 raise ConfigurationError("Expected: end or start and end-delta.") 93 end_date = start_date + str_to_timedelta(end_delta) 94 95 # Обрабатываем шаблон 96 self.url = self.url.replace("%{today}", datetime.today().strftime(self.output_datetime_format)) 97 if start_date is not None: 98 self.url = self.url.replace("%{start}", start_date.strftime(self.output_datetime_format)) 99 if end_date is not None: 100 self.url = self.url.replace("%{end}", end_date.strftime(self.output_datetime_format))
101 102 103 # Регистрируем транспорты 104 transports.register("stocks3.transports.HTTP", HTTPTransport) 105 transports.register("stocks3.transports.HTTPWithDatetime", HTTPTransportWithDateTime) 106