382 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			382 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
from . import schema_org
 | 
						|
 | 
						|
CONTEXTS = [
 | 
						|
    {
 | 
						|
        "shortId": "LDP",
 | 
						|
        "contextUrl": None,
 | 
						|
        "documentUrl": "http://www.w3.org/ns/ldp",
 | 
						|
        "document": {
 | 
						|
            "@context": {
 | 
						|
                "ldp": "http://www.w3.org/ns/ldp#",
 | 
						|
                "id": "@id",
 | 
						|
                "type": "@type",
 | 
						|
                "Container": "ldp:Container",
 | 
						|
                "BasicContainer": "ldp:BasicContainer",
 | 
						|
                "DirectContainer": "ldp:DirectContainer",
 | 
						|
                "IndirectContainer": "ldp:IndirectContainer",
 | 
						|
                "hasMemberRelation": {"@id": "ldp:hasMemberRelation", "@type": "@id"},
 | 
						|
                "isMemberOfRelation": {"@id": "ldp:isMemberOfRelation", "@type": "@id"},
 | 
						|
                "membershipResource": {"@id": "ldp:membershipResource", "@type": "@id"},
 | 
						|
                "insertedContentRelation": {
 | 
						|
                    "@id": "ldp:insertedContentRelation",
 | 
						|
                    "@type": "@id",
 | 
						|
                },
 | 
						|
                "contains": {"@id": "ldp:contains", "@type": "@id"},
 | 
						|
                "member": {"@id": "ldp:member", "@type": "@id"},
 | 
						|
                "constrainedBy": {"@id": "ldp:constrainedBy", "@type": "@id"},
 | 
						|
                "Resource": "ldp:Resource",
 | 
						|
                "RDFSource": "ldp:RDFSource",
 | 
						|
                "NonRDFSource": "ldp:NonRDFSource",
 | 
						|
                "MemberSubject": "ldp:MemberSubject",
 | 
						|
                "PreferContainment": "ldp:PreferContainment",
 | 
						|
                "PreferMembership": "ldp:PreferMembership",
 | 
						|
                "PreferMinimalContainer": "ldp:PreferMinimalContainer",
 | 
						|
                "PageSortCriterion": "ldp:PageSortCriterion",
 | 
						|
                "pageSortCriteria": {
 | 
						|
                    "@id": "ldp:pageSortCriteria",
 | 
						|
                    "@type": "@id",
 | 
						|
                    "@container": "@list",
 | 
						|
                },
 | 
						|
                "pageSortPredicate": {"@id": "ldp:pageSortPredicate", "@type": "@id"},
 | 
						|
                "pageSortOrder": {"@id": "ldp:pageSortOrder", "@type": "@id"},
 | 
						|
                "pageSortCollation": {"@id": "ldp:pageSortCollation", "@type": "@id"},
 | 
						|
                "Ascending": "ldp:Ascending",
 | 
						|
                "Descending": "ldp:Descending",
 | 
						|
                "Page": "ldp:Page",
 | 
						|
                "pageSequence": {"@id": "ldp:pageSequence", "@type": "@id"},
 | 
						|
                "inbox": {"@id": "ldp:inbox", "@type": "@id"},
 | 
						|
            }
 | 
						|
        },
 | 
						|
    },
 | 
						|
    {
 | 
						|
        "shortId": "AS",
 | 
						|
        "contextUrl": None,
 | 
						|
        "documentUrl": "https://www.w3.org/ns/activitystreams",
 | 
						|
        "document": {
 | 
						|
            "@context": {
 | 
						|
                "@vocab": "_:",
 | 
						|
                "xsd": "http://www.w3.org/2001/XMLSchema#",
 | 
						|
                "as": "https://www.w3.org/ns/activitystreams#",
 | 
						|
                "ldp": "http://www.w3.org/ns/ldp#",
 | 
						|
                "id": "@id",
 | 
						|
                "type": "@type",
 | 
						|
                "Accept": "as:Accept",
 | 
						|
                "Activity": "as:Activity",
 | 
						|
                "IntransitiveActivity": "as:IntransitiveActivity",
 | 
						|
                "Add": "as:Add",
 | 
						|
                "Announce": "as:Announce",
 | 
						|
                "Application": "as:Application",
 | 
						|
                "Arrive": "as:Arrive",
 | 
						|
                "Article": "as:Article",
 | 
						|
                "Audio": "as:Audio",
 | 
						|
                "Block": "as:Block",
 | 
						|
                "Collection": "as:Collection",
 | 
						|
                "CollectionPage": "as:CollectionPage",
 | 
						|
                "Relationship": "as:Relationship",
 | 
						|
                "Create": "as:Create",
 | 
						|
                "Delete": "as:Delete",
 | 
						|
                "Dislike": "as:Dislike",
 | 
						|
                "Document": "as:Document",
 | 
						|
                "Event": "as:Event",
 | 
						|
                "Follow": "as:Follow",
 | 
						|
                "Flag": "as:Flag",
 | 
						|
                "Group": "as:Group",
 | 
						|
                "Ignore": "as:Ignore",
 | 
						|
                "Image": "as:Image",
 | 
						|
                "Invite": "as:Invite",
 | 
						|
                "Join": "as:Join",
 | 
						|
                "Leave": "as:Leave",
 | 
						|
                "Like": "as:Like",
 | 
						|
                "Link": "as:Link",
 | 
						|
                "Mention": "as:Mention",
 | 
						|
                "Note": "as:Note",
 | 
						|
                "Object": "as:Object",
 | 
						|
                "Offer": "as:Offer",
 | 
						|
                "OrderedCollection": "as:OrderedCollection",
 | 
						|
                "OrderedCollectionPage": "as:OrderedCollectionPage",
 | 
						|
                "Organization": "as:Organization",
 | 
						|
                "Page": "as:Page",
 | 
						|
                "Person": "as:Person",
 | 
						|
                "Place": "as:Place",
 | 
						|
                "Profile": "as:Profile",
 | 
						|
                "Question": "as:Question",
 | 
						|
                "Reject": "as:Reject",
 | 
						|
                "Remove": "as:Remove",
 | 
						|
                "Service": "as:Service",
 | 
						|
                "TentativeAccept": "as:TentativeAccept",
 | 
						|
                "TentativeReject": "as:TentativeReject",
 | 
						|
                "Tombstone": "as:Tombstone",
 | 
						|
                "Undo": "as:Undo",
 | 
						|
                "Update": "as:Update",
 | 
						|
                "Video": "as:Video",
 | 
						|
                "View": "as:View",
 | 
						|
                "Listen": "as:Listen",
 | 
						|
                "Read": "as:Read",
 | 
						|
                "Move": "as:Move",
 | 
						|
                "Travel": "as:Travel",
 | 
						|
                "IsFollowing": "as:IsFollowing",
 | 
						|
                "IsFollowedBy": "as:IsFollowedBy",
 | 
						|
                "IsContact": "as:IsContact",
 | 
						|
                "IsMember": "as:IsMember",
 | 
						|
                "subject": {"@id": "as:subject", "@type": "@id"},
 | 
						|
                "relationship": {"@id": "as:relationship", "@type": "@id"},
 | 
						|
                "actor": {"@id": "as:actor", "@type": "@id"},
 | 
						|
                "attributedTo": {"@id": "as:attributedTo", "@type": "@id"},
 | 
						|
                "attachment": {"@id": "as:attachment", "@type": "@id"},
 | 
						|
                "bcc": {"@id": "as:bcc", "@type": "@id"},
 | 
						|
                "bto": {"@id": "as:bto", "@type": "@id"},
 | 
						|
                "cc": {"@id": "as:cc", "@type": "@id"},
 | 
						|
                "context": {"@id": "as:context", "@type": "@id"},
 | 
						|
                "current": {"@id": "as:current", "@type": "@id"},
 | 
						|
                "first": {"@id": "as:first", "@type": "@id"},
 | 
						|
                "generator": {"@id": "as:generator", "@type": "@id"},
 | 
						|
                "icon": {"@id": "as:icon", "@type": "@id"},
 | 
						|
                "image": {"@id": "as:image", "@type": "@id"},
 | 
						|
                "inReplyTo": {"@id": "as:inReplyTo", "@type": "@id"},
 | 
						|
                "items": {"@id": "as:items", "@type": "@id"},
 | 
						|
                "instrument": {"@id": "as:instrument", "@type": "@id"},
 | 
						|
                "orderedItems": {
 | 
						|
                    "@id": "as:items",
 | 
						|
                    "@type": "@id",
 | 
						|
                    "@container": "@list",
 | 
						|
                },
 | 
						|
                "last": {"@id": "as:last", "@type": "@id"},
 | 
						|
                "location": {"@id": "as:location", "@type": "@id"},
 | 
						|
                "next": {"@id": "as:next", "@type": "@id"},
 | 
						|
                "object": {"@id": "as:object", "@type": "@id"},
 | 
						|
                "oneOf": {"@id": "as:oneOf", "@type": "@id"},
 | 
						|
                "anyOf": {"@id": "as:anyOf", "@type": "@id"},
 | 
						|
                "closed": {"@id": "as:closed", "@type": "xsd:dateTime"},
 | 
						|
                "origin": {"@id": "as:origin", "@type": "@id"},
 | 
						|
                "accuracy": {"@id": "as:accuracy", "@type": "xsd:float"},
 | 
						|
                "prev": {"@id": "as:prev", "@type": "@id"},
 | 
						|
                "preview": {"@id": "as:preview", "@type": "@id"},
 | 
						|
                "replies": {"@id": "as:replies", "@type": "@id"},
 | 
						|
                "result": {"@id": "as:result", "@type": "@id"},
 | 
						|
                "audience": {"@id": "as:audience", "@type": "@id"},
 | 
						|
                "partOf": {"@id": "as:partOf", "@type": "@id"},
 | 
						|
                "tag": {"@id": "as:tag", "@type": "@id"},
 | 
						|
                "target": {"@id": "as:target", "@type": "@id"},
 | 
						|
                "to": {"@id": "as:to", "@type": "@id"},
 | 
						|
                "url": {"@id": "as:url", "@type": "@id"},
 | 
						|
                "altitude": {"@id": "as:altitude", "@type": "xsd:float"},
 | 
						|
                "content": "as:content",
 | 
						|
                "contentMap": {"@id": "as:content", "@container": "@language"},
 | 
						|
                "name": "as:name",
 | 
						|
                "nameMap": {"@id": "as:name", "@container": "@language"},
 | 
						|
                "duration": {"@id": "as:duration", "@type": "xsd:duration"},
 | 
						|
                "endTime": {"@id": "as:endTime", "@type": "xsd:dateTime"},
 | 
						|
                "height": {"@id": "as:height", "@type": "xsd:nonNegativeInteger"},
 | 
						|
                "href": {"@id": "as:href", "@type": "@id"},
 | 
						|
                "hreflang": "as:hreflang",
 | 
						|
                "latitude": {"@id": "as:latitude", "@type": "xsd:float"},
 | 
						|
                "longitude": {"@id": "as:longitude", "@type": "xsd:float"},
 | 
						|
                "mediaType": "as:mediaType",
 | 
						|
                "published": {"@id": "as:published", "@type": "xsd:dateTime"},
 | 
						|
                "radius": {"@id": "as:radius", "@type": "xsd:float"},
 | 
						|
                "rel": "as:rel",
 | 
						|
                "startIndex": {
 | 
						|
                    "@id": "as:startIndex",
 | 
						|
                    "@type": "xsd:nonNegativeInteger",
 | 
						|
                },
 | 
						|
                "startTime": {"@id": "as:startTime", "@type": "xsd:dateTime"},
 | 
						|
                "summary": "as:summary",
 | 
						|
                "summaryMap": {"@id": "as:summary", "@container": "@language"},
 | 
						|
                "totalItems": {
 | 
						|
                    "@id": "as:totalItems",
 | 
						|
                    "@type": "xsd:nonNegativeInteger",
 | 
						|
                },
 | 
						|
                "units": "as:units",
 | 
						|
                "updated": {"@id": "as:updated", "@type": "xsd:dateTime"},
 | 
						|
                "width": {"@id": "as:width", "@type": "xsd:nonNegativeInteger"},
 | 
						|
                "describes": {"@id": "as:describes", "@type": "@id"},
 | 
						|
                "formerType": {"@id": "as:formerType", "@type": "@id"},
 | 
						|
                "deleted": {"@id": "as:deleted", "@type": "xsd:dateTime"},
 | 
						|
                "inbox": {"@id": "ldp:inbox", "@type": "@id"},
 | 
						|
                "outbox": {"@id": "as:outbox", "@type": "@id"},
 | 
						|
                "following": {"@id": "as:following", "@type": "@id"},
 | 
						|
                "followers": {"@id": "as:followers", "@type": "@id"},
 | 
						|
                "streams": {"@id": "as:streams", "@type": "@id"},
 | 
						|
                "preferredUsername": "as:preferredUsername",
 | 
						|
                "endpoints": {"@id": "as:endpoints", "@type": "@id"},
 | 
						|
                "uploadMedia": {"@id": "as:uploadMedia", "@type": "@id"},
 | 
						|
                "proxyUrl": {"@id": "as:proxyUrl", "@type": "@id"},
 | 
						|
                "liked": {"@id": "as:liked", "@type": "@id"},
 | 
						|
                "oauthAuthorizationEndpoint": {
 | 
						|
                    "@id": "as:oauthAuthorizationEndpoint",
 | 
						|
                    "@type": "@id",
 | 
						|
                },
 | 
						|
                "oauthTokenEndpoint": {"@id": "as:oauthTokenEndpoint", "@type": "@id"},
 | 
						|
                "provideClientKey": {"@id": "as:provideClientKey", "@type": "@id"},
 | 
						|
                "signClientKey": {"@id": "as:signClientKey", "@type": "@id"},
 | 
						|
                "sharedInbox": {"@id": "as:sharedInbox", "@type": "@id"},
 | 
						|
                "Public": {"@id": "as:Public", "@type": "@id"},
 | 
						|
                "source": "as:source",
 | 
						|
                "likes": {"@id": "as:likes", "@type": "@id"},
 | 
						|
                "shares": {"@id": "as:shares", "@type": "@id"},
 | 
						|
                # Added manually
 | 
						|
                "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
 | 
						|
                "Hashtag": "as:Hashtag",
 | 
						|
            }
 | 
						|
        },
 | 
						|
    },
 | 
						|
    {
 | 
						|
        "shortId": "SC",
 | 
						|
        "contextUrl": None,
 | 
						|
        "documentUrl": "http://schema.org",
 | 
						|
        "document": {"@context": schema_org.CONTEXT},
 | 
						|
    },
 | 
						|
    {
 | 
						|
        "shortId": "SEC",
 | 
						|
        "contextUrl": None,
 | 
						|
        "documentUrl": "https://w3id.org/security/v1",
 | 
						|
        "document": {
 | 
						|
            "@context": {
 | 
						|
                "id": "@id",
 | 
						|
                "type": "@type",
 | 
						|
                "dc": "http://purl.org/dc/terms/",
 | 
						|
                "sec": "https://w3id.org/security#",
 | 
						|
                "xsd": "http://www.w3.org/2001/XMLSchema#",
 | 
						|
                "EcdsaKoblitzSignature2016": "sec:EcdsaKoblitzSignature2016",
 | 
						|
                "Ed25519Signature2018": "sec:Ed25519Signature2018",
 | 
						|
                "EncryptedMessage": "sec:EncryptedMessage",
 | 
						|
                "GraphSignature2012": "sec:GraphSignature2012",
 | 
						|
                "LinkedDataSignature2015": "sec:LinkedDataSignature2015",
 | 
						|
                "LinkedDataSignature2016": "sec:LinkedDataSignature2016",
 | 
						|
                "CryptographicKey": "sec:Key",
 | 
						|
                "authenticationTag": "sec:authenticationTag",
 | 
						|
                "canonicalizationAlgorithm": "sec:canonicalizationAlgorithm",
 | 
						|
                "cipherAlgorithm": "sec:cipherAlgorithm",
 | 
						|
                "cipherData": "sec:cipherData",
 | 
						|
                "cipherKey": "sec:cipherKey",
 | 
						|
                "created": {"@id": "dc:created", "@type": "xsd:dateTime"},
 | 
						|
                "creator": {"@id": "dc:creator", "@type": "@id"},
 | 
						|
                "digestAlgorithm": "sec:digestAlgorithm",
 | 
						|
                "digestValue": "sec:digestValue",
 | 
						|
                "domain": "sec:domain",
 | 
						|
                "encryptionKey": "sec:encryptionKey",
 | 
						|
                "expiration": {"@id": "sec:expiration", "@type": "xsd:dateTime"},
 | 
						|
                "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"},
 | 
						|
                "initializationVector": "sec:initializationVector",
 | 
						|
                "iterationCount": "sec:iterationCount",
 | 
						|
                "nonce": "sec:nonce",
 | 
						|
                "normalizationAlgorithm": "sec:normalizationAlgorithm",
 | 
						|
                "owner": {"@id": "sec:owner", "@type": "@id"},
 | 
						|
                "password": "sec:password",
 | 
						|
                "privateKey": {"@id": "sec:privateKey", "@type": "@id"},
 | 
						|
                "privateKeyPem": "sec:privateKeyPem",
 | 
						|
                "publicKey": {"@id": "sec:publicKey", "@type": "@id"},
 | 
						|
                "publicKeyBase58": "sec:publicKeyBase58",
 | 
						|
                "publicKeyPem": "sec:publicKeyPem",
 | 
						|
                "publicKeyWif": "sec:publicKeyWif",
 | 
						|
                "publicKeyService": {"@id": "sec:publicKeyService", "@type": "@id"},
 | 
						|
                "revoked": {"@id": "sec:revoked", "@type": "xsd:dateTime"},
 | 
						|
                "salt": "sec:salt",
 | 
						|
                "signature": "sec:signature",
 | 
						|
                "signatureAlgorithm": "sec:signingAlgorithm",
 | 
						|
                "signatureValue": "sec:signatureValue",
 | 
						|
            }
 | 
						|
        },
 | 
						|
    },
 | 
						|
    {
 | 
						|
        "shortId": "FW",
 | 
						|
        "contextUrl": None,
 | 
						|
        "documentUrl": "https://funkwhale.audio/ns",
 | 
						|
        "document": {
 | 
						|
            "@context": {
 | 
						|
                "id": "@id",
 | 
						|
                "type": "@type",
 | 
						|
                "as": "https://www.w3.org/ns/activitystreams#",
 | 
						|
                "fw": "https://funkwhale.audio/ns#",
 | 
						|
                "schema": "http://schema.org#",
 | 
						|
                "xsd": "http://www.w3.org/2001/XMLSchema#",
 | 
						|
                "Album": "fw:Album",
 | 
						|
                "Track": "fw:Track",
 | 
						|
                "Artist": "fw:Artist",
 | 
						|
                "Library": "fw:Library",
 | 
						|
                "bitrate": {"@id": "fw:bitrate", "@type": "xsd:nonNegativeInteger"},
 | 
						|
                "size": {"@id": "fw:size", "@type": "xsd:nonNegativeInteger"},
 | 
						|
                "position": {"@id": "fw:position", "@type": "xsd:nonNegativeInteger"},
 | 
						|
                "disc": {"@id": "fw:disc", "@type": "xsd:nonNegativeInteger"},
 | 
						|
                "library": {"@id": "fw:library", "@type": "@id"},
 | 
						|
                "track": {"@id": "fw:track", "@type": "@id"},
 | 
						|
                "cover": {"@id": "fw:cover", "@type": "as:Link"},
 | 
						|
                "album": {"@id": "fw:album", "@type": "@id"},
 | 
						|
                "artists": {"@id": "fw:artists", "@type": "@id", "@container": "@list"},
 | 
						|
                "released": {"@id": "fw:released", "@type": "xsd:date"},
 | 
						|
                "musicbrainzId": "fw:musicbrainzId",
 | 
						|
                "license": {"@id": "fw:license", "@type": "@id"},
 | 
						|
                "copyright": "fw:copyright",
 | 
						|
                "category": "schema:category",
 | 
						|
                "language": "schema:inLanguage",
 | 
						|
            }
 | 
						|
        },
 | 
						|
    },
 | 
						|
    {
 | 
						|
        "shortId": "LITEPUB",
 | 
						|
        "contextUrl": None,
 | 
						|
        "documentUrl": "http://litepub.social/ns",
 | 
						|
        # from https://git.pleroma.social/pleroma/pleroma/-/blob/release/2.2.3/priv/static/schemas/litepub-0.1.jsonld
 | 
						|
        "document": {
 | 
						|
            "@context": {
 | 
						|
                "Emoji": "toot:Emoji",
 | 
						|
                "Hashtag": "as:Hashtag",
 | 
						|
                "PropertyValue": "schema:PropertyValue",
 | 
						|
                "atomUri": "ostatus:atomUri",
 | 
						|
                "conversation": {"@id": "ostatus:conversation", "@type": "@id"},
 | 
						|
                "discoverable": "toot:discoverable",
 | 
						|
                "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
 | 
						|
                "capabilities": "litepub:capabilities",
 | 
						|
                "ostatus": "http://ostatus.org#",
 | 
						|
                "schema": "http://schema.org#",
 | 
						|
                "toot": "http://joinmastodon.org/ns#",
 | 
						|
                "value": "schema:value",
 | 
						|
                "sensitive": "as:sensitive",
 | 
						|
                "litepub": "http://litepub.social/ns#",
 | 
						|
                "invisible": "litepub:invisible",
 | 
						|
                "directMessage": "litepub:directMessage",
 | 
						|
                "listMessage": {"@id": "litepub:listMessage", "@type": "@id"},
 | 
						|
                "oauthRegistrationEndpoint": {
 | 
						|
                    "@id": "litepub:oauthRegistrationEndpoint",
 | 
						|
                    "@type": "@id",
 | 
						|
                },
 | 
						|
                "EmojiReact": "litepub:EmojiReact",
 | 
						|
                "ChatMessage": "litepub:ChatMessage",
 | 
						|
                "alsoKnownAs": {"@id": "as:alsoKnownAs", "@type": "@id"},
 | 
						|
            }
 | 
						|
        },
 | 
						|
    },
 | 
						|
]
 | 
						|
 | 
						|
