fotolab 0.20.1__tar.gz → 0.21.1__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.
- {fotolab-0.20.1 → fotolab-0.21.1}/.python-version +0 -1
- {fotolab-0.20.1 → fotolab-0.21.1}/CHANGELOG.md +14 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/CONTRIBUTING.md +0 -1
- {fotolab-0.20.1 → fotolab-0.21.1}/PKG-INFO +3 -2
- {fotolab-0.20.1 → fotolab-0.21.1}/Pipfile +1 -1
- {fotolab-0.20.1 → fotolab-0.21.1}/Pipfile.lock +79 -84
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/__init__.py +1 -1
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/info.py +30 -6
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/watermark.py +2 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/noxfile.py +2 -2
- {fotolab-0.20.1 → fotolab-0.21.1}/pyproject.toml +2 -1
- {fotolab-0.20.1 → fotolab-0.21.1}/.coveragerc +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/.gitignore +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/.pre-commit-config.yaml +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/LICENSE.md +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/README.md +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/Makefile +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/make.bat +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/CHANGELOG.md +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/CONTRIBUTING.md +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/LICENSE.md +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/README.md +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/_static/logo.jpg +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/conf.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/index.rst +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/__main__.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/animate.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/auto.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/border.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/cli.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/contrast.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/env.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/montage.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/resize.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/rotate.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/sharpen.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/tests/__init__.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/tests/conftest.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/tests/test_env.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/tests/test_help_flag.py +0 -0
- {fotolab-0.20.1 → fotolab-0.21.1}/tests/test_quiet_flag.py +0 -0
@@ -7,6 +7,20 @@ and this project adheres to [0-based versioning](https://0ver.org/).
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## v0.21.1 (2024-12-01)
|
11
|
+
|
12
|
+
- Add requires-python field to project
|
13
|
+
- Bump deps
|
14
|
+
- Check whether photo have metadata
|
15
|
+
- Update Pipfile to Python 3.9
|
16
|
+
|
17
|
+
## v0.21.0 (2024-11-24)
|
18
|
+
|
19
|
+
- Add `--camera` flag to `info` subcommand
|
20
|
+
- Drop support for Python 3.8
|
21
|
+
- Resolve variables not initiated warnings
|
22
|
+
- Update pypi classifier
|
23
|
+
|
10
24
|
## v0.20.1 (2024-11-17)
|
11
25
|
|
12
26
|
- Bump deps and `pre-commit` hooks
|
@@ -1,19 +1,20 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fotolab
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.21.1
|
4
4
|
Summary: A console program that manipulate images.
|
5
5
|
Keywords: photography,photo
|
6
6
|
Author-email: Kian-Meng Ang <kianmeng@cpan.org>
|
7
|
+
Requires-Python: >=3.9
|
7
8
|
Description-Content-Type: text/markdown
|
8
9
|
Classifier: Development Status :: 3 - Alpha
|
9
10
|
Classifier: Environment :: Console
|
10
11
|
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
11
12
|
Classifier: Programming Language :: Python :: 3 :: Only
|
12
|
-
Classifier: Programming Language :: Python :: 3.8
|
13
13
|
Classifier: Programming Language :: Python :: 3.9
|
14
14
|
Classifier: Programming Language :: Python :: 3.10
|
15
15
|
Classifier: Programming Language :: Python :: 3.11
|
16
16
|
Classifier: Programming Language :: Python :: 3.12
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
17
18
|
Classifier: Programming Language :: Python
|
18
19
|
Requires-Dist: pillow
|
19
20
|
Project-URL: Changelog, https://github.com/kianmeng/fotolab/blob/master/CHANGELOG.md
|
@@ -1,11 +1,11 @@
|
|
1
1
|
{
|
2
2
|
"_meta": {
|
3
3
|
"hash": {
|
4
|
-
"sha256": "
|
4
|
+
"sha256": "0a76818192d0f36d59673b525a42ef562d0678471a6ec325a562062019c84c4b"
|
5
5
|
},
|
6
6
|
"pipfile-spec": 6,
|
7
7
|
"requires": {
|
8
|
-
"python_version": "3.
|
8
|
+
"python_version": "3.9"
|
9
9
|
},
|
10
10
|
"sources": [
|
11
11
|
{
|
@@ -18,90 +18,85 @@
|
|
18
18
|
"default": {
|
19
19
|
"pillow": {
|
20
20
|
"hashes": [
|
21
|
-
"sha256:
|
22
|
-
"sha256:
|
23
|
-
"sha256:
|
24
|
-
"sha256:
|
25
|
-
"sha256:
|
26
|
-
"sha256:
|
27
|
-
"sha256:
|
28
|
-
"sha256:
|
29
|
-
"sha256:
|
30
|
-
"sha256:
|
31
|
-
"sha256:
|
32
|
-
"sha256:
|
33
|
-
"sha256:
|
34
|
-
"sha256:
|
35
|
-
"sha256:
|
36
|
-
"sha256:
|
37
|
-
"sha256:
|
38
|
-
"sha256:
|
39
|
-
"sha256:
|
40
|
-
"sha256:
|
41
|
-
"sha256:
|
42
|
-
"sha256:
|
43
|
-
"sha256:
|
44
|
-
"sha256:
|
45
|
-
"sha256:
|
46
|
-
"sha256:
|
47
|
-
"sha256:
|
48
|
-
"sha256:
|
49
|
-
"sha256:
|
50
|
-
"sha256:
|
51
|
-
"sha256:
|
52
|
-
"sha256:
|
53
|
-
"sha256:
|
54
|
-
"sha256:
|
55
|
-
"sha256:
|
56
|
-
"sha256:
|
57
|
-
"sha256:
|
58
|
-
"sha256:
|
59
|
-
"sha256:
|
60
|
-
"sha256:
|
61
|
-
"sha256:
|
62
|
-
"sha256:
|
63
|
-
"sha256:
|
64
|
-
"sha256:
|
65
|
-
"sha256:
|
66
|
-
"sha256:
|
67
|
-
"sha256:
|
68
|
-
"sha256:
|
69
|
-
"sha256:
|
70
|
-
"sha256:
|
71
|
-
"sha256:
|
72
|
-
"sha256:
|
73
|
-
"sha256:
|
74
|
-
"sha256:
|
75
|
-
"sha256:
|
76
|
-
"sha256:
|
77
|
-
"sha256:
|
78
|
-
"sha256:
|
79
|
-
"sha256:
|
80
|
-
"sha256:
|
81
|
-
"sha256:
|
82
|
-
"sha256:
|
83
|
-
"sha256:
|
84
|
-
"sha256:
|
85
|
-
"sha256:
|
86
|
-
"sha256:
|
87
|
-
"sha256:
|
88
|
-
"sha256:
|
89
|
-
"sha256:
|
90
|
-
"sha256:
|
91
|
-
"sha256:
|
92
|
-
"sha256:
|
93
|
-
"sha256:
|
94
|
-
"sha256:
|
95
|
-
"sha256:
|
96
|
-
"sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef",
|
97
|
-
"sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22",
|
98
|
-
"sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27",
|
99
|
-
"sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e",
|
100
|
-
"sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"
|
21
|
+
"sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7",
|
22
|
+
"sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5",
|
23
|
+
"sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903",
|
24
|
+
"sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2",
|
25
|
+
"sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38",
|
26
|
+
"sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2",
|
27
|
+
"sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9",
|
28
|
+
"sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f",
|
29
|
+
"sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc",
|
30
|
+
"sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8",
|
31
|
+
"sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d",
|
32
|
+
"sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2",
|
33
|
+
"sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316",
|
34
|
+
"sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a",
|
35
|
+
"sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25",
|
36
|
+
"sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd",
|
37
|
+
"sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba",
|
38
|
+
"sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc",
|
39
|
+
"sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273",
|
40
|
+
"sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa",
|
41
|
+
"sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a",
|
42
|
+
"sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b",
|
43
|
+
"sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a",
|
44
|
+
"sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae",
|
45
|
+
"sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291",
|
46
|
+
"sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97",
|
47
|
+
"sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06",
|
48
|
+
"sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904",
|
49
|
+
"sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b",
|
50
|
+
"sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b",
|
51
|
+
"sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8",
|
52
|
+
"sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527",
|
53
|
+
"sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947",
|
54
|
+
"sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb",
|
55
|
+
"sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003",
|
56
|
+
"sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5",
|
57
|
+
"sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f",
|
58
|
+
"sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739",
|
59
|
+
"sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944",
|
60
|
+
"sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830",
|
61
|
+
"sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f",
|
62
|
+
"sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3",
|
63
|
+
"sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4",
|
64
|
+
"sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84",
|
65
|
+
"sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7",
|
66
|
+
"sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6",
|
67
|
+
"sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6",
|
68
|
+
"sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9",
|
69
|
+
"sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de",
|
70
|
+
"sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4",
|
71
|
+
"sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47",
|
72
|
+
"sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd",
|
73
|
+
"sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50",
|
74
|
+
"sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c",
|
75
|
+
"sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086",
|
76
|
+
"sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba",
|
77
|
+
"sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306",
|
78
|
+
"sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699",
|
79
|
+
"sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e",
|
80
|
+
"sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488",
|
81
|
+
"sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa",
|
82
|
+
"sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2",
|
83
|
+
"sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3",
|
84
|
+
"sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9",
|
85
|
+
"sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923",
|
86
|
+
"sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2",
|
87
|
+
"sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790",
|
88
|
+
"sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734",
|
89
|
+
"sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916",
|
90
|
+
"sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1",
|
91
|
+
"sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f",
|
92
|
+
"sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798",
|
93
|
+
"sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb",
|
94
|
+
"sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2",
|
95
|
+
"sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"
|
101
96
|
],
|
102
97
|
"index": "pypi",
|
103
|
-
"markers": "python_version >= '3.
|
104
|
-
"version": "==
|
98
|
+
"markers": "python_version >= '3.9'",
|
99
|
+
"version": "==11.0.0"
|
105
100
|
}
|
106
101
|
},
|
107
102
|
"develop": {
|
@@ -46,6 +46,14 @@ def build_subparser(subparsers) -> None:
|
|
46
46
|
help="show image info by sorted field name",
|
47
47
|
)
|
48
48
|
|
49
|
+
info_parser.add_argument(
|
50
|
+
"--camera",
|
51
|
+
default=False,
|
52
|
+
action="store_true",
|
53
|
+
dest="camera",
|
54
|
+
help="show the camera maker details",
|
55
|
+
)
|
56
|
+
|
49
57
|
|
50
58
|
def run(args: argparse.Namespace) -> None:
|
51
59
|
"""Run info subcommand.
|
@@ -57,18 +65,27 @@ def run(args: argparse.Namespace) -> None:
|
|
57
65
|
None
|
58
66
|
"""
|
59
67
|
log.debug(args)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
68
|
+
if args.camera:
|
69
|
+
print(camera_metadata(args.image_filename))
|
70
|
+
else:
|
71
|
+
exif_tags = extract_exif_tags(args.image_filename)
|
72
|
+
if exif_tags:
|
73
|
+
tag_name_width = max(map(len, exif_tags))
|
74
|
+
for tag_name, tag_value in exif_tags.items():
|
75
|
+
print(f"{tag_name:<{tag_name_width}}: {tag_value}")
|
76
|
+
else:
|
77
|
+
print("No metadata found!")
|
65
78
|
|
66
79
|
|
67
80
|
def extract_exif_tags(image_filename: str, sort: bool = False) -> dict:
|
68
81
|
"""Extract Exif metadata from image."""
|
69
82
|
image = Image.open(image_filename)
|
70
83
|
exif = image._getexif()
|
71
|
-
|
84
|
+
log.debug(exif)
|
85
|
+
|
86
|
+
info = {}
|
87
|
+
if exif:
|
88
|
+
info = {ExifTags.TAGS.get(tag_id): exif.get(tag_id) for tag_id in exif}
|
72
89
|
|
73
90
|
filtered_info = {
|
74
91
|
key: value for key, value in info.items() if key is not None
|
@@ -77,3 +94,10 @@ def extract_exif_tags(image_filename: str, sort: bool = False) -> dict:
|
|
77
94
|
filtered_info = dict(sorted(filtered_info.items()))
|
78
95
|
|
79
96
|
return filtered_info
|
97
|
+
|
98
|
+
|
99
|
+
def camera_metadata(image_filename):
|
100
|
+
"""Extract camera and model metadata."""
|
101
|
+
exif_tags = extract_exif_tags(image_filename)
|
102
|
+
metadata = f'{exif_tags["Make"]} {exif_tags["Model"]}'
|
103
|
+
return metadata.strip()
|
@@ -244,6 +244,8 @@ def calc_padding(image, args) -> int:
|
|
244
244
|
|
245
245
|
def calc_position(image, text_width, text_height, position, padding) -> tuple:
|
246
246
|
"""Calculate the boundary coordinates of the watermark text."""
|
247
|
+
(position_x, position_y) = (0, 0)
|
248
|
+
|
247
249
|
if position == "top-left":
|
248
250
|
position_x = 0 + padding
|
249
251
|
position_y = 0 + padding
|
@@ -24,7 +24,7 @@ import nox
|
|
24
24
|
from packaging.version import Version
|
25
25
|
|
26
26
|
|
27
|
-
@nox.session(python="3.
|
27
|
+
@nox.session(python="3.9")
|
28
28
|
def deps(session: nox.Session) -> None:
|
29
29
|
"""Update pre-commit hooks and deps."""
|
30
30
|
session.install("pre-commit", "pipenv")
|
@@ -44,7 +44,7 @@ def lint(session: nox.Session) -> None:
|
|
44
44
|
session.run("pre-commit", "run", "--all-files", *session.posargs)
|
45
45
|
|
46
46
|
|
47
|
-
@nox.session(python=["3.
|
47
|
+
@nox.session(python=["3.9", "3.10", "3.11", "3.12", "3.13"])
|
48
48
|
def test(session: nox.Session) -> None:
|
49
49
|
"""Run test."""
|
50
50
|
_pipenv_install(session)
|
@@ -5,6 +5,7 @@ build-backend = "flit_core.buildapi"
|
|
5
5
|
[project]
|
6
6
|
name = "fotolab"
|
7
7
|
authors = [{name = "Kian-Meng Ang", email = "kianmeng@cpan.org"}]
|
8
|
+
requires-python = ">=3.9"
|
8
9
|
readme = "README.md"
|
9
10
|
license = {file = "LICENSE.md"}
|
10
11
|
classifiers = [
|
@@ -12,11 +13,11 @@ classifiers = [
|
|
12
13
|
"Environment :: Console",
|
13
14
|
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
|
14
15
|
"Programming Language :: Python :: 3 :: Only",
|
15
|
-
"Programming Language :: Python :: 3.8",
|
16
16
|
"Programming Language :: Python :: 3.9",
|
17
17
|
"Programming Language :: Python :: 3.10",
|
18
18
|
"Programming Language :: Python :: 3.11",
|
19
19
|
"Programming Language :: Python :: 3.12",
|
20
|
+
"Programming Language :: Python :: 3.13",
|
20
21
|
"Programming Language :: Python",
|
21
22
|
]
|
22
23
|
dynamic = ["version", "description"]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|