Skip to content

feat(dtypes): langstring — sprach-getaggte Strings (rdf:langString)#85

Merged
lepy merged 1 commit into
masterfrom
feat/dtype-langstring
Jun 29, 2026
Merged

feat(dtypes): langstring — sprach-getaggte Strings (rdf:langString)#85
lepy merged 1 commit into
masterfrom
feat/dtype-langstring

Conversation

@lepy

@lepy lepy commented Jun 29, 2026

Copy link
Copy Markdown
Owner

Was

Neuer dtype langstring + Wertklasse LangString(text, lang) für
sprach-getaggte Strings (i18n-Labels). Der Sonderfall unter den dtypes: in JSON-LD
über @language ausgedrückt (nicht @type):

m.add("label", "Hallo@de", dtype="langstring")
# JSON-LD:  {"@value": "Hallo", "@language": "de"}   (korrektes rdf:langString)
m.get("label").value          # LangString('Hallo', 'de')  ->  .text / .lang

Coercion

LangString-Passthrough · (text, lang)-Tupel/Liste · {"@value","@language"}-Dict ·
String mit endständigem BCP-47-Tag ("Hallo@de", "Hello@en-US"). Mehrdeutiges
"a@b.com"kein Tag (BCP-47-Validierung am Ende); leer/NoneNone.

JSON-LD (semantic.py)

  • _value_literal: rendert langstring via @language (mit/ohne Tag)
  • _set_from_node: liest @language zurück und rekonstruiert text@lang
  • Ohne Sprach-Tag degradiert ein langstring sauber zu str (rdf:langString verlangt
    ein Tag)

Anbindung

DTYPES_INV (LangStringlangstring), json_default, DtypeSpec.to_json
(→ "Hallo@de"), Registry-Key langstring (resolve lowercased → dtype="langString"
funktioniert ebenfalls).

Tests / CI

tests/test_dtypes.py: Coercion (alle Eingabeformen + Ambiguität), LangString-Klasse
(eq/hash/str/repr), to_json, json_default, resolve/xsd, JSON- und
JSON-LD-Round-Trip (mit und ohne Tag). dtypes.py 307/307 100 %,
semantic.py 100 %.

Kanonische CI: 620 passed, 7 skipped, TOTAL 100 %; mkdocs build --strict grün.
Doku + CHANGELOG [1.3.0] ergänzt.

Neuer dtype langstring + Wertklasse LangString(text, lang). In JSON-LD ueber
@language ausgedrueckt (nicht @type): {"@value": "Hallo", "@language": "de"} —
also korrektes rdf:langString. Kompakte Textform "text@lang" ("Hallo@de").

Coercion: LangString-Passthrough, (text, lang)-Tupel/Liste, {"@value","@language"}-
Dict, oder String mit endstaendigem BCP-47-Tag (ambig "a@b.com" -> kein Tag);
leer/None -> None. Registry-Key "langstring" (resolve lowercased -> "langString"
funktioniert auch). DTYPES_INV, json_default, to_json (-> "Hallo@de") angebunden.

semantic.py: _value_literal rendert langstring via @language (mit/ohne Tag);
_set_from_node liest @language zurueck und rekonstruiert text@lang. Ohne Sprach-Tag
degradiert ein langstring sauber zu str (rdf:langString verlangt ein Tag).

Tests: Coercion (alle Eingabeformen), LangString-Klasse (eq/hash/str/repr), to_json,
json_default, resolve/xsd, JSON- und JSON-LD-Round-Trip (mit und ohne Tag).
dtypes.py 307/307 100%, semantic.py 100%. Doku + CHANGELOG [1.3.0] ergaenzt.

Kanonische CI: 620 passed, 7 skipped, TOTAL 100%; mkdocs --strict gruen.
@lepy lepy merged commit 2308169 into master Jun 29, 2026
1 of 2 checks passed
@lepy lepy deleted the feat/dtype-langstring branch June 29, 2026 15:17
@codacy-production

Copy link
Copy Markdown

Not up to standards ⛔

🔴 Issues 8 minor

Alerts:
⚠ 8 issues (≤ 0 issues of at least minor severity)

Results:
8 new issues

Category Results
Documentation 8 minor

View in Codacy

🟢 Metrics 28 complexity · 0 duplication

Metric Results
Complexity 28
Duplication 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant