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.
Files changed (41) hide show
  1. {fotolab-0.20.1 → fotolab-0.21.1}/.python-version +0 -1
  2. {fotolab-0.20.1 → fotolab-0.21.1}/CHANGELOG.md +14 -0
  3. {fotolab-0.20.1 → fotolab-0.21.1}/CONTRIBUTING.md +0 -1
  4. {fotolab-0.20.1 → fotolab-0.21.1}/PKG-INFO +3 -2
  5. {fotolab-0.20.1 → fotolab-0.21.1}/Pipfile +1 -1
  6. {fotolab-0.20.1 → fotolab-0.21.1}/Pipfile.lock +79 -84
  7. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/__init__.py +1 -1
  8. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/info.py +30 -6
  9. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/watermark.py +2 -0
  10. {fotolab-0.20.1 → fotolab-0.21.1}/noxfile.py +2 -2
  11. {fotolab-0.20.1 → fotolab-0.21.1}/pyproject.toml +2 -1
  12. {fotolab-0.20.1 → fotolab-0.21.1}/.coveragerc +0 -0
  13. {fotolab-0.20.1 → fotolab-0.21.1}/.gitignore +0 -0
  14. {fotolab-0.20.1 → fotolab-0.21.1}/.pre-commit-config.yaml +0 -0
  15. {fotolab-0.20.1 → fotolab-0.21.1}/LICENSE.md +0 -0
  16. {fotolab-0.20.1 → fotolab-0.21.1}/README.md +0 -0
  17. {fotolab-0.20.1 → fotolab-0.21.1}/docs/Makefile +0 -0
  18. {fotolab-0.20.1 → fotolab-0.21.1}/docs/make.bat +0 -0
  19. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/CHANGELOG.md +0 -0
  20. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/CONTRIBUTING.md +0 -0
  21. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/LICENSE.md +0 -0
  22. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/README.md +0 -0
  23. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/_static/logo.jpg +0 -0
  24. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/conf.py +0 -0
  25. {fotolab-0.20.1 → fotolab-0.21.1}/docs/source/index.rst +0 -0
  26. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/__main__.py +0 -0
  27. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/animate.py +0 -0
  28. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/auto.py +0 -0
  29. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/border.py +0 -0
  30. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/cli.py +0 -0
  31. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/contrast.py +0 -0
  32. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/env.py +0 -0
  33. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/montage.py +0 -0
  34. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/resize.py +0 -0
  35. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/rotate.py +0 -0
  36. {fotolab-0.20.1 → fotolab-0.21.1}/fotolab/sharpen.py +0 -0
  37. {fotolab-0.20.1 → fotolab-0.21.1}/tests/__init__.py +0 -0
  38. {fotolab-0.20.1 → fotolab-0.21.1}/tests/conftest.py +0 -0
  39. {fotolab-0.20.1 → fotolab-0.21.1}/tests/test_env.py +0 -0
  40. {fotolab-0.20.1 → fotolab-0.21.1}/tests/test_help_flag.py +0 -0
  41. {fotolab-0.20.1 → fotolab-0.21.1}/tests/test_quiet_flag.py +0 -0
@@ -1,4 +1,3 @@
1
- 3.8.20
2
1
  3.9.20
3
2
  3.10.15
4
3
  3.11.10
@@ -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
@@ -51,7 +51,6 @@ nox -l
51
51
  ...
52
52
  * deps -> Update pre-commit hooks and deps.
53
53
  * lint -> Run pre-commit tasks.
54
- * test-3.8 -> Run test.
55
54
  * test-3.9 -> Run test.
56
55
  * test-3.10 -> Run test.
57
56
  * test-3.11 -> Run test.
@@ -1,19 +1,20 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fotolab
3
- Version: 0.20.1
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
@@ -28,4 +28,4 @@ sphinx-copybutton = "*"
28
28
  tomli = "*"
29
29
 
30
30
  [requires]
31
- python_version = "3.8"
31
+ python_version = "3.9"
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "_meta": {
3
3
  "hash": {
4
- "sha256": "8d7307a0ff05c5de6ef45cc8bc2e1bf6c18b97ccf3a911c31ce0dd9a77feab08"
4
+ "sha256": "0a76818192d0f36d59673b525a42ef562d0678471a6ec325a562062019c84c4b"
5
5
  },
6
6
  "pipfile-spec": 6,
7
7
  "requires": {
8
- "python_version": "3.8"
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:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885",
22
- "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea",
23
- "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df",
24
- "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5",
25
- "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c",
26
- "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d",
27
- "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd",
28
- "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06",
29
- "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908",
30
- "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a",
31
- "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be",
32
- "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0",
33
- "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b",
34
- "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80",
35
- "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a",
36
- "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e",
37
- "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9",
38
- "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696",
39
- "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b",
40
- "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309",
41
- "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e",
42
- "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab",
43
- "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d",
44
- "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060",
45
- "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d",
46
- "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d",
47
- "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4",
48
- "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3",
49
- "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6",
50
- "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb",
51
- "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94",
52
- "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b",
53
- "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496",
54
- "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0",
55
- "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319",
56
- "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b",
57
- "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856",
58
- "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef",
59
- "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680",
60
- "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b",
61
- "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42",
62
- "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e",
63
- "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597",
64
- "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a",
65
- "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8",
66
- "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3",
67
- "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736",
68
- "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da",
69
- "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126",
70
- "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd",
71
- "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5",
72
- "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b",
73
- "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026",
74
- "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b",
75
- "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc",
76
- "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46",
77
- "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2",
78
- "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c",
79
- "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe",
80
- "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984",
81
- "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a",
82
- "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70",
83
- "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca",
84
- "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b",
85
- "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91",
86
- "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3",
87
- "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84",
88
- "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1",
89
- "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5",
90
- "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be",
91
- "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f",
92
- "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc",
93
- "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9",
94
- "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e",
95
- "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141",
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.8'",
104
- "version": "==10.4.0"
98
+ "markers": "python_version >= '3.9'",
99
+ "version": "==11.0.0"
105
100
  }
106
101
  },
107
102
  "develop": {
@@ -21,7 +21,7 @@ import subprocess
21
21
  import sys
22
22
  from pathlib import Path
23
23
 
24
- __version__ = "0.20.1"
24
+ __version__ = "0.21.1"
25
25
 
26
26
  log = logging.getLogger(__name__)
27
27
 
@@ -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
- exif_tags = extract_exif_tags(args.image.filename)
62
- tag_name_width = max(map(len, exif_tags))
63
- for tag_name, tag_value in exif_tags.items():
64
- print(f"{tag_name:<{tag_name_width}}: {tag_value}")
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
- info = {ExifTags.TAGS.get(tag_id): exif.get(tag_id) for tag_id in exif}
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.8")
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.8", "3.9", "3.10", "3.11", "3.12", "3.13"])
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