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.
- sql_impressao-1.0.0/.editorconfig +17 -0
- sql_impressao-1.0.0/.github/CODE_OF_CONDUCT.md +1 -0
- sql_impressao-1.0.0/.github/ISSUE_TEMPLATE/config.yml +1 -0
- sql_impressao-1.0.0/.github/ISSUE_TEMPLATE/feature-request.yml +10 -0
- sql_impressao-1.0.0/.github/ISSUE_TEMPLATE/issue.yml +18 -0
- sql_impressao-1.0.0/.github/SECURITY.md +1 -0
- sql_impressao-1.0.0/.github/dependabot.yml +10 -0
- sql_impressao-1.0.0/.github/workflows/main.yml +141 -0
- sql_impressao-1.0.0/.gitignore +5 -0
- sql_impressao-1.0.0/.pre-commit-config.yaml +75 -0
- sql_impressao-1.0.0/CHANGELOG.rst +8 -0
- sql_impressao-1.0.0/Cargo.lock +340 -0
- sql_impressao-1.0.0/Cargo.toml +13 -0
- sql_impressao-1.0.0/LICENSE +21 -0
- sql_impressao-1.0.0/PKG-INFO +119 -0
- sql_impressao-1.0.0/README.rst +93 -0
- sql_impressao-1.0.0/pyproject.toml +50 -0
- sql_impressao-1.0.0/rust-toolchain.toml +2 -0
- sql_impressao-1.0.0/sql_fingerprint.pyi +2 -0
- sql_impressao-1.0.0/src/lib.rs +45 -0
- sql_impressao-1.0.0/tests/__init__.py +0 -0
- sql_impressao-1.0.0/tests/test_sql_impressao.py +25 -0
- sql_impressao-1.0.0/tox.ini +23 -0
- sql_impressao-1.0.0/uv.lock +119 -0
|
@@ -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,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,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,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,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,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
|
+
]
|