97 lines
3.4 KiB
Python
97 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
extract_for_dev.py
|
|
──────────────────
|
|
Extracts all embedded source files from Avaya_5952_setup.py
|
|
into individual files for development with Claude Code or any editor.
|
|
|
|
Run once to bootstrap the repo:
|
|
python extract_for_dev.py
|
|
|
|
After editing source files, re-embed for distribution:
|
|
python embed_for_dist.py (see that script)
|
|
|
|
The single-file Avaya_5952_setup.py is for end-user distribution.
|
|
These extracted files are the development source of truth.
|
|
"""
|
|
|
|
import re, sys
|
|
from pathlib import Path
|
|
|
|
HERE = Path(__file__).parent
|
|
SETUP = HERE / "Avaya_5952_setup.py"
|
|
|
|
if not SETUP.exists():
|
|
print(f"Error: {SETUP} not found")
|
|
sys.exit(1)
|
|
|
|
src = SETUP.read_text()
|
|
|
|
# ── Extract repr()-encoded string constants ─────────────────────────────────
|
|
|
|
def extract_repr(src, name):
|
|
idx = src.find(f'\n{name} = ')
|
|
if idx == -1:
|
|
return None
|
|
start = idx + len(f'\n{name} = ')
|
|
qc = src[start]
|
|
end = start + 1
|
|
while end < len(src):
|
|
if src[end] == qc and src[end-1] != '\\':
|
|
end += 1; break
|
|
end += 1
|
|
try:
|
|
return eval(src[start:end])
|
|
except Exception as e:
|
|
print(f" Warning: could not extract {name}: {e}")
|
|
return None
|
|
|
|
# ── Extract triple-quoted string constants ───────────────────────────────────
|
|
|
|
def extract_triple(src, name):
|
|
pattern = rf'{name}\s*=\s*"""(.*?)"""'
|
|
m = re.search(pattern, src, re.DOTALL)
|
|
return m.group(1) if m else None
|
|
|
|
# ── Files to extract ─────────────────────────────────────────────────────────
|
|
|
|
print("Extracting source files from Avaya_5952_setup.py...\n")
|
|
|
|
extractions = [
|
|
# (extract_fn, constant_name, output_filename, note)
|
|
(extract_repr, 'BACKEND_SRC', 'switch_backend.py', "FastAPI backend"),
|
|
(extract_repr, 'JSX_SRC', 'ers5952-manager.jsx', "React frontend"),
|
|
(extract_repr, 'README_SRC', 'README.md', "Documentation"),
|
|
(extract_triple, 'DOCKERFILE', 'Dockerfile', "Docker image"),
|
|
(extract_triple, 'COMPOSE_YML', 'docker-compose.yml', "Docker Compose"),
|
|
(extract_triple, 'CADDYFILE_TEMPLATE','Caddyfile.template', "Caddy config template"),
|
|
]
|
|
|
|
written = []
|
|
for fn, const, fname, note in extractions:
|
|
content = fn(src, const)
|
|
if content:
|
|
out = HERE / fname
|
|
if out.exists():
|
|
overwrite = input(f" {fname} already exists — overwrite? [y/N] ").strip().lower()
|
|
if overwrite != 'y':
|
|
print(f" skipped {fname}")
|
|
continue
|
|
out.write_text(content)
|
|
written.append(fname)
|
|
print(f" ✓ {fname:<35} {note} ({len(content):,} chars)")
|
|
else:
|
|
print(f" ✗ {fname:<35} not found in setup script")
|
|
|
|
print(f"\n{len(written)} files extracted.")
|
|
print("""
|
|
Next steps:
|
|
1. git init && git add . && git commit -m "initial: extracted from single-file setup"
|
|
2. Push to GitHub (check no credentials in source first)
|
|
3. Open with Claude Code: claude
|
|
4. Say: "Read HANDOFF.md — continue building the switch manager"
|
|
|
|
To re-embed source files back into Avaya_5952_setup.py for distribution:
|
|
python embed_for_dist.py
|
|
""")
|