#!/usr/bin/env python3 """Pašvaldību reģistra lasītājs. python3 tools/reader.py # visas pašvaldības, tabula python3 tools/reader.py 0038001 # viena pašvaldība pēc ATVK koda (arī iepriekšējā koda) python3 tools/reader.py --json | --csv # cits izvades formāts python3 tools/reader.py --remote # lasīt no ProcessGit (main zars), nevis no lokālās kopijas python3 tools/reader.py --no-validate # nepārbaudīt pret shēmu Pēc noklusējuma datne tiek pārbaudīta pret shēmu schemas/pasvaldibu-registrs-0.1.xsd. Ar --remote datne un shēma tiek lejupielādētas no https://processgit.org/Valsts-Pirmkods/Pasvaldibu-registrs. Vajadzīga bibliotēka lxml. """ import csv import io import json import os import sys import urllib.request from lxml import etree ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) RAW = "https://processgit.org/Valsts-Pirmkods/Pasvaldibu-registrs/raw/branch/main/" DATA = "data/pasvaldibas-atvk.xml" SCHEMA = "schemas/pasvaldibu-registrs-0.1.xsd" NS = {"p": "urn:pppa:vpk:pasvaldibas:0.1"} FIELDS = ["atvk", "nosaukums", "tips", "iepriekšējie_kodi"] def load(rel, remote): if remote: req = urllib.request.Request(RAW + rel, headers={"User-Agent": "pasvaldibu-registrs-reader/0.1"}) return etree.parse(io.BytesIO(urllib.request.urlopen(req, timeout=60).read())) return etree.parse(os.path.join(ROOT, rel)) def read(doc): rows = [{"atvk": m.get("atvk"), "nosaukums": m.findtext("p:Name", namespaces=NS), "tips": m.get("kind"), "iepriekšējie_kodi": " ".join(x.text for x in m.findall("p:FormerCode", NS))} for m in doc.getroot().findall("p:Municipality", NS)] src = doc.getroot().find("p:Metadata/p:Source", NS) meta = {"avots": src.findtext("p:Act", namespaces=NS), "speka_no": src.get("inForce"), "datu_versija": doc.getroot().find("p:Metadata/p:DataVersion", NS).get("number")} return rows, meta def main(argv): flags = {a for a in argv if a.startswith("--")} keys = [a for a in argv if not a.startswith("--")] remote = "--remote" in flags doc = load(DATA, remote) if "--no-validate" not in flags: xsd = etree.XMLSchema(load(SCHEMA, remote)) if not xsd.validate(doc): for e in list(xsd.error_log)[:10]: print(f"KĻŪDA {e.line}: {e.message}", file=sys.stderr) sys.exit(1) rows, meta = read(doc) if keys: rows = [r for r in rows if r["atvk"] in keys or set(r["iepriekšējie_kodi"].split()) & set(keys)] if not rows: print("nav atrasts:", ", ".join(keys), file=sys.stderr) sys.exit(2) if "--json" in flags: print(json.dumps({**meta, "pasvaldibas": rows}, ensure_ascii=False, indent=2)) elif "--csv" in flags: w = csv.DictWriter(sys.stdout, fieldnames=FIELDS) w.writeheader() w.writerows(rows) else: for r in rows: prev = f" (iepriekš {r['iepriekšējie_kodi']})" if r["iepriekšējie_kodi"] else "" print(f"{r['atvk']} {r['tips']:13} {r['nosaukums']}{prev}") print(f"spēkā no {meta['speka_no']}, datu versija {meta['datu_versija']}: {len(rows)} pašvaldības", file=sys.stderr) if __name__ == "__main__": main(sys.argv[1:])