1313import sys
1414import time
1515from datetime import datetime , timedelta
16- from typing import Optional
16+ from typing import Optional , Union
1717
1818import dateutil .parser
1919
9797
9898EPOCH_START = datetime (1900 , 1 , 1 )
9999
100- if not hasattr (timedelta , "total_seconds" ):
101-
102- def total_seconds (td ):
103- return (
104- float (td .microseconds + (td .seconds + td .days * 24 * 3600 ) * 10 ** 6 )
105- / 10 ** 6
106- )
107-
108- else :
109- total_seconds = timedelta .total_seconds
100+ total_seconds = timedelta .total_seconds
110101
111102SymbolDateObject = Symbol ("DateObject" )
112103SymbolDateString = Symbol ("DateString" )
113104SymbolGregorian = Symbol ("Gregorian" )
114105
115106
116107class _Date :
117- def __init__ (self , datelist = [], absolute = None , datestr = None ):
118- datelist += [1900 , 1 , 1 , 0 , 0 , 0.0 ][len (datelist ) :]
108+ def __init__ (
109+ self , datelist_arg : Union [list , tuple ] = [], absolute = None , datestr = None
110+ ):
111+ datelist = list (datelist_arg ) + [1900 , 1 , 1 , 0 , 0 , 0.0 ][len (datelist_arg ) :]
119112 self .date = datetime (
120113 datelist [0 ],
121114 datelist [1 ],
@@ -249,7 +242,7 @@ def to_datelist(self, epochtime, evaluation: Evaluation):
249242 ]
250243 return datelist
251244
252- if not isinstance (etime , list ):
245+ if not isinstance (etime , ( list , tuple ) ):
253246 evaluation .message (form_name , "arg" , etime )
254247 return
255248
@@ -258,7 +251,7 @@ def to_datelist(self, epochtime, evaluation: Evaluation):
258251 for i , val in enumerate (etime )
259252 ):
260253 default_date = [1900 , 1 , 1 , 0 , 0 , 0.0 ]
261- datelist = etime + default_date [len (etime ) :]
254+ datelist = list ( etime ) + default_date [len (etime ) :]
262255 prec_part , imprec_part = datelist [:2 ], datelist [2 :]
263256
264257 try :
@@ -289,12 +282,16 @@ def to_datelist(self, epochtime, evaluation: Evaluation):
289282 if len (etime ) == 2 :
290283 if (
291284 isinstance (etime [0 ], str )
292- and isinstance (etime [1 ], list ) # noqa
285+ and isinstance (etime [1 ], ( list , tuple ) ) # noqa
293286 and all (isinstance (s , str ) for s in etime [1 ])
294287 ):
295288 is_spec = [
296289 str (s ).strip ('"' ) in DATE_STRING_FORMATS .keys () for s in etime [1 ]
297290 ]
291+
292+ if isinstance (etime , tuple ):
293+ etime = list (etime )
294+
298295 etime [1 ] = [str (s ).strip ('"' ) for s in etime [1 ]]
299296
300297 if sum (is_spec ) == len (is_spec ):
@@ -389,7 +386,7 @@ def eval_spec(self, epochtime, evaluation: Evaluation) -> Optional[MachineReal]:
389386 if datelist is None :
390387 return
391388
392- date = _Date (datelist = datelist )
389+ date = _Date (datelist_arg = datelist )
393390 tdelta = date .date - EPOCH_START
394391 if tdelta .microseconds == 0 :
395392 return Integer (int (total_seconds (tdelta )))
@@ -487,8 +484,8 @@ def eval(
487484 # Process dates
488485 pydate1 , pydate2 = date1 .to_python (), date2 .to_python ()
489486
490- if isinstance (pydate1 , list ): # Date List
491- idate = _Date (datelist = pydate1 )
487+ if isinstance (pydate1 , ( list , tuple ) ): # Date List
488+ idate = _Date (datelist_arg = pydate1 )
492489 elif isinstance (pydate1 , (float , int )): # Absolute Time
493490 idate = _Date (absolute = pydate1 )
494491 elif isinstance (pydate1 , str ): # Date string
@@ -497,8 +494,8 @@ def eval(
497494 evaluation .message ("DateDifference" , "date" , date1 )
498495 return
499496
500- if isinstance (pydate2 , list ): # Date List
501- fdate = _Date (datelist = pydate2 )
497+ if isinstance (pydate2 , ( list , tuple ) ): # Date List
498+ fdate = _Date (datelist_arg = pydate2 )
502499 elif isinstance (pydate2 , (int , float )): # Absolute Time
503500 fdate = _Date (absolute = pydate2 )
504501 elif isinstance (pydate1 , str ): # Date string
@@ -517,7 +514,9 @@ def eval(
517514 pyunits = units .to_python ()
518515 if isinstance (pyunits , str ):
519516 pyunits = [str (pyunits .strip ('"' ))]
520- elif isinstance (pyunits , list ) and all (isinstance (p , str ) for p in pyunits ):
517+ elif isinstance (pyunits , (list , tuple )) and all (
518+ isinstance (p , str ) for p in pyunits
519+ ):
521520 pyunits = [p .strip ('"' ) for p in pyunits ]
522521
523522 if not all (p in TIME_INCREMENTS .keys () for p in pyunits ):
@@ -762,9 +761,9 @@ def eval(
762761
763762 # Process date
764763 pydate = date .to_python ()
765- if isinstance (pydate , list ):
764+ if isinstance (pydate , ( list , tuple ) ):
766765 date_prec = len (pydate )
767- idate = _Date (datelist = pydate )
766+ idate = _Date (datelist_arg = pydate )
768767 elif isinstance (pydate , float ) or isinstance (pydate , int ):
769768 date_prec = "absolute"
770769 idate = _Date (absolute = pydate )
@@ -779,13 +778,17 @@ def eval(
779778 pyoff = off .to_python ()
780779 if isinstance (pyoff , float ) or isinstance (pyoff , int ):
781780 pyoff = [[pyoff , '"Day"' ]]
782- elif isinstance (pyoff , list ) and len (pyoff ) == 2 and isinstance (pyoff [1 ], str ):
781+ elif (
782+ isinstance (pyoff , (list , tuple ))
783+ and len (pyoff ) == 2
784+ and isinstance (pyoff [1 ], str )
785+ ):
783786 pyoff = [pyoff ]
784787
785788 # Strip " marks
786789 pyoff = [[x [0 ], x [1 ].strip ('"' )] for x in pyoff ]
787790
788- if isinstance (pyoff , list ) and all ( # noqa
791+ if isinstance (pyoff , ( list , tuple ) ) and all ( # noqa
789792 len (o ) == 2
790793 and o [1 ] in TIME_INCREMENTS .keys ()
791794 and isinstance (o [0 ], (float , int ))
@@ -940,15 +943,16 @@ def eval(
940943 self , epochtime : BaseElement , form : BaseElement , evaluation : Evaluation
941944 ) -> Optional [String ]:
942945 "DateString[epochtime_, form_]"
946+
943947 datelist = self .to_datelist (epochtime , evaluation )
944948
945949 if datelist is None :
946950 return
947951
948- date = _Date (datelist = datelist )
952+ date = _Date (datelist_arg = datelist )
949953
950954 pyform = form .to_python ()
951- if not isinstance (pyform , list ):
955+ if not isinstance (pyform , ( list , tuple ) ):
952956 pyform = [pyform ]
953957
954958 pyform = [x .strip ('"' ) for x in pyform ]
0 commit comments