Hide keyboard shortcuts

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 

2 

3import datetime 

4import typing 

5 

6import pendulum 

7 

8from .parsing import _Interval 

9from .parsing import parse as base_parse 

10from .tz import UTC 

11 

12 

13try: 

14 from .parsing._iso8601 import Duration as CDuration 

15except ImportError: 

16 CDuration = None 

17 

18 

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

22 

23 return _parse(text, **options) 

24 

25 

26def _parse(text, **options): 

27 """ 

28 Parses a string with the given options. 

29 

30 :param text: The string to parse. 

31 :type text: str 

32 

33 :rtype: mixed 

34 """ 

35 # Handling special cases 

36 if text == "now": 

37 return pendulum.now() 

38 

39 parsed = base_parse(text, **options) 

40 

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 ) 

52 

53 if isinstance(parsed, datetime.date): 

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

55 

56 if isinstance(parsed, datetime.time): 

57 return pendulum.time( 

58 parsed.hour, parsed.minute, parsed.second, parsed.microsecond 

59 ) 

60 

61 if isinstance(parsed, _Interval): 

62 if parsed.duration is not None: 

63 duration = parsed.duration 

64 

65 if parsed.start is not None: 

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

67 

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 ) 

81 

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

83 

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 ) 

97 

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 ) 

102 

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 ) 

114 

115 return parsed