1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """
19 Contains unit test utility functions.
20
21 Many functions use a human readable date and time string as argument.
22 Such a string has a day, month, year and an optional time like this::
23
24 "1 Aug 2012" or "12 Jan 2017 12:05:30"
25 """
26
27 import random
28
29 from timelinelib.calendar.gregorian.gregorian import GregorianDateTime
30 from timelinelib.calendar.gregorian.monthnames import ABBREVIATED_ENGLISH_MONTH_NAMES
31 from timelinelib.calendar.gregorian.time import GregorianDelta
32 from timelinelib.calendar.gregorian.timetype import GregorianTimeType
33 from timelinelib.canvas.data import Category
34 from timelinelib.canvas.data import Container
35 from timelinelib.canvas.data import Era
36 from timelinelib.canvas.data import Event
37 from timelinelib.canvas.data import Subevent
38 from timelinelib.canvas.data import TimePeriod
39
40
41 ANY_TIME = "1 Jan 2010"
42 ANY_NUM_TIME = 10
43
44
52
53
55 """
56 Create a numeric TimePeriod object.
57 The start and end are numeric values.
58 """
59 return TimePeriod(start, end)
60
61
63 """
64 Create a :doc:`GregorianTime <timelinelib.calendar.gregorian.time>` object
65 from a human readable date and time string.
66 """
67 (year, month, day, hour, minute, seconds) = human_time_to_ymdhm(human_time)
68 return GregorianDateTime(year, month, day, hour, minute, seconds).to_time()
69
70
72 """Create a random :doc:`TimePeriod <timelinelib_canvas_data_timeperiod>` object."""
73 year = random.randint(1, 4000)
74 month = random.randint(1, 12)
75 day = random.randint(1, 28)
76 end_year = year + random.randint(1, 5)
77 end_month = random.randint(1, 12)
78 end_day = random.randint(1, 28)
79 return TimePeriod(GregorianDateTime(year, month, day, 0, 0, 0).to_time(),
80 GregorianDateTime(end_year, end_month, end_day, 0, 0, 0).to_time())
81
82
84 """
85 Convert a human readable date and time string into a tuple of
86 numeric values.
87 """
88 parts = human_time.split(" ")
89 day_part, month_part, year_part = parts[0], parts[1], parts[2]
90 day = int(day_part)
91 month = ABBREVIATED_ENGLISH_MONTH_NAMES.index(month_part) + 1
92 year = int(year_part)
93 if len(parts) == 4:
94 hour = int(parts[3][:2])
95 minute = int(parts[3][3:5])
96 if len(parts[3]) == 8:
97 seconds = int(parts[3][6:8])
98 else:
99 seconds = 0
100 else:
101 hour = 0
102 minute = 0
103 seconds = 0
104 return (year, month, day, hour, minute, seconds)
105
106
110
111
112 -def an_event_with(human_start_time=None, human_end_time=None, time=ANY_TIME,
113 text="foo", fuzzy=False, locked=False, ends_today=False,
114 category=None, default_color=None):
133
134
136 """Create a :doc:`Subevent <timelinelib_canvas_data_subevent>` object."""
137 return a_subevent_with()
138
139
151
152
165
166
173
174
176 """Create a :doc:`Category <timelinelib_canvas_data_category>` object."""
177 return a_category_with(name="category")
178
179
180 -def a_category_with(name, color=(255, 0, 0), font_color=(0, 255, 255),
181 parent=None):
189
190
192 """Create an :doc:`Era <timelinelib_canvas_data_era>` object."""
193 return a_gregorian_era_with()
194
195
209
210
212 """Create an :doc:`Era <timelinelib_canvas_data_era>` object."""
213 return a_numeric_era_with()
214
215
222
223
225 """Return the number + 1. If number is None return 8."""
226 if number is None:
227 return 8
228 else:
229 return number + 1
230
231
238
239
246
247
249 """Return the event's progress + 1. If the event's progress is None, return 8."""
250 if event.get_progress() is None:
251 return 8
252 else:
253 return (event.get_progress() + 1) % 100
254
255
265
266
267 EVENT_MODIFIERS = [
268 ("change fuzzy", lambda event:
269 event.set_fuzzy(not event.get_fuzzy())),
270 ("change locked", lambda event:
271 event.set_locked(not event.get_locked())),
272 ("change ends today", modifier_change_ends_today),
273 ("change id", lambda event:
274 event.set_id(inc(event.get_id()))),
275 ("change time period", lambda event:
276 event.set_time_period(event.get_time_period().move_delta(GregorianDelta.from_days(1)))),
277 ("change text", lambda event:
278 event.set_text("was: %s" % event.get_text())),
279 ("change category", lambda event:
280 event.set_category(new_cat(event))),
281 ("change icon", lambda event:
282 event.set_icon("was: %s" % event.get_icon())),
283 ("change description", lambda event:
284 event.set_description("was: %s" % event.get_description())),
285 ("change hyperlink", lambda event:
286 event.set_hyperlink("was: %s" % event.get_hyperlink())),
287 ("change progress", lambda event:
288 event.set_progress(new_progress(event))),
289 ("change alert", lambda event:
290 event.set_alert("was: %s" % event.get_alert())),
291 ]
292
293
294 SUBEVENT_MODIFIERS = EVENT_MODIFIERS
295
296
297 CONTAINER_MODIFIERS = [
298 ("change time period", lambda event:
299 event.set_time_period(event.get_time_period().move_delta(GregorianDelta.from_days(1)))),
300 ("change text", lambda event:
301 event.set_text("was: %s" % event.get_text())),
302 ("change category", lambda event:
303 event.set_category(new_cat(event))),
304 ]
305
306
307 CATEGORY_MODIFIERS = [
308 ("change name", lambda category:
309 category.set_name("was: %s" % category.get_name())),
310 ("change id", lambda category:
311 category.set_id(inc(category.get_id()))),
312 ("change color", lambda category:
313 category.set_color(category.get_color() + (1, 0, 3))),
314 ("change font color", lambda category:
315 category.set_font_color(category.get_font_color() + (1, 0, 3))),
316 ("change parent", lambda category:
317 category.set_parent(new_parent(category))),
318 ]
319
320
321 TIME_PERIOD_MODIFIERS = [
322 ("zoom", lambda time_period: time_period.zoom(-1)),
323 ("move left", lambda time_period: time_period.move(-1)),
324 ("move right", lambda time_period: time_period.move(1)),
325 ]
326
327
328 ERA_MODIFIERS = [
329 ("change id", lambda era: era.set_id(inc(era.get_id()))),
330 ("change time period", lambda era: era.set_time_period(era.get_time_period().move_delta(GregorianDelta.from_days(1)))),
331 ("change text", lambda era: era.set_name("was: %s" % era.get_name())),
332 ("change color", lambda era: era.set_color(tuple([x + 1 for x in era.get_color()])))
333 ]
334
335 NUM_ERA_MODIFIERS = [
336 ("change id", lambda era: era.set_id(inc(era.get_id()))),
337 ("change time period", lambda era: era.set_time_period(era.get_time_period().move_delta(1))),
338 ("change text", lambda era: era.set_name("was: %s" % era.get_name())),
339 ("change color", lambda era: era.set_color(tuple([x + 1 for x in era.get_color()])))
340 ]
341
342
343 TIME_MODIFIERS = [
344 ("add", lambda time: time + GregorianDelta(1)),
345 ]
346
347
349 """An object of this class can be treated as a boolean."""
351 self.truth_value = truth_value
352
354 return self.truth_value
355
356
370
371
373 """An object of this class is always considered equal to any other object."""
374
377 ANY = _ANY()
378 """This object is always considered equal to any other object."""
379