digitalbazaar / pyld

JSON-LD processor written in Python
https://json-ld.org/
Other
601 stars 128 forks source link

Invalid expansion with context containing empty list #159

Open georgkrause opened 3 years ago

georgkrause commented 3 years ago

I am currently trying to upgrade pyld to version 2.0.x. But sadly some of our test cases fail and I think thats due to an Bug in pyld.

The problem seems to be an empty {} as part of the context. Lets have a little example:

payload = {
    "id": "https://noop/federation/actors/demo",
    "outbox": "https://noop/federation/actors/demo/outbox",
    "inbox": "https://noop/federation/actors/demo/inbox",
    "preferredUsername": "demo",
    "type": "Person",
    "name": "demo",
    "followers": "https://noop/federation/actors/demo/followers",
    "following": "https://noop/federation/actors/demo/following",
    "manuallyApprovesFollowers": False,
    "@context": [
        "https://www.w3.org/ns/activitystreams",
        "https://w3id.org/security/v1",
        {}
    ],
    "endpoints": {"sharedInbox": "https://noop/federation/shared/inbox"},
}

print(jsonld.expand(payload))

The result of this is a simple []. I verified the same code with the JSON-LD Playground and there the result is, as I would expect:

[
  {
    "https://www.w3.org/ns/activitystreams#endpoints": [
      {
        "https://www.w3.org/ns/activitystreams#sharedInbox": [
          {
            "@id": "https://noop/federation/shared/inbox"
          }
        ]
      }
    ],
    "https://www.w3.org/ns/activitystreams#followers": [
      {
        "@id": "https://noop/federation/actors/demo/followers"
      }
    ],
    "https://www.w3.org/ns/activitystreams#following": [
      {
        "@id": "https://noop/federation/actors/demo/following"
      }
    ],
    "@id": "https://noop/federation/actors/demo",
    "http://www.w3.org/ns/ldp#inbox": [
      {
        "@id": "https://noop/federation/actors/demo/inbox"
      }
    ],
    "_:manuallyApprovesFollowers": [
      {
        "@value": "False"
      }
    ],
    "https://www.w3.org/ns/activitystreams#name": [
      {
        "@value": "demo"
      }
    ],
    "https://www.w3.org/ns/activitystreams#outbox": [
      {
        "@id": "https://noop/federation/actors/demo/outbox"
      }
    ],
    "https://www.w3.org/ns/activitystreams#preferredUsername": [
      {
        "@value": "demo"
      }
    ],
    "@type": [
      "https://www.w3.org/ns/activitystreams#Person"
    ]
  }
]

So I tested the same expansion with pyld but without the empty list as part of the context, and the result is as expected:

[
  {
    "https://www.w3.org/ns/activitystreams#endpoints": [
      {
        "https://www.w3.org/ns/activitystreams#sharedInbox": [
          {
            "@id": "https://noop/federation/shared/inbox"
          }
        ]
      }
    ],
    "https://www.w3.org/ns/activitystreams#followers": [
      {
        "@id": "https://noop/federation/actors/demo/followers"
      }
    ],
    "https://www.w3.org/ns/activitystreams#following": [
      {
        "@id": "https://noop/federation/actors/demo/following"
      }
    ],
    "@id": "https://noop/federation/actors/demo",
    "http://www.w3.org/ns/ldp#inbox": [
      {
        "@id": "https://noop/federation/actors/demo/inbox"
      }
    ],
    "_:manuallyApprovesFollowers": [
      {
        "@value": false
      }
    ],
    "https://www.w3.org/ns/activitystreams#name": [
      {
        "@value": "demo"
      }
    ],
    "https://www.w3.org/ns/activitystreams#outbox": [
      {
        "@id": "https://noop/federation/actors/demo/outbox"
      }
    ],
    "https://www.w3.org/ns/activitystreams#preferredUsername": [
      {
        "@value": "demo"
      }
    ],
    "@type": [
      "https://www.w3.org/ns/activitystreams#Person"
    ]
  }
]
georgkrause commented 3 years ago

The example shows the issue with an dict, not as I said with an empty list. But the problem occurs with both: An empty list and an empty dict.