From 7c7dacf16adc1025845fd81aaba905f41fe22474 Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Fri, 2 Jan 2026 22:40:11 +0100 Subject: [PATCH 1/6] =?UTF-8?q?F=C3=B6rbered=20f=C3=B6r=20offentlig=20publ?= =?UTF-8?q?icering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ta bort lokal Claude-konfiguration - Uppdatera .gitignore för .claude/ - Ta bort TODO-kommentarer från sfs_processor.py - Lägg till CONTRIBUTING.md med bidragsinstruktioner - Lägg till DEVELOPMENT.md med utvecklardokumentation - Förbättra README.md med status, community-info och licens 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .gitignore | 3 + CONTRIBUTING.md | 172 ++++++++++++++++++++ DEVELOPMENT.md | 411 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 80 ++++++++- sfs_processor.py | 6 - 5 files changed, 664 insertions(+), 8 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 DEVELOPMENT.md diff --git a/.gitignore b/.gitignore index 70fe53ca..40614b67 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ ___pycache__ *.pyc .DS_Store +# Ignore Claude configuration +.claude/ + # Ignore output files logs/ output/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..9a46d611 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,172 @@ +# Bidra till SFS-Processor + +Tack för ditt intresse att bidra till SFS-Processor! Det här dokumentet beskriver hur du kan hjälpa till med utvecklingen. + +## Kom igång + +### Förutsättningar + +- Python 3.11 eller senare +- Git +- Grundläggande kunskaper om Python och Markdown + +### Installera utvecklingsmiljö + +1. Forka repositoryt på GitHub +2. Klona din fork lokalt: + ```bash + git clone https://github.com/se-lex/sfs-processor.git + cd sfs-processor + ``` + +3. Skapa en virtuell miljö (rekommenderat): + ```bash + python -m venv venv + source venv/bin/activate # På Windows: venv\Scripts\activate + ``` + +4. Installera dependencies: + ```bash + pip install -r requirements.txt + ``` + +## Utvecklingsmiljö + +### Installation av dependencies + +Projektet har minimala beroenden som specificeras i `requirements.txt`: +```bash +pip install -r requirements.txt +``` + +### Köra tester + +Kör alla tester med: +```bash +python -m pytest test/ -v +``` + +Enskilda testfiler kan köras direkt: +```bash +python test/test_title_temporal.py +``` + +### Kodstil + +Projektet följer PEP 8-standarden för Python-kod. Några specifika riktlinjer: + +- Använd 4 mellanslag för indentering (inga tabs) +- Maximal radlängd: 100 tecken (flexibelt för långa strängar) +- Använd beskrivande variabelnamn +- Svenska termer är OK för domänspecifika begrepp (t.ex. "beteckning", "författning") +- Kommentera komplex logik +- Docstrings för alla publika funktioner + +## Bidra med kod + +### Arbetsflöde + +1. Skapa en feature branch från `main`: + ```bash + git checkout -b feature/min-funktion + ``` + + Använd beskrivande branch-namn: + - `feature/` för nya funktioner + - `fix/` för buggfixar + +2. Gör dina ändringar och commit: + ```bash + git add . + git commit -m "Beskrivande commit-meddelande" + ``` + + Skriv tydliga commit-meddelanden som förklarar *vad* och *varför*. + +3. Pusha till din fork: + ```bash + git push origin feature/min-funktion + ``` + +4. Öppna en Pull Request på GitHub + +### Pull Request-process + +När du öppnar en Pull Request: + +- **Beskriv dina ändringar**: Förklara vad din PR gör och varför ändringen behövs +- **Referera till issues**: Om din PR löser ett issue, länka till det (t.ex. "Fixes #123") +- **Inkludera tester**: Lägg till tester för nya funktioner eller buggfixar +- **Se till att tester passerar**: Alla befintliga tester måste fortfarande fungera +- **Uppdatera dokumentation**: Om du ändrar funktionalitet, uppdatera README eller andra relevanta dokument + +Vi kommer att granska din PR och ge feedback. Var beredd på att göra ändringar baserat på code review. + +## Rapportera buggar + +Hittat en bugg? Hjälp oss att fixa den! + +1. **Kontrollera befintliga issues**: Kolla om någon redan rapporterat samma problem +2. **Öppna ett nytt issue** med följande information: + - **Tydlig titel**: Sammanfatta problemet kortfattat + - **Beskrivning**: Beskriv vad som händer och vad du förväntade dig + - **Reproducerbarhet**: Steg för att återskapa problemet + - **Miljö**: Python-version, operativsystem + - **Exempel**: Minimal kod eller kommando som visar problemet + - **Felmeddelanden**: Inkludera fullständiga stack traces om tillämpligt + +### Exempel på buggrapport + +```markdown +## Titel: Fel vid parsing av dokument med tomma kapitel + +**Beskrivning:** +När sfs_processor.py försöker processa ett SFS-dokument som innehåller tomma kapitel +kraschar programmet med ValueError. + +**Steg för att reproducera:** +1. Ladda ner SFS 2023:123 +2. Kör: `python sfs_processor.py sfs_json/2023/sfs-2023-123.json --output md` + +**Förväntat resultat:** +Dokumentet processas korrekt och tomma kapitel ignoreras. + +**Faktiskt resultat:** +``` +ValueError: Cannot process empty chapter +``` + +**Miljö:** +- Python 3.11.4 +- macOS Sonoma 14.2 +- sfs-processor version 1.0.0 +``` + +## Kodstandard + +### Allmänna riktlinjer + +- **PEP 8**: Följ Python Enhancement Proposal 8 för kodstil +- **Variabelnamn**: Använd beskrivande namn (`document_data` istället för `dd`) +- **Svenska termer**: OK att använda för juridiska/domänspecifika termer (t.ex. `beteckning`, `författning`, `paragraf`) +- **Kommentarer**: Kommentera komplex logik, inte uppenbar kod +- **Docstrings**: Alla publika funktioner ska ha docstrings som beskriver: + - Vad funktionen gör + - Parametrar och deras typer + - Returvärde + - Eventuella exceptions som kastas + +## Licens + +Genom att bidra till SFS-Processor accepterar du att ditt bidrag licensieras under **Business Source License 1.1** (samma licens som resten av projektet). + +Se [LICENSE](LICENSE)-filen för fullständiga villkor. Observera att projektet övergår till MIT-licens 2029-01-01. + +## Frågor? + +Om du har frågor som inte täcks här: + +- Öppna ett issue med etiketten "question" +- Kontakta projektmaintainer via GitHub + +Tack för ditt bidrag! 🙏 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000..0f5ea3ca --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,411 @@ +# Utvecklardokumentation + +Det här dokumentet ger en djupare översikt över projektets arkitektur, kodstruktur och utvecklingsworkflow. + +## Projektöversikt + +`sfs-processor` är ett verktyg för att konvertera svensk lagstiftningsdata (Svensk författningssamling) från JSON-format till olika output-format inklusive Markdown, HTML och Git-repositories. + +### Huvudfunktioner + +- Hämta SFS-dokument från Riksdagens öppna data +- Konvertera JSON till välformaterad Markdown +- Generera HTML med temporal hantering av ändringar +- Exportera till Git-repositories med historik +- Hantera temporala aspekter av lagstiftning (giltighetstider, ändringar) + +## Arkitektur + +### Dataflöde + +``` +Riksdagen API → JSON → Parser → Formatters → Exporters → Output + ↓ + Temporal Processing +``` + +1. **Nedladdning**: Hämta rådata från Riksdagens API +2. **Parsing**: Validera och strukturera JSON-data +3. **Formatering**: Konvertera till Markdown/HTML +4. **Temporal processing**: Hantera tidsbaserade aspekter +5. **Export**: Skriv till fil, Git eller cloud storage + +## Katalogstruktur + +``` +sfs-processor/ +├── sfs_processor.py # Huvudskript och entry point +├── downloaders/ # Hämta data från externa källor +│ ├── download_sfs_docs.py # Ladda ner SFS-dokument +│ ├── fetch_new_sfs_docs.py # Hämta nya dokument (scheduled) +│ └── download_from_gov_api.py # Direkt API-integration +├── formatters/ # Konvertera data till olika format +│ ├── format_sfs_text.py # JSON → Markdown-konvertering +│ ├── apply_links.py # Lägg till interna/externa länkar +│ ├── format_html.py # Markdown → HTML +│ └── format_htmldiff.py # Generera HTML-diff views +├── exporters/ # Export till olika destinationer +│ ├── git/ # Git repository export +│ │ ├── export_to_git.py +│ │ ├── git_utils.py +│ │ └── batch_export_to_git.py +│ └── html/ # HTML export och upload +│ ├── export_to_html.py +│ ├── upload_to_r2.py +│ └── eli_utils.py +├── temporal/ # Temporal hantering +│ ├── title_temporal.py # Temporal titel-processing +│ ├── integrated_title_temporal.py +│ └── apply_temporal.py # Tillämpa temporala regler +├── data/ # Konfiguration och patterns +│ ├── document_patterns/ # Regex-patterns för parsing +│ └── test_docs/ # Test-dokument +├── test/ # Tester +│ ├── test_title_temporal.py +│ ├── test_integrated_title_temporal.py +│ ├── test_predocs.py +│ └── test_linking.py +├── scripts/ # Hjälpskript +└── .github/workflows/ # CI/CD workflows +``` + +## Moduler och deras ansvar + +### `sfs_processor.py` (Huvudmodul) + +**Ansvar**: Orkestrering av hela processen från input till output. + +**Viktiga funktioner**: + +- `process_sfs_document()`: Huvudfunktion som processar ett dokument +- `determine_output_path()`: Bestämmer output-sökväg baserat på beteckning +- `should_exclude_file()`: Filtrering baserat på konfiguration + +**Workflow**: + +1. Läs JSON-fil +2. Validera dokumentdata +3. Konvertera till Markdown +4. Applicera temporal processing +5. Exportera till valda format + +### `downloaders/` (Nedladdning) + +**`download_sfs_docs.py`**: +- Ladda ner specifika SFS-dokument från Riksdagens API +- Hantera paginering och rate limiting +- Cacha nedladdad data + +**`fetch_new_sfs_docs.py`**: +- Schemalagd hämtning av nya dokument +- Används i GitHub Actions workflow +- Detekterar nya/ändrade dokument + +### `formatters/` (Formatering) + +**`format_sfs_text.py`**: +- Kärnan i Markdown-konverteringen +- Funktioner: + - `convert_json_to_markdown()`: Huvudkonvertering + - `format_stycke()`: Formatera paragrafstycken + - `format_tabell()`: Hantera tabeller + - `normalize_heading_levels()`: Normalisera rubriknivåer + +**`apply_links.py`**: +- Lägg till interna länkar mellan lagar +- Externa länkar till EU-direktiv via EUR-Lex +- ELI (European Legislation Identifier) URI:er + +**`format_html.py`**: +- Konvertera Markdown till HTML med Python Markdown-biblioteket +- Lägg till CSS och navigation +- Hantera YAML frontmatter + +### `exporters/` (Export) + +**`git/`**: +- Exportera till Git-repository med commits per författning +- Hantera branches för olika tidpunkter +- GitHub integration via Personal Access Token + +**`html/`**: +- Generera HTML-filer +- Ladda upp till Cloudflare R2 (S3-kompatibel storage) +- ELI URI-hantering för permalänkar + +### `temporal/` (Temporal Processing) + +**Temporal hantering** hanterar att lagtext förändras över tid: + +**`title_temporal.py`**: +- Extrahera temporal information från titlar +- Patterns för "upphör att gälla", "träder i kraft" +- Regex-baserad parsing av datum och referenser + +**`apply_temporal.py`**: +- Applicera temporala regler på dokument +- Filtrera innehåll baserat på target_date +- Hantera `` attribut (start-/slutdatum för textstycken) + +**Exempel på temporal attribut**: +```markdown +2024-01-01 +Denna text gäller från 2024-01-01 +2024-12-31 +``` + +## Utvecklingsmiljö + +### Setup + +1. Klona repositoryt +2. Skapa virtuell miljö: `python -m venv venv` +3. Aktivera: `source venv/bin/activate` +4. Installera dependencies: `pip install -r requirements.txt` + +### Miljövariabler + +Skapa en `.env`-fil för lokal utveckling: + +```bash +# GitHub (för Git-export) +GIT_GITHUB_PAT=ghp_your_personal_access_token + +# Cloudflare R2 (för HTML-export) +CLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key +CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_key +CLOUDFLARE_R2_BUCKET_NAME=your_bucket +CLOUDFLARE_R2_ACCOUNT_ID=your_account_id + +# ELI konfiguration +ELI_HOST=selex.se +INTERNAL_LINKS_BASE_URL=https://selex.se/eli +``` + +**OBS**: `.env`-filen är listad i `.gitignore` och ska ALDRIG committas. + +### Köra lokalt + +**Processa ett dokument**: +```bash +python sfs_processor.py data/test_docs/sfs-2023-123.json --output md +``` + +**Ladda ner testdokument**: +```bash +python downloaders/download_sfs_docs.py --year 2023 --number 123 +``` + +**Kör alla tester**: +```bash +python -m pytest test/ -v +``` + +**Kör specifikt test**: +```bash +python test/test_title_temporal.py +``` + +## Arbetsflöde för utveckling + +### Lägga till ny funktionalitet + +1. **Planera**: Diskutera i ett GitHub Issue först +2. **Branching**: Skapa feature branch +3. **Implementera**: Skriv kod + tester +4. **Testa**: Kör alla tester lokalt +5. **Dokumentera**: Uppdatera README/DEVELOPMENT.md +6. **PR**: Öppna Pull Request med beskrivning + +### Lägga till nytt output-format + +Om du vill lägga till support för ett nytt format (t.ex. PDF): + +1. **Skapa formatter**: `formatters/format_pdf.py` +2. **Implementera konvertering**: Funktion som tar Markdown → PDF +3. **Lägg till i main**: Uppdatera `sfs_processor.py` för att hantera `--output pdf` +4. **Tester**: Lägg till test i `test/test_pdf.py` +5. **Dokumentation**: Uppdatera README.md + +### Lägga till ny datakälla + +För att integrera en ny källa (t.ex. annan myndighet): + +1. **Skapa downloader**: `downloaders/download_.py` +2. **Mappa till JSON**: Konvertera till samma JSON-schema som Riksdagen +3. **Testa**: Verifiera att befintliga formatters fungerar +4. **Dokumentera**: Uppdatera dokumentation + +## Debugging + +### Verbose mode + +Använd `--verbose` för detaljerad loggning: +```bash +python sfs_processor.py input.json --output md --verbose +``` + +### Temporala problem + +Om temporal processing ger oväntat resultat: + +1. Kontrollera YAML frontmatter i output +2. Kör utan temporal: `--preserve-selex-tags` +3. Testa med specifikt datum: `--target-date 2024-01-01` + +### Git export-problem + +Om Git-export inte fungerar: + +1. Verifiera `GIT_GITHUB_PAT` är satt +2. Kontrollera behörigheter på target repository +3. Kör med `--verbose` för detaljerad logg +4. Testa GitHub-anslutning: `git ls-remote ` + +## Testing + +### Testfilosofi + +- **Unit tests**: Testa enskilda funktioner isolerat +- **Integration tests**: Testa fullständigt dataflöde +- **Fixture data**: Använd riktiga (men små) SFS-dokument + +### Skriva tester + +Exempel på test: + +```python +def test_parse_beteckning(): + """Test parsing av SFS-beteckning.""" + from formatters.format_sfs_text import parse_beteckning + + result = parse_beteckning("SFS 2023:123") + assert result["year"] == 2023 + assert result["number"] == 123 +``` + +### Test coverage + +Kör tester med coverage: +```bash +pip install pytest-cov +python -m pytest test/ --cov=. --cov-report=html +``` + +## CI/CD Workflows + +### `.github/workflows/` + +**`testdocs-workflow.yml`**: +- Triggas på varje push/PR +- Processar test-dokument +- Verifierar att processing fungerar + +**`fetch-sfs-workflow.yml`**: +- Schemalagd (nightly) +- Hämtar nya SFS-dokument +- Skapar branch med ändringar +- Triggar HTML-export + +**`html-export-workflow.yml`**: +- Genererar HTML från Markdown +- Laddar upp till Cloudflare R2 +- Kräver R2-credentials i GitHub Secrets + +**`upcoming-changes-workflow.yml`**: +- Processar kommande ändringar +- Temporal förhandsvisning + +## Kodkonventioner + +### Namngivning + +- **Filer**: snake_case (t.ex. `format_sfs_text.py`) +- **Funktioner**: snake_case (t.ex. `convert_json_to_markdown()`) +- **Klasser**: PascalCase (t.ex. `SFSDocument`) +- **Konstanter**: UPPER_CASE (t.ex. `DEFAULT_DATE`) + +### Imports + +Gruppera imports: +```python +# Standard library +import os +import json +from typing import Dict, List + +# Third-party +import requests +import yaml + +# Local imports +from formatters.format_sfs_text import convert_json_to_markdown +``` + +### Error handling + +```python +try: + result = risky_operation() +except ValueError as e: + print(f"Fel vid operation: {e}") + return None +except Exception as e: + print(f"Oväntat fel: {e}") + raise +``` + +## Vanliga problem och lösningar + +### Problem: Git push misslyckas + +**Orsak**: Token saknar rätt behörigheter + +**Lösning**: Verifiera att `GIT_GITHUB_PAT` har `repo`-scope + +### Problem: Temporal processing tar bort allt innehåll + +**Orsak**: `target_date` är före dokumentets ikraftträdande + +**Lösning**: Kontrollera `target_date` och jämför med `ikraft_datum` i YAML frontmatter + +## Säkerhet + +### Secrets management + +- Använd **miljövariabler** för alla credentials +- **Aldrig** committa `.env`-filer +- GitHub Secrets för CI/CD + +### API rate limiting + +- Riksdagen API: Respektera rate limits +- Implementera exponential backoff vid 429-svar +- Cacha data lokalt när möjligt + +## Resurser + +### Externa APIer + +- [Riksdagens öppna data](https://data.riksdagen.se/) +- [Rättsbaser API](https://beta.rkrattsbaser.gov.se/) +- [EUR-Lex](https://eur-lex.europa.eu/) + +### Dokumentation + +- [Markdown spec](https://commonmark.org/) +- [Python Markdown](https://python-markdown.github.io/) +- [ELI standard](https://eur-lex.europa.eu/eli-register/about.html) + +## Support + +Vid frågor eller problem: + +1. Kolla [README.md](README.md) för grundläggande användning +2. Läs [CONTRIBUTING.md](CONTRIBUTING.md) för bidragsriktlinjer +3. Sök i [GitHub Issues](https://github.com/yourusername/sfs-processor/issues) +4. Öppna ett nytt issue om problemet kvarstår + +--- + +**Lycka till med utvecklingen!** 🚀 diff --git a/README.md b/README.md index ab593896..f3bc909a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Detta repository innehåller Python-script för att konvertera SFS-författninga ## Installation -1. Se till att du har Python 3.6+ installerat +1. Se till att du har Python 3.11 eller senare installerat 2. Installera nödvändiga beroenden: ```bash @@ -173,7 +173,83 @@ python sfs_processor.py [--input INPUT] [--output OUTPUT] [--formats FORMATS] [- - `--no-year-folder`: Skapa inte årbaserade undermappar för dokument - `--verbose`: Visa detaljerad information om bearbetningen +## Tester + +Projektet använder pytest för testning med omfattande testsvit som täcker funktionalitet och edge cases. + +### Installation av testberoenden + +```bash +pip install pytest pytest-cov pytest-mock requests-mock +``` + +### Köra alla tester + +```bash +pytest +``` + +### Köra tester med täckningsrapport + +```bash +pytest --cov=. --cov-report=html +``` + +### Köra specifika testkategorier + +```bash +# Endast unit-tester (snabba, ingen I/O) +pytest -m unit + +# Endast integrationstester +pytest -m integration + +# Endast API-tester (mockade API-anrop) +pytest -m api + +# Hoppa över långsamma tester +pytest -m "not slow" +``` + +### Köra enskilda testfiler + +```bash +pytest test/test_linking.py -v +pytest test/test_title_temporal.py -v +pytest test/test_predocs.py -v +``` + +### CI/CD + +Testerna körs automatiskt vid varje push och pull request via GitHub Actions. Täckningsrapporter genereras och arkiveras som artifacts. + +## Bidra + +Vi välkomnar bidrag från communityn! 🙌 + +- Läs [CONTRIBUTING.md](CONTRIBUTING.md) för riktlinjer om hur du bidrar +- Se [DEVELOPMENT.md](DEVELOPMENT.md) för utvecklardokumentation och arkitekturöversikt +- Öppna ett [GitHub Issue](https://github.com/se-lex/sfs-processor/issues) för att rapportera buggar eller föreslå nya funktioner + +## Community och support + +- **Rapportera buggar**: Öppna ett issue på GitHub med detaljerad beskrivning +- **Föreslå funktioner**: Diskutera nya idéer via GitHub Issues +- **Frågor**: Använd GitHub Issues med etiketten "question" + +Se [CONTRIBUTING.md](CONTRIBUTING.md) för mer information om hur du kan hjälpa till. + ## Licens -Detta projekt är licensierat under Business Source License 1.1 (BSL 1.1) - se [LICENSE](LICENSE) filen för detaljer. Efter 2 år övergår licensen för aktuell version automatiskt till MIT. +Projektet är licensierat under **Business Source License 1.1 (BSL 1.1)**. + +### Sammanfattning + +- ✅ **Fritt att använda** för icke-produktionssyfte +- ✅ **Fritt att modifiera och distribuera** +- ✅ **Övergår automatiskt till MIT-licens** 2029-01-01 +- ⚠️ **Produktionsanvändning kräver kommersiell licens** (kontakta martin@marca.se) +- 🤖 **AI-träningsanvändning kräver explicit tillstånd** + +Se [LICENSE](LICENSE)-filen för fullständiga villkor. diff --git a/sfs_processor.py b/sfs_processor.py index ecaf6506..c1b9181b 100644 --- a/sfs_processor.py +++ b/sfs_processor.py @@ -221,12 +221,6 @@ def _create_markdown_document(data: Dict[str, Any], output_path: Path, git_mode: if not beteckning: raise ValueError("Beteckning saknas i dokumentdata") - # Process amendments - # TODO: markdown_content = process_markdown_amendments(markdown_content, data, git_branch, verbose, output_file) - - # Convert table-like structures to proper Markdown tables - # TODO: markdown_content = convert_tables_in_markdown(markdown_content, verbose) - # Apply temporal processing to handle selex attributes (only if not in git mode and not preserving selex tags) if not git_mode and not preserve_selex_tags and target_date: markdown_content = apply_temporal(markdown_content, target_date, verbose=verbose) From 2026e41b879453988e19e0c710374ec2581d347b Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Sun, 4 Jan 2026 10:28:11 +0100 Subject: [PATCH 2/6] Update CONTRIBUTING.md and DEVELOPMENT.md for clarity and consistency --- CONTRIBUTING.md | 88 +++++---------------------- DEVELOPMENT.md | 159 +++++++++++++++++++++++++++++++----------------- 2 files changed, 117 insertions(+), 130 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9a46d611..c60a41e4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,66 +1,15 @@ -# Bidra till SFS-Processor +# Bidra till sfs-processor -Tack för ditt intresse att bidra till SFS-Processor! Det här dokumentet beskriver hur du kan hjälpa till med utvecklingen. +Tack för ditt intresse att bidra till sfs-processor! Det här dokumentet beskriver hur du kan hjälpa till. -## Kom igång +## Snabbstart -### Förutsättningar +1. **Forka och klona** repositoryt +2. **Installera**: `pip install -r requirements.txt` +3. **Testa**: `python -m pytest test/ -v` +4. **Läs**: [DEVELOPMENT.md](DEVELOPMENT.md) för teknisk dokumentation -- Python 3.11 eller senare -- Git -- Grundläggande kunskaper om Python och Markdown - -### Installera utvecklingsmiljö - -1. Forka repositoryt på GitHub -2. Klona din fork lokalt: - ```bash - git clone https://github.com/se-lex/sfs-processor.git - cd sfs-processor - ``` - -3. Skapa en virtuell miljö (rekommenderat): - ```bash - python -m venv venv - source venv/bin/activate # På Windows: venv\Scripts\activate - ``` - -4. Installera dependencies: - ```bash - pip install -r requirements.txt - ``` - -## Utvecklingsmiljö - -### Installation av dependencies - -Projektet har minimala beroenden som specificeras i `requirements.txt`: -```bash -pip install -r requirements.txt -``` - -### Köra tester - -Kör alla tester med: -```bash -python -m pytest test/ -v -``` - -Enskilda testfiler kan köras direkt: -```bash -python test/test_title_temporal.py -``` - -### Kodstil - -Projektet följer PEP 8-standarden för Python-kod. Några specifika riktlinjer: - -- Använd 4 mellanslag för indentering (inga tabs) -- Maximal radlängd: 100 tecken (flexibelt för långa strängar) -- Använd beskrivande variabelnamn -- Svenska termer är OK för domänspecifika begrepp (t.ex. "beteckning", "författning") -- Kommentera komplex logik -- Docstrings för alla publika funktioner +För detaljerad setup och utvecklingsmiljö, se [DEVELOPMENT.md](DEVELOPMENT.md). ## Bidra med kod @@ -144,23 +93,14 @@ ValueError: Cannot process empty chapter ## Kodstandard -### Allmänna riktlinjer +Projektet följer **PEP 8-standarden**. Huvudriktlinjer: -- **PEP 8**: Följ Python Enhancement Proposal 8 för kodstil -- **Variabelnamn**: Använd beskrivande namn (`document_data` istället för `dd`) -- **Svenska termer**: OK att använda för juridiska/domänspecifika termer (t.ex. `beteckning`, `författning`, `paragraf`) -- **Kommentarer**: Kommentera komplex logik, inte uppenbar kod -- **Docstrings**: Alla publika funktioner ska ha docstrings som beskriver: - - Vad funktionen gör - - Parametrar och deras typer - - Returvärde - - Eventuella exceptions som kastas - -## Licens - -Genom att bidra till SFS-Processor accepterar du att ditt bidrag licensieras under **Business Source License 1.1** (samma licens som resten av projektet). +- 4 mellanslag för indentering +- Max 100 tecken per rad +- Beskrivande variabelnamn +- Docstrings för alla publika funktioner -Se [LICENSE](LICENSE)-filen för fullständiga villkor. Observera att projektet övergår till MIT-licens 2029-01-01. +För fullständiga kodkonventioner, se [DEVELOPMENT.md](DEVELOPMENT.md#kodkonventioner). ## Frågor? diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 0f5ea3ca..c3e1c070 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -4,7 +4,7 @@ Det här dokumentet ger en djupare översikt över projektets arkitektur, kodstr ## Projektöversikt -`sfs-processor` är ett verktyg för att konvertera svensk lagstiftningsdata (Svensk författningssamling) från JSON-format till olika output-format inklusive Markdown, HTML och Git-repositories. +`sfs-processor` är ett verktyg för att konvertera svensk lagstiftningsdata (Svensk författningssamling) från JSON-format till olika output-format inklusive Markdown-filer, HTML-filer och Git-commits. ### Huvudfunktioner @@ -14,6 +14,86 @@ Det här dokumentet ger en djupare översikt över projektets arkitektur, kodstr - Exportera till Git-repositories med historik - Hantera temporala aspekter av lagstiftning (giltighetstider, ändringar) +## Kom igång + +### Installation för bidragsgivare + +Om du vill bidra till projektet: + +1. **Forka repositoryt** på GitHub +2. **Klona din fork** lokalt: + ```bash + git clone https://github.com/ditt-användarnamn/sfs-processor.git + cd sfs-processor + ``` +3. **Skapa virtuell miljö** (rekommenderat): + ```bash + python -m venv venv + source venv/bin/activate # På Windows: venv\Scripts\activate + ``` +4. **Installera dependencies**: + ```bash + pip install -r requirements.txt + ``` + +För bidragsprocess, se [CONTRIBUTING.md](CONTRIBUTING.md). + +### Köra tester + +**Alla tester**: +```bash +python -m pytest test/ -v +``` + +**Enskilda testfiler**: +```bash +python test/test_title_temporal.py +``` + +**Med coverage**: +```bash +pip install pytest-cov +python -m pytest test/ --cov=. --cov-report=html +``` + +### Köra lokalt + +**Processa ett dokument**: +```bash +python sfs_processor.py data/test_docs/sfs-2023-123.json --output md +``` + +**Ladda ner testdokument**: +```bash +python downloaders/download_sfs_docs.py --year 2023 --number 123 +``` + +**Verbose mode** för detaljerad loggning: +```bash +python sfs_processor.py input.json --output md --verbose +``` + +### Miljövariabler + +Skapa en `.env`-fil för lokal utveckling: + +```bash +# GitHub (för Git-export) +GIT_GITHUB_PAT=ghp_your_personal_access_token + +# Cloudflare R2 (för HTML-export) +CLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key +CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_key +CLOUDFLARE_R2_BUCKET_NAME=your_bucket +CLOUDFLARE_R2_ACCOUNT_ID=your_account_id + +# HTML (ELI) konfiguration +ELI_HOST=selex.se +INTERNAL_LINKS_BASE_URL=https://selex.se/eli +``` + +**OBS**: `.env`-filen är listad i `.gitignore` och ska ALDRIG committas. + ## Arkitektur ### Dataflöde @@ -145,65 +225,17 @@ sfs-processor/ **`apply_temporal.py`**: - Applicera temporala regler på dokument - Filtrera innehåll baserat på target_date -- Hantera `` attribut (start-/slutdatum för textstycken) +- Hantera `selex:...` attribut för temporal information **Exempel på temporal attribut**: ```markdown -2024-01-01 -Denna text gäller från 2024-01-01 -2024-12-31 -``` - -## Utvecklingsmiljö - -### Setup - -1. Klona repositoryt -2. Skapa virtuell miljö: `python -m venv venv` -3. Aktivera: `source venv/bin/activate` -4. Installera dependencies: `pip install -r requirements.txt` - -### Miljövariabler - -Skapa en `.env`-fil för lokal utveckling: - -```bash -# GitHub (för Git-export) -GIT_GITHUB_PAT=ghp_your_personal_access_token - -# Cloudflare R2 (för HTML-export) -CLOUDFLARE_R2_ACCESS_KEY_ID=your_access_key -CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_secret_key -CLOUDFLARE_R2_BUCKET_NAME=your_bucket -CLOUDFLARE_R2_ACCOUNT_ID=your_account_id - -# ELI konfiguration -ELI_HOST=selex.se -INTERNAL_LINKS_BASE_URL=https://selex.se/eli -``` - -**OBS**: `.env`-filen är listad i `.gitignore` och ska ALDRIG committas. +
+Denna text gäller från 2024-01-01 till 2024-12-31 +
-### Köra lokalt - -**Processa ett dokument**: -```bash -python sfs_processor.py data/test_docs/sfs-2023-123.json --output md -``` - -**Ladda ner testdokument**: -```bash -python downloaders/download_sfs_docs.py --year 2023 --number 123 -``` - -**Kör alla tester**: -```bash -python -m pytest test/ -v -``` - -**Kör specifikt test**: -```bash -python test/test_title_temporal.py +
+Denna text är upphävd +
``` ## Arbetsflöde för utveckling @@ -318,6 +350,21 @@ python -m pytest test/ --cov=. --cov-report=html ## Kodkonventioner +### Allmänna riktlinjer + +Projektet följer **PEP 8-standarden** för Python-kod: + +- **Indentering**: 4 mellanslag (inga tabs) +- **Radlängd**: Max 100 tecken (flexibelt för långa strängar) +- **Variabelnamn**: Använd beskrivande namn (`document_data` istället för `dd`) +- **Svenska termer**: OK för domänspecifika begrepp (t.ex. `beteckning`, `författning`, `paragraf`) +- **Kommentarer**: Kommentera komplex logik, inte uppenbar kod +- **Docstrings**: Alla publika funktioner måste ha docstrings som beskriver: + - Vad funktionen gör + - Parametrar och deras typer + - Returvärde + - Eventuella exceptions som kastas + ### Namngivning - **Filer**: snake_case (t.ex. `format_sfs_text.py`) From 22bc78bae6cf3f4514231cffea6ada16e7aa5735 Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Sun, 4 Jan 2026 12:55:49 +0100 Subject: [PATCH 3/6] Address PR feedback: clarify data sources and add contact information MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update data source references from Riksdagen to Regeringskansliet - Change GitHub URL to se-lex organization - Add maintainer contact information with email and LinkedIn - Fix plural to singular for Git-repository - Clean up external API links formatting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CONTRIBUTING.md | 2 +- DEVELOPMENT.md | 31 ++++++++++++++----------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c60a41e4..0dd9664a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -107,6 +107,6 @@ För fullständiga kodkonventioner, se [DEVELOPMENT.md](DEVELOPMENT.md#kodkonven Om du har frågor som inte täcks här: - Öppna ett issue med etiketten "question" -- Kontakta projektmaintainer via GitHub +- Kontakta Martin Rimskog via [e-post](mailto:martin@marca.se) [LinkedIn](https://www.linkedin.com/in/martinrimskog/) Tack för ditt bidrag! 🙏 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index c3e1c070..d65b6352 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -8,10 +8,10 @@ Det här dokumentet ger en djupare översikt över projektets arkitektur, kodstr ### Huvudfunktioner -- Hämta SFS-dokument från Riksdagens öppna data +- Hämta SFS-dokument från RK (Regeringskansliet) - Konvertera JSON till välformaterad Markdown - Generera HTML med temporal hantering av ändringar -- Exportera till Git-repositories med historik +- Exportera till Git-repository med historik - Hantera temporala aspekter av lagstiftning (giltighetstider, ändringar) ## Kom igång @@ -23,7 +23,7 @@ Om du vill bidra till projektet: 1. **Forka repositoryt** på GitHub 2. **Klona din fork** lokalt: ```bash - git clone https://github.com/ditt-användarnamn/sfs-processor.git + git clone https://github.com/se-lex/sfs-processor.git cd sfs-processor ``` 3. **Skapa virtuell miljö** (rekommenderat): @@ -99,12 +99,12 @@ INTERNAL_LINKS_BASE_URL=https://selex.se/eli ### Dataflöde ``` -Riksdagen API → JSON → Parser → Formatters → Exporters → Output - ↓ - Temporal Processing +RK API → JSON → Parser → Formatters → Exporters → Output + ↓ + Temporal Processing ``` -1. **Nedladdning**: Hämta rådata från Riksdagens API +1. **Nedladdning**: Hämta rådata från Regeringskansliet 2. **Parsing**: Validera och strukturera JSON-data 3. **Formatering**: Konvertera till Markdown/HTML 4. **Temporal processing**: Hantera tidsbaserade aspekter @@ -172,7 +172,7 @@ sfs-processor/ ### `downloaders/` (Nedladdning) **`download_sfs_docs.py`**: -- Ladda ner specifika SFS-dokument från Riksdagens API +- Ladda ner specifika SFS-dokument från Regeringskansliets rättsdatabas - Hantera paginering och rate limiting - Cacha nedladdad data @@ -426,7 +426,7 @@ except Exception as e: ### API rate limiting -- Riksdagen API: Respektera rate limits +- Regeringskansliet rättsdatabas & Riksdagens API: Respektera rate limits - Implementera exponential backoff vid 429-svar - Cacha data lokalt när möjligt @@ -434,14 +434,14 @@ except Exception as e: ### Externa APIer -- [Riksdagens öppna data](https://data.riksdagen.se/) -- [Rättsbaser API](https://beta.rkrattsbaser.gov.se/) -- [EUR-Lex](https://eur-lex.europa.eu/) +- [Riksdagens öppna data](https://data.riksdagen.se) +- [Regieringskansliets rättsdatabas](https://beta.rkrattsbaser.gov.se) +- [EUR-Lex](https://eur-lex.europa.eu) ### Dokumentation -- [Markdown spec](https://commonmark.org/) -- [Python Markdown](https://python-markdown.github.io/) +- [Markdown spec](https://commonmark.org) +- [Python Markdown](https://python-markdown.github.io) - [ELI standard](https://eur-lex.europa.eu/eli-register/about.html) ## Support @@ -453,6 +453,3 @@ Vid frågor eller problem: 3. Sök i [GitHub Issues](https://github.com/yourusername/sfs-processor/issues) 4. Öppna ett nytt issue om problemet kvarstår ---- - -**Lycka till med utvecklingen!** 🚀 From 22f74dc4e2f3ac3d8c1f875f03c7bd134dfcb0da Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Sun, 4 Jan 2026 13:00:13 +0100 Subject: [PATCH 4/6] Address remaining PR feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove license summary from README to avoid confusion - Update JSON schema reference to RK - Fix GitHub Issues URL to use se-lex organization 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- DEVELOPMENT.md | 4 ++-- README.md | 12 +----------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index d65b6352..a9c5b028 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -264,7 +264,7 @@ Om du vill lägga till support för ett nytt format (t.ex. PDF): För att integrera en ny källa (t.ex. annan myndighet): 1. **Skapa downloader**: `downloaders/download_.py` -2. **Mappa till JSON**: Konvertera till samma JSON-schema som Riksdagen +2. **Mappa till JSON**: Konvertera till samma JSON-schema som RK 3. **Testa**: Verifiera att befintliga formatters fungerar 4. **Dokumentera**: Uppdatera dokumentation @@ -450,6 +450,6 @@ Vid frågor eller problem: 1. Kolla [README.md](README.md) för grundläggande användning 2. Läs [CONTRIBUTING.md](CONTRIBUTING.md) för bidragsriktlinjer -3. Sök i [GitHub Issues](https://github.com/yourusername/sfs-processor/issues) +3. Sök i [GitHub Issues](https://github.com/se-lex/sfs-processor/issues) 4. Öppna ett nytt issue om problemet kvarstår diff --git a/README.md b/README.md index f3bc909a..f8d5669d 100644 --- a/README.md +++ b/README.md @@ -241,15 +241,5 @@ Se [CONTRIBUTING.md](CONTRIBUTING.md) för mer information om hur du kan hjälpa ## Licens -Projektet är licensierat under **Business Source License 1.1 (BSL 1.1)**. - -### Sammanfattning - -- ✅ **Fritt att använda** för icke-produktionssyfte -- ✅ **Fritt att modifiera och distribuera** -- ✅ **Övergår automatiskt till MIT-licens** 2029-01-01 -- ⚠️ **Produktionsanvändning kräver kommersiell licens** (kontakta martin@marca.se) -- 🤖 **AI-träningsanvändning kräver explicit tillstånd** - -Se [LICENSE](LICENSE)-filen för fullständiga villkor. +Projektet är licensierat under **Business Source License 1.1 (BSL 1.1)**. Se [LICENSE](LICENSE)-filen för fullständiga villkor. From 5a296cbfde774d3c3f5ce32db36b1ebc8908b1ba Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Sun, 4 Jan 2026 16:55:10 +0100 Subject: [PATCH 5/6] Update README.md for clarity on project details and output formats --- README.md | 172 +++++++++++++++++++----------------------------------- 1 file changed, 59 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index f8d5669d..279c79fa 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # Svensk författningssamling (SFS) till Markdown-filer +> [!NOTE] +> **Detta är en del av [SE-Lex](https://github.com/se-lex)**, läs mer om [projektet här](https://github.com/se-lex). +> +> SFS-författningar exporteras till [https://github.com/se-lex/sfs](https://github.com/se-lex/sfs) och publiceras också som HTML på [https://selex.se](https://selex.se) med stöd för EU:s juridiska identifieringsstandard (ELI). + Detta repository innehåller Python-script för att konvertera SFS-författningar (Svensk författningssamling) från JSON-format till välformaterade Markdown-filer och andra format. ## Installation @@ -16,7 +21,31 @@ pip install -r requirements.txt Konvertera JSON-filer med författningar till Markdown: ```bash -python sfs_processor.py --input sfs_json --output SFS --formats md +python sfs_processor.py --input sfs_json --output SFS --formats md-markers +``` + +## Output-format + +Verktyget kan generera författningar i flera olika format, beroende på användningsområde: + +### Markdown-format + +- **`md-markers`** (standard): Markdown med semantiska `
`-taggar och selex-attribut för juridisk status och temporal hantering +- **`md`**: Rena Markdown-filer med normaliserade rubriknivåer, lämpliga för visning och läsning + +### Git-format + +- **`git`**: Exporterar författningar som Git-commits med historiska datum, vilket skapar en versionshistorik av lagstiftningen + +### HTML-format + +- **`html`**: Genererar HTML-filer i ELI-struktur (`/eli/sfs/{år}/{nummer}/index.html`) för webbpublicering +- **`htmldiff`**: Som HTML men inkluderar även separata versioner för varje ändringsförfattning + +Exempel på att kombinera flera format: + +```bash +python sfs_processor.py --input sfs_json --output output --formats md,html,git ``` ## Hämta källdata @@ -44,32 +73,14 @@ Nedladdade filer sparas som standard i katalogen `sfs_docs`. Du kan ange annan k Konvertera alla JSON-filer i en katalog till Markdown: ```bash -python sfs_processor.py --input sfs_json --output SFS --formats md +python sfs_processor.py --input sfs_json --output SFS --formats md-markers ``` ### Struktur av genererade Markdown-filer Beroende på vilket format du väljer får du olika strukturer: -#### Format: `md` (standard) - -Rena Markdown-filer med normaliserade rubriknivåer: - -```markdown -# Lag (2024:123) om exempel - -## Inledande bestämmelser - -### 1 § - -Innehållet i paragrafen... - -### 2 § - -Mer innehåll... -``` - -#### Format: `md-markers` +#### Format: `md-markers` (standard) Markdown-filer med bevarad semantisk struktur genom `
`-taggar: @@ -88,6 +99,26 @@ Innehållet i paragrafen... Denna semantiska struktur bevarar dokumentets logiska uppbyggnad och möjliggör automatisk bearbetning, analys, och navigation av författningstexten. Section-taggarna kan även användas för CSS-styling och JavaScript-funktionalitet. +#### Format: `md` + +Rena Markdown-filer med normaliserade rubriknivåer, utan section-taggar: + +```markdown +# Lag (2024:123) om exempel + +## Inledande bestämmelser + +### 1 § + +Innehållet i paragrafen... + +### 2 § + +Mer innehåll... +``` + +Detta format är lämpligt för enkel visning och läsning, utan metadata eller temporal hantering. + ### Selex-attribut för juridisk status och datum Förutom CSS-klasser använder `
`-taggarna även `selex:`-attribut för att hantera juridisk status och datum. Dessa attribut möjliggör filtrering av innehåll baserat på ikraftträdande- och upphörandedatum: @@ -125,33 +156,11 @@ Dessa attribut används automatiskt av systemets datumfiltrering för att skapa Systemet hanterar temporal processing (tidsbaserad filtrering) olika beroende på vilket format som används: -- **`md` format**: Tillämpar temporal processing med dagens datum som målpunkt. Selex-taggar tas bort efter filtrering. -- **`md-markers` format**: Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behålls för senare bearbetning. -- **`git` format**: Hoppar över temporal processing i huvudbearbetningen. Temporal hantering sköts separat i git-arbetsflödet för att skapa historiska commits. -- **`html` format**: Tillämpar temporal processing med dagens datum innan HTML-generering. -- **`htmldiff` format**: Tillämpar temporal processing med dagens datum innan HTML-generering. - -### Konvertering till HTML med ELI-struktur - -```bash -python sfs_processor.py --input sfs_json --output output --formats html -``` - -Detta skapar HTML-filer i ELI-strukturen: `/eli/sfs/{artal}/{lopnummer}/index.html` - -### HTML med ändringsversioner - -För att inkludera separata versioner för varje ändringsförfattning: - -```bash -python sfs_processor.py --input sfs_json --output output --formats htmldiff -``` - -### Kombinera flera format - -```bash -python sfs_processor.py --input sfs_json --output output --formats md,html,htmldiff -``` +- **`md`**: Tillämpar temporal processing med dagens datum som målpunkt. Selex-taggar tas bort efter filtrering. +- **`md-markers`**: Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behålls för senare bearbetning. +- **`git`**: Hoppar över temporal processing i huvudbearbetningen. Temporal hantering sköts separat i git-arbetsflödet för att skapa historiska commits. +- **`html`**: Tillämpar temporal processing med dagens datum innan HTML-generering. +- **`htmldiff`**: Tillämpar temporal processing med dagens datum innan HTML-generering. ## Kommandoradsalternativ @@ -163,7 +172,7 @@ python sfs_processor.py [--input INPUT] [--output OUTPUT] [--formats FORMATS] [- - `--input`: Input-katalog med JSON-filer (default: "sfs_json") - `--output`: Output-katalog för konverterade filer (default: "SFS") -- `--formats`: Utdataformat att generera, kommaseparerat. Stödjer: md, md-markers, git, html, htmldiff (default: "md") +- `--formats`: Utdataformat att generera, kommaseparerat. Stödjer: md-markers, md, git, html, htmldiff (default: "md-markers") - `md`: Generera rena markdown-filer utan section-taggar - `md-markers`: Generera markdown-filer med section-taggar bevarade - `git`: Aktivera Git-commits med historiska datum @@ -173,73 +182,10 @@ python sfs_processor.py [--input INPUT] [--output OUTPUT] [--formats FORMATS] [- - `--no-year-folder`: Skapa inte årbaserade undermappar för dokument - `--verbose`: Visa detaljerad information om bearbetningen -## Tester - -Projektet använder pytest för testning med omfattande testsvit som täcker funktionalitet och edge cases. - -### Installation av testberoenden - -```bash -pip install pytest pytest-cov pytest-mock requests-mock -``` - -### Köra alla tester - -```bash -pytest -``` - -### Köra tester med täckningsrapport - -```bash -pytest --cov=. --cov-report=html -``` - -### Köra specifika testkategorier - -```bash -# Endast unit-tester (snabba, ingen I/O) -pytest -m unit - -# Endast integrationstester -pytest -m integration - -# Endast API-tester (mockade API-anrop) -pytest -m api - -# Hoppa över långsamma tester -pytest -m "not slow" -``` - -### Köra enskilda testfiler - -```bash -pytest test/test_linking.py -v -pytest test/test_title_temporal.py -v -pytest test/test_predocs.py -v -``` - -### CI/CD - -Testerna körs automatiskt vid varje push och pull request via GitHub Actions. Täckningsrapporter genereras och arkiveras som artifacts. - ## Bidra Vi välkomnar bidrag från communityn! 🙌 - Läs [CONTRIBUTING.md](CONTRIBUTING.md) för riktlinjer om hur du bidrar - Se [DEVELOPMENT.md](DEVELOPMENT.md) för utvecklardokumentation och arkitekturöversikt -- Öppna ett [GitHub Issue](https://github.com/se-lex/sfs-processor/issues) för att rapportera buggar eller föreslå nya funktioner - -## Community och support - -- **Rapportera buggar**: Öppna ett issue på GitHub med detaljerad beskrivning -- **Föreslå funktioner**: Diskutera nya idéer via GitHub Issues -- **Frågor**: Använd GitHub Issues med etiketten "question" - -Se [CONTRIBUTING.md](CONTRIBUTING.md) för mer information om hur du kan hjälpa till. - -## Licens - -Projektet är licensierat under **Business Source License 1.1 (BSL 1.1)**. Se [LICENSE](LICENSE)-filen för fullständiga villkor. - +- Kontakt: Martin Rimskog via [e-post](mailto:martin@marca.se) eller [LinkedIn](https://www.linkedin.com/in/martinrimskog/) From 431e1815d48872d2fe862cfb2d46ec007ff98d7e Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Sun, 4 Jan 2026 17:06:38 +0100 Subject: [PATCH 6/6] Update README.md and sfs_processor.py for clarity on output formats and defaults --- README.md | 21 ++++++++++++++------- sfs_processor.py | 6 +++--- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 279c79fa..93661b29 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# Svensk författningssamling (SFS) till Markdown-filer +# sfs-processor - Verktyg för konvertering av Svensk författningssamling + +Detta repository innehåller Python-script för att konvertera SFS-författningar (Svensk författningssamling) från JSON-format till Markdown med temporala taggar, HTML, Git och andra format. > [!NOTE] > **Detta är en del av [SE-Lex](https://github.com/se-lex)**, läs mer om [projektet här](https://github.com/se-lex). > > SFS-författningar exporteras till [https://github.com/se-lex/sfs](https://github.com/se-lex/sfs) och publiceras också som HTML på [https://selex.se](https://selex.se) med stöd för EU:s juridiska identifieringsstandard (ELI). -Detta repository innehåller Python-script för att konvertera SFS-författningar (Svensk författningssamling) från JSON-format till välformaterade Markdown-filer och andra format. - ## Installation 1. Se till att du har Python 3.11 eller senare installerat @@ -156,11 +156,18 @@ Dessa attribut används automatiskt av systemets datumfiltrering för att skapa Systemet hanterar temporal processing (tidsbaserad filtrering) olika beroende på vilket format som används: -- **`md`**: Tillämpar temporal processing med dagens datum som målpunkt. Selex-taggar tas bort efter filtrering. -- **`md-markers`**: Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behålls för senare bearbetning. +- **`md-markers`** (standard): Bevarar selex-taggar och hoppar över temporal processing. Detta gör att alla temporal attribut behålls för senare bearbetning. Rekommenderas för att bevara all juridisk metadata. + +- **`md`**: Tillämpar temporal processing med **dagens datum som målpunkt**. Detta är viktigt att förstå: + - Upphävda bestämmelser (med `selex:upphor_datum` före dagens datum) tas bort + - Bestämmelser som ännu inte trätt i kraft (med `selex:ikraft_datum` efter dagens datum) tas bort + - Selex-taggar tas bort efter filtrering + - Resultatet blir en "ren" Markdown-vy av hur lagen ser ut idag + - **Obs:** Eftersom temporal filtrering används automatiskt, kan innehåll försvinna om det är upphävt eller ej ikraftträtt + - **`git`**: Hoppar över temporal processing i huvudbearbetningen. Temporal hantering sköts separat i git-arbetsflödet för att skapa historiska commits. -- **`html`**: Tillämpar temporal processing med dagens datum innan HTML-generering. -- **`htmldiff`**: Tillämpar temporal processing med dagens datum innan HTML-generering. + +- **`html`** och **`htmldiff`**: Tillämpar temporal processing med dagens datum innan HTML-generering, liknande `md`-format. ## Kommandoradsalternativ diff --git a/sfs_processor.py b/sfs_processor.py index c1b9181b..26069304 100644 --- a/sfs_processor.py +++ b/sfs_processor.py @@ -125,7 +125,7 @@ def make_document(data: Dict[str, Any], output_dir: Path, output_modes: List[str Args: data: JSON data for the document output_dir: Directory where output files should be saved - output_modes: List of formats/modes to use (e.g., ["md", "git"]). If None, defaults to ["md"] + output_modes: List of formats/modes to use (e.g., ["md-markers", "git"]). If None, defaults to ["md-markers"] Note: "git" mode requires "md" mode to be included as it modifies markdown processing "md" generates clean markdown (section tags removed), "md-markers" preserves section tags "html" generates base document only, "htmldiff" includes amendment versions @@ -559,8 +559,8 @@ def main(): help='Do not create year-based subdirectories for documents') parser.add_argument('--verbose', action='store_true', help='Show detailed diff output for each amendment processing') - parser.add_argument('--formats', dest='output_modes', default='md', - help='Output formats to generate (comma-separated). Currently supported: md, md-markers, git, html, htmldiff. Default: md. Use "md-markers" to preserve section tags. Use "git" to enable Git commits with historical dates. HTML creates documents in ELI directory structure (/eli/sfs/{YEAR}/{lopnummer}). HTMLDIFF includes amendment versions with diff view.') + parser.add_argument('--formats', dest='output_modes', default='md-markers', + help='Output formats to generate (comma-separated). Currently supported: md-markers, md, git, html, htmldiff. Default: md-markers. Use "md-markers" to preserve section tags with temporal attributes (standard). Use "md" for clean markdown without section tags. Use "git" to enable Git commits with historical dates. HTML creates documents in ELI directory structure (/eli/sfs/{YEAR}/{lopnummer}). HTMLDIFF includes amendment versions with diff view.') parser.add_argument('--predocs-fetch', action='store_true', dest='predocs_fetch', help='Fetch detailed information about förarbeten from Riksdagen API. Parsing of förarbeten always happens. This will make processing slower.') parser.add_argument('--apply-links', action='store_true', default=True,