clockify-unofficial-cli 0.2.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 (126) hide show
  1. clockify_unofficial_cli-0.2.0/.editorconfig +18 -0
  2. clockify_unofficial_cli-0.2.0/.github/dependabot.yml +20 -0
  3. clockify_unofficial_cli-0.2.0/.github/workflows/ci.yml +20 -0
  4. clockify_unofficial_cli-0.2.0/.github/workflows/publish.yml +35 -0
  5. clockify_unofficial_cli-0.2.0/.github/workflows/python.yml +19 -0
  6. clockify_unofficial_cli-0.2.0/.gitignore +482 -0
  7. clockify_unofficial_cli-0.2.0/.markdownlint-cli2.jsonc +9 -0
  8. clockify_unofficial_cli-0.2.0/.markdownlint.yaml +28 -0
  9. clockify_unofficial_cli-0.2.0/.pre-commit-config.yaml +79 -0
  10. clockify_unofficial_cli-0.2.0/AGENTS.md +168 -0
  11. clockify_unofficial_cli-0.2.0/CONTRIBUTING.md +66 -0
  12. clockify_unofficial_cli-0.2.0/LICENSE +21 -0
  13. clockify_unofficial_cli-0.2.0/Makefile +108 -0
  14. clockify_unofficial_cli-0.2.0/PKG-INFO +278 -0
  15. clockify_unofficial_cli-0.2.0/README.md +255 -0
  16. clockify_unofficial_cli-0.2.0/checkmake.ini +14 -0
  17. clockify_unofficial_cli-0.2.0/cspell.config.yaml +26 -0
  18. clockify_unofficial_cli-0.2.0/dictionary.txt +33 -0
  19. clockify_unofficial_cli-0.2.0/docs/ARCHITECTURE.md +398 -0
  20. clockify_unofficial_cli-0.2.0/docs/ROADMAP.md +205 -0
  21. clockify_unofficial_cli-0.2.0/docs/conventions/commits-check.md +45 -0
  22. clockify_unofficial_cli-0.2.0/docs/conventions/index.md +8 -0
  23. clockify_unofficial_cli-0.2.0/docs/coverage.md +280 -0
  24. clockify_unofficial_cli-0.2.0/docs/index.md +31 -0
  25. clockify_unofficial_cli-0.2.0/docs/log.md +21 -0
  26. clockify_unofficial_cli-0.2.0/docs/python/index.md +8 -0
  27. clockify_unofficial_cli-0.2.0/docs/python/interpreter-source.md +21 -0
  28. clockify_unofficial_cli-0.2.0/docs/python/pyproject-defaults.md +29 -0
  29. clockify_unofficial_cli-0.2.0/docs/python/typer-parameter-objects.md +41 -0
  30. clockify_unofficial_cli-0.2.0/docs/toolchain/index.md +12 -0
  31. clockify_unofficial_cli-0.2.0/docs/toolchain/layering-rule.md +27 -0
  32. clockify_unofficial_cli-0.2.0/docs/toolchain/rejected-install-backends.md +20 -0
  33. clockify_unofficial_cli-0.2.0/docs/toolchain/releasing.md +28 -0
  34. clockify_unofficial_cli-0.2.0/mise.toml +14 -0
  35. clockify_unofficial_cli-0.2.0/mk/.gitkeep +0 -0
  36. clockify_unofficial_cli-0.2.0/mk/clockify.mk +13 -0
  37. clockify_unofficial_cli-0.2.0/mk/python.mk +62 -0
  38. clockify_unofficial_cli-0.2.0/package.json +8 -0
  39. clockify_unofficial_cli-0.2.0/pnpm-lock.yaml +1490 -0
  40. clockify_unofficial_cli-0.2.0/pnpm-workspace.yaml +2 -0
  41. clockify_unofficial_cli-0.2.0/pyproject.toml +99 -0
  42. clockify_unofficial_cli-0.2.0/scripts/__init__.py +0 -0
  43. clockify_unofficial_cli-0.2.0/scripts/coverage_report.py +87 -0
  44. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/__init__.py +3 -0
  45. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/__main__.py +3 -0
  46. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/_version.py +3 -0
  47. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/auth/__init__.py +0 -0
  48. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/auth/credentials.py +70 -0
  49. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/auth/env_store.py +26 -0
  50. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/auth/file_store.py +49 -0
  51. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/auth/keyring_store.py +62 -0
  52. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/auth/resolver.py +34 -0
  53. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/__init__.py +0 -0
  54. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/auth.py +153 -0
  55. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/client.py +116 -0
  56. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/config.py +50 -0
  57. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/custom_field.py +130 -0
  58. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/entry.py +275 -0
  59. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/group.py +89 -0
  60. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/project.py +174 -0
  61. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/tag.py +107 -0
  62. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/task.py +194 -0
  63. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/timer_shortcuts.py +130 -0
  64. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/user.py +45 -0
  65. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/commands/workspace.py +68 -0
  66. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/config/__init__.py +0 -0
  67. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/config/paths.py +25 -0
  68. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/config/settings.py +75 -0
  69. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/config/store.py +56 -0
  70. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/main.py +131 -0
  71. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/output/__init__.py +0 -0
  72. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/output/columns.py +88 -0
  73. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/output/formats.py +82 -0
  74. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/output/registry.py +29 -0
  75. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/output/renderer.py +68 -0
  76. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/__init__.py +0 -0
  77. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/client_factory.py +42 -0
  78. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/context.py +99 -0
  79. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/errors.py +89 -0
  80. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/exit_codes.py +15 -0
  81. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/params.py +39 -0
  82. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/runtime/prompts.py +24 -0
  83. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/services/__init__.py +0 -0
  84. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/services/listing.py +58 -0
  85. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/services/parsing.py +118 -0
  86. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/services/resolve.py +128 -0
  87. clockify_unofficial_cli-0.2.0/src/clockify_unofficial_cli/services/timer.py +126 -0
  88. clockify_unofficial_cli-0.2.0/tests/__init__.py +0 -0
  89. clockify_unofficial_cli-0.2.0/tests/conftest.py +102 -0
  90. clockify_unofficial_cli-0.2.0/tests/live/__init__.py +0 -0
  91. clockify_unofficial_cli-0.2.0/tests/live/test_smoke.py +28 -0
  92. clockify_unofficial_cli-0.2.0/tests/unit/__init__.py +0 -0
  93. clockify_unofficial_cli-0.2.0/tests/unit/auth/__init__.py +0 -0
  94. clockify_unofficial_cli-0.2.0/tests/unit/auth/test_credentials.py +42 -0
  95. clockify_unofficial_cli-0.2.0/tests/unit/auth/test_stores.py +142 -0
  96. clockify_unofficial_cli-0.2.0/tests/unit/commands/__init__.py +0 -0
  97. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_auth.py +199 -0
  98. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_client.py +139 -0
  99. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_config.py +79 -0
  100. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_custom_field.py +115 -0
  101. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_entry.py +150 -0
  102. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_group.py +90 -0
  103. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_project.py +129 -0
  104. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_tag.py +99 -0
  105. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_task.py +121 -0
  106. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_user.py +75 -0
  107. clockify_unofficial_cli-0.2.0/tests/unit/commands/test_workspace.py +109 -0
  108. clockify_unofficial_cli-0.2.0/tests/unit/config/__init__.py +0 -0
  109. clockify_unofficial_cli-0.2.0/tests/unit/config/test_settings.py +60 -0
  110. clockify_unofficial_cli-0.2.0/tests/unit/config/test_store.py +73 -0
  111. clockify_unofficial_cli-0.2.0/tests/unit/output/__init__.py +0 -0
  112. clockify_unofficial_cli-0.2.0/tests/unit/output/test_formats.py +128 -0
  113. clockify_unofficial_cli-0.2.0/tests/unit/runtime/__init__.py +0 -0
  114. clockify_unofficial_cli-0.2.0/tests/unit/runtime/test_context.py +129 -0
  115. clockify_unofficial_cli-0.2.0/tests/unit/runtime/test_errors.py +112 -0
  116. clockify_unofficial_cli-0.2.0/tests/unit/runtime/test_params.py +81 -0
  117. clockify_unofficial_cli-0.2.0/tests/unit/runtime/test_prompts.py +25 -0
  118. clockify_unofficial_cli-0.2.0/tests/unit/scripts/__init__.py +0 -0
  119. clockify_unofficial_cli-0.2.0/tests/unit/scripts/test_coverage_report.py +94 -0
  120. clockify_unofficial_cli-0.2.0/tests/unit/services/__init__.py +0 -0
  121. clockify_unofficial_cli-0.2.0/tests/unit/services/test_listing.py +52 -0
  122. clockify_unofficial_cli-0.2.0/tests/unit/services/test_parsing.py +121 -0
  123. clockify_unofficial_cli-0.2.0/tests/unit/services/test_resolve.py +83 -0
  124. clockify_unofficial_cli-0.2.0/tests/unit/services/test_timer.py +189 -0
  125. clockify_unofficial_cli-0.2.0/tests/unit/test_main.py +63 -0
  126. clockify_unofficial_cli-0.2.0/uv.lock +884 -0
