Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/pendulum/parser.py : 47%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from __future__ import absolute_import
3import datetime
4import typing
6import pendulum
8from .parsing import _Interval
9from .parsing import parse as base_parse
10from .tz import UTC
13try:
14 from .parsing._iso8601 import Duration as CDuration
15except ImportError:
16 CDuration = None
19def parse(text, **options): # type: (str, **typing.Any) -> str
20 # Use the mock now value if it exists
21 options["now"] = options.get("now", pendulum.get_test_now())
23 return _parse(text, **options)
26def _parse(text, **options):
27 """
28 Parses a string with the given options.
30 :param text: The string to parse.
31 :type text: str
33 :rtype: mixed
34 """
35 # Handling special cases
36 if text == "now":
37 return pendulum.now()
39 parsed = base_parse(text, **options)
41 if isinstance(parsed, datetime.datetime):
42 return pendulum.datetime(
43 parsed.year,
44 parsed.month,
45 parsed.day,
46 parsed.hour,
47 parsed.minute,
48 parsed.second,
49 parsed.microsecond,
50 tz=parsed.tzinfo or options.get("tz", UTC),
51 )
53 if isinstance(parsed, datetime.date):
54 return pendulum.date(parsed.year, parsed.month, parsed.day)
56 if isinstance(parsed, datetime.time):
57 return pendulum.time(
58 parsed.hour, parsed.minute, parsed.second, parsed.microsecond
59 )
61 if isinstance(parsed, _Interval):
62 if parsed.duration is not None:
63 duration = parsed.duration
65 if parsed.start is not None:
66 dt = pendulum.instance(parsed.start, tz=options.get("tz", UTC))
68 return pendulum.period(
69 dt,
70 dt.add(
71 years=duration.years,
72 months=duration.months,
73 weeks=duration.weeks,
74 days=duration.remaining_days,
75 hours=duration.hours,
76 minutes=duration.minutes,
77 seconds=duration.remaining_seconds,
78 microseconds=duration.microseconds,
79 ),
80 )
82 dt = pendulum.instance(parsed.end, tz=options.get("tz", UTC))
84 return pendulum.period(
85 dt.subtract(
86 years=duration.years,
87 months=duration.months,
88 weeks=duration.weeks,
89 days=duration.remaining_days,
90 hours=duration.hours,
91 minutes=duration.minutes,
92 seconds=duration.remaining_seconds,
93 microseconds=duration.microseconds,
94 ),
95 dt,
96 )
98 return pendulum.period(
99 pendulum.instance(parsed.start, tz=options.get("tz", UTC)),
100 pendulum.instance(parsed.end, tz=options.get("tz", UTC)),
101 )
103 if CDuration and isinstance(parsed, CDuration):
104 return pendulum.duration(
105 years=parsed.years,
106 months=parsed.months,
107 weeks=parsed.weeks,
108 days=parsed.days,
109 hours=parsed.hours,
110 minutes=parsed.minutes,
111 seconds=parsed.seconds,
112 microseconds=parsed.microseconds,
113 )
115 return parsed