def test_timex_convert_hour_and_minute(): assert TimexConvert.convert_timex_to_string( Timex(timex="T17:30")) == "5:30PM" assert TimexConvert.convert_timex_to_string(Timex(timex="T17:00")) == "5PM" assert TimexConvert.convert_timex_to_string( Timex(timex="T01:30")) == "1:30AM" assert TimexConvert.convert_timex_to_string(Timex(timex="T01:00")) == "1AM"
def test_timex_convert_month(): assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-01")) == "January" assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-05")) == "May" assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-12")) == "December"
def test_timex_convert_full_datetime(): assert TimexConvert.convert_timex_to_string( Timex(timex="1984-01-03T18:30:45")) == "6:30:45PM 3rd January 1984" assert TimexConvert.convert_timex_to_string( Timex(timex="2000-01-01T00")) == "midnight 1st January 2000" assert TimexConvert.convert_timex_to_string( Timex(timex="1967-05-29T19:30:00")) == "7:30PM 29th May 1967"
def expand_datetime_range(timex): from datatypes_timex_expression import Timex types = timex.types if len( timex.types) != 0 else TimexInference.infer(timex) if Constants.TIMEX_TYPES_DURATION in types: start = TimexHelpers.clone_datetime(timex) duration = TimexHelpers.clone_duration(timex) return TimexRange(start, TimexHelpers.timex_datetime_add(start, duration), duration) else: if timex.year is not None: start = Timex() start.year = timex.year result = TimexRange(start, Timex()) if timex.month is not None: result.start.month = timex.month result.start.day_of_month = 1 result.end.year = timex.year result.end.month = timex.month + 1 result.end.day_of_month = 1 else: result.start.month = 1 result.start.day_of_month = 1 result.end.year = timex.year + 1 result.end.month = 1 result.end.day_of_month = 1 return result return TimexRange(Timex(), Timex())
def test_DataTypes_RangeResolve_combined_daterange_and_timerange_next_week_and_business_hours( ): candidates = ['XXXX-WXX-3T04', 'XXXX-WXX-3T16'] constraints = [ Timex(year=2017, month=10, day_of_month=5, days=7).timex_value(), Timex(hour=12, minute=0, second=0, hours=8).timex_value() ] eval_constraints_and_candidates(candidates, constraints, ['2017-10-11T16'])
def test_timex_convert_time(): assert TimexConvert.convert_timex_to_string( Timex(timex="T17:30:05")) == "5:30:05PM" assert TimexConvert.convert_timex_to_string( Timex(timex="T02:30:30")) == "2:30:30AM" assert TimexConvert.convert_timex_to_string( Timex(timex="T00:30:30")) == "12:30:30AM" assert TimexConvert.convert_timex_to_string( Timex(timex="T12:30:30")) == "12:30:30PM"
def test_timex_convert_month_and_day_of_month_with_correct_abbreviation(): assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-06-01")) == "1st June" assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-06-02")) == "2nd June" assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-06-03")) == "3rd June" assert TimexConvert.convert_timex_to_string( Timex(timex="XXXX-06-04")) == "4th June"
def test_datatypes_format_datetime(): assert Timex(hour=4, minute=0, second=0, day_of_week=3).timex_value() == 'XXXX-WXX-3T04' assert Timex(year=2017, month=9, day_of_month=27, hour=11, minute=41, second=30).timex_value() == '2017-09-27T11:41:30'
def test_timex_convert_part_of_the_day(): assert TimexConvert.convert_timex_to_string( Timex(timex="TDT")) == "daytime" assert TimexConvert.convert_timex_to_string(Timex(timex="TNI")) == "night" assert TimexConvert.convert_timex_to_string( Timex(timex="TMO")) == "morning" assert TimexConvert.convert_timex_to_string( Timex(timex="TAF")) == "afternoon" assert TimexConvert.convert_timex_to_string( Timex(timex="TEV")) == "evening"
def examples(): LanguageGeneration.__describe(Timex("2019-05-29")) LanguageGeneration.__describe(Timex("XXXX-WXX-6")) LanguageGeneration.__describe(Timex("XXXX-WXX-6T16")) LanguageGeneration.__describe(Timex("T12")) LanguageGeneration.__describe(Timex.from_date(datetime.datetime.now())) LanguageGeneration.__describe( Timex.from_date(datetime.datetime.now() + datetime.timedelta(days=1)))
def test_DataTypes_RangeResolve_multiple_times_with_overlapping_range(): candidates = ["T19", "T19:30"] constraints = [Timex(hour=16, minute=0, second=0, hours=4).timex_value()] eval_constraints_and_candidates(candidates, constraints, ["T19", "T19:30"]) constraints.append(Timex(hour=14, minute=0, second=0, hours=4).timex_value()) eval_constraints_and_candidates(candidates, constraints, []) candidates = ["T17", "T17:30", "T19"] eval_constraints_and_candidates(candidates, constraints, ["T17", "T17:30"])
def test_DataTypes_RangeResolve_timerange_time_with_overlapping_ranges(): candidates = ['T19'] constraints = [Timex(hour=16, minute=0, second=0, hours=4).timex_value()] eval_constraints_and_candidates(candidates, constraints, ['T19']) constraints.append(Timex(hour=14, minute=0, second=0, hours=4).timex_value()) eval_constraints_and_candidates(candidates, constraints, []) candidates = ['T17'] eval_constraints_and_candidates(candidates, constraints, ['T17'])
def week_date_range(year: int, week_of_year: int): date_in_week = datetime(year, 1, 1) + \ timedelta(days=(week_of_year-1)*7) start = TimexDateHelpers.date_of_last_day(Constants.DAYS['MONDAY'], date_in_week) end = TimexDateHelpers.date_of_last_day( Constants.DAYS['MONDAY'], date_in_week + timedelta(days=7)) return TimexValue.date_value( Timex(year=start.year, month=start.month, day_of_month=start.day)), TimexValue.date_value( Timex(year=start.year, month=start.month, day_of_month=end.day))
def evaluate(candidates: [str], constraints: [str]): timex_constraints = list(map(lambda tc: Timex(tc), constraints)) candidates_with_duration_resolved = TimexRangeResolver.resolve_durations( candidates, timex_constraints) candidates_according_to_date = TimexRangeResolver.resolve_by_date_range_constraints( candidates_with_duration_resolved, timex_constraints) candidates_with_added_time = TimexRangeResolver.resolve_by_time_constraints( candidates_according_to_date, timex_constraints) candidates_filtered_by_time = TimexRangeResolver.resolve_by_timerange_constraints( candidates_with_added_time, timex_constraints) timex_results = list( map(lambda tc: Timex(tc), candidates_filtered_by_time)) return timex_results
def test_datatypes_parsing_full_datetime(): timex = Timex(timex='1984-01-03T18:30:45') assert timex.types == { Constants.TIMEX_TYPES_DEFINITE, Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_TIME, Constants.TIMEX_TYPES_DATETIME } assert timex.year == 1984 assert timex.month == 1 assert timex.day_of_month == 3 assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour == 18 assert timex.minute == 30 assert timex.second == 45 assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def resolve_by_timerange_constraints(candidates, timex_constraints): timerange_contraints = list( map( lambda ti: TimexHelpers.timerange_from_timex(ti), filter(lambda t: Constants.TIMEX_TYPES_TIMERANGE in t.types, timex_constraints))) collapsed_time_ranges = TimexConstraintsHelper.collapse( TimexConstraintsHelper(), timerange_contraints) if not any(collapsed_time_ranges): return candidates resolution = [] for timex in candidates: t = Timex(timex) if Constants.TIMEX_TYPES_TIMERANGE in t.types: r = TimexRangeResolver.resolve_timerage( t, collapsed_time_ranges) resolution.extend(r) elif Constants.TIMEX_TYPES_TIME in t.types: r = TimexRangeResolver.resolve_time(t, collapsed_time_ranges) resolution.extend(r) return TimexRangeResolver.remove_duplicates(resolution)
def test_datatypes_parsing_wed_4PM_to_sat_3PM(): timex = Timex(timex='(XXXX-WXX-3T16,XXXX-WXX-6T15,PT71H)') assert timex.types == { Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_TIMERANGE, Constants.TIMEX_TYPES_DATETIMERANGE, Constants.TIMEX_TYPES_TIME, Constants.TIMEX_TYPES_DATETIME, Constants.TIMEX_TYPES_DURATION, Constants.TIMEX_TYPES_DATERANGE } assert timex.year is None assert timex.month is None assert timex.day_of_month is None assert timex.day_of_week == 3 assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour == 16 assert timex.minute == 0 assert timex.second == 0 assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours == 71 assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_last_5_minutes(): timex = Timex(timex='(2017-09-08T21:19:29,2017-09-08T21:24:29,PT5M)') assert timex.types == { Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_TIMERANGE, Constants.TIMEX_TYPES_DATETIMERANGE, Constants.TIMEX_TYPES_TIME, Constants.TIMEX_TYPES_DATETIME, Constants.TIMEX_TYPES_DURATION, Constants.TIMEX_TYPES_DATERANGE, Constants.TIMEX_TYPES_DEFINITE } assert timex.year == 2017 assert timex.month == 9 assert timex.day_of_month == 8 assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour == 21 assert timex.minute == 19 assert timex.second == 29 assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes == 5 assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_lastnight(): timex = Timex(timex='2017-09-07TNI') assert timex.types == { Constants.TIMEX_TYPES_DEFINITE, Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_TIMERANGE, Constants.TIMEX_TYPES_DATETIMERANGE } assert timex.year == 2017 assert timex.month == 9 assert timex.day_of_month == 7 assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour is None assert timex.minute is None assert timex.second is None assert timex.weekend is False assert timex.part_of_day == 'NI' assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_datetimerange(): timex = Timex(timex='XXXX-WXX-5TEV') assert timex.types == { Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_TIMERANGE, Constants.TIMEX_TYPES_DATETIMERANGE } assert timex.year is None assert timex.month is None assert timex.day_of_month is None assert timex.day_of_week == 5 assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour is None assert timex.minute is None assert timex.second is None assert timex.weekend is False assert timex.part_of_day == 'EV' assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_timerange_430pm_to_445pm(): timex = Timex(timex='(T16:30,T16:45,PT15M)') assert timex.types == { Constants.TIMEX_TYPES_TIME, Constants.TIMEX_TYPES_DURATION, Constants.TIMEX_TYPES_TIMERANGE } assert timex.year is None assert timex.month is None assert timex.day_of_month is None assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour == 16 assert timex.minute == 30 assert timex.second == 0 assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes == 15 assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_jan_1_to_aug_5_year_2015(): timex = Timex(timex='(2015-01-01,2015-08-05,P216D)') assert timex.types == { Constants.TIMEX_TYPES_DEFINITE, Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_DURATION, Constants.TIMEX_TYPES_DATERANGE } assert timex.year == 2015 assert timex.month == 1 assert timex.day_of_month == 1 assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour is None assert timex.minute is None assert timex.second is None assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days == 216 assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_wednesday_to_saturday(): timex = Timex(timex='(XXXX-WXX-3,XXXX-WXX-6,P3D)') assert timex.types == { Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_DURATION, Constants.TIMEX_TYPES_DATERANGE } assert timex.year is None assert timex.month is None assert timex.day_of_month is None assert timex.day_of_week == 3 assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour is None assert timex.minute is None assert timex.second is None assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days == 3 assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_DataTypes_RangeResolve_carry_through_time_month_and_date(): candidates = ['XXXX-05-29T19:30'] constraints = [ Timex(year=2006, month=1, day_of_month=1, years=2).timex_value() ] eval_constraints_and_candidates(candidates, constraints, ['2006-05-29T19:30', '2007-05-29T19:30'])
def test_datatypes_parsing_paricular_time_on_particular_day_of_week(): timex = Timex(timex='XXXX-WXX-3T16') assert timex.types == { Constants.TIMEX_TYPES_TIME, Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_DATETIME } assert timex.year is None assert timex.month is None assert timex.day_of_month is None assert timex.day_of_week == 3 assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour == 16 assert timex.minute == 0 assert timex.second == 0 assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_datatypes_parsing_now(): timex = Timex(timex='PRESENT_REF') assert timex.types == { Constants.TIMEX_TYPES_PRESENT, Constants.TIMEX_TYPES_DATE, Constants.TIMEX_TYPES_TIME, Constants.TIMEX_TYPES_DATETIME } assert timex.year is None assert timex.month is None assert timex.day_of_month is None assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour is None assert timex.minute is None assert timex.second is None assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is True
def test_datatypes_rangeresolve_daterange_month_and_date(): candidates = ["XXXX-05-29"] constraints = [ Timex(year=2006, month=1, day_of_month=1, years=2).timex_value() ] eval_constraints_and_candidates(candidates, constraints, ['2006-05-29', '2007-05-29'])
def test_timex_parsing_complete_date(): timex = Timex(timex='2017-05-29') assert timex.types == { Constants.TIMEX_TYPES_DEFINITE, Constants.TIMEX_TYPES_DATE } assert timex.year == 2017 assert timex.month == 5 assert timex.day_of_month == 29 assert timex.day_of_week is None assert timex.week_of_year is None assert timex.week_of_month is None assert timex.season is None assert timex.hour is None assert timex.minute is None assert timex.second is None assert timex.weekend is False assert timex.part_of_day is None assert timex.years is None assert timex.months is None assert timex.weeks is None assert timex.days is None assert timex.hours is None assert timex.minutes is None assert timex.seconds is None assert timex.now is False
def test_DataTypes_RangeResolve_carry_through_time_definite(): candidates = ['2017-09-28T18:30:01'] constraints = [ Timex(year=2017, month=9, day_of_month=27, days=2).timex_value() ] eval_constraints_and_candidates(candidates, constraints, ['2017-09-28T18:30:01'])
def resolve(timex_array: [str], date: datetime = None): resolution = Resolution() for timex in timex_array: t = Timex(timex) r = TimexResolver.resolve_timex(t, date) resolution.values.extend(r) return resolution