codex-services 0.1.0__tar.gz → 0.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. codex_services-0.1.3/.github/workflows/ci.yml +80 -0
  2. {codex_services-0.1.0 → codex_services-0.1.3}/.github/workflows/docs.yml +15 -15
  3. {codex_services-0.1.0 → codex_services-0.1.3}/.github/workflows/publish.yml +7 -10
  4. {codex_services-0.1.0 → codex_services-0.1.3}/.gitignore +1 -0
  5. codex_services-0.1.3/.python-version +1 -0
  6. codex_services-0.1.3/CHANGELOG.md +62 -0
  7. {codex_services-0.1.0 → codex_services-0.1.3}/PKG-INFO +15 -5
  8. {codex_services-0.1.0 → codex_services-0.1.3}/README.md +12 -0
  9. {codex_services-0.1.0 → codex_services-0.1.3}/pyproject.toml +13 -6
  10. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/slot_master/modes.py +1 -9
  11. codex_services-0.1.3/tests/integration/test_booking_components_integration.py +593 -0
  12. codex_services-0.1.3/tests/integration/test_calendar_integration.py +165 -0
  13. codex_services-0.1.3/tests/integration/test_chain_finder_integration.py +928 -0
  14. codex_services-0.1.3/tools/dev/check.py +13 -0
  15. codex_services-0.1.3/uv.lock +1546 -0
  16. codex_services-0.1.0/.github/workflows/ci.yml +0 -76
  17. codex_services-0.1.0/CHANGELOG.md +0 -25
  18. codex_services-0.1.0/tests/integration/test_chain_finder_integration.py +0 -58
  19. codex_services-0.1.0/tools/dev/check.py +0 -28
  20. {codex_services-0.1.0 → codex_services-0.1.3}/.pre-commit-config.yaml +0 -0
  21. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/index.md +0 -0
  22. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/shared/calculator.md +0 -0
  23. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/shared/dto.md +0 -0
  24. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/shared/exceptions.md +0 -0
  25. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/shared/interfaces.md +0 -0
  26. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/shared/validators.md +0 -0
  27. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/slot_master/api.md +0 -0
  28. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/slot_master/chain_finder.md +0 -0
  29. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/slot_master/dto.md +0 -0
  30. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/slot_master/index.md +0 -0
  31. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/slot_master/modes.md +0 -0
  32. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/booking/slot_master/scorer.md +0 -0
  33. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/calendar/engine.md +0 -0
  34. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/calendar/index.md +0 -0
  35. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/api/index.md +0 -0
  36. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/architecture/README.md +0 -0
  37. {codex_services-0.1.0 → codex_services-0.1.3}/docs/en/architecture/booking_engine.md +0 -0
  38. {codex_services-0.1.0 → codex_services-0.1.3}/docs/evolution/changelog.md +0 -0
  39. {codex_services-0.1.0 → codex_services-0.1.3}/docs/index.md +0 -0
  40. {codex_services-0.1.0 → codex_services-0.1.3}/docs/ru/architecture/README.md +0 -0
  41. {codex_services-0.1.0 → codex_services-0.1.3}/docs/ru/architecture/booking_engine.md +0 -0
  42. {codex_services-0.1.0 → codex_services-0.1.3}/docs/stylesheets/extra.css +0 -0
  43. {codex_services-0.1.0 → codex_services-0.1.3}/mkdocs.yml +0 -0
  44. {codex_services-0.1.0 → codex_services-0.1.3}/project_structure.txt +0 -0
  45. {codex_services-0.1.0 → codex_services-0.1.3}/scripts/generate_api_docs.py +0 -0
  46. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/__init__.py +0 -0
  47. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/__init__.py +0 -0
  48. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/_shared/__init__.py +0 -0
  49. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/_shared/calculator.py +0 -0
  50. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/_shared/dto.py +0 -0
  51. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/_shared/exceptions.py +0 -0
  52. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/_shared/interfaces.py +0 -0
  53. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/_shared/validators.py +0 -0
  54. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/room/__init__.py +0 -0
  55. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/slot_master/__init__.py +0 -0
  56. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/slot_master/api.py +0 -0
  57. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/slot_master/chain_finder.py +0 -0
  58. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/slot_master/dto.py +0 -0
  59. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/booking/slot_master/scorer.py +0 -0
  60. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/calendar/__init__.py +0 -0
  61. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/calendar/engine.py +0 -0
  62. {codex_services-0.1.0 → codex_services-0.1.3}/src/codex_services/py.typed +0 -0
  63. {codex_services-0.1.0 → codex_services-0.1.3}/tests/conftest.py +0 -0
  64. {codex_services-0.1.0 → codex_services-0.1.3}/tests/integration/__init__.py +0 -0
  65. {codex_services-0.1.0 → codex_services-0.1.3}/tests/integration/conftest.py +0 -0
  66. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/__init__.py +0 -0
  67. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/conftest.py +0 -0
  68. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_api.py +0 -0
  69. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_booking_validator.py +0 -0
  70. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_calendar_engine.py +0 -0
  71. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_chain_finder.py +0 -0
  72. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_dto.py +0 -0
  73. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_exceptions.py +0 -0
  74. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_scorer.py +0 -0
  75. {codex_services-0.1.0 → codex_services-0.1.3}/tests/unit/test_slot_calculator.py +0 -0
  76. {codex_services-0.1.0 → codex_services-0.1.3}/tools/__init__.py +0 -0
  77. {codex_services-0.1.0 → codex_services-0.1.3}/tools/dev/README.md +0 -0
  78. {codex_services-0.1.0 → codex_services-0.1.3}/tools/dev/__init__.py +0 -0
  79. {codex_services-0.1.0 → codex_services-0.1.3}/tools/dev/generate_project_tree.py +0 -0
