Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/pendulum/parser.py: 38%
40 statements
« prev ^ index » next coverage.py v7.0.1, created at 2022-12-25 06:11 +0000
« prev ^ index » next coverage.py v7.0.1, created at 2022-12-25 06:11 +0000
1from __future__ import absolute_import
3import datetime
4import typing
6import pendulum
8from .date import Date
9from .datetime import DateTime
10from .parsing import _Interval
11from .parsing import parse as base_parse
12from .time import Duration
13from .time import Time
14from .tz import UTC
17try:
18 from .parsing._iso8601 import Duration as CDuration
19except ImportError:
20 CDuration = None
23def parse(
24 text, **options
25): # type: (str, **typing.Any) -> typing.Union[Date, Time, DateTime, Duration]
26 # Use the mock now value if it exists
27 options["now"] = options.get("now", pendulum.get_test_now())
29 return _parse(text, **options)
32def _parse(text, **options):
33 """
34 Parses a string with the given options.
36 :param text: The string to parse.
37 :type text: str
39 :rtype: mixed
40 """
41 # Handling special cases
42 if text == "now":
43 return pendulum.now()
45 parsed = base_parse(text, **options)
47 if isinstance(parsed, datetime.datetime):
48 return pendulum.datetime(
49 parsed.year,
50 parsed.month,
51 parsed.day,
52 parsed.hour,
53 parsed.minute,
54 parsed.second,
55 parsed.microsecond,
56 tz=parsed.tzinfo or options.get("tz", UTC),
57 )
59 if isinstance(parsed, datetime.date):
60 return pendulum.date(parsed.year, parsed.month, parsed.day)
62 if isinstance(parsed, datetime.time):
63 return pendulum.time(
64 parsed.hour, parsed.minute, parsed.second, parsed.microsecond
65 )
67 if isinstance(parsed, _Interval):
68 if parsed.duration is not None:
69 duration = parsed.duration
71 if parsed.start is not None:
72 dt = pendulum.instance(parsed.start, tz=options.get("tz", UTC))
74 return pendulum.period(
75 dt,
76 dt.add(
77 years=duration.years,
78 months=duration.months,
79 weeks=duration.weeks,
80 days=duration.remaining_days,
81 hours=duration.hours,
82 minutes=duration.minutes,
83 seconds=duration.remaining_seconds,
84 microseconds=duration.microseconds,
85 ),
86 )
88 dt = pendulum.instance(parsed.end, tz=options.get("tz", UTC))
90 return pendulum.period(
91 dt.subtract(
92 years=duration.years,
93 months=duration.months,
94 weeks=duration.weeks,
95 days=duration.remaining_days,
96 hours=duration.hours,
97 minutes=duration.minutes,
98 seconds=duration.remaining_seconds,
99 microseconds=duration.microseconds,
100 ),
101 dt,
102 )
104 return pendulum.period(
105 pendulum.instance(parsed.start, tz=options.get("tz", UTC)),
106 pendulum.instance(parsed.end, tz=options.get("tz", UTC)),
107 )
109 if CDuration and isinstance(parsed, CDuration):
110 return pendulum.duration(
111 years=parsed.years,
112 months=parsed.months,
113 weeks=parsed.weeks,
114 days=parsed.days,
115 hours=parsed.hours,
116 minutes=parsed.minutes,
117 seconds=parsed.seconds,
118 microseconds=parsed.microseconds,
119 )
121 return parsed