# -*- coding: UTF-8 -*- import itertools import json import re import pytest from rdflib import Graph from rdflib.plugin import register from rdflib.serializer import Serializer register("json-ld", Serializer, "rdflib.plugins.serializers.jsonld", "JsonLDSerializer") cases = [] def case(*args): cases.append(args) case( """ @prefix dc: . dc:title "Homepage"@en . """, { "@context": {"@vocab": "http://purl.org/dc/terms/", "@language": "en"}, "@id": "http://example.org/", "title": "Homepage", }, ) case( """ @prefix dc: . dc:title "Homepage"@en, "Hemsida"@sv . """, { "@context": { "@vocab": "http://purl.org/dc/terms/", "title": {"@container": "@language"}, }, "@id": "http://example.org/", "title": {"en": "Homepage", "sv": "Hemsida"}, }, ) case( """ @prefix dc: . dc:title "Homepage"@en, "Hemsida"@sv . """, { "@context": { "@vocab": "http://purl.org/dc/terms/", "@language": "sv", "title_en": {"@id": "title", "@language": "en"}, }, "@id": "http://example.org/", "title_en": "Homepage", "title": "Hemsida", }, ) # .. Requires set values to be sorted to be predictable # case(""" # @prefix dc: . # # dc:title "Homepage"@en, "Home Page"@en, "Home Page"@en-GB, "Hemsida"@sv . # """, # { # "@context": "-||-", # "@id": "http://example.org/", # "title_en": ["Homepage", "Home Page"], # "title": [{"@language": "en-GB", "@value": "Home Page"}, "Hemsida"] # } # ) case( """ @prefix dc: . dc:title "Påskön"@sv . """, { "@context": {"@vocab": "http://purl.org/dc/terms/", "@language": "sv"}, "@id": "http://example.org/easter_island", "title": "Påskön", }, ) case( """ @prefix : . :has _:blank-1 . """, { "@context": {"has": {"@type": "@id", "@id": "http://example.org/ns#has"}}, "@id": "http://example.org/", "has": "_:blank-1", }, ) case( """ @prefix rdfs: . @prefix : . :Something rdfs:subClassOf :Thing . """, { "@context": { "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "v": "http://example.org/ns#", "rdfs:subClassOf": {"@container": "@set"}, }, "@id": "v:Something", "rdfs:subClassOf": [{"@id": "v:Thing"}], }, ) case( """ @prefix rdfs: . @prefix : . :Something rdfs:subClassOf :Thing . """, { "@context": { "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "v": "http://example.org/ns#", "subClassOf": { "@id": "rdfs:subClassOf", "@type": "@id", "@container": "@set", }, }, "@id": "v:Something", "subClassOf": ["v:Thing"], }, ) case( """ @prefix owl: . @prefix : . :World owl:unionOf (:Everyhing :Nothing) . """, { "@context": { "owl": "http://www.w3.org/2002/07/owl#", "v": "http://example.org/ns#", }, "@id": "v:World", "owl:unionOf": {"@list": [{"@id": "v:Everyhing"}, {"@id": "v:Nothing"}]}, }, ) case( """ @prefix owl: . @prefix : . :World owl:unionOf (:Everyhing :Nothing) . """, { "@context": { "owl": "http://www.w3.org/2002/07/owl#", "v": "http://example.org/ns#", "unionOf": {"@id": "owl:unionOf", "@container": "@list"}, }, "@id": "v:World", "unionOf": [{"@id": "v:Everyhing"}, {"@id": "v:Nothing"}], }, ) case( """ @prefix owl: . @prefix : . :World owl:unionOf (:Everyhing :Nothing) . """, { "@context": { "owl": "http://www.w3.org/2002/07/owl#", "v": "http://example.org/ns#", "unionOf": {"@id": "owl:unionOf", "@type": "@id", "@container": "@list"}, }, "@id": "v:World", "unionOf": ["v:Everyhing", "v:Nothing"], }, ) # Shorten result IRIs by using @base case( """ BASE PREFIX : a :Class . a :Class; :subClassOf . a :Thing . a :Thing . a :Thing . """, { "@context": { "@base": "http://example.org/some/path/#other", "@vocab": "http://example.org/vocab/", }, "@graph": [ {"@id": "/Thing", "@type": "Class"}, {"@id": "/Work", "@type": "Class", "subClassOf": {"@id": "/Thing"}}, {"@id": "", "@type": "Thing"}, {"@id": "/some/path/#this", "@type": "Thing"}, {"@id": "/some/path/#other", "@type": "Thing"}, ], }, ) json_kwargs = dict(indent=2, separators=(",", ": "), sort_keys=True, ensure_ascii=False) def run(data, expected): g = Graph().parse(data=data, format="turtle") result = g.serialize(format="json-ld", context=expected["@context"]) result = json.loads(result) sort_graph(result) result = json.dumps(result, **json_kwargs) incr = itertools.count(1) result = re.sub(r'"_:[^"]+"', lambda m: '"_:blank-%s"' % next(incr), result) sort_graph(expected) expected = json.dumps(expected, **json_kwargs) assert result == expected, "Expected not equal to result: %s" % result def sort_graph(data): if "@graph" in data: data["@graph"].sort(key=lambda node: node.get("@id")) @pytest.mark.parametrize("data, expected", cases) def test_cases(data, expected): run(data, expected)