Rebrand Pinscope to Periscope across product and codebase.

Rename the core package to periscopex, update UI/docs/Docker/deploy defaults to periscope.michelebigi.it, and keep legacy version/storage key aliases so existing projects keep working.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-13 20:02:04 +02:00
co-authored by Cursor
parent 556306bf4d
commit 8d2b85600f
177 changed files with 869 additions and 766 deletions
+11 -11
View File
@@ -11,7 +11,7 @@ from pydantic import BaseModel
MAX_UPLOAD_BYTES = 30 * 1024 * 1024 # 30 MB
from backend.config import settings
from backend.pinscopex.utils import safe_mpn
from backend.periscopex.utils import safe_mpn
from backend.routers.deps import get_storage, get_user_id, resolve_or_404
from backend.services import projects as proj_svc
@@ -63,7 +63,7 @@ async def check_library(req: LibraryCheckRequest, request: Request):
passive_resolved: list[str] = []
if req.passive_mpns:
from backend.pinscopex.resolve_passives import resolve_mpn
from backend.periscopex.resolve_passives import resolve_mpn
passive_resolved = [
mpn for mpn in req.passive_mpns
@@ -256,7 +256,7 @@ async def get_netlist_subdesigns(project_id: str, request: Request):
``selected`` list (None = "include everything") so the wizard can render
the picker pre-populated.
"""
from backend.pinscopex.parsers_edif import list_edif_subdesigns
from backend.periscopex.parsers_edif import list_edif_subdesigns
import tempfile, os
storage = get_storage(request)
@@ -360,7 +360,7 @@ async def upload_bom(
import os
import tempfile
from backend.pinscopex.parsers import parse_bom
from backend.periscopex.parsers import parse_bom
try:
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv")
@@ -420,7 +420,7 @@ async def upload_bom(
# simple → datasheet upload). Mirrors the bucket logic in
# services/pipeline.py:_stage_bom_parse so the field is correct after
# either path runs.
from backend.pinscopex.taxonomy import SIMPLE_TYPES, type_for_ref
from backend.periscopex.taxonomy import SIMPLE_TYPES, type_for_ref
ic_mpns: list[str] = []
passive_mpns: list[str] = []
@@ -511,9 +511,9 @@ async def upload_netlist(
raise HTTPException(404, "Project not found")
user_id = result[0] # owner_user_id for storage paths
from backend.pinscopex.netlist_bundle import materialize_netlist_upload
from backend.pinscopex.parsers import parse_netlist_any, validate_netlist
from backend.pinscopex.parsers_edif import list_edif_subdesigns
from backend.periscopex.netlist_bundle import materialize_netlist_upload
from backend.periscopex.parsers import parse_netlist_any, validate_netlist
from backend.periscopex.parsers_edif import list_edif_subdesigns
import tempfile
blobs: list[tuple[str, bytes]] = []
@@ -616,7 +616,7 @@ async def upload_pcb(project_id: str, file: UploadFile, request: Request):
if len(data) > MAX_UPLOAD_BYTES:
raise HTTPException(413, f"File too large (max {MAX_UPLOAD_BYTES // 1024 // 1024} MB)")
import tempfile, os
from backend.pinscopex.parsers_kicad_pcb import parse_kicad_pcb
from backend.periscopex.parsers_kicad_pcb import parse_kicad_pcb
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".kicad_pcb")
try:
@@ -647,7 +647,7 @@ def _build_designator_pins(
(natural sort on refs and on pin numbers) so the wizard's dropdowns
look identical regardless of netlist format.
"""
from backend.pinscopex.utils import natural_sort_key
from backend.periscopex.utils import natural_sort_key
by_ref: dict[str, dict[str, str]] = {ref: {} for ref in parts}
for net_name, pins in nets.items():
@@ -1079,7 +1079,7 @@ async def lcsc_resolve_passive(
# Catalog miss (ferrite, odd text): LLM path, charged if the logger has tokens.
# Download taxonomy to a temp dir so auto_resolve_specs can read/write it.
# Mirrors the PipelineWorkspace pattern: pinscopex operates on local paths.
# Mirrors the PipelineWorkspace pattern: periscopex operates on local paths.
api_logger = ApiLogger()
with tempfile.TemporaryDirectory() as tmpdir:
tax_dir = Path(tmpdir) / "taxonomy"