gulp-cli 1.1.6__tar.gz → 1.1.7__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 (68) hide show
  1. {gulp_cli-1.1.6/src/gulp_cli.egg-info → gulp_cli-1.1.7}/PKG-INFO +1 -1
  2. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/_version.py +3 -3
  3. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/ingest.py +10 -2
  4. {gulp_cli-1.1.6 → gulp_cli-1.1.7/src/gulp_cli.egg-info}/PKG-INFO +1 -1
  5. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/SOURCES.txt +2 -0
  6. gulp_cli-1.1.7/src/gulp_cli.egg-info/scm_file_list.json +61 -0
  7. gulp_cli-1.1.7/src/gulp_cli.egg-info/scm_version.json +8 -0
  8. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_zip_create.py +55 -0
  9. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/.github/workflows/portable-bundles.yml +0 -0
  10. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/.github/workflows/python-package.yml +0 -0
  11. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/.gitignore +0 -0
  12. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/GULP_DUAL_LICENSE.txt +0 -0
  13. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/LICENSE.AGPL-3.0.txt +0 -0
  14. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/LICENSE.md +0 -0
  15. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/README.md +0 -0
  16. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/command-reference.md +0 -0
  17. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/examples.md +0 -0
  18. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/extensions.md +0 -0
  19. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/getting-started.md +0 -0
  20. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/portable.md +0 -0
  21. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/resource-management.md +0 -0
  22. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/troubleshooting-cli.md +0 -0
  23. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/gulp-cli.spec +0 -0
  24. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/portable/launch-linux.sh +0 -0
  25. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/portable/launch-macos.sh +0 -0
  26. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/portable/launch-windows.bat +0 -0
  27. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/pyproject.toml +0 -0
  28. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/setup.cfg +0 -0
  29. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/__init__.py +0 -0
  30. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/__main__.py +0 -0
  31. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/cli.py +0 -0
  32. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/client.py +0 -0
  33. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/__init__.py +0 -0
  34. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/acl.py +0 -0
  35. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/auth.py +0 -0
  36. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/collab.py +0 -0
  37. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/context.py +0 -0
  38. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/db.py +0 -0
  39. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/enhance_map.py +0 -0
  40. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/enrich.py +0 -0
  41. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/glyph.py +0 -0
  42. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/mapping.py +0 -0
  43. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/operations.py +0 -0
  44. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/plugin.py +0 -0
  45. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/query.py +0 -0
  46. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/source.py +0 -0
  47. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/stats.py +0 -0
  48. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/storage.py +0 -0
  49. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/user_group.py +0 -0
  50. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/users.py +0 -0
  51. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/utility.py +0 -0
  52. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/config.py +0 -0
  53. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension/__init__.py +0 -0
  54. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension/query_sigma_zip.py +0 -0
  55. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension/story.py +0 -0
  56. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension_helpers.py +0 -0
  57. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extensions.py +0 -0
  58. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/output.py +0 -0
  59. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/utils.py +0 -0
  60. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/version.py +0 -0
  61. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/dependency_links.txt +0 -0
  62. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/entry_points.txt +0 -0
  63. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/requires.txt +0 -0
  64. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/top_level.txt +0 -0
  65. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_enrich_live.py +0 -0
  66. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_ingest_paths_file.py +0 -0
  67. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_ingest_wait_log.py +0 -0
  68. {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gulp-cli
3
- Version: 1.1.6
3
+ Version: 1.1.7
4
4
  Summary: Command-line client for gULP
5
5
  Author-email: Mentat <info@mentat.is>
6
6
  Requires-Python: >=3.12
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.1.6'
22
- __version_tuple__ = version_tuple = (1, 1, 6)
21
+ __version__ = version = '1.1.7'
22
+ __version_tuple__ = version_tuple = (1, 1, 7)
23
23
 
24
- __commit_id__ = commit_id = 'g8d034cc8b'
24
+ __commit_id__ = commit_id = 'g5f188bb2b'
@@ -297,18 +297,26 @@ def _build_zip_from_sources(
297
297
  total_entries = 0
298
298
  entries_added = 0
299
299
 
300
+ def _safe_archive_name(path: str) -> str:
301
+ """Return a ZIP entry path without dot-directory components."""
302
+ return "/".join(
303
+ part
304
+ for part in path.replace("\\", "/").split("/")
305
+ if part not in ("", ".", "..")
306
+ )
307
+
300
308
  def _archive_name_for_path(source_path: Path, base_dir: Path) -> str:
301
309
  if preserve_path:
302
310
  try:
303
311
  rel_path = os.path.relpath(source_path, Path.cwd())
304
312
  except ValueError:
305
313
  rel_path = source_path.name
306
- return Path(rel_path).as_posix()
314
+ return _safe_archive_name(rel_path)
307
315
  try:
308
316
  rel_path = source_path.relative_to(base_dir)
309
317
  except ValueError:
310
318
  rel_path = source_path.name
311
- return rel_path.as_posix()
319
+ return _safe_archive_name(rel_path.as_posix())
312
320
 
313
321
  planned_entries: list[tuple[Path, Path, str]] = []
314
322
  for source_path, base_dir in sources:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gulp-cli
3
- Version: 1.1.6
3
+ Version: 1.1.7
4
4
  Summary: Command-line client for gULP
5
5
  Author-email: Mentat <info@mentat.is>
6
6
  Requires-Python: >=3.12
@@ -33,6 +33,8 @@ src/gulp_cli.egg-info/SOURCES.txt
33
33
  src/gulp_cli.egg-info/dependency_links.txt
34
34
  src/gulp_cli.egg-info/entry_points.txt
35
35
  src/gulp_cli.egg-info/requires.txt
36
+ src/gulp_cli.egg-info/scm_file_list.json
37
+ src/gulp_cli.egg-info/scm_version.json
36
38
  src/gulp_cli.egg-info/top_level.txt
37
39
  src/gulp_cli/commands/__init__.py
38
40
  src/gulp_cli/commands/acl.py
@@ -0,0 +1,61 @@
1
+ {
2
+ "files": [
3
+ "GULP_DUAL_LICENSE.txt",
4
+ "README.md",
5
+ "pyproject.toml",
6
+ "LICENSE.AGPL-3.0.txt",
7
+ "LICENSE.md",
8
+ "gulp-cli.spec",
9
+ ".gitignore",
10
+ "portable/launch-windows.bat",
11
+ "portable/launch-linux.sh",
12
+ "portable/launch-macos.sh",
13
+ "docs/troubleshooting-cli.md",
14
+ "docs/examples.md",
15
+ "docs/getting-started.md",
16
+ "docs/extensions.md",
17
+ "docs/resource-management.md",
18
+ "docs/portable.md",
19
+ "docs/command-reference.md",
20
+ "src/gulp_cli/__init__.py",
21
+ "src/gulp_cli/version.py",
22
+ "src/gulp_cli/extension_helpers.py",
23
+ "src/gulp_cli/output.py",
24
+ "src/gulp_cli/config.py",
25
+ "src/gulp_cli/utils.py",
26
+ "src/gulp_cli/client.py",
27
+ "src/gulp_cli/extensions.py",
28
+ "src/gulp_cli/cli.py",
29
+ "src/gulp_cli/__main__.py",
30
+ "src/gulp_cli/extension/query_sigma_zip.py",
31
+ "src/gulp_cli/extension/story.py",
32
+ "src/gulp_cli/extension/__init__.py",
33
+ "src/gulp_cli/commands/__init__.py",
34
+ "src/gulp_cli/commands/source.py",
35
+ "src/gulp_cli/commands/ingest.py",
36
+ "src/gulp_cli/commands/users.py",
37
+ "src/gulp_cli/commands/glyph.py",
38
+ "src/gulp_cli/commands/context.py",
39
+ "src/gulp_cli/commands/acl.py",
40
+ "src/gulp_cli/commands/user_group.py",
41
+ "src/gulp_cli/commands/utility.py",
42
+ "src/gulp_cli/commands/operations.py",
43
+ "src/gulp_cli/commands/auth.py",
44
+ "src/gulp_cli/commands/stats.py",
45
+ "src/gulp_cli/commands/enrich.py",
46
+ "src/gulp_cli/commands/query.py",
47
+ "src/gulp_cli/commands/enhance_map.py",
48
+ "src/gulp_cli/commands/storage.py",
49
+ "src/gulp_cli/commands/db.py",
50
+ "src/gulp_cli/commands/collab.py",
51
+ "src/gulp_cli/commands/mapping.py",
52
+ "src/gulp_cli/commands/plugin.py",
53
+ "tests/test_ingest_paths_file.py",
54
+ "tests/test_version.py",
55
+ "tests/test_enrich_live.py",
56
+ "tests/test_zip_create.py",
57
+ "tests/test_ingest_wait_log.py",
58
+ ".github/workflows/portable-bundles.yml",
59
+ ".github/workflows/python-package.yml"
60
+ ]
61
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.1.7",
3
+ "distance": 0,
4
+ "node": "g5f188bb2b8862aa3c0a6ca011bef91125feed6a5",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-06-23"
8
+ }
@@ -94,6 +94,61 @@ def test_build_zip_from_sources_preserves_path_when_requested(
94
94
  assert archive.namelist() == ["samples/nested/data.json"]
95
95
 
96
96
 
97
+ @pytest.mark.parametrize(
98
+ "rel_path",
99
+ ["./samples/nested/data.json", ".\\samples\\nested\\data.json"],
100
+ )
101
+ def test_build_zip_from_sources_strips_current_dir_paths_when_preserving(
102
+ tmp_path: Path, monkeypatch, rel_path: str
103
+ ) -> None:
104
+ source_file = tmp_path / "data.json"
105
+ source_file.write_text('{"value": 1}', encoding="utf-8")
106
+ monkeypatch.setattr(
107
+ "gulp_cli.commands.ingest.os.path.relpath",
108
+ lambda _source_path, _cwd: rel_path,
109
+ )
110
+
111
+ output_zip = tmp_path / "out.zip"
112
+ archived_count, archived_entries, created_archives = _build_zip_from_sources(
113
+ output_zip,
114
+ [(source_file, tmp_path)],
115
+ preserve_path=True,
116
+ )
117
+
118
+ expected = "samples/nested/data.json"
119
+ assert archived_count == 1
120
+ assert archived_entries == [expected]
121
+
122
+ with zipfile.ZipFile(created_archives[0]) as archive:
123
+ assert archive.namelist() == [expected]
124
+
125
+
126
+ def test_build_zip_from_sources_strips_parent_paths_when_preserving(
127
+ tmp_path: Path, monkeypatch
128
+ ) -> None:
129
+ source_dir = tmp_path / "samples" / "win_evtx"
130
+ source_dir.mkdir(parents=True)
131
+ source_file = source_dir / "2-system-Microsoft-Windows-LiveId%4Operational.evtx"
132
+ source_file.write_text("payload", encoding="utf-8")
133
+ cwd = tmp_path / "a" / "b" / "c"
134
+ cwd.mkdir(parents=True)
135
+ monkeypatch.chdir(cwd)
136
+
137
+ output_zip = tmp_path / "out.zip"
138
+ archived_count, archived_entries, created_archives = _build_zip_from_sources(
139
+ output_zip,
140
+ [(source_file, source_dir.parent)],
141
+ preserve_path=True,
142
+ )
143
+
144
+ expected = "samples/win_evtx/2-system-Microsoft-Windows-LiveId%4Operational.evtx"
145
+ assert archived_count == 1
146
+ assert archived_entries == [expected]
147
+
148
+ with zipfile.ZipFile(created_archives[0]) as archive:
149
+ assert archive.namelist() == [expected]
150
+
151
+
97
152
  def test_build_zip_from_sources_prints_file_progress(
98
153
  tmp_path: Path, capsys: pytest.CaptureFixture[str]
99
154
  ) -> None:
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