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

1from __future__ import absolute_import 

2 

3import datetime 

4import typing 

5 

6import pendulum 

7 

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 

15 

16 

17try: 

18 from .parsing._iso8601 import Duration as CDuration 

19except ImportError: 

20 CDuration = None 

21 

22 

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()) 

28 

29 return _parse(text, **options) 

30 

31 

32def _parse(text, **options): 

33 """ 

34 Parses a string with the given options. 

35 

36 :param text: The string to parse. 

37 :type text: str 

38 

39 :rtype: mixed 

40 """ 

41 # Handling special cases 

42 if text == "now": 

43 return pendulum.now() 

44 

45 parsed = base_parse(text, **options) 

46 

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 ) 

58 

59 if isinstance(parsed, datetime.date): 

60 return pendulum.date(parsed.year, parsed.month, parsed.day) 

61 

62 if isinstance(parsed, datetime.time): 

63 return pendulum.time( 

64 parsed.hour, parsed.minute, parsed.second, parsed.microsecond 

65 ) 

66 

67 if isinstance(parsed, _Interval): 

68 if parsed.duration is not None: 

69 duration = parsed.duration 

70 

71 if parsed.start is not None: 

72 dt = pendulum.instance(parsed.start, tz=options.get("tz", UTC)) 

73 

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 ) 

87 

88 dt = pendulum.instance(parsed.end, tz=options.get("tz", UTC)) 

89 

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 ) 

103 

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 ) 

108 

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 ) 

120 

121 return parsed