From f7249ae88c0057542270d84539d0011280d9c82b Mon Sep 17 00:00:00 2001
From: Lars Trieloff <trieloff@adobe.com>
Date: Wed, 25 Apr 2018 14:11:14 +0000
Subject: [PATCH] Basic testing for `@id` prperty

---
 examples/docs/README.md                | 22 ----------------------
 examples/docs/abstract.schema.md       |  6 +++---
 examples/docs/arrays.schema.md         |  6 +++---
 examples/docs/complex.schema.md        |  6 +++---
 examples/docs/constants.schema.md      |  6 +++---
 examples/docs/custom.schema.md         |  6 +++---
 examples/docs/deepextending.schema.md  |  6 +++---
 examples/docs/definitions.schema.md    |  6 +++---
 examples/docs/enums.schema.md          |  6 +++---
 examples/docs/example.schema.md        |  6 +++---
 examples/docs/examples.schema.md       |  6 +++---
 examples/docs/extending.schema.md      |  6 +++---
 examples/docs/extensible.schema.md     |  6 +++---
 examples/docs/simple.schema.md         |  6 +++---
 examples/docs/simpletypes.schema.md    |  6 +++---
 examples/docs/stabilizing.schema.md    |  6 +++---
 examples/docs/subdir/subdir.schema.md  |  6 +++---
 examples/schemas/extending.schema.json |  2 +-
 lib/header.js                          | 12 ++++++++++++
 spec/lib/header.spec.js                |  6 +++---
 20 files changed, 64 insertions(+), 74 deletions(-)

diff --git a/examples/docs/README.md b/examples/docs/README.md
index 896a8a1..fbbb817 100644
--- a/examples/docs/README.md
+++ b/examples/docs/README.md
@@ -3,25 +3,3 @@
  # Readme
 
 
