haraka 0.2.30__py3-none-any.whl → 0.2.31__py3-none-any.whl

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.
@@ -76,73 +76,55 @@ class ResourcePurger:
76
76
  divider("Project tree after purge…")
77
77
  self._f.print_tree(project_dir)
78
78
 
79
- # ----------------------------- internals ------------------------------ #
79
+ # --------------------------------------------------------------------------- #
80
+ # internals #
81
+ # --------------------------------------------------------------------------- #
80
82
  def _purge_unrelated(self, root: Path, spec: PathSpec) -> None:
81
83
  """
82
- Walk the project tree; delete every path NOT matched by *spec*.
83
-
84
- Updated to align with the `test_java_manifest` logic for cleaner organization.
84
+ Walk *root* recursively and delete every path **not** matched by *spec*.
85
+ A directory is preserved if **it or any ancestor** is matched.
85
86
  """
87
+ all_paths = list(root.rglob("*"))
88
+ self._log.debug("📋 Scanning %d paths under %s", len(all_paths), root)
86
89
 
87
- # Dictionaries to separate matches and non-matches for logging
90
+ keep: list[str] = []
91
+ delete_files: list[str] = []
92
+ delete_dirs: list[str] = []
88
93
 
89
- # 1) Dump every path under root or state what was found
90
- all_paths = list(root.rglob("*"))
91
- if self._log.evm:
92
- self._log.debug(f"📋 All paths under {root} (total {len(all_paths)}):")
93
- for p in all_paths:
94
- print(f"{p.relative_to(root)}")
95
- else:
96
- self._log.debug(f"Found {len(all_paths)} paths under {root})")
97
-
98
- matches, non_matched_files, directories_skipped, non_matched_dirs = [], [], [], []
99
94
  for path in all_paths:
100
- self._log.debug(f"\nScanning path: {path}")
101
95
  rel = path.relative_to(root).as_posix()
102
- self._log.debug(f"Relative path for inspection: {rel}")
103
- # Match file against the PathSpec
104
- if spec.match_file(rel):
105
- self._log.debug(f"✅ KEEP: Path matches keep patterns: {rel}")
106
- matches.append(path) # Collect paths to keep
107
- else:
108
- if path.is_dir():
109
- if self._is_dir_protected(rel, spec):
110
- self._log.debug(f"{"⏭️ SKIPPING DELETE: Protected ancestor found: %s", path}")
111
- directories_skipped.append(rel)
112
- else:
113
- self._log.debug(f"{"❌ DELETE DIR: %s", rel}")
114
- non_matched_dirs.append(rel)
115
- else:
116
- non_matched_files.append(rel)
117
- self._f.remove_file(path)
118
- self._log.debug(f"{"❌ DELETE FILE: %s", rel}")
119
96
 
120
-
121
-
122
- # Non-matching paths: collect and delete
123
- self._log.debug(f"❌ DELETE: Path does not match keep patterns: {rel}")
97
+ if spec.match_file(rel):
98
+ keep.append(rel)
99
+ continue
124
100
 
125
101
  if path.is_dir():
126
- directories_skipped.append(path)
127
- self._log.debug(f"⏭️ SKIPPING DELETE: Path is a directory: {path}")
102
+ if self._dir_has_kept_ancestor(rel, spec):
103
+ self._log.debug("⏭️ SKIP DIR (kept ancestor): %s", rel)
104
+ else:
105
+ self._log.debug("❌ DELETE DIR: %s", rel)
106
+ delete_dirs.append(rel)
107
+ else:
108
+ self._log.debug("❌ DELETE FILE: %s", rel)
109
+ delete_files.append(rel)
110
+
111
+ # -- perform deletions -------------------------------------------------- #
112
+ for f in delete_files:
113
+ self._f.remove_file(root / f)
128
114
 
129
- # Print results cleanly for debugging/logging purposes
130
- self._log.info("\nMATCHED PATHS:")
131
- self._log.info("=" * 80)
132
- for match in matches:
133
- self._log.info(f"✅ {match}")
115
+ # delete directories bottom-up to avoid “directory not empty” errors
116
+ for d in sorted(delete_dirs, key=lambda p: p.count("/"), reverse=True):
117
+ (root / d).rmdir()
134
118
 
