1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675 |
- # -*- coding: utf-8 -*-
- # Copyright (c) 2021, 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 aniso8601
- from aniso8601.builders import (
- DatetimeTuple,
- DateTuple,
- DurationTuple,
- IntervalTuple,
- TimeTuple,
- TimezoneTuple,
- )
- from aniso8601.exceptions import ISOFormatError
- from aniso8601.interval import (
- _get_interval_component_resolution,
- _get_interval_resolution,
- _parse_interval,
- _parse_interval_end,
- get_interval_resolution,
- get_repeating_interval_resolution,
- parse_interval,
- parse_repeating_interval,
- )
- from aniso8601.resolution import IntervalResolution
- from aniso8601.tests.compat import mock
- class TestIntervalParser_UtilityFunctions(unittest.TestCase):
- def test_get_interval_resolution(self):
- self.assertEqual(
- _get_interval_resolution(
- IntervalTuple(
- start=DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- end=DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm="05", ss="06", tz=None),
- ),
- duration=None,
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_resolution(
- IntervalTuple(
- start=DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm="05", ss="06", tz=None),
- ),
- end=DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- duration=None,
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_resolution(
- IntervalTuple(
- start=DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- end=None,
- duration=DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD="3", TnH="4", TnM="5", TnS="6"
- ),
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_resolution(
- IntervalTuple(
- start=DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm="05", ss="06", tz=None),
- ),
- end=None,
- duration=DurationTuple(
- PnY="1",
- PnM="2",
- PnW=None,
- PnD="3",
- TnH=None,
- TnM=None,
- TnS=None,
- ),
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_resolution(
- IntervalTuple(
- start=None,
- end=DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- duration=DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD="3", TnH="4", TnM="5", TnS="6"
- ),
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_resolution(
- IntervalTuple(
- start=None,
- end=DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm="05", ss="06", tz=None),
- ),
- duration=DurationTuple(
- PnY="1",
- PnM="2",
- PnW=None,
- PnD="3",
- TnH=None,
- TnM=None,
- TnS=None,
- ),
- )
- ),
- IntervalResolution.Seconds,
- )
- def test_get_interval_component_resolution(self):
- self.assertEqual(
- _get_interval_component_resolution(
- DateTuple(YYYY="2001", MM=None, DD=None, Www=None, D=None, DDD="123")
- ),
- IntervalResolution.Ordinal,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DateTuple(YYYY="2001", MM=None, DD=None, Www="12", D="3", DDD=None)
- ),
- IntervalResolution.Weekday,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DateTuple(YYYY="2001", MM=None, DD=None, Www="12", D=None, DDD=None)
- ),
- IntervalResolution.Week,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DateTuple(YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None)
- ),
- IntervalResolution.Day,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DateTuple(YYYY="2001", MM="02", DD=None, Www=None, D=None, DDD=None)
- ),
- IntervalResolution.Month,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DateTuple(YYYY="2001", MM=None, DD=None, Www=None, D=None, DDD=None)
- ),
- IntervalResolution.Year,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm="05", ss="06", tz=None),
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm="05", ss=None, tz=None),
- )
- ),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DatetimeTuple(
- DateTuple(
- YYYY="2001", MM="02", DD="03", Www=None, D=None, DDD=None
- ),
- TimeTuple(hh="04", mm=None, ss=None, tz=None),
- )
- ),
- IntervalResolution.Hours,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD="3", TnH="4", TnM="5", TnS="6"
- )
- ),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD="3", TnH="4", TnM="5", TnS=None
- )
- ),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD="3", TnH="4", TnM=None, TnS=None
- )
- ),
- IntervalResolution.Hours,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD="3", TnH=None, TnM=None, TnS=None
- )
- ),
- IntervalResolution.Day,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY="1", PnM="2", PnW=None, PnD=None, TnH=None, TnM=None, TnS=None
- )
- ),
- IntervalResolution.Month,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY="1", PnM=None, PnW=None, PnD=None, TnH=None, TnM=None, TnS=None
- )
- ),
- IntervalResolution.Year,
- )
- self.assertEqual(
- _get_interval_component_resolution(
- DurationTuple(
- PnY=None, PnM=None, PnW="3", PnD=None, TnH=None, TnM=None, TnS=None
- )
- ),
- IntervalResolution.Week,
- )
- class TestIntervalParserFunctions(unittest.TestCase):
- def test_get_interval_resolution_date(self):
- self.assertEqual(get_interval_resolution("P1.5Y/2018"), IntervalResolution.Year)
- self.assertEqual(
- get_interval_resolution("P1.5Y/2018-03"), IntervalResolution.Month
- )
- self.assertEqual(
- get_interval_resolution("P1.5Y/2018-03-06"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("P1.5Y/2018W01"), IntervalResolution.Week
- )
- self.assertEqual(
- get_interval_resolution("P1.5Y/2018-306"), IntervalResolution.Ordinal
- )
- self.assertEqual(
- get_interval_resolution("P1.5Y/2018W012"), IntervalResolution.Weekday
- )
- self.assertEqual(get_interval_resolution("2018/P1.5Y"), IntervalResolution.Year)
- self.assertEqual(
- get_interval_resolution("2018-03/P1.5Y"), IntervalResolution.Month
- )
- self.assertEqual(
- get_interval_resolution("2018-03-06/P1.5Y"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("2018W01/P1.5Y"), IntervalResolution.Week
- )
- self.assertEqual(
- get_interval_resolution("2018-306/P1.5Y"), IntervalResolution.Ordinal
- )
- self.assertEqual(
- get_interval_resolution("2018W012/P1.5Y"), IntervalResolution.Weekday
- )
- def test_get_interval_resolution_time(self):
- self.assertEqual(
- get_interval_resolution("P1M/1981-04-05T01"), IntervalResolution.Hours
- )
- self.assertEqual(
- get_interval_resolution("P1M/1981-04-05T01:01"), IntervalResolution.Minutes
- )
- self.assertEqual(
- get_interval_resolution("P1M/1981-04-05T01:01:00"),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- get_interval_resolution("1981-04-05T01/P1M"), IntervalResolution.Hours
- )
- self.assertEqual(
- get_interval_resolution("1981-04-05T01:01/P1M"), IntervalResolution.Minutes
- )
- self.assertEqual(
- get_interval_resolution("1981-04-05T01:01:00/P1M"),
- IntervalResolution.Seconds,
- )
- def test_get_interval_resolution_duration(self):
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1Y2M3D"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1Y2M"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1Y"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1W"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1Y2M3DT4H"), IntervalResolution.Hours
- )
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1Y2M3DT4H54M"),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- get_interval_resolution("2014-11-12/P1Y2M3DT4H54M6S"),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- get_interval_resolution("P1Y2M3D/2014-11-12"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("P1Y2M/2014-11-12"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("P1Y/2014-11-12"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("P1W/2014-11-12"), IntervalResolution.Day
- )
- self.assertEqual(
- get_interval_resolution("P1Y2M3DT4H/2014-11-12"), IntervalResolution.Hours
- )
- self.assertEqual(
- get_interval_resolution("P1Y2M3DT4H54M/2014-11-12"),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- get_interval_resolution("P1Y2M3DT4H54M6S/2014-11-12"),
- IntervalResolution.Seconds,
- )
- def test_parse_interval(self):
- testtuples = (
- (
- "P1M/1981-04-05T01:01:00",
- {
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "duration": DurationTuple(None, "1", None, None, None, None, None),
- },
- ),
- (
- "P1M/1981-04-05",
- {
- "end": DateTuple("1981", "04", "05", None, None, None),
- "duration": DurationTuple(None, "1", None, None, None, None, None),
- },
- ),
- (
- "P1,5Y/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- "1.5", None, None, None, None, None, None
- ),
- },
- ),
- (
- "P1.5Y/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- "1.5", None, None, None, None, None, None
- ),
- },
- ),
- (
- "PT1H/2014-11-12",
- {
- "end": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "1", None, None),
- },
- ),
- (
- "PT4H54M6.5S/2014-11-12",
- {
- "end": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "4", "54", "6.5"),
- },
- ),
- (
- "PT10H/2050-03-01T13:00:00Z",
- {
- "end": DatetimeTuple(
- DateTuple("2050", "03", "01", None, None, None),
- TimeTuple(
- "13",
- "00",
- "00",
- TimezoneTuple(False, True, None, None, "Z"),
- ),
- ),
- "duration": DurationTuple(None, None, None, None, "10", None, None),
- },
- ),
- # Make sure we truncate, not round
- # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is
- (
- "PT0.0000001S/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "0.0000001"
- ),
- },
- ),
- (
- "PT2.0000048S/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "2.0000048"
- ),
- },
- ),
- (
- "1981-04-05T01:01:00/P1M1DT1M",
- {
- "start": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "duration": DurationTuple(None, "1", None, "1", None, "1", None),
- },
- ),
- (
- "1981-04-05/P1M1D",
- {
- "start": DateTuple("1981", "04", "05", None, None, None),
- "duration": DurationTuple(None, "1", None, "1", None, None, None),
- },
- ),
- (
- "2018-03-06/P2,5M",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, "2.5", None, None, None, None, None
- ),
- },
- ),
- (
- "2018-03-06/P2.5M",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, "2.5", None, None, None, None, None
- ),
- },
- ),
- (
- "2014-11-12/PT1H",
- {
- "start": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "1", None, None),
- },
- ),
- (
- "2014-11-12/PT4H54M6.5S",
- {
- "start": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "4", "54", "6.5"),
- },
- ),
- (
- "2050-03-01T13:00:00Z/PT10H",
- {
- "start": DatetimeTuple(
- DateTuple("2050", "03", "01", None, None, None),
- TimeTuple(
- "13",
- "00",
- "00",
- TimezoneTuple(False, True, None, None, "Z"),
- ),
- ),
- "duration": DurationTuple(None, None, None, None, "10", None, None),
- },
- ),
- # Make sure we truncate, not round
- # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is
- (
- "2018-03-06/PT0.0000001S",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "0.0000001"
- ),
- },
- ),
- (
- "2018-03-06/PT2.0000048S",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "2.0000048"
- ),
- },
- ),
- (
- "1980-03-05T01:01:00/1981-04-05T01:01:00",
- {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- },
- ),
- (
- "1980-03-05T01:01:00/1981-04-05",
- {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DateTuple("1981", "04", "05", None, None, None),
- },
- ),
- (
- "1980-03-05/1981-04-05T01:01:00",
- {
- "start": DateTuple("1980", "03", "05", None, None, None),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- },
- ),
- (
- "1980-03-05/1981-04-05",
- {
- "start": DateTuple("1980", "03", "05", None, None, None),
- "end": DateTuple("1981", "04", "05", None, None, None),
- },
- ),
- (
- "1981-04-05/1980-03-05",
- {
- "start": DateTuple("1981", "04", "05", None, None, None),
- "end": DateTuple("1980", "03", "05", None, None, None),
- },
- ),
- (
- "2050-03-01T13:00:00Z/2050-05-11T15:30:00Z",
- {
- "start": DatetimeTuple(
- DateTuple("2050", "03", "01", None, None, None),
- TimeTuple(
- "13",
- "00",
- "00",
- TimezoneTuple(False, True, None, None, "Z"),
- ),
- ),
- "end": DatetimeTuple(
- DateTuple("2050", "05", "11", None, None, None),
- TimeTuple(
- "15",
- "30",
- "00",
- TimezoneTuple(False, True, None, None, "Z"),
- ),
- ),
- },
- ),
- # Test concise interval
- (
- "2020-01-01/02",
- {
- "start": DateTuple("2020", "01", "01", None, None, None),
- "end": DateTuple(None, None, "02", None, None, None),
- },
- ),
- (
- "2008-02-15/03-14",
- {
- "start": DateTuple("2008", "02", "15", None, None, None),
- "end": DateTuple(None, "03", "14", None, None, None),
- },
- ),
- (
- "2007-12-14T13:30/15:30",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "12", "14", None, None, None),
- TimeTuple("13", "30", None, None),
- ),
- "end": TimeTuple("15", "30", None, None),
- },
- ),
- (
- "2007-11-13T09:00/15T17:00",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("09", "00", None, None),
- ),
- "end": DatetimeTuple(
- DateTuple(None, None, "15", None, None, None),
- TimeTuple("17", "00", None, None),
- ),
- },
- ),
- (
- "2007-11-13T00:00/16T00:00",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- "end": DatetimeTuple(
- DateTuple(None, None, "16", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- },
- ),
- (
- "2007-11-13T09:00Z/15T17:00",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple(
- "09",
- "00",
- None,
- TimezoneTuple(False, True, None, None, "Z"),
- ),
- ),
- "end": DatetimeTuple(
- DateTuple(None, None, "15", None, None, None),
- TimeTuple("17", "00", None, None),
- ),
- },
- ),
- (
- "2007-11-13T00:00/12:34.567",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- "end": TimeTuple("12", "34.567", None, None),
- },
- ),
- # Make sure we truncate, not round
- # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is
- (
- "1980-03-05T01:01:00.0000001/" "1981-04-05T14:43:59.9999997",
- {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00.0000001", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("14", "43", "59.9999997", None),
- ),
- },
- ),
- )
- for testtuple in testtuples:
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_interval"
- ) as mockBuildInterval:
- mockBuildInterval.return_value = testtuple[1]
- result = parse_interval(testtuple[0])
- self.assertEqual(result, testtuple[1])
- mockBuildInterval.assert_called_once_with(**testtuple[1])
- # Test different separators
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_interval"
- ) as mockBuildInterval:
- expectedargs = {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- }
- mockBuildInterval.return_value = expectedargs
- result = parse_interval(
- "1980-03-05T01:01:00--1981-04-05T01:01:00", intervaldelimiter="--"
- )
- self.assertEqual(result, expectedargs)
- mockBuildInterval.assert_called_once_with(**expectedargs)
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_interval"
- ) as mockBuildInterval:
- expectedargs = {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- }
- mockBuildInterval.return_value = expectedargs
- result = parse_interval(
- "1980-03-05 01:01:00/1981-04-05 01:01:00", datetimedelimiter=" "
- )
- self.assertEqual(result, expectedargs)
- mockBuildInterval.assert_called_once_with(**expectedargs)
- def test_parse_interval_mockbuilder(self):
- mockBuilder = mock.Mock()
- expectedargs = {
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "duration": DurationTuple(None, "1", None, None, None, None, None),
- }
- mockBuilder.build_interval.return_value = expectedargs
- result = parse_interval("P1M/1981-04-05T01:01:00", builder=mockBuilder)
- self.assertEqual(result, expectedargs)
- mockBuilder.build_interval.assert_called_once_with(**expectedargs)
- mockBuilder = mock.Mock()
- expectedargs = {
- "start": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "1", None, None),
- }
- mockBuilder.build_interval.return_value = expectedargs
- result = parse_interval("2014-11-12/PT1H", builder=mockBuilder)
- self.assertEqual(result, expectedargs)
- mockBuilder.build_interval.assert_called_once_with(**expectedargs)
- mockBuilder = mock.Mock()
- expectedargs = {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- }
- mockBuilder.build_interval.return_value = expectedargs
- result = parse_interval(
- "1980-03-05T01:01:00/1981-04-05T01:01:00", builder=mockBuilder
- )
- self.assertEqual(result, expectedargs)
- mockBuilder.build_interval.assert_called_once_with(**expectedargs)
- def test_parse_interval_badtype(self):
- testtuples = (None, 1, False, 1.234)
- for testtuple in testtuples:
- with self.assertRaises(ValueError):
- parse_interval(testtuple, builder=None)
- def test_parse_interval_baddelimiter(self):
- testtuples = (
- "1980-03-05T01:01:00,1981-04-05T01:01:00",
- "P1M 1981-04-05T01:01:00",
- )
- for testtuple in testtuples:
- with self.assertRaises(ISOFormatError):
- parse_interval(testtuple, builder=None)
- def test_parse_interval_badstr(self):
- testtuples = ("/", "0/0/0", "20.50230/0", "5/%", "1/21", "bad", "")
- for testtuple in testtuples:
- with self.assertRaises(ISOFormatError):
- parse_interval(testtuple, builder=None)
- def test_parse_interval_repeating(self):
- # Parse interval can't parse repeating intervals
- with self.assertRaises(ISOFormatError):
- parse_interval("R3/1981-04-05/P1D")
- with self.assertRaises(ISOFormatError):
- parse_interval("R3/1981-04-05/P0003-06-04T12:30:05.5")
- with self.assertRaises(ISOFormatError):
- parse_interval("R/PT1H2M/1980-03-05T01:01:00")
- 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(ISOFormatError):
- parse_interval("2001/P1Dasdf", builder=None)
- with self.assertRaises(ISOFormatError):
- parse_interval("P1Dasdf/2001", builder=None)
- with self.assertRaises(ISOFormatError):
- parse_interval("2001/P0003-06-04T12:30:05.5asdfasdf", builder=None)
- with self.assertRaises(ISOFormatError):
- parse_interval("P0003-06-04T12:30:05.5asdfasdf/2001", builder=None)
- def test_parse_interval_internal(self):
- # Test the internal _parse_interval function
- testtuples = (
- (
- "P1M/1981-04-05T01:01:00",
- {
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "duration": DurationTuple(None, "1", None, None, None, None, None),
- },
- ),
- (
- "P1M/1981-04-05",
- {
- "end": DateTuple("1981", "04", "05", None, None, None),
- "duration": DurationTuple(None, "1", None, None, None, None, None),
- },
- ),
- (
- "P1,5Y/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- "1.5", None, None, None, None, None, None
- ),
- },
- ),
- (
- "P1.5Y/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- "1.5", None, None, None, None, None, None
- ),
- },
- ),
- (
- "PT1H/2014-11-12",
- {
- "end": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "1", None, None),
- },
- ),
- (
- "PT4H54M6.5S/2014-11-12",
- {
- "end": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "4", "54", "6.5"),
- },
- ),
- # Make sure we truncate, not round
- # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is
- (
- "PT0.0000001S/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "0.0000001"
- ),
- },
- ),
- (
- "PT2.0000048S/2018-03-06",
- {
- "end": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "2.0000048"
- ),
- },
- ),
- (
- "1981-04-05T01:01:00/P1M1DT1M",
- {
- "start": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "duration": DurationTuple(None, "1", None, "1", None, "1", None),
- },
- ),
- (
- "1981-04-05/P1M1D",
- {
- "start": DateTuple("1981", "04", "05", None, None, None),
- "duration": DurationTuple(None, "1", None, "1", None, None, None),
- },
- ),
- (
- "2018-03-06/P2,5M",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, "2.5", None, None, None, None, None
- ),
- },
- ),
- (
- "2018-03-06/P2.5M",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, "2.5", None, None, None, None, None
- ),
- },
- ),
- (
- "2014-11-12/PT1H",
- {
- "start": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "1", None, None),
- },
- ),
- (
- "2014-11-12/PT4H54M6.5S",
- {
- "start": DateTuple("2014", "11", "12", None, None, None),
- "duration": DurationTuple(None, None, None, None, "4", "54", "6.5"),
- },
- ),
- # Make sure we truncate, not round
- # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is
- (
- "2018-03-06/PT0.0000001S",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "0.0000001"
- ),
- },
- ),
- (
- "2018-03-06/PT2.0000048S",
- {
- "start": DateTuple("2018", "03", "06", None, None, None),
- "duration": DurationTuple(
- None, None, None, None, None, None, "2.0000048"
- ),
- },
- ),
- (
- "1980-03-05T01:01:00/1981-04-05T01:01:00",
- {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- },
- ),
- (
- "1980-03-05T01:01:00/1981-04-05",
- {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DateTuple("1981", "04", "05", None, None, None),
- },
- ),
- (
- "1980-03-05/1981-04-05T01:01:00",
- {
- "start": DateTuple("1980", "03", "05", None, None, None),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- },
- ),
- (
- "1980-03-05/1981-04-05",
- {
- "start": DateTuple("1980", "03", "05", None, None, None),
- "end": DateTuple("1981", "04", "05", None, None, None),
- },
- ),
- (
- "1981-04-05/1980-03-05",
- {
- "start": DateTuple("1981", "04", "05", None, None, None),
- "end": DateTuple("1980", "03", "05", None, None, None),
- },
- ),
- # Test concise interval
- (
- "2020-01-01/02",
- {
- "start": DateTuple("2020", "01", "01", None, None, None),
- "end": DateTuple(None, None, "02", None, None, None),
- },
- ),
- (
- "2008-02-15/03-14",
- {
- "start": DateTuple("2008", "02", "15", None, None, None),
- "end": DateTuple(None, "03", "14", None, None, None),
- },
- ),
- (
- "2007-12-14T13:30/15:30",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "12", "14", None, None, None),
- TimeTuple("13", "30", None, None),
- ),
- "end": TimeTuple("15", "30", None, None),
- },
- ),
- (
- "2007-11-13T09:00/15T17:00",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("09", "00", None, None),
- ),
- "end": DatetimeTuple(
- DateTuple(None, None, "15", None, None, None),
- TimeTuple("17", "00", None, None),
- ),
- },
- ),
- (
- "2007-11-13T00:00/16T00:00",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- "end": DatetimeTuple(
- DateTuple(None, None, "16", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- },
- ),
- (
- "2007-11-13T09:00Z/15T17:00",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple(
- "09",
- "00",
- None,
- TimezoneTuple(False, True, None, None, "Z"),
- ),
- ),
- "end": DatetimeTuple(
- DateTuple(None, None, "15", None, None, None),
- TimeTuple("17", "00", None, None),
- ),
- },
- ),
- (
- "2007-11-13T00:00/12:34.567",
- {
- "start": DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- "end": TimeTuple("12", "34.567", None, None),
- },
- ),
- # Make sure we truncate, not round
- # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is
- (
- "1980-03-05T01:01:00.0000001/" "1981-04-05T14:43:59.9999997",
- {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00.0000001", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("14", "43", "59.9999997", None),
- ),
- },
- ),
- )
- for testtuple in testtuples:
- mockBuilder = mock.Mock()
- mockBuilder.build_interval.return_value = testtuple[1]
- result = _parse_interval(testtuple[0], mockBuilder)
- self.assertEqual(result, testtuple[1])
- mockBuilder.build_interval.assert_called_once_with(**testtuple[1])
- # Test different separators
- expectedargs = {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- }
- mockBuilder = mock.Mock()
- mockBuilder.build_interval.return_value = expectedargs
- result = _parse_interval(
- "1980-03-05T01:01:00--1981-04-05T01:01:00",
- mockBuilder,
- intervaldelimiter="--",
- )
- self.assertEqual(result, expectedargs)
- mockBuilder.build_interval.assert_called_once_with(**expectedargs)
- expectedargs = {
- "start": DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- "end": DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- }
- mockBuilder = mock.Mock()
- mockBuilder.build_interval.return_value = expectedargs
- _parse_interval(
- "1980-03-05 01:01:00/1981-04-05 01:01:00",
- mockBuilder,
- datetimedelimiter=" ",
- )
- self.assertEqual(result, expectedargs)
- mockBuilder.build_interval.assert_called_once_with(**expectedargs)
- def test_parse_interval_end(self):
- self.assertEqual(
- _parse_interval_end(
- "02", DateTuple("2020", "01", "01", None, None, None), "T"
- ),
- DateTuple(None, None, "02", None, None, None),
- )
- self.assertEqual(
- _parse_interval_end(
- "03-14", DateTuple("2008", "02", "15", None, None, None), "T"
- ),
- DateTuple(None, "03", "14", None, None, None),
- )
- self.assertEqual(
- _parse_interval_end(
- "0314", DateTuple("2008", "02", "15", None, None, None), "T"
- ),
- DateTuple(None, "03", "14", None, None, None),
- )
- self.assertEqual(
- _parse_interval_end(
- "15:30",
- DatetimeTuple(
- DateTuple("2007", "12", "14", None, None, None),
- TimeTuple("13", "30", None, None),
- ),
- "T",
- ),
- TimeTuple("15", "30", None, None),
- )
- self.assertEqual(
- _parse_interval_end(
- "15T17:00",
- DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("09", "00", None, None),
- ),
- "T",
- ),
- DatetimeTuple(
- DateTuple(None, None, "15", None, None, None),
- TimeTuple("17", "00", None, None),
- ),
- )
- self.assertEqual(
- _parse_interval_end(
- "16T00:00",
- DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- "T",
- ),
- DatetimeTuple(
- DateTuple(None, None, "16", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- )
- self.assertEqual(
- _parse_interval_end(
- "15 17:00",
- DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("09", "00", None, None),
- ),
- " ",
- ),
- DatetimeTuple(
- DateTuple(None, None, "15", None, None, None),
- TimeTuple("17", "00", None, None),
- ),
- )
- self.assertEqual(
- _parse_interval_end(
- "12:34.567",
- DatetimeTuple(
- DateTuple("2007", "11", "13", None, None, None),
- TimeTuple("00", "00", None, None),
- ),
- "T",
- ),
- TimeTuple("12", "34.567", None, None),
- )
- class TestRepeatingIntervalParserFunctions(unittest.TestCase):
- def test_get_interval_resolution_date(self):
- self.assertEqual(
- get_repeating_interval_resolution("R/P1.5Y/2018"), IntervalResolution.Year
- )
- self.assertEqual(
- get_repeating_interval_resolution("R1/P1.5Y/2018-03"),
- IntervalResolution.Month,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R2/P1.5Y/2018-03-06"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R3/P1.5Y/2018W01"),
- IntervalResolution.Week,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R4/P1.5Y/2018-306"),
- IntervalResolution.Ordinal,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R5/P1.5Y/2018W012"),
- IntervalResolution.Weekday,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R/2018/P1.5Y"), IntervalResolution.Year
- )
- self.assertEqual(
- get_repeating_interval_resolution("R1/2018-03/P1.5Y"),
- IntervalResolution.Month,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R2/2018-03-06/P1.5Y"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R3/2018W01/P1.5Y"),
- IntervalResolution.Week,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R4/2018-306/P1.5Y"),
- IntervalResolution.Ordinal,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R5/2018W012/P1.5Y"),
- IntervalResolution.Weekday,
- )
- def test_get_interval_resolution_time(self):
- self.assertEqual(
- get_repeating_interval_resolution("R/P1M/1981-04-05T01"),
- IntervalResolution.Hours,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R1/P1M/1981-04-05T01:01"),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R2/P1M/1981-04-05T01:01:00"),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R/1981-04-05T01/P1M"),
- IntervalResolution.Hours,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R1/1981-04-05T01:01/P1M"),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R2/1981-04-05T01:01:00/P1M"),
- IntervalResolution.Seconds,
- )
- def test_get_interval_resolution_duration(self):
- self.assertEqual(
- get_repeating_interval_resolution("R/2014-11-12/P1Y2M3D"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R1/2014-11-12/P1Y2M"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R2/2014-11-12/P1Y"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R3/2014-11-12/P1W"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R4/2014-11-12/P1Y2M3DT4H"),
- IntervalResolution.Hours,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R5/2014-11-12/P1Y2M3DT4H54M"),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R6/2014-11-12/P1Y2M3DT4H54M6S"),
- IntervalResolution.Seconds,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R/P1Y2M3D/2014-11-12"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R1/P1Y2M/2014-11-12"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R2/P1Y/2014-11-12"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R3/P1W/2014-11-12"),
- IntervalResolution.Day,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R4/P1Y2M3DT4H/2014-11-12"),
- IntervalResolution.Hours,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R5/P1Y2M3DT4H54M/2014-11-12"),
- IntervalResolution.Minutes,
- )
- self.assertEqual(
- get_repeating_interval_resolution("R6/P1Y2M3DT4H54M6S/2014-11-12"),
- IntervalResolution.Seconds,
- )
- def test_parse_repeating_interval(self):
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_repeating_interval"
- ) as mockBuilder:
- expectedargs = {
- "R": False,
- "Rnn": "3",
- "interval": IntervalTuple(
- DateTuple("1981", "04", "05", None, None, None),
- None,
- DurationTuple(None, None, None, "1", None, None, None),
- ),
- }
- mockBuilder.return_value = expectedargs
- result = parse_repeating_interval("R3/1981-04-05/P1D")
- self.assertEqual(result, expectedargs)
- mockBuilder.assert_called_once_with(**expectedargs)
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_repeating_interval"
- ) as mockBuilder:
- expectedargs = {
- "R": False,
- "Rnn": "11",
- "interval": IntervalTuple(
- None,
- DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- DurationTuple(None, None, None, None, "1", "2", None),
- ),
- }
- mockBuilder.return_value = expectedargs
- result = parse_repeating_interval("R11/PT1H2M/1980-03-05T01:01:00")
- self.assertEqual(result, expectedargs)
- mockBuilder.assert_called_once_with(**expectedargs)
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_repeating_interval"
- ) as mockBuilder:
- expectedargs = {
- "R": False,
- "Rnn": "2",
- "interval": IntervalTuple(
- DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- None,
- ),
- }
- mockBuilder.return_value = expectedargs
- result = parse_repeating_interval(
- "R2--1980-03-05T01:01:00--" "1981-04-05T01:01:00",
- intervaldelimiter="--",
- )
- self.assertEqual(result, expectedargs)
- mockBuilder.assert_called_once_with(**expectedargs)
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_repeating_interval"
- ) as mockBuilder:
- expectedargs = {
- "R": False,
- "Rnn": "2",
- "interval": IntervalTuple(
- DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- DatetimeTuple(
- DateTuple("1981", "04", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- None,
- ),
- }
- mockBuilder.return_value = expectedargs
- result = parse_repeating_interval(
- "R2/" "1980-03-05 01:01:00/" "1981-04-05 01:01:00",
- datetimedelimiter=" ",
- )
- self.assertEqual(result, expectedargs)
- mockBuilder.assert_called_once_with(**expectedargs)
- with mock.patch.object(
- aniso8601.interval.PythonTimeBuilder, "build_repeating_interval"
- ) as mockBuilder:
- expectedargs = {
- "R": True,
- "Rnn": None,
- "interval": IntervalTuple(
- None,
- DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- DurationTuple(None, None, None, None, "1", "2", None),
- ),
- }
- mockBuilder.return_value = expectedargs
- result = parse_repeating_interval("R/PT1H2M/1980-03-05T01:01:00")
- self.assertEqual(result, expectedargs)
- mockBuilder.assert_called_once_with(**expectedargs)
- def test_parse_repeating_interval_mockbuilder(self):
- mockBuilder = mock.Mock()
- args = {
- "R": False,
- "Rnn": "3",
- "interval": IntervalTuple(
- DateTuple("1981", "04", "05", None, None, None),
- None,
- DurationTuple(None, None, None, "1", None, None, None),
- ),
- }
- mockBuilder.build_repeating_interval.return_value = args
- result = parse_repeating_interval("R3/1981-04-05/P1D", builder=mockBuilder)
- self.assertEqual(result, args)
- mockBuilder.build_repeating_interval.assert_called_once_with(**args)
- mockBuilder = mock.Mock()
- args = {
- "R": False,
- "Rnn": "11",
- "interval": IntervalTuple(
- None,
- DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- DurationTuple(None, None, None, None, "1", "2", None),
- ),
- }
- mockBuilder.build_repeating_interval.return_value = args
- result = parse_repeating_interval(
- "R11/PT1H2M/1980-03-05T01:01:00", builder=mockBuilder
- )
- self.assertEqual(result, args)
- mockBuilder.build_repeating_interval.assert_called_once_with(**args)
- mockBuilder = mock.Mock()
- args = {
- "R": True,
- "Rnn": None,
- "interval": IntervalTuple(
- None,
- DatetimeTuple(
- DateTuple("1980", "03", "05", None, None, None),
- TimeTuple("01", "01", "00", None),
- ),
- DurationTuple(None, None, None, None, "1", "2", None),
- ),
- }
- mockBuilder.build_repeating_interval.return_value = args
- result = parse_repeating_interval(
- "R/PT1H2M/1980-03-05T01:01:00", builder=mockBuilder
- )
- self.assertEqual(result, args)
- mockBuilder.build_repeating_interval.assert_called_once_with(**args)
- def test_parse_repeating_interval_badtype(self):
- testtuples = (None, 1, False, 1.234)
- for testtuple in testtuples:
- with self.assertRaises(ValueError):
- parse_repeating_interval(testtuple, builder=None)
- def test_parse_repeating_interval_baddelimiter(self):
- testtuples = ("R,PT1H2M,1980-03-05T01:01:00", "R3 1981-04-05 P1D")
- for testtuple in testtuples:
- with self.assertRaises(ISOFormatError):
- parse_repeating_interval(testtuple, builder=None)
- 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(ISOFormatError):
- parse_repeating_interval("R3/1981-04-05/P1Dasdf", builder=None)
- with self.assertRaises(ISOFormatError):
- parse_repeating_interval(
- "R3/" "1981-04-05/" "P0003-06-04T12:30:05.5asdfasdf", builder=None
- )
- def test_parse_repeating_interval_badstr(self):
- testtuples = ("bad", "")
- for testtuple in testtuples:
- with self.assertRaises(ISOFormatError):
- parse_repeating_interval(testtuple, builder=None)
|