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.
Files changed (43) hide show
  1. {fotolab-0.28.1 → fotolab-0.28.3}/.pre-commit-config.yaml +1 -1
  2. {fotolab-0.28.1 → fotolab-0.28.3}/CHANGELOG.md +17 -0
  3. {fotolab-0.28.1 → fotolab-0.28.3}/PKG-INFO +1 -1
  4. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/__init__.py +3 -3
  5. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/border.py +28 -18
  6. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/contrast.py +6 -11
  7. {fotolab-0.28.1 → fotolab-0.28.3}/noxfile.py +12 -0
  8. {fotolab-0.28.1 → fotolab-0.28.3}/.coveragerc +0 -0
  9. {fotolab-0.28.1 → fotolab-0.28.3}/.gitignore +0 -0
  10. {fotolab-0.28.1 → fotolab-0.28.3}/.python-version +0 -0
  11. {fotolab-0.28.1 → fotolab-0.28.3}/CONTRIBUTING.md +0 -0
  12. {fotolab-0.28.1 → fotolab-0.28.3}/LICENSE.md +0 -0
  13. {fotolab-0.28.1 → fotolab-0.28.3}/Pipfile +0 -0
  14. {fotolab-0.28.1 → fotolab-0.28.3}/Pipfile.lock +0 -0
  15. {fotolab-0.28.1 → fotolab-0.28.3}/README.md +0 -0
  16. {fotolab-0.28.1 → fotolab-0.28.3}/docs/Makefile +0 -0
  17. {fotolab-0.28.1 → fotolab-0.28.3}/docs/make.bat +0 -0
  18. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/CHANGELOG.md +0 -0
  19. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/CONTRIBUTING.md +0 -0
  20. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/LICENSE.md +0 -0
  21. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/README.md +0 -0
  22. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/_static/logo.jpg +0 -0
  23. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/conf.py +0 -0
  24. {fotolab-0.28.1 → fotolab-0.28.3}/docs/source/index.rst +0 -0
  25. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/__main__.py +0 -0
  26. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/cli.py +0 -0
  27. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/__init__.py +0 -0
  28. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/animate.py +0 -0
  29. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/auto.py +0 -0
  30. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/env.py +0 -0
  31. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/halftone.py +0 -0
  32. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/info.py +0 -0
  33. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/montage.py +0 -0
  34. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/resize.py +0 -0
  35. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/rotate.py +0 -0
  36. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/sharpen.py +0 -0
  37. {fotolab-0.28.1 → fotolab-0.28.3}/fotolab/subcommands/watermark.py +0 -0
  38. {fotolab-0.28.1 → fotolab-0.28.3}/pyproject.toml +0 -0
  39. {fotolab-0.28.1 → fotolab-0.28.3}/tests/__init__.py +0 -0
  40. {fotolab-0.28.1 → fotolab-0.28.3}/tests/conftest.py +0 -0
  41. {fotolab-0.28.1 → fotolab-0.28.3}/tests/test_env_subcommand.py +0 -0
  42. {fotolab-0.28.1 → fotolab-0.28.3}/tests/test_help_flag.py +0 -0
  43. {fotolab-0.28.1 → fotolab-0.28.3}/tests/test_quiet_flag.py +0 -0
@@ -15,7 +15,7 @@ repos:
15
15
  - id: trailing-whitespace
16
16
 
17
17
  - repo: https://github.com/abravalheri/validate-pyproject
18
- rev: v0.23
18
+ rev: v0.24.1
19
19
  hooks:
20
20
  - id: validate-pyproject
21
21
  name: validate-pyproject
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fotolab
3
- Version: 0.28.1
3
+ Version: 0.28.3
4
4
  Summary: A console program that manipulate images.
5
5
  Keywords: photography,photo
6
6
  Author-email: Kian-Meng Ang <kianmeng@cpan.org>
@@ -23,7 +23,7 @@ from pathlib import Path
23
23
 
24
24
  from PIL import Image
25
25
 
26
- __version__ = "0.28.1"
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 e:
106
- log.error("Error opening image: %s -> %s", filename, e)
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=str,
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=str,
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=str,
78
+ type=int,
78
79
  default=0,
79
- help="set the width of right border (default: '%(default)s')",
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=str,
91
+ type=int,
88
92
  default=0,
89
- help="set the width of bottom border (default: '%(default)s')",
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=str,
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(args: argparse.Namespace) -> tuple[int, int, int, int]:
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
- tuple[int, int, int, int]: Border dimensions in pixesl. If individual
153
- widths are not specified, returns a uniform width for all sides.
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
- int(args.width_left),
165
- int(args.width_top),
166
- int(args.width_right),
167
- int(args.width_bottom),
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
- try:
90
- original_image = Image.open(image_filename)
91
- contrast_image = ImageOps.autocontrast(
92
- original_image, cutoff=args.cutoff
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