예제 #1
0
    def test_zone_to_zone(self):

        dt_1 = datetime.utcnow() + timedelta(hours=-2)
        dt_2 = datetime.utcnow() + timedelta(hours=2)

        arr_1 = Arrow(dt_1, timedelta(hours=-2))
        arr_2 = Arrow(dt_2, timedelta(hours=2))

        result_1 = arr_1.to(timedelta(hours=2))
        result_2 = arr_2.to(timedelta(hours=-2))

        self.assert_dt_equal(result_1.datetime, arr_2.datetime)
        self.assert_dt_equal(result_2.datetime, arr_1.datetime)
예제 #2
0
    def test_zone_to_zone(self):

        dt_1 = datetime.utcnow() + timedelta(hours=-2)
        dt_2 = datetime.utcnow() + timedelta(hours=2)

        arr_1 = Arrow(dt_1, timedelta(hours=-2))
        arr_2 = Arrow(dt_2, timedelta(hours=2))

        result_1 = arr_1.to(timedelta(hours=2))
        result_2 = arr_2.to(timedelta(hours=-2))

        self.assert_dt_equal(result_1.datetime, arr_2.datetime)
        self.assert_dt_equal(result_2.datetime, arr_1.datetime)
예제 #3
0
def should_2020_04_mega_pay(utc: Arrow) -> bool:
    """Should return True it is 4/20/2020 4:20 AM/PM in Texas"""

    central = utc.to('America/Chicago')

    return (central.month == 4 and central.day == 20 and central.year == 2020
            and is_payable(utc))
예제 #4
0
    def blacklist_project(self, project: db.Project, reset_time: arrow.Arrow):
        """
        Add specified project to `self.ratelimit_queue`, add backend to
        `self.blacklist_dict` and increment `self.ratelimit_counter`.

        Args:
            project: Project to blacklist
            reset_time: Time when the ratelimit will be reset
        """
        with self.blacklist_dict_lock:
            if project.backend not in self.blacklist_dict:
                _log.debug(
                    "Rate limit threshold reached. Adding {} to blacklist.".format(
                        project.backend
                    )
                )
                self.blacklist_dict[project.backend] = reset_time.to("utc").datetime
        with self.ratelimit_queue_lock:
            if project.backend not in self.ratelimit_queue:
                self.ratelimit_queue[project.backend] = []

            self.ratelimit_queue[project.backend].append(project.id)

        with self.ratelimit_counter_lock:
            self.ratelimit_counter += 1
예제 #5
0
    def DailyCallback(self, schedule_time: arrow.Arrow, fn: Callable, *args,
                      **kwargs) -> Job:
        """Schedules fn to be run once a day at schedule_time.

    The actual scheduled time is perturbed randomly +/-30s unless the kwarg
    '_jitter' is set to False.

    Args:
      schedule_time: An Arrow object specifying when to run fn.
      fn: The function to be run.
      *args: Arguments to pass to fn.
      **kwargs: Keyworded arguments to pass to fn. Special kwargs listed below:
          _jitter - {int} How many seconds to perturb scheduling time by, in
                    both directions. Defaults to 30s.

    Returns:
      APScheduler Job.
    """
        if self._local_tz:
            schedule_time = schedule_time.to(self._local_tz)
        jitter = kwargs.get('_jitter', 30)
        if jitter:
            jitter_secs = random.randint(-jitter, jitter)
            schedule_time = schedule_time.shift(seconds=jitter_secs)
        kwargs.pop('_jitter', None)

        # APScheduler 2.1.2 doesn't understand timezones.
        return self._scheduler.add_interval_job(fn,
                                                args=args,
                                                kwargs=kwargs,
                                                start_date=schedule_time.naive,
                                                days=1)
예제 #6
0
    def check_status(cls, service_name: str, check_date: arrow.Arrow):
        """Check service scheduled status. The check date should be UTC datetime format."""
        current_status = 'None'
        up_time = 0

        response = {
            'service': service_name,
            'current_status': current_status,
            'next_up_time': up_time
        }

        if not service_name or not check_date:
            return response

        check_date_local = check_date.to(LOCAL_TIMEZONE)
        service_schedule = cls.get_schedules(service_name)
        if service_schedule:
            current_app.logger.debug(f'check date: {check_date_local}')

            current_status = 'True'
            outage_times = cls.get_outage_schedules(service_schedule)
            available_times = cls.get_available_schedules(
                service_schedule, check_date_local)

            for outage in outage_times:
                if check_date_local.date() >= outage[0].date() and (
                        outage[0] < check_date_local < outage[1]):
                    current_app.logger.debug(
                        f'outage date: start {outage[0]} end {outage[1]}')
                    current_status = 'False'
                    up_time = outage[1].timestamp

            if current_status == 'True':
                if 'available' in service_schedule[0]:

                    for available in available_times:
                        if check_date_local.date() == available[0].date() \
                                and (check_date_local < available[0] or check_date_local > available[1]):
                            current_app.logger.debug(
                                f'available date: from {available[0]} to {available[1]}'
                            )

                            current_status = 'False'
                            up_time = available[0].timestamp

            # Add any custom message is provided
            custom = service_schedule[0].get('custom', None)
            if custom is not None:
                if (Status._get_local_outage_time(custom['start']) <=
                        check_date_local < Status._get_local_outage_time(
                            custom['end'])):
                    response['custom_message'] = custom['message']

            response['current_status'] = current_status
            if up_time:
                response['next_up_time'] = up_time
                response['message'] = current_app.config.get(
                    'PAYBC_OUTAGE_MESSAGE')

        return response
