maketool 0.8.14__tar.gz → 0.8.15__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maketool
3
- Version: 0.8.14
3
+ Version: 0.8.15
4
4
  Summary: Python Automation tool for building PySide6 UI and PyInstaller EXE.
5
5
  Author-email: Alan Lilly <panofish@gmail.com>
6
6
  Requires-Python: >=3.7
@@ -7,17 +7,15 @@ Usage:
7
7
 
8
8
  Reports:
9
9
  1) UNUSED files: filename/path tokens not found in scanned text sources
10
- - Printed as plain relative paths, grouped by extension (no headers, no blank lines)
11
10
  2) MISSING imports: imports used by entry (and local-resolved siblings) but not installed
12
- - Printed as plain module names (no headers). Prints nothing if none missing.
13
11
  """
14
12
 
15
13
  from __future__ import annotations
16
14
 
17
15
  import ast
18
16
  import sys
19
- from dataclasses import dataclass
20
17
  from pathlib import Path
18
+ from dataclasses import dataclass
21
19
  from typing import Dict, Iterable, List, Optional, Set
22
20
 
23
21
  try:
@@ -25,7 +23,6 @@ try:
25
23
  except Exception:
26
24
  packages_distributions = None # type: ignore
27
25
 
28
-
29
26
  # ----------------------------
30
27
  # Refscan settings
31
28
  # ----------------------------
@@ -83,7 +80,6 @@ def safe_read_text(p: Path) -> Optional[str]:
83
80
  except Exception:
84
81
  return None
85
82
 
86
-
87
83
  def norm(s: str) -> str:
88
84
  return s.replace("\\", "/").lower()
89
85
 
@@ -97,10 +93,10 @@ def build_candidates(root: Path, files: list[Path]) -> list[Candidate]:
97
93
  stem = p.stem.lower()
98
94
 
99
95
  tokens = {
100
- base, # rat.ico
101
- stem, # common
102
- rel_norm, # icons/rat.ico
103
- rel_norm.replace("/", "\\"), # icons\rat.ico
96
+ base, # rat.ico
97
+ stem, # common
98
+ rel_norm, # icons/rat.ico
99
+ rel_norm.replace("/", "\\"), # icons\rat.ico
104
100
  }
105
101
  out.append(Candidate(p, rel, tuple(t for t in tokens if t)))
106
102
  return out
@@ -113,17 +109,36 @@ def is_text_source(p: Path) -> bool:
113
109
  return ext in DEFAULT_SCAN_EXTS
114
110
 
115
111
 
116
- def print_unused_grouped_by_ext(unused_rels: list[str]) -> None:
117
- # Sort by: extension (lower), then full relative path (lower)
118
- def key(rel: str):
119
- return (Path(rel).suffix.lower(), rel.lower())
112
+ def print_group(title: str, rows: list[tuple[str, list[str]]]) -> None:
113
+ print(title)
114
+ print("-" * len(title))
115
+ for rel, refs in rows:
116
+ is_py = rel.lower().endswith(".py")
117
+ name = f"[PY] {rel}" if is_py else rel
118
+
119
+ if refs:
120
+ preview = ", ".join(refs[:3]) + (" ..." if len(refs) > 3 else "")
121
+ print(f"{name} <-- {preview}")
122
+ else:
123
+ print(name)
124
+ print()
120
125
 
121
- for rel in sorted(unused_rels, key=key):
122
- print(rel)
126
+
127
+ def print_group(title: str, rows: list[tuple[str, list[str]]]) -> None:
128
+ print(title)
129
+ print("-" * len(title))
130
+ for rel, refs in rows:
131
+ # no markers; print plain filename/path
132
+ if refs:
133
+ preview = ", ".join(refs[:3]) + (" ..." if len(refs) > 3 else "")
134
+ print(f"{rel} <-- {preview}")
135
+ else:
136
+ print(rel)
137
+ print()
123
138
 
124
139
 
125
140
  # ----------------------------
126
- # Missing-import report
141
+ # Missing-import report (merged from report.py)
127
142
  # ----------------------------
128
143
 
129
144
  def stdlib_names() -> Set[str]:
@@ -207,6 +222,7 @@ def _index_local_modules_under(root: Path) -> Set[str]:
207
222
  def index_local_modules(project_root: Path) -> Set[str]:
208
223
  roots: List[Path] = [project_root]
209
224
 
225
+ # common extra roots (optional)
210
226
  for name in ["src", "lib", "app", "python", "package", "packages"]:
211
227
  p = project_root / name
212
228
  if p.exists() and p.is_dir():
@@ -262,10 +278,21 @@ def compute_missing_used_imports(
262
278
  missing.add(name)
263
279
  return missing
264
280
 
281
+ def print_unused_grouped_by_ext(unused_rels: list[str]) -> None:
282
+ # Sort by: extension (lower), then full path (lower)
283
+ def key(rel: str):
284
+ ext = Path(rel).suffix.lower()
285
+ return (ext, rel.lower())
286
+
287
+ for rel in sorted(unused_rels, key=key):
288
+ print(rel)
265
289
 
266
290
  def run_missing_imports_report(entry: Path, project_root: Path) -> None:
267
- # Print nothing if we cannot compute or if there are none missing
291
+ print("MISSING (used but not installed):")
292
+ print("------------------------------")
293
+
268
294
  if packages_distributions is None:
295
+ print("(skipped: Python 3.8+ required for importlib.metadata.packages_distributions())\n")
269
296
  return
270
297
 
271
298
  std = stdlib_names()
@@ -281,8 +308,11 @@ def run_missing_imports_report(entry: Path, project_root: Path) -> None:
281
308
  project_root=project_root,
282
309
  )
283
310
 
311
+ if not missing: return
312
+
284
313
  for m in sorted(missing):
285
314
  print(m)
315
+ print()
286
316
 
287
317
 
288
318
  # ----------------------------
@@ -323,12 +353,21 @@ def main() -> int:
323
353
  if any(tok in hay for tok in c.tokens):
324
354
  references[c.rel].append(src_rel)
325
355
 
326
- unused_rels = [c.rel for c in candidates if not references[c.rel]]
327
- print_unused_grouped_by_ext(unused_rels)
356
+ unused_rows: list[tuple[str, List[str]]] = []
357
+ for c in candidates:
358
+ refs = references[c.rel]
359
+ if not refs:
360
+ unused_rows.append((c.rel, refs))
361
+
362
+ print_group("UNUSED files (no filename/path tokens found)", unused_rows)
328
363
 
329
- # Second report: missing imports (only if entry is .py)
364
+ # Second report: missing imports (based on entry .py)
330
365
  if entry.suffix.lower() == ".py":
331
366
  run_missing_imports_report(entry=entry, project_root=root)
367
+ else:
368
+ print("MISSING (used but not installed):")
369
+ print("------------------------------")
370
+ print("(skipped: entry is not a .py file)\n")
332
371
 
333
372
  return 0
334
373
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maketool
3
- Version: 0.8.14
3
+ Version: 0.8.15
4
4
  Summary: Python Automation tool for building PySide6 UI and PyInstaller EXE.
5
5
  Author-email: Alan Lilly <panofish@gmail.com>
6
6
  Requires-Python: >=3.7
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "maketool"
3
- version = "0.8.14"
3
+ version = "0.8.15"
4
4
  description = "Python Automation tool for building PySide6 UI and PyInstaller EXE."
5
5
  authors = [{ name = "Alan Lilly", email = "panofish@gmail.com" }]
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes