Skip to content

Commit

Permalink
Merge pull request #122 from timvink/utctimestamp
Browse files Browse the repository at this point in the history
Support Utctimestamp in python 3.12
  • Loading branch information
timvink authored Oct 15, 2023
2 parents 6150fad + 4bf713a commit 4d55756
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 305 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/pythonpublish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: '0'
- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/scheduled_unittests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@master
with:
python-version: 3.9
python-version: 3.10

- name: Install dependencies
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/unittests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ jobs:
name: Run unit tests with codecov upload
runs-on: ${{ matrix.os }}
env:
USING_COVERAGE: '3.7'
USING_COVERAGE: '3.10'
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: [3.7, 3.8, 3.9, "3.10"]
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@master

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/unittests_codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ jobs:
name: Run unit tests with codecov upload
runs-on: ${{ matrix.os }}
env:
USING_COVERAGE: '3.7'
USING_COVERAGE: '3.10'
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: [3.7, 3.8, 3.9, "3.10"]
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@master

Expand Down
47 changes: 47 additions & 0 deletions mkdocs_git_revision_date_localized_plugin/dates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

from babel.dates import format_date, get_timezone

from datetime import datetime, timezone
from typing import Any, Dict


def get_date_formats(
unix_timestamp: float,
locale: str = "en",
time_zone: str = "UTC",
custom_format: str = "%d. %B %Y"
) -> Dict[str, Any]:
"""
Calculate different date formats / types.
Args:
unix_timestamp (float): A timestamp in seconds since 1970. Assumes UTC.
locale (str): Locale code of language to use. Defaults to 'en'.
time_zone (str): Timezone database name (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
custom_format (str): strftime format specifier for the 'custom' type
Returns:
dict: Different date formats.
"""
assert time_zone is not None
assert locale is not None

utc_revision_date = datetime.fromtimestamp(int(unix_timestamp), tz=timezone.utc)
loc_revision_date = utc_revision_date.replace(
tzinfo=get_timezone("UTC")
).astimezone(get_timezone(time_zone))

return {
"date": format_date(loc_revision_date, format="long", locale=locale),
"datetime": " ".join(
[
format_date(loc_revision_date, format="long", locale=locale),
loc_revision_date.strftime("%H:%M:%S"),
]
),
"iso_date": loc_revision_date.strftime("%Y-%m-%d"),
"iso_datetime": loc_revision_date.strftime("%Y-%m-%d %H:%M:%S"),
"timeago": '<span class="timeago" datetime="%s" locale="%s"></span>' % (loc_revision_date.isoformat(), locale),
"custom": loc_revision_date.strftime(custom_format),
}

45 changes: 4 additions & 41 deletions mkdocs_git_revision_date_localized_plugin/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
import logging
import os
import time
from datetime import datetime

from mkdocs_git_revision_date_localized_plugin.ci import raise_ci_warnings
from mkdocs_git_revision_date_localized_plugin.dates import get_date_formats


from babel.dates import format_date, get_timezone
from git import (
Repo,
Git,
Expand All @@ -16,7 +16,7 @@
NoSuchPathError,
)

from typing import Any, Dict
from typing import Dict

logger = logging.getLogger("mkdocs.plugins")

Expand Down Expand Up @@ -44,43 +44,6 @@ def _get_repo(self, path: str) -> Git:

return self.repo_cache[path]

@staticmethod
def _date_formats(
unix_timestamp: float, locale: str = "en", time_zone: str = "UTC", custom_format: str = "%d. %B %Y"
) -> Dict[str, Any]:
"""
Calculate different date formats / types.
Args:
unix_timestamp (float): A timestamp in seconds since 1970.
locale (str): Locale code of language to use. Defaults to 'en'.
time_zone (str): Timezone database name (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
custom_format (str): strftime format specifier for the 'custom' type
Returns:
dict: Different date formats.
"""
assert time_zone is not None
assert locale is not None

utc_revision_date = datetime.utcfromtimestamp(int(unix_timestamp))
loc_revision_date = utc_revision_date.replace(
tzinfo=get_timezone("UTC")
).astimezone(get_timezone(time_zone))