135
- self._log.info("\nNOT MATCHED PATHS:")
136
- self._log.info("=" * 80)
137
- for non_match in non_matched_files:
138
- self._log.info(f" {non_match}")
119
+ # -- summary ------------------------------------------------------------ #
120
+ self._log.info("✅ kept : %d", len(keep))
121
+ self._log.info("🗂️ dirs : %d deleted", len(delete_dirs))
122
+ self._log.info("📄 files : %d deleted", len(delete_files))
139
123
 
140
124
  @staticmethod
141
- def _is_dir_protected(relative_path: str, spec: PathSpec) -> bool:
125
+ def _dir_has_kept_ancestor(rel: str, spec: PathSpec) -> bool:
142
126
  """
143
- Walks from `path` up to `root`, and returns True if any ancestor
144
- is matched by the spec.
127
+ Return True if *rel* **or any of its ancestors** is matched by *spec*.
145
128
  """
146
- if spec.match_file(relative_path):
147
- return True
148
- return False
129
+ parts = rel.split("/")
130
+ return any(spec.match_file("/".join(parts[: i + 1])) for i in range(len(parts)))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haraka
3
- Version: 0.2.30
3
+ Version: 0.2.31
4
4
  Summary: Reusable post-generation helper for Cookiecutter micro-service templates
5
5
  Author-email: Will Burks <will@example.com>
6
6
  License: MIT
@@ -17,7 +17,7 @@ haraka/post_gen/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
17
17
  haraka/post_gen/service/command.py,sha256=yvEzW9rMSXWeQ_2DXuQNtGH6sRuZnK6viMud-amFQXw,2348
18
18
  haraka/post_gen/service/fileOps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  haraka/post_gen/service/fileOps/files.py,sha256=Jm_0bhvVnNqSPGKQ2RnMpx8JLV74M-IXMmwly9fpmVw,3020
20
- haraka/post_gen/service/fileOps/purge.py,sha256=ZvmpmC38SMhppBGRck_z8qlie4ncULlFnQJ5zOoJkdc,5639
20
+ haraka/post_gen/service/fileOps/purge.py,sha256=fU-sQ0ThjW9op0e0gfEgmrqodyt50aSw_Xy-qJP1Kjs,4970
21
21
  haraka/post_gen/service/gitOps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  haraka/post_gen/service/gitOps/gitops.py,sha256=clWny1m9qB4yr8asba8JwqBjewlMVsJUmIOCLtAL8RI,4052
23
23
  haraka/utils/__init__.py,sha256=3Cp4u0dyAGcmqes-tIr95KFsNsJx5Ji5Yzkto9546Hs,168
@@ -29,7 +29,7 @@ haraka/utils/manifests/go-grpc-gateway-buf.yml,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
29
29
  haraka/utils/manifests/go-grpc-protoc.yml,sha256=OaQlfW_S_OguhW_UcpBVdqdEtUMlg-SrT4bqLhQrY7Y,936
30
30
  haraka/utils/manifests/java-springboot.yml,sha256=DTZoVrIDNVpq2AuuXjL2jAvPggeKWVuKJEKwFb90cz4,989
31
31
  haraka/utils/manifests/python-fastapi.yml,sha256=nhO6S9j_r-S10nM8nuw7PtR247-ePhBXHvaXg74CjWw,922
32
- haraka-0.2.30.dist-info/METADATA,sha256=hvMTjKi3D_CKzU8Qb27r4xN9_nUHn5OsWx9HAeMTSSw,579
33
- haraka-0.2.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
- haraka-0.2.30.dist-info/top_level.txt,sha256=1khpwypLKWoklVd_CgFiwAfcctVSXRoRPc3BI9lyIXo,7
35
- haraka-0.2.30.dist-info/RECORD,,
32
+ haraka-0.2.31.dist-info/METADATA,sha256=zqfs-3D99QSYiPBh9Qea6NkfMxf8VNPSB_o9UJDAB3Q,579
33
+ haraka-0.2.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
+ haraka-0.2.31.dist-info/top_level.txt,sha256=1khpwypLKWoklVd_CgFiwAfcctVSXRoRPc3BI9lyIXo,7
35
+ haraka-0.2.31.dist-info/RECORD,,