jacobus 1.0.5__tar.gz → 2.0.0.dev0__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.
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/PKG-INFO +1 -1
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/pyproject.toml +1 -1
- jacobus-2.0.0.dev0/src/jacobus/core/__init__.py +99 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/tests/test_jacobus_unittest.py +12 -4
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus.egg-info/PKG-INFO +1 -1
- jacobus-1.0.5/src/jacobus/core/__init__.py +0 -98
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/LICENSE.txt +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/MANIFEST.in +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/README.rst +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/setup.cfg +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/__init__.py +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/__main__.py +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/_const/Const.py +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/_const/__init__.py +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/_const/const.toml +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/py.typed +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus/tests/__init__.py +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus.egg-info/SOURCES.txt +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus.egg-info/dependency_links.txt +0 -0
- {jacobus-1.0.5 → jacobus-2.0.0.dev0}/src/jacobus.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import glob
|
|
3
|
+
import io
|
|
4
|
+
import os
|
|
5
|
+
import typing
|
|
6
|
+
from collections.abc import Iterable
|
|
7
|
+
from importlib import metadata
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
from jacobus._const.Const import Const
|
|
11
|
+
|
|
12
|
+
__all__ = ["main", "run"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def gcd(a: int, b: int) -> int:
|
|
16
|
+
while b:
|
|
17
|
+
a, b = b, a % b
|
|
18
|
+
return a
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def go(lines: list[str], *, indent: Optional[int]) -> list[str]:
|
|
22
|
+
diff: int
|
|
23
|
+
divisor: int
|
|
24
|
+
index: int
|
|
25
|
+
line: str
|
|
26
|
+
for index in range(len(lines)):
|
|
27
|
+
lines[index] = lines[index].rstrip() + "\n"
|
|
28
|
+
while len(lines) and lines[0] == "\n":
|
|
29
|
+
lines.pop(0)
|
|
30
|
+
while len(lines) and lines[-1] == "\n":
|
|
31
|
+
lines.pop()
|
|
32
|
+
continue
|
|
33
|
+
divisor = 0
|
|
34
|
+
if indent is None:
|
|
35
|
+
return lines
|
|
36
|
+
for line in lines:
|
|
37
|
+
diff = len(line) - len(line.lstrip(" "))
|
|
38
|
+
divisor = gcd(divisor, diff)
|
|
39
|
+
for index in range(len(lines) * bool(divisor)):
|
|
40
|
+
diff = len(lines[index]) - len(lines[index].lstrip(" "))
|
|
41
|
+
diff //= divisor
|
|
42
|
+
diff *= indent
|
|
43
|
+
lines[index] = (" " * diff) + lines[index].lstrip(" ")
|
|
44
|
+
return lines
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def main(args: typing.Optional[list[str]] = None, /) -> None:
|
|
48
|
+
parser: argparse.ArgumentParser
|
|
49
|
+
space: argparse.Namespace
|
|
50
|
+
parser = argparse.ArgumentParser(
|
|
51
|
+
description=Const.const.varia.get("description"),
|
|
52
|
+
fromfile_prefix_chars="@",
|
|
53
|
+
)
|
|
54
|
+
parser.add_argument(
|
|
55
|
+
"-V",
|
|
56
|
+
"--version",
|
|
57
|
+
action="version",
|
|
58
|
+
dest="version",
|
|
59
|
+
version=metadata.version("jacobus"),
|
|
60
|
+
)
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"--indent",
|
|
63
|
+
type=int,
|
|
64
|
+
)
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"filepatterns",
|
|
67
|
+
default=[],
|
|
68
|
+
nargs="*",
|
|
69
|
+
)
|
|
70
|
+
space = parser.parse_args(args)
|
|
71
|
+
run(**vars(space))
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def run(
|
|
75
|
+
filepatterns: Iterable[str] = (),
|
|
76
|
+
*,
|
|
77
|
+
indent: Optional[int] = None,
|
|
78
|
+
) -> None:
|
|
79
|
+
absfile: str
|
|
80
|
+
absfiles: list[str]
|
|
81
|
+
lines: list[str]
|
|
82
|
+
pattern: str
|
|
83
|
+
stream: io.TextIOWrapper
|
|
84
|
+
absfiles = list()
|
|
85
|
+
for pattern in filepatterns:
|
|
86
|
+
for absfile in map(os.path.abspath, glob.glob(pattern)):
|
|
87
|
+
if absfile in absfiles:
|
|
88
|
+
continue
|
|
89
|
+
absfiles.append(absfile)
|
|
90
|
+
for absfile in absfiles:
|
|
91
|
+
with open(file=absfile, mode="r") as stream:
|
|
92
|
+
lines = stream.readlines()
|
|
93
|
+
lines = go(lines, indent=indent)
|
|
94
|
+
with open(file=absfile, mode="w") as stream:
|
|
95
|
+
stream.writelines(lines)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
if __name__ == "__main__":
|
|
99
|
+
main()
|
|
@@ -9,17 +9,25 @@ from jacobus.core import run
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class JacobusRunTests(unittest.TestCase):
|
|
12
|
-
def test_strips_trailing_whitespace_and_outer_blank_lines(
|
|
12
|
+
def test_strips_trailing_whitespace_and_outer_blank_lines(
|
|
13
|
+
self: Self,
|
|
14
|
+
) -> None:
|
|
13
15
|
with tempfile.TemporaryDirectory() as tmp:
|
|
14
16
|
root = Path(tmp)
|
|
15
17
|
target = root / "sample.txt"
|
|
16
|
-
target.write_text(
|
|
18
|
+
target.write_text(
|
|
19
|
+
"\n\nalpha \n\n beta\t\t\n\n", encoding="utf-8"
|
|
20
|
+
)
|
|
17
21
|
|
|
18
22
|
run(str(root), files=["*.txt"])
|
|
19
23
|
|
|
20
|
-
self.assertEqual(
|
|
24
|
+
self.assertEqual(
|
|
25
|
+
target.read_text(encoding="utf-8"), "alpha\n\n beta\n"
|
|
26
|
+
)
|
|
21
27
|
|
|
22
|
-
def test_rescales_space_indentation_when_indent_is_given(
|
|
28
|
+
def test_rescales_space_indentation_when_indent_is_given(
|
|
29
|
+
self: Self,
|
|
30
|
+
) -> None:
|
|
23
31
|
with tempfile.TemporaryDirectory() as tmp:
|
|
24
32
|
root = Path(tmp)
|
|
25
33
|
target = root / "sample.py"
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import io
|
|
3
|
-
import pathlib
|
|
4
|
-
import typing
|
|
5
|
-
from collections.abc import Iterable
|
|
6
|
-
from importlib import metadata
|
|
7
|
-
from typing import Optional
|
|
8
|
-
|
|
9
|
-
from jacobus._const.Const import Const
|
|
10
|
-
|
|
11
|
-
__all__ = ["main", "run"]
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def main(args: typing.Optional[list[str]] = None, /) -> None:
|
|
15
|
-
parser: argparse.ArgumentParser
|
|
16
|
-
space: argparse.Namespace
|
|
17
|
-
parser = argparse.ArgumentParser(
|
|
18
|
-
description=Const.const.varia.get("description"),
|
|
19
|
-
formatter_class=argparse.RawTextHelpFormatter,
|
|
20
|
-
fromfile_prefix_chars="@",
|
|
21
|
-
)
|
|
22
|
-
parser.add_argument(
|
|
23
|
-
"-V",
|
|
24
|
-
"--version",
|
|
25
|
-
action="version",
|
|
26
|
-
dest="version",
|
|
27
|
-
version=metadata.version("jacobus"),
|
|
28
|
-
)
|
|
29
|
-
parser.add_argument(
|
|
30
|
-
"--file",
|
|
31
|
-
action="append",
|
|
32
|
-
default=[],
|
|
33
|
-
dest="files",
|
|
34
|
-
)
|
|
35
|
-
parser.add_argument(
|
|
36
|
-
"--indent",
|
|
37
|
-
type=int,
|
|
38
|
-
)
|
|
39
|
-
parser.add_argument(
|
|
40
|
-
"root",
|
|
41
|
-
)
|
|
42
|
-
space = parser.parse_args(args)
|
|
43
|
-
# kwargs = vars(space)
|
|
44
|
-
run(
|
|
45
|
-
space.root,
|
|
46
|
-
files=space.files,
|
|
47
|
-
indent=space.indent,
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def run(
|
|
52
|
-
root: str,
|
|
53
|
-
/,
|
|
54
|
-
*,
|
|
55
|
-
files: Iterable[str] = (),
|
|
56
|
-
indent: Optional[int] = None,
|
|
57
|
-
) -> None:
|
|
58
|
-
diff: int
|
|
59
|
-
divisor: int
|
|
60
|
-
index: int
|
|
61
|
-
line: str
|
|
62
|
-
lines: list[str]
|
|
63
|
-
path: pathlib.Path
|
|
64
|
-
paths: list[pathlib.Path]
|
|
65
|
-
stream: io.TextIOWrapper
|
|
66
|
-
paths = list()
|
|
67
|
-
for file in files:
|
|
68
|
-
for path in pathlib.Path(root).glob(file):
|
|
69
|
-
if path.is_file() and path not in paths:
|
|
70
|
-
paths.append(path)
|
|
71
|
-
for path in paths:
|
|
72
|
-
with open(file=path, mode="r") as stream:
|
|
73
|
-
lines = stream.readlines()
|
|
74
|
-
for index in range(len(lines)):
|
|
75
|
-
lines[index] = lines[index].rstrip() + "\n"
|
|
76
|
-
while len(lines) and lines[0] == "\n":
|
|
77
|
-
lines.pop(0)
|
|
78
|
-
while len(lines) and lines[-1] == "\n":
|
|
79
|
-
lines.pop()
|
|
80
|
-
continue
|
|
81
|
-
divisor = 0
|
|
82
|
-
if indent is not None:
|
|
83
|
-
for line in lines:
|
|
84
|
-
diff = len(line) - len(line.lstrip(" "))
|
|
85
|
-
divisor = gcd(divisor, diff)
|
|
86
|
-
for index in range(len(lines) * bool(divisor)):
|
|
87
|
-
diff = len(lines[index]) - len(lines[index].lstrip(" "))
|
|
88
|
-
diff //= divisor
|
|
89
|
-
diff *= indent
|
|
90
|
-
lines[index] = (" " * diff) + lines[index].lstrip(" ")
|
|
91
|
-
with open(file=path, mode="w") as stream:
|
|
92
|
-
stream.writelines(lines)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def gcd(a: int, b: int) -> int:
|
|
96
|
-
while b:
|
|
97
|
-
a, b = b, a % b
|
|
98
|
-
return a
|
|
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
|