def testBadDates(self):
    # For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern
    # timezone when the clocks where put back at the end of Daylight Savings
    # Time.
    # This could be 2002-10-27 01:30:00 EDT-0400
    #            or 2002-10-27 01:30:00 EST-0500
    loc_dt = datetime.datetime(2002, 10, 27, 1, 30, 00)
    self.assertRaises(pytz.AmbiguousTimeError, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"))

    # Check we can use is_dst to disambiguate.
    loc_dt = datetime.datetime(2002, 10, 27, 1, 30, 00)

    dt2 = datetime_tz.datetime_tz(
        loc_dt, pytz.timezone("US/Eastern"), is_dst=False)
    self.assertEqual(dt2.strftime(FMT), "2002-10-27 01:30:00 EST-0500")

    dt1 = datetime_tz.datetime_tz(
        loc_dt, pytz.timezone("US/Eastern"), is_dst=True)
    self.assertEqual(dt1.strftime(FMT), "2002-10-27 01:30:00 EDT-0400")

    # Similarly, 2:30am on 7th April 2002 never happened at all in the
    # US/Eastern timezone, as the clock where put forward at 2:00am skipping the
    # entire hour.
    loc_dt = datetime.datetime(2002, 4, 7, 2, 30, 00)

    raiseme = (pytz.AmbiguousTimeError, pytz.NonExistentTimeError)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"))
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=True)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=False)

    raiseme = (pytz.AmbiguousTimeError, pytz.NonExistentTimeError)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"))
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=True)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=False)

    # But make sure the cases still work when it"s "now"
    @staticmethod
    def utcnowmockedt():
      return datetime_tz.datetime_tz(2002, 10, 27, 5, 30, tzinfo=pytz.utc)

    datetime_tz.localtz_set("US/Eastern")
    self.mocked("datetime_tz.datetime_tz.utcnow", utcnowmockedt)
    self.assertEqual(datetime_tz.datetime_tz.now().strftime(FMT),
                     "2002-10-27 01:30:00 EDT-0400")

    @staticmethod
    def utcnowmockest():
      return datetime_tz.datetime_tz(2002, 10, 27, 6, 30, tzinfo=pytz.utc)

    datetime_tz.localtz_set("US/Eastern")
    self.mocked("datetime_tz.datetime_tz.utcnow", utcnowmockest)
    self.assertEqual(datetime_tz.datetime_tz.now().strftime(FMT),
                     "2002-10-27 01:30:00 EST-0500")
  def testPeopleRants(self):
    """This test contains various things which people rant about."""

    # Tests some of the pitfuls discussed at
    # http://www.enricozini.org/2009/debian/using-python-datetime/
    ############################################################################

    # That's right, the datetime object created by a call to datetime.datetime
    # constructor now seems to think that Finland uses the ancient "Helsinki
    # Mean Time" which was obsoleted in the 1920s.
    #
    # Well not anymore!
    eurhel = pytz.timezone("Europe/Helsinki")
    a = datetime_tz.datetime_tz(2008, 6, 23, 18, 2, 31, 101025, eurhel)
    self.assertEqual(repr(a),
                     "datetime_tz(2008, 6, 23, 18, 2, 31, 101025,"
                     " tzinfo=<DstTzInfo 'Europe/Helsinki' EEST+3:00:00 DST>)")

    # Timezone-aware datetime objects have other bugs: for example, they fail to
    # compute Unix timestamps correctly. The following example shows two
    # timezone-aware objects that represent the same instant but produce two
    # different timestamps.
    #
    # Well not anymore!
    utc = pytz.timezone("UTC")
    a = datetime_tz.datetime_tz(2008, 7, 6, 5, 4, 3, tzinfo=utc)
    self.assertEqual(str(a), "2008-07-06 05:04:03+00:00")
    self.assertEqual(a.totimestamp(), 1215320643.0)
    # FIXME(tansell): %s is effected by the TZ environment value.
    #self.assertEqual(a.strftime("%s"), "1215284643")

    italy = pytz.timezone("Europe/Rome")
    b = a.astimezone(italy)
    self.assertEqual(str(b), "2008-07-06 07:04:03+02:00")
    self.assertEqual(b.totimestamp(), 1215320643.0)
Beispiel #3
0
  def testBadDates(self):
    # For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern
    # timezone when the clocks where put back at the end of Daylight Savings
    # Time.
    # This could be 2002-10-27 01:30:00 EDT-0400
    #            or 2002-10-27 01:30:00 EST-0500
    loc_dt = datetime.datetime(2002, 10, 27, 1, 30, 00)
    self.assertRaises(pytz.AmbiguousTimeError, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"))

    # Check we can use is_dst to disambiguate.
    loc_dt = datetime.datetime(2002, 10, 27, 1, 30, 00)

    dt2 = datetime_tz.datetime_tz(
        loc_dt, pytz.timezone("US/Eastern"), is_dst=False)
    self.assertEqual(dt2.strftime(FMT), "2002-10-27 01:30:00 EST-0500")

    dt1 = datetime_tz.datetime_tz(
        loc_dt, pytz.timezone("US/Eastern"), is_dst=True)
    self.assertEqual(dt1.strftime(FMT), "2002-10-27 01:30:00 EDT-0400")

    # Similarly, 2:30am on 7th April 2002 never happened at all in the
    # US/Eastern timezone, as the clock where put forward at 2:00am skipping the
    # entire hour.
    loc_dt = datetime.datetime(2002, 4, 7, 2, 30, 00)

    raiseme = (pytz.AmbiguousTimeError, pytz.NonExistentTimeError)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"))
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=True)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=False)

    raiseme = (pytz.AmbiguousTimeError, pytz.NonExistentTimeError)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"))
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=True)
    self.assertRaises(raiseme, datetime_tz.datetime_tz,
                      loc_dt, pytz.timezone("US/Eastern"), is_dst=False)

    # But make sure the cases still work when it"s "now"
    @staticmethod
    def utcnowmockedt():
      return datetime_tz.datetime_tz(2002, 10, 27, 5, 30, tzinfo=pytz.utc)

    datetime_tz.localtz_set("US/Eastern")
    self.mocked("datetime_tz.datetime_tz.utcnow", utcnowmockedt)
    self.assertEqual(datetime_tz.datetime_tz.now().strftime(FMT),
                     "2002-10-27 01:30:00 EDT-0400")

    @staticmethod
    def utcnowmockest():
      return datetime_tz.datetime_tz(2002, 10, 27, 6, 30, tzinfo=pytz.utc)

    datetime_tz.localtz_set("US/Eastern")
    self.mocked("datetime_tz.datetime_tz.utcnow", utcnowmockest)
    self.assertEqual(datetime_tz.datetime_tz.now().strftime(FMT),
                     "2002-10-27 01:30:00 EST-0500")
Beispiel #4
0
  def testPeopleRants(self):
    """This test contains various things which people rant about."""

    # Tests some of the pitfuls discussed at
    # http://www.enricozini.org/2009/debian/using-python-datetime/
    ############################################################################

    # That's right, the datetime object created by a call to datetime.datetime
    # constructor now seems to think that Finland uses the ancient "Helsinki
    # Mean Time" which was obsoleted in the 1920s.
    #
    # Well not anymore!
    eurhel = pytz.timezone("Europe/Helsinki")
    a = datetime_tz.datetime_tz(2008, 6, 23, 18, 2, 31, 101025, eurhel)
    self.assertEqual(repr(a),
                     "datetime_tz(2008, 6, 23, 18, 2, 31, 101025,"
                     " tzinfo=<DstTzInfo 'Europe/Helsinki' EEST+3:00:00 DST>)")

    # Timezone-aware datetime objects have other bugs: for example, they fail to
    # compute Unix timestamps correctly. The following example shows two
    # timezone-aware objects that represent the same instant but produce two
    # different timestamps.
    #
    # Well not anymore!
    utc = pytz.timezone("UTC")
    a = datetime_tz.datetime_tz(2008, 7, 6, 5, 4, 3, tzinfo=utc)
    self.assertEqual(str(a), "2008-07-06 05:04:03+00:00")
    self.assertEqual(a.totimestamp(), 1215320643.0)
    # FIXME(tansell): %s is effected by the TZ environment value.
    #self.assertEqual(a.strftime("%s"), "1215284643")

    italy = pytz.timezone("Europe/Rome")
    b = a.astimezone(italy)
    self.assertEqual(str(b), "2008-07-06 07:04:03+02:00")
    self.assertEqual(b.totimestamp(), 1215320643.0)
