1
2
3 u"""
4 HTTP-транспорт.
5 """
6
7
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
23 u"""
24 Загружает файл или файлы по протоколу HTTP.
25 """
26
27 places = [FilePlace]
28
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
36 data = loadUrlData(self.url, self.username, self.password)
37 with open(place.filename, "wb") as fd:
38 fd.write(data)
39
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
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
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