@@ -0,0 +1,18 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+ indent_size = 2
10
+
11
+ [{Makefile,*.mk}]
12
+ indent_style = tab
13
+
14
+ [*.py]
15
+ indent_size = 4
16
+
17
+ [*.md]
18
+ trim_trailing_whitespace = false
@@ -0,0 +1,20 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ commit-message:
8
+ prefix: ci
9
+ - package-ecosystem: npm
10
+ directory: /
11
+ schedule:
12
+ interval: weekly
13
+ commit-message:
14
+ prefix: chore
15
+ - package-ecosystem: uv
16
+ directory: /
17
+ schedule:
18
+ interval: weekly
19
+ commit-message:
20
+ prefix: chore
@@ -0,0 +1,20 @@
1
+ name: ci
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+ jobs:
7
+ quality:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v7
11
+ with:
12
+ fetch-depth: 0
13
+ ref: ${{ github.event.pull_request.head.sha || github.ref }}
14
+ - uses: jdx/mise-action@v4
15
+ - run: pnpm install --frozen-lockfile
16
+ - run: make makefile-lint
17
+ - run: make md-lint
18
+ - run: make spell
19
+ - run: make commits-check
20
+ - run: pre-commit run --all-files
@@ -0,0 +1,35 @@
1
+ name: publish
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ permissions:
7
+ contents: read
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v7
13
+ - uses: jdx/mise-action@v4
14
+ - name: Tag matches project.version
15
+ if: github.event_name == 'release'
16
+ run: |
17
+ version=$(python3 -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
18
+ test "${GITHUB_REF_NAME#v}" = "$version" || { echo "tag $GITHUB_REF_NAME != project.version $version"; exit 1; }
19
+ - run: make build
20
+ - uses: actions/upload-artifact@v7
21
+ with:
22
+ name: dist
23
+ path: dist/
24
+ publish:
25
+ needs: build
26
+ runs-on: ubuntu-latest
27
+ environment: pypi
28
+ permissions:
29
+ id-token: write
30
+ steps:
31
+ - uses: actions/download-artifact@v8
32
+ with:
33
+ name: dist
34
+ path: dist/
35
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,19 @@
1
+ name: python
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+ branches: [main]
7
+ jobs:
8
+ quality:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v7
12
+ with:
13
+ fetch-depth: 0
14
+ ref: ${{ github.event.pull_request.head.sha || github.ref }}
15
+ - uses: jdx/mise-action@v4
16
+ - run: pnpm install --frozen-lockfile
17
+ - run: uv sync --locked
18
+ - run: make check
19
+ - run: make test
@@ -0,0 +1,482 @@
1
+ ### Project-specific stuff
2
+
3
+ # mise local overrides
4
+ mise.local.toml
5
+ .mise.local.toml
6
+
7
+ # Cached upstream OpenAPI document (make openapi-fetch)
8
+ .cache/
9
+
10
+ # Local prompt artifacts
11
+ .prompts/
12
+
13
+ # Obsidian vault metadata (docs/ is opened directly as a vault)
14
+ .obsidian/
15
+
16
+ # Created by https://www.toptal.com/developers/gitignore/api/linux,macos,jetbrains+all,visualstudiocode,node,python
17
+ # Edit at https://www.toptal.com/developers/gitignore?templates=linux,macos,jetbrains+all,visualstudiocode,node,python
18
+
19
+ ### JetBrains+all ###
20
+ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
21
+ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
22
+
23
+ # User-specific stuff
24
+ .idea/**/workspace.xml
25
+ .idea/**/tasks.xml
26
+ .idea/**/usage.statistics.xml
27
+ .idea/**/dictionaries
28
+ .idea/**/shelf
29
+
30
+ # AWS User-specific
31
+ .idea/**/aws.xml
32
+
33
+ # Generated files
34
+ .idea/**/contentModel.xml
35
+
36
+ # Sensitive or high-churn files
37
+ .idea/**/dataSources/
38
+ .idea/**/dataSources.ids
39
+ .idea/**/dataSources.local.xml
40
+ .idea/**/sqlDataSources.xml
41
+ .idea/**/dynamic.xml
42
+ .idea/**/uiDesigner.xml
43
+ .idea/**/dbnavigator.xml
44
+
45
+ # Gradle
46
+ .idea/**/gradle.xml
47
+ .idea/**/libraries
48
+
49
+ # Gradle and Maven with auto-import
50
+ # When using Gradle or Maven with auto-import, you should exclude module files,
51
+ # since they will be recreated, and may cause churn. Uncomment if using
52
+ # auto-import.
53
+ # .idea/artifacts
54
+ # .idea/compiler.xml
55
+ # .idea/jarRepositories.xml
56
+ # .idea/modules.xml
57
+ # .idea/*.iml
58
+ # .idea/modules
59
+ # *.iml
60
+ # *.ipr
61
+
62
+ # CMake
63
+ cmake-build-*/
64
+
65
+ # Mongo Explorer plugin
66
+ .idea/**/mongoSettings.xml
67
+
68
+ # File-based project format
69
+ *.iws
70
+
71
+ # IntelliJ
72
+ out/
73
+
74
+ # mpeltonen/sbt-idea plugin
75
+ .idea_modules/
76
+
77
+ # JIRA plugin
78
+ atlassian-ide-plugin.xml
79
+
80
+ # Cursive Clojure plugin
81
+ .idea/replstate.xml
82
+
83
+ # SonarLint plugin
84
+ .idea/sonarlint/
85
+
86
+ # Crashlytics plugin (for Android Studio and IntelliJ)
87
+ com_crashlytics_export_strings.xml
88
+ crashlytics.properties
89
+ crashlytics-build.properties
90
+ fabric.properties
91
+
92
+ # Editor-based Rest Client
93
+ .idea/httpRequests
94
+
95
+ # Android studio 3.1+ serialized cache file
96
+ .idea/caches/build_file_checksums.ser
97
+
98
+ ### JetBrains+all Patch ###
99
+ # Ignore everything but code style settings and run configurations
100
+ # that are supposed to be shared within teams.
101
+
102
+ .idea/*
103
+
104
+ !.idea/codeStyles
105
+ !.idea/runConfigurations
106
+
107
+ ### Linux ###
108
+ *~
109
+
110
+ # temporary files which can be created if a process still has a handle open of a deleted file
111
+ .fuse_hidden*
112
+
113
+ # KDE directory preferences
114
+ .directory
115
+
116
+ # Linux trash folder which might appear on any partition or disk
117
+ .Trash-*
118
+
119
+ # .nfs files are created when an open file is removed but is still being accessed
120
+ .nfs*
121
+
122
+ ### macOS ###
123
+ # General
124
+ .DS_Store
125
+ .AppleDouble
126
+ .LSOverride
127
+
128
+ # Icon must end with two \r
129
+ Icon
130
+
131
+ # Thumbnails
132
+ ._*
133
+
134
+ # Files that might appear in the root of a volume
135
+ .DocumentRevisions-V100
136
+ .fseventsd
137
+ .Spotlight-V100
138
+ .TemporaryItems
139
+ .Trashes
140
+ .VolumeIcon.icns
141
+ .com.apple.timemachine.donotpresent
142
+
143
+ # Directories potentially created on remote AFP share
144
+ .AppleDB
145
+ .AppleDesktop
146
+ Network Trash Folder
147
+ Temporary Items
148
+ .apdisk
149
+
150
+ ### macOS Patch ###
151
+ # iCloud generated files
152
+ *.icloud
153
+
154
+ ### Node ###
155
+ # Logs
156
+ logs
157
+ *.log
158
+ npm-debug.log*
159
+ yarn-debug.log*
160
+ yarn-error.log*
161
+ lerna-debug.log*
162
+ .pnpm-debug.log*
163
+
164
+ # Diagnostic reports (https://nodejs.org/api/report.html)
165
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
166
+
167
+ # Runtime data
168
+ pids
169
+ *.pid
170
+ *.seed
171
+ *.pid.lock
172
+
173
+ # Directory for instrumented libs generated by jscoverage/JSCover
174
+ lib-cov
175
+
176
+ # Coverage directory used by tools like istanbul
177
+ coverage
178
+ *.lcov
179
+
180
+ # nyc test coverage
181
+ .nyc_output
182
+
183
+ # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
184
+ .grunt
185
+
186
+ # Bower dependency directory (https://bower.io/)
187
+ bower_components
188
+
189
+ # node-waf configuration
190
+ .lock-wscript
191
+
192
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
193
+ build/Release
194
+
195
+ # Dependency directories
196
+ node_modules/
197
+ jspm_packages/
198
+
199
+ # Snowpack dependency directory (https://snowpack.dev/)
200
+ web_modules/
201
+
202
+ # TypeScript cache
203
+ *.tsbuildinfo
204
+
205
+ # Optional npm cache directory
206
+ .npm
207
+
208
+ # Optional eslint cache
209
+ .eslintcache
210
+
211
+ # Optional stylelint cache
212
+ .stylelintcache
213
+
214
+ # Microbundle cache
215
+ .rpt2_cache/
216
+ .rts2_cache_cjs/
217
+ .rts2_cache_es/
218
+ .rts2_cache_umd/
219
+
220
+ # Optional REPL history
221
+ .node_repl_history
222
+
223
+ # Output of 'npm pack'
224
+ *.tgz
225
+
226
+ # Yarn Integrity file
227
+ .yarn-integrity
228
+
229
+ # dotenv environment variable files
230
+ .env
231
+ .env.development.local
232
+ .env.test.local
233
+ .env.production.local
234
+ .env.local
235
+
236
+ # parcel-bundler cache (https://parceljs.org/)
237
+ .cache
238
+ .parcel-cache
239
+
240
+ # Next.js build output
241
+ .next
242
+ out
243
+
244
+ # Nuxt.js build / generate output
245
+ .nuxt
246
+ dist
247
+
248
+ # Gatsby files
249
+ .cache/
250
+ # Comment in the public line in if your project uses Gatsby and not Next.js
251
+ # https://nextjs.org/blog/next-9-1#public-directory-support
252
+ # public
253
+
254
+ # vuepress build output
255
+ .vuepress/dist
256
+
257
+ # vuepress v2.x temp and cache directory
258
+ .temp
259
+
260
+ # Docusaurus cache and generated files
261
+ .docusaurus
262
+
263
+ # Serverless directories
264
+ .serverless/
265
+
266
+ # FuseBox cache
267
+ .fusebox/
268
+
269
+ # DynamoDB Local files
270
+ .dynamodb/
271
+
272
+ # TernJS port file
273
+ .tern-port
274
+
275
+ # Stores VSCode versions used for testing VSCode extensions
276
+ .vscode-test
277
+
278
+ # yarn v2
279
+ .yarn/cache
280
+ .yarn/unplugged
281
+ .yarn/build-state.yml
282
+ .yarn/install-state.gz
283
+ .pnp.*
284
+
285
+ ### Node Patch ###
286
+ # Serverless Webpack directories
287
+ .webpack/
288
+
289
+ # Optional stylelint cache
290
+
291
+ # SvelteKit build / generate output
292
+ .svelte-kit
293
+
294
+ ### Python ###
295
+ # Byte-compiled / optimized / DLL files
296
+ __pycache__/
297
+ *.py[cod]
298
+ *$py.class
299
+
300
+ # C extensions
301
+ *.so
302
+
303
+ # Distribution / packaging
304
+ .Python
305
+ build/
306
+ develop-eggs/
307
+ dist/
308
+ downloads/
309
+ eggs/
310
+ .eggs/
311
+ lib/
312
+ lib64/
313
+ parts/
314
+ sdist/
315
+ var/
316
+ wheels/
317
+ share/python-wheels/
318
+ *.egg-info/
319
+ .installed.cfg
320
+ *.egg
321
+ MANIFEST
322
+
323
+ # PyInstaller
324
+ # Usually these files are written by a python script from a template
325
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
326
+ *.manifest
327
+ *.spec
328
+
329
+ # Installer logs
330
+ pip-log.txt
331
+ pip-delete-this-directory.txt
332
+
333
+ # Unit test / coverage reports
334
+ htmlcov/
335
+ .tox/
336
+ .nox/
337
+ .coverage
338
+ .coverage.*
339
+ nosetests.xml
340
+ coverage.xml
341
+ *.cover
342
+ *.py,cover
343
+ .hypothesis/
344
+ .pytest_cache/
345
+ cover/
346
+
347
+ # Translations
348
+ *.mo
349
+ *.pot
350
+
351
+ # Django stuff:
352
+ local_settings.py
353
+ db.sqlite3
354
+ db.sqlite3-journal
355
+
356
+ # Flask stuff:
357
+ instance/
358
+ .webassets-cache
359
+
360
+ # Scrapy stuff:
361
+ .scrapy
362
+
363
+ # Sphinx documentation
364
+ docs/_build/
365
+
366
+ # PyBuilder
367
+ .pybuilder/
368
+ target/
369
+
370
+ # Jupyter Notebook
371
+ .ipynb_checkpoints
372
+
373
+ # IPython
374
+ profile_default/
375
+ ipython_config.py
376
+
377
+ # pyenv
378
+ # For a library or package, you might want to ignore these files since the code is
379
+ # intended to run in multiple environments; otherwise, check them in:
380
+ # .python-version
381
+
382
+ # pipenv
383
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
384
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
385
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
386
+ # install all needed dependencies.
387
+ #Pipfile.lock
388
+
389
+ # poetry
390
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
391
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
392
+ # commonly ignored for libraries.
393
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
394
+ #poetry.lock
395
+
396
+ # pdm
397
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
398
+ #pdm.lock
399
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
400
+ # in version control.
401
+ # https://pdm.fming.dev/#use-with-ide
402
+ .pdm.toml
403
+
404
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
405
+ __pypackages__/
406
+
407
+ # Celery stuff
408
+ celerybeat-schedule
409
+ celerybeat.pid
410
+
411
+ # SageMath parsed files
412
+ *.sage.py
413
+
414
+ # Environments
415
+ .venv
416
+ env/
417
+ venv/
418
+ ENV/
419
+ env.bak/
420
+ venv.bak/
421
+
422
+ # Spyder project settings
423
+ .spyderproject
424
+ .spyproject
425
+
426
+ # Rope project settings
427
+ .ropeproject
428
+
429
+ # mkdocs documentation
430
+ /site
431
+
432
+ # mypy
433
+ .mypy_cache/
434
+ .dmypy.json
435
+ dmypy.json
436
+
437
+ # Pyre type checker
438
+ .pyre/
439
+
440
+ # pytype static type analyzer
441
+ .pytype/
442
+
443
+ # Cython debug symbols
444
+ cython_debug/
445
+
446
+ # PyCharm
447
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
448
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
449
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
450
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
451
+ #.idea/
452
+
453
+ ### Python Patch ###
454
+ # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
455
+ poetry.toml
456
+
457
+ # ruff
458
+ .ruff_cache/
459
+
460
+ # LSP config files
461
+ pyrightconfig.json
462
+
463
+ ### VisualStudioCode ###
464
+ .vscode/*
465
+ !.vscode/settings.json
466
+ !.vscode/tasks.json
467
+ !.vscode/launch.json
468
+ !.vscode/extensions.json
469
+ !.vscode/*.code-snippets
470
+
471
+ # Local History for Visual Studio Code
472
+ .history/
473
+
474
+ # Built Visual Studio Code Extensions
475
+ *.vsix
476
+
477
+ ### VisualStudioCode Patch ###
478
+ # Ignore all local history of files
479
+ .history
480
+ .ionide
481
+
482
+ # End of https://www.toptal.com/developers/gitignore/api/linux,macos,jetbrains+all,visualstudiocode,node,python
@@ -0,0 +1,9 @@
1
+ {
2
+ // Paths excluded from markdown linting: third-party deps and generated/vendored
3
+ // tooling artifacts that are not authored in this repo.
4
+ "ignores": [
5
+ "node_modules/",
6
+ ".venv/",
7
+ ".git/"
8
+ ]
9
+ }
@@ -0,0 +1,28 @@
1
+ # Allow ordered list inconsistencies (sometimes intentional)
2
+ MD029: false
3
+
4
+ # Allow fenced code blocks without language (sometimes appropriate)
5
+ MD040: false
6
+
7
+ # Allow duplicate headings in sibling sections
8
+ MD024:
9
+ siblings_only: true
10
+
11
+ # Require aligned table columns with aligned delimiter rows
12
+ MD060:
13
+ style: aligned
14
+ aligned_delimiter: true
15
+
16
+ # Allow longer lines for tables and code blocks
17
+ MD013:
18
+ line_length: 80
19
+ heading_line_length: 80
20
+ code_block_line_length: 80
21
+ tables: false
22
+
23
+ # A YAML frontmatter `title` and the body's H1 are allowed to coexist and to
24
+ # repeat the same text — OKF concept notes (docs/) carry both.
25
+ MD025:
26
+ front_matter_title: ""
27
+ MD041:
28
+ front_matter_title: ""
@@ -0,0 +1,79 @@
1
+ default_install_hook_types: [pre-commit, commit-msg, pre-push]
2
+
3
+ repos:
4
+ - repo: https://github.com/pre-commit/pre-commit-hooks
5
+ rev: v6.0.0
6
+ hooks:
7
+ - id: trailing-whitespace
8
+ - id: end-of-file-fixer
9
+ - id: check-yaml
10
+ - id: check-toml
11
+ - id: check-merge-conflict
12
+ - id: check-added-large-files
13
+ - id: mixed-line-ending
14
+
15
+ - repo: local
16
+ hooks:
17
+ - id: md-lint
18
+ name: markdownlint-cli2
19
+ entry: make md-lint
20
+ language: system
21
+ files: \.md$
22
+ pass_filenames: false
23
+
24
+ - id: spell
25
+ name: cspell
26
+ entry: make spell
27
+ language: system
28
+ pass_filenames: false
29
+
30
+ - id: conventional-commit-msg
31
+ name: conventional-git commit message
32
+ entry: uvx conventional-git@latest check commit --file
33
+ language: system
34
+ stages: [commit-msg]
35
+ types: [text]
36
+ pass_filenames: true
37
+
38
+ - id: conventional-branch-name
39
+ name: conventional-git branch name
40
+ entry: uvx conventional-git@latest check branch
41
+ language: system
42
+ stages: [pre-commit, pre-push]
43
+ always_run: true
44
+ pass_filenames: false
45
+
46
+ - repo: https://github.com/checkmake/checkmake
47
+ rev: v0.3.2
48
+ hooks:
49
+ - id: checkmake-system
50
+
51
+ - repo: local
52
+ hooks:
53
+ - id: ruff-fix
54
+ name: ruff lint --fix
55
+ entry: make lint-fix
56
+ language: system
57
+ types: [python]
58
+ pass_filenames: false
59
+
60
+ - id: ruff-format
61
+ name: ruff format
62
+ entry: make format
63
+ language: system
64
+ types: [python]
65
+ pass_filenames: false
66
+
67
+ - id: mypy
68
+ name: mypy
69
+ entry: make mypy
70
+ language: system
71
+ types: [python]
72
+ pass_filenames: false
73
+
74
+ - id: pylint
75
+ name: pylint (pylint-gajaguar)
76
+ entry: make pylint
77
+ language: system
78
+ types: [python]
79
+ pass_filenames: false