OLD | NEW |
1 # This file is part of the Adblock Plus web scripts, | 1 # This file is part of the Adblock Plus web scripts, |
2 # Copyright (C) 2006-2016 Eyeo GmbH | 2 # Copyright (C) 2006-2016 Eyeo GmbH |
3 # | 3 # |
4 # Adblock Plus is free software: you can redistribute it and/or modify | 4 # Adblock Plus is free software: you can redistribute it and/or modify |
5 # it under the terms of the GNU General Public License version 3 as | 5 # it under the terms of the GNU General Public License version 3 as |
6 # published by the Free Software Foundation. | 6 # published by the Free Software Foundation. |
7 # | 7 # |
8 # Adblock Plus is distributed in the hope that it will be useful, | 8 # Adblock Plus is distributed in the hope that it will be useful, |
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
(...skipping 11 matching lines...) Expand all Loading... |
22 import traceback | 22 import traceback |
23 from StringIO import StringIO | 23 from StringIO import StringIO |
24 | 24 |
25 from sitescripts.utils import get_config | 25 from sitescripts.utils import get_config |
26 | 26 |
27 | 27 |
28 def _parse_targetspec(value, name): | 28 def _parse_targetspec(value, name): |
29 target = {} | 29 target = {} |
30 for spec in value.split(): | 30 for spec in value.split(): |
31 known = False | 31 known = False |
32 for parameter in ("extension", "application", "platform"): | 32 for parameter in ('extension', 'application', 'platform'): |
33 if spec.startswith(parameter + "="): | 33 if spec.startswith(parameter + '='): |
34 target[parameter] = spec[len(parameter + "="):] | 34 target[parameter] = spec[len(parameter + '='):] |
35 known = True | 35 known = True |
36 elif spec.startswith(parameter + "Version>="): | 36 elif spec.startswith(parameter + 'Version>='): |
37 target[parameter + "MinVersion"] = spec[len(parameter + "Version
>="):] | 37 target[parameter + 'MinVersion'] = spec[len(parameter + 'Version
>='):] |
38 known = True | 38 known = True |
39 elif spec.startswith(parameter + "Version<="): | 39 elif spec.startswith(parameter + 'Version<='): |
40 target[parameter + "MaxVersion"] = spec[len(parameter + "Version
<="):] | 40 target[parameter + 'MaxVersion'] = spec[len(parameter + 'Version
<='):] |
41 known = True | 41 known = True |
42 elif spec.startswith(parameter + "Version="): | 42 elif spec.startswith(parameter + 'Version='): |
43 target[parameter + "MinVersion"] = target[parameter + "MaxVersio
n"] = spec[len(parameter + "Version="):] | 43 target[parameter + 'MinVersion'] = target[parameter + 'MaxVersio
n'] = spec[len(parameter + 'Version='):] |
44 known = True | 44 known = True |
45 if not known: | 45 if not known: |
46 raise Exception("Unknown target specifier '%s' in file '%s'" % (spec
, name)) | 46 raise Exception("Unknown target specifier '%s' in file '%s'" % (spec
, name)) |
47 return target | 47 return target |
48 | 48 |
49 | 49 |
50 def _parse_notification(data, name): | 50 def _parse_notification(data, name): |
51 notification = {"id": name, "severity": "information", "message": {}, "title
": {}} | 51 notification = {'id': name, 'severity': 'information', 'message': {}, 'title
': {}} |
52 current = notification | 52 current = notification |
53 | 53 |
54 for line in data: | 54 for line in data: |
55 if not re.search(r"\S", line): | 55 if not re.search(r'\S', line): |
56 continue | 56 continue |
57 | 57 |
58 if re.search(r"^\[.*\]$", line): | 58 if re.search(r'^\[.*\]$', line): |
59 current = {"title": {}, "message": {}} | 59 current = {'title': {}, 'message': {}} |
60 notification.setdefault("variants", []).append(current) | 60 notification.setdefault('variants', []).append(current) |
61 continue | 61 continue |
62 | 62 |
63 if line.find("=") < 0: | 63 if line.find('=') < 0: |
64 raise Exception("Could not process line '%s' in file '%s'" % (line.s
trip(), name)) | 64 raise Exception("Could not process line '%s' in file '%s'" % (line.s
trip(), name)) |
65 | 65 |
66 key, value = map(unicode.strip, line.split("=", 1)) | 66 key, value = map(unicode.strip, line.split('=', 1)) |
67 is_variant = current != notification | 67 is_variant = current != notification |
68 | 68 |
69 if key == "inactive" and not is_variant: | 69 if key == 'inactive' and not is_variant: |
70 current["inactive"] = value.lower() not in ("", "0", "no", "false",
"off") | 70 current['inactive'] = value.lower() not in ('', '0', 'no', 'false',
'off') |
71 elif key == "severity": | 71 elif key == 'severity': |
72 if value not in ("information", "critical", "normal"): | 72 if value not in ('information', 'critical', 'normal'): |
73 raise Exception("Unknown severity value '%s' in file '%s'" % (va
lue, name)) | 73 raise Exception("Unknown severity value '%s' in file '%s'" % (va
lue, name)) |
74 current["severity"] = value | 74 current['severity'] = value |
75 elif key == "links": | 75 elif key == 'links': |
76 current["links"] = value.split() | 76 current['links'] = value.split() |
77 elif key.startswith("title."): | 77 elif key.startswith('title.'): |
78 locale = key[len("title."):] | 78 locale = key[len('title.'):] |
79 current["title"][locale] = value | 79 current['title'][locale] = value |
80 elif key.startswith("message."): | 80 elif key.startswith('message.'): |
81 locale = key[len("message."):] | 81 locale = key[len('message.'):] |
82 current["message"][locale] = value | 82 current['message'][locale] = value |
83 elif key == "target": | 83 elif key == 'target': |
84 target = _parse_targetspec(value, name) | 84 target = _parse_targetspec(value, name) |
85 if "targets" in notification: | 85 if 'targets' in notification: |
86 current["targets"].append(target) | 86 current['targets'].append(target) |
87 else: | 87 else: |
88 current["targets"] = [target] | 88 current['targets'] = [target] |
89 elif key == "sample" and is_variant: | 89 elif key == 'sample' and is_variant: |
90 current["sample"] = float(value) | 90 current['sample'] = float(value) |
91 elif key in ["start", "end"]: | 91 elif key in ['start', 'end']: |
92 current[key] = datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M") | 92 current[key] = datetime.datetime.strptime(value, '%Y-%m-%dT%H:%M') |
93 else: | 93 else: |
94 raise Exception("Unknown parameter '%s' in file '%s'" % (key, name)) | 94 raise Exception("Unknown parameter '%s' in file '%s'" % (key, name)) |
95 | 95 |
96 for text_key in ("title", "message"): | 96 for text_key in ('title', 'message'): |
97 def has_default_locale(variant): | 97 def has_default_locale(variant): |
98 return "en-US" in variant[text_key] | 98 return 'en-US' in variant[text_key] |
99 if not has_default_locale(notification): | 99 if not has_default_locale(notification): |
100 variants = notification.get("variants", []) | 100 variants = notification.get('variants', []) |
101 if not all(map(has_default_locale, variants)): | 101 if not all(map(has_default_locale, variants)): |
102 raise Exception("No %s for en-US (default language) " | 102 raise Exception('No %s for en-US (default language) ' |
103 "in file '%s'" % (text_key, name)) | 103 "in file '%s'" % (text_key, name)) |
104 return notification | 104 return notification |
105 | 105 |
106 | 106 |
107 def load_notifications(): | 107 def load_notifications(): |
108 repo = get_config().get("notifications", "repository") | 108 repo = get_config().get('notifications', 'repository') |
109 command = ["hg", "-R", repo, "archive", "-r", "default", "-t", "tar", | 109 command = ['hg', '-R', repo, 'archive', '-r', 'default', '-t', 'tar', |
110 "-p", ".", "-X", os.path.join(repo, ".hg_archival.txt"), "-"] | 110 '-p', '.', '-X', os.path.join(repo, '.hg_archival.txt'), '-'] |
111 data = subprocess.check_output(command) | 111 data = subprocess.check_output(command) |
112 | 112 |
113 notifications = [] | 113 notifications = [] |
114 with tarfile.open(mode="r:", fileobj=StringIO(data)) as archive: | 114 with tarfile.open(mode='r:', fileobj=StringIO(data)) as archive: |
115 for fileinfo in archive: | 115 for fileinfo in archive: |
116 name = fileinfo.name | 116 name = fileinfo.name |
117 if name.startswith("./"): | 117 if name.startswith('./'): |
118 name = name[2:] | 118 name = name[2:] |
119 | 119 |
120 if fileinfo.type == tarfile.REGTYPE: | 120 if fileinfo.type == tarfile.REGTYPE: |
121 data = codecs.getreader("utf8")(archive.extractfile(fileinfo)) | 121 data = codecs.getreader('utf8')(archive.extractfile(fileinfo)) |
122 try: | 122 try: |
123 notification = _parse_notification(data, name) | 123 notification = _parse_notification(data, name) |
124 if not "inactive" in notification: | 124 if not 'inactive' in notification: |
125 current_time = datetime.datetime.now() | 125 current_time = datetime.datetime.now() |
126 start = notification.pop("start", current_time) | 126 start = notification.pop('start', current_time) |
127 end = notification.pop("end", current_time) | 127 end = notification.pop('end', current_time) |
128 if not start <= current_time <= end: | 128 if not start <= current_time <= end: |
129 notification["inactive"] = True | 129 notification['inactive'] = True |
130 notifications.append(notification) | 130 notifications.append(notification) |
131 except: | 131 except: |
132 traceback.print_exc() | 132 traceback.print_exc() |
133 return notifications | 133 return notifications |
OLD | NEW |