diff --git a/flagsmith/mappers.py b/flagsmith/mappers.py index 7564a89..5e6156d 100644 --- a/flagsmith/mappers.py +++ b/flagsmith/mappers.py @@ -28,6 +28,7 @@ StreamEvent, TraitConfig, ) +from flagsmith.utils.datetime import fromisoformat OverrideKey = typing.Tuple[ int, @@ -69,9 +70,7 @@ def map_sse_event_to_stream_event(event: sseclient.Event) -> StreamEvent: def map_environment_document_to_environment_updated_at( environment_document: dict[str, typing.Any], ) -> datetime: - if ( - updated_at := datetime.fromisoformat(environment_document["updated_at"]) - ).tzinfo is None: + if (updated_at := fromisoformat(environment_document["updated_at"])).tzinfo is None: return updated_at.replace(tzinfo=timezone.utc) return updated_at.astimezone(tz=timezone.utc) diff --git a/flagsmith/utils/datetime.py b/flagsmith/utils/datetime.py new file mode 100644 index 0000000..4df38fb --- /dev/null +++ b/flagsmith/utils/datetime.py @@ -0,0 +1,10 @@ +import sys + +if sys.version_info >= (3, 11): + from datetime import datetime + + fromisoformat = datetime.fromisoformat +else: + import iso8601 + + fromisoformat = iso8601.parse_date diff --git a/poetry.lock b/poetry.lock index 4d9f539..8fa5407 100644 --- a/poetry.lock +++ b/poetry.lock @@ -341,6 +341,19 @@ files = [ {file = "iregexp_check-0.1.4.tar.gz", hash = "sha256:a98e77dd2d9fc91db04f8d9f295f3d69e402813bac5413f22e5866958a902bc1"}, ] +[[package]] +name = "iso8601" +version = "2.1.0" +description = "Simple module to parse ISO 8601 dates" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main"] +markers = "python_version < \"3.11\"" +files = [ + {file = "iso8601-2.1.0-py3-none-any.whl", hash = "sha256:aac4145c4dcb66ad8b648a02830f5e2ff6c24af20f4f482689be402db2429242"}, + {file = "iso8601-2.1.0.tar.gz", hash = "sha256:6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df"}, +] + [[package]] name = "jsonpath-rfc9535" version = "0.1.6" @@ -947,4 +960,4 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [metadata] lock-version = "2.1" python-versions = ">=3.9,<4" -content-hash = "cfe10e9fdb3ea780c9d8fae0f9cf8b92b3a37356be13633f655d910f71e0035e" +content-hash = "22ba0b94f5228702454729e8f3962ecb316d1caf4d69f47df478c04735c67ab2" diff --git a/pyproject.toml b/pyproject.toml index 95ca3fe..f773994 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ packages = [{ include = "flagsmith" }] [tool.poetry.dependencies] flagsmith-flag-engine = "^10.0.0" +iso8601 = { version = "^2.1.0", python = "<3.11" } python = ">=3.9,<4" requests = "^2.32.3" requests-futures = "^1.0.1" diff --git a/tests/data/environment.json b/tests/data/environment.json index ea63981..0075f01 100644 --- a/tests/data/environment.json +++ b/tests/data/environment.json @@ -54,13 +54,13 @@ "enabled": true } ], - "updated_at": "2023-07-14 16:12:00.000000", + "updated_at": "2023-07-14T16:12:00.000000Z", "identity_overrides": [ { "identifier": "overridden-id", "identity_uuid": "0f21cde8-63c5-4e50-baca-87897fa6cd01", "created_date": "2019-08-27T14:53:45.698555Z", - "updated_at": "2023-07-14 16:12:00.000000", + "updated_at": "2023-07-14T16:12:00.000000Z", "environment_api_key": "B62qaMZNwfiqT76p38ggrQ", "identity_features": [ {