return {
"date": format_date(loc_revision_date, format="long", locale=locale),
"datetime": " ".join(
[
format_date(loc_revision_date, format="long", locale=locale),
loc_revision_date.strftime("%H:%M:%S"),
]
),
"iso_date": loc_revision_date.strftime("%Y-%m-%d"),
"iso_datetime": loc_revision_date.strftime("%Y-%m-%d %H:%M:%S"),
"timeago": '<span class="timeago" datetime="%s" locale="%s"></span>' % (loc_revision_date.isoformat(), locale),
"custom": loc_revision_date.strftime(custom_format),
}

def get_git_commit_timestamp(
self,
Expand Down Expand Up @@ -201,7 +164,7 @@ def get_date_formats_for_timestamp(
Returns:
dict: Localized date variants.
"""
date_formats = self._date_formats(
date_formats = get_date_formats(
unix_timestamp=commit_timestamp,
time_zone=self.config.get("timezone"),
locale=locale,
Expand Down
17 changes: 4 additions & 13 deletions tests/fixtures/i18n/mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,13 @@ markdown_extensions:
plugins:
- search
- i18n:
default_language: !ENV [DEFAULT_LANGUAGE, "en"]
default_language_only: !ENV [DEFAULT_LANGUAGE_ONLY, false]
languages:
default:
name: Default (en)
build: true
en:
- locale: en
name: English
build: true
site_name: "MkDocs static i18n plugin demo (en)"
fr:
default: true
- locale: fr
name: Français
build: true
site_name: "Démo du plugin MkDocs static i18n (fr)"
nav_translations:
fr:
Topic1: Sujet1
Topic2: Sujet2

- git-revision-date-localized
18 changes: 5 additions & 13 deletions tests/fixtures/i18n/mkdocs_wrong_order.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,13 @@ plugins:
- search
- git-revision-date-localized
- i18n:
default_language: !ENV [DEFAULT_LANGUAGE, "en"]
default_language_only: !ENV [DEFAULT_LANGUAGE_ONLY, false]
languages:
default:
name: Default (en)
build: true
en:
- locale: en
name: English
build: true
site_name: "MkDocs static i18n plugin demo (en)"
fr:
default: true
- locale: fr
name: Français
build: true
site_name: "Démo du plugin MkDocs static i18n (fr)"
nav_translations:
fr:
Topic1: Sujet1
Topic2: Sujet2


24 changes: 9 additions & 15 deletions tests/test_builds.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
# package module
from mkdocs_git_revision_date_localized_plugin.util import Util
from mkdocs_git_revision_date_localized_plugin.ci import commit_count
from mkdocs_git_revision_date_localized_plugin.dates import get_date_formats

# ##################################
# ######## Globals #################
Expand Down Expand Up @@ -147,6 +148,7 @@ def setup_commit_history(testproject_path):
testproject_path = str(testproject_path)

repo = git.Repo.init(testproject_path, bare=False)
repo.git.checkout("-b", "master")
author = "Test Person <testtest@gmail.com>"


Expand Down Expand Up @@ -342,18 +344,6 @@ def validate_mkdocs_file(temp_path: str, mkdocs_yml_file: str):
# ##################################


def test_date_formats():
u = Util()
assert u._date_formats(1582397529) == {
"date": "February 22, 2020",
"datetime": "February 22, 2020 18:52:09",
"iso_date": "2020-02-22",
"iso_datetime": "2020-02-22 18:52:09",
"timeago": '<span class="timeago" datetime="2020-02-22T18:52:09+00:00" locale="en"></span>',
"custom": '22. February 2020',
}


@pytest.mark.parametrize("mkdocs_file", MKDOCS_FILES, ids=lambda x: f"mkdocs file: {x}")
def test_tags_are_replaced(tmp_path, mkdocs_file):
"""
Expand Down Expand Up @@ -390,7 +380,7 @@ def test_tags_are_replaced(tmp_path, mkdocs_file):

# the revision date was in 'setup_commit_history' was set to 1642911026 (Sun Jan 23 2022 04:10:26 GMT+0000)
# Assert {{ git_revision_date_localized }} is replaced
date_formats_revision_date = Util()._date_formats(1642911026,
date_formats_revision_date = get_date_formats(1642911026,
locale=plugin_config.get("locale"),
time_zone=plugin_config.get("timezone"),
custom_format=plugin_config.get("custom_format")
Expand All @@ -403,7 +393,7 @@ def test_tags_are_replaced(tmp_path, mkdocs_file):

# The last site revision was set in setup_commit_history to 1643911026 (Thu Feb 03 2022 17:57:06 GMT+0000)
# Assert {{ git_site_revision_date_localized }} is replaced
date_formats_revision_date = Util()._date_formats(1643911026,
date_formats_revision_date = get_date_formats(1643911026,
locale=plugin_config.get("locale"),
time_zone=plugin_config.get("timezone"),
custom_format=plugin_config.get("custom_format")
Expand All @@ -416,7 +406,7 @@ def test_tags_are_replaced(tmp_path, mkdocs_file):
# Note {{ git_creation_date_localized }} is only replaced when configured in the config
if plugin_config.get("enable_creation_date"):
# The creation of page_with_tag.md was set in setup_commit_history to 1500854705 ( Mon Jul 24 2017 00:05:05 GMT+0000 )
date_formats_revision_date = Util()._date_formats(1500854705,
date_formats_revision_date = get_date_formats(1500854705,
locale=plugin_config.get("locale"),
time_zone=plugin_config.get("timezone"),
custom_format=plugin_config.get("custom_format")
Expand Down Expand Up @@ -628,6 +618,10 @@ def test_low_fetch_depth(tmp_path, caplog):

# Clone the local repo with fetch depth of 1
repo = git.Repo.init(cloned_folder, bare=False)
try:
repo.heads.main.rename("master", force=True)
except:
pass
origin = repo.create_remote("origin", str(testproject_path))
origin.fetch(depth=1, prune=True)
repo.create_head(
Expand Down
72 changes: 72 additions & 0 deletions tests/test_dates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import pytest
from datetime import datetime, timezone
from babel.dates import get_timezone

from mkdocs_git_revision_date_localized_plugin.dates import get_date_formats



def test_get_dates():
# Test with default arguments
expected_output = {
"date": "January 1, 1970",
"datetime": "January 1, 1970 00:00:00",
"iso_date": "1970-01-01",
"iso_datetime": "1970-01-01 00:00:00",
"timeago": '<span class="timeago" datetime="1970-01-01T00:00:00+00:00" locale="en"></span>',
"custom": "01. January 1970"
}
assert get_date_formats(0) == expected_output

# Test with custom arguments
expected_output = {
"date": "January 1, 1970",
"datetime": "January 1, 1970 00:00:00",
"iso_date": "1970-01-01",
"iso_datetime": "1970-01-01 00:00:00",
"timeago": '<span class="timeago" datetime="1970-01-01T00:00:00+00:00" locale="en"></span>',
"custom": "01. Jan 1970"
}
assert get_date_formats(0, locale="en", time_zone="UTC", custom_format="%d. %b %Y") == expected_output

# Test with non-UTC timezone
expected_output = {
"date": "January 1, 1970",
"datetime": "January 1, 1970 02:00:00",
"iso_date": "1970-01-01",
"iso_datetime": "1970-01-01 02:00:00",
"timeago": '<span class="timeago" datetime="1970-01-01T02:00:00+01:00" locale="en"></span>',
"custom": "01. January 1970"
}
loc_dt = datetime(1970, 1, 1, 1, 0, 0, tzinfo=get_timezone("Europe/Berlin"))
unix_timestamp = loc_dt.replace(tzinfo=timezone.utc).timestamp()
assert get_date_formats(unix_timestamp, time_zone="Europe/Berlin") == expected_output

# Test with missing arguments
with pytest.raises(TypeError):
get_date_formats() # noqa

# Test with invalid timezone
with pytest.raises(LookupError):
get_date_formats(0, time_zone="Invalid/Timezone")

# Test with more recent date
expected_output = {
'date': 'October 15, 2023',
'datetime': 'October 15, 2023 13:32:04',
'iso_date': '2023-10-15',
'iso_datetime': '2023-10-15 13:32:04',
'timeago': '<span class="timeago" datetime="2023-10-15T13:32:04+02:00" locale="en"></span>',
'custom': '15. October 2023'
}
assert get_date_formats(1697369524, time_zone="Europe/Amsterdam") == expected_output


assert get_date_formats(1582397529) == {
"date": "February 22, 2020",
"datetime": "February 22, 2020 18:52:09",
"iso_date": "2020-02-22",
"iso_datetime": "2020-02-22 18:52:09",
"timeago": '<span class="timeago" datetime="2020-02-22T18:52:09+00:00" locale="en"></span>',
"custom": '22. February 2020',
}
Loading

0 comments on commit 4d55756

Please sign in to comment.