CONTEXTS_BY_ID = {c["shortId"]: c for c in CONTEXTS}
 | 
						|
 | 
						|
 | 
						|
class NS:
 | 
						|
    def __init__(self, conf):
 | 
						|
        self.conf = conf
 | 
						|
        self.baseUrl = self.conf["document"]["@context"][self.conf["shortId"].lower()]
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return "<{}: {}>".format(self.conf["shortId"], self.baseUrl)
 | 
						|
 | 
						|
    def __getattr__(self, key):
 | 
						|
        if key not in self.conf["document"]["@context"]:
 | 
						|
            raise AttributeError(
 | 
						|
                "{} is not a valid property of context {}".format(key, self.baseUrl)
 | 
						|
            )
 | 
						|
        return self.baseUrl + key
 | 
						|
 | 
						|
 | 
						|
class NoopContext:
 | 
						|
    def __getattr__(self, key):
 | 
						|
        return "_:{}".format(key)
 | 
						|
 | 
						|
 | 
						|
NOOP = NoopContext()
 | 
						|
AS = NS(CONTEXTS_BY_ID["AS"])
 | 
						|
LDP = NS(CONTEXTS_BY_ID["LDP"])
 | 
						|
SEC = NS(CONTEXTS_BY_ID["SEC"])
 | 
						|
FW = NS(CONTEXTS_BY_ID["FW"])
 | 
						|
SC = NS(CONTEXTS_BY_ID["SC"])
 | 
						|
LITEPUB = NS(CONTEXTS_BY_ID["LITEPUB"])
 |