From 02607bae97597c09e174bbb28aeb93378cf9268d Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Sun, 12 Jan 2020 14:05:58 +0100 Subject: [PATCH] Dumb Python won't convert perfectly finely formatted ISO dates unless I do some manual conversion --- platypush/backend/travisci.py | 38 ++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/platypush/backend/travisci.py b/platypush/backend/travisci.py index d1946566d..a190ac970 100644 --- a/platypush/backend/travisci.py +++ b/platypush/backend/travisci.py @@ -1,3 +1,4 @@ +import datetime from typing import Optional from platypush.backend import Backend @@ -16,7 +17,10 @@ class TravisciBackend(Backend): Triggers: - - :class:`platypush.message.event.foursquare.FoursquareCheckinEvent` when a new check-in occurs. + - :class:`platypush.message.event.travisci.TravisciBuildPassedEvent` when the build of a project owned by + the user passes. + - :class:`platypush.message.event.travisci.TravisciBuildFailedEvent` when the build of a project owned by + the user fails. """ @@ -29,9 +33,28 @@ class TravisciBackend(Backend): super().__init__(*args, poll_seconds=poll_seconds, **kwargs) self._last_build_finished_at = None + @staticmethod + def _convert_iso_date_to_shitty_python_datetime(d): + """ + Python's datetime is dumb and shitty, and it won't understand dates in formats such as '2020-01-01:00:00:00Z', + even though they're perfectly fine formatted ISO dates. + """ + if isinstance(d, str): + if d.endswith('Z'): + d = d[:-1] + '+00:00' + return datetime.datetime.fromisoformat(d) + + if isinstance(d, int) or isinstance(d, float): + return datetime.datetime.fromtimestamp(d) + + assert isinstance(d, datetime.datetime) + return d + def __enter__(self): - self._last_build_finished_at = int(get_plugin('variable').get(self._last_build_finished_at_varname). - output.get(self._last_build_finished_at_varname) or 0) + self._last_build_finished_at = self._convert_iso_date_to_shitty_python_datetime( + get_plugin('variable').get(self._last_build_finished_at_varname). + output.get(self._last_build_finished_at_varname) or 0) + self.logger.info('Started Travis-CI backend') def loop(self): @@ -40,7 +63,7 @@ class TravisciBackend(Backend): return last_build = builds[0] - last_build_finished_at = last_build.get('finished_at', 0) + last_build_finished_at = self._convert_iso_date_to_shitty_python_datetime(last_build.get('finished_at', 0)) if self._last_build_finished_at and last_build_finished_at <= self._last_build_finished_at: return @@ -64,10 +87,11 @@ class TravisciBackend(Backend): commit_id=last_build.get('commit', {}).get('id'), commit_sha=last_build.get('commit', {}).get('sha'), commit_message=last_build.get('commit', {}).get('message'), - committed_at=last_build.get('commit', {}).get('committed_at'), + committed_at=self._convert_iso_date_to_shitty_python_datetime( + last_build.get('commit', {}).get('committed_at')), created_by=last_build.get('created_by', {}).get('login'), - started_at=last_build.get('started_at'), - finished_at=last_build.get('finished_at')) + started_at=self._convert_iso_date_to_shitty_python_datetime(last_build.get('started_at')), + finished_at=self._convert_iso_date_to_shitty_python_datetime(last_build.get('finished_at'))) self.bus.post(evt) self._last_build_finished_at = last_build_finished_at