Beispiel #5
0
  def testAroundDst(self):
    # Testing going backwards into daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 10, 27, 6, 10, 0, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-10-27 01:00:00 EST-0500")

    before = loc_dt - datetime_tz.timedelta(minutes=20)
    self.assertEqual(before.strftime(FMT), "2002-10-27 01:50:00 EDT-0400")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-10-27 01:20:00 EST-0500")

    # Testing going forwards out of daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 10, 27, 5, 50, 0, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-10-27 01:50:00 EDT-0400")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-10-27 01:00:00 EST-0500")

    after = loc_dt + datetime_tz.timedelta(minutes=20)
    self.assertEqual(after.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-10-27 01:40:00 EDT-0400")

    # Test going backwards out of daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 4, 7, 7, 10, 00, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-04-07 03:10:00 EDT-0400")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-04-07 03:00:00 EDT-0400")

    before = loc_dt - datetime_tz.timedelta(minutes=20)
    self.assertEqual(before.strftime(FMT), "2002-04-07 01:50:00 EST-0500")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-04-07 03:20:00 EDT-0400")

    # Test going forwards into daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 4, 7, 6, 50, 00, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-04-07 01:50:00 EST-0500")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-04-07 03:00:00 EDT-0400")

    after = loc_dt + datetime_tz.timedelta(minutes=20)
    self.assertEqual(after.strftime(FMT), "2002-04-07 03:10:00 EDT-0400")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-04-07 01:40:00 EST-0500")
  def testAroundDst(self):
    # Testing going backwards into daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 10, 27, 6, 10, 0, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-10-27 01:00:00 EST-0500")

    before = loc_dt - datetime_tz.timedelta(minutes=20)
    self.assertEqual(before.strftime(FMT), "2002-10-27 01:50:00 EDT-0400")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-10-27 01:20:00 EST-0500")

    # Testing going forwards out of daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 10, 27, 5, 50, 0, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-10-27 01:50:00 EDT-0400")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-10-27 01:00:00 EST-0500")

    after = loc_dt + datetime_tz.timedelta(minutes=20)
    self.assertEqual(after.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-10-27 01:40:00 EDT-0400")

    # Test going backwards out of daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 4, 7, 7, 10, 00, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-04-07 03:10:00 EDT-0400")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-04-07 03:00:00 EDT-0400")

    before = loc_dt - datetime_tz.timedelta(minutes=20)
    self.assertEqual(before.strftime(FMT), "2002-04-07 01:50:00 EST-0500")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-04-07 03:20:00 EDT-0400")

    # Test going forwards into daylight savings
    utc_dt = datetime_tz.datetime_tz(2002, 4, 7, 6, 50, 00, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-04-07 01:50:00 EST-0500")

    after = loc_dt + datetime_tz.timedelta(minutes=10)
    self.assertEqual(after.strftime(FMT), "2002-04-07 03:00:00 EDT-0400")

    after = loc_dt + datetime_tz.timedelta(minutes=20)
    self.assertEqual(after.strftime(FMT), "2002-04-07 03:10:00 EDT-0400")

    before = loc_dt - datetime_tz.timedelta(minutes=10)
    self.assertEqual(before.strftime(FMT), "2002-04-07 01:40:00 EST-0500")
Beispiel #7
0
    def test_asset_dicts_equal_naive_datetimes(self):
        d1 = {
            1:
            datetime_tz.datetime_tz(
                2019,
                2,
                8,
                8,
                0,
                0,
                tzinfo=pytz.timezone('Africa/Johannesburg'))
        }
        d2 = {1: datetime_tz.datetime_tz(2019, 2, 8, 6, 0, 0, tzinfo=pytz.utc)}

        DictUtils.assert_dicts_equal(d1, d2, True)
Beispiel #8
0
  def testConvert(self):
    d = datetime_tz.datetime_tz(2009, 5, 1, 16, 12, 10)

    d_datetime = d.asdatetime()
    self.assert_(isinstance(d_datetime, datetime.datetime))
    self.assert_(not isinstance(d_datetime, datetime_tz.datetime_tz))
    self.assertEqual(d_datetime, datetime.datetime(2009, 5, 1, 16, 12, 10))

    d_date = d.asdate()
    self.assert_(isinstance(d_date, datetime.date))
    self.assert_(not isinstance(d_date, datetime.datetime))
    self.assertEqual(d_date, datetime.date(2009, 5, 1))
  def testConvert(self):
    d = datetime_tz.datetime_tz(2009, 5, 1, 16, 12, 10)

    d_datetime = d.asdatetime()
    self.assert_(isinstance(d_datetime, datetime.datetime))
    self.assert_(not isinstance(d_datetime, datetime_tz.datetime_tz))
    self.assertEqual(d_datetime, datetime.datetime(2009, 5, 1, 16, 12, 10))

    d_date = d.asdate()
    self.assert_(isinstance(d_date, datetime.date))
    self.assert_(not isinstance(d_date, datetime.datetime))
    self.assertEqual(d_date, datetime.date(2009, 5, 1))
Beispiel #10
0
def timetuple_to_datetime(t):
    """Convert a timetuple to a datetime object.
       """
    return datetime_tz.datetime_tz(*(t[:6]))
Beispiel #11
0
 def utcnowmockest():
   return datetime_tz.datetime_tz(2002, 10, 27, 6, 30, tzinfo=pytz.utc)
Beispiel #12
0
 def utcnowmockest():
   return datetime_tz.datetime_tz(2002, 10, 27, 6, 30, tzinfo=pytz.utc)
Beispiel #13
0
  def testCreation(self):
    # Create with the local timezone
    datetime_tz.localtz_set(pytz.utc)
    d0 = datetime_tz.datetime_tz(2008, 10, 1)
    self.assert_(isinstance(d0, datetime_tz.datetime_tz))
    self.assertEqual(d0.tzinfo, pytz.utc)

    # Creation with string timezone
    d1 = datetime_tz.datetime_tz(2008, 10, 1, tzinfo="UTC")
    self.assert_(isinstance(d1, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, pytz.utc)

    # Creation with tzinfo object
    d2 = datetime_tz.datetime_tz(2008, 10, 1, tzinfo=pytz.utc)
    self.assert_(isinstance(d2, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, pytz.utc)

    # Creation from a datetime_tz object
    d3 = datetime_tz.datetime_tz(d1)
    self.assert_(isinstance(d3, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, d3.tzinfo)

    # Creation from a datetime object
    d4 = datetime.datetime.now()
    d4 = pytz.timezone("Australia/Sydney").localize(d4)
    d5 = datetime_tz.datetime_tz(d4)
    self.assert_(isinstance(d3, datetime_tz.datetime_tz))
    self.assertEqual(d4.tzinfo, d5.tzinfo)

    # Creation from a naive datetime object not in DST
    d6 = datetime.datetime(2008, 12, 5)
    try:
      d7 = datetime_tz.datetime_tz(d6)
      self.fail("Was able to create from a naive datetime without a timezone")
    except TypeError:
      pass

    d7 = datetime_tz.datetime_tz(d6, "US/Pacific")
    self.assert_(isinstance(d7, datetime_tz.datetime_tz))
    self.assertEqual(d7.tzinfo.zone, "US/Pacific")
    self.assertEqual(d7.tzinfo._dst, datetime.timedelta(0))

    # Creation from a naive datetime object in DST
    d6 = datetime.datetime(2008, 7, 13)
    try:
      d7 = datetime_tz.datetime_tz(d6)
      self.fail("Was able to create from a naive datetime without a timezone")
    except TypeError:
      pass

    d7 = datetime_tz.datetime_tz(d6, "US/Pacific")

    self.assert_(isinstance(d7, datetime_tz.datetime_tz))
    self.assertEqual(d7.tzinfo.zone, "US/Pacific")
    self.assertEqual(d7.tzinfo._dst, datetime.timedelta(0, 3600))

    datetime_tz.localtz_set(pytz.utc)
    d0 = datetime_tz.datetime_tz(2008, 10, 1)
    self.assert_(isinstance(d0, datetime_tz.datetime_tz))
    self.assertEqual(d0.tzinfo, pytz.utc)

    d1 = datetime_tz.datetime_tz(d1)
    self.assert_(isinstance(d1, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, pytz.utc)
    self.assertEqual(d0, d1)
    self.assertFalse(d0 is d1)
Beispiel #14
0
def main(argv):

    conference_schedules = defaultdict(dict)

    # Download the schedule details for each channel and group into
    # conferences.
    for channel in CONFIG.groups():
        if channel == 'example':
            continue

        config = CONFIG.config(channel)

        if 'schedule' not in config or not config['schedule']:
            sys.stderr.write("Channel %s doesn't have a schedule.\n" % channel)
            continue

        tzinfo = None
        if config['schedule-timezone']:
            tzinfo = pytz.timezone(config['schedule-timezone'])

        channel_schedule = get_schedule_json(config['schedule'], channel,
                                             tzinfo)
        channel_schedule_list = []
        for e in channel_schedule:
            channel_schedule_list.append(e['fields'])

        conference = config['group']
        if config['conference']:
            conference = config['conference']

        schedule = []
        for item in channel_schedule_list:
            if item['name'] in ("miniconf schedules to be determined", ):
                continue

            data = {
                'start': item['start'],
                'end': item['end'],
                'title': item['name'].strip(),
                'abstract': item['description'],
                'url': item['public_url'],
            }

            if not data['title']:
                continue

            schedule.append(data)

        schedule.sort(key=lambda i: i['start'])
        conference_schedules[conference][channel] = schedule

    # Fill in day start / day end events for each conference day.
    # (We need to work in the schedule's timezone for this to work properly.)
    for conference in conference_schedules:
        # First earliest and latest event in a conference.
        all_events = []
        for channel_schedule in conference_schedules[conference].values():
            all_events.extend(channel_schedule)
        all_events.sort(key=lambda i: i['start'])

        starting_event = all_events[0]
        ending_event = all_events[-1]

        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            config = CONFIG.config(channel)
            if not config['schedule-timezone']:
                sys.stderr.write(
                    "%s has not timezone, can't add conference day events\n" %
                    channel)
                continue
            tzinfo = pytz.timezone(config['schedule-timezone'])

            # Group events onto days
            perday_events = defaultdict(list)
            for event in oldevents:
                perday_events[event['end'].astimezone(tzinfo).date()].append(
                    event)

            # Remove any days which are 100% via another schedule.
            for day in list(perday_events.keys()):
                for event in perday_events[day]:
                    if not event.get('via', False):
                        break
                else:
                    # All generated
                    del perday_events[day]

            # Add in any missing days
            startdate = datetime_tz.combine(
                starting_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(), tzinfo)
            enddate = datetime_tz.combine(
                ending_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(), tzinfo)
            for day in dt_iterate.days(startdate, enddate):
                if day.date() not in perday_events:
                    day_skipped_event = {
                        'start':
                        datetime_tz.combine(day, datetime_tz.min.time(),
                                            tzinfo).astimezone(pytz.utc),
                        'end':
                        datetime_tz.combine(day, datetime_tz.max.time(),
                                            tzinfo).astimezone(pytz.utc),
                        'title':
                        'Nothing in %s today' % config['title'],
                        'abstract':
                        '',
                        'generated':
                        True,
                    }

                    perday_events[day.date()].append(day_skipped_event)

            # Add start of day / end of day events
            for day, events in perday_events.items():
                if day > startdate.date() and events[0]['start'].astimezone(
                        tzinfo).time() != datetime_tz.min.time():
                    events.insert(
                        0, {
                            'start':
                            datetime_tz.combine(day, datetime_tz.min.time(),
                                                tzinfo).astimezone(pytz.utc),
                            'end':
                            events[0]['start'],
                            'title':
                            'Not yet started in %s' % config['title'],
                            'abstract':
                            '',
                            'generated':
                            True,
                        })

                if day < enddate.date() and events[-1]['end'].astimezone(
                        tzinfo).time() != datetime_tz.max.time():
                    events.append({
                        'start':
                        events[-1]['end'],
                        'end':
                        datetime_tz.combine(day, datetime_tz.max.time(),
                                            tzinfo).astimezone(pytz.utc),
                        'title':
                        'Finished for the day in %s' % config['title'],
                        'abstract':
                        '',
                        'generated':
                        True,
                    })

            # Create a before conference start event.
            before_event = {
                'start':
                datetime_tz(datetime_tz.min.asdatetime(naive=True),
                            tzinfo).astimezone(pytz.utc),
                'end':
                starting_event['start'],
                'title':
                '%s not yet started' % conference,
                'abstract':
                '',
                'generated':
                True,
            }
            # Create an after conference end event.
            after_event = {
                'start':
                ending_event['end'],
                'end':
                datetime_tz(datetime_tz.max.asdatetime(naive=True),
                            tzinfo).astimezone(pytz.utc),
                'title':
                '%s finished :(' % conference,
                'abstract':
                '',
                'generated':
                True,
            }

            # Put everything back together
            newevents = [before_event]
            for day in sorted(perday_events.keys()):
                newevents.extend(perday_events[day])
            newevents.append(after_event)

            conference_schedules[conference][channel] = newevents

    # Fill in any gaps
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            newevents = [oldevents.pop(0)]
            conference_schedules[conference][channel] = newevents

            while len(oldevents) > 0:
                delta = oldevents[0]['start'] - newevents[-1]['end']

                if delta.seconds > (5 * 60):
                    unknown_event = {
                        'start': newevents[-1]['end'],
                        'end': oldevents[0]['start'],
                        'abstract': '',
                        'generated': True,
                    }
                    unknown_event['title'] = '%i minute break' % (
                        (unknown_event['end'] - unknown_event['start']).seconds
                        / 60)
                    newevents.append(unknown_event)
                newevents.append(oldevents.pop(0))

    # Add guid to each event
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            for item in conference_schedules[conference][channel]:
                if 'guid' not in item:
                    item['guid'] = hashlib.md5(str(item['start']) +
                                               channel).hexdigest()

    print_schedule(conference_schedules)

    output_data = {}
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            output_data[channel] = conference_schedules[conference][channel]

    out = StringIO.StringIO()
    pprint.pprint(output_data, stream=out)
    print """\
from datetime_tz import datetime_tz
import pytz

data = \\"""
    print out.getvalue()
Beispiel #15
0
  def testCreation(self):
    # Create with the local timezone
    datetime_tz.localtz_set(pytz.utc)
    d0 = datetime_tz.datetime_tz(2008, 10, 1)
    self.assert_(isinstance(d0, datetime_tz.datetime_tz))
    self.assertEqual(d0.tzinfo, pytz.utc)

    # Creation with string timezone
    d1 = datetime_tz.datetime_tz(2008, 10, 1, tzinfo="UTC")
    self.assert_(isinstance(d1, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, pytz.utc)

    # Creation with tzinfo object
    d2 = datetime_tz.datetime_tz(2008, 10, 1, tzinfo=pytz.utc)
    self.assert_(isinstance(d2, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, pytz.utc)

    # Creation from a datetime_tz object
    d3 = datetime_tz.datetime_tz(d1)
    self.assert_(isinstance(d3, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, d3.tzinfo)

    # Creation from a datetime object
    d4 = datetime.datetime.now()
    d4 = pytz.timezone("Australia/Sydney").localize(d4)
    d5 = datetime_tz.datetime_tz(d4)
    self.assert_(isinstance(d3, datetime_tz.datetime_tz))
    self.assertEqual(d4.tzinfo, d5.tzinfo)

    # Creation from a naive datetime object not in DST
    d6 = datetime.datetime(2008, 12, 5)
    try:
      d7 = datetime_tz.datetime_tz(d6)
      self.fail("Was able to create from a naive datetime without a timezone")
    except TypeError:
      pass

    d7 = datetime_tz.datetime_tz(d6, "US/Pacific")
    self.assert_(isinstance(d7, datetime_tz.datetime_tz))
    self.assertEqual(d7.tzinfo.zone, "US/Pacific")
    self.assertEqual(d7.tzinfo._dst, datetime.timedelta(0))

    # Creation from a naive datetime object in DST
    d6 = datetime.datetime(2008, 7, 13)
    try:
      d7 = datetime_tz.datetime_tz(d6)
      self.fail("Was able to create from a naive datetime without a timezone")
    except TypeError:
      pass

    d7 = datetime_tz.datetime_tz(d6, "US/Pacific")

    self.assert_(isinstance(d7, datetime_tz.datetime_tz))
    self.assertEqual(d7.tzinfo.zone, "US/Pacific")
    self.assertEqual(d7.tzinfo._dst, datetime.timedelta(0, 3600))

    datetime_tz.localtz_set(pytz.utc)
    d0 = datetime_tz.datetime_tz(2008, 10, 1)
    self.assert_(isinstance(d0, datetime_tz.datetime_tz))
    self.assertEqual(d0.tzinfo, pytz.utc)

    d1 = datetime_tz.datetime_tz(d1)
    self.assert_(isinstance(d1, datetime_tz.datetime_tz))
    self.assertEqual(d1.tzinfo, pytz.utc)
    self.assertEqual(d0, d1)
    self.assertFalse(d0 is d1)
Beispiel #16
0
  def testSmartParse(self):
    datetime_tz.localtz_set("Australia/Sydney")

    tz = pytz.timezone("US/Pacific")
    now = datetime_tz.datetime_tz(2008, 12, 5, tzinfo=tz)
    tommorrow = now+datetime.timedelta(days=1)

    @staticmethod
    def now_fake(tzinfo):
      if tz is tzinfo:
        return now
      else:
        assert False
    self.mocked("datetime_tz.datetime_tz.now", now_fake)

    d = datetime_tz.datetime_tz.smartparse("now", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("today", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    # test that it's not case sensitive
    d = datetime_tz.datetime_tz.smartparse("ToDay", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("NOW", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("yesterday", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("tommorrow", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, tommorrow)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("a second ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(seconds=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 second ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(seconds=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 seconds ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(seconds=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 minute ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(minutes=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 minutes ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(minutes=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 hour ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 hours ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(hours=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 days ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 days 5 hours ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=2, hours=5))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 days and a hour ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=2, hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("4 daYs AND A SECond aGO", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=4, seconds=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 day and a hour ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1, hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("an hour and a day ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1, hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1d 2h ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1, hours=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2h5m32s ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(hours=2, minutes=5, seconds=32))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1y 2 month ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        years=1, months=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 months and 3m ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        months=2, minutes=3))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("3m4months1y ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        years=1, months=4, minutes=3))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("3m4months and 1y ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        years=1, months=4, minutes=3))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    self.assertRaises(ValueError,
                      datetime_tz.datetime_tz.smartparse,
                      "5 billion years ago", tz)

    self.assertRaises(ValueError,
                      datetime_tz.datetime_tz.smartparse,
                      "5 ago", tz)

    # FIXME: These below should actually test the equivalence
    d = datetime_tz.datetime_tz.smartparse("start of today", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now.replace(hour=0, minute=0, second=0, microsecond=0))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("start of tommorrow", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(
        d, tommorrow.replace(hour=0, minute=0, second=0, microsecond=0))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("start of yesterday", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("end of today", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("end of tommorrow", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(
        d, tommorrow.replace(
            hour=23, minute=59, second=59, microsecond=999999))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("end of yesterday", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    # FIXME: These above should actually test the equivalence

    self.mocked.tearDown()

    # Test datetime string with timezone information,
    # also provide timezone argument
    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00-05:00", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(-300))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00+0800", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00+08:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(480))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST-05:00", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 EST 2009", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    # Test datetime string with timezone information,
    # no more timezone argument
    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00-05:00")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(-300))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00+0800")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00+08:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(480))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST-05:00")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 EST 2009")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    # UTC, nice and easy
    d = datetime_tz.datetime_tz.smartparse("Tue Jul 03 06:00:01 UTC 2010")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2010-07-03 06:00:01+00:00")
    self.assertEqual(d.tzinfo, pytz.timezone("UTC"))

    # Try Pacific standard time
    d = datetime_tz.datetime_tz.smartparse("2002-10-27 01:20:00 EST")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2002-10-27 01:20:00-05:00")
    self.assertEqual(d.tzinfo.zone, pytz.timezone("US/Eastern").zone)

    d = datetime_tz.datetime_tz.smartparse("2002-10-27 01:20:00 EDT")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2002-10-27 01:20:00-04:00")
    self.assertEqual(d.tzinfo.zone, pytz.timezone("US/Eastern").zone)

    # Using Oslon timezones means you end up with ambigious dates.
    #   2002-10-27 01:30:00 US/Eastern
    #  could be either,
    #   2002-10-27 01:30:00 EDT-0400
    #   2002-10-27 01:30:00 EST-0500
    try:
      d = datetime_tz.datetime_tz.smartparse(
          "Tue Jul 03 06:00:01 US/Pacific 2010")
      self.assert_(False)
    except ValueError:
      pass

    # Make sure we get exceptions when invalid timezones are used.
    try:
      d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 Random 2009")
      self.assert_(False)
    except ValueError:
      pass

    try:
      d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 XXX 2009")
      self.assert_(False)
    except ValueError:
      pass

    ###########################################################################
    toparse = datetime_tz.datetime_tz(2008, 06, 5)
    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y/%m/%d"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y-%m-%d"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y%m%d"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(
        toparse.strftime("start of %d, %B %Y"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(
        d, toparse.replace(hour=0, minute=0, second=0, microsecond=0))

    toparse = datetime_tz.datetime_tz(2008, 12, 5, tzinfo=tz)
    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y/%m/%d"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y-%m-%d"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y%m%d"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(
        toparse.strftime("start of %d, %B %Y"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(
        d, toparse.replace(hour=0, minute=0, second=0, microsecond=0))
Beispiel #17
0

simple_od = DictUtils.ordereddict()
simple_od[99] = [('a', 1), ('b', 2)]
simple_od[1] = [('c', 3), ('d', 4)]
simple_od[7] = [('e', 5), ('f', 6)]


class OrderedDictInABox(object):
    def __init__(self, message, ordered_dict):
        self.message = message
        self.od = ordered_dict


inner_od = DictUtils.ordereddict()
inner_od['first'] = datetime_tz.datetime_tz(1979, 8, 8, 16)
inner_od['second'] = {'a': 1, 'b': 2, 'c': 3}
inner_od['third'] = OrderedDictInABox(
    'Here it is', DictUtils.ordereddict([(0, 'Here'), (1, 'it'), (2, 'is')]))
inner_od['fourth'] = OrderedDictInABox(
    'Here it is - remix',
    DictUtils.ordereddict([(1, 'it'), (2, 'is'), (0, 'Here')]))
inner_od['fifth'] = OrderedDictInABox(
    'Here it is - remix 2 feat. ?',
    DictUtils.ordereddict([(2, 'is'), (1, 'it'), (0, 'Here?')]))

complex_od = DictUtils.ordereddict()
complex_od[2] = [('a', 1), ('b', 2)]
complex_od[0] = inner_od
complex_od[1] = None
Beispiel #18
0
  def testSmartParse(self):
    datetime_tz.localtz_set("Australia/Sydney")

    tz = pytz.timezone("US/Pacific")
    now = datetime_tz.datetime_tz(2008, 12, 5, tzinfo=tz)
    tomorrow = now+datetime.timedelta(days=1)

    @staticmethod
    def now_fake(tzinfo):
      if tz is tzinfo:
        return now
      else:
        assert False
    self.mocked("datetime_tz.datetime_tz.now", now_fake)

    d = datetime_tz.datetime_tz.smartparse("now", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("today", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    # test that it's not case sensitive
    d = datetime_tz.datetime_tz.smartparse("ToDay", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("NOW", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("yesterday", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("tomorrow", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, tomorrow)
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("a second ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(seconds=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 second ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(seconds=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 seconds ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(seconds=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 minute ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(minutes=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 minutes ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(minutes=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 hour ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 hours ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(hours=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 days ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 days 5 hours ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=2, hours=5))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 days and a hour ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=2, hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("4 daYs AND A SECond aGO", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=4, seconds=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1 day and a hour ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1, hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("an hour and a day ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1, hours=1))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1d 2h ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(days=1, hours=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2h5m32s ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-datetime.timedelta(hours=2, minutes=5, seconds=32))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("1y 2 month ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        years=1, months=2))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("2 months and 3m ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        months=2, minutes=3))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("3m4months1y ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        years=1, months=4, minutes=3))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("3m4months and 1y ago", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now-dateutil.relativedelta.relativedelta(
        years=1, months=4, minutes=3))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    self.assertRaises(ValueError,
                      datetime_tz.datetime_tz.smartparse,
                      "5 billion years ago", tz)

    self.assertRaises(ValueError,
                      datetime_tz.datetime_tz.smartparse,
                      "5 ago", tz)

    # FIXME: These below should actually test the equivalence
    d = datetime_tz.datetime_tz.smartparse("start of today", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, now.replace(hour=0, minute=0, second=0, microsecond=0))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("start of tomorrow", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(
        d, tomorrow.replace(hour=0, minute=0, second=0, microsecond=0))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("start of yesterday", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("end of today", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("end of tomorrow", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(
        d, tomorrow.replace(
            hour=23, minute=59, second=59, microsecond=999999))
    self.assertEqual(d.tzinfo.zone, tz.zone)

    d = datetime_tz.datetime_tz.smartparse("end of yesterday", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    # FIXME: These above should actually test the equivalence

    self.mocked.tearDown()

    # Test datetime string with timezone information,
    # also provide timezone argument
    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00-05:00", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(-300))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00+0800", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00+08:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(480))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST-05:00", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 EST 2009", tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    # Test datetime string with timezone information,
    # no more timezone argument
    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00-05:00")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(-300))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00+0800")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00+08:00")
    self.assertEqual(d.tzinfo, pytz.FixedOffset(480))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("2009-11-09 23:00:00 EST-05:00")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 EST 2009")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2009-11-09 23:00:00-05:00")
    self.assertEqual(d.tzinfo, pytz.timezone("US/Eastern"))

    # UTC, nice and easy
    d = datetime_tz.datetime_tz.smartparse("Tue Jul 03 06:00:01 UTC 2010")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2010-07-03 06:00:01+00:00")
    self.assertEqual(d.tzinfo, pytz.timezone("UTC"))

    # Try Pacific standard time
    d = datetime_tz.datetime_tz.smartparse("2002-10-27 01:20:00 EST")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2002-10-27 01:20:00-05:00")
    self.assertEqual(d.tzinfo.zone, pytz.timezone("US/Eastern").zone)

    d = datetime_tz.datetime_tz.smartparse("2002-10-27 01:20:00 EDT")
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(str(d), "2002-10-27 01:20:00-04:00")
    self.assertEqual(d.tzinfo.zone, pytz.timezone("US/Eastern").zone)

    # Using Oslon timezones means you end up with ambigious dates.
    #   2002-10-27 01:30:00 US/Eastern
    #  could be either,
    #   2002-10-27 01:30:00 EDT-0400
    #   2002-10-27 01:30:00 EST-0500
    try:
      d = datetime_tz.datetime_tz.smartparse(
          "Tue Jul 03 06:00:01 US/Pacific 2010")
      self.assert_(False)
    except ValueError:
      pass

    # Make sure we get exceptions when invalid timezones are used.
    try:
      d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 Random 2009")
      self.assert_(False)
    except ValueError:
      pass

    try:
      d = datetime_tz.datetime_tz.smartparse("Mon Nov 09 23:00:00 XXX 2009")
      self.assert_(False)
    except ValueError:
      pass

    ###########################################################################
    toparse = datetime_tz.datetime_tz(2008, 6, 5)
    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y/%m/%d"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y-%m-%d"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y%m%d"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(
        toparse.strftime("start of %d, %B %Y"))
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(
        d, toparse.replace(hour=0, minute=0, second=0, microsecond=0))

    toparse = datetime_tz.datetime_tz(2008, 12, 5, tzinfo=tz)
    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y/%m/%d"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y-%m-%d"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(toparse.strftime("%Y%m%d"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(d, toparse)

    d = datetime_tz.datetime_tz.smartparse(
        toparse.strftime("start of %d, %B %Y"), tz)
    self.assert_(isinstance(d, datetime_tz.datetime_tz))
    self.assertEqual(d.tzinfo.zone, tz.zone)
    self.assertEqual(
        d, toparse.replace(hour=0, minute=0, second=0, microsecond=0))
Beispiel #19
0
  def testReplace(self):
    # Testing normal replace
    dt = datetime_tz.datetime_tz(
        2010, 3, 10, 17, 23, 26, 871430, "US/Pacific")

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=1)
    result = datetime_tz.datetime_tz(
        2010, 3, 10, 0, 0, 0, 1, "US/Pacific")
    self.assertEqual(result, replaced)

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=0)
    result = datetime_tz.datetime_tz(
        2010, 3, 10, 0, 0, 0, 0, "US/Pacific")
    self.assertEqual(result, replaced)

    # Test replacing across daylight savings boundary
    dt = datetime_tz.datetime_tz(
        2010, 3, 14, 17, 23, 26, 871430, "US/Pacific")

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=1)
    result = datetime_tz.datetime_tz(
        2010, 3, 14, 0, 0, 0, 1, "US/Pacific")
    self.assertEqual(result, replaced)

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=0)
    result = datetime_tz.datetime_tz(
        2010, 3, 14, 0, 0, 0, 0, "US/Pacific")
    self.assertEqual(result, replaced)

    # Test starting outside of DST
    utc_dt = datetime_tz.datetime_tz(2002, 10, 27, 6, 10, 0, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    # Since we don't start off in DST, so a replace should try and keep us out
    # of DST
    assert not loc_dt.is_dst

    replace = loc_dt.replace(hour=1)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    replace = loc_dt.replace(is_dst=False)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    replace = loc_dt.replace(minute=50, second=0, microsecond=0)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:50:00 EST-0500")

    # Unless we are also replacing the DST flag
    replace = loc_dt.replace(hour=1, is_dst=True)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EDT-0400")

    replace = loc_dt.replace(is_dst=True)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EDT-0400")

    replace = loc_dt.replace(minute=50, second=0, microsecond=0, is_dst=True)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:50:00 EDT-0400")

    # But if we go too far, replace should still do the right thing
    replace = loc_dt.replace(day=26)
    self.assertEqual(replace.strftime(FMT), "2002-10-26 01:10:00 EDT-0400")

    replace = loc_dt.replace(day=28)
    self.assertEqual(replace.strftime(FMT), "2002-10-28 01:10:00 EST-0500")

    # FIXME(tansell): Make these test work.
    #self.assertRaises(pytz.NonExistentTimeError, loc_dt.replace,
    #                  day=26, is_dst=False)
    #self.assertRaises(pytz.NonExistentTimeError, loc_dt.replace,
    #                  day=28, is_dst=True)

    # Testing starting in DST
    utc_dt = datetime_tz.datetime_tz(2002, 4, 7, 7, 10, 00, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-04-07 03:10:00 EDT-0400")

    # Since we start in DST, so a replace should try and keep us in DST.
    assert loc_dt.is_dst

    replace = loc_dt.replace(minute=0, second=0, microsecond=0)
    self.assertEqual(replace.strftime(FMT), "2002-04-07 03:00:00 EDT-0400")

    # 2:30 doesn't actually exist
    self.assertRaises(pytz.NonExistentTimeError, loc_dt.replace,
                      hour=2, minute=30, second=0, microsecond=0)
Beispiel #20
0
  def testReplace(self):
    # Testing normal replace
    dt = datetime_tz.datetime_tz(
        2010, 3, 10, 17, 23, 26, 871430, "US/Pacific")

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=1)
    result = datetime_tz.datetime_tz(
        2010, 3, 10, 0, 0, 0, 1, "US/Pacific")
    self.assertEqual(result, replaced)

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=0)
    result = datetime_tz.datetime_tz(
        2010, 3, 10, 0, 0, 0, 0, "US/Pacific")
    self.assertEqual(result, replaced)

    # Test replacing across daylight savings boundary
    dt = datetime_tz.datetime_tz(
        2010, 3, 14, 17, 23, 26, 871430, "US/Pacific")

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=1)
    result = datetime_tz.datetime_tz(
        2010, 3, 14, 0, 0, 0, 1, "US/Pacific")
    self.assertEqual(result, replaced)

    replaced = dt.replace(hour=0, minute=0, second=0, microsecond=0)
    result = datetime_tz.datetime_tz(
        2010, 3, 14, 0, 0, 0, 0, "US/Pacific")
    self.assertEqual(result, replaced)

    # Test starting outside of DST
    utc_dt = datetime_tz.datetime_tz(2002, 10, 27, 6, 10, 0, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    # Since we don't start off in DST, so a replace should try and keep us out
    # of DST
    assert not loc_dt.is_dst

    replace = loc_dt.replace(hour=1)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    replace = loc_dt.replace(is_dst=False)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EST-0500")

    replace = loc_dt.replace(minute=50, second=0, microsecond=0)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:50:00 EST-0500")

    # Unless we are also replacing the DST flag
    replace = loc_dt.replace(hour=1, is_dst=True)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EDT-0400")

    replace = loc_dt.replace(is_dst=True)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:10:00 EDT-0400")

    replace = loc_dt.replace(minute=50, second=0, microsecond=0, is_dst=True)
    self.assertEqual(replace.strftime(FMT), "2002-10-27 01:50:00 EDT-0400")

    # But if we go too far, replace should still do the right thing
    replace = loc_dt.replace(day=26)
    self.assertEqual(replace.strftime(FMT), "2002-10-26 01:10:00 EDT-0400")

    replace = loc_dt.replace(day=28)
    self.assertEqual(replace.strftime(FMT), "2002-10-28 01:10:00 EST-0500")

    # FIXME(tansell): Make these test work.
    #self.assertRaises(pytz.NonExistentTimeError, loc_dt.replace,
    #                  day=26, is_dst=False)
    #self.assertRaises(pytz.NonExistentTimeError, loc_dt.replace,
    #                  day=28, is_dst=True)

    # Testing starting in DST
    utc_dt = datetime_tz.datetime_tz(2002, 4, 7, 7, 10, 00, tzinfo=pytz.utc)
    loc_dt = utc_dt.astimezone(pytz.timezone("US/Eastern"))
    self.assertEqual(loc_dt.strftime(FMT), "2002-04-07 03:10:00 EDT-0400")

    # Since we start in DST, so a replace should try and keep us in DST.
    assert loc_dt.is_dst

    replace = loc_dt.replace(minute=0, second=0, microsecond=0)
    self.assertEqual(replace.strftime(FMT), "2002-04-07 03:00:00 EDT-0400")

    # 2:30 doesn't actually exist
    self.assertRaises(pytz.NonExistentTimeError, loc_dt.replace,
                      hour=2, minute=30, second=0, microsecond=0)
Beispiel #21
0
def main(argv):
    if CONFIG['config']['schedule-format']:
        if CONFIG['config']['schedule-format'] == 'pycon':
            return os.system('python pycon2internal.py')
        if CONFIG['config']['schedule-format'] == 'veyepar':
            return os.system('python veyepar2internal.py')
        if CONFIG['config']['schedule-format'] == 'symposion':
            return os.system('python symposion2internal.py')

    conference_schedules = defaultdict(dict)

    # Download the schedule details for each channel and group into
    # conferences.
    for channel in CONFIG.groups():
        config = CONFIG.config(channel)

        if 'schedule' not in config or not config['schedule']:
            sys.stderr.write("Channel %s doesn't have a schedule.\n" % channel)
            continue

        tzinfo = None
        if config['schedule-timezone']:
            tzinfo = pytz.timezone(config['schedule-timezone'])

        channel_schedule = get_schedule_json(config['schedule'], tzinfo)

        conference = config['group']
        if config['conference']:
            conference = config['conference']

        schedule = []
        for item in channel_schedule:
            if 'Title' not in item or not item['Title'] or item[
                    'Title'] in BLACKLISTED_EVENTS:
                continue

            if item['Room Name'] != config['schedule-key'] and item[
                    'Room Name'] != config['schedule-see-also']:
                # Event is not in this room
                continue

            data = {
                'start': item['Start'],
                'title': item['Title'].strip(),
                'abstract': item['Description'],
                'url': None,
            }

            if 'End' in item:
                data['end'] = item['End']
            elif 'Duration' in item:
                data['end'] = data['start'] + parse_pytimedelta(
                    item['Duration'])
            else:
                sys.stderr.write(
                    'Event %r does not have a End time or Duration, dropped.\n'
                    % item['Title'])
                continue
            if 'URL' in item:
                data['url'] = item['URL']

            schedule.append(data)

        schedule.sort(key=lambda i: i['start'])
        conference_schedules[conference][channel] = schedule

    # Fill in day start / day end events for each conference day.
    # (We need to work in the schedule's timezone for this to work properly.)
    for conference in conference_schedules:
        # First earliest and latest event in a conference.
        all_events = []
        for channel_schedule in conference_schedules[conference].values():
            all_events.extend(channel_schedule)
        all_events.sort(key=lambda i: i['start'])

        if len(all_events) == 0:
            # No events this day
            sys.stderr.write("There are no events in %r\n" % (conference, ))
            continue
        starting_event = all_events[0]
        ending_event = all_events[-1]

        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            config = CONFIG.config(channel)
            if not config['schedule-timezone']:
                sys.stderr.write(
                    "%s has not timezone, can't add conference day events\n" %
                    channel)
                continue
            tzinfo = pytz.timezone(config['schedule-timezone'])

            # Group events onto days
            perday_events = defaultdict(list)
            for event in oldevents:
                perday_events[event['end'].astimezone(tzinfo).date()].append(
                    event)

            # Remove any days which are 100% via another schedule.
            for day in list(perday_events.keys()):
                for event in perday_events[day]:
                    if not event.get('via', False):
                        break
                else:
                    # All generated
                    del perday_events[day]

            # Add in any missing days
            startdate = datetime_tz.combine(
                starting_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(), tzinfo)
            enddate = datetime_tz.combine(
                ending_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(), tzinfo)
            for day in dt_iterate.days(startdate, enddate):
                if day.date() not in perday_events:
                    day_skipped_event = {
                        'start':
                        datetime_tz.combine(day, datetime_tz.min.time(),
                                            tzinfo).astimezone(pytz.utc),
                        'end':
                        datetime_tz.combine(day, datetime_tz.max.time(),
                                            tzinfo).astimezone(pytz.utc),
                        'title':
                        'Nothing in %s today' % config['title'],
                        'abstract':
                        '',
                        'generated':
                        True,
                    }

                    perday_events[day.date()].append(day_skipped_event)

            # Add start of day / end of day events
            for day, events in perday_events.items():
                if day > startdate.date() and events[0]['start'].astimezone(
                        tzinfo).time() != datetime_tz.min.time():
                    events.insert(
                        0, {
                            'start':
                            datetime_tz.combine(day, datetime_tz.min.time(),
                                                tzinfo).astimezone(pytz.utc),
                            'end':
                            events[0]['start'],
                            'title':
                            'Not yet started in %s' % config['title'],
                            'abstract':
                            '',
                            'generated':
                            True,
                        })

                if day < enddate.date() and events[-1]['end'].astimezone(
                        tzinfo).time() != datetime_tz.max.time():
                    events.append({
                        'start':
                        events[-1]['end'],
                        'end':
                        datetime_tz.combine(day, datetime_tz.max.time(),
                                            tzinfo).astimezone(pytz.utc),
                        'title':
                        'Finished for the day in %s' % config['title'],
                        'abstract':
                        '',
                        'generated':
                        True,
                    })

            # Create a before conference start event.
            before_event = {
                'start':
                datetime_tz(datetime_tz.min.asdatetime(naive=True),
                            tzinfo).astimezone(pytz.utc),
                'end':
                starting_event['start'],
                'title':
                '%s not yet started' % conference,
                'abstract':
                '',
                'generated':
                True,
            }
            # Create an after conference end event.
            after_event = {
                'start':
                ending_event['end'],
                'end':
                datetime_tz(datetime_tz.max.asdatetime(naive=True),
                            tzinfo).astimezone(pytz.utc),
                'title':
                '%s finished :(' % conference,
                'abstract':
                '',
                'generated':
                True,
            }

            # Put everything back together
            newevents = [before_event]
            for day in sorted(perday_events.keys()):
                newevents.extend(perday_events[day])
            newevents.append(after_event)

            conference_schedules[conference][channel] = newevents

    # Fill in any gaps
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            if len(oldevents) == 0:
                # No events on day
                continue
            newevents = [oldevents.pop(0)]
            conference_schedules[conference][channel] = newevents

            while len(oldevents) > 0:
                delta = oldevents[0]['start'] - newevents[-1]['end']

                if delta.seconds > (5 * 60):
                    unknown_event = {
                        'start': newevents[-1]['end'],
                        'end': oldevents[0]['start'],
                        'abstract': '',
                        'generated': True,
                    }
                    unknown_event['title'] = '%i minute break' % (
                        (unknown_event['end'] - unknown_event['start']).seconds
                        / 60)
                    newevents.append(unknown_event)
                newevents.append(oldevents.pop(0))

    # Add guid to each event
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            for item in conference_schedules[conference][channel]:
                if 'guid' not in item:
                    item['guid'] = hashlib.md5(str(item['start']) +
                                               channel).hexdigest()

    print_schedule(conference_schedules)

    output_data = {}
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            output_data[channel] = conference_schedules[conference][channel]

    out = StringIO.StringIO()
    pprint.pprint(output_data, stream=out)
    print """\
from datetime_tz import datetime_tz
import pytz

data = \\"""
    print out.getvalue()
def main(argv):
    conference_schedules = defaultdict(dict)

    # Download the schedule details for each channel and group into
    # conferences.
    for channel in CONFIG.groups():
        config = CONFIG.config(channel)

    	if 'schedule' not in config or not config['schedule']:
            sys.stderr.write("Channel %s doesn't have a schedule.\n" % channel)
            continue

        tzinfo = None
        if config['schedule-timezone']:
            tzinfo = pytz.timezone(config['schedule-timezone'])

        channel_schedule = get_schedule_json(config['schedule'], tzinfo)
        if config['schedule-key'] not in channel_schedule:
            raise IOError()

        conference = config['group']
        if config['conference']:
            conference = config['conference']

        schedule = []
        for schedule_key in [config['schedule-key']] + config['schedule-see-also']:
            for item in channel_schedule[schedule_key]:
                if item['title'] in ("miniconf schedules to be determined",):
                    continue

                data = {
                    'start': item['start'],
                    'end': item['end'],
                    'title': item['title'],
                    'abstract': item['abstract'],
                    'url': '',
                    }

                if 'url' in item:
                    data['url'] = item['url']

                if schedule_key == 'uncatered':
                    data['via'] = schedule_key
                    data['title'] = "Lunch Break"
                elif schedule_key != config['schedule-key']:
                    data['via'] = schedule_key
                    data['title'] = "Move to %s for %s" % (schedule_key, item['title'])

                schedule.append(data)

        schedule.sort(key=lambda i: i['start'])
        conference_schedules[conference][channel] = schedule

    # Fill in day start / day end events for each conference day.
    # (We need to work in the schedule's timezone for this to work properly.)
    for conference in conference_schedules:
        # First earliest and latest event in a conference.
        all_events = []
        for channel_schedule in conference_schedules[conference].values():
            all_events.extend(channel_schedule)
        all_events.sort(key=lambda i: i['start'])

        starting_event = all_events[0]
        ending_event = all_events[-1]

        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            config = CONFIG.config(channel)
            if not config['schedule-timezone']:
                sys.stderr.write("%s has not timezone, can't add conference day events\n" % channel)
                continue
            tzinfo = pytz.timezone(config['schedule-timezone'])

            # Group events onto days
            perday_events = defaultdict(list)
            for event in oldevents:
                perday_events[event['end'].astimezone(tzinfo).date()].append(event)

            # Remove any days which are 100% via another schedule.
            for day in list(perday_events.keys()):
                for event in perday_events[day]:
                    if not event.get('via', False):
                        break
                else:
                    # All generated
                    del perday_events[day]

            # Add in any missing days
            startdate = datetime_tz.combine(
                starting_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(),
                tzinfo)
            enddate = datetime_tz.combine(
                ending_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(),
                tzinfo)
            for day in dt_iterate.days(startdate, enddate):
                if day.date() not in perday_events:
                    day_skipped_event = {
                        'start': datetime_tz.combine(day, datetime_tz.min.time(), tzinfo).astimezone(pytz.utc),
                        'end': datetime_tz.combine(day, datetime_tz.max.time(), tzinfo).astimezone(pytz.utc),
                        'title': '<i>Nothing in %s today</i>' % config['title'],
                        'abstract': '',
                        'generated': True,
                        }

                    perday_events[day.date()].append(day_skipped_event)

            # Add start of day / end of day events
            for day, events in perday_events.items():
                if day > startdate.date() and events[0]['start'].astimezone(tzinfo).time() != datetime_tz.min.time():
                    events.insert(0, {
                        'start': datetime_tz.combine(day, datetime_tz.min.time(), tzinfo).astimezone(pytz.utc),
                        'end': events[0]['start'],
                        'title': '<i>Not yet started in %s</i>' % config['title'],
                        'abstract': '',
                        'generated': True,
                        })

                if day < enddate.date() and events[-1]['end'].astimezone(tzinfo).time() != datetime_tz.max.time():
                    events.append({
                        'start': events[-1]['end'],
                        'end': datetime_tz.combine(day, datetime_tz.max.time(), tzinfo).astimezone(pytz.utc),
                        'title': '<i>Finished for the day in %s</i>' % config['title'],
                        'abstract': '',
                        'generated': True,
                        })

            # Create a before conference start event.
            before_event = {
                'start': datetime_tz(datetime_tz.min.asdatetime(naive=True), tzinfo).astimezone(pytz.utc),
                'end': starting_event['start'],
                'title': '<i>%s not yet started</i>' % conference,
                'abstract': '',
                'generated': True,
                }
            # Create an after conference end event.
            after_event = {
                'start': ending_event['end'],
                'end': datetime_tz(datetime_tz.max.asdatetime(naive=True), tzinfo).astimezone(pytz.utc),
                'title': '<i>%s finished :(</i>' % conference,
                'abstract': '',
                'generated': True,
                }

            # Put everything back together
            newevents = [before_event]
            for day in sorted(perday_events.keys()):
                newevents.extend(perday_events[day])
            newevents.append(after_event)

            conference_schedules[conference][channel] = newevents

    # Fill in any gaps
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            newevents = [oldevents.pop(0)]
            conference_schedules[conference][channel] = newevents

            while len(oldevents) > 0:
                delta = oldevents[0]['start'] - newevents[-1]['end']

                if delta.seconds > (5*60):
                    unknown_event = {
                        'start': newevents[-1]['end'],
                        'end': oldevents[0]['start'],
                        'abstract': '',
                        'generated': True,
                        }
                    unknown_event['title'] = '<i>%i minute break</i>' % ((unknown_event['end'] - unknown_event['start']).seconds/60)
                    newevents.append(unknown_event)
                newevents.append(oldevents.pop(0))

    # Add guid to each event
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            for item in conference_schedules[conference][channel]:
                if 'guid' not in item:
                    item['guid'] = hashlib.md5(str(item['start'])+channel).hexdigest()

    print_schedule(conference_schedules)

    output_data = {}
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            output_data[channel] = conference_schedules[conference][channel]

    out = StringIO.StringIO()
    pprint.pprint(output_data, stream=out)
    print """\
from datetime_tz import datetime_tz
import pytz

data = \\"""
    print out.getvalue()
def main(argv):
    if CONFIG['config']['schedule-format']:
        if CONFIG['config']['schedule-format'] == 'pycon':
            return os.system('python pycon2internal.py')
        if CONFIG['config']['schedule-format'] == 'veyepar':
            return os.system('python veyepar2internal.py')
        if CONFIG['config']['schedule-format'] == 'symposion':
            return os.system('python symposion2internal.py')

    conference_schedules = defaultdict(dict)

    # Download the schedule details for each channel and group into
    # conferences.
    for channel in CONFIG.groups():
        config = CONFIG.config(channel)

        if 'schedule' not in config or not config['schedule']:
            sys.stderr.write("Channel %s doesn't have a schedule.\n" % channel)
            continue

        tzinfo = None
        if config['schedule-timezone']:
            tzinfo = pytz.timezone(config['schedule-timezone'])

        channel_schedule = get_schedule_json(config['schedule'], tzinfo)

        conference = config['group']
        if config['conference']:
            conference = config['conference']

        schedule = []
        for item in channel_schedule:
            if 'Title' not in item or not item['Title'] or item['Title'] in BLACKLISTED_EVENTS:
                continue

            if item['Room Name'] != config['schedule-key'] and item['Room Name'] != config['schedule-see-also']:
                # Event is not in this room
                continue

            data = {
                'start': item['Start'],
                'title': item['Title'].strip(),
                'abstract': item['Description'],
                'url': None,
                }

            if 'End' in item:
                data['end'] = item['End']
            elif 'Duration' in item:
                data['end'] = data['start'] + parse_pytimedelta(item['Duration'])
            else:
                sys.stderr.write('Event %r does not have a End time or Duration, dropped.\n' % item['Title'])
                continue
            if 'URL' in item:
                data['url'] = item['URL']

            schedule.append(data)

        schedule.sort(key=lambda i: i['start'])
        conference_schedules[conference][channel] = schedule

    # Fill in day start / day end events for each conference day.
    # (We need to work in the schedule's timezone for this to work properly.)
    for conference in conference_schedules:
        # First earliest and latest event in a conference.
        all_events = []
        for channel_schedule in conference_schedules[conference].values():
            all_events.extend(channel_schedule)
        all_events.sort(key=lambda i: i['start'])

        if len(all_events) == 0:
            # No events this day
            sys.stderr.write("There are no events in %r\n" % (conference,))
            continue
        starting_event = all_events[0]
        ending_event = all_events[-1]

        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            config = CONFIG.config(channel)
            if not config['schedule-timezone']:
                sys.stderr.write("%s has not timezone, can't add conference day events\n" % channel)
                continue
            tzinfo = pytz.timezone(config['schedule-timezone'])

            # Group events onto days
            perday_events = defaultdict(list)
            for event in oldevents:
                perday_events[event['end'].astimezone(tzinfo).date()].append(event)

            # Remove any days which are 100% via another schedule.
            for day in list(perday_events.keys()):
                for event in perday_events[day]:
                    if not event.get('via', False):
                        break
                else:
                    # All generated
                    del perday_events[day]

            # Add in any missing days
            startdate = datetime_tz.combine(
                starting_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(),
                tzinfo)
            enddate = datetime_tz.combine(
                ending_event['start'].astimezone(tzinfo).date(),
                datetime_tz.min.time(),
                tzinfo)
            for day in dt_iterate.days(startdate, enddate):
                if day.date() not in perday_events:
                    day_skipped_event = {
                        'start': datetime_tz.combine(day, datetime_tz.min.time(), tzinfo).astimezone(pytz.utc),
                        'end': datetime_tz.combine(day, datetime_tz.max.time(), tzinfo).astimezone(pytz.utc),
                        'title': 'Nothing in %s today' % config['title'],
                        'abstract': '',
                        'generated': True,
                        }

                    perday_events[day.date()].append(day_skipped_event)

            # Add start of day / end of day events
            for day, events in perday_events.items():
                if day > startdate.date() and events[0]['start'].astimezone(tzinfo).time() != datetime_tz.min.time():
                    events.insert(0, {
                        'start': datetime_tz.combine(day, datetime_tz.min.time(), tzinfo).astimezone(pytz.utc),
                        'end': events[0]['start'],
                        'title': 'Not yet started in %s' % config['title'],
                        'abstract': '',
                        'generated': True,
                        })

                if day < enddate.date() and events[-1]['end'].astimezone(tzinfo).time() != datetime_tz.max.time():
                    events.append({
                        'start': events[-1]['end'],
                        'end': datetime_tz.combine(day, datetime_tz.max.time(), tzinfo).astimezone(pytz.utc),
                        'title': 'Finished for the day in %s' % config['title'],
                        'abstract': '',
                        'generated': True,
                        })

            # Create a before conference start event.
            before_event = {
                'start': datetime_tz(datetime_tz.min.asdatetime(naive=True), tzinfo).astimezone(pytz.utc),
                'end': starting_event['start'],
                'title': '%s not yet started' % conference,
                'abstract': '',
                'generated': True,
                }
            # Create an after conference end event.
            after_event = {
                'start': ending_event['end'],
                'end': datetime_tz(datetime_tz.max.asdatetime(naive=True), tzinfo).astimezone(pytz.utc),
                'title': '%s finished :(' % conference,
                'abstract': '',
                'generated': True,
                }

            # Put everything back together
            newevents = [before_event]
            for day in sorted(perday_events.keys()):
                newevents.extend(perday_events[day])
            newevents.append(after_event)

            conference_schedules[conference][channel] = newevents

    # Fill in any gaps
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            oldevents = conference_schedules[conference][channel]

            if len(oldevents) == 0:
                # No events on day
                continue
            newevents = [oldevents.pop(0)]
            conference_schedules[conference][channel] = newevents

            while len(oldevents) > 0:
                delta = oldevents[0]['start'] - newevents[-1]['end']

                if delta.seconds > (5*60):
                    unknown_event = {
                        'start': newevents[-1]['end'],
                        'end': oldevents[0]['start'],
                        'abstract': '',
                        'generated': True,
                        }
                    unknown_event['title'] = '%i minute break' % ((unknown_event['end'] - unknown_event['start']).seconds/60)
                    newevents.append(unknown_event)
                newevents.append(oldevents.pop(0))

    # Add guid to each event
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            for item in conference_schedules[conference][channel]:
                if 'guid' not in item:
                    item['guid'] = hashlib.md5(str(item['start'])+channel).hexdigest()

    print_schedule(conference_schedules)

    output_data = {}
    for conference in conference_schedules:
        for channel in conference_schedules[conference]:
            output_data[channel] = conference_schedules[conference][channel]

    out = StringIO.StringIO()
    pprint.pprint(output_data, stream=out)
    print """\
from datetime_tz import datetime_tz
import pytz

data = \\"""
    print out.getvalue()