camiskaze 0.1.0__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 (85) hide show
  1. camiskaze-0.1.0/.gitignore +200 -0
  2. camiskaze-0.1.0/.python-version +1 -0
  3. camiskaze-0.1.0/LICENSE.txt +0 -0
  4. camiskaze-0.1.0/PKG-INFO +21 -0
  5. camiskaze-0.1.0/README.md +5 -0
  6. camiskaze-0.1.0/docs/img/logo.png +0 -0
  7. camiskaze-0.1.0/docs/img/logo_small.jpeg +0 -0
  8. camiskaze-0.1.0/docs/img/logo_small.png +0 -0
  9. camiskaze-0.1.0/progress_main.py +17 -0
  10. camiskaze-0.1.0/pyproject.toml +186 -0
  11. camiskaze-0.1.0/requirements-dev.lock +168 -0
  12. camiskaze-0.1.0/requirements.lock +138 -0
  13. camiskaze-0.1.0/src/camiskaze/__init__.py +3 -0
  14. camiskaze-0.1.0/src/camiskaze/adapters/__init__.py +16 -0
  15. camiskaze-0.1.0/src/camiskaze/adapters/exceptions/__init__.py +8 -0
  16. camiskaze-0.1.0/src/camiskaze/adapters/exceptions/registration_error.py +2 -0
  17. camiskaze-0.1.0/src/camiskaze/adapters/exceptions/work_order_cache_miss_error.py +5 -0
  18. camiskaze-0.1.0/src/camiskaze/adapters/models/__init__.py +8 -0
  19. camiskaze-0.1.0/src/camiskaze/adapters/models/camis_time_entry.py +18 -0
  20. camiskaze-0.1.0/src/camiskaze/adapters/models/toggl_project.py +11 -0
  21. camiskaze-0.1.0/src/camiskaze/adapters/repositories/__init__.py +12 -0
  22. camiskaze-0.1.0/src/camiskaze/adapters/repositories/camis/__init__.py +9 -0
  23. camiskaze-0.1.0/src/camiskaze/adapters/repositories/camis/camis_time_entry_repository.py +39 -0
  24. camiskaze-0.1.0/src/camiskaze/adapters/repositories/camis/camis_time_sheet_repository.py +17 -0
  25. camiskaze-0.1.0/src/camiskaze/adapters/repositories/output/__init__.py +10 -0
  26. camiskaze-0.1.0/src/camiskaze/adapters/repositories/output/progress_adapter.py +75 -0
  27. camiskaze-0.1.0/src/camiskaze/adapters/repositories/output/status_adapter.py +40 -0
  28. camiskaze-0.1.0/src/camiskaze/adapters/repositories/output/table_repository.py +102 -0
  29. camiskaze-0.1.0/src/camiskaze/adapters/repositories/toggl/__init__.py +15 -0
  30. camiskaze-0.1.0/src/camiskaze/adapters/repositories/toggl/toggl_project_repository.py +29 -0
  31. camiskaze-0.1.0/src/camiskaze/adapters/repositories/toggl/toggl_time_entry_repository.py +54 -0
  32. camiskaze-0.1.0/src/camiskaze/adapters/repositories/toggl/toggl_time_sheet_repository.py +32 -0
  33. camiskaze-0.1.0/src/camiskaze/adapters/repositories/toggl/toggl_work_order_repository.py +66 -0
  34. camiskaze-0.1.0/src/camiskaze/bootstrap.py +98 -0
  35. camiskaze-0.1.0/src/camiskaze/config/__init__.py +7 -0
  36. camiskaze-0.1.0/src/camiskaze/config/camis_config.py +10 -0
  37. camiskaze-0.1.0/src/camiskaze/config/config.py +2 -0
  38. camiskaze-0.1.0/src/camiskaze/config/toggl_config.py +11 -0
  39. camiskaze-0.1.0/src/camiskaze/domain/__init__.py +0 -0
  40. camiskaze-0.1.0/src/camiskaze/domain/messages/__init__.py +35 -0
  41. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/__init__.py +18 -0
  42. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/command.py +5 -0
  43. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/register.py +10 -0
  44. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/register_time_entry.py +8 -0
  45. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/register_timesheet.py +12 -0
  46. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/retrieve_timesheet.py +9 -0
  47. camiskaze-0.1.0/src/camiskaze/domain/messages/commands/retry_register_time_entry.py +9 -0
  48. camiskaze-0.1.0/src/camiskaze/domain/messages/events/__init__.py +17 -0
  49. camiskaze-0.1.0/src/camiskaze/domain/messages/events/event.py +5 -0
  50. camiskaze-0.1.0/src/camiskaze/domain/messages/events/time_entry_registered.py +35 -0
  51. camiskaze-0.1.0/src/camiskaze/domain/messages/events/timesheet_grouped.py +9 -0
  52. camiskaze-0.1.0/src/camiskaze/domain/messages/events/timesheet_registered.py +5 -0
  53. camiskaze-0.1.0/src/camiskaze/domain/messages/events/timesheet_retrieval_started.py +8 -0
  54. camiskaze-0.1.0/src/camiskaze/domain/messages/events/timesheet_retrieved.py +24 -0
  55. camiskaze-0.1.0/src/camiskaze/domain/messages/message.py +4 -0
  56. camiskaze-0.1.0/src/camiskaze/domain/models/__init__.py +9 -0
  57. camiskaze-0.1.0/src/camiskaze/domain/models/time_entry.py +36 -0
  58. camiskaze-0.1.0/src/camiskaze/domain/models/timesheet.py +33 -0
  59. camiskaze-0.1.0/src/camiskaze/domain/timesheet_grouper.py +39 -0
  60. camiskaze-0.1.0/src/camiskaze/domain/util/__init__.py +8 -0
  61. camiskaze-0.1.0/src/camiskaze/domain/util/duration.py +14 -0
  62. camiskaze-0.1.0/src/camiskaze/domain/util/work_order.py +10 -0
  63. camiskaze-0.1.0/src/camiskaze/entrypoints/__init__.py +0 -0
  64. camiskaze-0.1.0/src/camiskaze/entrypoints/cli/__init__.py +6 -0
  65. camiskaze-0.1.0/src/camiskaze/entrypoints/cli/cli.py +68 -0
  66. camiskaze-0.1.0/src/camiskaze/service_layer/__init__.py +11 -0
  67. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/__init__.py +34 -0
  68. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/command_handlers/__init__.py +14 -0
  69. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/command_handlers/handle_register.py +51 -0
  70. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/command_handlers/handle_register_time_entry.py +70 -0
  71. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/command_handlers/handle_register_timesheet.py +53 -0
  72. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/command_handlers/handle_retrieve_timesheet.py +40 -0
  73. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/command_handlers/handle_retry_register_time_entry.py +22 -0
  74. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/event_handlers/__init__.py +21 -0
  75. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/event_handlers/handle_time_entry_registered.py +18 -0
  76. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/event_handlers/handle_timesheet_grouped.py +19 -0
  77. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/event_handlers/handle_timesheet_registered.py +10 -0
  78. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/event_handlers/handle_timesheet_retrieval_started.py +16 -0
  79. camiskaze-0.1.0/src/camiskaze/service_layer/handlers/event_handlers/handle_timesheet_retrieved.py +47 -0
  80. camiskaze-0.1.0/src/camiskaze/service_layer/message_bus.py +43 -0
  81. camiskaze-0.1.0/src/camiskaze/service_layer/models/__init__.py +6 -0
  82. camiskaze-0.1.0/src/camiskaze/service_layer/models/message_handlers.py +23 -0
  83. camiskaze-0.1.0/src/camiskaze/service_layer/unit_of_work.py +78 -0
  84. camiskaze-0.1.0/tests/domain/test_extract_work_order.py +16 -0
  85. camiskaze-0.1.0/tests/domain/test_timesheet_grouper.py +95 -0
