fotolab 0.28.1__tar.gz → 0.28.3__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.28.1 → fotolab-0.28.3}/.pre-commit-config.yaml +1 -1
- {fotolab-0.28.1 → fotolab-0.28.3}/CHANGELOG.md +17 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/PKG-INFO +1 -1
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/__init__.py +3 -3
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/border.py +28 -18
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/contrast.py +6 -11
- {fotolab-0.28.1 → fotolab-0.28.3}/noxfile.py +12 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/.coveragerc +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/.gitignore +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/.python-version +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/CONTRIBUTING.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/LICENSE.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/Pipfile +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/Pipfile.lock +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/README.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/Makefile +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/make.bat +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/CHANGELOG.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/CONTRIBUTING.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/LICENSE.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/README.md +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/_static/logo.jpg +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/conf.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/index.rst +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/__main__.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/cli.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/__init__.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/animate.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/auto.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/env.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/halftone.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/info.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/montage.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/resize.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/rotate.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/sharpen.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/watermark.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/pyproject.toml +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/tests/__init__.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/tests/conftest.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/tests/test_env_subcommand.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/tests/test_help_flag.py +0 -0
- {fotolab-0.28.1 → fotolab-0.28.3}/tests/test_quiet_flag.py +0 -0
@@ -7,6 +7,23 @@ and this project adheres to [0-based versioning](https://0ver.org/).
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## v0.28.3 (2025-03-30)
|
11
|
+
|
12
|
+
- Bump `pre-commit` hook for validate-project
|
13
|
+
- Commit changes after bump release
|
14
|
+
- Remove exception handling as it's handled in parent calling function
|
15
|
+
- Resolve W0718: Catching too general exception Exception
|
16
|
+
- Show bumped version in release `nox` job
|
17
|
+
- Use longer variable name
|
18
|
+
|
19
|
+
## v0.28.2 (2025-03-23)
|
20
|
+
|
21
|
+
- Accept width in integer instead of string
|
22
|
+
- Bump pre-commit hook for validate-project
|
23
|
+
- Handle file not found and other exceptions when opening/processing images
|
24
|
+
- Remove all unnecessary exceptions handling
|
25
|
+
- Use Union for border width return type to allow int or tuple
|
26
|
+
|
10
27
|
## v0.28.1 (2025-03-16)
|
11
28
|
|
12
29
|
- Add typehint to `_get_output_filename` function
|
@@ -23,7 +23,7 @@ from pathlib import Path
|
|
23
23
|
|
24
24
|
from PIL import Image
|
25
25
|
|
26
|
-
__version__ = "0.28.
|
26
|
+
__version__ = "0.28.3"
|
27
27
|
|
28
28
|
log = logging.getLogger(__name__)
|
29
29
|
|
@@ -102,5 +102,5 @@ def _open_image(filename):
|
|
102
102
|
subprocess.Popen(["open", filename])
|
103
103
|
log.info("open image: %s", filename.resolve())
|
104
104
|
|
105
|
-
except OSError as
|
106
|
-
log.error("Error opening image: %s -> %s", filename,
|
105
|
+
except OSError as error:
|
106
|
+
log.error("Error opening image: %s -> %s", filename, error)
|
@@ -17,6 +17,7 @@
|
|
17
17
|
|
18
18
|
import argparse
|
19
19
|
import logging
|
20
|
+
from typing import Tuple, Union
|
20
21
|
|
21
22
|
from PIL import Image, ImageColor, ImageOps
|
22
23
|
|
@@ -54,9 +55,9 @@ def build_subparser(subparsers) -> None:
|
|
54
55
|
"-w",
|
55
56
|
"--width",
|
56
57
|
dest="width",
|
57
|
-
type=
|
58
|
+
type=int,
|
58
59
|
default=10,
|
59
|
-
help="set the width of border (default: '%(default)s')",
|
60
|
+
help="set the width of border in pixels (default: '%(default)s')",
|
60
61
|
metavar="WIDTH",
|
61
62
|
)
|
62
63
|
|
@@ -64,9 +65,9 @@ def build_subparser(subparsers) -> None:
|
|
64
65
|
"-wt",
|
65
66
|
"--width-top",
|
66
67
|
dest="width_top",
|
67
|
-
type=
|
68
|
+
type=int,
|
68
69
|
default=0,
|
69
|
-
help="set the width of top border (default: '%(default)s')",
|
70
|
+
help="set the width of top border in pixels (default: '%(default)s')",
|
70
71
|
metavar="WIDTH",
|
71
72
|
)
|
72
73
|
|
@@ -74,9 +75,12 @@ def build_subparser(subparsers) -> None:
|
|
74
75
|
"-wr",
|
75
76
|
"--width-right",
|
76
77
|
dest="width_right",
|
77
|
-
type=
|
78
|
+
type=int,
|
78
79
|
default=0,
|
79
|
-
help=
|
80
|
+
help=(
|
81
|
+
"set the width of right border in pixels"
|
82
|
+
" (default: '%(default)s')"
|
83
|
+
),
|
80
84
|
metavar="WIDTH",
|
81
85
|
)
|
82
86
|
|
@@ -84,9 +88,12 @@ def build_subparser(subparsers) -> None:
|
|
84
88
|
"-wb",
|
85
89
|
"--width-bottom",
|
86
90
|
dest="width_bottom",
|
87
|
-
type=
|
91
|
+
type=int,
|
88
92
|
default=0,
|
89
|
-
help=
|
93
|
+
help=(
|
94
|
+
"set the width of bottom border in pixels"
|
95
|
+
" (default: '%(default)s')"
|
96
|
+
),
|
90
97
|
metavar="WIDTH",
|
91
98
|
)
|
92
99
|
|
@@ -94,9 +101,9 @@ def build_subparser(subparsers) -> None:
|
|
94
101
|
"-wl",
|
95
102
|
"--width-left",
|
96
103
|
dest="width_left",
|
97
|
-
type=
|
104
|
+
type=int,
|
98
105
|
default=0,
|
99
|
-
help="set the width of left border (default: '%(default)s')",
|
106
|
+
help="set the width of left border in pixels (default: '%(default)s')",
|
100
107
|
metavar="WIDTH",
|
101
108
|
)
|
102
109
|
|
@@ -131,7 +138,6 @@ def run(args: argparse.Namespace) -> None:
|
|
131
138
|
|
132
139
|
for image_filename in args.image_filenames:
|
133
140
|
original_image = Image.open(image_filename)
|
134
|
-
|
135
141
|
border = get_border(args)
|
136
142
|
bordered_image = ImageOps.expand(
|
137
143
|
original_image,
|
@@ -142,15 +148,19 @@ def run(args: argparse.Namespace) -> None:
|
|
142
148
|
save_image(args, bordered_image, image_filename, "border")
|
143
149
|
|
144
150
|
|
145
|
-
def get_border(
|
151
|
+
def get_border(
|
152
|
+
args: argparse.Namespace,
|
153
|
+
) -> Union[Tuple[int, int, int, int], int]:
|
146
154
|
"""Calculate the border dimensions.
|
147
155
|
|
148
156
|
Args:
|
149
157
|
args (argparse.Namespace): Command line arguments
|
150
158
|
|
151
159
|
Returns:
|
152
|
-
|
153
|
-
widths are
|
160
|
+
Union[Tuple[int, int, int, int], int]: Border dimensions in pixels.
|
161
|
+
If individual widths are specified, returns a tuple of (left, top,
|
162
|
+
right, bottom) widths. Otherwise, returns a uniform width for all
|
163
|
+
sides.
|
154
164
|
"""
|
155
165
|
if any(
|
156
166
|
[
|
@@ -161,9 +171,9 @@ def get_border(args: argparse.Namespace) -> tuple[int, int, int, int]:
|
|
161
171
|
]
|
162
172
|
):
|
163
173
|
return (
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
174
|
+
args.width_left,
|
175
|
+
args.width_top,
|
176
|
+
args.width_right,
|
177
|
+
args.width_bottom,
|
168
178
|
)
|
169
179
|
return args.width
|
@@ -86,14 +86,9 @@ def run(args: argparse.Namespace) -> None:
|
|
86
86
|
log.debug(args)
|
87
87
|
|
88
88
|
for image_filename in args.image_filenames:
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
save_image(args, contrast_image, image_filename, "contrast")
|
96
|
-
except FileNotFoundError:
|
97
|
-
log.error(f"Image file not found: {image_filename}")
|
98
|
-
except IOError:
|
99
|
-
log.error(f"Cannot open or read image file: {image_filename}")
|
89
|
+
original_image = Image.open(image_filename)
|
90
|
+
contrast_image = ImageOps.autocontrast(
|
91
|
+
original_image, cutoff=args.cutoff
|
92
|
+
)
|
93
|
+
|
94
|
+
save_image(args, contrast_image, image_filename, "contrast")
|
@@ -167,11 +167,23 @@ def release(session: nox.Session) -> None:
|
|
167
167
|
"fotolab/__init__.py", str(before_version), after_version
|
168
168
|
)
|
169
169
|
|
170
|
+
session.log(
|
171
|
+
f"Bumping version from {before_version} to {after_version}"
|
172
|
+
)
|
173
|
+
|
170
174
|
date = datetime.date.today().strftime("%Y-%m-%d")
|
171
175
|
before_header = "## [Unreleased]\n\n"
|
172
176
|
after_header = f"## [Unreleased]\n\n## v{after_version} ({date})\n\n"
|
173
177
|
_search_and_replace("CHANGELOG.md", before_header, after_header)
|
174
178
|
|
179
|
+
session.run(
|
180
|
+
"git",
|
181
|
+
"commit",
|
182
|
+
"--am",
|
183
|
+
f"Bump {after_version} release",
|
184
|
+
external=True,
|
185
|
+
)
|
186
|
+
|
175
187
|
|
176
188
|
def _pipenv_install(session: nox.Session) -> None:
|
177
189
|
session.install("pipenv")
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|