Skip to content

Commit f445948

Browse files
authored
Merge pull request #689 from sdispater/refactor/codspeed
Add benchmarks to track performances
2 parents b20874b + 77de7a4 commit f445948

File tree

8 files changed

+712
-507
lines changed

8 files changed

+712
-507
lines changed

.github/workflows/codspeed.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: codspeed
2+
3+
on:
4+
push:
5+
branches:
6+
- "main" # or "master"
7+
pull_request:
8+
# `workflow_dispatch` allows CodSpeed to trigger backtest
9+
# performance analysis in order to generate initial data.
10+
workflow_dispatch:
11+
12+
jobs:
13+
benchmarks:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v3
17+
- uses: actions/setup-python@v3
18+
with:
19+
python-version: "3.9"
20+
21+
- name: Get full Python version
22+
id: full-python-version
23+
run: |
24+
echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))")
25+
26+
- name: Install poetry
27+
run: |
28+
curl -fsS https://install.python-poetry.org | python - --preview -y
29+
30+
- name: Update PATH
31+
if: ${{ matrix.os != 'Windows' }}
32+
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
33+
34+
- name: Update Path for Windows
35+
if: ${{ matrix.os == 'Windows' }}
36+
run: echo "$APPDATA\Python\Scripts" >> $GITHUB_PATH
37+
38+
- name: Configure poetry
39+
run: poetry config virtualenvs.create false
40+
41+
- name: Install dependencies
42+
run: poetry install --only main --only test --only benchmark -vvv
43+
44+
- name: Run benchmarks
45+
uses: CodSpeedHQ/action@v1
46+
with:
47+
token: ${{ secrets.CODSPEED_TOKEN }}
48+
run: pytest tests/ --codspeed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ repos:
2323
- id: black
2424

2525
- repo: https://github.com/pycqa/isort
26-
rev: 5.10.1
26+
rev: 5.12.0
2727
hooks:
2828
- id: isort
2929
args: [ --add-import, from __future__ import annotations, --lines-after-imports, "-1" ]

pendulum/parsing/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,6 @@ def _parse_iso8601_interval(text: str) -> _Interval:
231231
return _Interval(
232232
cast(datetime, start), cast(datetime, end), cast(Duration, duration)
233233
)
234+
235+
236+
__all__ = ["parse", "parse_iso8601"]

poetry.lock

Lines changed: 569 additions & 505 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ importlib-resources = { version = "^5.9.0", python = ">=3.7,<3.9" }
3535

3636
[tool.poetry.group.test.dependencies]
3737
pytest = "^7.1.2"
38-
pytest-cov = "^3.0.0"
3938
pytz = ">=2022.1"
4039
time-machine = "^2.7.1"
40+
pytest-benchmark = "^4.0.0"
4141

4242
[tool.poetry.group.doc.dependencies]
4343
mkdocs = "^1.0"
@@ -64,6 +64,9 @@ optional = true
6464
meson = "^0.63.2"
6565
ninja = "^1.10.2.3"
6666

67+
[tool.poetry.group.benchmark.dependencies]
68+
pytest-codspeed = "^1.2.2"
69+
6770
[tool.poetry.build]
6871
generate-setup-file = false
6972
script = "build.py"

tests/benchmarks/__init__.py

Whitespace-only changes.

tests/benchmarks/test_format.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING
4+
5+
if TYPE_CHECKING:
6+
from pytest_benchmark.fixture import BenchmarkFixture
7+
8+
import pendulum
9+
10+
from pendulum.formatting.formatter import Formatter
11+
12+
13+
def test_format(benchmark: BenchmarkFixture) -> None:
14+
f = Formatter()
15+
d = pendulum.datetime(2016, 8, 28, 7, 3, 6, 123456)
16+
17+
@benchmark # type: ignore[misc]
18+
def benchmark_() -> None:
19+
f.format(d, "S")
20+
f.format(d, "SS")
21+
f.format(d, "SSS")
22+
f.format(d, "SSSS")
23+
f.format(d, "SSSSS")
24+
f.format(d, "SSSSSS")
25+
26+
f.format(d, "zz")
27+
f.format(d, "z")
28+
f.format(d, "ZZ")
29+
f.format(d, "Z")
30+
31+
f.format(d, "LT")
32+
f.format(d, "LTS")
33+
f.format(d, "L")
34+
f.format(d, "LL")
35+
f.format(d, "LLL")
36+
f.format(d, "LLLL")
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
5+
from pendulum.parsing.iso8601 import parse_iso8601
6+
7+
8+
@pytest.mark.benchmark(group="Parsing")
9+
def test_parse_iso8601() -> None:
10+
# Date
11+
parse_iso8601("2016")
12+
parse_iso8601("2016-10")
13+
parse_iso8601("2016-10-06")
14+
parse_iso8601("20161006")
15+
16+
# Time
17+
parse_iso8601("201610")
18+
19+
# Datetime
20+
parse_iso8601("2016-10-06T12:34:56.123456")
21+
parse_iso8601("2016-10-06T12:34:56.123")
22+
parse_iso8601("2016-10-06T12:34:56.000123")
23+
parse_iso8601("2016-10-06T12")
24+
parse_iso8601("2016-10-06T123456")
25+
parse_iso8601("2016-10-06T123456.123456")
26+
parse_iso8601("20161006T123456.123456")
27+
parse_iso8601("20161006 123456.123456")
28+
29+
# Datetime with offset
30+
parse_iso8601("2016-10-06T12:34:56.123456+05:30")
31+
parse_iso8601("2016-10-06T12:34:56.123456+0530")
32+
parse_iso8601("2016-10-06T12:34:56.123456-05:30")
33+
parse_iso8601("2016-10-06T12:34:56.123456-0530")
34+
parse_iso8601("2016-10-06T12:34:56.123456+05")
35+
parse_iso8601("2016-10-06T12:34:56.123456-05")
36+
parse_iso8601("20161006T123456,123456-05")
37+
parse_iso8601("2016-10-06T12:34:56.123456789+05:30")
38+
39+
# Ordinal date
40+
parse_iso8601("2012-007")
41+
parse_iso8601("2012007")
42+
parse_iso8601("2017-079")
43+
44+
# Week date
45+
parse_iso8601("2012-W05")
46+
parse_iso8601("2008-W39-6")
47+
parse_iso8601("2009-W53-7")
48+
parse_iso8601("2009-W01-1")
49+
50+
# Week date wth time
51+
parse_iso8601("2008-W39-6T09")

0 commit comments

Comments
 (0)