-
-## /
-
-* [Abstract](./abstract.schema.md) – `https://example.com/schemas/abstract`
-* [Arrays](./arrays.schema.md) – `https://example.com/schemas/arrays`
-* [Complex References ](./complex.schema.md) – `https://example.com/schemas/complex`
-* [Constant Types](./constants.schema.md) – `https://example.com/schemas/constants`
-* [Custom](./custom.schema.md) – `https://example.com/schemas/custom`
-* [Deeply Extending](./deepextending.schema.md) – `https://example.com/schemas/deepextending`
-* [Definitions](./definitions.schema.md) – `https://example.com/schemas/definitions`
-* [Enumerated ](./enums.schema.md) – `https://example.com/schemas/enums`
-* [Example](./example.schema.md) – `https://example.com/schemas/example`
-* [Examples](./examples.schema.md) – `https://example.com/schemas/examples`
-* [Extending](./extending.schema.md) – `https://example.com/schemas/extending`
-* [Extensible](./extensible.schema.md) – `https://example.com/schemas/extensible`
-* [Simple](./simple.schema.md) – `https://example.com/schemas/simple`
-* [Simple Types](./simpletypes.schema.md) – `https://example.com/schemas/simpletypes`
-* [Stabilizing](./stabilizing.schema.md) – `https://example.com/schemas/stabilizing`
-
-## /subdir/
-
-* [Subdir](./subdir/subdir.schema.md) – `https://example.com/schemas/subdir/subdir`
diff --git a/examples/docs/abstract.schema.md b/examples/docs/abstract.schema.md
index a4e4b7e..fdd7b67 100644
--- a/examples/docs/abstract.schema.md
+++ b/examples/docs/abstract.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/abstract
 
 This is an abstract schema. It has `definitions`, but does not declare any properties
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Cannot be instantiated | Yes | Experimental | Forbidden | Permitted | [abstract.schema.json](abstract.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Cannot be instantiated | Yes | Experimental | No | Forbidden | Permitted | [abstract.schema.json](abstract.schema.json) |
 
 # Abstract Definitions
 
diff --git a/examples/docs/arrays.schema.md b/examples/docs/arrays.schema.md
index 7b224d4..15d3d81 100644
--- a/examples/docs/arrays.schema.md
+++ b/examples/docs/arrays.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/arrays
 
 This is an example schema with examples for multiple array types and their constraints.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [arrays.schema.json](arrays.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [arrays.schema.json](arrays.schema.json) |
 
 # Arrays Properties
 
diff --git a/examples/docs/complex.schema.md b/examples/docs/complex.schema.md
index 44679c2..1a04dcd 100644
--- a/examples/docs/complex.schema.md
+++ b/examples/docs/complex.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/complex
 
 This is an example schema that uses types defined in other schemas.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [complex.schema.json](complex.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [complex.schema.json](complex.schema.json) |
 ## Schema Hierarchy
 
 * Complex References  `https://example.com/schemas/complex`
diff --git a/examples/docs/constants.schema.md b/examples/docs/constants.schema.md
index 4dce795..cf4c387 100644
--- a/examples/docs/constants.schema.md
+++ b/examples/docs/constants.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/constants
 
 This is an example schema with examples for properties with constant values
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [constants.schema.json](constants.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [constants.schema.json](constants.schema.json) |
 
 # Constant Types Properties
 
diff --git a/examples/docs/custom.schema.md b/examples/docs/custom.schema.md
index fae3a98..d2971e1 100644
--- a/examples/docs/custom.schema.md
+++ b/examples/docs/custom.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/custom
 
 This is an extensible schema. It has `definitions`, that can be used in other schemas. Additionally, it allows custom properties.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | Yes | Experimental | Allowed | Permitted | [custom.schema.json](custom.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | Yes | Experimental | No | Allowed | Permitted | [custom.schema.json](custom.schema.json) |
 
 # Custom Properties
 
diff --git a/examples/docs/deepextending.schema.md b/examples/docs/deepextending.schema.md
index 3c1fc44..0878dff 100644
--- a/examples/docs/deepextending.schema.md
+++ b/examples/docs/deepextending.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/deepextending
 
 This is an extending schema. It is extending another extending schema. It pulls `definitions` from other schemas.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | Yes | Experimental | Forbidden | Permitted | [deepextending.schema.json](deepextending.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | Yes | Experimental | No | Forbidden | Permitted | [deepextending.schema.json](deepextending.schema.json) |
 ## Schema Hierarchy
 
 * Deeply Extending `https://example.com/schemas/deepextending`
diff --git a/examples/docs/definitions.schema.md b/examples/docs/definitions.schema.md
index 97bceaa..f05804a 100644
--- a/examples/docs/definitions.schema.md
+++ b/examples/docs/definitions.schema.md
@@ -28,9 +28,9 @@ aks.
 > Everything is better with a quote.
 
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | Yes | Experimental | Forbidden | Permitted | [definitions.schema.json](definitions.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | Yes | Experimental | No | Forbidden | Permitted | [definitions.schema.json](definitions.schema.json) |
 
 # Definitions Properties
 
diff --git a/examples/docs/enums.schema.md b/examples/docs/enums.schema.md
index 61b3a56..3b4ea10 100644
--- a/examples/docs/enums.schema.md
+++ b/examples/docs/enums.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/enums
 
 This is an example schema with examples for properties with enum values
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [enums.schema.json](enums.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [enums.schema.json](enums.schema.json) |
 
 # Enumerated  Properties
 
diff --git a/examples/docs/example.schema.md b/examples/docs/example.schema.md
index a606dbc..39a7d67 100644
--- a/examples/docs/example.schema.md
+++ b/examples/docs/example.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/example
 
 This is an example schema with examples. Too many examples? There can never be too many examples!
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [example.schema.json](example.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [example.schema.json](example.schema.json) |
 
 ## Example Example
 ```json
diff --git a/examples/docs/examples.schema.md b/examples/docs/examples.schema.md
index cddde01..5d4aa2c 100644
--- a/examples/docs/examples.schema.md
+++ b/examples/docs/examples.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/examples
 
 This is an example schema with *multiple* examples. Too many examples? There can never be too many examples!
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [examples.schema.json](examples.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [examples.schema.json](examples.schema.json) |
 
 ## Examples Examples
 
diff --git a/examples/docs/extending.schema.md b/examples/docs/extending.schema.md
index a34d9c6..77314a3 100644
--- a/examples/docs/extending.schema.md
+++ b/examples/docs/extending.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/extending
 
 This is an extending schema. It pulls `definitions` from other schemas.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | Yes | Experimental | Forbidden | Permitted | [extending.schema.json](extending.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | Yes | Experimental | No | Forbidden | Permitted | [extending.schema.json](extending.schema.json) |
 ## Schema Hierarchy
 
 * Extending `https://example.com/schemas/extending`
diff --git a/examples/docs/extensible.schema.md b/examples/docs/extensible.schema.md
index 4582a93..edf1e5c 100644
--- a/examples/docs/extensible.schema.md
+++ b/examples/docs/extensible.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/extensible
 
 This is an extensible schema. It has `definitions`, that can be used in other schemas
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Cannot be instantiated | Yes | Experimental | Forbidden | Permitted | [extensible.schema.json](extensible.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Cannot be instantiated | Yes | Experimental | No | Forbidden | Permitted | [extensible.schema.json](extensible.schema.json) |
 
 # Extensible Definitions
 
diff --git a/examples/docs/simple.schema.md b/examples/docs/simple.schema.md
index 6327fbf..b801c02 100644
--- a/examples/docs/simple.schema.md
+++ b/examples/docs/simple.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/simple
 
 This is a *very* simple example of a JSON schema. There is only one property.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [simple.schema.json](simple.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [simple.schema.json](simple.schema.json) |
 
 # Simple Properties
 
diff --git a/examples/docs/simpletypes.schema.md b/examples/docs/simpletypes.schema.md
index 6e89018..b030c5a 100644
--- a/examples/docs/simpletypes.schema.md
+++ b/examples/docs/simpletypes.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/simpletypes
 
 This is an example schema with examples for multiple types and their constraints.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [simpletypes.schema.json](simpletypes.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [simpletypes.schema.json](simpletypes.schema.json) |
 
 # Simple Types Properties
 
diff --git a/examples/docs/stabilizing.schema.md b/examples/docs/stabilizing.schema.md
index 56c022f..cc1a082 100644
--- a/examples/docs/stabilizing.schema.md
+++ b/examples/docs/stabilizing.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/stabilizing
 
 This is a schema which is currently in the `stabilizing` status.
 
-| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Custom Properties | Additional Properties | Defined In |
-|----------------------------|------------|------------------------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Stabilizing | Forbidden | Permitted | [stabilizing.schema.json](stabilizing.schema.json) |
+| [Abstract](../abstract.md) | Extensible | [Status](../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------------------------|------------|------------------------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Stabilizing | No | Forbidden | Permitted | [stabilizing.schema.json](stabilizing.schema.json) |
 
 # Stabilizing Properties
 
diff --git a/examples/docs/subdir/subdir.schema.md b/examples/docs/subdir/subdir.schema.md
index 54bd0ab..259b69e 100644
--- a/examples/docs/subdir/subdir.schema.md
+++ b/examples/docs/subdir/subdir.schema.md
@@ -11,9 +11,9 @@ https://example.com/schemas/subdir/subdir
 
 A schema in a sub directory
 
-| [Abstract](../../abstract.md) | Extensible | [Status](../../status.md) | Custom Properties | Additional Properties | Defined In |
-|-------------------------------|------------|---------------------------|-------------------|-----------------------|------------|
-| Cannot be instantiated | Yes | Experimental | Forbidden | Permitted | [subdir/subdir.schema.json](subdir/subdir.schema.json) |
+| [Abstract](../../abstract.md) | Extensible | [Status](../../status.md) | Identifiable | Custom Properties | Additional Properties | Defined In |
+|-------------------------------|------------|---------------------------|--------------|-------------------|-----------------------|------------|
+| Cannot be instantiated | Yes | Experimental | No | Forbidden | Permitted | [subdir/subdir.schema.json](subdir/subdir.schema.json) |
 
 # Subdir Definitions
 
diff --git a/examples/schemas/extending.schema.json b/examples/schemas/extending.schema.json
index 5056f53..5d13224 100644
--- a/examples/schemas/extending.schema.json
+++ b/examples/schemas/extending.schema.json
@@ -32,4 +32,4 @@
       { "$ref": "https://example.com/schemas/definitions#/definitions/myid" },
       { "$ref": "#/definitions/third" }
     ]
-}
\ No newline at end of file
+}
diff --git a/lib/header.js b/lib/header.js
index e20c200..215bbd3 100644
--- a/lib/header.js
+++ b/lib/header.js
@@ -83,6 +83,17 @@ function link(indir, filename, inlink) {
   }
 }
 
+function isIdentifiable(schema) {
+  if (!schema.properties) {
+    return 'Unknown';
+  }
+  if (schema.properties['@id']&&schema.properties['@id'].type==='string'&&schema.properties['@id'].format==='uri') {
+    return 'Yes';
+  } else {
+    return 'No';
+  }
+}
+
 function headers(schema, indir, filename, docs, outdir) {
   const props = schemaProps(schema, indir, filename);
   this.doclinks = docs ? docs : {};
@@ -91,6 +102,7 @@ function headers(schema, indir, filename, docs, outdir) {
   this.myheaders.push(new Header('Abstract', link(indir, filename, this.doclinks['abstract']), props.abstract));
   this.myheaders.push(new Header('Extensible', link(indir, filename, this.doclinks['extensible']), props.extensible));
   this.myheaders.push(new Header('Status', link(indir, filename, this.doclinks['status']), props.status));
+  this.myheaders.push(new Header('Identifiable', link(indir, filename, this.doclinks['id']), isIdentifiable(schema)));
   this.myheaders.push(new Header('Custom Properties', link(indir, filename, this.doclinks['custom']), props.custom));
   this.myheaders.push(new Header('Additional Properties', link(indir, filename, this.doclinks['additional']), schema.additionalProperties===false ? 'Forbidden' : 'Permitted'));
   this.myheaders.push(new Header('Defined In', undefined, props.original, props.original));
diff --git a/spec/lib/header.spec.js b/spec/lib/header.spec.js
index 547fd4c..194cdd9 100644
--- a/spec/lib/header.spec.js
+++ b/spec/lib/header.spec.js
@@ -39,9 +39,9 @@ describe('Headers Integration Test', () => {
 
     const h = headers(schema, '/home/lars', '/home/lars/complex.schema.json');
 
-    const result = `| Abstract | Extensible | Status | Custom Properties | Additional Properties | Defined In |
-|----------|------------|--------|-------------------|-----------------------|------------|
-| Can be instantiated | No | Experimental | Forbidden | Permitted | [complex.schema.json](complex.schema.json) |`;
+    const result = `| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In |
+|----------|------------|--------|--------------|-------------------|-----------------------|------------|
+| Can be instantiated | No | Experimental | No | Forbidden | Permitted | [complex.schema.json](complex.schema.json) |`;
     expect(h.render()).toEqual(result);
   });
 
-- 
GitLab