예제 #7
0
    def blacklist_project(self, project: db.Project, reset_time: arrow.Arrow):
        """
        Add specified project to `self.ratelimit_queue`, add backend to
        `self.blacklist_dict` and increment `self.ratelimit_counter`.

        Args:
            project: Project to blacklist
            reset_time: Time when the ratelimit will be reset
        """
        with self.blacklist_dict_lock:
            if project.backend not in self.blacklist_dict:
                _log.debug(
                    "Rate limit threshold reached. Adding {} to blacklist.".format(
                        project.backend
                    )
                )
                self.blacklist_dict[project.backend] = reset_time.to("utc").datetime
        with self.ratelimit_queue_lock:
            if project.backend not in self.ratelimit_queue:
                self.ratelimit_queue[project.backend] = []

            self.ratelimit_queue[project.backend].append(project.id)

        with self.ratelimit_counter_lock:
            self.ratelimit_counter += 1
예제 #8
0
    def test_local_to_utc(self):

        arr = Arrow(datetime.now(), tz='local')

        result = arr.to('UTC')

        self.assert_dt_equal(result.datetime, datetime.utcnow())
        self.assert_ts_equal(result.timestamp, time.time())
예제 #9
0
    def test_local_to_utc(self):

        arr = Arrow(datetime.now(), tz='local')

        result = arr.to('UTC')

        self.assert_dt_equal(result.datetime, datetime.utcnow())
        self.assert_ts_equal(result.timestamp, time.time())
예제 #10
0
    def test_eq_utc_converstions(self):

        arr = Arrow(datetime(11, 1, 1))

        utc_1 = arr.utc()
        utc_2 = arr.to('UTC')

        self.assertEqual(utc_1.datetime, utc_2.datetime)
        self.assertEqual(utc_1, utc_2)
예제 #11
0
    def test_eq_utc_converstions(self):

        arr = Arrow(datetime(11, 1, 1))

        utc_1 = arr.utc()
        utc_2 = arr.to('UTC')

        self.assertEqual(utc_1.datetime, utc_2.datetime)
        self.assertEqual(utc_1, utc_2)
예제 #12
0
    def _format_dates(date: arrow.Arrow) -> list[str]:
        """
        Return a list of date strings formatted according to the discord timestamp styles.

        These are used in the description of each style in the dropdown
        """
        date = date.to('utc')
        formatted = [str(int(date.timestamp()))]
        formatted += [
            date.format(format[1]) for format in list(STYLES.values())[1:7]
        ]
        formatted.append(date.humanize())
        return formatted
    def check_status(cls, service_name: str, check_date: arrow.Arrow):
        """Check service scheduled status. The check date should be UTC datetime format."""
        current_status = 'None'
        up_time = 0

        response = {
            'service': service_name,
            'current_status': current_status,
            'next_up_time': up_time
        }

        if not service_name or not check_date:
            return response

        check_date_local = check_date.to(LOCAL_TIMEZONE)
        service_schedule = cls.get_schedules(service_name)
        if service_schedule:
            current_app.logger.debug(f'check date: {check_date_local}')

            current_status = 'True'
            outage_times = cls.get_outage_schedules(service_schedule)
            available_times = cls.get_available_schedules(
                service_schedule, check_date_local)

            for outage in outage_times:
                if check_date_local.date() >= outage[0].date() and (
                        outage[0] < check_date_local < outage[1]):
                    current_app.logger.debug(
                        f'outage date: start {outage[0]} end {outage[1]}')
                    current_status = 'False'
                    up_time = outage[1].timestamp

            if current_status == 'True':
                if 'available' in service_schedule[0]:

                    for available in available_times:
                        if check_date_local.date() == available[0].date() \
                                and (check_date_local < available[0] or check_date_local > available[1]):
                            current_app.logger.debug(
                                f'available date: from {available[0]} to {available[1]}'
                            )

                            current_status = 'False'
                            up_time = available[0].timestamp

            response['current_status'] = current_status
            if up_time:
                response['next_up_time'] = up_time

        return response
