- From: Shane McCarron <shane@spec-ops.io>
- Date: Wed, 13 Jul 2016 14:52:25 -0500
- To: Robert Sanderson <azaroth42@gmail.com>
- Cc: Web Annotation <public-annotation@w3.org>
- Message-ID: <CAJdbnOCU-KU4HY4=s5NB1TeCiPMbgOVcUJ--XAFfEjxifiTM6g@mail.gmail.com>
I did a little more on this example to illustrate the point more fully. First look at the .test file: { "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld", "name": "There must be a body or a bodyValue property", "description": "Supply an example annotation that conforms to the basic structure.", "ref": "https://www.w3.org/TR/annotation-model/#model", "assertions": [ { "title": "There must be a body or a bodyValue property", "assertionType": "must", "expectedResult": "valid", "errorMessage": "Error: Annotation has no target relationships - at least 1 is required. (Section 3.1)", "comparison": "or", "assertions": [ "hasBody.json", "hasBodyValue.json" ] } ] } Then consider the two external .json files. They don't need to be external - it is just a little easier to read: hasBody.json { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Has a body property", "description": "'http://www.w3.org/ns/anno.jsonld must be' an @context value (Section 3.1)", "assertionType": "must", "expectedResult": "valid", "errorMessage": "There is no body property", "type": "object", "properties": { "body": { "oneOf": [ { "$ref": "stringURI.json#" }, { "type": "object", "oneOf": [ { "$ref": "textualBody.json#" }, { "$ref": "specificResource.json#" } ] } ] }, "required": [ "body" ] } } hasBodyValue.json { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Has a bodyValue property", "description": "'http://www.w3.org/ns/anno.jsonld must be' an @context value (Section 3.1)", "assertionType": "must", "expectedResult": "valid", "errorMessage": "There is no bodyValue property", "type": "object", "properties": { "bodyValue": { "type": "string" }, "required": [ "bodyValue" ] } } I haven't actually tested this, but I hope you can see the structure. You have a top level "or" to distinguish between the two main branches... then for each branch I have a json file that uses the definitions you helpfully provided and I select oneOf the options. On Wed, Jul 13, 2016 at 1:42 PM, Shane McCarron <shane@spec-ops.io> wrote: > The .test file syntax is defined at [1] (note that we are now living in > the formal web-platform-test repository; yay!). This syntax indicates at > the top level there is an "assertions" list. This list can, of course, > have only a single entry - where that entry is another list, a URI, > Assertion Object, or a Condition Object (Condition Object is a > specialization of an Assertion Object). An example of an "or" test is > contained in the document referenced at [1] in the section on Condition > Objects where it says: > > "assertions": [ > { "$schema": "http://json-schema.org/draft-04/schema#", > "title": "must have context or id", > "description": "A more complex example that allows one of many > options to pass", > "assertions": [ > { "title": "Condition Object", > "description": "A pseudo-test that will get a result from the > aggregate of its children", > "assertionType": "must", > "expectedResult": "valid", > "errorMessage": "Error: None of the various options were present", > "compareWith": "or", > "assertions": [ > "common/has_context.json", > "common/has_id.json" > ] > } > ] > } > ] > > In this example, there is a single "assertion" that has an "or" list of > assertions within it. Such a list permits the "or-ing" or the results of > the embedded assertions - in this case that there is a context or there is > an id. > > So, to get back to your request, you could that embedded "assertions" list > as : > > "assertionType": "must", > "errorMessage": "The annotation had neither a well formed body nor a well > formed bodyValue property", > "compareWith": "or", > "assertions": [ > { "title": "Has Body", > "description": "The annotation has a well formatted body property", > "assertions": [ > "hasBody.json" > ] > }, > { "title": "Has BodyValue", > "description": "The annotation has a well formatted bodyValue > property", > "assertions": [ > "hasBodyValue.json" > ] > } > ] > > > So it would evaluate those two things in an OR context and, if neither > passed, report the errorMessage. > > The external files hasBody,json and hasBodyValue.json would contain the > other logic: > > hasBody.json: > > { "$schema": "http://json-schema.org/draft-04/schema#", > "title": "is the Body property well formed", > "description": "Does the body property contain either a URI, a JSON > Object that is a textual body, or a JSON Object that is a specific > property", > "compareWith": "or", > "assertions": [ > ... > ] > } > > You get the idea. I can probably create a working example. However, this > is a pretty complicated case. Maybe we could start with something a little > simpler to demonstrate that it does what you want and then work our way up > to this? > > [1] > https://github.com/w3c/web-platform-tests/blob/master/annotation-model/CONTRIBUTING.md > > On Wed, Jul 13, 2016 at 10:21 AM, Robert Sanderson <azaroth42@gmail.com> > wrote: > >> Thanks Shane, I didn't find the OR syntax for the test (as opposed to >> within the schema itself). >> >> Could you (or someone) give an example of how the structured tests might >> work, as I must have missed it in the docs and current set of tests? In >> English, what I want to do is: >> >> * Test whether there's a body property or not >> * If there is, test if it's a JSON string. >> * If it is, test that it's a URI >> * If there is, test if it's a JSON object. >> * If it is, test if it's a TextualBody >> * If it is, test whether there's a value property or not >> * If there is, test that it's a string >> * ... >> * If it is, test if it's a SpecificResource >> * ... >> * Test whether there's a bodyValue property or not >> * If there is, test if it's a JSON string >> * Otherwise raise a warning that there's no body >> >> Where each of those is a separate schema, so they can be reused (e.g. >> value is used on many sorts of resources) >> >> Many thanks! >> >> Rob >> >> >> On Tue, Jul 12, 2016 at 4:13 PM, Shane McCarron <shane@spec-ops.io> >> wrote: >> >>> Umm... I am not clear what problem you are trying to solve. Regardless, >>> you can do what you express with the current syntax (which is not a >>> manifest). Each .test file expresses one or more assertions that will be >>> evaluated. You can have "or" clauses in the declarative syntax so you can >>> this OR this OR this OR this need to be true in order to satisfy the >>> requirements of the test. >>> >>> On Tue, Jul 12, 2016 at 6:01 PM, Robert Sanderson <azaroth42@gmail.com> >>> wrote: >>> >>>> >>>> All, >>>> >>>> After playing around with the schemas over the weekend, with a view to >>>> integrating them into my server implementation to validate the incoming >>>> annotations, I ran into some issues: >>>> >>>> * The tests are designed for humans to read the error message, not for >>>> machines to process the results ... some tests are okay to fail validation, >>>> some aren't. >>>> >>>> * There doesn't seem to be a way to descend into the referenced >>>> resources automatically. You need to run the specific resource tests >>>> against the specific resource by hand. >>>> >>>> * The processing patterns of the single with break or skip seems like >>>> it could be extended ... >>>> >>>> >>>> So what do people think about the following, if it's not too late to >>>> change things: >>>> >>>> * Continue with atomic tests for presence of a property, and then a >>>> separate one for the value of it >>>> * But do that in the framework testing "manifest" by testing for >>>> failure/success of the validation. >>>> >>>> For example, an automated system could descend into a SpecificResource >>>> as the body by: >>>> >>>> * Test that body exists >>>> -- OnFail: Warn (body is a SHOULD) >>>> -- OnSuccess: >>>> * Determine type of body >>>> -- uri? OnSuccess: Test URI-ness & goto next set of tests >>>> OnFail: SpecificResource? >>>> OnSuccess: Descend into SpecificResource >>>> tests >>>> OnFail: TextualBody? >>>> >>>> And so forth. >>>> The success/fail would be by the same $ref approach as the schema >>>> includes, and offset from the schema itself, so it can be reused in >>>> different parts of the overall set of tests. >>>> >>>> This would let us compose features at whatever level we think is >>>> appropriate for reporting, and give a good validation suite for the model >>>> that can be used completely programmatically by implementing the >>>> success/fail runner. >>>> [I did this runner already in python, it's a pretty easy piece of code, >>>> as one might expect] >>>> >>>> Thoughts? >>>> >>>> Rob >>>> >>>> -- >>>> Rob Sanderson >>>> Semantic Architect >>>> The Getty Trust >>>> Los Angeles, CA 90049 >>>> >>> >>> >>> >>> -- >>> Shane McCarron >>> Projects Manager, Spec-Ops >>> >> >> >> >> -- >> Rob Sanderson >> Semantic Architect >> The Getty Trust >> Los Angeles, CA 90049 >> > > > > -- > Shane McCarron > Projects Manager, Spec-Ops > -- Shane McCarron Projects Manager, Spec-Ops
Received on Wednesday, 13 July 2016 19:53:23 UTC