pixel-sizes 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ [report]
2
+ exclude_lines =
3
+ @overload
4
+ pragma: no cover
@@ -0,0 +1,10 @@
1
+ root = true
2
+
3
+ [*]
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+ trim_trailing_whitespace = true
7
+ charset = utf-8
8
+
9
+ [{Makefile,**.mk}]
10
+ indent_style = tab
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "github>kitsuyui/renovate-config"
5
+ ]
6
+ }
@@ -0,0 +1,16 @@
1
+ name: Update gitignore file
2
+
3
+ on:
4
+ schedule:
5
+ # daily at 00:00
6
+ - cron: '0 0 * * *'
7
+
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
11
+
12
+ jobs:
13
+ update-gitignore:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: gitignore-in/gh-action@v0.2.0
@@ -0,0 +1,18 @@
1
+ name: happy-commit
2
+ on:
3
+ - pull_request
4
+
5
+ permissions:
6
+ contents: read
7
+ pull-requests: write
8
+ issues: write
9
+
10
+ jobs:
11
+ happy:
12
+ runs-on: ubuntu-latest
13
+ name: happy
14
+ continue-on-error: true
15
+ steps:
16
+ - uses: kitsuyui/happy-commit@v0.9
17
+ with:
18
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,57 @@
1
+ name: Packaging
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, reopened]
6
+ release:
7
+ # "released" events are emitted either when directly be released or be edited from pre-released.
8
+ types: [prereleased, released]
9
+
10
+ env:
11
+ python_version: 3.12
12
+
13
+ jobs:
14
+ deploy:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ id: setup-python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: ${{ env.python_version }}
24
+
25
+ - name: Set up poetry
26
+ uses: abatilo/actions-poetry@v3
27
+
28
+ - name: Cache
29
+ uses: actions/cache@v4
30
+ with:
31
+ path: ~/.cache/pypoetry/virtualenvs
32
+ key: ${{ runner.os }}-build-${{ env.python_version }}-${{ hashFiles('**/poetry.lock') }}
33
+ restore-keys: |
34
+ ${{ runner.os }}-build-${{ env.python_version }}-${{ hashFiles('**/poetry.lock') }}
35
+ ${{ runner.os }}-build-${{ env.python_version }}-
36
+ ${{ runner.os }}-
37
+
38
+ - run: poetry install
39
+
40
+ - name: Build
41
+ # I use poetry just as a package manager, so this is not `poetry build`
42
+ run: poetry run poe build
43
+
44
+ - name: Publish distribution to Test PyPI
45
+ uses: pypa/gh-action-pypi-publish@release/v1
46
+ if: github.event_name == 'release' && github.event.release.prerelease
47
+ with:
48
+ user: __token__
49
+ password: ${{ secrets.TEST_PYPI_API_TOKEN }}
50
+ repository-url: https://test.pypi.org/legacy/
51
+
52
+ - name: Publish distribution to PyPI
53
+ if: github.event_name == 'release' && !github.event.release.prerelease
54
+ uses: pypa/gh-action-pypi-publish@release/v1
55
+ with:
56
+ user: __token__
57
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,70 @@
1
+ name: Test
2
+ on:
3
+ # pull-request events are not triggered when a PR is merged
4
+ # push events are not triggered when a PR created from a fork repository
5
+ # So we need both to run tests on every PR and after merging
6
+ pull_request:
7
+ push:
8
+ branches:
9
+ - main
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ python: ["3.8", "3.9", "3.10", "3.11", "3.12"]
18
+
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Set up Python
24
+ id: setup-python
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: "${{ matrix.python }}"
28
+
29
+ - name: Set up poetry
30
+ uses: abatilo/actions-poetry@v3
31
+
32
+ - name: Cache
33
+ uses: actions/cache@v4
34
+ with:
35
+ path: ~/.cache/pypoetry/virtualenvs
36
+ key: ${{ runner.os }}-build-${{ matrix.python }}-${{ hashFiles('**/poetry.lock') }}
37
+ restore-keys: |
38
+ ${{ runner.os }}-build-${{ matrix.python }}-${{ hashFiles('**/poetry.lock') }}
39
+ ${{ runner.os }}-build-${{ matrix.python }}-
40
+ ${{ runner.os }}-
41
+ - name: Install dependencies
42
+ run: poetry install
43
+
44
+ - name: Lint
45
+ run: poetry run poe check
46
+
47
+ - name: Check Python version
48
+ run: |
49
+ actual_version=$(poetry run python --version)
50
+ expected_version="Python ${{ matrix.python }}"
51
+ if [ "$actual_version" == *"$expected_version"* ]; then
52
+ echo "Expected $expected_version, but got $actual_version"
53
+ exit 1
54
+ fi
55
+ - name: Test
56
+ run: poetry run poe test
57
+
58
+ - name: Coverage
59
+ run: poetry run poe coverage-xml
60
+
61
+ - name: Upload coverage report to Codecov
62
+ if: matrix.python == '3.12'
63
+ uses: codecov/codecov-action@v4
64
+ with:
65
+ token: ${{ secrets.CODECOV_TOKEN }}
66
+ files: ./coverage.xml
67
+ flags: unittests
68
+ name: codecov-umbrella
69
+ fail_ci_if_error: true
70
+ verbose: true
@@ -0,0 +1,16 @@
1
+ name: Spellcheck
2
+ on:
3
+ - pull_request
4
+ permissions:
5
+ contents: read
6
+ jobs:
7
+ check:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - name: Checkout
11
+ uses: actions/checkout@v4
12
+
13
+ - name: Check spelling
14
+ uses: crate-ci/typos@master
15
+ # typos is a Source code spell checker
16
+ # https://github.com/crate-ci/typos
@@ -0,0 +1,249 @@
1
+ # DO NOT EDIT THIS FILE
2
+ # Generated by gitignore.in
3
+ # Edit .gitignore.in instead of this file
4
+ # Run `gitignore.in` to build .gitignore
5
+ # -----------------------------------------------------------------------------
6
+ # gibo dump Linux
7
+ ### Generated by gibo (https://github.com/simonwhitaker/gibo)
8
+ ### https://raw.github.com/github/gitignore/4488915eec0b3a45b5c63ead28f286819c0917de/Global/Linux.gitignore
9
+
10
+ *~
11
+
12
+ # temporary files which can be created if a process still has a handle open of a deleted file
13
+ .fuse_hidden*
14
+
15
+ # KDE directory preferences
16
+ .directory
17
+
18
+ # Linux trash folder which might appear on any partition or disk
19
+ .Trash-*
20
+
21
+ # .nfs files are created when an open file is removed but is still being accessed
22
+ .nfs*
23
+ # -----------------------------------------------------------------------------
24
+ # gibo dump Windows
25
+ ### Generated by gibo (https://github.com/simonwhitaker/gibo)
26
+ ### https://raw.github.com/github/gitignore/4488915eec0b3a45b5c63ead28f286819c0917de/Global/Windows.gitignore
27
+
28
+ # Windows thumbnail cache files
29
+ Thumbs.db
30
+ Thumbs.db:encryptable
31
+ ehthumbs.db
32
+ ehthumbs_vista.db
33
+
34
+ # Dump file
35
+ *.stackdump
36
+
37
+ # Folder config file
38
+ [Dd]esktop.ini
39
+
40
+ # Recycle Bin used on file shares
41
+ $RECYCLE.BIN/
42
+
43
+ # Windows Installer files
44
+ *.cab
45
+ *.msi
46
+ *.msix
47
+ *.msm
48
+ *.msp
49
+
50
+ # Windows shortcuts
51
+ *.lnk
52
+ # -----------------------------------------------------------------------------
53
+ # gibo dump macOS
54
+ ### Generated by gibo (https://github.com/simonwhitaker/gibo)
55
+ ### https://raw.github.com/github/gitignore/4488915eec0b3a45b5c63ead28f286819c0917de/Global/macOS.gitignore
56
+
57
+ # General
58
+ .DS_Store
59
+ .AppleDouble
60
+ .LSOverride
61
+
62
+ # Icon must end with two \r
63
+ Icon
64
+
65
+ # Thumbnails
66
+ ._*
67
+
68
+ # Files that might appear in the root of a volume
69
+ .DocumentRevisions-V100
70
+ .fseventsd
71
+ .Spotlight-V100
72
+ .TemporaryItems
73
+ .Trashes
74
+ .VolumeIcon.icns
75
+ .com.apple.timemachine.donotpresent
76
+
77
+ # Directories potentially created on remote AFP share
78
+ .AppleDB
79
+ .AppleDesktop
80
+ Network Trash Folder
81
+ Temporary Items
82
+ .apdisk
83
+ # -----------------------------------------------------------------------------
84
+ # gibo dump Python
85
+ ### Generated by gibo (https://github.com/simonwhitaker/gibo)
86
+ ### https://raw.github.com/github/gitignore/4488915eec0b3a45b5c63ead28f286819c0917de/Python.gitignore
87
+
88
+ # Byte-compiled / optimized / DLL files
89
+ __pycache__/
90
+ *.py[cod]
91
+ *$py.class
92
+
93
+ # C extensions
94
+ *.so
95
+
96
+ # Distribution / packaging
97
+ .Python
98
+ build/
99
+ develop-eggs/
100
+ dist/
101
+ downloads/
102
+ eggs/
103
+ .eggs/
104
+ lib/
105
+ lib64/
106
+ parts/
107
+ sdist/
108
+ var/
109
+ wheels/
110
+ share/python-wheels/
111
+ *.egg-info/
112
+ .installed.cfg
113
+ *.egg
114
+ MANIFEST
115
+
116
+ # PyInstaller
117
+ # Usually these files are written by a python script from a template
118
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
119
+ *.manifest
120
+ *.spec
121
+
122
+ # Installer logs
123
+ pip-log.txt
124
+ pip-delete-this-directory.txt
125
+
126
+ # Unit test / coverage reports
127
+ htmlcov/
128
+ .tox/
129
+ .nox/
130
+ .coverage
131
+ .coverage.*
132
+ .cache
133
+ nosetests.xml
134
+ coverage.xml
135
+ *.cover
136
+ *.py,cover
137
+ .hypothesis/
138
+ .pytest_cache/
139
+ cover/
140
+
141
+ # Translations
142
+ *.mo
143
+ *.pot
144
+
145
+ # Django stuff:
146
+ *.log
147
+ local_settings.py
148
+ db.sqlite3
149
+ db.sqlite3-journal
150
+
151
+ # Flask stuff:
152
+ instance/
153
+ .webassets-cache
154
+
155
+ # Scrapy stuff:
156
+ .scrapy
157
+
158
+ # Sphinx documentation
159
+ docs/_build/
160
+
161
+ # PyBuilder
162
+ .pybuilder/
163
+ target/
164
+
165
+ # Jupyter Notebook
166
+ .ipynb_checkpoints
167
+
168
+ # IPython
169
+ profile_default/
170
+ ipython_config.py
171
+
172
+ # pyenv
173
+ # For a library or package, you might want to ignore these files since the code is
174
+ # intended to run in multiple environments; otherwise, check them in:
175
+ # .python-version
176
+
177
+ # pipenv
178
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
179
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
180
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
181
+ # install all needed dependencies.
182
+ #Pipfile.lock
183
+
184
+ # poetry
185
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
186
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
187
+ # commonly ignored for libraries.
188
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
189
+ #poetry.lock
190
+
191
+ # pdm
192
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
193
+ #pdm.lock
194
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
195
+ # in version control.
196
+ # https://pdm.fming.dev/#use-with-ide
197
+ .pdm.toml
198
+
199
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
200
+ __pypackages__/
201
+
202
+ # Celery stuff
203
+ celerybeat-schedule
204
+ celerybeat.pid
205
+
206
+ # SageMath parsed files
207
+ *.sage.py
208
+
209
+ # Environments
210
+ .env
211
+ .venv
212
+ env/
213
+ venv/
214
+ ENV/
215
+ env.bak/
216
+ venv.bak/
217
+
218
+ # Spyder project settings
219
+ .spyderproject
220
+ .spyproject
221
+
222
+ # Rope project settings
223
+ .ropeproject
224
+
225
+ # mkdocs documentation
226
+ /site
227
+
228
+ # mypy
229
+ .mypy_cache/
230
+ .dmypy.json
231
+ dmypy.json
232
+
233
+ # Pyre type checker
234
+ .pyre/
235
+
236
+ # pytype static type analyzer
237
+ .pytype/
238
+
239
+ # Cython debug symbols
240
+ cython_debug/
241
+
242
+ # PyCharm
243
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
244
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
245
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
246
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
247
+ #.idea/
248
+ # -----------------------------------------------------------------------------
249
+ _version.py
@@ -0,0 +1,5 @@
1
+ gibo dump Linux
2
+ gibo dump Windows
3
+ gibo dump macOS
4
+ gibo dump Python
5
+ echo '_version.py'
@@ -0,0 +1,11 @@
1
+ Copyright 2022 Kitsu Yui
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
+
5
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
6
+
7
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8
+
9
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
10
+
11
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,37 @@
1
+ Metadata-Version: 2.1
2
+ Name: pixel-sizes
3
+ Version: 0.1.0
4
+ Summary: Dictionary of pixel sizes
5
+ Home-page: https://github.com/kitsuyui/pixel-sizes
6
+ Author: Yui Kitsu
7
+ Author-email: kitsuyui+github@kitsuyui.com
8
+ License: BSD-3-Clause
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: License :: OSI Approved :: BSD License
11
+ Classifier: Programming Language :: Python :: 3.8
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Topic :: Software Development :: Libraries
18
+ Requires-Python: >=3.8
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+
22
+ # python-pixel-sizes
23
+
24
+ [![codecov](https://codecov.io/gh/kitsuyui/python-pixel-sizes/graph/badge.svg?token=830WMASKHU)](https://codecov.io/gh/kitsuyui/python-pixel-sizes)
25
+
26
+ ## Usage
27
+
28
+ ```python
29
+ from pixel_sizes import SIZES
30
+
31
+ SIZES['8k'].width # 7680
32
+ SIZES['8k'].height # 4320
33
+ SIZES['8k'].aspect_ratio() # 16/9 == 1.7777777777777777
34
+
35
+ # LICENSE
36
+
37
+ The 3-Clause BSD License. See also LICENSE file.
@@ -0,0 +1,16 @@
1
+ # python-pixel-sizes
2
+
3
+ [![codecov](https://codecov.io/gh/kitsuyui/python-pixel-sizes/graph/badge.svg?token=830WMASKHU)](https://codecov.io/gh/kitsuyui/python-pixel-sizes)
4
+
5
+ ## Usage
6
+
7
+ ```python
8
+ from pixel_sizes import SIZES
9
+
10
+ SIZES['8k'].width # 7680
11
+ SIZES['8k'].height # 4320
12
+ SIZES['8k'].aspect_ratio() # 16/9 == 1.7777777777777777
13
+
14
+ # LICENSE
15
+
16
+ The 3-Clause BSD License. See also LICENSE file.
@@ -0,0 +1,29 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(frozen=True)
5
+ class Size:
6
+ width: int
7
+ height: int
8
+
9
+ def aspect_ratio(self):
10
+ return self.width / self.height
11
+
12
+ def rotate(self):
13
+ return Size(self.height, self.width)
14
+
15
+
16
+ SIZES = {
17
+ "8k": Size(7680, 4320),
18
+ "4k": Size(3840, 2160),
19
+ "2k": Size(2560, 1440),
20
+ "Full HD": Size(1920, 1080),
21
+ "HD": Size(1280, 720),
22
+ "480p": Size(854, 480),
23
+ "360p": Size(640, 360),
24
+ "240p": Size(426, 240),
25
+ "144p": Size(256, 144),
26
+ }
27
+
28
+
29
+ __all__ = ["Size", "SIZES"]
@@ -0,0 +1,16 @@
1
+ # file generated by setuptools_scm
2
+ # don't change, don't track in version control
3
+ TYPE_CHECKING = False
4
+ if TYPE_CHECKING:
5
+ from typing import Tuple, Union
6
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
7
+ else:
8
+ VERSION_TUPLE = object
9
+
10
+ version: str
11
+ __version__: str
12
+ __version_tuple__: VERSION_TUPLE
13
+ version_tuple: VERSION_TUPLE
14
+
15
+ __version__ = version = '0.1.0'
16
+ __version_tuple__ = version_tuple = (0, 1, 0)
File without changes
@@ -0,0 +1,37 @@
1
+ Metadata-Version: 2.1
2
+ Name: pixel-sizes
3
+ Version: 0.1.0
4
+ Summary: Dictionary of pixel sizes
5
+ Home-page: https://github.com/kitsuyui/pixel-sizes
6
+ Author: Yui Kitsu
7
+ Author-email: kitsuyui+github@kitsuyui.com
8
+ License: BSD-3-Clause
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: License :: OSI Approved :: BSD License
11
+ Classifier: Programming Language :: Python :: 3.8
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Topic :: Software Development :: Libraries
18
+ Requires-Python: >=3.8
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+
22
+ # python-pixel-sizes
23
+
24
+ [![codecov](https://codecov.io/gh/kitsuyui/python-pixel-sizes/graph/badge.svg?token=830WMASKHU)](https://codecov.io/gh/kitsuyui/python-pixel-sizes)
25
+
26
+ ## Usage
27
+
28
+ ```python
29
+ from pixel_sizes import SIZES
30
+
31
+ SIZES['8k'].width # 7680
32
+ SIZES['8k'].height # 4320
33
+ SIZES['8k'].aspect_ratio() # 16/9 == 1.7777777777777777
34
+
35
+ # LICENSE
36
+
37
+ The 3-Clause BSD License. See also LICENSE file.
@@ -0,0 +1,24 @@
1
+ .coveragerc
2
+ .editorconfig
3
+ .gitignore
4
+ .gitignore.in
5
+ LICENSE
6
+ README.md
7
+ poetry.lock
8
+ pyproject.toml
9
+ setup.cfg
10
+ .github/renovate.json5
11
+ .github/workflows/gitignore-in.yml
12
+ .github/workflows/happy.yml
13
+ .github/workflows/pypi-publish.yml
14
+ .github/workflows/python-test.yml
15
+ .github/workflows/spellcheck.yml
16
+ pixel_sizes/__init__.py
17
+ pixel_sizes/_version.py
18
+ pixel_sizes/py.typed
19
+ pixel_sizes.egg-info/PKG-INFO
20
+ pixel_sizes.egg-info/SOURCES.txt
21
+ pixel_sizes.egg-info/dependency_links.txt
22
+ pixel_sizes.egg-info/top_level.txt
23
+ tests/__init__.py
24
+ tests/test_basis.py
@@ -0,0 +1 @@
1
+ pixel_sizes
@@ -0,0 +1,362 @@
1
+ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
2
+
3
+ [[package]]
4
+ name = "build"
5
+ version = "1.1.1"
6
+ description = "A simple, correct Python build frontend"
7
+ optional = false
8
+ python-versions = ">= 3.7"
9
+ files = [
10
+ {file = "build-1.1.1-py3-none-any.whl", hash = "sha256:8ed0851ee76e6e38adce47e4bee3b51c771d86c64cf578d0c2245567ee200e73"},
11
+ {file = "build-1.1.1.tar.gz", hash = "sha256:8eea65bb45b1aac2e734ba2cc8dad3a6d97d97901a395bd0ed3e7b46953d2a31"},
12
+ ]
13
+
14
+ [package.dependencies]
15
+ colorama = {version = "*", markers = "os_name == \"nt\""}
16
+ importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""}
17
+ packaging = ">=19.0"
18
+ pyproject_hooks = "*"
19
+ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
20
+
21
+ [package.extras]
22
+ docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"]
23
+ test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"]
24
+ typing = ["importlib-metadata (>=5.1)", "mypy (>=1.5.0,<1.6.0)", "tomli", "typing-extensions (>=3.7.4.3)"]
25
+ virtualenv = ["virtualenv (>=20.0.35)"]
26
+
27
+ [[package]]
28
+ name = "colorama"
29
+ version = "0.4.6"
30
+ description = "Cross-platform colored terminal text."
31
+ optional = false
32
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
33
+ files = [
34
+ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
35
+ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
36
+ ]
37
+
38
+ [[package]]
39
+ name = "coverage"
40
+ version = "7.4.4"
41
+ description = "Code coverage measurement for Python"
42
+ optional = false
43
+ python-versions = ">=3.8"
44
+ files = [
45
+ {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"},
46
+ {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"},
47
+ {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"},
48
+ {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"},
49
+ {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"},
50
+ {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"},
51
+ {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"},
52
+ {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"},
53
+ {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"},
54
+ {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"},
55
+ {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"},
56
+ {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"},
57
+ {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"},
58
+ {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"},
59
+ {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"},
60
+ {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"},
61
+ {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"},
62
+ {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"},
63
+ {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"},
64
+ {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"},
65
+ {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"},
66
+ {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"},
67
+ {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"},
68
+ {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"},
69
+ {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"},
70
+ {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"},
71
+ {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"},
72
+ {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"},
73
+ {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"},
74
+ {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"},
75
+ {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"},
76
+ {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"},
77
+ {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"},
78
+ {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"},
79
+ {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"},
80
+ {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"},
81
+ {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"},
82
+ {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"},
83
+ {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"},
84
+ {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"},
85
+ {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"},
86
+ {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"},
87
+ {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"},
88
+ {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"},
89
+ {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"},
90
+ {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"},
91
+ {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"},
92
+ {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"},
93
+ {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"},
94
+ {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"},
95
+ {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"},
96
+ {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"},
97
+ ]
98
+
99
+ [package.dependencies]
100
+ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
101
+
102
+ [package.extras]
103
+ toml = ["tomli"]
104
+
105
+ [[package]]
106
+ name = "exceptiongroup"
107
+ version = "1.2.0"
108
+ description = "Backport of PEP 654 (exception groups)"
109
+ optional = false
110
+ python-versions = ">=3.7"
111
+ files = [
112
+ {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
113
+ {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
114
+ ]
115
+
116
+ [package.extras]
117
+ test = ["pytest (>=6)"]
118
+
119
+ [[package]]
120
+ name = "importlib-metadata"
121
+ version = "7.1.0"
122
+ description = "Read metadata from Python packages"
123
+ optional = false
124
+ python-versions = ">=3.8"
125
+ files = [
126
+ {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"},
127
+ {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"},
128
+ ]
129
+
130
+ [package.dependencies]
131
+ zipp = ">=0.5"
132
+
133
+ [package.extras]
134
+ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
135
+ perf = ["ipython"]
136
+ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
137
+
138
+ [[package]]
139
+ name = "iniconfig"
140
+ version = "2.0.0"
141
+ description = "brain-dead simple config-ini parsing"
142
+ optional = false
143
+ python-versions = ">=3.7"
144
+ files = [
145
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
146
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
147
+ ]
148
+
149
+ [[package]]
150
+ name = "packaging"
151
+ version = "24.0"
152
+ description = "Core utilities for Python packages"
153
+ optional = false
154
+ python-versions = ">=3.7"
155
+ files = [
156
+ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
157
+ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
158
+ ]
159
+
160
+ [[package]]
161
+ name = "pastel"
162
+ version = "0.2.1"
163
+ description = "Bring colors to your terminal."
164
+ optional = false
165
+ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
166
+ files = [
167
+ {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"},
168
+ {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"},
169
+ ]
170
+
171
+ [[package]]
172
+ name = "pluggy"
173
+ version = "1.4.0"
174
+ description = "plugin and hook calling mechanisms for python"
175
+ optional = false
176
+ python-versions = ">=3.8"
177
+ files = [
178
+ {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"},
179
+ {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"},
180
+ ]
181
+
182
+ [package.extras]
183
+ dev = ["pre-commit", "tox"]
184
+ testing = ["pytest", "pytest-benchmark"]
185
+
186
+ [[package]]
187
+ name = "poethepoet"
188
+ version = "0.25.0"
189
+ description = "A task runner that works well with poetry."
190
+ optional = false
191
+ python-versions = ">=3.8"
192
+ files = [
193
+ {file = "poethepoet-0.25.0-py3-none-any.whl", hash = "sha256:42c0fd654f23e1b7c67aa8aa395c72e15eb275034bd5105171003daf679c1470"},
194
+ {file = "poethepoet-0.25.0.tar.gz", hash = "sha256:ca8f1d8475aa10d2ceeb26331d2626fc4a6b51df1e7e70d3d0d6481a984faab6"},
195
+ ]
196
+
197
+ [package.dependencies]
198
+ pastel = ">=0.2.1,<0.3.0"
199
+ tomli = ">=1.2.2"
200
+
201
+ [package.extras]
202
+ poetry-plugin = ["poetry (>=1.0,<2.0)"]
203
+
204
+ [[package]]
205
+ name = "pyproject-hooks"
206
+ version = "1.0.0"
207
+ description = "Wrappers to call pyproject.toml-based build backend hooks."
208
+ optional = false
209
+ python-versions = ">=3.7"
210
+ files = [
211
+ {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"},
212
+ {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"},
213
+ ]
214
+
215
+ [package.dependencies]
216
+ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
217
+
218
+ [[package]]
219
+ name = "pytest"
220
+ version = "8.1.1"
221
+ description = "pytest: simple powerful testing with Python"
222
+ optional = false
223
+ python-versions = ">=3.8"
224
+ files = [
225
+ {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"},
226
+ {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"},
227
+ ]
228
+
229
+ [package.dependencies]
230
+ colorama = {version = "*", markers = "sys_platform == \"win32\""}
231
+ exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
232
+ iniconfig = "*"
233
+ packaging = "*"
234
+ pluggy = ">=1.4,<2.0"
235
+ tomli = {version = ">=1", markers = "python_version < \"3.11\""}
236
+
237
+ [package.extras]
238
+ testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
239
+
240
+ [[package]]
241
+ name = "pytest-cov"
242
+ version = "5.0.0"
243
+ description = "Pytest plugin for measuring coverage."
244
+ optional = false
245
+ python-versions = ">=3.8"
246
+ files = [
247
+ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"},
248
+ {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"},
249
+ ]
250
+
251
+ [package.dependencies]
252
+ coverage = {version = ">=5.2.1", extras = ["toml"]}
253
+ pytest = ">=4.6"
254
+
255
+ [package.extras]
256
+ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
257
+
258
+ [[package]]
259
+ name = "ruff"
260
+ version = "0.3.4"
261
+ description = "An extremely fast Python linter and code formatter, written in Rust."
262
+ optional = false
263
+ python-versions = ">=3.7"
264
+ files = [
265
+ {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"},
266
+ {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"},
267
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"},
268
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"},
269
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"},
270
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"},
271
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"},
272
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"},
273
+ {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"},
274
+ {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"},
275
+ {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"},
276
+ {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"},
277
+ {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"},
278
+ {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"},
279
+ {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"},
280
+ {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"},
281
+ {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"},
282
+ ]
283
+
284
+ [[package]]
285
+ name = "setuptools"
286
+ version = "69.2.0"
287
+ description = "Easily download, build, install, upgrade, and uninstall Python packages"
288
+ optional = false
289
+ python-versions = ">=3.8"
290
+ files = [
291
+ {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"},
292
+ {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"},
293
+ ]
294
+
295
+ [package.extras]
296
+ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
297
+ testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
298
+ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
299
+
300
+ [[package]]
301
+ name = "setuptools-scm"
302
+ version = "8.0.4"
303
+ description = "the blessed package to manage your versions by scm tags"
304
+ optional = false
305
+ python-versions = ">=3.8"
306
+ files = [
307
+ {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"},
308
+ {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"},
309
+ ]
310
+
311
+ [package.dependencies]
312
+ packaging = ">=20"
313
+ setuptools = "*"
314
+ tomli = {version = ">=1", markers = "python_version < \"3.11\""}
315
+ typing-extensions = "*"
316
+
317
+ [package.extras]
318
+ docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"]
319
+ rich = ["rich"]
320
+ test = ["build", "pytest", "rich", "wheel"]
321
+
322
+ [[package]]
323
+ name = "tomli"
324
+ version = "2.0.1"
325
+ description = "A lil' TOML parser"
326
+ optional = false
327
+ python-versions = ">=3.7"
328
+ files = [
329
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
330
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
331
+ ]
332
+
333
+ [[package]]
334
+ name = "typing-extensions"
335
+ version = "4.10.0"
336
+ description = "Backported and Experimental Type Hints for Python 3.8+"
337
+ optional = false
338
+ python-versions = ">=3.8"
339
+ files = [
340
+ {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"},
341
+ {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"},
342
+ ]
343
+
344
+ [[package]]
345
+ name = "zipp"
346
+ version = "3.18.1"
347
+ description = "Backport of pathlib-compatible object wrapper for zip files"
348
+ optional = false
349
+ python-versions = ">=3.8"
350
+ files = [
351
+ {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"},
352
+ {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"},
353
+ ]
354
+
355
+ [package.extras]
356
+ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
357
+ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"]
358
+
359
+ [metadata]
360
+ lock-version = "2.0"
361
+ python-versions = "^3.8"
362
+ content-hash = "ab417eb65c2aa02cc60214da88bb47172f55177146dd79be845cc0f2a1ecca46"
@@ -0,0 +1,58 @@
1
+ [tool.poetry]
2
+ # I use poetry as just a package manager.
3
+ # So, I only write the settings that poetry needs.
4
+ # The actual package metadata is written in setup.cfg.
5
+ # I use pypa/build for packaging.
6
+ name = "pixel_sizes"
7
+ version = "0.0.0"
8
+ description = ""
9
+ authors = []
10
+ packages = [
11
+ { include = "pixel_sizes" },
12
+ ]
13
+
14
+ [tool.setuptools_scm]
15
+ write_to = "pixel_sizes/_version.py"
16
+
17
+ [tool.poetry.dependencies]
18
+ python = "^3.8"
19
+
20
+ [tool.poetry.group.dev.dependencies]
21
+ ruff = "*"
22
+ pytest = "*"
23
+ pytest-cov = "*"
24
+ poethepoet = "*"
25
+ setuptools-scm = "*"
26
+ build = "*"
27
+
28
+ [build-system]
29
+ requires = [
30
+ "setuptools", "setuptools_scm"
31
+ ]
32
+ build-backend = "setuptools.build_meta"
33
+
34
+ [tool.poe.tasks]
35
+ test = "pytest"
36
+ coverage-xml = "pytest --cov=pixel_sizes --doctest-modules --cov-report=xml"
37
+ format = "ruff format pixel_sizes"
38
+ check = "ruff check pixel_sizes"
39
+ build = [
40
+ { cmd = "python -m build"}
41
+ ]
42
+
43
+ [tool.mypy]
44
+ # https://mypy.readthedocs.io/en/latest/config_file.html
45
+ ignore_missing_imports = true
46
+ disallow_any_decorated = true
47
+ disallow_subclassing_any = true
48
+ disallow_untyped_calls = true
49
+ disallow_untyped_defs = true
50
+ disallow_incomplete_defs = true
51
+ check_untyped_defs = true
52
+ disallow_untyped_decorators = true
53
+ no_implicit_optional = true
54
+ warn_unused_ignores = true
55
+ warn_return_any = true
56
+
57
+ [tool.ruff]
58
+ line-length = 79
@@ -0,0 +1,37 @@
1
+ [metadata]
2
+ author = Yui Kitsu
3
+ author_email = kitsuyui+github@kitsuyui.com
4
+ name = pixel-sizes
5
+ description = Dictionary of pixel sizes
6
+ long_description = file: README.md
7
+ long_description_content_type = text/markdown
8
+ license = BSD-3-Clause
9
+ license_files = LICENSE
10
+ url = https://github.com/kitsuyui/pixel-sizes
11
+ classifiers =
12
+ Development Status :: 3 - Alpha
13
+ License :: OSI Approved :: BSD License
14
+ Programming Language :: Python :: 3.8
15
+ Programming Language :: Python :: 3.9
16
+ Programming Language :: Python :: 3.10
17
+ Programming Language :: Python :: 3.11
18
+ Programming Language :: Python :: 3.12
19
+ Intended Audience :: Developers
20
+ Topic :: Software Development :: Libraries
21
+
22
+ [options]
23
+ packages = pixel_sizes
24
+ test_suite = tests
25
+ python_requires = >= 3.8
26
+
27
+ [options.package_data]
28
+ * = README.md, LICENSE
29
+ pixel_sizes = py.typed, *.pyi
30
+
31
+ [flake8]
32
+ ignore = E203
33
+
34
+ [egg_info]
35
+ tag_build =
36
+ tag_date = 0
37
+
File without changes
@@ -0,0 +1,26 @@
1
+ from pixel_sizes import Size, SIZES
2
+
3
+
4
+ def test_sizes():
5
+ assert SIZES["8k"].aspect_ratio() == 16 / 9
6
+ assert SIZES["4k"].rotate() == Size(2160, 3840)
7
+ assert SIZES["2k"].rotate() == Size(1440, 2560)
8
+ assert SIZES["Full HD"].rotate() == Size(1080, 1920)
9
+ assert SIZES["HD"].rotate() == Size(720, 1280)
10
+ assert SIZES["480p"].rotate() == Size(480, 854)
11
+ assert SIZES["360p"].rotate() == Size(360, 640)
12
+ assert SIZES["240p"].rotate() == Size(240, 426)
13
+ assert SIZES["144p"].rotate() == Size(144, 256)
14
+
15
+
16
+ def test_size_rotate():
17
+ size = Size(1920, 1080)
18
+ assert size.rotate().rotate() == size
19
+
20
+
21
+ def test_size_aspect_ratio():
22
+ size = Size(1920, 1080)
23
+ assert size.aspect_ratio() == 16 / 9
24
+
25
+ size = Size(1280, 720)
26
+ assert size.aspect_ratio() == 16 / 9