@@ -0,0 +1,80 @@
1
+ name: CI Pipeline
2
+
3
+ on:
4
+ push:
5
+ branches: [develop, main]
6
+ paths-ignore: ["**.md", "docs/**", ".gitignore"]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ jobs:
11
+ quality-gate:
12
+ name: Quality Gate
13
+ runs-on: ubuntu-latest
14
+ env:
15
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+ - uses: astral-sh/setup-uv@v7
22
+ with:
23
+ version: "0.10.7"
24
+
25
+ - name: Sync dev environment
26
+ run: uv sync --locked --extra dev
27
+
28
+ - name: Run pre-commit
29
+ run: uv run python tools/dev/check.py --lint
30
+
31
+ - name: Run pip-audit
32
+ run: uv run python tools/dev/check.py --security
33
+
34
+ - name: Run mypy
35
+ run: uv run python tools/dev/check.py --types
36
+
37
+ unit-tests:
38
+ name: Unit Tests (Python ${{ matrix.python-version }})
39
+ needs: quality-gate
40
+ runs-on: ubuntu-latest
41
+ strategy:
42
+ matrix:
43
+ python-version: ["3.12", "3.13"]
44
+ env:
45
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
46
+ steps:
47
+ - uses: actions/checkout@v4
48
+ - uses: actions/setup-python@v5
49
+ with:
50
+ python-version: ${{ matrix.python-version }}
51
+ - uses: astral-sh/setup-uv@v7
52
+ with:
53
+ version: "0.10.7"
54
+
55
+ - name: Sync dev environment
56
+ run: uv sync --locked --extra dev
57
+
58
+ - name: Run unit tests
59
+ run: uv run pytest tests/ -m "unit" -v --tb=short
60
+
61
+ integration-tests:
62
+ name: Integration Tests
63
+ needs: unit-tests
64
+ runs-on: ubuntu-latest
65
+ env:
66
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+ - uses: actions/setup-python@v5
70
+ with:
71
+ python-version: "3.12"
72
+ - uses: astral-sh/setup-uv@v7
73
+ with:
74
+ version: "0.10.7"
75
+
76
+ - name: Sync dev environment
77
+ run: uv sync --locked --extra dev
78
+
79
+ - name: Run integration tests
80
+ run: uv run pytest tests/ -m "integration" -v --tb=short
@@ -3,16 +3,16 @@ name: Deploy Docs
3
3
  on:
4
4
  push:
5
5
  tags:
6
- - 'v*'
6
+ - "v*"
7
7
  workflow_dispatch:
8
8
  inputs:
9
9
  version:
10
- description: 'Version alias to deploy (e.g. 0.x, 1.x)'
10
+ description: "Version alias to deploy (e.g. 0.x, 1.x)"
11
11
  required: true
12
12
  alias:
13
- description: 'Alias (latest, stable, or leave empty)'
13
+ description: "Alias (latest, stable, or leave empty)"
14
14
  required: false
15
- default: 'latest'
15
+ default: "latest"
16
16
 
17
17
  env:
18
18
  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
@@ -39,33 +39,33 @@ jobs:
39
39
  uses: actions/setup-python@v5
40
40
  with:
41
41
  python-version: "3.12"
42
- cache: 'pip'
42
+ - uses: astral-sh/setup-uv@v7
43
+ with:
44
+ version: "0.10.7"
43
45
 
44
- - name: Install dependencies
45
- run: |
46
- python -m pip install --upgrade pip
47
- pip install -e ".[docs]"
46
+ - name: Sync docs environment
47
+ run: uv sync --locked --extra docs
48
48
 
49
49
  - name: Resolve version alias (tag push)
50
50
  if: github.event_name == 'push'
51
51
  id: version
52
52
  run: |
53
- TAG="${GITHUB_REF_NAME}" # e.g. v1.2.3
53
+ TAG="${GITHUB_REF_NAME}"
54
54
  MAJOR=$(echo "$TAG" | sed 's/^v//' | cut -d. -f1)
55
55
  echo "alias=${MAJOR}.x" >> "$GITHUB_OUTPUT"
56
56
 
57
57
  - name: Deploy versioned docs (tag push)
58
58
  if: github.event_name == 'push'
59
59
  run: |
60
- mike deploy --push --update-aliases "${{ steps.version.outputs.alias }}" latest
61
- mike set-default --push latest
60
+ uv run mike deploy --push --update-aliases "${{ steps.version.outputs.alias }}" latest
61
+ uv run mike set-default --push latest
62
62
 
63
63
  - name: Deploy versioned docs (manual)
64
64
  if: github.event_name == 'workflow_dispatch'
65
65
  run: |
66
66
  if [ -n "${{ inputs.alias }}" ]; then
67
- mike deploy --push --update-aliases "${{ inputs.version }}" "${{ inputs.alias }}"
67
+ uv run mike deploy --push --update-aliases "${{ inputs.version }}" "${{ inputs.alias }}"
68
68
  else
69
- mike deploy --push "${{ inputs.version }}"
69
+ uv run mike deploy --push "${{ inputs.version }}"
70
70
  fi
71
- mike set-default --push latest
71
+ uv run mike set-default --push latest
@@ -3,7 +3,7 @@ name: Publish to PyPI
3
3
  on:
4
4
  push:
5
5
  tags:
6
- - 'v*'
6
+ - "v*"
7
7
 
8
8
  jobs:
9
9
  build-n-publish:
@@ -11,7 +11,7 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  environment:
13
13
  name: pypi
14
- url: https://pypi.org/project/codex-booking/
14
+ url: https://pypi.org/project/codex-services/
15
15
  permissions:
16
16
  id-token: write
17
17
  contents: read
@@ -26,18 +26,15 @@ jobs:
26
26
  uses: actions/setup-python@v5
27
27
  with:
28
28
  python-version: "3.12"
29
- cache: 'pip'
30
-
31
- - name: Install build tools
32
- run: |
33
- python -m pip install --upgrade pip
34
- python -m pip install build twine hatchling
29
+ - uses: astral-sh/setup-uv@v7
30
+ with:
31
+ version: "0.10.7"
35
32
 
36
33
  - name: Build sdist and wheel
37
- run: python -m build
34
+ run: uv build --no-sources
38
35
 
39
36
  - name: Check artifacts
