Skip to content

feat(postcodes/PM): add Saint Pierre and Miquelon postcode (#1039)#1426

Merged
dr5hn merged 2 commits into
masterfrom
feat/postcodes-saint-pierre-miquelon
Apr 27, 2026
Merged

feat(postcodes/PM): add Saint Pierre and Miquelon postcode (#1039)#1426
dr5hn merged 2 commits into
masterfrom
feat/postcodes-saint-pierre-miquelon

Conversation

@dr5hn
Copy link
Copy Markdown
Owner

@dr5hn dr5hn commented Apr 27, 2026

Adds Saint Pierre and Miquelon's single postcode 97500.

The country's postal_code_regex is ^(97500)$ — only one valid code, shared between the two communes (Saint-Pierre and Miquelon-Langlade). Country-only (no state subdivisions in this dataset).

Refs: #1039

Adds the single Saint Pierre and Miquelon postcode 97500. Country-only —
the country's regex (^(97500)$) only permits this single code, shared
between the two communes (Saint-Pierre and Miquelon-Langlade).

Refs: #1039

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 27, 2026 06:58
@dosubot dosubot Bot added size:XS This PR changes 0-9 lines, ignoring generated files. enhancement New feature or request labels Apr 27, 2026
@github-actions
Copy link
Copy Markdown
Contributor

CSC Validation Report

PR Format

  • ✅ Description provided
  • ❌ Data source linked
  • ✅ Issue linked (recommended for data changes)
  • ✅ Justification / context provided

Labels applied: data:postcodes

Schema Validation (1 records)

✅ All records passed validation

Cross-Reference Validation

✅ 1 reference(s) verified


All checks passed | Status: Ready for review

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new postcode contribution file for Saint Pierre and Miquelon (PM) to support the newly introduced postcodes dataset, using the country’s single valid postcode 97500.

Changes:

  • Added contributions/postcodes/PM.json with one country-level postcode record (97500).
  • Included basic metadata for the postcode record (country_id, country_code, type, source, locality_name).

Comment thread contributions/postcodes/PM.json Outdated
"code": "97500",
"country_id": 187,
"country_code": "PM",
"locality_name": "Saint-Pierre and Miquelon",
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

locality_name uses "Saint-Pierre and Miquelon", which doesn’t match the canonical country name in contributions/countries/countries.json ("Saint Pierre and Miquelon", id 187) and mixes punctuation styles. For a country-only postcode, consider aligning locality_name to the country’s name value (or omit locality_name entirely if you want it to be implicitly country-level).

Suggested change
"locality_name": "Saint-Pierre and Miquelon",
"locality_name": "Saint Pierre and Miquelon",

Copilot uses AI. Check for mistakes.
Per Copilot review: country name in countries.json is 'Saint Pierre and Miquelon'
(no hyphen), so locality_name should match — was 'Saint-Pierre and Miquelon'.
@dr5hn dr5hn merged commit 2a6090b into master Apr 27, 2026
1 check passed
@dr5hn dr5hn deleted the feat/postcodes-saint-pierre-miquelon branch April 27, 2026 07:47
dr5hn added a commit that referenced this pull request Apr 27, 2026
…#1039) (#1435)

Adds the importer + first run for metropolitan France. Uses La Poste's
official base-officielle-des-codes-postaux dataset from data.gouv.fr
(Licence Ouverte v2.0 / etalab-2.0).

1. bin/scripts/sync/import_laposte_postcodes.py — pipeline reading the
   ISO-8859-1 / semicolon-delimited CSV. Filters to metropolitan France
   (skips 971-988 overseas + 980 Monaco). Picks one canonical commune
   per postcode (first alphabetical). Resolves state via postcode-prefix
   to département iso2 (75=Paris, 13=Bouches-du-Rhône, etc.) with
   Corsica's special split (200xx-201xx -> 2A, 202xx+ -> 2B) and a
   75 -> 75C override (states.json suffixes Paris's iso2).

2. contributions/postcodes/FR.json — 6,051 codes covering all 96
   metropolitan départements + Corsica with 100% state_id resolution.

Out of scope (deferred)
- Overseas territories (GP/MQ/GF/RE/YT/PM/WF/PF/NC/BL/MF) already have
  curated postcode files from earlier PRs (#1402, #1417-#1426). La
  Poste's CSV does include their rows (475 skipped); folding the full
  La Poste data into those territory files is a follow-up scope decision.
- Cedex codes — La Poste publishes a separate "Cedex" file with ~10k
  business-routing codes that don't correspond to geographic places.
  Those belong in a separate pipeline if added.

Validation (zero errors across 6,051 records)
- All codes match countries.postal_code_regex (^(\\d{5})\$)
- All FKs resolve, all state_codes agree with state.iso2
- No auto-managed fields present

Locality names use Libellé d'acheminement (the form La Poste actually
prints on mail) rather than raw INSEE commune names — cleaner casing
and accents (e.g. "Sainte-Foy-lès-Lyon" rather than "STE FOY LES LYON").
Note: the source CSV is ALL CAPS for Libellé too; if mixed-case is
preferred, a follow-up Title Case pass is straightforward.

License & attribution
- Source: La Poste / data.gouv.fr (Licence Ouverte v2.0, etalab-2.0)
- Each row: source: "laposte"

Refs: #1039

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

data:postcodes enhancement New feature or request ready-for-review size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants