sql-impressao 1.0.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.
@@ -0,0 +1,17 @@
1
+ # http://editorconfig.org
2
+
3
+ root = true
4
+
5
+ [*]
6
+ indent_style = space
7
+ indent_size = 2
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+ charset = utf-8
11
+ end_of_line = lf
12
+
13
+ [*.py]
14
+ indent_size = 4
15
+
16
+ [Makefile]
17
+ indent_style = tab
@@ -0,0 +1 @@
1
+ This project follows [Django's Code of Conduct](https://www.djangoproject.com/conduct/).
@@ -0,0 +1 @@
1
+ blank_issues_enabled: false
@@ -0,0 +1,10 @@
1
+ name: Feature Request
2
+ description: Request an enhancement or new feature.
3
+ body:
4
+ - type: textarea
5
+ id: description
6
+ attributes:
7
+ label: Description
8
+ description: Please describe your feature request with appropriate detail.
9
+ validations:
10
+ required: true
@@ -0,0 +1,18 @@
1
+ name: Issue
2
+ description: File an issue
3
+ body:
4
+ - type: input
5
+ id: package_version
6
+ attributes:
7
+ label: Package Version
8
+ description: Which version of this package were you using? If not the latest version, please check this issue has not since been resolved.
9
+ placeholder: 1.0.0
10
+ validations:
11
+ required: false
12
+ - type: textarea
13
+ id: description
14
+ attributes:
15
+ label: Description
16
+ description: Please describe your issue.
17
+ validations:
18
+ required: true
@@ -0,0 +1 @@
1
+ Please report security issues directly over email to me@adamj.eu
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: "/"
5
+ groups:
6
+ "GitHub Actions":
7
+ patterns:
8
+ - "*"
9
+ schedule:
10
+ interval: monthly
@@ -0,0 +1,141 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - '**'
9
+ pull_request:
10
+
11
+ concurrency:
12
+ group: ${{ github.head_ref || github.run_id }}
13
+ cancel-in-progress: true
14
+
15
+ env:
16
+ CARGO_TERM_COLOR: always
17
+
18
+ jobs:
19
+ tests:
20
+ name: Python ${{ matrix.python-version }}
21
+ runs-on: ubuntu-24.04
22
+
23
+ strategy:
24
+ matrix:
25
+ python-version:
26
+ - 3.9
27
+ - '3.10'
28
+ - '3.11'
29
+ - '3.12'
30
+ - '3.13'
31
+
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+
35
+ - uses: actions/setup-python@v5
36
+ with:
37
+ python-version: ${{ matrix.python-version }}
38
+ allow-prereleases: true
39
+
40
+ - name: Install uv
41
+ uses: astral-sh/setup-uv@v5
42
+ with:
43
+ enable-cache: true
44
+
45
+ - name: Install dependencies
46
+ run: uv pip install --system tox tox-uv
47
+
48
+ - name: Run tox targets for ${{ matrix.python-version }}
49
+ run: tox run -f py$(echo ${{ matrix.python-version }} | tr -d .)
50
+
51
+ build:
52
+ name: Build os=${{ matrix.os }} target=${{ matrix.target }} ml=${{ matrix.manylinux || 'auto' }}
53
+ if: >
54
+ startsWith(github.ref, 'refs/tags/') ||
55
+ github.ref == 'refs/heads/main' ||
56
+ contains(github.event.pull_request.labels.*.name, 'Build')
57
+ strategy:
58
+ fail-fast: false
59
+ matrix:
60
+ include:
61
+ - os: linux
62
+ target: x86_64
63
+ - os: linux
64
+ target: aarch64
65
+ - os: linux
66
+ target: i686
67
+ - os: linux
68
+ target: armv7
69
+
70
+ # musllinux
71
+ - os: linux
72
+ manylinux: musllinux_1_1
73
+ target: x86_64
74
+ - os: linux
75
+ manylinux: musllinux_1_1
76
+ target: aarch64
77
+
78
+ # macos
79
+ - os: macos
80
+ target: x86_64
81
+ - os: macos
82
+ target: aarch64
83
+
84
+ # windows
85
+ - os: windows
86
+ target: x86_64
87
+ - os: windows
88
+ target: i686
89
+ python-architecture: x86
90
+
91
+ runs-on: ${{ (matrix.os == 'linux' && 'ubuntu-24.04') || (matrix.os == 'macos' && 'macos-14') || (matrix.os == 'windows' && 'windows-2022') || 'unknown' }}
92
+ steps:
93
+ - uses: actions/checkout@v4
94
+
95
+ - uses: actions/setup-python@v5
96
+ with:
97
+ python-version: '3.12'
98
+ architecture: ${{ matrix.python-architecture || 'x64' }}
99
+
100
+ - name: Build sdist
101
+ if: ${{ matrix.os == 'linux' && matrix.target == 'x86_64' }}
102
+ uses: PyO3/maturin-action@v1
103
+ with:
104
+ command: sdist
105
+ args: --out dist
106
+
107
+ - name: Build wheels
108
+ uses: PyO3/maturin-action@v1
109
+ with:
110
+ target: ${{ matrix.target }}
111
+ manylinux: ${{ matrix.manylinux || 'auto' }}
112
+ args: --release --locked --out dist --find-interpreter
113
+
114
+ - run: ${{ (matrix.os == 'windows' && 'dir') || 'ls -lh' }} dist/
115
+
116
+ - uses: actions/upload-artifact@v4
117
+ with:
118
+ name: dist-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux || 'auto' }}
119
+ path: dist
120
+
121
+ release:
122
+ needs: [tests, build]
123
+ if: success() && startsWith(github.ref, 'refs/tags/')
124
+ runs-on: ubuntu-24.04
125
+ environment: release
126
+
127
+ permissions:
128
+ contents: read
129
+ id-token: write
130
+
131
+ steps:
132
+ - uses: actions/checkout@v4
133
+
134
+ - name: get dist artifacts
135
+ uses: actions/download-artifact@v4
136
+ with:
137
+ merge-multiple: true
138
+ pattern: dist-*
139
+ path: dist
140
+
141
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,5 @@
1
+ *.egg-info/
2
+ *.pyc
3
+ /build/
4
+ /dist/
5
+ /target/
@@ -0,0 +1,75 @@
1
+ ci:
2
+ autoupdate_schedule: monthly
3
+ skip:
4
+ - cargo-fmt
5
+
6
+ default_language_version:
7
+ python: python3.13
8
+
9
+ repos:
10
+ - repo: https://github.com/pre-commit/pre-commit-hooks
11
+ rev: v5.0.0
12
+ hooks:
13
+ - id: check-added-large-files
14
+ - id: check-case-conflict
15
+ - id: check-json
16
+ - id: check-merge-conflict
17
+ - id: check-symlinks
18
+ - id: check-toml
19
+ - id: end-of-file-fixer
20
+ - id: trailing-whitespace
21
+ - repo: https://github.com/tox-dev/pyproject-fmt
22
+ rev: v2.5.1
23
+ hooks:
24
+ - id: pyproject-fmt
25
+ - repo: https://github.com/tox-dev/tox-ini-fmt
26
+ rev: 1.5.0
27
+ hooks:
28
+ - id: tox-ini-fmt
29
+ - repo: https://github.com/rstcheck/rstcheck
30
+ rev: v6.2.4
31
+ hooks:
32
+ - id: rstcheck
33
+ additional_dependencies:
34
+ - tomli==2.0.1
35
+ - repo: https://github.com/asottile/pyupgrade
36
+ rev: v3.19.1
37
+ hooks:
38
+ - id: pyupgrade
39
+ args: [--py39-plus]
40
+ - repo: https://github.com/psf/black-pre-commit-mirror
41
+ rev: 25.1.0
42
+ hooks:
43
+ - id: black
44
+ - repo: https://github.com/adamchainz/blacken-docs
45
+ rev: 1.19.1
46
+ hooks:
47
+ - id: blacken-docs
48
+ additional_dependencies:
49
+ - black==25.1.0
50
+ - repo: https://github.com/pycqa/isort
51
+ rev: 6.0.1
52
+ hooks:
53
+ - id: isort
54
+ name: isort (python)
55
+ - repo: https://github.com/PyCQA/flake8
56
+ rev: 7.1.2
57
+ hooks:
58
+ - id: flake8
59
+ additional_dependencies:
60
+ - flake8-bugbear
61
+ - flake8-comprehensions
62
+ - flake8-logging
63
+ - flake8-tidy-imports
64
+ - repo: https://github.com/pre-commit/mirrors-mypy
65
+ rev: v1.15.0
66
+ hooks:
67
+ - id: mypy
68
+ - repo: local
69
+ hooks:
70
+ - id: cargo-fmt
71
+ name: cargo fmt
72
+ entry: cargo fmt --
73
+ language: system
74
+ types: [rust]
75
+ pass_filenames: false
@@ -0,0 +1,8 @@
1
+ =========
2
+ Changelog
3
+ =========
4
+
5
+ 1.0.0 (2025-04-03)
6
+ ------------------
7
+
8
+ * First release on PyPI.
@@ -0,0 +1,340 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 3
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.4.0"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
10
+
11
+ [[package]]
12
+ name = "cc"
13
+ version = "1.2.17"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
16
+ dependencies = [
17
+ "shlex",
18
+ ]
19
+
20
+ [[package]]
21
+ name = "cfg-if"
22
+ version = "1.0.0"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
25
+
26
+ [[package]]
27
+ name = "heck"
28
+ version = "0.5.0"
29
+ source = "registry+https://github.com/rust-lang/crates.io-index"
30
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
31
+
32
+ [[package]]
33
+ name = "indoc"
34
+ version = "2.0.6"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
37
+
38
+ [[package]]
39
+ name = "libc"
40
+ version = "0.2.171"
41
+ source = "registry+https://github.com/rust-lang/crates.io-index"
42
+ checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
43
+
44
+ [[package]]
45
+ name = "log"
46
+ version = "0.4.27"
47
+ source = "registry+https://github.com/rust-lang/crates.io-index"
48
+ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
49
+
50
+ [[package]]
51
+ name = "memoffset"
52
+ version = "0.9.1"
53
+ source = "registry+https://github.com/rust-lang/crates.io-index"
54
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
55
+ dependencies = [
56
+ "autocfg",
57
+ ]
58
+
59
+ [[package]]
60
+ name = "once_cell"
61
+ version = "1.21.3"
62
+ source = "registry+https://github.com/rust-lang/crates.io-index"
63
+ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
64
+
65
+ [[package]]
66
+ name = "portable-atomic"
67
+ version = "1.11.0"
68
+ source = "registry+https://github.com/rust-lang/crates.io-index"
69
+ checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
70
+
71
+ [[package]]
72
+ name = "proc-macro2"
73
+ version = "1.0.94"
74
+ source = "registry+https://github.com/rust-lang/crates.io-index"
75
+ checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
76
+ dependencies = [
77
+ "unicode-ident",
78
+ ]
79
+
80
+ [[package]]
81
+ name = "psm"
82
+ version = "0.1.25"
83
+ source = "registry+https://github.com/rust-lang/crates.io-index"
84
+ checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88"
85
+ dependencies = [
86
+ "cc",
87
+ ]
88
+
89
+ [[package]]
90
+ name = "pyo3"
91
+ version = "0.24.1"
92
+ source = "registry+https://github.com/rust-lang/crates.io-index"
93
+ checksum = "17da310086b068fbdcefbba30aeb3721d5bb9af8db4987d6735b2183ca567229"
94
+ dependencies = [
95
+ "cfg-if",
96
+ "indoc",
97
+ "libc",
98
+ "memoffset",
99
+ "once_cell",
100
+ "portable-atomic",
101
+ "pyo3-build-config",
102
+ "pyo3-ffi",
103
+ "pyo3-macros",
104
+ "unindent",
105
+ ]
106
+
107
+ [[package]]
108
+ name = "pyo3-build-config"
109
+ version = "0.24.1"
110
+ source = "registry+https://github.com/rust-lang/crates.io-index"
111
+ checksum = "e27165889bd793000a098bb966adc4300c312497ea25cf7a690a9f0ac5aa5fc1"
112
+ dependencies = [
113
+ "once_cell",
114
+ "target-lexicon",
115
+ ]
116
+
117
+ [[package]]
118
+ name = "pyo3-ffi"
119
+ version = "0.24.1"
120
+ source = "registry+https://github.com/rust-lang/crates.io-index"
121
+ checksum = "05280526e1dbf6b420062f3ef228b78c0c54ba94e157f5cb724a609d0f2faabc"
122
+ dependencies = [
123
+ "libc",
124
+ "pyo3-build-config",
125
+ ]
126
+
127
+ [[package]]
128
+ name = "pyo3-macros"
129
+ version = "0.24.1"
130
+ source = "registry+https://github.com/rust-lang/crates.io-index"
131
+ checksum = "5c3ce5686aa4d3f63359a5100c62a127c9f15e8398e5fdeb5deef1fed5cd5f44"
132
+ dependencies = [
133
+ "proc-macro2",
134
+ "pyo3-macros-backend",
135
+ "quote",
136
+ "syn",
137
+ ]
138
+
139
+ [[package]]
140
+ name = "pyo3-macros-backend"
141
+ version = "0.24.1"
142
+ source = "registry+https://github.com/rust-lang/crates.io-index"
143
+ checksum = "f4cf6faa0cbfb0ed08e89beb8103ae9724eb4750e3a78084ba4017cbe94f3855"
144
+ dependencies = [
145
+ "heck",
146
+ "proc-macro2",
147
+ "pyo3-build-config",
148
+ "quote",
149
+ "syn",
150
+ ]
151
+
152
+ [[package]]
153
+ name = "quote"
154
+ version = "1.0.40"
155
+ source = "registry+https://github.com/rust-lang/crates.io-index"
156
+ checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
157
+ dependencies = [
158
+ "proc-macro2",
159
+ ]
160
+
161
+ [[package]]
162
+ name = "recursive"
163
+ version = "0.1.1"
164
+ source = "registry+https://github.com/rust-lang/crates.io-index"
165
+ checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e"
166
+ dependencies = [
167
+ "recursive-proc-macro-impl",
168
+ "stacker",
169
+ ]
170
+
171
+ [[package]]
172
+ name = "recursive-proc-macro-impl"
173
+ version = "0.1.1"
174
+ source = "registry+https://github.com/rust-lang/crates.io-index"
175
+ checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b"
176
+ dependencies = [
177
+ "quote",
178
+ "syn",
179
+ ]
180
+
181
+ [[package]]
182
+ name = "shlex"
183
+ version = "1.3.0"
184
+ source = "registry+https://github.com/rust-lang/crates.io-index"
185
+ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
186
+
187
+ [[package]]
188
+ name = "sql-fingerprint"
189
+ version = "1.1.0"
190
+ source = "registry+https://github.com/rust-lang/crates.io-index"
191
+ checksum = "14cf2c43a1910fdd2b6fa118aa2aa9aaf8a0814abd574f5cda941160d1e94d47"
192
+ dependencies = [
193
+ "sqlparser",
194
+ ]
195
+
196
+ [[package]]
197
+ name = "sql-impressao"
198
+ version = "1.0.0"
199
+ dependencies = [
200
+ "pyo3",
201
+ "sql-fingerprint",
202
+ "sqlparser",
203
+ ]
204
+
205
+ [[package]]
206
+ name = "sqlparser"
207
+ version = "0.55.0"
208
+ source = "registry+https://github.com/rust-lang/crates.io-index"
209
+ checksum = "c4521174166bac1ff04fe16ef4524c70144cd29682a45978978ca3d7f4e0be11"
210
+ dependencies = [
211
+ "log",
212
+ "recursive",
213
+ "sqlparser_derive",
214
+ ]
215
+
216
+ [[package]]
217
+ name = "sqlparser_derive"
218
+ version = "0.3.0"
219
+ source = "registry+https://github.com/rust-lang/crates.io-index"
220
+ checksum = "da5fc6819faabb412da764b99d3b713bb55083c11e7e0c00144d386cd6a1939c"
221
+ dependencies = [
222
+ "proc-macro2",
223
+ "quote",
224
+ "syn",
225
+ ]
226
+
227
+ [[package]]
228
+ name = "stacker"
229
+ version = "0.1.20"
230
+ source = "registry+https://github.com/rust-lang/crates.io-index"
231
+ checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9"
232
+ dependencies = [
233
+ "cc",
234
+ "cfg-if",
235
+ "libc",
236
+ "psm",
237
+ "windows-sys",
238
+ ]
239
+
240
+ [[package]]
241
+ name = "syn"
242
+ version = "2.0.100"
243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
244
+ checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
245
+ dependencies = [
246
+ "proc-macro2",
247
+ "quote",
248
+ "unicode-ident",
249
+ ]
250
+
251
+ [[package]]
252
+ name = "target-lexicon"
253
+ version = "0.13.2"
254
+ source = "registry+https://github.com/rust-lang/crates.io-index"
255
+ checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
256
+
257
+ [[package]]
258
+ name = "unicode-ident"
259
+ version = "1.0.18"
260
+ source = "registry+https://github.com/rust-lang/crates.io-index"
261
+ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
262
+
263
+ [[package]]
264
+ name = "unindent"
265
+ version = "0.2.4"
266
+ source = "registry+https://github.com/rust-lang/crates.io-index"
267
+ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
268
+
269
+ [[package]]
270
+ name = "windows-sys"
271
+ version = "0.59.0"
272
+ source = "registry+https://github.com/rust-lang/crates.io-index"
273
+ checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
274
+ dependencies = [
275
+ "windows-targets",
276
+ ]
277
+
278
+ [[package]]
279
+ name = "windows-targets"
280
+ version = "0.52.6"
281
+ source = "registry+https://github.com/rust-lang/crates.io-index"
282
+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
283
+ dependencies = [
284
+ "windows_aarch64_gnullvm",
285
+ "windows_aarch64_msvc",
286
+ "windows_i686_gnu",
287
+ "windows_i686_gnullvm",
288
+ "windows_i686_msvc",
289
+ "windows_x86_64_gnu",
290
+ "windows_x86_64_gnullvm",
291
+ "windows_x86_64_msvc",
292
+ ]
293
+
294
+ [[package]]
295
+ name = "windows_aarch64_gnullvm"
296
+ version = "0.52.6"
297
+ source = "registry+https://github.com/rust-lang/crates.io-index"
298
+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
299
+
300
+ [[package]]
301
+ name = "windows_aarch64_msvc"
302
+ version = "0.52.6"
303
+ source = "registry+https://github.com/rust-lang/crates.io-index"
304
+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
305
+
306
+ [[package]]
307
+ name = "windows_i686_gnu"
308
+ version = "0.52.6"
309
+ source = "registry+https://github.com/rust-lang/crates.io-index"
310
+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
311
+
312
+ [[package]]
313
+ name = "windows_i686_gnullvm"
314
+ version = "0.52.6"
315
+ source = "registry+https://github.com/rust-lang/crates.io-index"
316
+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
317
+
318
+ [[package]]
319
+ name = "windows_i686_msvc"
320
+ version = "0.52.6"
321
+ source = "registry+https://github.com/rust-lang/crates.io-index"
322
+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
323
+
324
+ [[package]]
325
+ name = "windows_x86_64_gnu"
326
+ version = "0.52.6"
327
+ source = "registry+https://github.com/rust-lang/crates.io-index"
328
+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
329
+
330
+ [[package]]
331
+ name = "windows_x86_64_gnullvm"
332
+ version = "0.52.6"
333
+ source = "registry+https://github.com/rust-lang/crates.io-index"
334
+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
335
+
336
+ [[package]]
337
+ name = "windows_x86_64_msvc"
338
+ version = "0.52.6"
339
+ source = "registry+https://github.com/rust-lang/crates.io-index"
340
+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
@@ -0,0 +1,13 @@
1
+ [package]
2
+ name = "sql-impressao"
3
+ version = "1.0.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ name = "sql_impressao"
8
+ crate-type = ["cdylib"]
9
+
10
+ [dependencies]
11
+ pyo3 = "0.24.0"
12
+ sql-fingerprint = "1.0.0"
13
+ sqlparser = "0.55.0"
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Adam Johnson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,119 @@
1
+ Metadata-Version: 2.4
2
+ Name: sql-impressao
3
+ Version: 1.0.0
4
+ Classifier: Development Status :: 5 - Production/Stable
5
+ Classifier: Framework :: Django
6
+ Classifier: Intended Audience :: Developers
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Natural Language :: English
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3 :: Only
11
+ Classifier: Programming Language :: Python :: 3.9
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ License-File: LICENSE
17
+ Summary: A SQL fingerprinter.
18
+ Keywords: SQL
19
+ Author-email: Adam Johnson <me@adamj.eu>
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/x-rst; charset=UTF-8
22
+ Project-URL: Changelog, https://github.com/adamchainz/sql-impressao/blob/main/CHANGELOG.rst
23
+ Project-URL: Funding, https://adamj.eu/books/
24
+ Project-URL: Repository, https://github.com/adamchainz/sql-impressao
25
+
26
+ =============
27
+ sql-impressao
28
+ =============
29
+
30
+ .. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/sql-impressao/main.yml.svg?branch=main&style=for-the-badge
31
+ :target: https://github.com/adamchainz/sql-impressao/actions?workflow=CI
32
+
33
+ .. image:: https://img.shields.io/pypi/v/sql-impressao.svg?style=for-the-badge
34
+ :target: https://pypi.org/project/sql-impressao/
35
+
36
+ .. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge
37
+ :target: https://github.com/pre-commit/pre-commit
38
+ :alt: pre-commit
39
+
40
+ Python bindings for `sql-fingerprint <https://github.com/adamchainz/sql-fingerprint>`__, a SQL fingerprinter.
41
+ (*Impressão digital* is Portuguese for “fingerprint”.)
42
+
43
+ A quick example:
44
+
45
+ .. code-block:: python-console
46
+
47
+ >>> from sql_impressao import fingerprint_one
48
+ >>> fingerprint_one('SELECT a, b FROM cheeses WHERE origin = "France" ORDER BY age DESC')
49
+ 'SELECT ... FROM cheeses WHERE ... ORDER BY ...'
50
+
51
+ ----
52
+
53
+ **Improve your Django and Git skills** with `my books <https://adamj.eu/books/>`__.
54
+
55
+ ----
56
+
57
+ Installation
58
+ ============
59
+
60
+ With **pip**:
61
+
62
+ .. code-block:: sh
63
+
64
+ python -m pip install sql-impressao
65
+
66
+ Python 3.9 to 3.13 supported.
67
+
68
+ Usage
69
+ =====
70
+
71
+ ``fingerprint_one(sql: str, *, dialect: str | None = None) -> str``
72
+ -------------------------------------------------------------------
73
+
74
+ Generate the fingerprint for a single SQL string.
75
+
76
+ ``sql`` is the SQL string to fingerprint.
77
+ It may contain multiple statements separated by semicolons.
78
+
79
+ ``dialect`` is an optional string that specifies the SQL dialect to use.
80
+ Supported names include:
81
+
82
+ * ``generic`` - the default, a generic SQL dialect.
83
+ * ``mysql`` - MySQL dialect.
84
+ * ``postgresql`` or ``postgres`` - PostgreSQL dialect.
85
+ * ``sqlite`` - SQLite dialect.
86
+
87
+ See the `source of the underlying function <https://github.com/apache/datafusion-sqlparser-rs/blob/776b10afe608a88811b807ab795831d55f186ee3/src/dialect/mod.rs#L1038-L1059>`__ for a full list.
88
+
89
+ Example:
90
+
91
+ .. code-block:: python
92
+
93
+ from sql_impressao import fingerprint_one
94
+
95
+ sql = 'SELECT a, b FROM cheeses WHERE origin = "France" ORDER BY age DESC'
96
+ fingerprint = fingerprint_one(sql)
97
+ assert fingerprint == "SELECT ... FROM cheeses WHERE ... ORDER BY ..."
98
+
99
+ ``fingerprint_many(sql: list[str], *, dialect: str | None = None) -> list[str]``
100
+ --------------------------------------------------------------------------------
101
+
102
+ Generate the fingerprints for a list of SQL strings.
103
+ Doing so for a batch of strings allows sharing some state, such as savepoint ID aliases.
104
+
105
+ ``sql`` is a list of SQL strings to fingerprint.
106
+ Each string may contain multiple statements separated by semicolons.
107
+
108
+ ``dialect`` is an optional string that specifies the SQL dialect to use, as above.
109
+
110
+ Example:
111
+
112
+ .. code-block:: python
113
+
114
+ from sql_impressao import fingerprint_many
115
+
116
+ sqls = ["SELECT a, b FROM c", "SELECT b, c FROM d"]
117
+ fingerprints = fingerprint_many(sqls)
118
+ assert fingerprints == ["SELECT ... FROM c", "SELECT ... FROM d"]
119
+
@@ -0,0 +1,93 @@
1
+ =============
2
+ sql-impressao
3
+ =============
4
+
5
+ .. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/sql-impressao/main.yml.svg?branch=main&style=for-the-badge
6
+ :target: https://github.com/adamchainz/sql-impressao/actions?workflow=CI
7
+
8
+ .. image:: https://img.shields.io/pypi/v/sql-impressao.svg?style=for-the-badge
9
+ :target: https://pypi.org/project/sql-impressao/
10
+
11
+ .. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge
12
+ :target: https://github.com/pre-commit/pre-commit
13
+ :alt: pre-commit
14
+
15
+ Python bindings for `sql-fingerprint <https://github.com/adamchainz/sql-fingerprint>`__, a SQL fingerprinter.
16
+ (*Impressão digital* is Portuguese for “fingerprint”.)
17
+
18
+ A quick example:
19
+
20
+ .. code-block:: python-console
21
+
22
+ >>> from sql_impressao import fingerprint_one
23
+ >>> fingerprint_one('SELECT a, b FROM cheeses WHERE origin = "France" ORDER BY age DESC')
24
+ 'SELECT ... FROM cheeses WHERE ... ORDER BY ...'
25
+
26
+ ----
27
+
28
+ **Improve your Django and Git skills** with `my books <https://adamj.eu/books/>`__.
29
+
30
+ ----
31
+
32
+ Installation
33
+ ============
34
+
35
+ With **pip**:
36
+
37
+ .. code-block:: sh
38
+
39
+ python -m pip install sql-impressao
40
+
41
+ Python 3.9 to 3.13 supported.
42
+
43
+ Usage
44
+ =====
45
+
46
+ ``fingerprint_one(sql: str, *, dialect: str | None = None) -> str``
47
+ -------------------------------------------------------------------
48
+
49
+ Generate the fingerprint for a single SQL string.
50
+
51
+ ``sql`` is the SQL string to fingerprint.
52
+ It may contain multiple statements separated by semicolons.
53
+
54
+ ``dialect`` is an optional string that specifies the SQL dialect to use.
55
+ Supported names include:
56
+
57
+ * ``generic`` - the default, a generic SQL dialect.
58
+ * ``mysql`` - MySQL dialect.
59
+ * ``postgresql`` or ``postgres`` - PostgreSQL dialect.
60
+ * ``sqlite`` - SQLite dialect.
61
+
62
+ See the `source of the underlying function <https://github.com/apache/datafusion-sqlparser-rs/blob/776b10afe608a88811b807ab795831d55f186ee3/src/dialect/mod.rs#L1038-L1059>`__ for a full list.
63
+
64
+ Example:
65
+
66
+ .. code-block:: python
67
+
68
+ from sql_impressao import fingerprint_one
69
+
70
+ sql = 'SELECT a, b FROM cheeses WHERE origin = "France" ORDER BY age DESC'
71
+ fingerprint = fingerprint_one(sql)
72
+ assert fingerprint == "SELECT ... FROM cheeses WHERE ... ORDER BY ..."
73
+
74
+ ``fingerprint_many(sql: list[str], *, dialect: str | None = None) -> list[str]``
75
+ --------------------------------------------------------------------------------
76
+
77
+ Generate the fingerprints for a list of SQL strings.
78
+ Doing so for a batch of strings allows sharing some state, such as savepoint ID aliases.
79
+
80
+ ``sql`` is a list of SQL strings to fingerprint.
81
+ Each string may contain multiple statements separated by semicolons.
82
+
83
+ ``dialect`` is an optional string that specifies the SQL dialect to use, as above.
84
+
85
+ Example:
86
+
87
+ .. code-block:: python
88
+
89
+ from sql_impressao import fingerprint_many
90
+
91
+ sqls = ["SELECT a, b FROM c", "SELECT b, c FROM d"]
92
+ fingerprints = fingerprint_many(sqls)
93
+ assert fingerprints == ["SELECT ... FROM c", "SELECT ... FROM d"]
@@ -0,0 +1,50 @@
1
+ [build-system]
2
+ build-backend = "maturin"
3
+ requires = [ "maturin>=1.8,<2" ]
4
+
5
+ [project]
6
+ name = "sql-impressao"
7
+ version = "1.0.0"
8
+ description = "A SQL fingerprinter."
9
+ readme = "README.rst"
10
+ keywords = [
11
+ "SQL",
12
+ ]
13
+ authors = [
14
+ { name = "Adam Johnson", email = "me@adamj.eu" },
15
+ ]
16
+ requires-python = ">=3.9"
17
+ classifiers = [
18
+ "Development Status :: 5 - Production/Stable",
19
+ "Framework :: Django",
20
+ "Intended Audience :: Developers",
21
+ "License :: OSI Approved :: MIT License",
22
+ "Natural Language :: English",
23
+ "Operating System :: OS Independent",
24
+ "Programming Language :: Python :: 3 :: Only",
25
+ "Programming Language :: Python :: 3.9",
26
+ "Programming Language :: Python :: 3.10",
27
+ "Programming Language :: Python :: 3.11",
28
+ "Programming Language :: Python :: 3.12",
29
+ "Programming Language :: Python :: 3.13",
30
+ ]
31
+ urls.Changelog = "https://github.com/adamchainz/sql-impressao/blob/main/CHANGELOG.rst"
32
+ urls.Funding = "https://adamj.eu/books/"
33
+ urls.Repository = "https://github.com/adamchainz/sql-impressao"
34
+
35
+ [dependency-groups]
36
+ test = [
37
+ "pytest",
38
+ ]
39
+
40
+ [tool.maturin]
41
+ include = [
42
+ "rust-toolchain.toml",
43
+ ]
44
+ features = [ "pyo3/extension-module" ]
45
+
46
+ [tool.pyproject-fmt]
47
+ max_supported_python = "3.13"
48
+
49
+ [tool.rstcheck]
50
+ report_level = "ERROR"
@@ -0,0 +1,2 @@
1
+ [toolchain]
2
+ channel = "1.81"
@@ -0,0 +1,2 @@
1
+ def fingerprint_one(sql: str, *, dialect: str | None = None) -> str: ...
2
+ def fingerprint_many(sql: list[str], *, dialect: str | None = None) -> list[str]: ...
@@ -0,0 +1,45 @@
1
+ use ::sql_fingerprint;
2
+ use pyo3::prelude::*;
3
+ use sqlparser::dialect::dialect_from_str;
4
+
5
+ #[pyfunction]
6
+ #[pyo3(signature = (sql, *, dialect = None))]
7
+ fn fingerprint_one(sql: String, dialect: Option<String>) -> PyResult<String> {
8
+ let parsed_dialect = parse_dialect(dialect)?;
9
+ Ok(sql_fingerprint::fingerprint_one(
10
+ sql.as_str(),
11
+ parsed_dialect.as_deref(),
12
+ ))
13
+ }
14
+
15
+ #[pyfunction]
16
+ #[pyo3(signature = (sql, *, dialect = None))]
17
+ fn fingerprint_many(sql: Vec<String>, dialect: Option<String>) -> PyResult<Vec<String>> {
18
+ let parsed_dialect = parse_dialect(dialect)?;
19
+ let sql_slices: Vec<&str> = sql.iter().map(|s| s.as_str()).collect();
20
+ Ok(sql_fingerprint::fingerprint_many(
21
+ sql_slices,
22
+ parsed_dialect.as_deref(),
23
+ ))
24
+ }
25
+
26
+ fn parse_dialect(
27
+ dialect_str: Option<String>,
28
+ ) -> PyResult<Option<Box<dyn sqlparser::dialect::Dialect>>> {
29
+ let dialect_name = dialect_str.unwrap_or_else(|| "generic".to_string());
30
+ let dialect = dialect_from_str(&dialect_name);
31
+ match dialect {
32
+ Some(d) => Ok(Some(d)),
33
+ None => Err(pyo3::exceptions::PyValueError::new_err(format!(
34
+ "Invalid SQL dialect: {}",
35
+ dialect_name
36
+ ))),
37
+ }
38
+ }
39
+
40
+ #[pymodule]
41
+ fn sql_impressao(m: &Bound<'_, PyModule>) -> PyResult<()> {
42
+ m.add_function(wrap_pyfunction!(fingerprint_one, m)?)?;
43
+ m.add_function(wrap_pyfunction!(fingerprint_many, m)?)?;
44
+ Ok(())
45
+ }
File without changes
@@ -0,0 +1,25 @@
1
+ from sql_impressao import fingerprint_many, fingerprint_one
2
+
3
+
4
+ def test_fingerprint_one():
5
+ sql = "SELECT a, b FROM c WHERE d = e ORDER BY f"
6
+ result = fingerprint_one(sql)
7
+ assert result == "SELECT ... FROM c WHERE ... ORDER BY ..."
8
+
9
+
10
+ def test_fingerprint_one_dialect():
11
+ sql = "SELECT a, b FROM c WHERE d = e ORDER BY f"
12
+ result = fingerprint_one(sql, dialect="postgresql")
13
+ assert result == "SELECT ... FROM c WHERE ... ORDER BY ..."
14
+
15
+
16
+ def test_fingerprint_many():
17
+ sqls = ["SELECT a FROM b", "SELECT c FROM d"]
18
+ result = fingerprint_many(sqls)
19
+ assert result == ["SELECT ... FROM b", "SELECT ... FROM d"]
20
+
21
+
22
+ def test_fingerprint_many_dialect():
23
+ sqls = ["SELECT a FROM b", "SELECT c FROM d"]
24
+ result = fingerprint_many(sqls, dialect="postgresql")
25
+ assert result == ["SELECT ... FROM b", "SELECT ... FROM d"]
@@ -0,0 +1,23 @@
1
+ [tox]
2
+ requires =
3
+ tox>=4.2
4
+ env_list =
5
+ py{313, 312, 311, 310, 39}
6
+
7
+ [testenv]
8
+ runner = uv-venv-lock-runner
9
+ package = wheel
10
+ set_env =
11
+ PYTHONDEVMODE = 1
12
+ commands =
13
+ python \
14
+ -W error::ResourceWarning \
15
+ -W error::DeprecationWarning \
16
+ -W error::PendingDeprecationWarning \
17
+ -m pytest {posargs:tests}
18
+ dependency_groups =
19
+ test
20
+
21
+ [flake8]
22
+ max-line-length = 88
23
+ extend-ignore = E203,E501
@@ -0,0 +1,119 @@
1
+ version = 1
2
+ revision = 1
3
+ requires-python = ">=3.9"
4
+
5
+ [[package]]
6
+ name = "colorama"
7
+ version = "0.4.6"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "exceptiongroup"
16
+ version = "1.2.2"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
19
+ wheels = [
20
+ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
21
+ ]
22
+
23
+ [[package]]
24
+ name = "iniconfig"
25
+ version = "2.1.0"
26
+ source = { registry = "https://pypi.org/simple" }
27
+ sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 }
28
+ wheels = [
29
+ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 },
30
+ ]
31
+
32
+ [[package]]
33
+ name = "packaging"
34
+ version = "24.2"
35
+ source = { registry = "https://pypi.org/simple" }
36
+ sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
37
+ wheels = [
38
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
39
+ ]
40
+
41
+ [[package]]
42
+ name = "pluggy"
43
+ version = "1.5.0"
44
+ source = { registry = "https://pypi.org/simple" }
45
+ sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
46
+ wheels = [
47
+ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
48
+ ]
49
+
50
+ [[package]]
51
+ name = "pytest"
52
+ version = "8.3.5"
53
+ source = { registry = "https://pypi.org/simple" }
54
+ dependencies = [
55
+ { name = "colorama", marker = "sys_platform == 'win32'" },
56
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
57
+ { name = "iniconfig" },
58
+ { name = "packaging" },
59
+ { name = "pluggy" },
60
+ { name = "tomli", marker = "python_full_version < '3.11'" },
61
+ ]
62
+ sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 }
63
+ wheels = [
64
+ { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 },
65
+ ]
66
+
67
+ [[package]]
68
+ name = "sql-impressao"
69
+ version = "1.0.0"
70
+ source = { editable = "." }
71
+
72
+ [package.dev-dependencies]
73
+ test = [
74
+ { name = "pytest" },
75
+ ]
76
+
77
+ [package.metadata]
78
+
79
+ [package.metadata.requires-dev]
80
+ test = [{ name = "pytest" }]
81
+
82
+ [[package]]
83
+ name = "tomli"
84
+ version = "2.2.1"
85
+ source = { registry = "https://pypi.org/simple" }
86
+ sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
87
+ wheels = [
88
+ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
89
+ { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
90
+ { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
91
+ { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
92
+ { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
93
+ { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
94
+ { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
95
+ { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
96
+ { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
97
+ { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
98
+ { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
99
+ { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
100
+ { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
101
+ { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
102
+ { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
103
+ { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
104
+ { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
105
+ { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
106
+ { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
107
+ { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
108
+ { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
109
+ { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
110
+ { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
111
+ { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
112
+ { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
113
+ { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
114
+ { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
115
+ { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
116
+ { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
117
+ { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
118
+ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
119
+ ]