예제 #14
0
def is_payable(utc: Arrow) -> bool:
    """Should return True if time is 4:20AM or 4:20PM in Texas"""

    central = utc.to('America/Chicago')

    hour = central.hour
    minute = central.minute

    if minute != 20:
        return False

    if hour not in [4, 16]:
        return False

    return True
예제 #15
0
파일: views.py 프로젝트: messa/python.cz
def format_dt_filter(dt: Arrow, fmt):
    return dt.to('Europe/Prague').strftime(fmt)
예제 #16
0
def quickembed(name: str, desc: str, begin: Arrow, end: Arrow) -> Embed:
    return Embed(title=name, description=html2md(desc)).add_field(
        name="Start",
        value=begin.to('local').format(arrow.FORMAT_COOKIE)).add_field(
            name="End", value=end.to('local').format(arrow.FORMAT_COOKIE))
예제 #17
0
class ArrowTests(BaseArrowTests):

    def setUp(self):
        super(ArrowTests, self).setUp()

        self.arrow = Arrow(datetime.utcnow(), tz=tz.tzutc())

    def test_str(self):

        expected = '{0} UTC'.format(self.arrow._datetime.isoformat())

        self.assertEqual(self.arrow.__str__(), expected)

    def test_repr(self):

        expected = '<Arrow({0} UTC)>'.format(self.arrow._datetime.isoformat())

        self.assertEqual(self.arrow.__repr__(), expected)

    def test_tz(self):

        self.arrow._timezone = self.utc

        self.assertEqual(self.arrow.tz, self.utc)

    def test_to(self):

        self.arrow._datetime = datetime.utcnow().replace(tzinfo=self.utc.tzinfo)
        self.arrow._timezone = self.utc

        result = self.arrow.to('local')

        self.assert_dt_equal(result.datetime, self.arrow._datetime.astimezone(self.local.tzinfo))

    def test_utc_utc(self):

        self.arrow._datetime = datetime.now().replace(tzinfo=self.local.tzinfo)
        self.arrow._timezone = self.local

        result = self.arrow.utc()

        self.assert_dt_equal(result.datetime, self.arrow._datetime.astimezone(self.utc.tzinfo))

    def test_utc_local(self):

        self.arrow._datetime = datetime.utcnow().replace(tzinfo=self.utc.tzinfo)
        self.arrow._timezone = self.utc

        result = self.arrow.utc()

        self.assert_dt_equal(result.datetime, self.arrow._datetime.astimezone(self.utc.tzinfo))

    def test_datetime(self):

        dt = datetime.utcnow().replace(tzinfo=tz.tzutc())

        self.arrow._datetime = dt
        self.arrow._timezone = self.utc

        result = self.arrow.datetime

        self.assertEqual(result, dt)

    def test_timestamp(self):

        dt = datetime.utcnow()

        self.arrow._datetime = dt
        self.arrow._timezone = self.utc

        result = self.arrow.timestamp

        self.assertEqual(result, calendar.timegm(dt.timetuple()))

    def test_parse_int(self):

        dt, timezone = self.arrow._parse(int(time.time()), self.utc)

        self.assert_dt_equal(dt, datetime.utcnow())

    def test_parse_float_utc(self):

        dt, timezone = self.arrow._parse(time.time(), self.utc)

        self.assert_dt_equal(dt, datetime.utcnow())

    def test_parse_float_local(self):

        dt, timezone = self.arrow._parse(time.time(), self.local)

        self.assert_dt_equal(dt, datetime.now())

    def test_parse_str_float_utc(self):

        dt, timezone = self.arrow._parse(str(time.time()), self.utc)

        self.assert_dt_equal(dt, datetime.utcnow())

    def test_parse_str_int_utc(self):

        dt, timezone = self.arrow._parse(str(int(time.time())), self.utc)

        self.assert_dt_equal(dt, datetime.utcnow())

    def test_parse_str_float_local(self):

        dt, timezone = self.arrow._parse(str(time.time()), self.local)

        self.assert_dt_equal(dt, datetime.now())

    def test_parse_str_int_local(self):

        dt, timezone = self.arrow._parse(str(int(time.time())), self.local)
        
        self.assert_dt_equal(dt, datetime.now())

    def test_parse_parse_str(self):

        with self.assertRaises(ValueError):
            self.arrow._parse('abcdefg', self.utc)

    def test_parse_unrecognized(self):

        with self.assertRaises(ValueError):
            self.arrow._parse(object, self.utc)
예제 #18
0
def change_dt_utc_to_local(dt: arrow.Arrow) -> arrow.Arrow:
    """
    change UTC date time to local time zone Europe/Paris
    """
    return dt.to('Europe/Paris')
