From e097d4ececc64d21174ff7594ec94c6c575d51d5 Mon Sep 17 00:00:00 2001 From: Anatoly Scherbakov Date: Wed, 4 Feb 2026 21:19:57 +0400 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9E=95=20`JSONDocumentParser`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yaml_ld/document_parsers/json_parser.py | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 yaml_ld/document_parsers/json_parser.py diff --git a/yaml_ld/document_parsers/json_parser.py b/yaml_ld/document_parsers/json_parser.py new file mode 100644 index 0000000..83e7642 --- /dev/null +++ b/yaml_ld/document_parsers/json_parser.py @@ -0,0 +1,44 @@ +import io +import json + +from yaml_ld.document_parsers.base import ( + BaseDocumentParser, + DocumentLoaderOptions, +) +from yaml_ld.errors import ( + DocumentIsScalar, + InvalidEncoding, + LoadingDocumentFailed, +) +from yaml_ld.models import JsonLdRecord + + +def ensure_not_scalar(document) -> JsonLdRecord | list[JsonLdRecord]: + """Ensure document is not a scalar value.""" + if not isinstance(document, (dict, list)): + raise DocumentIsScalar(document) + + return document + + +class JSONDocumentParser(BaseDocumentParser): + """Parse JSON and JSON-LD documents.""" + + def __call__( + self, + data_stream: io.BytesIO, + source: str, + options: DocumentLoaderOptions, + ) -> JsonLdRecord | list[JsonLdRecord]: + """Parse JSON document into LD.""" + try: + text = data_stream.read().decode('utf-8') + except UnicodeDecodeError as unicode_decode_error: + raise InvalidEncoding() from unicode_decode_error + + try: + document = json.loads(text) + except json.JSONDecodeError as json_error: + raise LoadingDocumentFailed(path=source) from json_error + + return ensure_not_scalar(document) From f74436981933d71228cd82a1ed12511a80a727b3 Mon Sep 17 00:00:00 2001 From: Anatoly Scherbakov Date: Wed, 4 Feb 2026 21:20:08 +0400 Subject: [PATCH 2/4] Register JSON parser --- yaml_ld/document_loaders/content_types.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yaml_ld/document_loaders/content_types.py b/yaml_ld/document_loaders/content_types.py index 32dced8..9fc4830 100644 --- a/yaml_ld/document_loaders/content_types.py +++ b/yaml_ld/document_loaders/content_types.py @@ -6,6 +6,7 @@ from yarl import URL from yaml_ld.document_parsers.base import BaseDocumentParser +from yaml_ld.document_parsers.json_parser import JSONDocumentParser from yaml_ld.document_parsers.rdf_xml_parser import RDFXMLParser from yaml_ld.document_parsers.turtle_parser import TurtleParser from yaml_ld.document_parsers.yaml_parser import YAMLDocumentParser @@ -95,8 +96,8 @@ def parser_by_content_type_map(): ) return { - 'application/json': YAMLDocumentParser, - APPLICATION_LD_JSON: YAMLDocumentParser, + 'application/json': JSONDocumentParser, + APPLICATION_LD_JSON: JSONDocumentParser, 'application/yaml': YAMLDocumentParser, 'application/x-yaml': YAMLDocumentParser, 'application/ld+yaml': YAMLDocumentParser, From 6fa76fcd89350c0df8beababe8965db43a1f29a8 Mon Sep 17 00:00:00 2001 From: Anatoly Scherbakov Date: Wed, 4 Feb 2026 21:20:22 +0400 Subject: [PATCH 3/4] Bump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f2ecede..2762a42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "yaml-ld" -version = "1.1.16" +version = "1.1.17" description = "YAML-LD for Python" authors = ["Anatoly Scherbakov "] license = "MIT" From 928e5cbcfb49910e2c91a4bc2659c4c17979cb5b Mon Sep 17 00:00:00 2001 From: Anatoly Scherbakov Date: Wed, 4 Feb 2026 21:29:54 +0400 Subject: [PATCH 4/4] Imports are fine, leave them alone --- setup.cfg | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..0383177 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[flake8] +max-imports = 15