aniso8601-2.0.0/0000775000175000017500000000000013223545060014563 5ustar nielsenbnielsenb00000000000000aniso8601-2.0.0/aniso8601/0000775000175000017500000000000013223545060016213 5ustar nielsenbnielsenb00000000000000aniso8601-2.0.0/aniso8601/__pycache__/0000775000175000017500000000000013223545060020423 5ustar nielsenbnielsenb00000000000000aniso8601-2.0.0/aniso8601/__pycache__/__init__.cpython-36.pyc0000664000175000017500000000073713152332020024606 0ustar nielsenbnielsenb000000000000003 OY@sDddlmZmZmZddlmZmZddlmZddl m Z m Z dS))parse_datetime parse_timeget_time_resolution) parse_dateget_date_resolution)parse_duration)parse_intervalparse_repeating_intervalN) Zaniso8601.timerrraniso8601.daterrZaniso8601.durationrZaniso8601.intervalrr r r @/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/__init__.py s aniso8601-2.0.0/aniso8601/__pycache__/compat.cpython-36.pyc0000664000175000017500000000035313152332020024324 0ustar nielsenbnielsenb000000000000003 OY1@s(ddlZejddkZer eZneZdS)N)sys version_infoZPY2Zxrangerangerr>/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/compat.py saniso8601-2.0.0/aniso8601/__pycache__/date.cpython-36.pyc0000664000175000017500000000710313223544642023774 0ustar nielsenbnielsenb000000000000003 NZ @sddlZddlmZddZddZddZd d Zd d Zd dZddZ ddZ ddZ ej eej e ejeeje ejeejeiZdS)N)DateResolutioncCs|jds|jdrtd|jddkr|jddkr s  G aniso8601-2.0.0/aniso8601/__pycache__/duration.cpython-36.pyc0000664000175000017500000001147013223544642024706 0ustar nielsenbnielsenb000000000000003 NZ'@srddlZddlmZddlmZddlmZdddZdd Zd d Z d d Z ddZ ddZ ddZ ddZdS)N) parse_date) parse_time)compatFcCsF|ddkrtdt|dddddd gd kr8t||St||SdS) NrPz&ISO 8601 duration must start with a P.YMDHSWT) ValueError_has_any_component_parse_duration_prescribed_parse_duration_combined)ZisodurationstrrelativerH/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/duration.pyparse_durations   rc Cs|ddkrtd|jd dkr,td nN|jd dkrzd }x:|jd dD](}|jd krf|d7}|dkrNtd qNW|jddkrt|dddddgd krtd|jddkrt|\}}}}}} } nt|\}}}}}} } |d kr\yNd dl} t ||kst ||krtd| j j t |t ||||| | dSt k rZt dYnX|d|d|} t j|| || | dS)Nrrrr r r z2ISO 8601 duration must end with a valid character..zEISO 8601 allows only lowest order element to have a decimal fraction.rTz9ISO 8601 duration must end with a single valid character.zJISO 8601 week designators may not be combined with other time designators.TzCFractional months and years are not defined for relative intervals.)yearsmonthsweeksdayshoursminutessecondsz9dateutil must be installed for relative duration support.im)rrrrr)rrrr r r rr)r countsplitisalphafindr !_parse_duration_prescribed_notime_parse_duration_prescribed_timedateutil.relativedeltaint relativedelta ImportError RuntimeErrordatetime timedelta) durationstrrZ lettercount characterrrrrrrrdateutil totaldaysrrrr s4    & "rcCst|ddgrtdt|dddddgd kr6td |jdd krPt|d}nd }|jddkrnt|d}nd }|jddkrt|d}nd }|jddkrt|d}nd }d }d }d }|||||||fS)Nr r zIISO 8601 time components not allowed in duration without prescribed time.rrrrr Fz:ISO 8601 duration components must be in the correct order.rrrrrr)r r _component_order_correctr#_parse_duration_element)r-rrrrrrrrrrr$Ss(    r$c Cs^|d|jd}||jdd}t|ddgr:tdt|ddddd gd krZtd t|ddgrptdt|ddddgd krtd |jddkrt|d}nd}|jddkrt|d}nd}|jddkrt|d}nd}|jddkrt|d}nd}|jddkr$t|d}nd}|jddkrDt|d}nd}d} ||| ||||fS)Nrr r zAISO 8601 time components not allowed in date portion of duration.rrrrr Fz:ISO 8601 duration components must be in the correct order.zBISO 8601 time components in duration must be in the correct order.rrrrrrrr)r#r r r1r2) r-Z firsthalfZ secondhalfrrrrrrrrrrr%ys<      r%cCs|ddjd\}}t|}t|}|dkr~y0ddl}|jj|j|j|j|j|j |j |j dSt k rzt dYqXn6|jd|jd|j}tj||j|j |j |j d SdS) NrrTr)rrrrrr microsecondsz9dateutil must be installed for relative duration support.imr)rrrrr3)r!rrr&r(yearmonthdayhourminutesecond microsecondr)r*r+r,)r-rdateparttimepartZ datevalueZ timevaluer/r0rrrrs(rcCsld}|j|}x0tj|dddD]}||jdkr"|}Pq"W|d7}d|kr\|jdd}t|||S)NrrT,rr)r#rranger"replacefloat)r-Z elementstrZdurationstartindexZdurationendindexcharacterindexrrrr2s   r2cCs$x|D]}|j|dkrdSqWdS)NrTFr)r#)r- componentsZ componentrrrr s r cCsPd}xFtjt|D]4}||}||kr|||dkrD|j|}qdSqWdS)NrFT)rr>lenindex)r-ZcomponentorderZcomponentindexrAr.rrrr1s r1)F)r+aniso8601.dateraniso8601.timerZ aniso8601rrrr$r%rr2r r1rrrr s    3&8aniso8601-2.0.0/aniso8601/__pycache__/interval.cpython-36.pyc0000664000175000017500000000464413152332020024674 0ustar nielsenbnielsenb000000000000003 OYh@sbddlmZddlmZddlmZddlmZddd Zdd d Zdd d Z ddZ ddZ dS))datetime)parse_duration)parse_datetime) parse_date/TFcCst||||}|d|dfS)Nr)_parse_interval_parts)isointervalstrintervaldelimiterdatetimedelimiterrelativeinterval_partsr@/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/interval.pyparse_intervalsrcCs|ddkrtd|j|d\}}t|dkrBt|dd}nd}t||||d}|dkrrt|d|d|St|d|dSdS)NrRz1ISO 8601 repeating interval must start with an R.r)r ) ValueErrorsplitlenintr _date_generator_date_generator_unbounded)r r r r Z iterationpartZ intervalpart iterationsrrrrparse_repeating_interval%s  rcCs@|j|\}}|ddkr|j|dkrPt||d}t||d}|||| fSt||d}t|}|j|dkr|tj|tjj|| fS|||| fSn|ddkr8|j|dkrt||d}t||d} | | ||fSt||d}t|} |j|d kr&| tj| tjj||fS| | ||fSn|j|d kr~|j|d kr~t||d} t||d} | | | | fS|j|d kr|j|d krt||d} t|} | | tj| tjj| fS|j|dkr|j|dkrt|}t||d} || | tj|tjjfSt|}t|} || | |fSdS)NrPr)r ) delimiterrrrrrrrrr) rfindrrrrcombinemintime)r r r r Z firstpartZ secondpartdurationZ enddatetimeZenddateZ startdatetime startdateZstart_datetimeZ end_datetimeZend_dateZ start_daterrrr @sH              r ccs0|}d}x"||kr*|V||7}|d7}q WdS)Nrrr)r$ timedeltar currentdateZcurrentiterationrrrrs  rccs|}x|V||7}qWdS)Nr)r$r%r&rrrrsrN)rrF)rrF)rrF) raniso8601.durationraniso8601.timeraniso8601.daterrrr rrrrrr s       J aniso8601-2.0.0/aniso8601/__pycache__/resolution.cpython-36.pyc0000664000175000017500000000121213152332020025237 0ustar nielsenbnielsenb000000000000003 OY@s0ddlmZGdddeZGdddeZdS))compatc@s&eZdZeejd\ZZZZ Z Z dS)DateResolutionN) __name__ __module__ __qualname__listrrangeYearMonthWeekWeekdayDayOrdinalrrB/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/resolution.pyr src@s eZdZeejd\ZZZdS)TimeResolutionN) rrrrrr SecondsMinutesHoursrrrrrsrN)Z aniso8601robjectrrrrrr s aniso8601-2.0.0/aniso8601/__pycache__/time.cpython-36.pyc0000664000175000017500000000645213223544642024023 0ustar nielsenbnielsenb000000000000003 NZ@sddlZddlmZddlmZddlmZmZddZddZ dd d Z d d Z ddZ ddZ ddZddZddZeje eje ejeiZdS)N) parse_date)TimeResolution)parse_timezone UTCOffsetcCst|d}|jddkr tjS|jddkr4tjS|jdd krLt|}nt|jdd}|dkrltjS|dkrztjS|dkrtjSt ddS) Nr:.z$String is not a valid ISO 8601 time.) _split_tzcountrSecondsMinutesfindlensplitHours ValueError) isotimestrtimestrZ timestrlenrD/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/time.pyget_time_resolutions  rcCs4t|\}}|dkrt|St|}t|j|dS)N)tzinfo)r _parse_time_naiverreplace)rrtzstrrrrr parse_timeIs  rTcCs,|j|\}}t|}t|}tjj||S)N)rrrdatetimecombine)Zisodatetimestr delimiterZ isodatestrrZdatepartZtimepartrrrparse_datetimeqsr$cCstt||S)N)_RESOLUTION_MAPr)rrrrrs rcCsLt|}|dkrtjdddS|dkr.tdtj|d}ttjdd|S)Nr)hourminutez$Hour 24 may only represent midnight.)Zhours)r')floatr!timer timedelta _build_time)risohourZ hoursdeltarrr _parse_hours r.cCs|jddkr2|jd}t|d}t|d}n t|dd}t|dd}|dkrbtd|dkr|dkrztdtjddd Stj|d }ttj|d |S) Nrrrr<zMinutes must be less than 60.r&z$Hour 24 may only represent midnight.)r'r()Zminutes)r') rrintr)rr!r*r+r,)r timestrarrayr- isominuteZ minutesdeltarrr_parse_minute_times   r3cCs|jddkrF|jd}t|d}t|d}tjt|dd}n8t|dd}t|dd}tjt|ddd}|jdkrtd|d kr|dks|jdkrtd tj ddd St tj ||d |S) Nrrrr)secondsr r/zSeconds must be less than 60.r&z$Hour 24 may only represent midnight.)r'r() rrr0r!r+r)r4rZ total_secondsr*r,)rr1r-r2Z secondsdeltarrr_parse_second_times     r5cCs tjjtjj|}||jS)N)r!r"ZdateZtodayr*)r*deltaZ base_datetimerrrr,sr,cCs|jddkr4|d|jd}||jdd}nX|jddkrh|d|jd}||jdd}n$|jdr|dd}d}n|}d}||fS) N+rr-Zr r r )rendswith)rrrrrrr s  r )r )r!aniso8601.daterZaniso8601.resolutionrZaniso8601.timezonerrrrr$rr.r3r5r,r rrrr%rrrr s  :(  #aniso8601-2.0.0/aniso8601/__pycache__/timezone.cpython-36.pyc0000664000175000017500000000403413223544642024711 0ustar nielsenbnielsenb000000000000003 NZ @s&ddlZddZGdddejZdS)NcCst|dkr |dkr tdddSt|dkrNt|dd}t|dd}nXt|d kr|t|dd}t|dd }n*t|dkrt|dd}d}ntd |dd krt||d |dS|dkr|dkrtd t||d | dS)NZUTCr)nameminutesz+String is not a valid ISO 8601 time offset.+<z*Negative ISO 8601 time offset cannot be 0.)len UTCOffsetint ValueError)tzstrZtzhourZtzminuterH/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/timezone.pyparse_timezone s"     rc@s6eZdZd ddZddZddZdd Zd d ZdS) rNcCs(||_|dk rtj|d|_nd|_dS)N)r)_namedatetime timedelta _utcdelta)selfrrrrr__init__'szUTCOffset.__init__cCs|jtjddkrdj|jSt|jjd}d |jj}t|d \}}t|d\}}t|d\}}||7}|dkrdj|||S|dkrdj|||Sd j||||S)Nr)hoursz+{0} UTCrr z-{0}:{1:02}:{2:02} UTCz-1 day, {0}:{1:02}:{2:02} UTCz -{0} days, {1}:{2:02}:{3:02} UTCiiQiiQr ir )rrrformatabsdayssecondsdivmod)rZ correcteddaysZ deltasecondsrZ remainderrrr rrr__repr__2s  zUTCOffset.__repr__cCs|jS)N)r)rdtrrr utcoffsetNszUTCOffset.utcoffsetcCs|jS)N)r)rr#rrrtznameQszUTCOffset.tznamecCs tjdS)Nr)rr)rr#rrrdstTsz UTCOffset.dst)NN)__name__ __module__ __qualname__rr"r$r%r&rrrrr&s  r)rrtzinforrrrr saniso8601-2.0.0/aniso8601/tests/0000775000175000017500000000000013223545060017355 5ustar nielsenbnielsenb00000000000000aniso8601-2.0.0/aniso8601/tests/__pycache__/0000775000175000017500000000000013223545060021565 5ustar nielsenbnielsenb00000000000000aniso8601-2.0.0/aniso8601/tests/__pycache__/test_date.cpython-36.pyc0000664000175000017500000001522413223544655026204 0ustar nielsenbnielsenb000000000000003 NZ@slddlZddlZddlmZmZmZmZmZmZm Z m Z ddl m Z Gdddej ZGdddej ZdS)N) parse_date _parse_year_parse_calendar_day_parse_calendar_month_parse_week_day _parse_week_parse_ordinal_dateget_date_resolution)DateResolutionc@s4eZdZddZddZddZddZd d Zd S) TestDateResolutionFunctionscCs:|jtdtj|jtdtj|jtdtjdS)N2013000119) assertEqualr r ZYear)selfrO/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/tests/test_date.pytest_get_date_resolution_yearsz9TestDateResolutionFunctions.test_get_date_resolution_yearcCs|jtdtjdS)Nz1981-04)rr r ZMonth)rrrrtest_get_date_resolution_monthsz:TestDateResolutionFunctions.test_get_date_resolution_monthcCs:|jtdtj|jtdtj|jtdtjdS)Nz2004-W53z2009-W012004W53)rr r ZWeek)rrrrtest_get_date_resolution_weeksz9TestDateResolutionFunctions.test_get_date_resolution_weekcCs(|jtdtj|jtdtjdS)Nz 2004-W53-62004W536)rr r ZWeekday)rrrr%test_get_date_resolution_year_weekdayszATestDateResolutionFunctions.test_get_date_resolution_year_weekdaycCs(|jtdtj|jtdtjdS)Nz1981-0951981095)rr r ZOrdinal)rrrr%test_get_date_resolution_year_ordinal!szATestDateResolutionFunctions.test_get_date_resolution_year_ordinalN)__name__ __module__ __qualname__rrrrrrrrrr s r c@sleZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdS)TestDateParserFunctionscCstd}|j|tjdddtd}|j|tjdddtd}|j|tjdddtd}|j|tjdd d td }|j|tjdd d td }|j|tjdd dtd }|j|tjddd|j|jdtd}|j|tjddd|j|jdtd}|j|tjddd|j|jd td}|j|tjddd|j|jdtd}|j|tjddd|j|jd td}|j|tjdd d td}|j|tjdd d dS)Nr ir rilz 1981-04-05i19810405z1981-04z2004-W53i rz2009-W01iz 2004-W53-6irrz1981-095r)rrdatetimedateweekday)rr'rrrtest_parse_date&s>z'TestDateParserFunctions.test_parse_datecCs^td}|j|tjdddtd}|j|tjdddtd}|j|tjddddS)Nr irr ril)rrr&r')rr'rrrtest_parse_yearSs z'TestDateParserFunctions.test_parse_yearc Cs"|jttdWdQRXdS)N0) assertRaises ValueErrorr)rrrrtest_parse_year_zero]s z,TestDateParserFunctions.test_parse_year_zerocCs@td}|j|tjdddtd}|j|tjddddS)Nz 1981-04-05ir r!r")rrr&r')rr'rrrtest_parse_calendar_daybsz/TestDateParserFunctions.test_parse_calendar_daycCs"td}|j|tjddddS)Nz1981-04ir r)rrr&r')rr'rrrtest_parse_calendar_monthisz1TestDateParserFunctions.test_parse_calendar_monthc Cs"|jttdWdQRXdS)NZ198104)r,r-r)rrrr"test_parse_calendar_month_nohyphenms z:TestDateParserFunctions.test_parse_calendar_month_nohyphencCsttd}|j|tjddd|j|jdtd}|j|tjddd|j|jd td }|j|tjd dd |j|jd td}|j|tjd dd|j|jd td}|j|tjddd|j|jdtd}|j|tjddd|j|jd td}|j|tjd dd |j|jd td}|j|tjd dd|j|jd dS)Nz 2004-W53-6irr!z 2009-W01-1ir#r%rz 2009-W53-7iz 2010-W01-1r rZ2009W011Z2009W537Z2010W011)rrr&r'r()rr'rrrtest_parse_week_dayrs0z+TestDateParserFunctions.test_parse_week_daycCsttd}|j|tjddd|j|jdtd}|j|tjddd|j|jdtd }|j|tjd dd |j|jdtd }|j|tjd dd|j|jdtd}|j|tjddd|j|jdtd}|j|tjddd|j|jdtd}|j|tjd dd |j|jdtd}|j|tjd dd|j|jddS)Nz2004-W53ir#r$rz2009-W01ir%z2009-W53iz2010-W01irr rZ2009W01Z2009W53Z2010W01)rrr&r'r()rr'rrrtest_parse_weeks0z'TestDateParserFunctions.test_parse_weekcCs|td}|j|tjdddtd}|j|tjdddtd}|j|tjdddtd }|j|tjd dddS) Nz1981-095ir r!rZ1981365r#Z1980366i)rrr&r')rr'rrrtest_parse_ordinal_datesz/TestDateParserFunctions.test_parse_ordinal_datec Cs"|jttdWdQRXdS)NZ1981000)r,r-r)rrrrtest_parse_ordinal_date_zeros z4TestDateParserFunctions.test_parse_ordinal_date_zeroc Cs"|jttdWdQRXdS)NZ1981366)r,r-r)rrrrtest_parse_ordinal_date_nonleaps z7TestDateParserFunctions.test_parse_ordinal_date_nonleapc Cs"|jttdWdQRXdS)NZ1981367)r,r-r)rrrr test_parse_ordinal_date_overflows z8TestDateParserFunctions.test_parse_ordinal_date_overflowN)rrrr)r*r.r/r0r1r4r6r8r9r:r;rrrrr%s- !! r)r&ZunittestZaniso8601.daterrrrrrrr Zaniso8601.resolutionr TestCaser rrrrr s ( aniso8601-2.0.0/aniso8601/tests/__pycache__/test_duration.cpython-36.pyc0000664000175000017500000003637613223544655027127 0ustar nielsenbnielsenb000000000000003 NZ%W@shddlZddlZddlZddlmZmZmZmZmZm Z m Z m Z Gdddej Z Gdddej ZdS)N)parse_duration_parse_duration_prescribed_parse_duration_combined!_parse_duration_prescribed_notime_parse_duration_prescribed_time_parse_duration_element_has_any_component_component_order_correctc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+S),TestDurationParserFunctionscCstd}|j|tjdddtd}|j|tjdddtd}|j|tjdddtd}|j|tjdd td }|j|tjd d td }|j|tjd d td }|j|tjddddtd}|j|tjddddtd}|j|tjdd td}|j|tjdd td}|j|tjdd td}|j|tjdd td}|j|tjdd td}|j|tjdd td}|j|tjdd td}|j|tjd d td!}|j|tjd d td"}|j|tjd#d td$}|j|tjd%d td&}|j|tjd%d td'}|j|tjd(d)dd*d+td,}|j|tjd(d)dd-d+|jtd.td/dS)0NP1Y2M3DT4H54M6SiiD)dayssecondszP1Y2M3DT4H54M6.5Sg;@zP1Y2M3DT4H54M6,5SP1Y2M3D)r z P1Y2M3.5Dgz@z P1Y2M3,5Dz PT4H54M6.5S6g@)hoursminutesr z PT4H54M6,5SP1YimzP1.5Yg@zP1,5YP1MzP1.5M-zP1,5MP1WzP1.5Wg%@zP1,5WP1DzP1.5Dg?zP1,5DzP0003-06-04T12:30:05i )r rrr zP0003-06-04T12:30:05.5g@PT36HP1DT12H)r assertEqualdatetime timedelta)selfresultdurationr$S/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/tests/test_duration.pytest_parse_durationsZz/TestDurationParserFunctions.test_parse_durationc Cs"|jttdWdQRXdS)NZ1Y2M3DT4H54M6S) assertRaises ValueErrorr)r"r$r$r%test_parse_duration_nopYs z3TestDurationParserFunctions.test_parse_duration_nopc Cs"|jttdWdQRXdS)NZP1Y2W)r'r(r)r"r$r$r%#test_parse_duration_weekcombination^s z?TestDurationParserFunctions.test_parse_duration_weekcombinationcACs|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttd WdQRXdS) NP1SP1D1SP1H1M 1Y2M3D1SPT1M P1Y2M3D2MT1S P2M3D1ST1Y1M P1Y2M2MT3D1SP1D1Y1MPT1S1H)r'r(r)r"r$r$r%test_parse_duration_outoforderds$         z:TestDurationParserFunctions.test_parse_duration_outofordercCs@|jttdWdQRX|jttdWdQRXdS)N P1DasdfasdfzP0003-06-04T12:30:05.5asdfasdf)r'r(r)r"r$r$r%!test_parse_duration_suffixgarbages  z=TestDurationParserFunctions.test_parse_duration_suffixgarbagecCstdd}|j|tjdddddtdd}|j|tjdddd dtd d}|j|tjdddd dtd d}|j|tjddd d td d}|j|tjddd d tdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjddtdd}|j|tjd dtd!d}|j|tjd dtd"d}|j|tjd#dtd$d}|j|tjd%dtd&d}|j|tjd%d|jtd'td(dS))Nr Firr)r rrr zP1Y2M3DT4H54M6.5Sg@zP1Y2M3DT4H54M6,5Sz PT4H54M6.5S)rrr z PT4H54M6,5Sr)r z P1Y2M3.5Dgz@z P1Y2M3,5DrimzP1.5Yg@zP1,5YrrzP1.5MrzP1,5MrrzP1.5Wg%@zP1,5WrrzP1.5Dg?zP1,5Drr)rrr r!r)r"r#r$r$r%test_parse_duration_prescribedsR                    z:TestDurationParserFunctions.test_parse_duration_prescribedc Cs$|jttddWdQRXdS)NzP1Y2M3DT4H5.1234M6.1234SF)r'r(r)r"r$r$r%0test_parse_duration_prescribed_multiplefractionss zLTestDurationParserFunctions.test_parse_duration_prescribed_multiplefractionsc Cs$|jttddWdQRXdS)NzP1Y2M3DT4H5.1234M6SF)r'r(r)r"r$r$r%-test_parse_duration_prescribed_middlefractions zITestDurationParserFunctions.test_parse_duration_prescribed_middlefractionc Cs$|jttddWdQRXdS)Nr5F)r'r(r)r"r$r$r%,test_parse_duration_prescribed_suffixgarbages zHTestDurationParserFunctions.test_parse_duration_prescribed_suffixgarbagec Cs0td}|j|dtd}|j|dtd}|j|dtd }|j|dtd }|j|dtd }|j|dtd }|j|dtd}|j|dtd}|j|dtd}|j|dtd}|j|d td}|j|d!td}|j|d"td}|j|d#td}|j|d$dS)%Nrrrz P1Y2M3.5D @z P1Y2M3,5DrzP1.5Y?zP1,5YrzP1.5MzP1,5MrzP1.5WzP1,5WrzP1.5DzP1,5D)rr<rr=rrr)rr<rr>rrr)rr<rr>rrr)rrrrrrr)r?rrrrrr)r?rrrrrr)rrrrrrr)rr?rrrrr)rr?rrrrr)rrrrrrr)rrr?rrrr)rrr?rrrr)rrrrrrr)rrrr?rrr)rrrr?rrr)rr)r"r#r$r$r%%test_parse_duration_prescribed_notimes<              zATestDurationParserFunctions.test_parse_duration_prescribed_notimec%Cs|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)Nr+r,r-Z P1Y2M3D4HZ P1Y2M3D4H5S)r'r(r)r"r$r$r%.test_parse_duration_prescribed_notime_timepart s     zJTestDurationParserFunctions.test_parse_duration_prescribed_notime_timepartcCs@|jttdWdQRX|jttdWdQRXdS)Nr-r2)r'r(r)r"r$r$r%0test_parse_duration_prescribed_notime_outoforders  zLTestDurationParserFunctions.test_parse_duration_prescribed_notime_outoforderc Cshtd}|j|dtd }|j|dtd }|j|dtd }|j|dtd }|j|ddS)Nr rr<rr=rrr7zP1Y2M3DT4H54M6.5S@zP1Y2M3DT4H54M6,5Sz PT4H54M6.5Sz PT4H54M6,5S)rr<rr=rrr7)rr<rr=rrrC)rr<rr=rrrC)rrrrrrrC)rrrrrrrC)rr)r"r#r$r$r%#test_parse_duration_prescribed_time$s    z?TestDurationParserFunctions.test_parse_duration_prescribed_timecCs@|jttdWdQRX|jttdWdQRXdS)NZP1Y2M3D4HT54M6SZP1Y2M3D6ST4H54M)r'r(r)r"r$r$r%.test_parse_duration_prescribed_time_timeindate4s  zJTestDurationParserFunctions.test_parse_duration_prescribed_time_timeindatecCs@|jttdWdQRX|jttdWdQRXdS)NZP2M3DT1Y4H54M6SZP1Y2MT3D4H54M6S)r'r(r)r"r$r$r%.test_parse_duration_prescribed_time_dateintime<s  zJTestDurationParserFunctions.test_parse_duration_prescribed_time_dateintimecCs||jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)Nr.r/r0r1)r'r(r)r"r$r$r%.test_parse_duration_prescribed_time_outoforderDs    zJTestDurationParserFunctions.test_parse_duration_prescribed_time_outofordercCsLtdd}|j|tjdddddtdd}|j|tjdddd ddS) NzP0003-06-04T12:30:05Firrr)r rrr zP0003-06-04T12:30:05.5g@)rrr r!)r"r#r$r$r%test_parse_duration_combinedSs  z8TestDurationParserFunctions.test_parse_duration_combinedc Cs"|jttdWdQRXdS)NzP0003-06-04T12:30:05.5asdfasdf)r'r(r)r"r$r$r%*test_parse_duration_combined_suffixgarbageZs zFTestDurationParserFunctions.test_parse_duration_combined_suffixgarbagecCs|jtddd|jtddd|jtddd|jtdd d |jtddd |jtdd d |jtdd d |jtddd|jtdd ddS)NrYrMr<Dr=z T4H5M6.1234SHrrSg s(eaniso8601-2.0.0/aniso8601/tests/__pycache__/test_init.cpython-36.pyc0000664000175000017500000000301013223544655026220 0ustar nielsenbnielsenb000000000000003 NZ<@s.ddlZddlZddlZGdddejZdS)Nc@seZdZddZdS)TestInitFunctionsc Csvtjd}|j|tjddddtjd}|j|jddtjdd d dd d d d|j}|j|jdtj dd|j|j ddtj d}|j|tj dd d tj d}|j|tj dddtjd}|j|dtjddd ddd|j|dtjdd d dddttjd}|j|dtj dd d d|j|dtj dd dd|j|dtj dd dddS) Nz01:23:45-)hourminutesecondz1981-04-05T23:21:28.512400Z)tzinfoii)rrr microsecondr)hoursUTC19810405P1Y2M3DT4H54M6SiiD)dayssecondsz'1980-03-05T01:01:00/1981-04-05T01:01:00i)yearmonthdayrrzR3/1981-04-05/P1D)rrr) aniso8601 parse_time assertEqualdatetimetimeparse_datetimereplacer utcoffset timedeltatzname parse_datedateparse_durationparse_intervallistparse_repeating_interval)selfr ZresultdatetimeZ tzinfoobjectr'resultdurationZresultintervalresultsr/O/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/tests/test_init.py test_imports$  (     zTestInitFunctions.test_importN)__name__ __module__ __qualname__r1r/r/r/r0r sr)unittestrrTestCaserr/r/r/r0 saniso8601-2.0.0/aniso8601/tests/__pycache__/test_interval.cpython-36.pyc0000664000175000017500000003642613223544655027122 0ustar nielsenbnielsenb000000000000003 NZs@sddlZddlZddlZddlmZddlmZmZm Z Gdddej Z Gdddej Z Gdd d ej Z Gd d d ej ZdS) N)compat)parse_intervalparse_repeating_interval_parse_interval_partsc@seZdZddZddZdS)TestIntervalParserFunctionsc Cstd}|j|dtjdddddd|j|dtjddd dddtd }|j|dtjdddd |j|dtjddd d td }|j|dtjd ddd |j|dtjd ddddtd}|j|dtjd ddd |j|dtjd dddddddtd}|j|dtjdddddd|j|dtjddd dddtd}|j|dtjdddd |j|dtjddd d td}|j|dtjd ddd |j|dtjd dddddtd}|j|dtjd ddd |j|dtjd ddddd ddtd}|j|dtjdddddd|j|dtjddddddtd}|j|dtjdddddd|j|dtjdddd td }|j|dtjdddd |j|dtjddddddtd!}|j|dtjdddd |j|dtjdddd td"}|j|dtjdddd |j|dtjdddd td#d$d%}|j|dtjdddddd|j|dtjddddddtd&d'd(}|j|dtjdddddd|j|dtjdddddddS))NzP1M/1981-04-05T01:01:00ri)yearmonthdayhourminutezP1M/1981-04-05)r r r zPT1H/2014-11-12i )r r r r zPT4H54M6.5S/2014-11-125i )r r r r rsecond microsecondz1981-04-05T01:01:00/P1M1DT1Mz1981-04-05/P1M1Dz2014-11-12/PT1Hz2014-11-12/PT4H54M6.5S6z'1980-03-05T01:01:00/1981-04-05T01:01:00iz1980-03-05T01:01:00/1981-04-05z1980-03-05/1981-04-05T01:01:00z1980-03-05/1981-04-05z1981-04-05/1980-03-05z(1980-03-05T01:01:00--1981-04-05T01:01:00z--)intervaldelimiterz'1980-03-05 01:01:00/1981-04-05 01:01:00 )datetimedelimiter)r assertEqualdatetimedate)selfresultintervalr"S/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/tests/test_interval.pytest_parse_intervalsZ  $   $         z/TestIntervalParserFunctions.test_parse_intervalcCs||jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)Nz 2001/P1Dasdfz P1Dasdf/2001z#2001/P0003-06-04T12:30:05.5asdfasdfz#P0003-06-04T12:30:05.5asdfasdf/2001) assertRaises ValueErrorr)r r"r"r#!test_parse_interval_suffixgarbageNs    z=TestIntervalParserFunctions.test_parse_interval_suffixgarbageN)__name__ __module__ __qualname__r$r'r"r"r"r#rs=rc@seZdZddZddZdS)#TestRelativeIntervalParserFunctionsc Csjtddd}|j|dtjdddddd |j|dtjdd dddd td dd}|j|dtjdddd |j|dtjdd dd td dd}|j|dtjdddd |j|dtjdddddtddd}|j|dtjdddd |j|dtjddddddddtddd}|j|dtjdddddd |j|dtjdddddd tddd}|j|dtjdddd |j|dtjdddd tddd}|j|dtjdddd |j|dtjdddddd tddd}|j|dtjdddd |j|dtjddddddddtddd}|j|dtjd dd!d |j|dtjd dd!d td"dd}|j|dtjd dd#d |j|dtjd dd$d td%dd}|j|dtjd dd#d |j|dtjd d d#d td&dd}|j|dtjd'dd$d |j|dtjd(dd$d td)dd}|j|dtjd*dd$d |j|dtjd'dd$d td+dd}|j|dtjd*d dd |j|dtjd'd dd td,dd}|j|dtjd(dd$d |j|dtjd'dd$d td-dd}|j|dtjd(d dd |j|dtjd'd dd td.dd}|j|dtjd/d dddd |j|dtjdddddd td0dd}|j|dtjd/d dddd |j|dtjdddd td1dd}|j|dtjd/d dd |j|dtjdddddd td2dd}|j|dtjd/d dd |j|dtjdddd td3dd}|j|dtjdddd |j|dtjd/d dd td4d5dd6}|j|dtjd/d dddd |j|dtjdddddd td7d8dd9}|j|dtjd/d dddd |j|dtjdddddd dS):NzP1M/1981-04-05T01:01:00T)relativerirrr )r r r r rrzP1M/1981-04-05)r r r zPT1H/2014-11-12irrr)r r r r zPT4H54M6.5S/2014-11-12rri )r r r r rrrz1981-04-05T01:01:00/P1M1DT1Mrrz1981-04-05/P1M1Dz2014-11-12/PT1Hz2014-11-12/PT4H54M6.5Srz2003-01-27/P1Miz2003-01-31/P1Mz2003-01-31/P2Mz2000-02-28/P1Yiiz1999-02-28/P1Yiz1999-03-01/P1YzP1Y/2001-02-28zP1Y/2001-03-01z'1980-03-05T01:01:00/1981-04-05T01:01:00iz1980-03-05T01:01:00/1981-04-05z1980-03-05/1981-04-05T01:01:00z1980-03-05/1981-04-05z1981-04-05/1980-03-05z(1980-03-05T01:01:00--1981-04-05T01:01:00z--)rr,z'1980-03-05 01:01:00/1981-04-05 01:01:00r)rr,)rrrr)r r!r"r"r#test_parse_interval_relative^s      $       $                    z@TestRelativeIntervalParserFunctions.test_parse_interval_relativec Cs|jttdddWdQRX|jttdddWdQRX|jttdddWdQRX|jttdddWdQRXdS)Nz 2001/P1DasdfT)r,z P1Dasdf/2001z#2001/P0003-06-04T12:30:05.5asdfasdfz#P0003-06-04T12:30:05.5asdfasdf/2001)r%r&r)r r"r"r#*test_parse_interval_relative_suffixgarbages    zNTestRelativeIntervalParserFunctions.test_parse_interval_relative_suffixgarbageN)r(r)r*r0r1r"r"r"r#r+]s_r+c@s4eZdZddZddZddZddZd d Zd S) $TestRepeatingIntervalParserFunctionsc Csttd}|j|dtjdddd|j|dtjdddd|j|d tjddd dttd }xFtjdd D]6}|j||tjd ddddd|tjdd dqzWttddd}|j|dtjd ddddd|j|dtjddddddttddd}|j|dtjd ddddd|j|dtjddddddtd}xHtjdd D]8}|jt|tjd ddddd|tjdd dqjWdS)NzR3/1981-04-05/P1Drirr)r r r r rrzR11/PT1H2M/1980-03-05T01:01:00rir)r r r r r)hoursminutesz,R2--1980-03-05T01:01:00--1981-04-05T01:01:00z--)rz*R2/1980-03-05 01:01:00/1981-04-05 01:01:00r)rzR/PT1H2M/1980-03-05T01:01:00) listrrrrrrange timedeltanext)r results dateindexresultgeneratorr"r"r#test_parse_repeating_intervals   6    zBTestRepeatingIntervalParserFunctions.test_parse_repeating_intervalcCs@|jttdWdQRX|jttdWdQRXdS)NzR3/1981-04-05/P1Dasdfz,R3/1981-04-05/P0003-06-04T12:30:05.5asdfasdf)r%r&r)r r"r"r#+test_parse_repeating_interval_suffixgarbages  zPTestRepeatingIntervalParserFunctions.test_parse_repeating_interval_suffixgarbagec Cs:ttddd}|j|dtjdddd|j|d tjddd d|j|d tjddd dttd dd}xFtjddD]6}|j||tjdddd d d|tjd d dqWttdddd}|j|dtjdddd d d|j|d tjdddd d dttdddd}|j|dtjdddd d d|j|d tjdddd d dttddd}|j|dtjdddd|j|d tjdddd|j|d tjdd dd|j|dtjdd ddtddd}xHtjddD]8}|jt|tjdddd d d|tjd d dqWdS)NzR3/1981-04-05/P1DT)r,rirr)r r r r rrr3zR11/PT1H2M/1980-03-05T01:01:00rir)r r r r r)r4r5z,R2--1980-03-05T01:01:00--1981-04-05T01:01:00z--)rr,z*R2/1980-03-05 01:01:00/1981-04-05 01:01:00r)rr,zR4/2017-04-30T00:00:00/P1MizR/PT1H2M/1980-03-05T01:01:00) r6rrrrrr7r8r9)r r:r;r<r"r"r#&test_parse_repeating_interval_relatives*6     zKTestRepeatingIntervalParserFunctions.test_parse_repeating_interval_relativecCsD|jttdddWdQRX|jttdWdQRXdS)NzR3/1981-04-05/P1DasdfT)r,z,R3/1981-04-05/P0003-06-04T12:30:05.5asdfasdf)r%r&r)r r"r"r#4test_parse_repeating_interval_relative_suffixgarbages  zYTestRepeatingIntervalParserFunctions.test_parse_repeating_interval_relative_suffixgarbagecCspddl}ddl}|}d|jd<|jttdddWdQRX|jttdddWdQRX||jd<dS)NrdateutilzR3/1981-04-05/P1DT)r,zR4/2017-04-30T00:00:00/P1M)sysrBmodulesr% RuntimeErrorr)r rCrBdateutil_importr"r"r#1test_parse_repeating_interval_relative_nodateutils   zVTestRepeatingIntervalParserFunctions.test_parse_repeating_interval_relative_nodateutilN)r(r)r*r=r>r@rArGr"r"r"r#r2s    r2c@s$eZdZddZddZddZdS)TestIntervalPartParserFunctionsc Cstd}|j|dtjdddddd|j|dtjddd ddd|j|d tjd d  td }|j|dtjdddd|j|dtjddd d|j|d tjd d  td}|j|dtjdddd|j|dtjddddd|j|d tjdd td}|j|dtjdddd|j|dtjdddddddd|j|d tjdddd td}|j|dtjdddddd|j|dtjddd dd d|j|d tjddd td!}|j|dtjdddd|j|dtjddd d|j|d tjdd td"}|j|dtjdddd|j|dtjdddddd|j|d tjddtd#}|j|dtjdddd|j|dtjdddddd dd|j|d tjddddtd$}|j|dtjd%ddddd|j|dtjdddddd|j|d tjd&d td'}|j|dtjd%ddddd|j|dtjdddd|j|d tjd(d)d*d+td,}|j|dtjd%ddd|j|dtjdddddd|j|d tjd&ddd+td-}|j|dtjd%ddd|j|dtjdddd|j|d tjd&d td.}|j|dtjdddd|j|dtjd%ddd|j|d tjd&d  td/d0d1}|j|dtjd%ddddd|j|dtjdddddd|j|d tjd&d td2d3d4}|j|dtjd%ddddd|j|dtjdddddd|j|d tjd&d dS)5NzP1M/1981-04-05T01:01:00rirrr )r r r r rrrrr?)dayszP1M/1981-04-05)r r r zPT1H/2014-11-12irrr)r r r r )r4zPT4H54M6.5S/2014-11-12rri )r r r r rrrrg@)r4r5secondsz1981-04-05T01:01:00/P1M1DT1Mr.)rIr5z1981-04-05/P1M1Dz2014-11-12/PT1Hz2014-11-12/PT4H54M6.5Sz'1980-03-05T01:01:00/1981-04-05T01:01:00iiz1980-03-05T01:01:00/1981-04-05i;)rIr4r5z1980-03-05/1981-04-05T01:01:00z1980-03-05/1981-04-05z1981-04-05/1980-03-05z(1980-03-05T01:01:00--1981-04-05T01:01:00z--)rz'1980-03-05 01:01:00/1981-04-05 01:01:00r)r)rrrr8r)r r!r"r"r#test_parse_interval_parts)sx  $   $          z9TestIntervalPartParserFunctions.test_parse_interval_partsc Cs$tddd}|j|dtjdddddd |j|dtjdd dddd |j|d tjjdd  td dd}|j|dtjdddd|j|dtjdd dd|j|d tjjdd  tddd}|j|dtjdddd|j|dtjddddd|j|d tjjdd tddd}|j|dtjdddd|j|dtjdddddddd|j|d tjjdddd tddd}|j|dtjdddddd |j|dtjddddd d |j|d tjjdddd td!dd}|j|dtjdddd|j|dtjdddd|j|d tjjddd"td#dd}|j|dtjdddd|j|dtjdddddd |j|d tjjddtd$dd}|j|dtjdddd|j|dtjdddddddd|j|d tjjddddtd%dd}|j|dtjd&dd'd|j|dtjd&d d'd|j|d tjjdd td(dd}|j|dtjd&dd)d|j|dtjd&d d*d|j|d tjjdd td+dd}|j|dtjd&dd)d|j|dtjd&d d)d|j|d tjjd d td,dd}|j|dtjd-d d*d|j|dtjd.d d*d|j|d tjjdd/td0dd}|j|dtjd1d d*d|j|dtjd-d d*d|j|d tjjdd/td2dd}|j|dtjd1d dd|j|dtjd-d dd|j|d tjjdd/td3dd}|j|dtjd.d d*d|j|dtjd-d d*d|j|d tjjdd/ td4dd}|j|dtjd.d dd|j|dtjd-d dd|j|d tjjdd/ dS)5NzP1M/1981-04-05T01:01:00T)r,rirrr )r r r r rrr)monthszP1M/1981-04-05)r r r zPT1H/2014-11-12irrr)r r r r )r4zPT4H54M6.5S/2014-11-12rri )r r r r rrrrg@)r4r5rJz1981-04-05T01:01:00/P1M1DT1Mr)rNrIr5z1981-04-05/P1M1D)rNrIz2014-11-12/PT1Hz2014-11-12/PT4H54M6.5Sz2003-01-27/P1Mir-z2003-01-31/P1Mr.r/z2003-01-31/P2Mz2000-02-28/P1Yii)yearsz1999-02-28/P1Yiz1999-03-01/P1YzP1Y/2001-02-28zP1Y/2001-03-01)rrrrB relativedeltar)r r!r"r"r#"test_parse_interval_parts_relativeus      $        $        zBTestIntervalPartParserFunctions.test_parse_interval_parts_relativec CsNddl}ddl}|}d|jd<|jttdddWdQRX||jd<dS)NrrBzP1M/1981-04-05T01:01:00T)r,)rCrBrDr%rEr)r rCrBrFr"r"r#-test_parse_interval_parts_relative_nodateutils  zMTestIntervalPartParserFunctions.test_parse_interval_parts_relative_nodateutilN)r(r)r*rMrQrRr"r"r"r#rH(sLSrH)unittestrdateutil.relativedeltarB aniso8601raniso8601.intervalrrrTestCaserr+r2rHr"r"r"r# s Mo\aniso8601-2.0.0/aniso8601/tests/__pycache__/test_time.cpython-36.pyc0000664000175000017500000002624513223544655026232 0ustar nielsenbnielsenb000000000000003 NZN@s^ddlZddlZddlmZddlmZmZmZmZm Z m Z m Z m Z m Z GdddejZdS)N)TimeResolution) get_time_resolution parse_timeparse_datetime_parse_time_naive _parse_hour_parse_minute_time_parse_second_time _build_time _split_tzc@s\eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ dS)TestTimeParserFunctionscCs|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtd tj|jtd tj|jtd tj|jtd tj|jtd tj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtjdS)Nz01:23:45z24:00:00z23:21:28.512400z01:23z24:00z 01:23.4567012345240000012324000124z12.5z232128.512400+00:00z0123.4567+00:00z 01.4567+00:00z01:23:45+00:00z24:00:00+00:00z23:21:28.512400+00:00z 01:23+00:00z 24:00+00:00z01:23.4567+00:00z23:21:28.512400+11:15z23:21:28.512400-12:34z23:21:28.512400Zz06:14:00.000123Z) assertEqualrrSecondsMinutesHours)selfrO/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/tests/test_time.pytest_get_time_resolutionsJ           z0TestTimeParserFunctions.test_get_time_resolutionc,Cstd}|j|tjddddtd}|j|tjddtd }|j|tjdd d d d td}|j|tjdddtd}|j|tjddtd}|j|tjddddd td}|j|tjddddtd}|j|tjddtd}|j|tjdddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd}|j|tjdddtd}|j|jddtjdd d d d |j}|j|jdtjdd|j|jdd td!}|j|jddtjddddd |j}|j|jdtjdd|j|jdd td"}|j|jddtjddd#d$d |j}|j|jdtjdd|j|jdd td%}|j|jddtjdddd|j}|j|jdtjdd|j|jdd td&}|j|jddtjdd|j}|j|jdtjdd|j|jdd td'}|j|jddtjdd d d d |j}|j|jdtjdd|j|jdd td(}|j|jddtjddd|j}|j|jdtjdd|j|jdd td)}|j|jddtjdd|j}|j|jdtjdd|j|jdd td*}|j|jddtjddddd |j}|j|jdtjdd|j|jdd td+}|j|jddtjdd d d d |j}|j|jdtjd,d-d.|j|jdd/td0}|j|jddtjdd d d d |j}|j|jdtjdd1d. |j|jdd2td3}|j|jddtjdd d d d |j}|j|jdtjdd|j|jdd4td5}|j|jddtjd6d7d8d9|j}|j|jdtjdd|j|jdd4|j t td:WdQRX|j t td;WdQRX|j t td<WdQRX|j t td=WdQRX|j t td>WdQRX|j t td?WdQRXdS)@Nz01:23:45-)hourminutesecondz24:00:00r)rz23:21:28.512400i)rrr microsecondz01:23)rrz24:00z 01:23.4567iP"r rrrrrz12.5 z232128.512400+00:00)tzinfo)hoursz+00:00z0123.4567+00:00z 01.4567+00:00iz01:23:45+00:00z24:00:00+00:00z23:21:28.512400+00:00z 01:23+00:00z 24:00+00:00z01:23.4567+00:00z23:21:28.512400+11:15 )r(minutesz+11:15z23:21:28.512400-12:34"z-12:34z23:21:28.512400ZUTCz06:14:00.000123Z{)rrr#z00:00:60z 00:00:60Zz00:00:60+00:00z00:61z00:61Zz 00:61+00:00) rrdatetimetimereplacer' utcoffset timedeltatzname assertRaises ValueError)rr3 tzinfoobjectrrrtest_parse_time9s""" """""       z'TestTimeParserFunctions.test_parse_timec:Cs|td}|j|jddtjddddddd d |j}|j|jdtjd d |j|jdd td}|j|jddtjddddddd d |j}|j|jdtjddd |j|jddtd}|j|jddtjddddddd|j}|j|jdtjd d |j|jddtd}|j|jddtjddddddd|j}|j|jdtjd d |j|jdd|jt tdWdQRX|jt tdWdQRX|jt tdWdQRX|jt tdWdQRX|jt tdWdQRX|jt tdWdQRX|jt tdWdQRX|jt tdWdQRXdS) Nz1981-04-05T23:21:28.512400Z)r'irr!r"i)rrr r#r)r(r.z1981095T23:21:28.512400-12:34r%r-)r(r,z-12:34z19810405T23:21:28+00)rrr z+00z19810405T23:21:28+00:00z+00:00z2016-12-31T23:59:60+00:00z2016-12-31T23:59:60z1981-04-05T00:00:60z1981-04-05T00:00:60Zz1981-04-05T00:00:60+00:00z1981-04-05T00:61z1981-04-05T00:61Zz1981-04-05T00:61+00:00) rrr4r2r'r5r6r7r8r9)rresultdatetimer:rrrtest_parse_datetimesH((&&        z+TestTimeParserFunctions.test_parse_datetimec Csltdd}|j|jddtjddddddd d |j}|j|jdtjd d d  |j|jdddS)Nz 2004-W53-6 23:21:28.512400-12:34 )r'irrr!r"i)rrr r#r%r-)r(r,z-12:34)rrr4r2r'r5r6r7)rr>r:rrr"test_parse_datetime_spaceseperateds  (z:TestTimeParserFunctions.test_parse_datetime_spaceseperatedcCsJtd}|j|tjddddtd}|j|tjddtd }|j|tjdd d d d td}|j|tjdddtd}|j|tjddtd}|j|tjddddd td}|j|tjddddtd}|j|tjddtd}|j|tjdddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd}|j|tjdd d d d td}|j|tjddddd td}|j|tjddddd |jttdWdQRX|jttd WdQRX|jttd!WdQRX|jttd"WdQRXdS)#Nz01:23:45rrr)rrr z24:00:00r)rz23:21:28.512400r!r"i)rrr r#z01:23)rrz24:00z 01:23.4567r$iP"r rrrrrz 232128.512400z 0123.4567z01.4567r)iz00:00:60z00:00:60+00:00z00:61z 00:61+00:00)rrr2r3r8r9)rr3rrrtest_parse_time_naive sL    z-TestTimeParserFunctions.test_parse_time_naivec Cstd}|j|tjddtd}|j|tjddtd}|j|tjdddd d td }|j|tjd d d|jttdWdQRXdS)Nrr)rrrz01.4567r$r)i)rrr r#z12.5r%r&)rrz24.1)rrr2r3r8r9)rr3rrrtest_parse_hourFs z'TestTimeParserFunctions.test_parse_hourc:Cstd}|j|tjdddtd}|j|tjddtd}|j|tjddd d d td }|j|tjdddtd }|j|tjddtd}|j|tjddd d d |jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)Nz01:23rr)rrz24:00r)rz 01:23.4567r$iP")rrr r#rrz 0123.4567Z0060z0060.1z00:60z00:60.1Z2401z2400.1z24:01z24:00.1)rrr2r3r8r9)rr3rrrtest_parse_minute_timeVs8        z.TestTimeParserFunctions.test_parse_minute_timec:Cstd}|j|tjddddtd}|j|tjddtd }|j|tjdd d d d td}|j|tjddddtd}|j|tjddtd}|j|tjdd d d d |jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)Nz01:23:45rrr)rrr z24:00:00r)rz23:21:28.512400r!r"i)rrr r#r rz 232128.512400Z000060z00:00:60Z006000z00:60:00Z240001z24:00:01Z240100z24:01:00)r rr2r3r8r9)rr3rrrtest_parse_second_times8        z.TestTimeParserFunctions.test_parse_second_timecCsZ|jttjddtjddddtjddd d d |jttjjtjdd tjjdS) Nr)rg?g@gffffff @)r(r,secondsr+i)rrr r#) microseconds)rr r2r3r6maxmin)rrrrtest_build_times4z'TestTimeParserFunctions.test_build_timecCs|jtdd#|jtdd$|jtdd%|jtdd&|jtdd'|jtdd(|jtdd)|jtdd*|jtd d+|jtd d,|jtd d-|jtd d.|jtd d/|jtdd0|jtdd1|jtdd2|jtdd3|jtdd4|jtdd5|jtdd6|jtdd7|jtdd8|jtdd9|jtdd:|jtdd;|jtd!d<dS)=N01:23:4524:00:0023:21:28.51240001:2324:00 01:23.4567r rrrrr12.5z232128.512400+00:00 232128.512400+00:00z0123.4567+00:00 0123.4567z 01.4567+00:0001.4567z01:23:45+00:00z24:00:00+00:00z23:21:28.512400+00:00z 01:23+00:00z 24:00+00:00z01:23.4567+00:00z23:21:28.512400+11:15+11:15z23:21:28.512400-12:34-12:34z23:21:28.512400ZZz06:14:00.000123Z06:14:00.000123)rMN)rNN)rON)rPN)rQN)rRN)r N)rN)rN)rN)rN)rN)rSN)rTrU)rVrU)rWrU)rMrU)rNrU)rOrU)rPrU)rQrU)rRrU)rOrX)rOrY)rOrZ)r[rZ)rr )rrrr test_split_tzs4z%TestTimeParserFunctions.test_split_tzN) __name__ __module__ __qualname__rr;r?rArBrCrDrErLr\rrrrr s'6:++r )unittestr2aniso8601.resolutionraniso8601.timerrrrrrr r r TestCaser rrrr s ,aniso8601-2.0.0/aniso8601/tests/__pycache__/test_timezone.cpython-36.pyc0000664000175000017500000000761413223544655027125 0ustar nielsenbnielsenb000000000000003 NZ)@s>ddlZddlZddlZddlmZmZGdddejZdS)N)parse_timezone UTCOffsetc@s<eZdZddZddZddZddZd d Zd d Zd S)TestTimezoneParserFunctionscCstd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd |j|jddtd }|j|jdtjd d |j|jdd td }|j|jdtjdd d|j|jdd td}|j|jdtjdd d |j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd |j|jddtd}|j|jdtjd d |j|jddtd}|j|jdtjdd d|j|jddtd}|j|jdtjdd d |j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd |j|jddtd}|j|jdtjd d|j|jddtd}|j|jdtjd d |j|jdddS)NZr)hoursUTCz+00:00z+01:00z-01:00z+00:12 )minutesz+01:23)rr z-01:23z+0000z+0100z-0100z+0012z+0123z-0123z+00z+01z-01z+12z-12)r assertEqual utcoffsetdatetime timedeltatzname)self tzinfoobjectrS/home/nielsenb/Jetfuse/aniso8601/python3/aniso8601/aniso8601/tests/test_timezone.pytest_parse_timezoneslz/TestTimezoneParserFunctions.test_parse_timezonecCs||jttdWdQRX|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)NYz ZzZ z Z ) assertRaises ValueErrorr)rrrrtest_parse_timezone_tzstrYs    z5TestTimezoneParserFunctions.test_parse_timezone_tzstrcCs^|jttdWdQRX|jttdWdQRX|jttdWdQRXdS)Nz-00:00z-0000z-00)rrr)rrrr test_parse_timezone_negativezerofs    z saniso8601-2.0.0/aniso8601/tests/test_date.py0000664000175000017500000001663313223544577021730 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import datetime import unittest from aniso8601.date import parse_date, _parse_year, _parse_calendar_day, _parse_calendar_month, _parse_week_day, _parse_week, _parse_ordinal_date, get_date_resolution from aniso8601.resolution import DateResolution class TestDateResolutionFunctions(unittest.TestCase): def test_get_date_resolution_year(self): self.assertEqual(get_date_resolution('2013'), DateResolution.Year) self.assertEqual(get_date_resolution('0001'), DateResolution.Year) self.assertEqual(get_date_resolution('19'), DateResolution.Year) def test_get_date_resolution_month(self): self.assertEqual(get_date_resolution('1981-04'), DateResolution.Month) def test_get_date_resolution_week(self): self.assertEqual(get_date_resolution('2004-W53'), DateResolution.Week) self.assertEqual(get_date_resolution('2009-W01'), DateResolution.Week) self.assertEqual(get_date_resolution('2004W53'), DateResolution.Week) def test_get_date_resolution_year_weekday(self): self.assertEqual(get_date_resolution('2004-W53-6'), DateResolution.Weekday) self.assertEqual(get_date_resolution('2004W536'), DateResolution.Weekday) def test_get_date_resolution_year_ordinal(self): self.assertEqual(get_date_resolution('1981-095'), DateResolution.Ordinal) self.assertEqual(get_date_resolution('1981095'), DateResolution.Ordinal) class TestDateParserFunctions(unittest.TestCase): def test_parse_date(self): date = parse_date('2013') self.assertEqual(date, datetime.date(2013, 1, 1)) date = parse_date('0001') self.assertEqual(date, datetime.date(1, 1, 1)) date = parse_date('19') self.assertEqual(date, datetime.date(1900, 1, 1)) date = parse_date('1981-04-05') self.assertEqual(date, datetime.date(1981, 4, 5)) date = parse_date('19810405') self.assertEqual(date, datetime.date(1981, 4, 5)) date = parse_date('1981-04') self.assertEqual(date, datetime.date(1981, 4, 1)) date = parse_date('2004-W53') self.assertEqual(date, datetime.date(2004, 12, 27)) self.assertEqual(date.weekday(), 0) date = parse_date('2009-W01') self.assertEqual(date, datetime.date(2008, 12, 29)) self.assertEqual(date.weekday(), 0) date = parse_date('2004-W53-6') self.assertEqual(date, datetime.date(2005, 1, 1)) self.assertEqual(date.weekday(), 5) date = parse_date('2004W53') self.assertEqual(date, datetime.date(2004, 12, 27)) self.assertEqual(date.weekday(), 0) date = parse_date('2004W536') self.assertEqual(date, datetime.date(2005, 1, 1)) self.assertEqual(date.weekday(), 5) date = parse_date('1981-095') self.assertEqual(date, datetime.date(1981, 4, 5)) date = parse_date('1981095') self.assertEqual(date, datetime.date(1981, 4, 5)) def test_parse_year(self): date = _parse_year('2013') self.assertEqual(date, datetime.date(2013, 1, 1)) date = _parse_year('0001') self.assertEqual(date, datetime.date(1, 1, 1)) date = _parse_year('19') self.assertEqual(date, datetime.date(1900, 1, 1)) def test_parse_year_zero(self): #0 isn't a valid year with self.assertRaises(ValueError): _parse_year('0') def test_parse_calendar_day(self): date = _parse_calendar_day('1981-04-05') self.assertEqual(date, datetime.date(1981, 4, 5)) date = _parse_calendar_day('19810405') self.assertEqual(date, datetime.date(1981, 4, 5)) def test_parse_calendar_month(self): date = _parse_calendar_month('1981-04') self.assertEqual(date, datetime.date(1981, 4, 1)) def test_parse_calendar_month_nohyphen(self): #Hyphen is required with self.assertRaises(ValueError): _parse_calendar_month('198104') def test_parse_week_day(self): date = _parse_week_day('2004-W53-6') self.assertEqual(date, datetime.date(2005, 1, 1)) self.assertEqual(date.weekday(), 5) date = _parse_week_day('2009-W01-1') self.assertEqual(date, datetime.date(2008, 12, 29)) self.assertEqual(date.weekday(), 0) date = _parse_week_day('2009-W53-7') self.assertEqual(date, datetime.date(2010, 1, 3)) self.assertEqual(date.weekday(), 6) date = _parse_week_day('2010-W01-1') self.assertEqual(date, datetime.date(2010, 1, 4)) self.assertEqual(date.weekday(), 0) date = _parse_week_day('2004W536') self.assertEqual(date, datetime.date(2005, 1, 1)) self.assertEqual(date.weekday(), 5) date = _parse_week_day('2009W011') self.assertEqual(date, datetime.date(2008, 12, 29)) self.assertEqual(date.weekday(), 0) date = _parse_week_day('2009W537') self.assertEqual(date, datetime.date(2010, 1, 3)) self.assertEqual(date.weekday(), 6) date = _parse_week_day('2010W011') self.assertEqual(date, datetime.date(2010, 1, 4)) self.assertEqual(date.weekday(), 0) def test_parse_week(self): date = _parse_week('2004-W53') self.assertEqual(date, datetime.date(2004, 12, 27)) self.assertEqual(date.weekday(), 0) date = _parse_week('2009-W01') self.assertEqual(date, datetime.date(2008, 12, 29)) self.assertEqual(date.weekday(), 0) date = _parse_week('2009-W53') self.assertEqual(date, datetime.date(2009, 12, 28)) self.assertEqual(date.weekday(), 0) date = _parse_week('2010-W01') self.assertEqual(date, datetime.date(2010, 1, 4)) self.assertEqual(date.weekday(), 0) date = _parse_week('2004W53') self.assertEqual(date, datetime.date(2004, 12, 27)) self.assertEqual(date.weekday(), 0) date = _parse_week('2009W01') self.assertEqual(date, datetime.date(2008, 12, 29)) self.assertEqual(date.weekday(), 0) date = _parse_week('2009W53') self.assertEqual(date, datetime.date(2009, 12, 28)) self.assertEqual(date.weekday(), 0) date = _parse_week('2010W01') self.assertEqual(date, datetime.date(2010, 1, 4)) self.assertEqual(date.weekday(), 0) def test_parse_ordinal_date(self): date = _parse_ordinal_date('1981-095') self.assertEqual(date, datetime.date(1981, 4, 5)) date = _parse_ordinal_date('1981095') self.assertEqual(date, datetime.date(1981, 4, 5)) date = _parse_ordinal_date('1981365') self.assertEqual(date, datetime.date(1981, 12, 31)) date = _parse_ordinal_date('1980366') self.assertEqual(date, datetime.date(1980, 12, 31)) def test_parse_ordinal_date_zero(self): #0 isn't a valid day of year with self.assertRaises(ValueError): _parse_ordinal_date('1981000') def test_parse_ordinal_date_nonleap(self): #Day 366 is only valid on a leap year with self.assertRaises(ValueError): _parse_ordinal_date('1981366') def test_parse_ordinal_date_overflow(self): #Day must me 365, or 366, not larger with self.assertRaises(ValueError): _parse_ordinal_date('1981367') aniso8601-2.0.0/aniso8601/tests/test_date.pyc0000664000175000017500000002047513223544703022061 0ustar nielsenbnielsenb00000000000000 NZc@sddlZddlZddlmZmZmZmZmZmZm Z m Z ddl m Z dej fdYZdej fdYZdS(iN(t parse_datet _parse_yeart_parse_calendar_dayt_parse_calendar_montht_parse_week_dayt _parse_weekt_parse_ordinal_datetget_date_resolution(tDateResolutiontTestDateResolutionFunctionscBs5eZdZdZdZdZdZRS(cCsO|jtdtj|jtdtj|jtdtjdS(Nt2013t0001t19(t assertEqualRRtYear(tself((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_get_date_resolution_yearscCs|jtdtjdS(Ns1981-04(R RRtMonth(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_get_date_resolution_monthscCsO|jtdtj|jtdtj|jtdtjdS(Ns2004-W53s2009-W01t2004W53(R RRtWeek(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_get_date_resolution_weekscCs6|jtdtj|jtdtjdS(Ns 2004-W53-6t2004W536(R RRtWeekday(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyt%test_get_date_resolution_year_weekdayscCs6|jtdtj|jtdtjdS(Ns1981-095t1981095(R RRtOrdinal(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyt%test_get_date_resolution_year_ordinal!s(t__name__t __module__RRRRR(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyR s     tTestDateParserFunctionscBsteZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z RS( cCstd}|j|tjdddtd}|j|tjdddtd}|j|tjdddtd}|j|tjdd d td }|j|tjdd d td }|j|tjdd dtd }|j|tjddd|j|jdtd}|j|tjddd|j|jdtd}|j|tjddd|j|jd td}|j|tjddd|j|jdtd}|j|tjddd|j|jd td}|j|tjdd d td}|j|tjdd d dS(NR iiR R ils 1981-04-05iiit19810405s1981-04s2004-W53ii iis2009-W01iis 2004-W53-6iRRs1981-095R(RR tdatetimetdatetweekday(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_date&s>             cCstd}|j|tjdddtd}|j|tjdddtd}|j|tjddddS(NR iiR R il(RR R R!(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_yearSs    cCs$|jttdWdQXdS(Nt0(t assertRaisest ValueErrorR(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_year_zero]scCsZtd}|j|tjdddtd}|j|tjddddS(Ns 1981-04-05iiiR(RR R R!(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_calendar_daybs  cCs/td}|j|tjddddS(Ns1981-04iii(RR R R!(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_calendar_monthis cCs$|jttdWdQXdS(Nt198104(R&R'R(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyt"test_parse_calendar_month_nohyphenmscCs td}|j|tjddd|j|jdtd}|j|tjddd|j|jd td }|j|tjd dd |j|jd td}|j|tjd dd|j|jd td}|j|tjddd|j|jdtd}|j|tjddd|j|jd td}|j|tjd dd |j|jd td}|j|tjd dd|j|jd dS(Ns 2004-W53-6iiis 2009-W01-1ii iis 2009-W53-7iiis 2010-W01-1iRt2009W011t2009W537t2010W011(RR R R!R"(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_week_dayrs0        cCs td}|j|tjddd|j|jdtd}|j|tjddd|j|jdtd }|j|tjd dd |j|jdtd }|j|tjd dd|j|jdtd}|j|tjddd|j|jdtd}|j|tjddd|j|jdtd}|j|tjd dd |j|jdtd}|j|tjd dd|j|jddS(Ns2004-W53ii iis2009-W01iis2009-W53iis2010-W01iiiRt2009W01t2009W53t2010W01(RR R R!R"(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_weeks0        cCstd}|j|tjdddtd}|j|tjdddtd}|j|tjdddtd }|j|tjd dddS( Ns1981-095iiiRt1981365i it1980366i(RR R R!(RR!((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_ordinal_dates    cCs$|jttdWdQXdS(Nt1981000(R&R'R(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_ordinal_date_zeroscCs$|jttdWdQXdS(Nt1981366(R&R'R(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyttest_parse_ordinal_date_nonleapscCs$|jttdWdQXdS(Nt1981367(R&R'R(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyt test_parse_ordinal_date_overflows(RRR#R$R(R)R*R,R0R4R7R9R;R=(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyR%s -     ! !  (R tunittesttaniso8601.dateRRRRRRRRtaniso8601.resolutionRtTestCaseR R(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_date.pyt s  :aniso8601-2.0.0/aniso8601/tests/test_duration.py0000664000175000017500000005344513223544577022642 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import datetime import unittest import dateutil from aniso8601.duration import parse_duration, _parse_duration_prescribed, \ _parse_duration_combined, _parse_duration_prescribed_notime, \ _parse_duration_prescribed_time, _parse_duration_element, \ _has_any_component, _component_order_correct class TestDurationParserFunctions(unittest.TestCase): def test_parse_duration(self): resultduration = parse_duration('P1Y2M3DT4H54M6S') self.assertEqual(resultduration, datetime.timedelta(days=428, seconds=17646)) resultduration = parse_duration('P1Y2M3DT4H54M6.5S') self.assertEqual(resultduration, datetime.timedelta(days=428, seconds=17646.5)) resultduration = parse_duration('P1Y2M3DT4H54M6,5S') self.assertEqual(resultduration, datetime.timedelta(days=428, seconds=17646.5)) resultduration = parse_duration('P1Y2M3D') self.assertEqual(resultduration, datetime.timedelta(days=428)) resultduration = parse_duration('P1Y2M3.5D') self.assertEqual(resultduration, datetime.timedelta(days=428.5)) resultduration = parse_duration('P1Y2M3,5D') self.assertEqual(resultduration, datetime.timedelta(days=428.5)) resultduration = parse_duration('PT4H54M6.5S') self.assertEqual(resultduration, datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultduration = parse_duration('PT4H54M6,5S') self.assertEqual(resultduration, datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultduration = parse_duration('P1Y') self.assertEqual(resultduration, datetime.timedelta(days=365)) resultduration = parse_duration('P1.5Y') self.assertEqual(resultduration, datetime.timedelta(days=547.5)) resultduration = parse_duration('P1,5Y') self.assertEqual(resultduration, datetime.timedelta(days=547.5)) resultduration = parse_duration('P1M') self.assertEqual(resultduration, datetime.timedelta(days=30)) resultduration = parse_duration('P1.5M') self.assertEqual(resultduration, datetime.timedelta(days=45)) resultduration = parse_duration('P1,5M') self.assertEqual(resultduration, datetime.timedelta(days=45)) resultduration = parse_duration('P1W') self.assertEqual(resultduration, datetime.timedelta(days=7)) resultduration = parse_duration('P1.5W') self.assertEqual(resultduration, datetime.timedelta(days=10.5)) resultduration = parse_duration('P1,5W') self.assertEqual(resultduration, datetime.timedelta(days=10.5)) resultduration = parse_duration('P1D') self.assertEqual(resultduration, datetime.timedelta(days=1)) resultduration = parse_duration('P1.5D') self.assertEqual(resultduration, datetime.timedelta(days=1.5)) resultduration = parse_duration('P1,5D') self.assertEqual(resultduration, datetime.timedelta(days=1.5)) resultduration = parse_duration('P0003-06-04T12:30:05') self.assertEqual(resultduration, datetime.timedelta(days=1279, hours=12, minutes=30, seconds=5)) resultduration = parse_duration('P0003-06-04T12:30:05.5') self.assertEqual(resultduration, datetime.timedelta(days=1279, hours=12, minutes=30, seconds=5.5)) #Verify overflows self.assertEqual(parse_duration('PT36H'), parse_duration('P1DT12H')) def test_parse_duration_nop(self): with self.assertRaises(ValueError): #Duration must start with a P parse_duration('1Y2M3DT4H54M6S') def test_parse_duration_weekcombination(self): with self.assertRaises(ValueError): #Week designator cannot be combined with other time designators #https://bitbucket.org/nielsenb/aniso8601/issues/2/week-designators-should-not-be-combinable parse_duration('P1Y2W') def test_parse_duration_outoforder(self): #Ensure durations are required to be in the correct order #https://bitbucket.org/nielsenb/aniso8601/issues/7/durations-with-time-components-before-t #https://bitbucket.org/nielsenb/aniso8601/issues/8/durations-with-components-in-wrong-order with self.assertRaises(ValueError): parse_duration('P1S') with self.assertRaises(ValueError): parse_duration('P1D1S') with self.assertRaises(ValueError): parse_duration('P1H1M') with self.assertRaises(ValueError): parse_duration('1Y2M3D1SPT1M') with self.assertRaises(ValueError): parse_duration('P1Y2M3D2MT1S') with self.assertRaises(ValueError): parse_duration('P2M3D1ST1Y1M') with self.assertRaises(ValueError): parse_duration('P1Y2M2MT3D1S') with self.assertRaises(ValueError): parse_duration('P1D1Y1M') with self.assertRaises(ValueError): parse_duration('PT1S1H') def test_parse_duration_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): parse_duration('P1Dasdfasdf') with self.assertRaises(ValueError): parse_duration('P0003-06-04T12:30:05.5asdfasdf') def test_parse_duration_prescribed(self): resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6S', False) self.assertEqual(resultduration, datetime.timedelta(days=428, hours=4, minutes=54, seconds=6)) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6.5S', False) self.assertEqual(resultduration, datetime.timedelta(days=428, hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6,5S', False) self.assertEqual(resultduration, datetime.timedelta(days=428, hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('PT4H54M6.5S', False) self.assertEqual(resultduration, datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('PT4H54M6,5S', False) self.assertEqual(resultduration, datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('P1Y2M3D', False) self.assertEqual(resultduration, datetime.timedelta(days=428)) resultduration = _parse_duration_prescribed('P1Y2M3.5D', False) self.assertEqual(resultduration, datetime.timedelta(days=428.5)) resultduration = _parse_duration_prescribed('P1Y2M3,5D', False) self.assertEqual(resultduration, datetime.timedelta(days=428.5)) resultduration = _parse_duration_prescribed('P1Y', False) self.assertEqual(resultduration, datetime.timedelta(days=365)) resultduration = _parse_duration_prescribed('P1.5Y', False) self.assertEqual(resultduration, datetime.timedelta(days=547.5)) resultduration = _parse_duration_prescribed('P1,5Y', False) self.assertEqual(resultduration, datetime.timedelta(days=547.5)) resultduration = _parse_duration_prescribed('P1M', False) self.assertEqual(resultduration, datetime.timedelta(days=30)) resultduration = _parse_duration_prescribed('P1.5M', False) self.assertEqual(resultduration, datetime.timedelta(days=45)) resultduration = _parse_duration_prescribed('P1,5M', False) self.assertEqual(resultduration, datetime.timedelta(days=45)) resultduration = _parse_duration_prescribed('P1W', False) self.assertEqual(resultduration, datetime.timedelta(days=7)) resultduration = _parse_duration_prescribed('P1.5W', False) self.assertEqual(resultduration, datetime.timedelta(days=10.5)) resultduration = _parse_duration_prescribed('P1,5W', False) self.assertEqual(resultduration, datetime.timedelta(days=10.5)) resultduration = _parse_duration_prescribed('P1D', False) self.assertEqual(resultduration, datetime.timedelta(days=1)) resultduration = _parse_duration_prescribed('P1.5D', False) self.assertEqual(resultduration, datetime.timedelta(days=1.5)) resultduration = _parse_duration_prescribed('P1,5D', False) self.assertEqual(resultduration, datetime.timedelta(days=1.5)) #Verify overflows self.assertEqual(parse_duration('PT36H'), parse_duration('P1DT12H')) def test_parse_duration_prescribed_multiplefractions(self): with self.assertRaises(ValueError): #Multiple fractions are not allowed _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S', False) def test_parse_duration_prescribed_middlefraction(self): with self.assertRaises(ValueError): #Fraction only allowed on final component _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S', False) def test_parse_duration_prescribed_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): _parse_duration_prescribed('P1Dasdfasdf', False) def test_parse_duration_prescribed_notime(self): resultduration = _parse_duration_prescribed_notime('P1Y2M3D') self.assertEqual(resultduration, (1, 2, 0, 3, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1Y2M3.5D') self.assertEqual(resultduration, (1, 2, 0, 3.5, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1Y2M3,5D') self.assertEqual(resultduration, (1, 2, 0, 3.5, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1Y') self.assertEqual(resultduration, (1, 0, 0, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1.5Y') self.assertEqual(resultduration, (1.5, 0, 0, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1,5Y') self.assertEqual(resultduration, (1.5, 0, 0, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1M') self.assertEqual(resultduration, (0, 1, 0, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1.5M') self.assertEqual(resultduration, (0, 1.5, 0, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1,5M') self.assertEqual(resultduration, (0, 1.5, 0, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1W') self.assertEqual(resultduration, (0, 0, 1, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1.5W') self.assertEqual(resultduration, (0, 0, 1.5, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1,5W') self.assertEqual(resultduration, (0, 0, 1.5, 0, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1D') self.assertEqual(resultduration, (0, 0, 0, 1, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1.5D') self.assertEqual(resultduration, (0, 0, 0, 1.5, 0, 0, 0)) resultduration = _parse_duration_prescribed_notime('P1,5D') self.assertEqual(resultduration, (0, 0, 0, 1.5, 0, 0, 0)) def test_parse_duration_prescribed_notime_timepart(self): #Ensure no time part is allowed with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1S') with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1D1S') with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1H1M') with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1Y2M3D4H') with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1Y2M3D4H5S') def test_parse_duration_prescribed_notime_outoforder(self): #Ensure durations are required to be in the correct order #https://bitbucket.org/nielsenb/aniso8601/issues/8/durations-with-components-in-wrong-order with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1H1M') with self.assertRaises(ValueError): _parse_duration_prescribed_notime('P1D1Y1M') def test_parse_duration_prescribed_time(self): resultduration = _parse_duration_prescribed_time('P1Y2M3DT4H54M6S') self.assertEqual(resultduration, (1, 2, 0, 3, 4, 54, 6)) resultduration = _parse_duration_prescribed_time('P1Y2M3DT4H54M6.5S') self.assertEqual(resultduration, (1, 2, 0, 3, 4, 54, 6.5)) resultduration = _parse_duration_prescribed_time('P1Y2M3DT4H54M6,5S') self.assertEqual(resultduration, (1, 2, 0, 3, 4, 54, 6.5)) resultduration = _parse_duration_prescribed_time('PT4H54M6.5S') self.assertEqual(resultduration, (0, 0, 0, 0, 4, 54, 6.5)) resultduration = _parse_duration_prescribed_time('PT4H54M6,5S') self.assertEqual(resultduration, (0, 0, 0, 0, 4, 54, 6.5)) def test_parse_duration_prescribed_time_timeindate(self): #Don't allow time components in date half with self.assertRaises(ValueError): _parse_duration_prescribed_time('P1Y2M3D4HT54M6S') with self.assertRaises(ValueError): _parse_duration_prescribed_time('P1Y2M3D6ST4H54M') def test_parse_duration_prescribed_time_dateintime(self): #Don't allow date components in time half with self.assertRaises(ValueError): _parse_duration_prescribed_time('P2M3DT1Y4H54M6S') with self.assertRaises(ValueError): _parse_duration_prescribed_time('P1Y2MT3D4H54M6S') def test_parse_duration_prescribed_time_outoforder(self): #Ensure durations are required to be in the correct order #https://bitbucket.org/nielsenb/aniso8601/issues/7/durations-with-time-components-before-t with self.assertRaises(ValueError): _parse_duration_prescribed_time('1Y2M3D1SPT1M') with self.assertRaises(ValueError): _parse_duration_prescribed_time('P1Y2M3D2MT1S') with self.assertRaises(ValueError): _parse_duration_prescribed_time('P2M3D1ST1Y1M') with self.assertRaises(ValueError): _parse_duration_prescribed_time('P1Y2M2MT3D1S') def test_parse_duration_combined(self): resultduration = _parse_duration_combined('P0003-06-04T12:30:05', False) self.assertEqual(resultduration, datetime.timedelta(days=1279, hours=12, minutes=30, seconds=5)) resultduration = _parse_duration_combined('P0003-06-04T12:30:05.5', False) self.assertEqual(resultduration, datetime.timedelta(days=1279, hours=12, minutes=30, seconds=5.5)) def test_parse_duration_combined_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): parse_duration('P0003-06-04T12:30:05.5asdfasdf') def test_parse_duration_element(self): self.assertEqual(_parse_duration_element('P1Y2M3D', 'Y'), 1) self.assertEqual(_parse_duration_element('P1Y2M3D', 'M'), 2) self.assertEqual(_parse_duration_element('P1Y2M3D', 'D'), 3) self.assertEqual(_parse_duration_element('T4H5M6.1234S', 'H'), 4) self.assertEqual(_parse_duration_element('T4H5M6.1234S', 'M'), 5) self.assertEqual(_parse_duration_element('T4H5M6.1234S', 'S'), 6.1234) self.assertEqual(_parse_duration_element('PT4H54M6,5S', 'H'), 4) self.assertEqual(_parse_duration_element('PT4H54M6,5S', 'M'), 54) self.assertEqual(_parse_duration_element('PT4H54M6,5S', 'S'), 6.5) def test_has_any_component(self): self.assertTrue(_has_any_component('P1Y', ['Y', 'M'])) self.assertFalse(_has_any_component('P1Y', ['M', 'D'])) def test_component_order_correct(self): self.assertTrue(_component_order_correct('P1Y1M1D', ['P', 'Y', 'M', 'D'])) self.assertTrue(_component_order_correct('P1Y1M', ['P', 'Y', 'M', 'D'])) self.assertFalse(_component_order_correct('P1D1Y1M', ['P', 'Y', 'M', 'D'])) self.assertFalse(_component_order_correct('PT1S1H', ['T', 'H', 'M', 'S'])) class TestRelativeDurationParserFunctions(unittest.TestCase): def test_parse_duration_relative(self): resultduration = parse_duration('P1Y2M3DT4H54M6.5S', relative=True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(years=1, months=2, days=3, hours=4, minutes=54, seconds=6.5)) resultduration = parse_duration('P0003-06-04T12:30:05.5', relative=True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(years=3, months=6, days=4, hours=12, minutes=30, seconds=5, microseconds=500000)) def test_parse_duration_prescribed_relative(self): resultduration = _parse_duration_prescribed('P1Y', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(years=1)) resultduration = _parse_duration_prescribed('P1M', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(months=1)) #Add the relative ‘days’ argument to the absolute day. Notice that the ‘weeks’ argument is multiplied by 7 and added to ‘days’. #http://dateutil.readthedocs.org/en/latest/relativedelta.html resultduration = _parse_duration_prescribed('P1W', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(days=7)) resultduration = _parse_duration_prescribed('P1.5W', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(days=10.5)) def test_parse_duration_prescribed_relative_multiplefractions(self): with self.assertRaises(ValueError): #Multiple fractions are not allowed _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S', True) def test_parse_duration_prescribed_relative_middlefraction(self): with self.assertRaises(ValueError): #Fraction only allowed on final component _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S', True) def test_parse_duration_prescribed_relative_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): _parse_duration_prescribed('P1Dasdfasdf', True) def test_parse_duration_prescribed_relative_fractionalyear(self): #Fractional months and years are not defined #https://github.com/dateutil/dateutil/issues/40 with self.assertRaises(ValueError): _parse_duration_prescribed('P1.5Y', True) def test_parse_duration_prescribed_relative_fractionalmonth(self): #Fractional months and years are not defined #https://github.com/dateutil/dateutil/issues/40 with self.assertRaises(ValueError): _parse_duration_prescribed('P1.5M', True) def test_parse_duration_prescribed_relative_nodateutil(self): import sys import dateutil dateutil_import = dateutil sys.modules['dateutil'] = None with self.assertRaises(RuntimeError): _parse_duration_prescribed('P1Y', True) #Reinstall dateutil sys.modules['dateutil'] = dateutil def test_parse_duration_prescribed_relative_outoforder(self): #Ensure durations are required to be in the correct order #https://bitbucket.org/nielsenb/aniso8601/issues/7/durations-with-time-components-before-t #https://bitbucket.org/nielsenb/aniso8601/issues/8/durations-with-components-in-wrong-order with self.assertRaises(ValueError): _parse_duration_prescribed('P1S', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1D1S', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1H1M', True) with self.assertRaises(ValueError): _parse_duration_prescribed('1Y2M3D1SPT1M', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3D2MT1S', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P2M3D1ST1Y1M', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M2MT3D1S', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1D1Y1M', True) with self.assertRaises(ValueError): _parse_duration_prescribed('PT1S1H', True) def test_parse_duration_combined_relative(self): resultduration = _parse_duration_combined('P0003-06-04T12:30:05', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(years=3, months=6, days=4, hours=12, minutes=30, seconds=5)) resultduration = _parse_duration_combined('P0003-06-04T12:30:05.5', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(years=3, months=6, days=4, hours=12, minutes=30, seconds=5, microseconds=500000)) def test_parse_duration_combined_relative_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): _parse_duration_combined('P0003-06-04T12:30:05.5asdfasdf', True) def test_parse_duration_combined_relative_nodateutil(self): import sys import dateutil dateutil_import = dateutil sys.modules['dateutil'] = None with self.assertRaises(RuntimeError): _parse_duration_combined('P0003-06-04T12:30:05', True) #Reinstall dateutil sys.modules['dateutil'] = dateutil aniso8601-2.0.0/aniso8601/tests/test_duration.pyc0000664000175000017500000004344313223544703022771 0ustar nielsenbnielsenb00000000000000 NZc@sddlZddlZddlZddlmZmZmZmZmZm Z m Z m Z dej fdYZ dej fdYZdS(iN(tparse_durationt_parse_duration_prescribedt_parse_duration_combinedt!_parse_duration_prescribed_notimet_parse_duration_prescribed_timet_parse_duration_elementt_has_any_componentt_component_order_correcttTestDurationParserFunctionscBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZRS(c Cstd}|j|tjddddtd}|j|tjddddtd}|j|tjddddtd }|j|tjddtd }|j|tjdd td }|j|tjdd td }|j|tjddddddtd}|j|tjddddddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd}|j|tjddtd }|j|tjdd!td"}|j|tjdd!td#}|j|tjdd$td%}|j|tjdd&td'}|j|tjdd&td(}|j|tjdd)dd*dddd+td,}|j|tjdd)dd*dddd-|jtd.td/dS(0NtP1Y2M3DT4H54M6StdaysitsecondsiDsP1Y2M3DT4H54M6.5Sg;@sP1Y2M3DT4H54M6,5StP1Y2M3Ds P1Y2M3.5Dgz@s P1Y2M3,5Ds PT4H54M6.5Sthoursitminutesi6g@s PT4H54M6,5StP1YimsP1.5Yg@sP1,5YtP1MisP1.5Mi-sP1,5MtP1WisP1.5Wg%@sP1,5WtP1DisP1.5Dg?sP1,5DsP0003-06-04T12:30:05ii isP0003-06-04T12:30:05.5g@tPT36HtP1DT12H(Rt assertEqualtdatetimet timedelta(tselftresultduration((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyttest_parse_durationsZ " " "    ( (             . .cCs$|jttdWdQXdS(Nt1Y2M3DT4H54M6S(t assertRaisest ValueErrorR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyttest_parse_duration_nopYscCs$|jttdWdQXdS(NtP1Y2W(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt#test_parse_duration_weekcombination^scCs$|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttd WdQXdS( NtP1StP1D1StP1H1Mt 1Y2M3D1SPT1Mt P1Y2M3D2MT1St P2M3D1ST1Y1Mt P1Y2M2MT3D1StP1D1Y1MtPT1S1H(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyttest_parse_duration_outoforderds$cCsD|jttdWdQX|jttdWdQXdS(Nt P1DasdfasdfsP0003-06-04T12:30:05.5asdfasdf(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt!test_parse_duration_suffixgarbagesc Cstdt}|j|tjdddddddd td t}|j|tjdddddddd td t}|j|tjdddddddd td t}|j|tjdddddd tdt}|j|tjdddddd tdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjddtdt}|j|tjdd td!t}|j|tjdd td"t}|j|tjdd#td$t}|j|tjdd%td&t}|j|tjdd%|jtd'td(dS()NR R iR iRi6R isP1Y2M3DT4H54M6.5Sg@sP1Y2M3DT4H54M6,5Ss PT4H54M6.5Ss PT4H54M6,5SR s P1Y2M3.5Dgz@s P1Y2M3,5DRimsP1.5Yg@sP1,5YRisP1.5Mi-sP1,5MRisP1.5Wg%@sP1,5WRisP1.5Dg?sP1,5DRR(RtFalseRRRR(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyttest_parse_duration_prescribedsR...((cCs'|jttdtWdQXdS(NsP1Y2M3DT4H5.1234M6.1234S(RRRR-(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt0test_parse_duration_prescribed_multiplefractionsscCs'|jttdtWdQXdS(NsP1Y2M3DT4H5.1234M6S(RRRR-(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt-test_parse_duration_prescribed_middlefractionscCs'|jttdtWdQXdS(NR+(RRRR-(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt,test_parse_duration_prescribed_suffixgarbagesc Cstd}|j|dtd}|j|dtd}|j|dtd }|j|dtd }|j|dtd }|j|dtd }|j|dtd}|j|dtd}|j|dtd}|j|dtd}|j|d td}|j|d!td}|j|d"td}|j|d#td}|j|d$dS(%NR iiiis P1Y2M3.5Dg @s P1Y2M3,5DRsP1.5Yg?sP1,5YRsP1.5MsP1,5MRsP1.5WsP1,5WRsP1.5DsP1,5D(iiiiiii(iiig @iii(iiig @iii(iiiiiii(g?iiiiii(g?iiiiii(iiiiiii(ig?iiiii(ig?iiiii(iiiiiii(iig?iiii(iig?iiii(iiiiiii(iiig?iii(iiig?iii(RR(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt%test_parse_duration_prescribed_notimes<               c Cs|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQXdS(NR!R"R#t P1Y2M3D4Ht P1Y2M3D4H5S(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt.test_parse_duration_prescribed_notime_timepart scCsD|jttdWdQX|jttdWdQXdS(NR#R((RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt0test_parse_duration_prescribed_notime_outofordersc Cstd}|j|dtd }|j|dtd }|j|dtd }|j|dtd }|j|ddS(NR iiiiii6isP1Y2M3DT4H54M6.5Sg@sP1Y2M3DT4H54M6,5Ss PT4H54M6.5Ss PT4H54M6,5S(iiiiii6i(iiiiii6g@(iiiiii6g@(iiiiii6g@(iiiiii6g@(RR(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt#test_parse_duration_prescribed_time$s     cCsD|jttdWdQX|jttdWdQXdS(NtP1Y2M3D4HT54M6StP1Y2M3D6ST4H54M(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt.test_parse_duration_prescribed_time_timeindate4scCsD|jttdWdQX|jttdWdQXdS(NtP2M3DT1Y4H54M6StP1Y2MT3D4H54M6S(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt.test_parse_duration_prescribed_time_dateintime<sc Cs|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQXdS(NR$R%R&R'(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt.test_parse_duration_prescribed_time_outoforderDsc Cs~tdt}|j|tjdddddddd td t}|j|tjdddddddd dS( NsP0003-06-04T12:30:05R iR i RiR isP0003-06-04T12:30:05.5g@(RR-RRR(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyttest_parse_duration_combinedSs.cCs$|jttdWdQXdS(NsP0003-06-04T12:30:05.5asdfasdf(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt*test_parse_duration_combined_suffixgarbageZscCs|jtddd|jtddd|jtddd|jtdd d |jtddd |jtdd d |jtdd d |jtddd|jtdd ddS(NR tYitMitDis T4H5M6.1234StHiitSgR?R@RFRIRN(((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyRs* F    @    .        t#TestRelativeDurationParserFunctionscBsteZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z RS( cCstddt}|j|tjjddddddd d d d d dtddt}|j|tjjdddddd d dd dd ddddS(NsP1Y2M3DT4H54M6.5StrelativetyearsitmonthsiR iR iRi6R g@sP0003-06-04T12:30:05.5ii iit microsecondsi (RtTrueRtdateutilt relativedelta(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyttest_parse_duration_relativevs=cCstdt}|j|tjjddtdt}|j|tjjddtdt}|j|tjjddtd t}|j|tjjdd dS( NRRSiRRTRR isP1.5Wg%@(RRVRRWRX(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt'test_parse_duration_prescribed_relative}scCs'|jttdtWdQXdS(NsP1Y2M3DT4H5.1234M6.1234S(RRRRV(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt9test_parse_duration_prescribed_relative_multiplefractionsscCs'|jttdtWdQXdS(NsP1Y2M3DT4H5.1234M6S(RRRRV(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt6test_parse_duration_prescribed_relative_middlefractionscCs'|jttdtWdQXdS(NR+(RRRRV(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt5test_parse_duration_prescribed_relative_suffixgarbagescCs'|jttdtWdQXdS(NsP1.5Y(RRRRV(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt6test_parse_duration_prescribed_relative_fractionalyearscCs'|jttdtWdQXdS(NsP1.5M(RRRRV(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_duration.pyt7test_parse_duration_prescribed_relative_fractionalmonthscCs_ddl}ddl}|}d|jd<|jttdtWdQX||jd s   :daniso8601-2.0.0/aniso8601/tests/test_init.py0000664000175000017500000000347413223544577021755 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import unittest import datetime import aniso8601 class TestInitFunctions(unittest.TestCase): def test_import(self): #Just some tests repeated from other places to make sure the #imports work time = aniso8601.parse_time('01:23:45') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) resultdatetime = aniso8601.parse_datetime('1981-04-05T23:21:28.512400Z') self.assertEqual(resultdatetime.replace(tzinfo=None), datetime.datetime(1981, 4, 5, hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = resultdatetime.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), 'UTC') date = aniso8601.parse_date('19810405') self.assertEqual(date, datetime.date(1981, 4, 5)) resultduration = aniso8601.parse_duration('P1Y2M3DT4H54M6S') self.assertEqual(resultduration, datetime.timedelta(days=428, seconds=17646)) resultinterval = aniso8601.parse_interval('1980-03-05T01:01:00/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) results = list(aniso8601.parse_repeating_interval('R3/1981-04-05/P1D')) self.assertEqual(results[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(results[1], datetime.date(year=1981, month=4, day=6)) self.assertEqual(results[2], datetime.date(year=1981, month=4, day=7)) aniso8601-2.0.0/aniso8601/tests/test_init.pyc0000664000175000017500000000370313223544703022102 0ustar nielsenbnielsenb00000000000000 NZc@sAddlZddlZddlZdejfdYZdS(iNtTestInitFunctionscBseZdZRS(cCsKtjd}|j|tjddddddtjd}|j|jd dtjd d d dddd dddd|j}|j|j dtj dd|j|j ddtj d}|j|tj d d d tjd}|j|tj ddddtjd}|j|dtjdddddd dddd|j|dtjdd dd dd ddddttjd }|j|dtj dd dd dd |j|dtj dd dd dd!|j|d"tj dd dd dd#dS($Ns01:23:45thouritminuteitsecondi-s1981-04-05T23:21:28.512400Zttzinfoiiiiit microsecondithoursitUTCt19810405tP1Y2M3DT4H54M6StdaysitsecondsiDs'1980-03-05T01:01:00/1981-04-05T01:01:00tyearitmonthitdaysR3/1981-04-05/P1Diii(t aniso8601t parse_timet assertEqualtdatetimettimetparse_datetimetreplacetNoneRt utcoffsett timedeltattznamet parse_datetdatetparse_durationtparse_intervaltlisttparse_repeating_interval(tselfRtresultdatetimet tzinfoobjectRtresultdurationtresultintervaltresults((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_init.pyt test_imports$(C %"88,,(t__name__t __module__R&(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_init.pyR s(tunittestRRtTestCaseR(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_init.pyt s   aniso8601-2.0.0/aniso8601/tests/test_interval.py0000664000175000017500000007177113223544577022643 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import unittest import datetime import dateutil.relativedelta from aniso8601 import compat from aniso8601.interval import parse_interval, parse_repeating_interval, _parse_interval_parts class TestIntervalParserFunctions(unittest.TestCase): def test_parse_interval(self): resultinterval = parse_interval('P1M/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=3, day=6, hour=1, minute=1)) resultinterval = parse_interval('P1M/1981-04-05') self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=3, day=6)) resultinterval = parse_interval('PT1H/2014-11-12') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=23)) resultinterval = parse_interval('PT4H54M6.5S/2014-11-12') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=19, minute=5, second=53, microsecond=500000)) resultinterval = parse_interval('1981-04-05T01:01:00/P1M1DT1M') self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=5, day=6, hour=1, minute=2)) resultinterval = parse_interval('1981-04-05/P1M1D') self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=5, day=6)) resultinterval = parse_interval('2014-11-12/PT1H') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=1, minute=0)) resultinterval = parse_interval('2014-11-12/PT4H54M6.5S') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=4, minute=54, second=6, microsecond=500000)) resultinterval = parse_interval('1980-03-05T01:01:00/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultinterval = parse_interval('1980-03-05T01:01:00/1981-04-05') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=4, day=5)) resultinterval = parse_interval('1980-03-05/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultinterval = parse_interval('1980-03-05/1981-04-05') self.assertEqual(resultinterval[0], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=4, day=5)) resultinterval = parse_interval('1981-04-05/1980-03-05') self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1980, month=3, day=5)) resultinterval = parse_interval('1980-03-05T01:01:00--1981-04-05T01:01:00', intervaldelimiter='--') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultinterval = parse_interval('1980-03-05 01:01:00/1981-04-05 01:01:00', datetimedelimiter=' ') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) def test_parse_interval_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): parse_interval('2001/P1Dasdf') with self.assertRaises(ValueError): parse_interval('P1Dasdf/2001') with self.assertRaises(ValueError): parse_interval('2001/P0003-06-04T12:30:05.5asdfasdf') with self.assertRaises(ValueError): parse_interval('P0003-06-04T12:30:05.5asdfasdf/2001') class TestRelativeIntervalParserFunctions(unittest.TestCase): def test_parse_interval_relative(self): resultinterval = parse_interval('P1M/1981-04-05T01:01:00', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=3, day=5, hour=1, minute=1)) resultinterval = parse_interval('P1M/1981-04-05', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=3, day=5)) resultinterval = parse_interval('PT1H/2014-11-12', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=23)) resultinterval = parse_interval('PT4H54M6.5S/2014-11-12', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=19, minute=5, second=53, microsecond=500000)) resultinterval = parse_interval('1981-04-05T01:01:00/P1M1DT1M', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=5, day=6, hour=1, minute=2)) resultinterval = parse_interval('1981-04-05/P1M1D', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=5, day=6)) resultinterval = parse_interval('2014-11-12/PT1H', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=1, minute=0)) resultinterval = parse_interval('2014-11-12/PT4H54M6.5S', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=4, minute=54, second=6, microsecond=500000)) #Some relativedelta examples #http://dateutil.readthedocs.org/en/latest/examples.html#relativedelta-examples resultinterval = parse_interval('2003-01-27/P1M', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2003, month=1, day=27)) self.assertEqual(resultinterval[1], datetime.date(year=2003, month=2, day=27)) resultinterval = parse_interval('2003-01-31/P1M', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2003, month=1, day=31)) self.assertEqual(resultinterval[1], datetime.date(year=2003, month=2, day=28)) resultinterval = parse_interval('2003-01-31/P2M', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2003, month=1, day=31)) self.assertEqual(resultinterval[1], datetime.date(year=2003, month=3, day=31)) resultinterval = parse_interval('2000-02-28/P1Y', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2000, month=2, day=28)) self.assertEqual(resultinterval[1], datetime.date(year=2001, month=2, day=28)) resultinterval = parse_interval('1999-02-28/P1Y', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1999, month=2, day=28)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=2, day=28)) resultinterval = parse_interval('1999-03-01/P1Y', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1999, month=3, day=1)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=3, day=1)) resultinterval = parse_interval('P1Y/2001-02-28', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2001, month=2, day=28)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=2, day=28)) resultinterval = parse_interval('P1Y/2001-03-01', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2001, month=3, day=1)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=3, day=1)) resultinterval = parse_interval('1980-03-05T01:01:00/1981-04-05T01:01:00', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultinterval = parse_interval('1980-03-05T01:01:00/1981-04-05', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=4, day=5)) resultinterval = parse_interval('1980-03-05/1981-04-05T01:01:00', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultinterval = parse_interval('1980-03-05/1981-04-05', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=4, day=5)) resultinterval = parse_interval('1981-04-05/1980-03-05', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1980, month=3, day=5)) resultinterval = parse_interval('1980-03-05T01:01:00--1981-04-05T01:01:00', intervaldelimiter='--', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultinterval = parse_interval('1980-03-05 01:01:00/1981-04-05 01:01:00', datetimedelimiter=' ', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) def test_parse_interval_relative_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): parse_interval('2001/P1Dasdf', relative=True) with self.assertRaises(ValueError): parse_interval('P1Dasdf/2001', relative=True) with self.assertRaises(ValueError): parse_interval('2001/P0003-06-04T12:30:05.5asdfasdf', relative=True) with self.assertRaises(ValueError): parse_interval('P0003-06-04T12:30:05.5asdfasdf/2001', relative=True) class TestRepeatingIntervalParserFunctions(unittest.TestCase): def test_parse_repeating_interval(self): results = list(parse_repeating_interval('R3/1981-04-05/P1D')) self.assertEqual(results[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(results[1], datetime.date(year=1981, month=4, day=6)) self.assertEqual(results[2], datetime.date(year=1981, month=4, day=7)) results = list(parse_repeating_interval('R11/PT1H2M/1980-03-05T01:01:00')) for dateindex in compat.range(0, 11): self.assertEqual(results[dateindex], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) - dateindex * datetime.timedelta(hours=1, minutes=2)) results = list(parse_repeating_interval('R2--1980-03-05T01:01:00--1981-04-05T01:01:00', intervaldelimiter='--')) self.assertEqual(results[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(results[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) results = list(parse_repeating_interval('R2/1980-03-05 01:01:00/1981-04-05 01:01:00', datetimedelimiter=' ')) self.assertEqual(results[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(results[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) resultgenerator = parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') for dateindex in compat.range(0, 11): self.assertEqual(next(resultgenerator), datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) - dateindex * datetime.timedelta(hours=1, minutes=2)) def test_parse_repeating_interval_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): parse_interval('R3/1981-04-05/P1Dasdf') with self.assertRaises(ValueError): parse_interval('R3/1981-04-05/P0003-06-04T12:30:05.5asdfasdf') def test_parse_repeating_interval_relative(self): results = list(parse_repeating_interval('R3/1981-04-05/P1D', relative=True)) self.assertEqual(results[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(results[1], datetime.date(year=1981, month=4, day=6)) self.assertEqual(results[2], datetime.date(year=1981, month=4, day=7)) results = list(parse_repeating_interval('R11/PT1H2M/1980-03-05T01:01:00', relative=True)) for dateindex in compat.range(0, 11): self.assertEqual(results[dateindex], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) - dateindex * datetime.timedelta(hours=1, minutes=2)) results = list(parse_repeating_interval('R2--1980-03-05T01:01:00--1981-04-05T01:01:00', intervaldelimiter='--', relative=True)) self.assertEqual(results[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(results[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) results = list(parse_repeating_interval('R2/1980-03-05 01:01:00/1981-04-05 01:01:00', datetimedelimiter=' ', relative=True)) self.assertEqual(results[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(results[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) #Make sure relative is correctly applied for months #https://bitbucket.org/nielsenb/aniso8601/issues/12/month-intervals-calculated-incorrectly-or results = list(parse_repeating_interval('R4/2017-04-30T00:00:00/P1M', relative=True)) self.assertEqual(results[0], datetime.datetime(year=2017, month=4, day=30)) self.assertEqual(results[1], datetime.datetime(year=2017, month=5, day=30)) self.assertEqual(results[2], datetime.datetime(year=2017, month=6, day=30)) self.assertEqual(results[3], datetime.datetime(year=2017, month=7, day=30)) resultgenerator = parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00', relative=True) for dateindex in compat.range(0, 11): self.assertEqual(next(resultgenerator), datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) - dateindex * datetime.timedelta(hours=1, minutes=2)) def test_parse_repeating_interval_relative_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ValueError): parse_interval('R3/1981-04-05/P1Dasdf', relative=True) with self.assertRaises(ValueError): parse_interval('R3/1981-04-05/P0003-06-04T12:30:05.5asdfasdf') def test_parse_repeating_interval_relative_nodateutil(self): import sys import dateutil dateutil_import = dateutil sys.modules['dateutil'] = None with self.assertRaises(RuntimeError): parse_repeating_interval('R3/1981-04-05/P1D', relative=True) with self.assertRaises(RuntimeError): parse_repeating_interval('R4/2017-04-30T00:00:00/P1M', relative=True) #Reinstall dateutil sys.modules['dateutil'] = dateutil class TestIntervalPartParserFunctions(unittest.TestCase): def test_parse_interval_parts(self): resultinterval = _parse_interval_parts('P1M/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=3, day=6, hour=1, minute=1)) self.assertEqual(resultinterval[2], -datetime.timedelta(days=30)) resultinterval = _parse_interval_parts('P1M/1981-04-05') self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=3, day=6)) self.assertEqual(resultinterval[2], -datetime.timedelta(days=30)) resultinterval = _parse_interval_parts('PT1H/2014-11-12') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=23)) self.assertEqual(resultinterval[2], -datetime.timedelta(hours=1)) resultinterval = _parse_interval_parts('PT4H54M6.5S/2014-11-12') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=19, minute=5, second=53, microsecond=500000)) self.assertEqual(resultinterval[2], -datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultinterval = _parse_interval_parts('1981-04-05T01:01:00/P1M1DT1M') self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=5, day=6, hour=1, minute=2)) self.assertEqual(resultinterval[2], datetime.timedelta(days=31, minutes=1)) resultinterval = _parse_interval_parts('1981-04-05/P1M1D') self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=5, day=6)) self.assertEqual(resultinterval[2], datetime.timedelta(days=31)) resultinterval = _parse_interval_parts('2014-11-12/PT1H') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=1, minute=0)) self.assertEqual(resultinterval[2], datetime.timedelta(hours=1)) resultinterval = _parse_interval_parts('2014-11-12/PT4H54M6.5S') self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=4, minute=54, second=6, microsecond=500000)) self.assertEqual(resultinterval[2], datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultinterval = _parse_interval_parts('1980-03-05T01:01:00/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[2], datetime.timedelta(days=396)) #One year, one month (30 days) resultinterval = _parse_interval_parts('1980-03-05T01:01:00/1981-04-05') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[2], datetime.timedelta(days=395, hours=22, minutes=59)) resultinterval = _parse_interval_parts('1980-03-05/1981-04-05T01:01:00') self.assertEqual(resultinterval[0], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[2], datetime.timedelta(days=396, hours=1, minutes=1)) resultinterval = _parse_interval_parts('1980-03-05/1981-04-05') self.assertEqual(resultinterval[0], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[2], datetime.timedelta(days=396)) resultinterval = _parse_interval_parts('1981-04-05/1980-03-05') self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1980, month=3, day=5)) self.assertEqual(resultinterval[2], -datetime.timedelta(days=396)) resultinterval = _parse_interval_parts('1980-03-05T01:01:00--1981-04-05T01:01:00', intervaldelimiter='--') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[2], datetime.timedelta(days=396)) resultinterval = _parse_interval_parts('1980-03-05 01:01:00/1981-04-05 01:01:00', datetimedelimiter=' ') self.assertEqual(resultinterval[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[2], datetime.timedelta(days=396)) def test_parse_interval_parts_relative(self): resultinterval = _parse_interval_parts('P1M/1981-04-05T01:01:00', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=3, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[2], -dateutil.relativedelta.relativedelta(months=1)) resultinterval = _parse_interval_parts('P1M/1981-04-05', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=3, day=5)) self.assertEqual(resultinterval[2], -dateutil.relativedelta.relativedelta(months=1)) resultinterval = _parse_interval_parts('PT1H/2014-11-12', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=23)) self.assertEqual(resultinterval[2], -dateutil.relativedelta.relativedelta(hours=1)) resultinterval = _parse_interval_parts('PT4H54M6.5S/2014-11-12', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=11, hour=19, minute=5, second=53, microsecond=500000)) self.assertEqual(resultinterval[2], -dateutil.relativedelta.relativedelta(hours=4, minutes=54, seconds=6.5)) resultinterval = _parse_interval_parts('1981-04-05T01:01:00/P1M1DT1M', relative=True) self.assertEqual(resultinterval[0], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1)) self.assertEqual(resultinterval[1], datetime.datetime(year=1981, month=5, day=6, hour=1, minute=2)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(months=1, days=1, minutes=1)) resultinterval = _parse_interval_parts('1981-04-05/P1M1D', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1981, month=4, day=5)) self.assertEqual(resultinterval[1], datetime.date(year=1981, month=5, day=6)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(months=1, days=1)) resultinterval = _parse_interval_parts('2014-11-12/PT1H', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=1, minute=0)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(hours=1)) resultinterval = _parse_interval_parts('2014-11-12/PT4H54M6.5S', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2014, month=11, day=12)) self.assertEqual(resultinterval[1], datetime.datetime(year=2014, month=11, day=12, hour=4, minute=54, second=6, microsecond=500000)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(hours=4, minutes=54, seconds=6.5)) #Some relativedelta examples #http://dateutil.readthedocs.org/en/latest/examples.html#relativedelta-examples resultinterval = _parse_interval_parts('2003-01-27/P1M', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2003, month=1, day=27)) self.assertEqual(resultinterval[1], datetime.date(year=2003, month=2, day=27)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(months=1)) resultinterval = _parse_interval_parts('2003-01-31/P1M', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2003, month=1, day=31)) self.assertEqual(resultinterval[1], datetime.date(year=2003, month=2, day=28)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(months=1)) resultinterval = _parse_interval_parts('2003-01-31/P2M', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2003, month=1, day=31)) self.assertEqual(resultinterval[1], datetime.date(year=2003, month=3, day=31)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(months=2)) resultinterval = _parse_interval_parts('2000-02-28/P1Y', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2000, month=2, day=28)) self.assertEqual(resultinterval[1], datetime.date(year=2001, month=2, day=28)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(years=1)) resultinterval = _parse_interval_parts('1999-02-28/P1Y', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1999, month=2, day=28)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=2, day=28)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(years=1)) resultinterval = _parse_interval_parts('1999-03-01/P1Y', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=1999, month=3, day=1)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=3, day=1)) self.assertEqual(resultinterval[2], dateutil.relativedelta.relativedelta(years=1)) resultinterval = _parse_interval_parts('P1Y/2001-02-28', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2001, month=2, day=28)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=2, day=28)) self.assertEqual(resultinterval[2], -dateutil.relativedelta.relativedelta(years=1)) resultinterval = _parse_interval_parts('P1Y/2001-03-01', relative=True) self.assertEqual(resultinterval[0], datetime.date(year=2001, month=3, day=1)) self.assertEqual(resultinterval[1], datetime.date(year=2000, month=3, day=1)) self.assertEqual(resultinterval[2], -dateutil.relativedelta.relativedelta(years=1)) def test_parse_interval_parts_relative_nodateutil(self): import sys import dateutil dateutil_import = dateutil sys.modules['dateutil'] = None with self.assertRaises(RuntimeError): _parse_interval_parts('P1M/1981-04-05T01:01:00', relative=True) #Reinstall dateutil sys.modules['dateutil'] = dateutil aniso8601-2.0.0/aniso8601/tests/test_interval.pyc0000664000175000017500000004755013223544703022773 0ustar nielsenbnielsenb00000000000000 NZc@sddlZddlZddlZddlmZddlmZmZm Z dej fdYZ dej fdYZ dej fd YZ d ej fd YZdS( iN(tcompat(tparse_intervaltparse_repeating_intervalt_parse_interval_partstTestIntervalParserFunctionscBseZdZdZRS(cCstd}|j|dtjddddddd d d d |j|d tjdddd dd d d d d td}|j|dtjdddddd|j|d tjdddd dd td}|j|dtjdddddd|j|d tjddddddd dtd}|j|dtjdddddd|j|d tjddddddd dd dddddtd}|j|dtjddddddd d d d |j|d tjdddddd d d d dtd}|j|dtjdddddd|j|d tjdddddd td}|j|dtjdddddd|j|d tjddddddd d d dtd}|j|dtjdddddd|j|d tjddddddd dd ddd ddtd }|j|dtjdd!dd ddd d d d |j|d tjddddddd d d d td"}|j|dtjdd!dd ddd d d d |j|d tjddddddtd#}|j|dtjdd!dd dd|j|d tjddddddd d d d td$}|j|dtjdd!dd dd|j|d tjddddddtd%}|j|dtjdddddd|j|d tjdd!dd ddtd&d'd(}|j|dtjdd!dd ddd d d d |j|d tjddddddd d d d td)d*d+}|j|dtjdd!dd ddd d d d |j|d tjddddddd d d d dS(,NsP1M/1981-04-05T01:01:00ityearitmonthitdayithouritminuteiisP1M/1981-04-05sPT1H/2014-11-12ii i isPT4H54M6.5S/2014-11-12itsecondi5t microsecondi s1981-04-05T01:01:00/P1M1DT1Mis1981-04-05/P1M1Ds2014-11-12/PT1Hs2014-11-12/PT4H54M6.5Si6s'1980-03-05T01:01:00/1981-04-05T01:01:00is1980-03-05T01:01:00/1981-04-05s1980-03-05/1981-04-05T01:01:00s1980-03-05/1981-04-05s1981-04-05/1980-03-05s(1980-03-05T01:01:00--1981-04-05T01:01:00tintervaldelimiters--s'1980-03-05 01:01:00/1981-04-05 01:01:00tdatetimedelimitert (Rt assertEqualtdatetimetdate(tselftresultinterval((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyttest_parse_intervalsZ 88 ,, ,2 ,D 88 ,, ,8 ,D 88 8, ,8 ,, ,,888c Cs|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQXdS(Ns 2001/P1Dasdfs P1Dasdf/2001s#2001/P0003-06-04T12:30:05.5asdfasdfs#P0003-06-04T12:30:05.5asdfasdf/2001(t assertRaisest ValueErrorR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyt!test_parse_interval_suffixgarbageNs(t__name__t __module__RR(((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyRs =t#TestRelativeIntervalParserFunctionscBseZdZdZRS(cCsh tddt}|j|dtjdddddd d d d d |j|d tjdddd dd d d d d tddt}|j|dtjdddddd |j|d tjdddd dd tddt}|j|dtjdddddd|j|d tjddddddd dtddt}|j|dtjdddddd|j|d tjddddddd dd d ddddtddt}|j|dtjdddddd d d d d |j|d tjdddd ddd d d dtddt}|j|dtjdddddd |j|d tjdddd ddtddt}|j|dtjdddddd|j|d tjddddddd d d dtddt}|j|dtjdddddd|j|d tjddddddd dd d ddddtd!dt}|j|dtjdd"dd dd#|j|d tjdd"dddd#td$dt}|j|dtjdd"dd dd%|j|d tjdd"dddd&td'dt}|j|dtjdd"dd dd%|j|d tjdd"dd dd%td(dt}|j|dtjdd)dddd&|j|d tjdd*dddd&td+dt}|j|dtjdd,dddd&|j|d tjdd)dddd&td-dt}|j|dtjdd,dd dd |j|d tjdd)dd dd td.dt}|j|dtjdd*dddd&|j|d tjdd)dddd&td/dt}|j|dtjdd*dd dd |j|d tjdd)dd dd td0dt}|j|dtjdd1dd dd d d d d |j|d tjdddddd d d d d td2dt}|j|dtjdd1dd dd d d d d |j|d tjdddddd td3dt}|j|dtjdd1dd dd |j|d tjdddddd d d d d td4dt}|j|dtjdd1dd dd |j|d tjdddddd td5dt}|j|dtjdddddd |j|d tjdd1dd dd td6d7d8dt}|j|dtjdd1dd dd d d d d |j|d tjdddddd d d d d td9d:d;dt}|j|dtjdd1dd dd d d d d |j|d tjdddddd d d d d dS(<NsP1M/1981-04-05T01:01:00trelativeiRiRiRiRiR isP1M/1981-04-05sPT1H/2014-11-12ii i isPT4H54M6.5S/2014-11-12iR i5R i s1981-04-05T01:01:00/P1M1DT1Miis1981-04-05/P1M1Ds2014-11-12/PT1Hs2014-11-12/PT4H54M6.5Si6s2003-01-27/P1Miis2003-01-31/P1Miis2003-01-31/P2Ms2000-02-28/P1Yiis1999-02-28/P1Yis1999-03-01/P1YsP1Y/2001-02-28sP1Y/2001-03-01s'1980-03-05T01:01:00/1981-04-05T01:01:00is1980-03-05T01:01:00/1981-04-05s1980-03-05/1981-04-05T01:01:00s1980-03-05/1981-04-05s1981-04-05/1980-03-05s(1980-03-05T01:01:00--1981-04-05T01:01:00R s--s'1980-03-05 01:01:00/1981-04-05 01:01:00R R(RtTrueRRR(RR((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyttest_parse_interval_relative^s88,,,2,D88,,,8,D,,,,,,,,,,,,,,,,888,,8,,,,888c Cs|jttddtWdQX|jttddtWdQX|jttddtWdQX|jttddtWdQXdS(Ns 2001/P1DasdfRs P1Dasdf/2001s#2001/P0003-06-04T12:30:05.5asdfasdfs#P0003-06-04T12:30:05.5asdfasdf/2001(RRRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyt*test_parse_interval_relative_suffixgarbages(RRRR(((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyR]s _t$TestRepeatingIntervalParserFunctionscBs5eZdZdZdZdZdZRS(cCsttd}|j|dtjdddddd|j|d tjdddddd |j|d tjdddddd ttd }xltjddD]X}|j||tjdddddddd dd |tjdd dd qWttddd}|j|dtjdddddddd dd |j|d tjdddddddd dd ttddd}|j|dtjdddddddd dd |j|d tjdddddddd dd td}xntjddD]Z}|jt|tjdddddddd dd |tjdd dd qFWdS(NsR3/1981-04-05/P1DiRiRiRiiiiisR11/PT1H2M/1980-03-05T01:01:00i iiRR thourstminutess,R2--1980-03-05T01:01:00--1981-04-05T01:01:00R s--s*R2/1980-03-05 01:01:00/1981-04-05 01:01:00R RsR/PT1H2M/1980-03-05T01:01:00( tlistRRRRRtranget timedeltatnext(Rtresultst dateindextresultgenerator((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyttest_parse_repeating_intervals ,,,V8888 cCsD|jttdWdQX|jttdWdQXdS(NsR3/1981-04-05/P1Dasdfs,R3/1981-04-05/P0003-06-04T12:30:05.5asdfasdf(RRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyt+test_parse_repeating_interval_suffixgarbagescCsttddt}|j|dtjdddddd |j|d tjdddddd |j|d tjdddddd ttddt}xltjddD]X}|j||tjdddddd dd dd |tjdd dd qWttddddt}|j|dtjdddddd dd dd |j|d tjdddddd dd dd ttddddt}|j|dtjdddddd dd dd |j|d tjdddddd dd dd ttddt}|j|dtjdddddd|j|d tjdddd dd|j|d tjdddd dd|j|dtjdddd ddtddt}xntjddD]Z}|jt |tjdddddd dd dd |tjdd dd q,WdS( NsR3/1981-04-05/P1DRiRiRiRiiiiisR11/PT1H2M/1980-03-05T01:01:00i iiRR R R!s,R2--1980-03-05T01:01:00--1981-04-05T01:01:00R s--s*R2/1980-03-05 01:01:00/1981-04-05 01:01:00R RsR4/2017-04-30T00:00:00/P1MiisR/PT1H2M/1980-03-05T01:01:00( R"RRRRRRR#R$R%(RR&R'R(((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyt&test_parse_repeating_interval_relatives*,,,V8888,,,,cCsJ|jttddtWdQX|jttdWdQXdS(NsR3/1981-04-05/P1DasdfRs,R3/1981-04-05/P0003-06-04T12:30:05.5asdfasdf(RRRR(R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_interval.pyt4test_parse_repeating_interval_relative_suffixgarbagesc Csddl}ddl}|}d|jd<|jttddtWdQX|jttddtWdQX||jd s   Mo\aniso8601-2.0.0/aniso8601/tests/test_time.py0000664000175000017500000004727513223544577021757 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import unittest import datetime from aniso8601.resolution import TimeResolution from aniso8601.time import get_time_resolution, parse_time, parse_datetime, \ _parse_time_naive, _parse_hour, _parse_minute_time, _parse_second_time, \ _build_time, _split_tz class TestTimeParserFunctions(unittest.TestCase): def test_get_time_resolution(self): self.assertEqual(get_time_resolution('01:23:45'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('24:00:00'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('23:21:28.512400'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('01:23'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('24:00'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('01:23.4567'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('012345'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('240000'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('0123'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('2400'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('01'), TimeResolution.Hours) self.assertEqual(get_time_resolution('24'), TimeResolution.Hours) self.assertEqual(get_time_resolution('12.5'), TimeResolution.Hours) self.assertEqual(get_time_resolution('232128.512400+00:00'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('0123.4567+00:00'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('01.4567+00:00'), TimeResolution.Hours) self.assertEqual(get_time_resolution('01:23:45+00:00'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('24:00:00+00:00'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('23:21:28.512400+00:00'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('01:23+00:00'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('24:00+00:00'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('01:23.4567+00:00'), TimeResolution.Minutes) self.assertEqual(get_time_resolution('23:21:28.512400+11:15'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('23:21:28.512400-12:34'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('23:21:28.512400Z'), TimeResolution.Seconds) self.assertEqual(get_time_resolution('06:14:00.000123Z'), TimeResolution.Seconds) def test_parse_time(self): time = parse_time('01:23:45') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) time = parse_time('24:00:00') self.assertEqual(time, datetime.time(hour=0)) time = parse_time('23:21:28.512400') self.assertEqual(time, datetime.time(hour=23, minute=21, second=28, microsecond=512400)) time = parse_time('01:23') self.assertEqual(time, datetime.time(hour=1, minute=23)) time = parse_time('24:00') self.assertEqual(time, datetime.time(hour=0)) time = parse_time('01:23.4567') self.assertEqual(time, datetime.time(hour=1, minute=23, second=27, microsecond=402000)) time = parse_time('012345') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) time = parse_time('240000') self.assertEqual(time, datetime.time(hour=0)) time = parse_time('0123') self.assertEqual(time, datetime.time(hour=1, minute=23)) time = parse_time('2400') self.assertEqual(time, datetime.time(hour=0)) time = parse_time('01') self.assertEqual(time, datetime.time(hour=1)) time = parse_time('24') self.assertEqual(time, datetime.time(hour=0)) time = parse_time('12.5') self.assertEqual(time, datetime.time(hour=12, minute=30)) time = parse_time('232128.512400+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('0123.4567+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=1, minute=23, second=27, microsecond=402000)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('01.4567+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=1, minute=27, second=24, microsecond=120000)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('01:23:45+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=1, minute=23, second=45)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('24:00:00+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=0)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('23:21:28.512400+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('01:23+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=1, minute=23)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('24:00+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=0)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('01:23.4567+00:00') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=1, minute=23, second=27, microsecond=402000)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') time = parse_time('23:21:28.512400+11:15') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=11, minutes=15)) self.assertEqual(tzinfoobject.tzname(None), '+11:15') time = parse_time('23:21:28.512400-12:34') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=12, minutes=34)) self.assertEqual(tzinfoobject.tzname(None), '-12:34') time = parse_time('23:21:28.512400Z') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), 'UTC') time = parse_time('06:14:00.000123Z') self.assertEqual(time.replace(tzinfo=None), datetime.time(hour=6, minute=14, microsecond=123)) tzinfoobject = time.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), 'UTC') with self.assertRaises(ValueError): parse_time('00:00:60') with self.assertRaises(ValueError): parse_time('00:00:60Z') with self.assertRaises(ValueError): parse_time('00:00:60+00:00') with self.assertRaises(ValueError): parse_time('00:61') with self.assertRaises(ValueError): parse_time('00:61Z') with self.assertRaises(ValueError): parse_time('00:61+00:00') def test_parse_datetime(self): resultdatetime = parse_datetime('1981-04-05T23:21:28.512400Z') self.assertEqual(resultdatetime.replace(tzinfo=None), datetime.datetime(1981, 4, 5, hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = resultdatetime.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), 'UTC') resultdatetime = parse_datetime('1981095T23:21:28.512400-12:34') self.assertEqual(resultdatetime.replace(tzinfo=None), datetime.datetime(1981, 4, 5, hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = resultdatetime.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=12, minutes=34)) self.assertEqual(tzinfoobject.tzname(None), '-12:34') resultdatetime = parse_datetime('19810405T23:21:28+00') self.assertEqual(resultdatetime.replace(tzinfo=None), datetime.datetime(1981, 4, 5, hour=23, minute=21, second=28)) tzinfoobject = resultdatetime.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00') resultdatetime = parse_datetime('19810405T23:21:28+00:00') self.assertEqual(resultdatetime.replace(tzinfo=None), datetime.datetime(1981, 4, 5, hour=23, minute=21, second=28)) tzinfoobject = resultdatetime.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') #https://bitbucket.org/nielsenb/aniso8601/issues/13/parsing-of-leap-second-gives-wildly with self.assertRaises(ValueError): parse_datetime('2016-12-31T23:59:60+00:00') with self.assertRaises(ValueError): parse_datetime('2016-12-31T23:59:60') with self.assertRaises(ValueError): parse_datetime('1981-04-05T00:00:60') with self.assertRaises(ValueError): parse_datetime('1981-04-05T00:00:60Z') with self.assertRaises(ValueError): parse_datetime('1981-04-05T00:00:60+00:00') with self.assertRaises(ValueError): parse_datetime('1981-04-05T00:61') with self.assertRaises(ValueError): parse_datetime('1981-04-05T00:61Z') with self.assertRaises(ValueError): parse_datetime('1981-04-05T00:61+00:00') def test_parse_datetime_spaceseperated(self): resultdatetime = parse_datetime('2004-W53-6 23:21:28.512400-12:34', ' ') self.assertEqual(resultdatetime.replace(tzinfo=None), datetime.datetime(2005, 1, 1, hour=23, minute=21, second=28, microsecond=512400)) tzinfoobject = resultdatetime.tzinfo self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=12, minutes=34)) self.assertEqual(tzinfoobject.tzname(None), '-12:34') def test_parse_time_naive(self): time = _parse_time_naive('01:23:45') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) time = _parse_time_naive('24:00:00') self.assertEqual(time, datetime.time(hour=0)) time = _parse_time_naive('23:21:28.512400') self.assertEqual(time, datetime.time(hour=23, minute=21, second=28, microsecond=512400)) time = _parse_time_naive('01:23') self.assertEqual(time, datetime.time(hour=1, minute=23)) time = _parse_time_naive('24:00') self.assertEqual(time, datetime.time(hour=0)) time = _parse_time_naive('01:23.4567') self.assertEqual(time, datetime.time(hour=1, minute=23, second=27, microsecond=402000)) time = _parse_time_naive('012345') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) time = _parse_time_naive('240000') self.assertEqual(time, datetime.time(hour=0)) time = _parse_time_naive('0123') self.assertEqual(time, datetime.time(hour=1, minute=23)) time = _parse_time_naive('2400') self.assertEqual(time, datetime.time(hour=0)) time = _parse_time_naive('01') self.assertEqual(time, datetime.time(hour=1)) time = _parse_time_naive('24') self.assertEqual(time, datetime.time(hour=0)) time = _parse_time_naive('232128.512400') self.assertEqual(time, datetime.time(hour=23, minute=21, second=28, microsecond=512400)) time = _parse_time_naive('0123.4567') self.assertEqual(time, datetime.time(hour=1, minute=23, second=27, microsecond=402000)) time = _parse_time_naive('01.4567') self.assertEqual(time, datetime.time(hour=1, minute=27, second=24, microsecond=120000)) with self.assertRaises(ValueError): _parse_time_naive('00:00:60') with self.assertRaises(ValueError): _parse_time_naive('00:00:60+00:00') with self.assertRaises(ValueError): _parse_time_naive('00:61') with self.assertRaises(ValueError): _parse_time_naive('00:61+00:00') def test_parse_hour(self): time = _parse_hour('01') self.assertEqual(time, datetime.time(hour=1)) time = _parse_hour('24') self.assertEqual(time, datetime.time(hour=0)) time = _parse_hour('01.4567') self.assertEqual(time, datetime.time(hour=1, minute=27, second=24, microsecond=120000)) time = _parse_hour('12.5') self.assertEqual(time, datetime.time(hour=12, minute=30)) with self.assertRaises(ValueError): _parse_hour('24.1') def test_parse_minute_time(self): time = _parse_minute_time('01:23') self.assertEqual(time, datetime.time(hour=1, minute=23)) time = _parse_minute_time('24:00') self.assertEqual(time, datetime.time(hour=0)) time = _parse_minute_time('01:23.4567') self.assertEqual(time, datetime.time(hour=1, minute=23, second=27, microsecond=402000)) time = _parse_minute_time('0123') self.assertEqual(time, datetime.time(hour=1, minute=23)) time = _parse_minute_time('2400') self.assertEqual(time, datetime.time(hour=0)) time = _parse_minute_time('0123.4567') self.assertEqual(time, datetime.time(hour=1, minute=23, second=27, microsecond=402000)) with self.assertRaises(ValueError): _parse_minute_time('0060') with self.assertRaises(ValueError): _parse_minute_time('0060.1') with self.assertRaises(ValueError): _parse_minute_time('00:60') with self.assertRaises(ValueError): _parse_minute_time('00:60.1') with self.assertRaises(ValueError): _parse_minute_time('2401') with self.assertRaises(ValueError): _parse_minute_time('2400.1') with self.assertRaises(ValueError): _parse_minute_time('24:01') with self.assertRaises(ValueError): _parse_minute_time('24:00.1') def test_parse_second_time(self): time = _parse_second_time('01:23:45') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) time = _parse_second_time('24:00:00') self.assertEqual(time, datetime.time(hour=0)) time = _parse_second_time('23:21:28.512400') self.assertEqual(time, datetime.time(hour=23, minute=21, second=28, microsecond=512400)) time = _parse_second_time('012345') self.assertEqual(time, datetime.time(hour=1, minute=23, second=45)) time = _parse_second_time('240000') self.assertEqual(time, datetime.time(hour=0)) time = _parse_second_time('232128.512400') self.assertEqual(time, datetime.time(hour=23, minute=21, second=28, microsecond=512400)) with self.assertRaises(ValueError): _parse_second_time('000060') with self.assertRaises(ValueError): _parse_second_time('00:00:60') with self.assertRaises(ValueError): _parse_second_time('006000') with self.assertRaises(ValueError): _parse_second_time('00:60:00') with self.assertRaises(ValueError): _parse_second_time('240001') with self.assertRaises(ValueError): _parse_second_time('24:00:01') with self.assertRaises(ValueError): _parse_second_time('240100') with self.assertRaises(ValueError): _parse_second_time('24:01:00') def test_build_time(self): self.assertEqual(_build_time(datetime.time(hour=1), datetime.timedelta(hours=1.1, minutes=2.2, seconds=3.3)), datetime.time(hour=2, minute=8, second=15, microsecond=300000)) #Make sure it overflows correctly self.assertEqual(_build_time(datetime.time.max, datetime.timedelta(microseconds=1)), datetime.time.min) def test_split_tz(self): self.assertEqual(_split_tz('01:23:45'), ('01:23:45', None)) self.assertEqual(_split_tz('24:00:00'), ('24:00:00', None)) self.assertEqual(_split_tz('23:21:28.512400'), ('23:21:28.512400', None)) self.assertEqual(_split_tz('01:23'), ('01:23', None)) self.assertEqual(_split_tz('24:00'), ('24:00', None)) self.assertEqual(_split_tz('01:23.4567'), ('01:23.4567', None)) self.assertEqual(_split_tz('012345'), ('012345', None)) self.assertEqual(_split_tz('240000'), ('240000', None)) self.assertEqual(_split_tz('0123'), ('0123', None)) self.assertEqual(_split_tz('2400'), ('2400', None)) self.assertEqual(_split_tz('01'), ('01', None)) self.assertEqual(_split_tz('24'), ('24', None)) self.assertEqual(_split_tz('12.5'), ('12.5', None)) self.assertEqual(_split_tz('232128.512400+00:00'), ('232128.512400', '+00:00')) self.assertEqual(_split_tz('0123.4567+00:00'), ('0123.4567', '+00:00')) self.assertEqual(_split_tz('01.4567+00:00'), ('01.4567', '+00:00')) self.assertEqual(_split_tz('01:23:45+00:00'), ('01:23:45', '+00:00')) self.assertEqual(_split_tz('24:00:00+00:00'), ('24:00:00', '+00:00')) self.assertEqual(_split_tz('23:21:28.512400+00:00'), ('23:21:28.512400', '+00:00')) self.assertEqual(_split_tz('01:23+00:00'), ('01:23', '+00:00')) self.assertEqual(_split_tz('24:00+00:00'), ('24:00', '+00:00')) self.assertEqual(_split_tz('01:23.4567+00:00'), ('01:23.4567', '+00:00')) self.assertEqual(_split_tz('23:21:28.512400+11:15'), ('23:21:28.512400', '+11:15')) self.assertEqual(_split_tz('23:21:28.512400-12:34'), ('23:21:28.512400', '-12:34')) self.assertEqual(_split_tz('23:21:28.512400Z'), ('23:21:28.512400', 'Z')) self.assertEqual(_split_tz('06:14:00.000123Z'), ('06:14:00.000123', 'Z')) aniso8601-2.0.0/aniso8601/tests/test_time.pyc0000664000175000017500000003461213223544703022100 0ustar nielsenbnielsenb00000000000000 NZc@sddlZddlZddlmZddlmZmZmZmZm Z m Z m Z m Z m Z dejfdYZdS(iN(tTimeResolution( tget_time_resolutiont parse_timetparse_datetimet_parse_time_naivet _parse_hourt_parse_minute_timet_parse_second_timet _build_timet _split_tztTestTimeParserFunctionscBsbeZdZdZdZdZdZdZdZdZ dZ d Z RS( cCs|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtd tj|jtd tj|jtd tj|jtd tj|jtd tj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtj|jtdtjdS(Ns01:23:45s24:00:00s23:21:28.512400s01:23s24:00s 01:23.4567t012345t240000t0123t2400t01t24s12.5s232128.512400+00:00s0123.4567+00:00s 01.4567+00:00s01:23:45+00:00s24:00:00+00:00s23:21:28.512400+00:00s 01:23+00:00s 24:00+00:00s01:23.4567+00:00s23:21:28.512400+11:15s23:21:28.512400-12:34s23:21:28.512400Zs06:14:00.000123Z(t assertEqualRRtSecondstMinutestHours(tself((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_get_time_resolutionsJ          c Cs td}|j|tjddddddtd}|j|tjdd td }|j|tjdddd dd d dtd}|j|tjddddtd}|j|tjdd td}|j|tjddddddd dtd}|j|tjddddddtd}|j|tjdd td}|j|tjddddtd}|j|tjdd td}|j|tjddtd}|j|tjdd td}|j|tjddddtd}|j|jddtjdddd dd d d|j}|j|jdtjdd |j|j dd td!}|j|jddtjddddddd d|j}|j|jdtjdd |j|j dd td"}|j|jddtjdddddd#d d$|j}|j|jdtjdd |j|j dd td%}|j|jddtjdddddd|j}|j|jdtjdd |j|j dd td&}|j|jddtjdd |j}|j|jdtjdd |j|j dd td'}|j|jddtjdddd dd d d|j}|j|jdtjdd |j|j dd td(}|j|jddtjdddd|j}|j|jdtjdd |j|j dd td)}|j|jddtjdd |j}|j|jdtjdd |j|j dd td*}|j|jddtjddddddd d|j}|j|jdtjdd |j|j dd td+}|j|jddtjdddd dd d d|j}|j|jdtjdd,d-d.|j|j dd/td0}|j|jddtjdddd dd d d|j}|j|jdtjddd-d1 |j|j dd2td3}|j|jddtjdddd dd d d|j}|j|jdtjdd |j|j dd4td5}|j|jddtjdd6dd7d d8|j}|j|jdtjdd |j|j dd4|j t td9WdQX|j t td:WdQX|j t td;WdQX|j t td<WdQX|j t td=WdQX|j t td>WdQXdS(?Ns01:23:45thouritminuteitsecondi-s24:00:00is23:21:28.512400iit microsecondis01:23s24:00s 01:23.4567iiP"R R R RRRs12.5i is232128.512400+00:00ttzinfothourss+00:00s0123.4567+00:00s 01.4567+00:00iis01:23:45+00:00s24:00:00+00:00s23:21:28.512400+00:00s 01:23+00:00s 24:00+00:00s01:23.4567+00:00s23:21:28.512400+11:15i tminutesis+11:15s23:21:28.512400-12:34i"s-12:34s23:21:28.512400ZtUTCs06:14:00.000123Ziii{s00:00:60s 00:00:60Zs00:00:60+00:00s00:61s00:61Zs 00:61+00:00( RRtdatetimettimetreplacetNoneRt utcoffsett timedeltattznamet assertRaisest ValueError(RR t tzinfoobject((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_parse_time9s (  . "  . (  "    " : % : % : % 4 % ( % : % . % ( % : % : + : , : % 4 %cCsWtd}|j|jddtjddddddd d d d d |j}|j|jdtjdd|j|jddtd}|j|jddtjddddddd d d d d |j}|j|jdtjdddd |j|jddtd}|j|jddtjddddddd d d |j}|j|jdtjdd|j|jddtd}|j|jddtjddddddd d d |j}|j|jdtjdd|j|jdd|j t tdWdQX|j t tdWdQX|j t tdWdQX|j t tdWdQX|j t tdWdQX|j t tdWdQX|j t td WdQX|j t td!WdQXdS("Ns1981-04-05T23:21:28.512400ZRiiiRiRiRiRiRiRs1981095T23:21:28.512400-12:34i Ri"s-12:34s19810405T23:21:28+00s+00s19810405T23:21:28+00:00s+00:00s2016-12-31T23:59:60+00:00s2016-12-31T23:59:60s1981-04-05T00:00:60s1981-04-05T00:00:60Zs1981-04-05T00:00:60+00:00s1981-04-05T00:61s1981-04-05T00:61Zs1981-04-05T00:61+00:00( RRR!R"RRR#R$R%R&R'(RtresultdatetimeR(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_parse_datetimesH C % C , = % = %cCstdd}|j|jddtjddddddd d d d d |j}|j|jdtjdddd |j|jdddS(Ns 2004-W53-6 23:21:28.512400-12:34t RiiRiRiRiRiRi Ri"s-12:34( RRR!R"RRR#R$R%(RR*R(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyt"test_parse_datetime_spaceseperateds C ,c CsZtd}|j|tjddddddtd}|j|tjdd td }|j|tjdddd dd d dtd}|j|tjddddtd}|j|tjdd td}|j|tjddddddd dtd}|j|tjddddddtd}|j|tjdd td}|j|tjddddtd}|j|tjdd td}|j|tjddtd}|j|tjdd td}|j|tjdddd dd d dtd}|j|tjddddddd dtd}|j|tjddddddd d|jttdWdQX|jttd WdQX|jttd!WdQX|jttd"WdQXdS(#Ns01:23:45RiRiRi-s24:00:00is23:21:28.512400iiRis01:23s24:00s 01:23.4567iiP"R R R RRRs 232128.512400s 0123.4567s01.4567iis00:00:60s00:00:60+00:00s00:61s 00:61+00:00(RRRR R&R'(RR ((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_parse_time_naive sL (  . "  . (  "    . . .c Cstd}|j|tjddtd}|j|tjddtd}|j|tjddddd d d d td }|j|tjdddd|jttdWdQXdS(NRRiRis01.4567RiRiRis12.5i is24.1(RRRR R&R'(RR ((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_parse_hourFs   . "c Cs$td}|j|tjddddtd}|j|tjddtd}|j|tjddddd d d d td }|j|tjddddtd}|j|tjddtd}|j|tjddddd d d d |jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQXdS(Ns01:23RiRis24:00is 01:23.4567RiRiP"R Rs 0123.4567t0060s0060.1s00:60s00:60.1t2401s2400.1s24:01s24:00.1(RRRR R&R'(RR ((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_parse_minute_timeVs8 "  . "  .c Cs0td}|j|tjddddddtd}|j|tjdd td }|j|tjdddd dd d dtd}|j|tjddddddtd}|j|tjdd td}|j|tjdddd dd d d|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQXdS(Ns01:23:45RiRiRi-s24:00:00is23:21:28.512400iiRiR R s 232128.512400t000060s00:00:60t006000s00:60:00t240001s24:00:01t240100s24:01:00(RRRR R&R'(RR ((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_parse_second_times8 (  . (  .c Cs|jttjddtjddddddtjdd d d d d dd|jttjjtjddtjjdS(NRiRg?Rg@tsecondsgffffff @iRiRiRit microseconds(RRRR R$tmaxtmin(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyttest_build_times[cCs@|jtdd#|jtdd$|jtdd%|jtdd&|jtdd'|jtdd(|jtdd)|jtdd*|jtd d+|jtd d,|jtd d-|jtd d.|jtd d/|jtdd0|jtdd1|jtdd2|jtdd3|jtdd4|jtdd5|jtdd6|jtdd7|jtdd8|jtdd9|jtdd:|jtdd;|jtd!d<dS(=Ns01:23:45s24:00:00s23:21:28.512400s01:23s24:00s 01:23.4567R R R RRRs12.5s232128.512400+00:00s 232128.512400s+00:00s0123.4567+00:00s 0123.4567s 01.4567+00:00s01.4567s01:23:45+00:00s24:00:00+00:00s23:21:28.512400+00:00s 01:23+00:00s 24:00+00:00s01:23.4567+00:00s23:21:28.512400+11:15s+11:15s23:21:28.512400-12:34s-12:34s23:21:28.512400ZtZs06:14:00.000123Zs06:14:00.000123(s01:23:45N(s24:00:00N(s23:21:28.512400N(s01:23N(s24:00N(s 01:23.4567N(R N(R N(R N(RN(RN(RN(s12.5N(s 232128.512400s+00:00(s 0123.4567s+00:00(s01.4567s+00:00(s01:23:45s+00:00(s24:00:00s+00:00(s23:21:28.512400s+00:00(s01:23s+00:00(s24:00s+00:00(s 01:23.4567s+00:00(s23:21:28.512400s+11:15(s23:21:28.512400s-12:34(s23:21:28.512400R=(s06:14:00.000123R=(RR R"(R((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyt test_split_tzs4( t__name__t __module__RR)R+R-R.R/R2R7R<R>(((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyR s ' 6  :  + + (tunittestRtaniso8601.resolutionRtaniso8601.timeRRRRRRRRR tTestCaseR (((sO/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_time.pyt s  @aniso8601-2.0.0/aniso8601/tests/test_timezone.py0000664000175000017500000001505113223544577022636 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import unittest import datetime import pickle from aniso8601.timezone import parse_timezone, UTCOffset class TestTimezoneParserFunctions(unittest.TestCase): def test_parse_timezone(self): tzinfoobject = parse_timezone('Z') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), 'UTC') tzinfoobject = parse_timezone('+00:00') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00:00') tzinfoobject = parse_timezone('+01:00') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=1)) self.assertEqual(tzinfoobject.tzname(None), '+01:00') tzinfoobject = parse_timezone('-01:00') self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=1)) self.assertEqual(tzinfoobject.tzname(None), '-01:00') tzinfoobject = parse_timezone('+00:12') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(minutes=12)) self.assertEqual(tzinfoobject.tzname(None), '+00:12') tzinfoobject = parse_timezone('+01:23') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=1, minutes=23)) self.assertEqual(tzinfoobject.tzname(None), '+01:23') tzinfoobject = parse_timezone('-01:23') self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=1, minutes=23)) self.assertEqual(tzinfoobject.tzname(None), '-01:23') tzinfoobject = parse_timezone('+0000') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+0000') tzinfoobject = parse_timezone('+0100') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=1)) self.assertEqual(tzinfoobject.tzname(None), '+0100') tzinfoobject = parse_timezone('-0100') self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=1)) self.assertEqual(tzinfoobject.tzname(None), '-0100') tzinfoobject = parse_timezone('+0012') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(minutes=12)) self.assertEqual(tzinfoobject.tzname(None), '+0012') tzinfoobject = parse_timezone('+0123') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=1, minutes=23)) self.assertEqual(tzinfoobject.tzname(None), '+0123') tzinfoobject = parse_timezone('-0123') self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=1, minutes=23)) self.assertEqual(tzinfoobject.tzname(None), '-0123') tzinfoobject = parse_timezone('+00') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=0)) self.assertEqual(tzinfoobject.tzname(None), '+00') tzinfoobject = parse_timezone('+01') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=1)) self.assertEqual(tzinfoobject.tzname(None), '+01') tzinfoobject = parse_timezone('-01') self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=1)) self.assertEqual(tzinfoobject.tzname(None), '-01') tzinfoobject = parse_timezone('+12') self.assertEqual(tzinfoobject.utcoffset(None), datetime.timedelta(hours=12)) self.assertEqual(tzinfoobject.tzname(None), '+12') tzinfoobject = parse_timezone('-12') self.assertEqual(tzinfoobject.utcoffset(None), -datetime.timedelta(hours=12)) self.assertEqual(tzinfoobject.tzname(None), '-12') def test_parse_timezone_tzstr(self): with self.assertRaises(ValueError): parse_timezone('Y') with self.assertRaises(ValueError): parse_timezone(' Z') with self.assertRaises(ValueError): parse_timezone('Z ') with self.assertRaises(ValueError): parse_timezone(' Z ') def test_parse_timezone_negativezero(self): #A 0 offset cannot be negative with self.assertRaises(ValueError): parse_timezone('-00:00') with self.assertRaises(ValueError): parse_timezone('-0000') with self.assertRaises(ValueError): parse_timezone('-00') def test_pickle(self): #Make sure timezone objects are pickleable testutcoffset = UTCOffset(name='UTC', minutes=0) utcoffsetpickle = pickle.dumps(testutcoffset) resultutcoffset = pickle.loads(utcoffsetpickle) self.assertEqual(resultutcoffset._name, testutcoffset._name) self.assertEqual(resultutcoffset._utcdelta, testutcoffset._utcdelta) def test_string_representation(self): #Make sure UTC offsets can be printed out prettily tzinfoobject = parse_timezone('+00:00') self.assertEqual(str(tzinfoobject), '+0:00:00 UTC') tzinfoobject = parse_timezone('+01:00') self.assertEqual(str(tzinfoobject), '+1:00:00 UTC') tzinfoobject = parse_timezone('-01:00') self.assertEqual(str(tzinfoobject), '-1:00:00 UTC') tzinfoobject = parse_timezone('+00:12') self.assertEqual(str(tzinfoobject), '+0:12:00 UTC') tzinfoobject = parse_timezone('-00:12') self.assertEqual(str(tzinfoobject), '-0:12:00 UTC') tzinfoobject = parse_timezone('+01:23') self.assertEqual(str(tzinfoobject), '+1:23:00 UTC') tzinfoobject = parse_timezone('-01:23') self.assertEqual(str(tzinfoobject), '-1:23:00 UTC') tzinfoobject = parse_timezone('+24:00') self.assertEqual(str(tzinfoobject), '+1 day, 0:00:00 UTC') tzinfoobject = parse_timezone('-24:00') self.assertEqual(str(tzinfoobject), '-1 day, 0:00:00 UTC') tzinfoobject = parse_timezone('+49:27') self.assertEqual(str(tzinfoobject), '+2 days, 1:27:00 UTC') tzinfoobject = parse_timezone('-49:27') self.assertEqual(str(tzinfoobject), '-2 days, 1:27:00 UTC') def test_datetime_tzinfo_dst(self): tzinfoobject = parse_timezone('+04:00') #This would raise ValueError or a TypeError if dst info is invalid result = datetime.datetime.now(tzinfoobject) #Hacky way to make sure the tzinfo is what we'd expect self.assertEqual(result.tzinfo.utcoffset(None), datetime.timedelta(hours=4)) aniso8601-2.0.0/aniso8601/tests/test_timezone.pyc0000664000175000017500000001201313223544703022763 0ustar nielsenbnielsenb00000000000000 NZc@sWddlZddlZddlZddlmZmZdejfdYZdS(iN(tparse_timezonet UTCOffsettTestTimezoneParserFunctionscBs>eZdZdZdZdZdZdZRS(cCsVtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd |j|jddtd }|j|jdtjd d |j|jdd td }|j|jdtjddd d |j|jdd td}|j|jdtjddd d  |j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd |j|jddtd}|j|jdtjd d |j|jddtd}|j|jdtjddd d |j|jddtd}|j|jdtjddd d  |j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd|j|jddtd}|j|jdtjdd |j|jddtd}|j|jdtjdd |j|jddtd}|j|jdtjdd  |j|jdddS(NtZthoursitUTCs+00:00s+01:00is-01:00s+00:12tminutesi s+01:23is-01:23s+0000s+0100s-0100s+0012s+0123s-0123s+00s+01s-01s+12s-12(Rt assertEqualt utcoffsettNonetdatetimet timedeltattzname(tselft tzinfoobject((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyttest_parse_timezonesl % % % & % + , % % & % + , % % & % &c Cs|jttdWdQX|jttdWdQX|jttdWdQX|jttdWdQXdS(NtYs ZsZ s Z (t assertRaisest ValueErrorR(R ((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyttest_parse_timezone_tzstrYscCsd|jttdWdQX|jttdWdQX|jttdWdQXdS(Ns-00:00s-0000s-00(RRR(R ((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyt test_parse_timezone_negativezerofs cCsctdddd}tj|}tj|}|j|j|j|j|j|jdS(NtnameRRi(RtpickletdumpstloadsRt_namet _utcdelta(R t testutcoffsettutcoffsetpickletresultutcoffset((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyt test_pickleqs cCsztd}|jt|dtd}|jt|dtd}|jt|dtd}|jt|dtd }|jt|d td }|jt|d td }|jt|dtd}|jt|dtd}|jt|dtd}|jt|dtd}|jt|ddS(Ns+00:00s +0:00:00 UTCs+01:00s +1:00:00 UTCs-01:00s -1:00:00 UTCs+00:12s +0:12:00 UTCs-00:12s -0:12:00 UTCs+01:23s +1:23:00 UTCs-01:23s -1:23:00 UTCs+24:00s+1 day, 0:00:00 UTCs-24:00s-1 day, 0:00:00 UTCs+49:27s+2 days, 1:27:00 UTCs-49:27s-2 days, 1:27:00 UTC(RRtstr(R R((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyttest_string_representation|s,           cCsJtd}tjj|}|j|jjdtjdddS(Ns+04:00Ri(RR tnowRttzinfoRR R (R Rtresult((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyttest_datetime_tzinfo_dsts (t__name__t __module__RRRRR R$(((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyRs  I #(tunittestR Rtaniso8601.timezoneRRtTestCaseR(((sS/home/nielsenb/Jetfuse/aniso8601/python2/aniso8601/aniso8601/tests/test_timezone.pyt s   aniso8601-2.0.0/aniso8601/__init__.py0000664000175000017500000000101713152331517020324 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. #Import the main parsing functions so they are readily available from aniso8601.time import parse_datetime, parse_time, get_time_resolution from aniso8601.date import parse_date, get_date_resolution from aniso8601.duration import parse_duration from aniso8601.interval import parse_interval, parse_repeating_interval aniso8601-2.0.0/aniso8601/__init__.pyc0000664000175000017500000000100313152331751020462 0ustar nielsenbnielsenb00000000000000 OYc@s\ddlmZmZmZddlmZmZddlmZddl m Z m Z dS(i(tparse_datetimet parse_timetget_time_resolution(t parse_datetget_date_resolution(tparse_duration(tparse_intervaltparse_repeating_intervalN( taniso8601.timeRRRtaniso8601.dateRRtaniso8601.durationRtaniso8601.intervalRR(((saniso8601/__init__.pyt saniso8601-2.0.0/aniso8601/compat.py0000664000175000017500000000046113152331517020052 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import sys PY2 = sys.version_info[0] == 2 if PY2: range = xrange else: range = range aniso8601-2.0.0/aniso8601/compat.pyc0000664000175000017500000000035313152331751020215 0ustar nielsenbnielsenb00000000000000 OYc@s8ddlZejddkZer.eZneZdS(iNii(tsyst version_infotPY2txrangetrange(((saniso8601/compat.pyt s  aniso8601-2.0.0/aniso8601/date.py0000664000175000017500000001736213223544577017527 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import datetime from aniso8601.resolution import DateResolution def get_date_resolution(isodatestr): #Valid string formats are: # #Y[YYY] #YYYY-MM-DD #YYYYMMDD #YYYY-MM #YYYY-Www #YYYYWww #YYYY-Www-D #YYYYWwwD #YYYY-DDD #YYYYDDD if isodatestr.startswith('+') or isodatestr.startswith('-'): raise NotImplementedError('ISO 8601 extended year representation not supported.') if isodatestr.find('W') != -1: #Handle ISO 8601 week date format hyphens_present = 1 if isodatestr.find('-') != -1 else 0 week_date_len = 7 + hyphens_present weekday_date_len = 8 + 2 * hyphens_present if len(isodatestr) == week_date_len: #YYYY-Www #YYYYWww return DateResolution.Week elif len(isodatestr) == weekday_date_len: #YYYY-Www-D #YYYYWwwD return DateResolution.Weekday else: raise ValueError('String is not a valid ISO 8601 week date.') #If the size of the string of 4 or less, assume its a truncated year representation if len(isodatestr) <= 4: return DateResolution.Year #An ISO string may be a calendar represntation if: # 1) When split on a hyphen, the sizes of the parts are 4, 2, 2 or 4, 2 # 2) There are no hyphens, and the length is 8 datestrsplit = isodatestr.split('-') #Check case 1 if len(datestrsplit) == 2: if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 2: return DateResolution.Month if len(datestrsplit) == 3: if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 2 and len(datestrsplit[2]) == 2: return DateResolution.Day #Check case 2 if len(isodatestr) == 8 and isodatestr.find('-') == -1: return DateResolution.Day #An ISO string may be a ordinal date representation if: # 1) When split on a hyphen, the sizes of the parts are 4, 3 # 2) There are no hyphens, and the length is 7 #Check case 1 if len(datestrsplit) == 2: if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 3: return DateResolution.Ordinal #Check case 2 if len(isodatestr) == 7 and isodatestr.find('-') == -1: return DateResolution.Ordinal #None of the date representations match raise ValueError('String is not an ISO 8601 date, perhaps it represents a time or datetime.') def parse_date(isodatestr): #Given a string in any ISO 8601 date format, return a datetime.date #object that corresponds to the given date. Valid string formats are: # #Y[YYY] #YYYY-MM-DD #YYYYMMDD #YYYY-MM #YYYY-Www #YYYYWww #YYYY-Www-D #YYYYWwwD #YYYY-DDD #YYYYDDD # #Note that the ISO 8601 date format of ±YYYYY is expressly not supported return _RESOLUTION_MAP[get_date_resolution(isodatestr)](isodatestr) def _parse_year(yearstr): #yearstr is of the format Y[YYY] # #0000 (1 BC) is not representible as a Python date so a ValueError is #raised # #Truncated dates, like '19', refer to 1900-1999 inclusive, we simply parse #to 1900-01-01 # #Since no additional resolution is provided, the month is set to 1, and #day is set to 1 if len(yearstr) == 4: return datetime.date(int(yearstr), 1, 1) else: #Shift 0s in from the left to form complete year return datetime.date(int(yearstr.ljust(4, '0')), 1, 1) def _parse_calendar_day(datestr): #datestr is of the format YYYY-MM-DD or YYYYMMDD if len(datestr) == 10: #YYYY-MM-DD strformat = '%Y-%m-%d' elif len(datestr) == 8: #YYYYMMDD strformat = '%Y%m%d' else: raise ValueError('String is not a valid ISO 8601 calendar day.') parseddatetime = datetime.datetime.strptime(datestr, strformat) #Since no 'time' is given, cast to a date return parseddatetime.date() def _parse_calendar_month(datestr): #datestr is of the format YYYY-MM if len(datestr) != 7: raise ValueError('String is not a valid ISO 8601 calendar month.') parseddatetime = datetime.datetime.strptime(datestr, '%Y-%m') #Since no 'time' is given, cast to a date return parseddatetime.date() def _parse_week_day(datestr): #datestr is of the format YYYY-Www-D, YYYYWwwD # #W is the week number prefix, ww is the week number, between 1 and 53 #0 is not a valid week number, which differs from the Python implementation # #D is the weekday number, between 1 and 7, which differs from the Python #implementation which is between 0 and 6 isoyear = int(datestr[0:4]) gregorianyearstart = _iso_year_start(isoyear) #Week number will be the two characters after the W windex = datestr.find('W') isoweeknumber = int(datestr[windex + 1:windex + 3]) if isoweeknumber == 0: raise ValueError('00 is not a valid ISO 8601 weeknumber.') if datestr.find('-') != -1 and len(datestr) == 10: #YYYY-Www-D isoday = int(datestr[9:10]) elif len(datestr) == 8: #YYYYWwwD isoday = int(datestr[7:8]) else: raise ValueError('String is not a valid ISO 8601 week date.') return gregorianyearstart + datetime.timedelta(weeks=isoweeknumber - 1, days=isoday - 1) def _parse_week(datestr): #datestr is of the format YYYY-Www, YYYYWww # #W is the week number prefix, ww is the week number, between 1 and 53 #0 is not a valid week number, which differs from the Python implementation isoyear = int(datestr[0:4]) gregorianyearstart = _iso_year_start(isoyear) #Week number will be the two characters after the W windex = datestr.find('W') isoweeknumber = int(datestr[windex + 1:windex + 3]) if isoweeknumber == 0: raise ValueError('00 is not a valid ISO 8601 weeknumber.') return gregorianyearstart + datetime.timedelta(weeks=isoweeknumber - 1, days=0) def _parse_ordinal_date(datestr): #datestr is of the format YYYY-DDD or YYYYDDD #DDD can be from 1 - 36[5,6], this matches Python's definition isoyear = int(datestr[0:4]) if datestr.find('-') != -1: #YYYY-DDD parseddatetime = datetime.datetime.strptime(datestr, '%Y-%j') else: #YYYYDDD parseddatetime = datetime.datetime.strptime(datestr, '%Y%j') #Enforce ordinal day limitation #https://bitbucket.org/nielsenb/aniso8601/issues/14/parsing-ordinal-dates-should-only-allow if parseddatetime.year != isoyear: raise ValueError('Day of year must be from 1..365, 1..366 for leap year.') #Since no 'time' is given, cast to a date return parseddatetime.date() def _iso_year_start(isoyear): #Given an ISO year, returns the equivalent of the start of the year #on the Gregorian calendar (which is used by Python) #Stolen from: #http://stackoverflow.com/questions/304256/whats-the-best-way-to-find-the-inverse-of-datetime-isocalendar #Determine the location of the 4th of January, the first week of #the ISO year is the week containing the 4th of January #http://en.wikipedia.org/wiki/ISO_week_date fourth_jan = datetime.date(isoyear, 1, 4) #Note the conversion from ISO day (1 - 7) and Python day (0 - 6) delta = datetime.timedelta(fourth_jan.isoweekday() - 1) #Return the start of the year return fourth_jan - delta _RESOLUTION_MAP = { DateResolution.Day: _parse_calendar_day, DateResolution.Ordinal: _parse_ordinal_date, DateResolution.Month: _parse_calendar_month, DateResolution.Week: _parse_week, DateResolution.Weekday: _parse_week_day, DateResolution.Year: _parse_year } aniso8601-2.0.0/aniso8601/date.pyc0000664000175000017500000001130513223544703017650 0ustar nielsenbnielsenb00000000000000 NZc@sddlZddlmZdZdZdZdZdZdZd Z d Z d Z ieej 6e ej 6eej6e ej6eej6eej6ZdS( iN(tDateResolutioncCs>|jds|jdr-tdn|jddkr|jddkr]dnd}d|}d d |}t||krtjSt||krtjStd nt|d krtjS|j d}t|d kr,t|dd kr,t|dd kr,tj Snt|d krt|dd krt|dd krt|d d krtj Snt|d kr|jddkrtj St|d krt|dd krt|dd krtj Snt|dkr.|jddkr.tj StddS(Nt+t-s4ISO 8601 extended year representation not supported.tWiiiiiis)String is not a valid ISO 8601 week date.iisIString is not an ISO 8601 date, perhaps it represents a time or datetime.( t startswithtNotImplementedErrortfindtlenRtWeektWeekdayt ValueErrortYeartsplittMonthtDaytOrdinal(t isodatestrthyphens_presentt week_date_lentweekday_date_lent datestrsplit((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pytget_date_resolution s8 ! , B ', 'cCstt||S(N(t_RESOLUTION_MAPR(R((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt parse_dateTscCsTt|dkr+tjt|ddStjt|jddddSdS(Niit0(Rtdatetimetdatetinttljust(tyearstr((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt _parse_yearfs cCsat|dkrd}n't|dkr6d}n tdtjj||}|jS(Ni s%Y-%m-%dis%Y%m%ds,String is not a valid ISO 8601 calendar day.(RR RtstrptimeR(tdatestrt strformattparseddatetime((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt_parse_calendar_dayxs   cCs@t|dkr!tdntjj|d}|jS(Nis.String is not a valid ISO 8601 calendar month.s%Y-%m(RR RRR(R R"((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt_parse_calendar_monthscCst|dd!}t|}|jd}t||d|d!}|dkrdtdn|jddkrt|d krt|d d !}n4t|d krt|d d !}n td |tjd|dd|dS(NiiRiis&00 is not a valid ISO 8601 weeknumber.Rii i iis)String is not a valid ISO 8601 week date.tweekstdays(Rt_iso_year_startRR RRt timedelta(R tisoyeartgregorianyearstarttwindext isoweeknumbertisoday((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt_parse_week_days   ' cCst|dd!}t|}|jd}t||d|d!}|dkrdtdn|tjd|dddS( NiiRiis&00 is not a valid ISO 8601 weeknumber.R%R&(RR'RR RR((R R)R*R+R,((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt _parse_weeks  cCs}t|dd!}|jddkr@tjj|d}ntjj|d}|j|krstdn|jS(NiiRis%Y-%js%Y%js6Day of year must be from 1..365, 1..366 for leap year.(RRRRtyearR R(R R)R"((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt_parse_ordinal_datescCs6tj|dd}tj|jd}||S(Nii(RRR(t isoweekday(R)t fourth_jantdelta((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyR's (Rtaniso8601.resolutionRRRRR#R$R.R/R1R'RRR RR R R(((s</home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/date.pyt s"  G            aniso8601-2.0.0/aniso8601/duration.py0000664000175000017500000002373413223544577020437 0ustar nielsenbnielsenb00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2016, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms # of the BSD license. See the LICENSE file for details. import datetime from aniso8601.date import parse_date from aniso8601.time import parse_time from aniso8601 import compat def parse_duration(isodurationstr, relative=False): #Given a string representing an ISO 8601 duration, return a #datetime.timedelta (or dateutil.relativedelta.relativedelta #if relative=True) that matches the given duration. Valid formats are: # #PnYnMnDTnHnMnS (or any reduced precision equivalent) #PT