fotolab 0.31.5__tar.gz → 0.31.8__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.31.5 → fotolab-0.31.8}/PKG-INFO +3 -9
- {fotolab-0.31.5 → fotolab-0.31.8}/README.md +2 -8
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/__init__.py +2 -1
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/animate.py +3 -1
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/border.py +6 -2
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/contrast.py +9 -3
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/halftone.py +25 -19
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/info.py +3 -1
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/montage.py +3 -1
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/resize.py +3 -1
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/watermark.py +15 -5
- {fotolab-0.31.5 → fotolab-0.31.8}/pyproject.toml +1 -5
- fotolab-0.31.5/.coveragerc +0 -17
- fotolab-0.31.5/.gitignore +0 -167
- fotolab-0.31.5/.pre-commit-config.yaml +0 -47
- fotolab-0.31.5/.python-version +0 -5
- fotolab-0.31.5/CHANGELOG.md +0 -535
- fotolab-0.31.5/CONTRIBUTING.md +0 -113
- fotolab-0.31.5/docs/Makefile +0 -20
- fotolab-0.31.5/docs/make.bat +0 -35
- fotolab-0.31.5/docs/source/CHANGELOG.md +0 -1
- fotolab-0.31.5/docs/source/CONTRIBUTING.md +0 -1
- fotolab-0.31.5/docs/source/LICENSE.md +0 -1
- fotolab-0.31.5/docs/source/README.md +0 -1
- fotolab-0.31.5/docs/source/_static/logo.jpg +0 -0
- fotolab-0.31.5/docs/source/conf.py +0 -50
- fotolab-0.31.5/docs/source/index.rst +0 -10
- fotolab-0.31.5/generate +0 -0
- fotolab-0.31.5/noxfile.py +0 -185
- fotolab-0.31.5/tests/__init__.py +0 -0
- fotolab-0.31.5/tests/conftest.py +0 -49
- fotolab-0.31.5/tests/test_animate_subcommand.py +0 -8
- fotolab-0.31.5/tests/test_auto_subcommand.py +0 -8
- fotolab-0.31.5/tests/test_border_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_contrast_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_env_subcommand.py +0 -23
- fotolab-0.31.5/tests/test_halftone_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_help_flag.py +0 -9
- fotolab-0.31.5/tests/test_info_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_montage_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_quiet_flag.py +0 -9
- fotolab-0.31.5/tests/test_resize_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_rotate_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_sharpen_subcommand.py +0 -7
- fotolab-0.31.5/tests/test_watermark_subcommand.py +0 -7
- fotolab-0.31.5/uv.lock +0 -1377
- {fotolab-0.31.5 → fotolab-0.31.8}/LICENSE.md +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/__init__.py +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/__main__.py +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/cli.py +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/auto.py +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/env.py +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/rotate.py +0 -0
- {fotolab-0.31.5 → fotolab-0.31.8}/fotolab/subcommands/sharpen.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: fotolab
|
3
|
-
Version: 0.31.
|
3
|
+
Version: 0.31.8
|
4
4
|
Summary: A console program that manipulate images.
|
5
5
|
Keywords: photography,photo
|
6
6
|
Author-email: Kian-Meng Ang <kianmeng@cpan.org>
|
@@ -31,19 +31,13 @@ A console program to manipulate photos.
|
|
31
31
|
Stable version From PyPI using `uv`:
|
32
32
|
|
33
33
|
```console
|
34
|
-
uv
|
34
|
+
uv tool install fotolab
|
35
35
|
```
|
36
36
|
|
37
37
|
Upgrade to latest stable version:
|
38
38
|
|
39
39
|
```console
|
40
|
-
uv
|
41
|
-
```
|
42
|
-
|
43
|
-
Latest development version from GitHub:
|
44
|
-
|
45
|
-
```console
|
46
|
-
uv pip install -e git+https://github.com/kianmeng/fotolab.git
|
40
|
+
uv tool upgrade fotolab
|
47
41
|
```
|
48
42
|
|
49
43
|
## Usage
|
@@ -7,19 +7,13 @@ A console program to manipulate photos.
|
|
7
7
|
Stable version From PyPI using `uv`:
|
8
8
|
|
9
9
|
```console
|
10
|
-
uv
|
10
|
+
uv tool install fotolab
|
11
11
|
```
|
12
12
|
|
13
13
|
Upgrade to latest stable version:
|
14
14
|
|
15
15
|
```console
|
16
|
-
uv
|
17
|
-
```
|
18
|
-
|
19
|
-
Latest development version from GitHub:
|
20
|
-
|
21
|
-
```console
|
22
|
-
uv pip install -e git+https://github.com/kianmeng/fotolab.git
|
16
|
+
uv tool upgrade fotolab
|
23
17
|
```
|
24
18
|
|
25
19
|
## Usage
|
@@ -24,7 +24,8 @@ def build_subparser(subparsers):
|
|
24
24
|
iter_namespace = pkgutil.iter_modules(__path__, __name__ + ".")
|
25
25
|
|
26
26
|
subcommands = {
|
27
|
-
name: importlib.import_module(name)
|
27
|
+
name: importlib.import_module(name)
|
28
|
+
for finder, name, ispkg in iter_namespace
|
28
29
|
}
|
29
30
|
|
30
31
|
for subcommand in subcommands.values():
|
@@ -123,7 +123,9 @@ def build_subparser(subparsers) -> None:
|
|
123
123
|
type=int,
|
124
124
|
default=4,
|
125
125
|
choices=range(0, 7),
|
126
|
-
help=(
|
126
|
+
help=(
|
127
|
+
"set WEBP encoding method (0=fast, 6=slow/best, default: '%(default)s')"
|
128
|
+
),
|
127
129
|
metavar="METHOD",
|
128
130
|
)
|
129
131
|
|
@@ -77,7 +77,9 @@ def build_subparser(subparsers: argparse._SubParsersAction) -> None:
|
|
77
77
|
dest="width_right",
|
78
78
|
type=int,
|
79
79
|
default=0,
|
80
|
-
help=(
|
80
|
+
help=(
|
81
|
+
"set the width of right border in pixels (default: '%(default)s')"
|
82
|
+
),
|
81
83
|
metavar="WIDTH",
|
82
84
|
)
|
83
85
|
|
@@ -87,7 +89,9 @@ def build_subparser(subparsers: argparse._SubParsersAction) -> None:
|
|
87
89
|
dest="width_bottom",
|
88
90
|
type=int,
|
89
91
|
default=0,
|
90
|
-
help=(
|
92
|
+
help=(
|
93
|
+
"set the width of bottom border in pixels (default: '%(default)s')"
|
94
|
+
),
|
91
95
|
metavar="WIDTH",
|
92
96
|
)
|
93
97
|
|
@@ -31,7 +31,9 @@ def _validate_cutoff(value: str) -> float:
|
|
31
31
|
try:
|
32
32
|
f_value = float(value)
|
33
33
|
except ValueError as e:
|
34
|
-
raise argparse.ArgumentTypeError(
|
34
|
+
raise argparse.ArgumentTypeError(
|
35
|
+
f"invalid float value: '{value}'"
|
36
|
+
) from e
|
35
37
|
if not 0 <= f_value <= 50:
|
36
38
|
raise argparse.ArgumentTypeError(
|
37
39
|
f"cutoff value {f_value} must be between 0 and 50"
|
@@ -41,7 +43,9 @@ def _validate_cutoff(value: str) -> float:
|
|
41
43
|
|
42
44
|
def build_subparser(subparsers: argparse._SubParsersAction) -> None:
|
43
45
|
"""Build the subparser."""
|
44
|
-
contrast_parser = subparsers.add_parser(
|
46
|
+
contrast_parser = subparsers.add_parser(
|
47
|
+
"contrast", help="contrast an image."
|
48
|
+
)
|
45
49
|
|
46
50
|
contrast_parser.set_defaults(func=run)
|
47
51
|
|
@@ -99,6 +103,8 @@ def run(args: argparse.Namespace) -> None:
|
|
99
103
|
|
100
104
|
for image_filename in args.image_filenames:
|
101
105
|
original_image = Image.open(image_filename)
|
102
|
-
contrast_image = ImageOps.autocontrast(
|
106
|
+
contrast_image = ImageOps.autocontrast(
|
107
|
+
original_image, cutoff=args.cutoff
|
108
|
+
)
|
103
109
|
|
104
110
|
save_image(args, contrast_image, image_filename, "contrast")
|
@@ -18,7 +18,7 @@
|
|
18
18
|
import argparse
|
19
19
|
import logging
|
20
20
|
import math
|
21
|
-
from typing import NamedTuple
|
21
|
+
from typing import NamedTuple, Union
|
22
22
|
|
23
23
|
from PIL import Image, ImageDraw
|
24
24
|
|
@@ -37,7 +37,9 @@ class HalftoneCell(NamedTuple):
|
|
37
37
|
|
38
38
|
def build_subparser(subparsers) -> None:
|
39
39
|
"""Build the subparser."""
|
40
|
-
halftone_parser = subparsers.add_parser(
|
40
|
+
halftone_parser = subparsers.add_parser(
|
41
|
+
"halftone", help="halftone an image"
|
42
|
+
)
|
41
43
|
|
42
44
|
halftone_parser.set_defaults(func=run)
|
43
45
|
|
@@ -129,22 +131,22 @@ def _draw_halftone_dot(
|
|
129
131
|
source_image: Image.Image,
|
130
132
|
cell: HalftoneCell,
|
131
133
|
grayscale: bool,
|
132
|
-
fill_color_dot,
|
134
|
+
fill_color_dot: int,
|
133
135
|
) -> None:
|
134
136
|
"""Calculate properties and draw a single halftone dot."""
|
135
|
-
#
|
137
|
+
# calculate center point of current cell
|
136
138
|
img_width, img_height = source_image.size
|
137
139
|
|
138
|
-
#
|
140
|
+
# calculate center point of current cell and clamp to image bounds
|
139
141
|
x = min(int(cell.col * cell.cellsize + cell.cellsize / 2), img_width - 1)
|
140
142
|
y = min(int(cell.row * cell.cellsize + cell.cellsize / 2), img_height - 1)
|
141
143
|
|
142
|
-
#
|
144
|
+
# ensure coordinates are non-negative (shouldn't happen with current logic,
|
143
145
|
# but safe)
|
144
146
|
x = max(0, x)
|
145
147
|
y = max(0, y)
|
146
148
|
|
147
|
-
#
|
149
|
+
# get pixel value (brightness or color) from the source image using clamped
|
148
150
|
# coordinates
|
149
151
|
pixel_value = source_image.getpixel((x, y))
|
150
152
|
|
@@ -152,17 +154,20 @@ def _draw_halftone_dot(
|
|
152
154
|
brightness = pixel_value
|
153
155
|
dot_fill = fill_color_dot # Use white for grayscale dots
|
154
156
|
else:
|
155
|
-
#
|
157
|
+
# calculate brightness (luminance) from the RGB color
|
156
158
|
brightness = int(
|
157
|
-
0.299 * pixel_value[0]
|
159
|
+
0.299 * pixel_value[0]
|
160
|
+
+ 0.587 * pixel_value[1]
|
161
|
+
+ 0.114 * pixel_value[2]
|
158
162
|
)
|
159
163
|
dot_fill = pixel_value # Use original color for color dots
|
160
164
|
|
161
|
-
#
|
162
|
-
# is half the cell size
|
165
|
+
# calculate dot radius relative to cell size based on brightness max radius
|
166
|
+
# is half the cell size
|
167
|
+
# scale by brightness (0-255).
|
163
168
|
dot_radius = (brightness / 255.0) * (cell.cellsize / 2)
|
164
169
|
|
165
|
-
#
|
170
|
+
# draw the dot
|
166
171
|
draw.ellipse(
|
167
172
|
[
|
168
173
|
x - dot_radius,
|
@@ -190,29 +195,30 @@ def create_halftone_image(
|
|
190
195
|
Returns:
|
191
196
|
Image.Image: The halftone converted image
|
192
197
|
"""
|
198
|
+
output_mode: str
|
199
|
+
fill_color_black: Union[int, tuple[int, int, int]]
|
200
|
+
fill_color_dot_for_grayscale: int
|
201
|
+
|
193
202
|
if grayscale:
|
194
203
|
source_image = original_image.convert("L")
|
195
204
|
output_mode = "L"
|
196
205
|
fill_color_black = 0
|
197
|
-
|
206
|
+
fill_color_dot_for_grayscale = 255
|
198
207
|
else:
|
199
208
|
source_image = original_image.convert("RGB")
|
200
209
|
output_mode = "RGB"
|
201
210
|
fill_color_black = (0, 0, 0)
|
202
|
-
|
211
|
+
fill_color_dot_for_grayscale = 0
|
203
212
|
|
204
213
|
width, height = original_image.size
|
205
214
|
|
206
|
-
#
|
215
|
+
# create a new image for the output, initialized to black
|
207
216
|
halftone_image = Image.new(output_mode, (width, height), fill_color_black)
|
208
217
|
draw = ImageDraw.Draw(halftone_image)
|
209
218
|
|
210
219
|
cellsize = width / cell_count
|
211
220
|
rowtotal = math.ceil(height / cellsize)
|
212
221
|
|
213
|
-
# Determine the fill color for dots once if grayscale
|
214
|
-
grayscale_fill_color_dot = fill_color_dot if grayscale else None
|
215
|
-
|
216
222
|
for row in range(rowtotal):
|
217
223
|
for col in range(cell_count):
|
218
224
|
cell = HalftoneCell(col=col, row=row, cellsize=cellsize)
|
@@ -221,7 +227,7 @@ def create_halftone_image(
|
|
221
227
|
source_image,
|
222
228
|
cell,
|
223
229
|
grayscale,
|
224
|
-
|
230
|
+
fill_color_dot_for_grayscale,
|
225
231
|
)
|
226
232
|
|
227
233
|
return halftone_image
|
@@ -107,7 +107,9 @@ def extract_exif_tags(image: Image.Image, sort: bool = False) -> dict:
|
|
107
107
|
if exif:
|
108
108
|
info = {ExifTags.TAGS.get(tag_id): exif.get(tag_id) for tag_id in exif}
|
109
109
|
|
110
|
-
filtered_info = {
|
110
|
+
filtered_info = {
|
111
|
+
key: value for key, value in info.items() if key is not None
|
112
|
+
}
|
111
113
|
if sort:
|
112
114
|
filtered_info = dict(sorted(filtered_info.items()))
|
113
115
|
|
@@ -27,7 +27,9 @@ log = logging.getLogger(__name__)
|
|
27
27
|
|
28
28
|
def build_subparser(subparsers) -> None:
|
29
29
|
"""Build the subparser."""
|
30
|
-
montage_parser = subparsers.add_parser(
|
30
|
+
montage_parser = subparsers.add_parser(
|
31
|
+
"montage", help="montage a list of image"
|
32
|
+
)
|
31
33
|
|
32
34
|
montage_parser.set_defaults(func=run)
|
33
35
|
|
@@ -59,7 +59,9 @@ def build_subparser(subparsers) -> None:
|
|
59
59
|
"--canvas-color",
|
60
60
|
default="black",
|
61
61
|
dest="canvas_color",
|
62
|
-
help=(
|
62
|
+
help=(
|
63
|
+
"the color of the extended larger canvas(default: '%(default)s')"
|
64
|
+
),
|
63
65
|
)
|
64
66
|
|
65
67
|
if "-c" in sys.argv or "--canvas" in sys.argv:
|
@@ -109,7 +109,9 @@ def build_subparser(subparsers: argparse._SubParsersAction) -> None:
|
|
109
109
|
dest="outline_width",
|
110
110
|
type=int,
|
111
111
|
default=2,
|
112
|
-
help=(
|
112
|
+
help=(
|
113
|
+
"set the outline width of the watermark text (default: '%(default)s')"
|
114
|
+
),
|
113
115
|
metavar="OUTLINE_WIDTH",
|
114
116
|
)
|
115
117
|
|
@@ -119,7 +121,9 @@ def build_subparser(subparsers: argparse._SubParsersAction) -> None:
|
|
119
121
|
dest="outline_color",
|
120
122
|
type=str,
|
121
123
|
default="black",
|
122
|
-
help=(
|
124
|
+
help=(
|
125
|
+
"set the outline color of the watermark text (default: '%(default)s')"
|
126
|
+
),
|
123
127
|
metavar="OUTLINE_COLOR",
|
124
128
|
)
|
125
129
|
|
@@ -197,7 +201,9 @@ def run(args: argparse.Namespace) -> None:
|
|
197
201
|
if image.format == "GIF":
|
198
202
|
watermark_gif_image(image, image_filename, args)
|
199
203
|
else:
|
200
|
-
watermarked_image: Image.Image = watermark_non_gif_image(
|
204
|
+
watermarked_image: Image.Image = watermark_non_gif_image(
|
205
|
+
image, args
|
206
|
+
)
|
201
207
|
save_image(args, watermarked_image, image_filename, "watermark")
|
202
208
|
|
203
209
|
|
@@ -333,12 +339,16 @@ def calc_font_size(image: Image.Image, args: argparse.Namespace) -> int:
|
|
333
339
|
return new_font_size
|
334
340
|
|
335
341
|
|
336
|
-
def calc_font_outline_width(
|
342
|
+
def calc_font_outline_width(
|
343
|
+
image: Image.Image, args: argparse.Namespace
|
344
|
+
) -> int:
|
337
345
|
"""Calculate the font padding based on the width of the image."""
|
338
346
|
width, _height = image.size
|
339
347
|
new_font_outline_width: int = args.outline_width
|
340
348
|
if width > 600:
|
341
|
-
new_font_outline_width = math.floor(
|
349
|
+
new_font_outline_width = math.floor(
|
350
|
+
FONT_OUTLINE_WIDTH_ASPECT_RATIO * width
|
351
|
+
)
|
342
352
|
|
343
353
|
log.debug("new font outline width: %d", new_font_outline_width)
|
344
354
|
return new_font_outline_width
|
@@ -20,7 +20,7 @@ classifiers = [
|
|
20
20
|
"Programming Language :: Python :: 3.13",
|
21
21
|
"Programming Language :: Python",
|
22
22
|
]
|
23
|
-
version = "0.31.
|
23
|
+
version = "0.31.8"
|
24
24
|
dynamic = ["description"]
|
25
25
|
keywords = ["photography", "photo"]
|
26
26
|
dependencies = [
|
@@ -38,10 +38,6 @@ fotolab = "fotolab.cli:main"
|
|
38
38
|
[dependency-groups]
|
39
39
|
dev = [
|
40
40
|
"exceptiongroup",
|
41
|
-
"flake8-docstrings",
|
42
|
-
"flake8-print",
|
43
|
-
"flake8-pytest-style",
|
44
|
-
"flake8-simplify",
|
45
41
|
"flit",
|
46
42
|
"importlib-metadata",
|
47
43
|
"myst-parser",
|
fotolab-0.31.5/.coveragerc
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
[run]
|
2
|
-
parallel = true
|
3
|
-
sigterm = true
|
4
|
-
source = fotolab
|
5
|
-
omit =
|
6
|
-
*/fotolab/__main__.py
|
7
|
-
|
8
|
-
[report]
|
9
|
-
fail_under = 100
|
10
|
-
ignore_errors = True
|
11
|
-
show_missing = True
|
12
|
-
sort=Cover
|
13
|
-
exclude_also =
|
14
|
-
def __repr__
|
15
|
-
|
16
|
-
[html]
|
17
|
-
directory = cover
|
fotolab-0.31.5/.gitignore
DELETED
@@ -1,167 +0,0 @@
|
|
1
|
-
# Byte-compiled / optimized / DLL files
|
2
|
-
__pycache__/
|
3
|
-
*.py[cod]
|
4
|
-
*$py.class
|
5
|
-
|
6
|
-
# C extensions
|
7
|
-
*.so
|
8
|
-
|
9
|
-
# Distribution / packaging
|
10
|
-
.Python
|
11
|
-
build/
|
12
|
-
develop-eggs/
|
13
|
-
dist/
|
14
|
-
downloads/
|
15
|
-
eggs/
|
16
|
-
.eggs/
|
17
|
-
lib/
|
18
|
-
lib64/
|
19
|
-
parts/
|
20
|
-
sdist/
|
21
|
-
var/
|
22
|
-
wheels/
|
23
|
-
share/python-wheels/
|
24
|
-
*.egg-info/
|
25
|
-
.installed.cfg
|
26
|
-
*.egg
|
27
|
-
MANIFEST
|
28
|
-
|
29
|
-
# PyInstaller
|
30
|
-
# Usually these files are written by a python script from a template
|
31
|
-
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32
|
-
*.manifest
|
33
|
-
*.spec
|
34
|
-
|
35
|
-
# Installer logs
|
36
|
-
pip-log.txt
|
37
|
-
pip-delete-this-directory.txt
|
38
|
-
|
39
|
-
# Unit test / coverage reports
|
40
|
-
htmlcov/
|
41
|
-
.tox/
|
42
|
-
.nox/
|
43
|
-
.coverage
|
44
|
-
.coverage.*
|
45
|
-
.cache
|
46
|
-
nosetests.xml
|
47
|
-
coverage.xml
|
48
|
-
*.cover
|
49
|
-
*.py,cover
|
50
|
-
.hypothesis/
|
51
|
-
.pytest_cache/
|
52
|
-
cover/
|
53
|
-
|
54
|
-
# Translations
|
55
|
-
*.mo
|
56
|
-
*.pot
|
57
|
-
|
58
|
-
# Django stuff:
|
59
|
-
*.log
|
60
|
-
local_settings.py
|
61
|
-
db.sqlite3
|
62
|
-
db.sqlite3-journal
|
63
|
-
|
64
|
-
# Flask stuff:
|
65
|
-
instance/
|
66
|
-
.webassets-cache
|
67
|
-
|
68
|
-
# Scrapy stuff:
|
69
|
-
.scrapy
|
70
|
-
|
71
|
-
# Sphinx documentation
|
72
|
-
docs/_build/
|
73
|
-
|
74
|
-
# PyBuilder
|
75
|
-
.pybuilder/
|
76
|
-
target/
|
77
|
-
|
78
|
-
# Jupyter Notebook
|
79
|
-
.ipynb_checkpoints
|
80
|
-
|
81
|
-
# IPython
|
82
|
-
profile_default/
|
83
|
-
ipython_config.py
|
84
|
-
|
85
|
-
# pyenv
|
86
|
-
# For a library or package, you might want to ignore these files since the code is
|
87
|
-
# intended to run in multiple environments; otherwise, check them in:
|
88
|
-
# .python-version
|
89
|
-
|
90
|
-
# pipenv
|
91
|
-
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92
|
-
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93
|
-
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94
|
-
# install all needed dependencies.
|
95
|
-
#Pipfile.lock
|
96
|
-
|
97
|
-
# poetry
|
98
|
-
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
99
|
-
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
100
|
-
# commonly ignored for libraries.
|
101
|
-
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
102
|
-
#poetry.lock
|
103
|
-
|
104
|
-
# pdm
|
105
|
-
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
106
|
-
#pdm.lock
|
107
|
-
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
108
|
-
# in version control.
|
109
|
-
# https://pdm.fming.dev/#use-with-ide
|
110
|
-
.pdm.toml
|
111
|
-
|
112
|
-
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
113
|
-
__pypackages__/
|
114
|
-
|
115
|
-
# Celery stuff
|
116
|
-
celerybeat-schedule
|
117
|
-
celerybeat.pid
|
118
|
-
|
119
|
-
# SageMath parsed files
|
120
|
-
*.sage.py
|
121
|
-
|
122
|
-
# Environments
|
123
|
-
.env
|
124
|
-
.venv
|
125
|
-
env/
|
126
|
-
venv/
|
127
|
-
ENV/
|
128
|
-
env.bak/
|
129
|
-
venv.bak/
|
130
|
-
|
131
|
-
# Spyder project settings
|
132
|
-
.spyderproject
|
133
|
-
.spyproject
|
134
|
-
|
135
|
-
# Rope project settings
|
136
|
-
.ropeproject
|
137
|
-
|
138
|
-
# mkdocs documentation
|
139
|
-
/site
|
140
|
-
|
141
|
-
# mypy
|
142
|
-
.mypy_cache/
|
143
|
-
.dmypy.json
|
144
|
-
dmypy.json
|
145
|
-
|
146
|
-
# Pyre type checker
|
147
|
-
.pyre/
|
148
|
-
|
149
|
-
# pytype static type analyzer
|
150
|
-
.pytype/
|
151
|
-
|
152
|
-
# Cython debug symbols
|
153
|
-
cython_debug/
|
154
|
-
|
155
|
-
# PyCharm
|
156
|
-
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
157
|
-
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
158
|
-
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
159
|
-
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
160
|
-
#.idea/
|
161
|
-
|
162
|
-
# heatmaps
|
163
|
-
*.png
|
164
|
-
.aider*
|
165
|
-
.opencode
|
166
|
-
TODO
|
167
|
-
output
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# See https://pre-commit.com for more information
|
2
|
-
# See https://pre-commit.com/hooks.html for more hooks
|
3
|
-
repos:
|
4
|
-
- repo: https://github.com/pre-commit/pre-commit-hooks
|
5
|
-
rev: v5.0.0
|
6
|
-
hooks:
|
7
|
-
- id: check-case-conflict
|
8
|
-
- id: check-merge-conflict
|
9
|
-
- id: check-toml
|
10
|
-
- id: check-yaml
|
11
|
-
- id: debug-statements
|
12
|
-
- id: detect-private-key
|
13
|
-
- id: end-of-file-fixer
|
14
|
-
- id: mixed-line-ending
|
15
|
-
- id: trailing-whitespace
|
16
|
-
|
17
|
-
- repo: https://github.com/abravalheri/validate-pyproject
|
18
|
-
rev: v0.24.1
|
19
|
-
hooks:
|
20
|
-
- id: validate-pyproject
|
21
|
-
name: validate-pyproject
|
22
|
-
|
23
|
-
- repo: https://github.com/codespell-project/codespell
|
24
|
-
rev: v2.4.1
|
25
|
-
hooks:
|
26
|
-
- id: codespell
|
27
|
-
args:
|
28
|
-
- --ignore-words-list=astroid
|
29
|
-
|
30
|
-
- repo: https://github.com/pre-commit/mirrors-prettier
|
31
|
-
rev: v4.0.0-alpha.8
|
32
|
-
hooks:
|
33
|
-
- id: prettier
|
34
|
-
exclude: (Pipfile.lock)
|
35
|
-
|
36
|
-
- repo: https://github.com/astral-sh/ruff-pre-commit
|
37
|
-
rev: v0.12.0
|
38
|
-
hooks:
|
39
|
-
- id: ruff-check
|
40
|
-
args: [--fix]
|
41
|
-
- id: ruff-format
|
42
|
-
|
43
|
-
- repo: https://github.com/pre-commit/mirrors-mypy
|
44
|
-
rev: v1.16.1
|
45
|
-
hooks:
|
46
|
-
- id: mypy
|
47
|
-
exclude: docs/
|