ledger: extract UN member states admission table (193 rows, 49 founding members)
This commit is contained in:
1 parent
da4646acfe
commit
095bd034ff
5 files changed
+1562
No files matched your search
@@ -0,0 +1,41 @@
|
||||
# UN Member States — Admission Table
|
||||
|
||||
**Topic:** United Nations member states and their date of admission
|
||||
**Lane:** Extract — data extraction and tables
|
||||
**Artifact:** `un_member_states.csv` (primary), `un_member_states.json` (machine-readable)
|
||||
|
||||
## Source
|
||||
|
||||
- Wikipedia — "List of member states of the United Nations"
|
||||
`https://en.wikipedia.org/wiki/List_of_member_states_of_the_United_Nations`
|
||||
- Extracted from the live page via `web_extract` (real fetch, no stale cache):
|
||||
`https://en.wikipedia.org/wiki/List_of_member_states_of_the_United_Nations`
|
||||
→ cached raw page: `/root/.hermes/profiles/ledger/cache/web/en.wikipedia.org-00a059c52c.md`
|
||||
- Parser: `/root/.hermes/wizard-outputs/ledger/extract_un_member_states.py`
|
||||
- Verification (exit-code verdict): `/root/.hermes/wizard-outputs/ledger/check_ledger.py`
|
||||
|
||||
## Schema
|
||||
|
||||
| Column | Meaning |
|
||||
|-------------------|------------------------------------------------|
|
||||
| `country` | UN member state (official name as listed) |
|
||||
| `date_of_admission` | Date of admission (e.g. `24 October 1945`) |
|
||||
| `year` | Calendar year of admission |
|
||||
| `is_founding_member` | `true` when the state was admitted in 1945 (the 51 original members of the UN) |
|
||||
|
||||
## Provenance & counts
|
||||
|
||||
- Member states: **193** (per the page's summary line: "193 United Nations member states")
|
||||
- Founding members (admitted 1945): **49** — the 51 original members of the UN, minus
|
||||
the 2 that were dissolved without a UN successor (Czechoslovakia, Yugoslavia; members
|
||||
ended 1992) plus the Republic of China's seat, which continues in the table as "China"
|
||||
(People's Republic of China, admitted 1945). 51 − 2 = 49 ✓.
|
||||
- Admission years range: **1945** (earliest) to **2011** (South Sudan, latest).
|
||||
|
||||
## Notes
|
||||
|
||||
- Notes column from the source table was intentionally dropped: it is prose with
|
||||
variable length and embedded markup; only the two stable columns
|
||||
(`country`, `date_of_admission`) are material to this table extract.
|
||||
- Founding-member flag derives purely from `year == 1945`, which is directly
|
||||
verifiable from the source table.
|
||||
@@ -0,0 +1,97 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Verify the UN member-states extraction artifact.
|
||||
|
||||
Exit code 0 = correct, 1 = any check failed.
|
||||
Pure assertions on the artifacts; no network, no external data.
|
||||
"""
|
||||
import csv
|
||||
import json
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
OUT = "/root/.hermes/wizard-outputs/ledger"
|
||||
csv_path = f"{OUT}/un_member_states.csv"
|
||||
json_path = f"{OUT}/un_member_states.json"
|
||||
|
||||
failures = []
|
||||
|
||||
|
||||
def check(name, cond, msg=None):
|
||||
if not cond:
|
||||
failures.append((name, msg or ""))
|
||||
|
||||
|
||||
def parse_date(s):
|
||||
return datetime.strptime(s.strip(), "%d %B %Y")
|
||||
|
||||
|
||||
# --- CSV -------------------------------------------------------------------
|
||||
with open(csv_path, encoding="utf-8", newline="") as fh:
|
||||
reader = csv.DictReader(fh)
|
||||
rows = list(reader)
|
||||
headers = reader.fieldnames
|
||||
|
||||
check("csv.exists", True)
|
||||
check("csv.headers", headers == ["country", "date_of_admission", "year", "is_founding_member"])
|
||||
check("csv.rowcount", len(rows) == 193, f"got {len(rows)} rows, expected 193")
|
||||
check("csv.no_empty_cells", all(
|
||||
r.get("country", "").strip() and r.get("date_of_admission", "").strip() for r in rows
|
||||
))
|
||||
|
||||
# rows are chronologically sorted (verified below); first is a 1945 admission,
|
||||
# last is the 2011 admission.
|
||||
if rows:
|
||||
first_date = parse_date(rows[0]["date_of_admission"])
|
||||
last_date = parse_date(rows[-1]["date_of_admission"])
|
||||
check("csv.first_year", first_date.year == 1945, rows[0]["date_of_admission"])
|
||||
check("csv.last_year", last_date.year == 2011, rows[-1]["date_of_admission"])
|
||||
|
||||
# chronological order + date/year/founding consistency
|
||||
prev = None
|
||||
for r in rows:
|
||||
d = parse_date(r["date_of_admission"])
|
||||
y = d.year
|
||||
check("csv.year.match." + r["country"], int(r["year"]) == y)
|
||||
expected_founding = "true" if y == 1945 else "false"
|
||||
check("csv.founding.match." + r["country"],
|
||||
r["is_founding_member"].strip().lower() == expected_founding)
|
||||
if prev is not None:
|
||||
check("csv.sorted." + r["country"], d >= prev)
|
||||
prev = d
|
||||
|
||||
# --- JSON ------------------------------------------------------------------
|
||||
with open(json_path, encoding="utf-8") as fh:
|
||||
jrows = json.load(fh)
|
||||
check("json.exists", True)
|
||||
check("json.rowcount", len(jrows) == 193)
|
||||
check("json.keys", all(list(r.keys()) == ["country", "date_of_admission", "year", "is_founding_member"] for r in jrows))
|
||||
|
||||
canonical = []
|
||||
for r in rows:
|
||||
d = parse_date(r["date_of_admission"])
|
||||
canonical.append({
|
||||
"country": r["country"],
|
||||
"date_of_admission": r["date_of_admission"],
|
||||
"year": d.year,
|
||||
"is_founding_member": r["is_founding_member"].strip().lower() == "true",
|
||||
})
|
||||
check("json.match_csv", jrows == canonical)
|
||||
|
||||
# --- Cross-check -----------------------------------------------------------
|
||||
check("csv.founding_count", sum(1 for r in rows if r["is_founding_member"].strip().lower() == "true") == 49,
|
||||
"expected 49 founding members (admitted 1945)")
|
||||
|
||||
# presence spot-checks
|
||||
by_country = {r["country"]: r for r in rows}
|
||||
check("csv.has_afghanistan", "Afghanistan" in by_country and by_country["Afghanistan"]["date_of_admission"] == "19 November 1946")
|
||||
check("csv.has_zimbabwe", "Zimbabwe" in by_country and by_country["Zimbabwe"]["date_of_admission"] == "25 August 1980")
|
||||
|
||||
print("member_states:", len(rows))
|
||||
print("founding_1945:", sum(1 for r in rows if r["is_founding_member"].strip().lower() == "true"))
|
||||
print("years:", min(int(r["year"]) for r in rows), "to", max(int(r["year"]) for r in rows))
|
||||
if failures:
|
||||
print("FAILED CHECKS:")
|
||||
for name, msg in failures:
|
||||
print(f" - {name}" + (f": {msg}" if msg else ""))
|
||||
sys.exit(1)
|
||||
print("ALL CHECKS PASSED")
|
||||
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Extract the UN member states table (Country | Date of admission) from the
|
||||
Wikipedia 'List of member states of the United Nations' page.
|
||||
|
||||
Source (real web_extract result, saved from en.wikipedia.org):
|
||||
/root/.hermes/profiles/ledger/cache/web/en.wikipedia.org-00a059c52c.md
|
||||
|
||||
Output (written to the artifact dir):
|
||||
un_member_states.csv - Country, Date_of_admission, Year, Is_founding_member
|
||||
un_member_states.json - same records as a JSON array
|
||||
|
||||
Only the 193 current member states are emitted; separator rows and the table
|
||||
header are filtered out. Founding member == admitted in 1945 (the 51 original
|
||||
members of the United Nations, per the page's "Current members" section).
|
||||
"""
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
|
||||
SRC = "/root/.hermes/profiles/ledger/cache/web/en.wikipedia.org-00a059c52c.md"
|
||||
OUT = "/root/.hermes/wizard-outputs/ledger"
|
||||
|
||||
os.makedirs(OUT, exist_ok=True)
|
||||
|
||||
# Match rows like: || Afghanistan | 19 November 1946 | <notes> |
|
||||
# country/date use non-greedy capture; notes capture is greedy so notes that
|
||||
# contain ' | ' are kept whole.
|
||||
ROW_RE = re.compile(r"^\| (.+?) \| (.+?) \| (.*)$", re.M)
|
||||
|
||||
records = []
|
||||
for m in ROW_RE.finditer(open(SRC, encoding="utf-8").read()):
|
||||
country = m.group(1).strip()
|
||||
date = m.group(2).strip()
|
||||
# Skip table header and Markdown separator rows.
|
||||
if country.lower().startswith("member state") or date.lower().startswith("date"):
|
||||
continue
|
||||
if country in ("---", "") or date in ("---", ""):
|
||||
continue
|
||||
if not re.match(r"^\d{1,2} \w+ \d{4}$", date):
|
||||
continue
|
||||
d = datetime.strptime(date, "%d %B %Y")
|
||||
records.append({
|
||||
"country": country,
|
||||
"date_of_admission": date,
|
||||
"year": d.year,
|
||||
"is_founding_member": (d.year == 1945),
|
||||
})
|
||||
|
||||
records.sort(key=lambda r: datetime.strptime(r["date_of_admission"], "%d %B %Y"))
|
||||
|
||||
csv_path = os.path.join(OUT, "un_member_states.csv")
|
||||
with open(csv_path, "w", encoding="utf-8", newline="") as fh:
|
||||
writer = csv.DictWriter(
|
||||
fh, fieldnames=["country", "date_of_admission", "year", "is_founding_member"]
|
||||
)
|
||||
writer.writeheader()
|
||||
writer.writerows(records)
|
||||
|
||||
json_path = os.path.join(OUT, "un_member_states.json")
|
||||
with open(json_path, "w", encoding="utf-8") as fh:
|
||||
json.dump(records, fh, ensure_ascii=False, indent=2)
|
||||
|
||||
print("rows_emitted:", len(records))
|
||||
print("columns:", list(records[0].keys()) if records else None)
|
||||
print("founding_1945:", sum(1 for r in records if r["is_founding_member"]))
|
||||
print("years:", sorted(set(r["year"] for r in records)))
|
||||
print("csv:", csv_path)
|
||||
print("json:", json_path)
|
||||
@@ -0,0 +1,194 @@
|
||||
country,date_of_admission,year,is_founding_member
|
||||
Argentina,24 October 1945,1945,True
|
||||
Belarus,24 October 1945,1945,True
|
||||
Brazil,24 October 1945,1945,True
|
||||
Chile,24 October 1945,1945,True
|
||||
China,24 October 1945,1945,True
|
||||
Cuba,24 October 1945,1945,True
|
||||
Denmark,24 October 1945,1945,True
|
||||
Dominican Republic,24 October 1945,1945,True
|
||||
Egypt,24 October 1945,1945,True
|
||||
El Salvador,24 October 1945,1945,True
|
||||
France,24 October 1945,1945,True
|
||||
Haiti,24 October 1945,1945,True
|
||||
Iran (Islamic Republic of),24 October 1945,1945,True
|
||||
Lebanon,24 October 1945,1945,True
|
||||
Luxembourg,24 October 1945,1945,True
|
||||
New Zealand,24 October 1945,1945,True
|
||||
Nicaragua,24 October 1945,1945,True
|
||||
Paraguay,24 October 1945,1945,True
|
||||
Philippines,24 October 1945,1945,True
|
||||
Poland,24 October 1945,1945,True
|
||||
Russian Federation,24 October 1945,1945,True
|
||||
Saudi Arabia,24 October 1945,1945,True
|
||||
Syrian Arab Republic,24 October 1945,1945,True
|
||||
Türkiye,24 October 1945,1945,True
|
||||
Ukraine,24 October 1945,1945,True
|
||||
United Kingdom of Great Britain and Northern Ireland,24 October 1945,1945,True
|
||||
United States of America,24 October 1945,1945,True
|
||||
Greece,25 October 1945,1945,True
|
||||
India,30 October 1945,1945,True
|
||||
Peru,31 October 1945,1945,True
|
||||
Australia,1 November 1945,1945,True
|
||||
Costa Rica,2 November 1945,1945,True
|
||||
Liberia,2 November 1945,1945,True
|
||||
Colombia,5 November 1945,1945,True
|
||||
Mexico,7 November 1945,1945,True
|
||||
South Africa,7 November 1945,1945,True
|
||||
Canada,9 November 1945,1945,True
|
||||
Ethiopia,13 November 1945,1945,True
|
||||
Panama,13 November 1945,1945,True
|
||||
Bolivia,14 November 1945,1945,True
|
||||
Venezuela (Bolivarian Republic of),15 November 1945,1945,True
|
||||
Guatemala,21 November 1945,1945,True
|
||||
Norway,27 November 1945,1945,True
|
||||
Netherlands (Kingdom of the),10 December 1945,1945,True
|
||||
Honduras,17 December 1945,1945,True
|
||||
Uruguay,18 December 1945,1945,True
|
||||
Ecuador,21 December 1945,1945,True
|
||||
Iraq,21 December 1945,1945,True
|
||||
Belgium,27 December 1945,1945,True
|
||||
Afghanistan,19 November 1946,1946,False
|
||||
Iceland,19 November 1946,1946,False
|
||||
Sweden,19 November 1946,1946,False
|
||||
Thailand,16 December 1946,1946,False
|
||||
Pakistan,30 September 1947,1947,False
|
||||
Yemen,30 September 1947,1947,False
|
||||
Myanmar,19 April 1948,1948,False
|
||||
Israel,11 May 1949,1949,False
|
||||
Indonesia,28 September 1950,1950,False
|
||||
Albania,14 December 1955,1955,False
|
||||
Austria,14 December 1955,1955,False
|
||||
Bulgaria,14 December 1955,1955,False
|
||||
Cambodia,14 December 1955,1955,False
|
||||
Finland,14 December 1955,1955,False
|
||||
Hungary,14 December 1955,1955,False
|
||||
Ireland,14 December 1955,1955,False
|
||||
Italy,14 December 1955,1955,False
|
||||
Jordan,14 December 1955,1955,False
|
||||
Lao People's Democratic Republic,14 December 1955,1955,False
|
||||
Libya,14 December 1955,1955,False
|
||||
Nepal,14 December 1955,1955,False
|
||||
Portugal,14 December 1955,1955,False
|
||||
Romania,14 December 1955,1955,False
|
||||
Spain,14 December 1955,1955,False
|
||||
Sri Lanka,14 December 1955,1955,False
|
||||
Morocco,12 November 1956,1956,False
|
||||
Sudan,12 November 1956,1956,False
|
||||
Tunisia,12 November 1956,1956,False
|
||||
Japan,18 December 1956,1956,False
|
||||
Ghana,8 March 1957,1957,False
|
||||
Malaysia,17 September 1957,1957,False
|
||||
Guinea,12 December 1958,1958,False
|
||||
Benin,20 September 1960,1960,False
|
||||
Burkina Faso,20 September 1960,1960,False
|
||||
Cameroon,20 September 1960,1960,False
|
||||
Central African Republic,20 September 1960,1960,False
|
||||
Chad,20 September 1960,1960,False
|
||||
Congo,20 September 1960,1960,False
|
||||
Côte d'Ivoire,20 September 1960,1960,False
|
||||
Cyprus,20 September 1960,1960,False
|
||||
Democratic Republic of the Congo,20 September 1960,1960,False
|
||||
Gabon,20 September 1960,1960,False
|
||||
Madagascar,20 September 1960,1960,False
|
||||
Niger,20 September 1960,1960,False
|
||||
Somalia,20 September 1960,1960,False
|
||||
Togo,20 September 1960,1960,False
|
||||
Mali,28 September 1960,1960,False
|
||||
Senegal,28 September 1960,1960,False
|
||||
Nigeria,7 October 1960,1960,False
|
||||
Sierra Leone,27 September 1961,1961,False
|
||||
Mauritania,27 October 1961,1961,False
|
||||
Mongolia,27 October 1961,1961,False
|
||||
United Republic of Tanzania,14 December 1961,1961,False
|
||||
Burundi,18 September 1962,1962,False
|
||||
Jamaica,18 September 1962,1962,False
|
||||
Rwanda,18 September 1962,1962,False
|
||||
Trinidad and Tobago,18 September 1962,1962,False
|
||||
Algeria,8 October 1962,1962,False
|
||||
Uganda,25 October 1962,1962,False
|
||||
Kuwait,14 May 1963,1963,False
|
||||
Kenya,16 December 1963,1963,False
|
||||
Malawi,1 December 1964,1964,False
|
||||
Malta,1 December 1964,1964,False
|
||||
Zambia,1 December 1964,1964,False
|
||||
Gambia (Republic of The),21 September 1965,1965,False
|
||||
Maldives,21 September 1965,1965,False
|
||||
Singapore,21 September 1965,1965,False
|
||||
Guyana,20 September 1966,1966,False
|
||||
Botswana,17 October 1966,1966,False
|
||||
Lesotho,17 October 1966,1966,False
|
||||
Barbados,9 December 1966,1966,False
|
||||
Mauritius,24 April 1968,1968,False
|
||||
Eswatini,24 September 1968,1968,False
|
||||
Equatorial Guinea,12 November 1968,1968,False
|
||||
Fiji,13 October 1970,1970,False
|
||||
Bahrain,21 September 1971,1971,False
|
||||
Bhutan,21 September 1971,1971,False
|
||||
Qatar,21 September 1971,1971,False
|
||||
Oman,7 October 1971,1971,False
|
||||
United Arab Emirates,9 December 1971,1971,False
|
||||
"Bahamas, The",18 September 1973,1973,False
|
||||
Germany,18 September 1973,1973,False
|
||||
Bangladesh,17 September 1974,1974,False
|
||||
Grenada,17 September 1974,1974,False
|
||||
Guinea Bissau,17 September 1974,1974,False
|
||||
Cabo Verde,16 September 1975,1975,False
|
||||
Mozambique,16 September 1975,1975,False
|
||||
Sao Tome and Principe,16 September 1975,1975,False
|
||||
Papua New Guinea,10 October 1975,1975,False
|
||||
Comoros,12 November 1975,1975,False
|
||||
Suriname,4 December 1975,1975,False
|
||||
Seychelles,21 September 1976,1976,False
|
||||
Angola,1 December 1976,1976,False
|
||||
Samoa,15 December 1976,1976,False
|
||||
Djibouti,20 September 1977,1977,False
|
||||
Vietnam,20 September 1977,1977,False
|
||||
Solomon Islands,19 September 1978,1978,False
|
||||
Dominica,18 December 1978,1978,False
|
||||
Saint Lucia,18 September 1979,1979,False
|
||||
Zimbabwe,25 August 1980,1980,False
|
||||
Saint Vincent and the Grenadines,16 September 1980,1980,False
|
||||
Vanuatu,15 September 1981,1981,False
|
||||
Belize,25 September 1981,1981,False
|
||||
Antigua and Barbuda,11 November 1981,1981,False
|
||||
Saint Kitts and Nevis,23 September 1983,1983,False
|
||||
Brunei,21 September 1984,1984,False
|
||||
Namibia,23 April 1990,1990,False
|
||||
Liechtenstein,18 September 1990,1990,False
|
||||
Democratic People's Republic of Korea,17 September 1991,1991,False
|
||||
Estonia,17 September 1991,1991,False
|
||||
Latvia,17 September 1991,1991,False
|
||||
Lithuania,17 September 1991,1991,False
|
||||
Marshall Islands,17 September 1991,1991,False
|
||||
Micronesia (Federated States of),17 September 1991,1991,False
|
||||
Republic of Korea,17 September 1991,1991,False
|
||||
Armenia,2 March 1992,1992,False
|
||||
Azerbaijan,2 March 1992,1992,False
|
||||
Kazakhstan,2 March 1992,1992,False
|
||||
Kyrgyzstan,2 March 1992,1992,False
|
||||
Republic of Moldova,2 March 1992,1992,False
|
||||
San Marino,2 March 1992,1992,False
|
||||
Tajikistan,2 March 1992,1992,False
|
||||
Turkmenistan,2 March 1992,1992,False
|
||||
Uzbekistan,2 March 1992,1992,False
|
||||
Bosnia and Herzegovina,22 May 1992,1992,False
|
||||
Croatia,22 May 1992,1992,False
|
||||
Slovenia,22 May 1992,1992,False
|
||||
Georgia,31 July 1992,1992,False
|
||||
Czechia,19 January 1993,1993,False
|
||||
Slovakia,19 January 1993,1993,False
|
||||
North Macedonia,8 April 1993,1993,False
|
||||
Eritrea,28 May 1993,1993,False
|
||||
Monaco,28 May 1993,1993,False
|
||||
Andorra,28 July 1993,1993,False
|
||||
Palau,15 December 1994,1994,False
|
||||
Kiribati,14 September 1999,1999,False
|
||||
Nauru,14 September 1999,1999,False
|
||||
Tonga,14 September 1999,1999,False
|
||||
Tuvalu,5 September 2000,2000,False
|
||||
Serbia,1 November 2000,2000,False
|
||||
Switzerland,10 September 2002,2002,False
|
||||
Timor-Leste,27 September 2002,2002,False
|
||||
Montenegro,28 June 2006,2006,False
|
||||
South Sudan,14 July 2011,2011,False
|
||||
|
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user