@@ -0,0 +1,200 @@
1
+ ### macOS template
2
+ # General
3
+ .DS_Store
4
+ .AppleDouble
5
+ .LSOverride
6
+
7
+ # Icon must end with two \r
8
+ Icon
9
+
10
+ # Thumbnails
11
+ ._*
12
+
13
+ # Files that might appear in the root of a volume
14
+ .DocumentRevisions-V100
15
+ .fseventsd
16
+ .Spotlight-V100
17
+ .TemporaryItems
18
+ .Trashes
19
+ .VolumeIcon.icns
20
+ .com.apple.timemachine.donotpresent
21
+
22
+ # Directories potentially created on remote AFP share
23
+ .AppleDB
24
+ .AppleDesktop
25
+ Network Trash Folder
26
+ Temporary Items
27
+ .apdisk
28
+
29
+ ### Python template
30
+ # Byte-compiled / optimized / DLL files
31
+ __pycache__/
32
+ *.py[cod]
33
+ *$py.class
34
+
35
+ # C extensions
36
+ *.so
37
+
38
+ # Distribution / packaging
39
+ .Python
40
+ build/
41
+ develop-eggs/
42
+ dist/
43
+ downloads/
44
+ eggs/
45
+ .eggs/
46
+ lib/
47
+ lib64/
48
+ parts/
49
+ sdist/
50
+ var/
51
+ wheels/
52
+ share/python-wheels/
53
+ *.egg-info/
54
+ .installed.cfg
55
+ *.egg
56
+ MANIFEST
57
+
58
+ # PyInstaller
59
+ # Usually these files are written by a python script from a template
60
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
61
+ *.manifest
62
+ *.spec
63
+
64
+ # Installer logs
65
+ pip-log.txt
66
+ pip-delete-this-directory.txt
67
+
68
+ # Unit test / coverage reports
69
+ htmlcov/
70
+ .tox/
71
+ .nox/
72
+ .coverage
73
+ .coverage.*
74
+ .cache
75
+ nosetests.xml
76
+ coverage.xml
77
+ *.cover
78
+ *.py,cover
79
+ .hypothesis/
80
+ .pytest_cache/
81
+ cover/
82
+
83
+ # Translations
84
+ *.mo
85
+ *.pot
86
+
87
+ # Django stuff:
88
+ *.log
89
+ local_settings.py
90
+ db.sqlite3
91
+ db.sqlite3-journal
92
+
93
+ # Flask stuff:
94
+ instance/
95
+ .webassets-cache
96
+
97
+ # Scrapy stuff:
98
+ .scrapy
99
+
100
+ # Sphinx documentation
101
+ docs/_build/
102
+
103
+ # PyBuilder
104
+ .pybuilder/
105
+ target/
106
+
107
+ # Jupyter Notebook
108
+ .ipynb_checkpoints
109
+
110
+ # IPython
111
+ profile_default/
112
+ ipython_config.py
113
+
114
+ # pyenv
115
+ # For a library or package, you might want to ignore these files since the code is
116
+ # intended to run in multiple environments; otherwise, check them in:
117
+ # .python-version
118
+
119
+ # pipenv
120
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
121
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
122
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
123
+ # install all needed dependencies.
124
+ #Pipfile.lock
125
+
126
+ # poetry
127
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
128
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
129
+ # commonly ignored for libraries.
130
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
131
+ #poetry.lock
132
+
133
+ # pdm
134
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
135
+ #pdm.lock
136
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
137
+ # in version control.
138
+ # https://pdm.fming.dev/#use-with-ide
139
+ .pdm.toml
140
+
141
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
142
+ __pypackages__/
143
+
144
+ # Celery stuff
145
+ celerybeat-schedule
146
+ celerybeat.pid
147
+
148
+ # SageMath parsed files
149
+ *.sage.py
150
+
151
+ # Environments
152
+ .env
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ .idea/
190
+
191
+
192
+ # Python compiled files.
193
+ *.pyc
194
+ *.pyo
195
+ *.pyd_
196
+
197
+
198
+ __main__.py
199
+
200
+
@@ -0,0 +1 @@
1
+ 3.13.1
File without changes
@@ -0,0 +1,21 @@
1
+ Metadata-Version: 2.4
2
+ Name: camiskaze
3
+ Version: 0.1.0
4
+ Summary: No longer waste time with Camis.
5
+ Author-email: Thomas Vanhelden <thomas.vanhelden@gmail.com>
6
+ License: MIT
7
+ License-File: LICENSE.txt
8
+ Requires-Python: >=3.10
9
+ Requires-Dist: aiohttp==3.11.12
10
+ Requires-Dist: asyncclick==8.1.8
11
+ Requires-Dist: keyring==25.6.0
12
+ Requires-Dist: litestar[standard]==2.14.0
13
+ Requires-Dist: pydantic==2.10.6
14
+ Requires-Dist: rich==13.9.4
15
+ Description-Content-Type: text/markdown
16
+
17
+ # CamisKaze
18
+
19
+ No longer waste time with Camis.
20
+
21
+ ![logo](docs/img/logo.png)
@@ -0,0 +1,5 @@
1
+ # CamisKaze
2
+
3
+ No longer waste time with Camis.
4
+
5
+ ![logo](docs/img/logo.png)
Binary file
Binary file
Binary file
@@ -0,0 +1,17 @@
1
+ import time
2
+ from rich.progress import Progress
3
+
4
+
5
+ def main():
6
+ with Progress() as progress:
7
+ # Add a task with a total of 100 steps
8
+ task_id = progress.add_task("Processing...", total=100)
9
+
10
+ # Simulate some work
11
+ for _ in range(100):
12
+ time.sleep(0.05) # do some “work”
13
+ progress.update(task_id, advance=1)
14
+
15
+
16
+ if __name__ == "__main__":
17
+ main()
@@ -0,0 +1,186 @@
1
+ [project]
2
+ name = "camiskaze"
3
+ version = "0.1.0"
4
+ description = "No longer waste time with Camis."
5
+ authors = [
6
+ { name = "Thomas Vanhelden", email = "thomas.vanhelden@gmail.com" }
7
+ ]
8
+ dependencies = [
9
+ "pydantic==2.10.6",
10
+ "rich==13.9.4",
11
+ "litestar[standard]==2.14.0",
12
+ "aiohttp==3.11.12",
13
+ "keyring==25.6.0",
14
+ "asyncclick==8.1.8",
15
+ ]
16
+ readme = "README.md"
17
+ requires-python = ">= 3.10"
18
+ license = { text = "MIT" }
19
+
20
+ [project.scripts]
21
+ camiskaze = "camiskaze.entrypoints.cli:cli"
22
+
23
+
24
+ [build-system]
25
+ requires = ["hatchling"]
26
+ build-backend = "hatchling.build"
27
+
28
+ [tool.hatch.metadata]
29
+ allow-direct-references = true
30
+
31
+ [tool.hatch.build.targets.wheel]
32
+ packages = ["src/camiskaze"]
33
+
34
+
35
+ [tool.rye]
36
+ managed = true
37
+ dev-dependencies = [
38
+ "ruff==0.9.5",
39
+ "pdbpp==0.10.3",
40
+ "pytest==8.3.4",
41
+ "pytest-random==0.2",
42
+ "pytest-sugar==1.0.0",
43
+ "pytest-asyncio==0.25.3",
44
+ "pytest-cov==6.0.0",
45
+ ]
46
+
47
+ [tool.bumpversion]
48
+ current_version = "0.5.1"
49
+ parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
50
+ serialize = ["{major}.{minor}.{patch}"]
51
+ search = "{current_version}"
52
+ replace = "{new_version}"
53
+ regex = false
54
+ ignore_missing_version = false
55
+ commit = true
56
+ tag = true
57
+ sign_tags = true
58
+ tag_name = "{new_version}"
59
+ tag_message = "version: {current_version} -> {new_version}."
60
+ allow_dirty = false
61
+ message = "version: {current_version} -> {new_version}."
62
+ commit_args = "--gpg-sign"
63
+
64
+ [[tool.bumpversion.files]]
65
+ filename = "pyproject.toml"
66
+ search = 'version = "{current_version}"'
67
+ replace = 'version = "{new_version}"'
68
+
69
+ [[tool.bumpversion.files]]
70
+ filename = "src/cmdb_cacher/entrypoints/cli.py"
71
+ search = '@version_option("{current_version}")'
72
+ replace = '@version_option("{new_version}")'
73
+
74
+ [[tool.bumpversion.files]]
75
+ filename = "manifests/cmdb-cacher-cron-job.yaml"
76
+ search = 'version: "{current_version}"'
77
+ replace = 'version: "{new_version}"'
78
+
79
+ [[tool.bumpversion.files]]
80
+ filename = "manifests/cmdb-cacher-cron-job.yaml"
81
+ search = 'cmdb-cacher:{current_version}'
82
+ replace = 'cmdb-cacher:{new_version}'
83
+
84
+
85
+ [tool.pytest.ini_options]
86
+ minversion = "8.0"
87
+ asyncio_mode = "auto"
88
+ addopts = [
89
+ "-ra",
90
+ "-q",
91
+ "-vv",
92
+ "-s",
93
+ "--disable-warnings",
94
+ "--strict-markers",
95
+ "--cache-clear",
96
+ "--cov=.",
97
+ "--cov-report=xml",
98
+ "--cov-report=html",
99
+ "--cov=append",
100
+ "--cov-config=.coveragerc"
101
+ ]
102
+ markers = [
103
+ "unit: Unit tests.",
104
+ "integration: Integration tests.",
105
+ "e2e: End-to-End tests.",
106
+ "asyncio: Async functions."
107
+ ]
108
+ python_files = ["test_*.py", "*_test.py"]
109
+ python_classes = ["Test"]
110
+ python_functions = ["test"]
111
+ pythonpath = [".", "src"]
112
+
113
+
114
+ [tool.ruff]
115
+ # Exclude a variety of commonly ignored directories.
116
+ exclude = [
117
+ ".bzr",
118
+ ".direnv",
119
+ ".eggs",
120
+ ".git",
121
+ ".git-rewrite",
122
+ ".hg",
123
+ ".ipynb_checkpoints",
124
+ ".mypy_cache",
125
+ ".nox",
126
+ ".pants.d",
127
+ ".pyenv",
128
+ ".pytest_cache",
129
+ ".pytype",
130
+ ".ruff_cache",
131
+ ".svn",
132
+ ".tox",
133
+ ".venv",
134
+ ".vscode",
135
+ "__pypackages__",
136
+ "_build",
137
+ "buck-out",
138
+ "build",
139
+ "dist",
140
+ "node_modules",
141
+ "site-packages",
142
+ "venv",
143
+ "**/__init__.py"
144
+ ]
145
+
146
+ # Same as Black.
147
+ line-length = 79
148
+ indent-width = 4
149
+
150
+ [tool.ruff.lint]
151
+ # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
152
+ # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
153
+ # McCabe complexity (`C901`) by default.
154
+ select = ["E4", "E7", "E9", "F"]
155
+ ignore = ["F401"]
156
+
157
+ # Allow fix for all enabled rules (when `--fix`) is provided.
158
+ fixable = ["ALL"]
159
+ unfixable = []
160
+
161
+ # Allow unused variables when underscore-prefixed.
162
+ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
163
+
164
+ [tool.ruff.format]
165
+ exclude = ["**/__init__.py"]
166
+ quote-style = "double"
167
+
168
+ # Like Black, respect magic trailing commas.
169
+ skip-magic-trailing-comma = false
170
+
171
+ # Like Black, automatically detect the appropriate line ending.
172
+ line-ending = "auto"
173
+
174
+ # Enable auto-formatting of code examples in docstrings. Markdown,
175
+ # reStructuredText code/literal blocks and doctests are all supported.
176
+ #
177
+ # This is currently disabled by default, but it is planned for this
178
+ # to be opt-out in the future.
179
+ docstring-code-format = true
180
+
181
+ # Set the line length limit used when formatting code snippets in
182
+ # docstrings.
183
+ #
184
+ # This only has an effect when the `docstring-code-format` setting is
185
+ # enabled.
186
+ docstring-code-line-length = "dynamic"
@@ -0,0 +1,168 @@
1
+ # generated by rye
2
+ # use `rye lock` or `rye sync` to update this lockfile
3
+ #
4
+ # last locked with the following flags:
5
+ # pre: false
6
+ # features: []
7
+ # all-features: false
8
+ # with-sources: false
9
+ # generate-hashes: false
10
+ # universal: false
11
+
12
+ -e file:.
13
+ aiohappyeyeballs==2.4.6
14
+ # via aiohttp
15
+ aiohttp==3.11.12
16
+ # via camiskaze
17
+ aiosignal==1.3.2
18
+ # via aiohttp
19
+ annotated-types==0.7.0
20
+ # via pydantic
21
+ anyio==4.8.0
22
+ # via asyncclick
23
+ # via httpx
24
+ # via litestar
25
+ # via watchfiles
26
+ asyncclick==8.1.8
27
+ # via camiskaze
28
+ attrs==25.1.0
29
+ # via aiohttp
30
+ # via wmctrl
31
+ certifi==2025.1.31
32
+ # via httpcore
33
+ # via httpx
34
+ click==8.1.8
35
+ # via litestar
36
+ # via rich-click
37
+ # via uvicorn
38
+ coverage==7.6.12
39
+ # via pytest-cov
40
+ editorconfig==0.17.0
41
+ # via jsbeautifier
42
+ faker==35.2.0
43
+ # via polyfactory
44
+ fancycompleter==0.9.1
45
+ # via pdbpp
46
+ fast-query-parsers==1.0.3
47
+ # via litestar
48
+ frozenlist==1.5.0
49
+ # via aiohttp
50
+ # via aiosignal
51
+ h11==0.14.0
52
+ # via httpcore
53
+ # via uvicorn
54
+ httpcore==1.0.7
55
+ # via httpx
56
+ httptools==0.6.4
57
+ # via uvicorn
58
+ httpx==0.28.1
59
+ # via litestar
60
+ idna==3.10
61
+ # via anyio
62
+ # via httpx
63
+ # via yarl
64
+ iniconfig==2.0.0
65
+ # via pytest
66
+ jaraco-classes==3.4.0
67
+ # via keyring
68
+ jaraco-context==6.0.1
69
+ # via keyring
70
+ jaraco-functools==4.1.0
71
+ # via keyring
72
+ jinja2==3.1.5
73
+ # via litestar
74
+ jsbeautifier==1.15.2
75
+ # via litestar
76
+ keyring==25.6.0
77
+ # via camiskaze
78
+ litestar==2.14.0
79
+ # via camiskaze
80
+ litestar-htmx==0.4.1
81
+ # via litestar
82
+ markdown-it-py==3.0.0
83
+ # via rich
84
+ markupsafe==3.0.2
85
+ # via jinja2
86
+ mdurl==0.1.2
87
+ # via markdown-it-py
88
+ more-itertools==10.6.0
89
+ # via jaraco-classes
90
+ # via jaraco-functools
91
+ msgspec==0.19.0
92
+ # via litestar
93
+ multidict==6.1.0
94
+ # via aiohttp
95
+ # via litestar
96
+ # via yarl
97
+ multipart==1.2.1
98
+ # via litestar
99
+ packaging==24.2
100
+ # via pytest
101
+ # via pytest-sugar
102
+ pdbpp==0.10.3
103
+ pluggy==1.5.0
104
+ # via pytest
105
+ polyfactory==2.19.0
106
+ # via litestar
107
+ propcache==0.2.1
108
+ # via aiohttp
109
+ # via yarl
110
+ pydantic==2.10.6
111
+ # via camiskaze
112
+ pydantic-core==2.27.2
113
+ # via pydantic
114
+ pygments==2.19.1
115
+ # via pdbpp
116
+ # via rich
117
+ pyrepl==0.9.0
118
+ # via fancycompleter
119
+ pytest==8.3.4
120
+ # via pytest-asyncio
121
+ # via pytest-cov
122
+ # via pytest-random
123
+ # via pytest-sugar
124
+ pytest-asyncio==0.25.3
125
+ pytest-cov==6.0.0
126
+ pytest-random==0.2
127
+ pytest-sugar==1.0.0
128
+ python-dateutil==2.9.0.post0
129
+ # via faker
130
+ python-dotenv==1.0.1
131
+ # via uvicorn
132
+ pyyaml==6.0.2
133
+ # via litestar
134
+ # via uvicorn
135
+ rich==13.9.4
136
+ # via camiskaze
137
+ # via litestar
138
+ # via rich-click
139
+ rich-click==1.8.5
140
+ # via litestar
141
+ ruff==0.9.5
142
+ six==1.17.0
143
+ # via jsbeautifier
144
+ # via python-dateutil
145
+ sniffio==1.3.1
146
+ # via anyio
147
+ termcolor==2.5.0
148
+ # via pytest-sugar
149
+ typing-extensions==4.12.2
150
+ # via faker
151
+ # via litestar
152
+ # via polyfactory
153
+ # via pydantic
154
+ # via pydantic-core
155
+ # via rich-click
156
+ uvicorn==0.34.0
157
+ # via litestar
158
+ uvloop==0.21.0
159
+ # via litestar
160
+ # via uvicorn
161
+ watchfiles==1.0.4
162
+ # via uvicorn
163
+ websockets==14.2
164
+ # via uvicorn
165
+ wmctrl==0.5
166
+ # via pdbpp
167
+ yarl==1.18.3
168
+ # via aiohttp