batchfetch 1.1.9__tar.gz → 1.2.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.
- batchfetch-1.2.1/.gitignore +138 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/PKG-INFO +3 -3
- {batchfetch-1.1.9 → batchfetch-1.2.1}/README.md +2 -2
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch/batchfetch_git.py +41 -35
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch.egg-info/PKG-INFO +3 -3
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch.egg-info/SOURCES.txt +6 -1
- batchfetch-1.2.1/run_tests.sh +23 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/setup.py +1 -1
- batchfetch-1.2.1/tests/data/test-md5sum.txt +3 -0
- batchfetch-1.2.1/tests/data/test-run_simple.sh +5 -0
- batchfetch-1.2.1/tests/test_helpers.py +56 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/LICENSE +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch/__init__.py +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch/batchfetch_base.py +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch/batchfetch_cli.py +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch/helpers.py +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch.egg-info/dependency_links.txt +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch.egg-info/entry_points.txt +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch.egg-info/requires.txt +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/batchfetch.egg-info/top_level.txt +0 -0
- {batchfetch-1.1.9 → batchfetch-1.2.1}/setup.cfg +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
98
|
+
__pypackages__/
|
|
99
|
+
|
|
100
|
+
# Celery stuff
|
|
101
|
+
celerybeat-schedule
|
|
102
|
+
celerybeat.pid
|
|
103
|
+
|
|
104
|
+
# SageMath parsed files
|
|
105
|
+
*.sage.py
|
|
106
|
+
|
|
107
|
+
# Environments
|
|
108
|
+
.env
|
|
109
|
+
.venv
|
|
110
|
+
env/
|
|
111
|
+
venv/
|
|
112
|
+
ENV/
|
|
113
|
+
env.bak/
|
|
114
|
+
venv.bak/
|
|
115
|
+
|
|
116
|
+
# Spyder project settings
|
|
117
|
+
.spyderproject
|
|
118
|
+
.spyproject
|
|
119
|
+
|
|
120
|
+
# Rope project settings
|
|
121
|
+
.ropeproject
|
|
122
|
+
|
|
123
|
+
# mkdocs documentation
|
|
124
|
+
/site
|
|
125
|
+
|
|
126
|
+
# mypy
|
|
127
|
+
.mypy_cache/
|
|
128
|
+
.dmypy.json
|
|
129
|
+
dmypy.json
|
|
130
|
+
|
|
131
|
+
# Pyre type checker
|
|
132
|
+
.pyre/
|
|
133
|
+
|
|
134
|
+
# pytype static type analyzer
|
|
135
|
+
.pytype/
|
|
136
|
+
|
|
137
|
+
# Cython debug symbols
|
|
138
|
+
cython_debug/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: batchfetch
|
|
3
|
-
Version: 1.1
|
|
3
|
+
Version: 1.2.1
|
|
4
4
|
Summary: Efficiently clone and pull multiple Git repositories.
|
|
5
5
|
Home-page: https://github.com/jamescherti/batchfetch
|
|
6
6
|
Author: James Cherti
|
|
@@ -57,12 +57,12 @@ tasks:
|
|
|
57
57
|
# Clone the tag 1.5 of the consult repository to the './consult'
|
|
58
58
|
# directory
|
|
59
59
|
- git: https://github.com/minad/consult
|
|
60
|
-
|
|
60
|
+
revision: "1.5"
|
|
61
61
|
|
|
62
62
|
# Clone the s.el repository to the './another-name.el' directory
|
|
63
63
|
- git: https://github.com/magnars/s.el
|
|
64
64
|
path: another-name.el
|
|
65
|
-
|
|
65
|
+
revision: dda84d38fffdaf0c9b12837b504b402af910d01d
|
|
66
66
|
|
|
67
67
|
# Delete './impatient-mode'
|
|
68
68
|
- git: https://github.com/skeeto/impatient-mode
|
|
@@ -37,12 +37,12 @@ tasks:
|
|
|
37
37
|
# Clone the tag 1.5 of the consult repository to the './consult'
|
|
38
38
|
# directory
|
|
39
39
|
- git: https://github.com/minad/consult
|
|
40
|
-
|
|
40
|
+
revision: "1.5"
|
|
41
41
|
|
|
42
42
|
# Clone the s.el repository to the './another-name.el' directory
|
|
43
43
|
- git: https://github.com/magnars/s.el
|
|
44
44
|
path: another-name.el
|
|
45
|
-
|
|
45
|
+
revision: dda84d38fffdaf0c9b12837b504b402af910d01d
|
|
46
46
|
|
|
47
47
|
# Delete './impatient-mode'
|
|
48
48
|
- git: https://github.com/skeeto/impatient-mode
|
|
@@ -32,8 +32,8 @@ from .batchfetch_base import BatchFetchError, TaskBatchFetch
|
|
|
32
32
|
from .helpers import run_simple
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
class
|
|
36
|
-
"""The Git
|
|
35
|
+
class GitRevisionDoesNotExist(Exception):
|
|
36
|
+
"""The Git revision does not exist."""
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
class GitRemoteError(Exception):
|
|
@@ -58,6 +58,7 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
58
58
|
self.task_schema.update({
|
|
59
59
|
# Local options
|
|
60
60
|
self.main_key: str,
|
|
61
|
+
Optional("revision"): str,
|
|
61
62
|
Optional("reference"): str,
|
|
62
63
|
|
|
63
64
|
# Same as global options
|
|
@@ -77,7 +78,7 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
77
78
|
|
|
78
79
|
self.task_default_values.update({
|
|
79
80
|
self.main_key: "",
|
|
80
|
-
"
|
|
81
|
+
"revision": "",
|
|
81
82
|
"delete": False,
|
|
82
83
|
})
|
|
83
84
|
|
|
@@ -100,6 +101,11 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
100
101
|
"""Clone or update a Git repository."""
|
|
101
102
|
super().update()
|
|
102
103
|
|
|
104
|
+
# Backward compatibility
|
|
105
|
+
if "reference" in self._item_values \
|
|
106
|
+
and "revision" not in self._item_values:
|
|
107
|
+
self._item_values["revision"] = "reference"
|
|
108
|
+
|
|
103
109
|
is_clone = False
|
|
104
110
|
if not self.git_local_dir.exists():
|
|
105
111
|
is_clone = True
|
|
@@ -113,8 +119,8 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
113
119
|
update_type = "UPDATE"
|
|
114
120
|
|
|
115
121
|
self.add_output(f"[GIT {update_type}] {self[self.main_key]}" +
|
|
116
|
-
(f" (Ref: {self['
|
|
117
|
-
if self["
|
|
122
|
+
(f" (Ref: {self['revision']})"
|
|
123
|
+
if self["revision"] else "") + "\n")
|
|
118
124
|
|
|
119
125
|
try:
|
|
120
126
|
# Delete
|
|
@@ -160,7 +166,7 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
160
166
|
return self.values
|
|
161
167
|
|
|
162
168
|
def _git_ref(self, cwd: Union[None, Path] = None) -> str:
|
|
163
|
-
"""Get the commit
|
|
169
|
+
"""Get the commit revision of HEAD.
|
|
164
170
|
|
|
165
171
|
The command will fail if the branch is detached.
|
|
166
172
|
"""
|
|
@@ -191,11 +197,11 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
191
197
|
# If the tag is annotated, it points to a tag object, not
|
|
192
198
|
# directly to a commit. You need to resolve it to the
|
|
193
199
|
# commit it points to. Using `git rev-parse
|
|
194
|
-
# <tagname>^{commit}` allows getting the right
|
|
195
|
-
commit_ref = self._git_tags(self["
|
|
200
|
+
# <tagname>^{commit}` allows getting the right revision.
|
|
201
|
+
commit_ref = self._git_tags(self["revision"] +
|
|
196
202
|
"^{commit}")[0]
|
|
197
203
|
self.branch_commit_ref = commit_ref.strip()
|
|
198
|
-
except
|
|
204
|
+
except GitRevisionDoesNotExist:
|
|
199
205
|
pass
|
|
200
206
|
|
|
201
207
|
def _repo_delete(self):
|
|
@@ -235,21 +241,21 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
235
241
|
do_git_pull = self["git_pull"]
|
|
236
242
|
if self.is_branch:
|
|
237
243
|
do_git_pull = True
|
|
238
|
-
elif not self["
|
|
244
|
+
elif not self["revision"]:
|
|
239
245
|
do_git_pull = True
|
|
240
246
|
self.add_output(self.indent_spaces +
|
|
241
247
|
"[INFO] Git fetch origin reason: " +
|
|
242
|
-
"No '
|
|
248
|
+
"No 'revision:' specified\n")
|
|
243
249
|
else:
|
|
244
250
|
do_git_pull = False
|
|
245
251
|
commit_ref = None
|
|
246
252
|
|
|
247
253
|
try:
|
|
248
|
-
# Check if the
|
|
254
|
+
# Check if the revision such as
|
|
249
255
|
# 0560fe21d1173b2221fd8c600fab818f7eecbad4 exist
|
|
250
|
-
commit_ref = self._git_tags(self["
|
|
256
|
+
commit_ref = self._git_tags(self["revision"])[0]
|
|
251
257
|
commit_ref = commit_ref.strip()
|
|
252
|
-
except
|
|
258
|
+
except GitRevisionDoesNotExist:
|
|
253
259
|
pass
|
|
254
260
|
|
|
255
261
|
if not commit_ref and not self.is_branch:
|
|
@@ -257,19 +263,19 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
257
263
|
self.add_output(
|
|
258
264
|
self.indent_spaces +
|
|
259
265
|
"[INFO] Git fetch origin reason: " +
|
|
260
|
-
f"The
|
|
266
|
+
f"The revision does not exist: {self['revision']}" +
|
|
261
267
|
"\n")
|
|
262
268
|
|
|
263
269
|
if not do_git_pull:
|
|
264
270
|
try:
|
|
265
271
|
# Check if the branch is a tag or a branch
|
|
266
272
|
cmd = ["git", "show-ref", "--verify", "--quiet",
|
|
267
|
-
f"refs/heads/{self['
|
|
273
|
+
f"refs/heads/{self['revision']}"]
|
|
268
274
|
run_simple(cmd, env=self.env, cwd=self.git_local_dir)
|
|
269
275
|
self.add_output(
|
|
270
276
|
self.indent_spaces +
|
|
271
277
|
"[INFO] Git fetch origin reason:" +
|
|
272
|
-
f"{self['
|
|
278
|
+
f"{self['revision']} is a branch, not a tag" +
|
|
273
279
|
"\n")
|
|
274
280
|
do_git_pull = True
|
|
275
281
|
except subprocess.CalledProcessError:
|
|
@@ -282,14 +288,14 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
282
288
|
# not directly to a commit. You need to resolve it to
|
|
283
289
|
# the commit it points to. Using `git rev-parse
|
|
284
290
|
# <tagname>^{commit}` allows getting the right
|
|
285
|
-
#
|
|
291
|
+
# revision.
|
|
286
292
|
commit_ref_head = self._git_tags("HEAD^{commit}")[0]
|
|
287
293
|
commit_ref_head = commit_ref_head.strip()
|
|
288
|
-
except
|
|
294
|
+
except GitRevisionDoesNotExist:
|
|
289
295
|
# HEAD is detached
|
|
290
296
|
commit_ref_head = None
|
|
291
297
|
|
|
292
|
-
# The wanted commit
|
|
298
|
+
# The wanted commit revision does not exist
|
|
293
299
|
# Or the commit ref of HEAD hasn't changed
|
|
294
300
|
if not commit_ref_head or commit_ref_head != commit_ref:
|
|
295
301
|
self.add_output(
|
|
@@ -395,46 +401,46 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
395
401
|
error = True
|
|
396
402
|
|
|
397
403
|
if error:
|
|
398
|
-
raise
|
|
399
|
-
f"The
|
|
404
|
+
raise GitRevisionDoesNotExist(
|
|
405
|
+
f"The revision '{branch}' does not exist.")
|
|
400
406
|
|
|
401
407
|
return stdout
|
|
402
408
|
|
|
403
409
|
def _repo_fix_branch(self) -> bool:
|
|
404
410
|
git_ref_after_merge = self._git_ref(cwd=self.git_local_dir)
|
|
405
411
|
branch_changed = False
|
|
406
|
-
if self["
|
|
412
|
+
if self["revision"]:
|
|
407
413
|
# We also need tags because sometimes, a branch
|
|
408
|
-
# returns a different commit
|
|
414
|
+
# returns a different commit revision
|
|
409
415
|
git_tags, _ = run_simple(
|
|
410
416
|
["git", "tag", "--points-at", "HEAD"],
|
|
411
417
|
env=self.env,
|
|
412
418
|
cwd=self.git_local_dir,
|
|
413
419
|
)
|
|
414
420
|
|
|
415
|
-
# Also check the commit
|
|
416
|
-
# branch is a commit
|
|
421
|
+
# Also check the commit revision in case
|
|
422
|
+
# branch is a commit revision instead of a tag
|
|
417
423
|
try:
|
|
418
424
|
# Check if the branch exists
|
|
419
425
|
git_ref_branch = self._git_tags("origin/" +
|
|
420
|
-
self["
|
|
426
|
+
self["revision"] +
|
|
421
427
|
"^{commit}")[0]
|
|
422
|
-
except
|
|
428
|
+
except GitRevisionDoesNotExist:
|
|
423
429
|
# Check if the commit ref exists
|
|
424
430
|
try:
|
|
425
|
-
git_ref_branch = self._git_tags(self["
|
|
426
|
-
except
|
|
427
|
-
raise BatchFetchError(f"The branch '{self['
|
|
431
|
+
git_ref_branch = self._git_tags(self["revision"])[0]
|
|
432
|
+
except GitRevisionDoesNotExist as err:
|
|
433
|
+
raise BatchFetchError(f"The branch '{self['revision']}' "
|
|
428
434
|
"does not exist.") from err
|
|
429
435
|
|
|
430
436
|
if git_ref_after_merge != git_ref_branch and \
|
|
431
|
-
self["
|
|
437
|
+
self["revision"] not in git_tags:
|
|
432
438
|
# Update the branch
|
|
433
|
-
self._run(["git", "checkout"] + [self["
|
|
439
|
+
self._run(["git", "checkout"] + [self["revision"]],
|
|
434
440
|
cwd=str(self.git_local_dir), env=self.env)
|
|
435
441
|
self.add_output(self.indent_spaces +
|
|
436
442
|
"[INFO] Branch changed to " +
|
|
437
|
-
self["
|
|
443
|
+
self["revision"] + "\n")
|
|
438
444
|
self.set_changed(True)
|
|
439
445
|
branch_changed = True
|
|
440
446
|
|
|
@@ -460,7 +466,7 @@ class BatchFetchGit(TaskBatchFetch):
|
|
|
460
466
|
# 3. It does not directly consult the upstream repositories
|
|
461
467
|
# of the submodules.
|
|
462
468
|
# 4. Submodules are updated to reflect the exact commits
|
|
463
|
-
#
|
|
469
|
+
# revision in the parent repository's configuration,
|
|
464
470
|
# potentially lagging behind the latest changes made in the
|
|
465
471
|
# upstream repositories.
|
|
466
472
|
if self.git_local_dir.joinpath(".gitmodules").is_file():
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: batchfetch
|
|
3
|
-
Version: 1.1
|
|
3
|
+
Version: 1.2.1
|
|
4
4
|
Summary: Efficiently clone and pull multiple Git repositories.
|
|
5
5
|
Home-page: https://github.com/jamescherti/batchfetch
|
|
6
6
|
Author: James Cherti
|
|
@@ -57,12 +57,12 @@ tasks:
|
|
|
57
57
|
# Clone the tag 1.5 of the consult repository to the './consult'
|
|
58
58
|
# directory
|
|
59
59
|
- git: https://github.com/minad/consult
|
|
60
|
-
|
|
60
|
+
revision: "1.5"
|
|
61
61
|
|
|
62
62
|
# Clone the s.el repository to the './another-name.el' directory
|
|
63
63
|
- git: https://github.com/magnars/s.el
|
|
64
64
|
path: another-name.el
|
|
65
|
-
|
|
65
|
+
revision: dda84d38fffdaf0c9b12837b504b402af910d01d
|
|
66
66
|
|
|
67
67
|
# Delete './impatient-mode'
|
|
68
68
|
- git: https://github.com/skeeto/impatient-mode
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
.gitignore
|
|
1
2
|
LICENSE
|
|
2
3
|
README.md
|
|
4
|
+
run_tests.sh
|
|
3
5
|
setup.py
|
|
4
6
|
batchfetch/__init__.py
|
|
5
7
|
batchfetch/batchfetch_base.py
|
|
@@ -11,4 +13,7 @@ batchfetch.egg-info/SOURCES.txt
|
|
|
11
13
|
batchfetch.egg-info/dependency_links.txt
|
|
12
14
|
batchfetch.egg-info/entry_points.txt
|
|
13
15
|
batchfetch.egg-info/requires.txt
|
|
14
|
-
batchfetch.egg-info/top_level.txt
|
|
16
|
+
batchfetch.egg-info/top_level.txt
|
|
17
|
+
tests/test_helpers.py
|
|
18
|
+
tests/data/test-md5sum.txt
|
|
19
|
+
tests/data/test-run_simple.sh
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2024 James Cherti
|
|
4
|
+
# URL: https://github.com/jamescherti/batchfetch
|
|
5
|
+
#
|
|
6
|
+
# This program is free software: you can redistribute it and/or modify it under
|
|
7
|
+
# the terms of the GNU General Public License as published by the Free Software
|
|
8
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
9
|
+
# version.
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
12
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
13
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU General Public License along with
|
|
16
|
+
# this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
cd "$(dirname "${BASH_SOURCE[0]}")"
|
|
19
|
+
export PYTHONPATH="$(pwd)"
|
|
20
|
+
exec pytest -v -v --cov=batchfetch --cov=tests \
|
|
21
|
+
--cov-report=term \
|
|
22
|
+
--cov-report=html:htmlcov \
|
|
23
|
+
tests/test_*py
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2024 James Cherti
|
|
4
|
+
# URL: https://github.com/jamescherti/batchfetch
|
|
5
|
+
#
|
|
6
|
+
# This program is free software: you can redistribute it and/or modify it under
|
|
7
|
+
# the terms of the GNU General Public License as published by the Free Software
|
|
8
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
9
|
+
# version.
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
12
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
13
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU General Public License along with
|
|
16
|
+
# this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
"""Unit tests."""
|
|
19
|
+
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
from batchfetch import helpers
|
|
23
|
+
|
|
24
|
+
DATA_PATH = Path(".").joinpath("tests", "data").absolute()
|
|
25
|
+
SCRIPT_RUN_SIMPLE = DATA_PATH / "test-run_simple.sh"
|
|
26
|
+
TEST_MD5SUM_FILE = DATA_PATH / "test-md5sum.txt"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_md5sum():
|
|
30
|
+
md5sum = helpers.md5sum(TEST_MD5SUM_FILE)
|
|
31
|
+
assert md5sum == "f31e127edc87a6aa2eb01b7d94d2ec58"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_run_simple():
|
|
35
|
+
# Stdout
|
|
36
|
+
stdout_lines, stderr_lines = helpers.run_simple(str(SCRIPT_RUN_SIMPLE))
|
|
37
|
+
assert stdout_lines == ['Test 1.',
|
|
38
|
+
'Test 2.',
|
|
39
|
+
'Test 3.']
|
|
40
|
+
assert stderr_lines == ['Test 3.']
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_indent_raw_output():
|
|
44
|
+
list_str = \
|
|
45
|
+
helpers.indent_raw_output(["Test 1.", "Test 2."])
|
|
46
|
+
|
|
47
|
+
assert list_str == [" Test 1.", " Test 2."]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_run_indent():
|
|
51
|
+
stdout_lines, stderr_lines = helpers.run_indent(str(SCRIPT_RUN_SIMPLE))
|
|
52
|
+
assert stdout_lines == [f' [RUN] {str(SCRIPT_RUN_SIMPLE)}',
|
|
53
|
+
' Test 1.',
|
|
54
|
+
' Test 2.',
|
|
55
|
+
' Test 3.']
|
|
56
|
+
assert stderr_lines == [' Test 3.']
|
|
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
|