예제 #19
0
파일: views.py 프로젝트: waltros/python.cz
def format_dt_filter(dt: Arrow, fmt):
    return dt.to('Europe/Prague').strftime(fmt)
예제 #20
0
파일: views.py 프로젝트: waltros/python.cz
def format_dt_iso_filter(dt: Arrow):
    return dt.to('Europe/Prague').isoformat()
예제 #21
0
class ArrowTests(BaseArrowTests):
    def setUp(self):
        super(ArrowTests, self).setUp()

        self.arrow = Arrow(datetime.utcnow(), tz='UTC')

    def test_str(self):

        expected = '{0}.{1} +00:00 (UTC)'.format(
            time.strftime('%x %X', self.arrow.datetime.timetuple()),
            self.arrow.datetime.microsecond)

        self.assertEqual(self.arrow.__str__(), expected)

    def test_repr(self):

        expected = 'Arrow({0}.{1} +00:00 (UTC))'.format(
            time.strftime('%x %X', self.arrow.datetime.timetuple()),
            self.arrow.datetime.microsecond)

        self.assertEqual(self.arrow.__repr__(), expected)

    def test_tz(self):

        self.arrow._timezone = self.utc

        self.assertEqual(self.arrow.tz, self.utc)

    def test_to(self):

        self.arrow._datetime = datetime.utcnow().replace(
            tzinfo=self.utc.tzinfo)
        self.arrow._timezone = self.utc

        result = self.arrow.to('local')

        self.assert_dt_equal(
            result.datetime,
            self.arrow._datetime.astimezone(self.local.tzinfo))

    def test_utc_utc(self):

        self.arrow._datetime = datetime.now().replace(tzinfo=self.local.tzinfo)
        self.arrow._timezone = self.local

        result = self.arrow.utc()

        self.assert_dt_equal(result.datetime,
                             self.arrow._datetime.astimezone(self.utc.tzinfo))

    def test_utc_local(self):

        self.arrow._datetime = datetime.utcnow().replace(
            tzinfo=self.utc.tzinfo)
        self.arrow._timezone = self.utc

        result = self.arrow.utc()

        self.assert_dt_equal(result.datetime,
                             self.arrow._datetime.astimezone(self.utc.tzinfo))

    def test_datetime(self):

        dt = datetime.utcnow().replace(tzinfo=tz.tzutc())

        self.arrow._datetime = dt
        self.arrow._timezone = self.utc

        result = self.arrow.datetime

        self.assertEqual(result, dt)

    def test_timestamp_utc(self):

        dt = datetime.utcnow()

        self.arrow._datetime = dt
        self.arrow._timezone = self.utc

        result = self.arrow.timestamp

        self.assertEqual(result, calendar.timegm(dt.timetuple()))

    def test_timestamp_local(self):

        dt = datetime.now()

        self.arrow._datetime = dt
        self.arrow._timezone = self.local

        result = self.arrow.timestamp

        self.assertEqual(result, time.mktime(dt.timetuple()))

    def test_get_datetime_int(self):

        result = self.arrow._get_datetime(int(time.time()), self.utc)

        self.assert_dt_equal(result, datetime.utcnow())

    def test_get_datetime_float_utc(self):

        result = self.arrow._get_datetime(time.time(), self.utc)

        self.assert_dt_equal(result, datetime.utcnow())

    def test_get_datetime_float_local(self):

        result = self.arrow._get_datetime(time.time(), self.local)

        self.assert_dt_equal(result, datetime.now())

    def test_get_datetime_str_float_utc(self):

        result = self.arrow._get_datetime(str(time.time()), self.utc)

        self.assert_dt_equal(result, datetime.utcnow())

    def test_get_datetime_str_int_utc(self):

        result = self.arrow._get_datetime(str(int(time.time())), self.utc)

        self.assert_dt_equal(result, datetime.utcnow())

    def test_get_datetime_str_float_local(self):

        result = self.arrow._get_datetime(str(time.time()), self.local)

        self.assert_dt_equal(result, datetime.now())

    def test_get_datetime_str_int_local(self):

        result = self.arrow._get_datetime(str(int(time.time())), self.local)

        self.assert_dt_equal(result, datetime.now())

    def test_get_datetime_datetime(self):

        dt = datetime.utcnow()

        result = self.arrow._get_datetime(dt, self.utc)

        self.assert_dt_equal(result, dt)

    def test_get_datetime_parse_str(self):

        with self.assertRaises(RuntimeError):
            self.arrow._get_datetime('abcdefg', self.utc)

    def test_get_datetime_unrecognized(self):

        with self.assertRaises(RuntimeError):
            self.arrow._get_datetime(object, self.utc)
예제 #22
0
파일: views.py 프로젝트: messa/python.cz
def format_dt_iso_filter(dt: Arrow):
    return dt.to('Europe/Prague').isoformat()