40
- run: twine check dist/*
37
+ run: uvx twine check dist/*
41
38
 
42
39
  - name: Publish to PyPI
43
40
  uses: pypa/gh-action-pypi-publish@release/v1
@@ -190,6 +190,7 @@ cython_debug/
190
190
 
191
191
  # Ruff stuff:
192
192
  .ruff_cache/
193
+ .uv-cache/
193
194
 
194
195
  # PyPI configuration file
195
196
  .pypirc
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,62 @@
1
+ <!-- Type: TRACKING -->
2
+
3
+ # Changelog
4
+
5
+
6
+ All notable changes to this project will be documented in this file.
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.3] - 2026-04-05
11
+
12
+ ### Changed
13
+ - **Core dependency**:
14
+ - Updated the supported `codex-core` dependency range to `>=0.3.0,<1.0.0` so the package remains compatible with the planned pre-`1.0` `codex-core` line without repeated dependency-range bumps.
15
+ - **Development tooling**:
16
+ - Moved project quality-gate policy into `[tool.codex-check]` in `pyproject.toml`.
17
+ - Simplified `tools/dev/check.py` to a thin launcher compatible with the `codex-core 0.3.x` runner flow.
18
+
19
+ ## [0.1.2] - 2026-03-29
20
+
21
+ ### Added
22
+ - **Development tooling**:
23
+ - Added `.python-version` for a consistent local Python baseline.
24
+ - Added committed `uv.lock` for reproducible dependency resolution in CI, docs, and local development.
25
+ - Adopted the new `BaseCheckRunner` stage flags so project quality-gate policy is declared through the shared `codex-core` runner contract.
26
+ - **README**:
27
+ - Documented the Python 3.12+ requirement and the recommended `uv` development workflow.
28
+
29
+ ### Changed
30
+ - **Python baseline**:
31
+ - Raised the minimum supported Python version to `3.12`.
32
+ - Updated static analysis targets (`ruff`, `mypy`) to Python 3.12.
33
+ - **CI / Docs / Publish pipelines**:
34
+ - Migrated GitHub Actions workflows to `uv`.
35
+ - Updated the PyPI publish workflow to use the correct `codex-services` project URL.
36
+ - **Core dependency**:
37
+ - Updated the supported `codex-core` dependency range to `>=0.2.0,<0.3.0` to align with the shared quality-gate runner behavior across the current `0.2.x` line.
38
+ - **Booking modes**:
39
+ - Simplified `BookingMode` to use the standard library `StrEnum` directly now that Python 3.12 is required.
40
+
41
+ ### Fixed
42
+ - **Security checks**:
43
+ - Configured the project quality runner to ignore `CVE-2026-4539` for `pygments` because no upstream fix is available yet.
44
+
45
+ ## [0.1.1] - 2026-03-20
46
+
47
+ ### Added
48
+ - **Core Library Architecture**: Initial split from monolithic `codex_tools` repository.
49
+ - **CRM Booking Engine** (`codex_services.crm.booking`):
50
+ - Unified API for availability and reservations.
51
+ - Multi-mode support: `STRICT`, `FLEXIBLE`, and `OVERBOOK`.
52
+ - Interfaces and algorithms for finding overlapping or chained slots (`chain_finder`, `scorer`).
53
+ - Validation engines for business constraints (`validators`).
54
+ - Strict immutable DTOs and custom exceptions.
55
+ - **CRM Calculator Engine** (`codex_services.crm.calculator`):
56
+ - `SlotCalculator` for dynamically analyzing duration and capacity based on business constraints.
57
+ - **CRM Calendar Engine** (`codex_services.crm.calendar`):
58
+ - Complete engine for shift generation, schedule building, and timezone-aware recurring events.
59
+ - **Documentation**:
60
+ - Implemented standard 6-layer `DocArchitect` layout (API, Architecture, Tasks, Evolution, Landing, Planning).
61
+ - Structured API reference using `mkdocstrings`.
62
+ - Multi-language support structure designed (en/ru).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-services
3
- Version: 0.1.0
3
+ Version: 0.1.3
4
4
  Summary: Reusable business logic engines for Codex platform (CRM, finance, HR, inventory)
5
5
  Project-URL: Homepage, https://github.com/codexdlc/codex-services
6
6
  Project-URL: Documentation, https://codexdlc.github.io/codex-services/
@@ -12,12 +12,10 @@ Keywords: booking,business,calculator,crm,scheduling,waas
12
12
  Classifier: Development Status :: 3 - Alpha
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: Apache Software License
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Programming Language :: Python :: 3.11
17
15
  Classifier: Programming Language :: Python :: 3.12
18
16
  Classifier: Programming Language :: Python :: 3.13
19
- Requires-Python: >=3.10
20
- Requires-Dist: codex-core
17
+ Requires-Python: >=3.12
18
+ Requires-Dist: codex-core<1.0.0,>=0.3.0
21
19
  Requires-Dist: pydantic<3.0,>=2.0
22
20
  Provides-Extra: all
23
21
  Requires-Dist: holidays>=0.40; extra == 'all'
@@ -65,6 +63,18 @@ pip install codex-services
65
63
  pip install "codex-services[calendar]"
66
64
  ```
67
65
 
66
+ Requires Python 3.12 or newer.
67
+
68
+ ## Development
69
+
70
+ ```bash
71
+ uv sync --extra dev
72
+ uv run pytest
73
+ uv run mypy src/
74
+ uv run pre-commit run --all-files
75
+ uv build --no-sources
76
+ ```
77
+
68
78
  ## Quick Start
69
79
 
70
80
  ```python
@@ -20,6 +20,18 @@ pip install codex-services
20
20
  pip install "codex-services[calendar]"
21
21
  ```
22
22
 
23
+ Requires Python 3.12 or newer.
24
+
25
+ ## Development
26
+
27
+ ```bash
28
+ uv sync --extra dev
29
+ uv run pytest
30
+ uv run mypy src/
31
+ uv run pre-commit run --all-files
32
+ uv build --no-sources
33
+ ```
34
+
23
35
  ## Quick Start
24
36
 
25
37
  ```python
@@ -8,21 +8,19 @@ dynamic = ["version"]
8
8
  description = "Reusable business logic engines for Codex platform (CRM, finance, HR, inventory)"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = { text = "Apache-2.0" }
11
- requires-python = ">=3.10"
11
+ requires-python = ">=3.12"
12
12
  authors = [{ name = "CodexDLC" }]
13
13
  keywords = ["booking", "scheduling", "calculator", "crm", "business", "waas"]
14
14
  classifiers = [
15
15
  "Development Status :: 3 - Alpha",
16
16
  "Intended Audience :: Developers",
17
17
  "License :: OSI Approved :: Apache Software License",
18
- "Programming Language :: Python :: 3.10",
19
- "Programming Language :: Python :: 3.11",
20
18
  "Programming Language :: Python :: 3.12",
21
19
  "Programming Language :: Python :: 3.13",
22
20
  ]
23
21
  dependencies = [
24
22
  "pydantic>=2.0,<3.0",
25
- "codex-core", # Зависимость от ядра
23
+ "codex-core>=0.3.0,<1.0.0", # Зависимость от ядра
26
24
  ]
27
25
 
28
26
  [project.urls]
@@ -66,7 +64,7 @@ source = "vcs"
66
64
  packages = ["src/codex_services"]
67
65
 
68
66
  [tool.ruff]
69
- target-version = "py310"
67
+ target-version = "py312"
70
68
  line-length = 120
71
69
 
72
70
  [tool.ruff.lint]
@@ -74,7 +72,7 @@ select = ["E", "F", "I", "UP", "B", "C4", "SIM"]
74
72
  ignore = ["B008"]
75
73
 
76
74
  [tool.mypy]
77
- python_version = "3.10"
75
+ python_version = "3.12"
78
76
  strict = true
79
77
  plugins = ["pydantic.mypy"]
80
78
 
@@ -112,3 +110,12 @@ exclude_lines = [
112
110
  [tool.bandit]
113
111
  exclude_dirs = ["tests"]
114
112
  skips = ["B602", "B605", "B607", "B404"]
113
+
114
+ [tool.codex-check]
115
+ project-name = "codex-services"
116
+ audit-flags = "--skip-editable --ignore-vuln CVE-2026-4539"
117
+ integration-requires = "pure Python, no external deps"
118
+ test-stages = ["unit", "integration"]
119
+ prompt-test-stages = ["integration"]
120
+ test-paths = ["tests"]
121
+ types-paths = ["src"]
@@ -7,15 +7,7 @@ Imports:
7
7
  from codex_services.booking.slot_master import BookingMode
8
8
  """
9
9
 
10
- import sys
11
- from enum import Enum
12
-
13
- if sys.version_info >= (3, 11): # pragma: no cover
14
- from enum import StrEnum # pragma: no cover
15
- else:
16
-
17
- class StrEnum(str, Enum):
18
- pass
10
+ from enum import StrEnum
19
11
 
20
12
 
21
13
  class BookingMode(StrEnum):