changeset 31:271ec3abdfa3

Use "$type" as the schema's type specifier instead of "type". THIS IS BACKWARDS INCOMPATIBLE.
author Franz Glasner <f.glasner@feldmann-mg.com>
date Tue, 18 Jul 2023 14:28:52 +0200
parents 2e7c08c356ee
children 7c95d24256e3
files data_schema/__init__.py docs/schema.txt tests/schemata/test1.schema.yml tests/test_schema.py
diffstat 4 files changed, 302 insertions(+), 302 deletions(-) [+]
line wrap: on
line diff
--- a/data_schema/__init__.py	Sat Jul 08 20:45:36 2023 +0200
+++ b/data_schema/__init__.py	Tue Jul 18 14:28:52 2023 +0200
@@ -540,21 +540,21 @@
 
     # 3. Real validation
 
-    # check combinator shortcuts without "type" indirection
+    # check combinator shortcuts without "$type" indirection
     combinator, combinator_schema = _get_one_of(
         schema, "not", "all-of", "any-of", "one-of")
     if combinator is None:
         try:
-            t = schema["type"]
+            t = schema["$type"]
         except KeyError:
-            raise SchemaError("Schema has no `type' key: {!r}."
+            raise SchemaError("Schema has no `$type' key: {!r}."
                               " Context: {!s}".format(schema, context))
     else:
         #
         # Construct a temporary schema with the proper indirection for
         # the check below
         #
-        t = {"type": {combinator: combinator_schema}}
+        t = {"$type": {combinator: combinator_schema}}
         if combinator_schema is None:
             raise SchemaError("a combinator requires a child")
     if callable(t):
@@ -758,7 +758,7 @@
     try:
         schema_items = schema.ensure_child_schema(schema["items"])
     except KeyError:
-        schema_items = _Schema(schema, False, {"type": validate_deny})
+        schema_items = _Schema(schema, False, {"$type": validate_deny})
     for idx, o in enumerate(obj):
         new_context = Context(parent=context, index=idx, current_object=o)
         yield from _validate(o, schema_items, new_context)
@@ -782,7 +782,7 @@
     try:
         schema_items = schema.ensure_child_schema(schema["items"])
     except KeyError:
-        schema_items = _Schema(schema, False, {"type": validate_deny})
+        schema_items = _Schema(schema, False, {"$type": validate_deny})
     for o in obj:
         new_context = Context(parent=context, key=o, current_object=o)
         yield from _validate(o, schema_items, new_context)
--- a/docs/schema.txt	Sat Jul 08 20:45:36 2023 +0200
+++ b/docs/schema.txt	Tue Jul 18 14:28:52 2023 +0200
@@ -64,7 +64,7 @@
 Typen
 =====
 
-Durch ``type`` (required) gekennzeichnet
+Durch ``$type`` (required) gekennzeichnet
 
 
 Alle Schemata außer den `Schema-Kombinatoren`_ haben auch ein optionales
@@ -91,7 +91,7 @@
   Wenn vorhanden: ein Schema, dem die *Keys* -- auch die `additional-keys` --
   folgen müssen.
 
-  Default: entspricht ``{"type": "string"}``
+  Default: entspricht ``{"$type": "string"}``
 
 - ``additional-keys``
 
--- a/tests/schemata/test1.schema.yml	Sat Jul 08 20:45:36 2023 +0200
+++ b/tests/schemata/test1.schema.yml	Tue Jul 18 14:28:52 2023 +0200
@@ -5,10 +5,10 @@
 %YAML 1.1
 ---
 
-type: dict
+$type: dict
 keys:
   string-value:
-    type: string
+    $type: string
     min-length: 1
     max-length: 255
     pattern:
@@ -17,111 +17,111 @@
         - &CALLABLE !!python/name:test_schema._test_generic_validator_for_yaml
 
   binary-value:
-    type: binary
+    $type: binary
     min-length: 20
     max-length: 256
     value: *CALLABLE
 
   int-value:
-    type: int
+    $type: int
     min-value: 0
     max-value: 100
     value: *CALLABLE
 
   float-value:
-    type: float
+    $type: float
     min-value: 0.0
     max-value: 50.0
     value: *CALLABLE
 
   numeric-value:
-    type: number
+    $type: number
     min-value: 0
     max-value: 1000
     value: *CALLABLE
 
   scalar-value:
-    type: scalar
+    $type: scalar
 
   bool-value:
-    type: bool
+    $type: bool
     value: *CALLABLE
 
   timestamp-value:
-    type: timestamp
+    $type: timestamp
     value: *CALLABLE
 
   null-value:
-    type: null
+    $type: null
 
   empty-value:
-    type: empty
+    $type: empty
 
   any-value:
-    type: accept
+    $type: accept
 
   not-any-value-allowed:
-    type: deny
+    $type: deny
 
   custom-value:
-    type: *CALLABLE
+    $type: *CALLABLE
 
   dict-value:
-    type: dict
+    $type: dict
     keys:
       key1:
-        type: accept
+        $type: accept
       0:
-        type: accept
+        $type: accept
       1:
-        type: accept
+        $type: accept
     key-names:
       one-of:
-        - type: string
-        - type: integer
+        - $type: string
+        - $type: integer
           min-value: 0
     additional-keys:
-      type: accept         # equivalent to the simpler: additional-keys: true
+      $type: accept         # equivalent to the simpler: additional-keys: true
     required:
       - key1
       - 0
 
   list-value:
-    type: list
+    $type: list
     min-length: 1
     max-length: 10
     items:
       any-of:
-        - type: scalar
-        - type: *CALLABLE
+        - $type: scalar
+        - $type: *CALLABLE
 
   record-value:
-    type: record
+    $type: record
     items:
-      - type: string
-      - type: number
+      - $type: string
+      - $type: number
     min-length: 2
     max-length: 2
     additional-items: false
 
   combinator-one-of:
     one-of:
-      - type: int
-      - type: float
-      - type: null
+      - $type: int
+      - $type: float
+      - $type: null
 
   combinator-all-of:
     all-of:
       - &NAME 
-        type:      string
+        $type:      string
         max-length: 255
         pattern: *NAMERE
-      - type: *CALLABLE
+      - $type: *CALLABLE
 
   combinator-any-of:
     any-of:
       - *NAME
-      - type: *CALLABLE
+      - $type: *CALLABLE
       - null
 
 additional-keys: false
--- a/tests/test_schema.py	Sat Jul 08 20:45:36 2023 +0200
+++ b/tests/test_schema.py	Tue Jul 18 14:28:52 2023 +0200
@@ -589,20 +589,20 @@
             None, root_object={"foo": "bar", "foo2": None}, settings=None)
 
     def test_no_cond(self):
-        schema = data_schema._Schema(None, True, {"type": None})
+        schema = data_schema._Schema(None, True, {"$type": None})
         self.assertIs(data_schema.process_schema_conditionals(
                           schema, self._ctx),
                       schema)
 
     def test_cond_is_none(self):
-        schema = data_schema._Schema(None, True, {"type": None,
+        schema = data_schema._Schema(None, True, {"$type": None,
                                                   "cond": None})
         self.assertIs(data_schema.process_schema_conditionals(
                           schema, self._ctx),
                       schema)
 
     def test_ambiguous(self):
-        schema = data_schema._Schema(None, True, {"type": None,
+        schema = data_schema._Schema(None, True, {"$type": None,
                                                   "cond": None,
                                                   "match": None})
         self.assertRaises(
@@ -612,8 +612,8 @@
             self._ctx)
 
     def test_cond_not_a_sequence(self):
-        schema = data_schema._Schema(None, True, {"type": None,
-                                                  "cond": {"type": None}})
+        schema = data_schema._Schema(None, True, {"$type": None,
+                                                  "cond": {"$type": None}})
         self.assertRaises(
             data_schema.SchemaError,
             data_schema.process_schema_conditionals,
@@ -622,8 +622,8 @@
 
     def test_match_not_a_sequence(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
-                         "match": {"type": None}})
+            None, True, {"$type": None,
+                         "match": {"$type": None}})
         self.assertRaises(
             data_schema.SchemaError,
             data_schema.process_schema_conditionals,
@@ -631,7 +631,7 @@
             self._ctx)
 
     def test_condline_not_a_dict(self):
-        schema = data_schema._Schema(None, True, {"type": None,
+        schema = data_schema._Schema(None, True, {"$type": None,
                                                   "cond": [None]})
         self.assertRaises(
             data_schema.SchemaError,
@@ -640,7 +640,7 @@
             self._ctx)
 
     def test_matchline_not_a_dict(self):
-        schema = {"type": None,
+        schema = {"$type": None,
                   "match": [None]}
         self.assertRaises(
             data_schema.SchemaError,
@@ -650,7 +650,7 @@
 
     def test_cond_unknown_predicate(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "cond": [
                              {"unexisting-when-xxxx": None,
                               "then": {}}
@@ -663,7 +663,7 @@
 
     def test_match_unknown_predicate(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "match": [
                              {"unexisting-when-xxxx": None,
                               "then": {}}
@@ -676,7 +676,7 @@
 
     def test_simple_replace_when_true(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when": True,
@@ -694,7 +694,7 @@
 
     def test_simple_replace_when_not_false(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when": {"not": False},
@@ -712,7 +712,7 @@
 
     def test_simple_merge_when_true(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "old-key": "here I am",
                          "cond": [
@@ -733,7 +733,7 @@
 
     def test_simple_replace_first_wins_1(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha", "hehe"],
                          "cond": [
                              {"when": True,
@@ -753,7 +753,7 @@
 
     def test_simple_replace_first_wins_2(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha", "hehe"],
                          "cond": [
                              {"when": False,
@@ -774,7 +774,7 @@
 
     def test_simple_replace_when_false(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when": False,
@@ -791,7 +791,7 @@
 
     def test_simple_replace_when_ref_true(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when-ref-true": '#foo',
@@ -809,7 +809,7 @@
 
     def test_simple_replace_when_ref_true_2(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when": {"ref-true": '#foo'},
@@ -827,7 +827,7 @@
 
     def test_simple_replace_when_ref_is_not_true(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when-ref-true": '#not-a-foo',
@@ -844,7 +844,7 @@
 
     def test_simple_replace_when_ref_is_not_true_2(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when": {"ref-true": '#not-a-foo'},
@@ -861,7 +861,7 @@
 
     def test_simple_replace_when_ref_exists(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when-ref-exists": '#foo2',
@@ -883,7 +883,7 @@
 
     def test_simple_replace_when_ref_exists_2(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "require": ["huhu", "haha"],
                          "cond": [
                              {"when": {"ref-exists": '#foo2'},
@@ -905,7 +905,7 @@
 
     def test_simple_replace_when_ref_exists_is_false(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "cond": [
                              {"when-ref-exists": '#foo-not-existing',
                               "then": {
@@ -925,7 +925,7 @@
 
     def test_simple_replace_when_ref_exists_is_false_2(self):
         schema = data_schema._Schema(
-            None, True, {"type": None,
+            None, True, {"$type": None,
                          "cond": [
                              {"when": {"ref-exists": '#foo-not-existing'},
                               "then": {
@@ -950,13 +950,13 @@
                     True,
                     {"ref-exists": '#foo2'},
                     {"ref-true": '#foo'}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertEqual("string", r["type"])
+        self.assertEqual("string", r["$type"])
 
     def test_allOf_false(self):
         schema = data_schema._Schema(
@@ -965,13 +965,13 @@
                     True,
                     {"ref-exists": '#foo-non-existing'},
                     {"ref-true": '#foo'}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertIsNone(r["type"])
+        self.assertIsNone(r["$type"])
 
     def test_short_allOf_true(self):
         schema = data_schema._Schema(
@@ -980,13 +980,13 @@
                     True,
                     {"ref-exists": '#foo2'},
                     {"ref-true": '#foo'}],
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertEqual("string", r["type"])
+        self.assertEqual("string", r["$type"])
 
     def test_short_allOf_false(self):
         schema = data_schema._Schema(
@@ -995,13 +995,13 @@
                     True,
                     {"ref-exists": '#foo-non-existing'},
                     {"ref-true": '#foo'}],
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertIsNone(r["type"])
+        self.assertIsNone(r["$type"])
 
     def test_anyOf_true(self):
         schema = data_schema._Schema(
@@ -1010,13 +1010,13 @@
                     False,
                     {"ref-exists": '#foo2'},
                     {"ref-true": '#foo'}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertEqual("string", r["type"])
+        self.assertEqual("string", r["$type"])
 
     def test_anyOf_false(self):
         schema = data_schema._Schema(
@@ -1025,13 +1025,13 @@
                     False,
                     {"ref-exists": '#foo2-non'},
                     {"ref-true": '#foo2'}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertIsNone(r["type"])
+        self.assertIsNone(r["$type"])
 
     def test_oneOf_true(self):
         schema = data_schema._Schema(
@@ -1040,13 +1040,13 @@
                     False,
                     {"ref-exists": '#foo2'},
                     {"not": {"ref-true": '#foo'}}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertEqual("string", r["type"])
+        self.assertEqual("string", r["$type"])
 
     def test_oneOf_false(self):
         schema = data_schema._Schema(
@@ -1055,13 +1055,13 @@
                     False,
                     {"ref-exists": '#foo2'},
                     {"ref-true": '#foo'}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertIsNone(r["type"])
+        self.assertIsNone(r["$type"])
 
     def test_oneOf_false_2(self):
         schema = data_schema._Schema(
@@ -1070,13 +1070,13 @@
                     False,
                     {"not": {"ref-exists": '#foo2'}},
                     {"not": {"ref-true": '#foo'}}]},
-                 "then": {"type": "string"}},
+                 "then": {"$type": "string"}},
                 {"when": True,
-                 "then": {"type": None}}
+                 "then": {"$type": None}}
             ]})
         r = data_schema.process_schema_conditionals(schema, self._ctx)
         self.assertIsNot(r, schema)
-        self.assertIsNone(r["type"])
+        self.assertIsNone(r["$type"])
 
     def test_match_nothing(self):
         schema = data_schema._Schema(
@@ -1217,7 +1217,7 @@
             None, True, {"foos": "bar",
                          "match": [{
                              "when": {
-                                 "equals": {"type": None},
+                                 "equals": {"$type": None},
                                  "then-replace": {
                                      "foos": "new-bar"}}}]
                      })
@@ -1345,7 +1345,7 @@
     def test_raise_if_scheme_ref_is_not_the_single_key(self):
         schema = data_schema._Schema(
             None, True, {"$ref": "schema:#/",
-                         "type": None
+                         "$type": None
                      })
         ctx = data_schema.Context(
             None, root_schema=schema, settings=None)
@@ -1359,7 +1359,7 @@
         schema = data_schema._Schema(
             None, True, {"$ref": "schema:#/subschema",
                          "subschema": {
-                             "type": None
+                             "$type": None
                          }
                      })
         ctx = data_schema.Context(
@@ -1368,11 +1368,11 @@
             schema,
             ctx,
             check_single_ref_key=False)
-        self.assertEqual({"type": None}, r)
+        self.assertEqual({"$type": None}, r)
 
     def test_recursive_schema_scheme(self):
         barschema = {
-            "type": "null"
+            "$type": "null"
         }
         fooschema = {
             "$ref": "schema:#/bar"
@@ -1388,15 +1388,15 @@
             schema,
             ctx,
             check_single_ref_key=False)
-        self.assertEqual({"type": "null"}, r)
+        self.assertEqual({"$type": "null"}, r)
 
     def test_recursive_schema_scheme_raises_if_non_root_is_not_single_key(self):
         barschema = {
-            "type": "null"
+            "$type": "null"
         }
         fooschema = {
             "$ref": "schema:#/bar",
-            "type": "dict",
+            "$type": "dict",
         }
         schema = data_schema._Schema(
             None, True, {
@@ -1415,7 +1415,7 @@
 
     def test_recursive_schema_scheme_ref_to_non_existing_schema_raises(self):
         barschema = {
-            "type": "null"
+            "$type": "null"
         }
         fooschema = {
             "$ref": "schema:#/non-bar",
@@ -1476,21 +1476,21 @@
         self.assertEqual(SEVERITY.WARNING, v.severity)
 
     def test_d1(self):
-        x = list(data_schema.validate({}, {"type": "dict"}))
+        x = list(data_schema.validate({}, {"$type": "dict"}))
         self.assertEqual(0, len(x))
 
     def test_d1_not_nullable(self):
-        x = list(data_schema.validate(None, {"type": "dict"}))
+        x = list(data_schema.validate(None, {"$type": "dict"}))
         self.assertEqual(1, len(x))
         self.assertEqual(ERRORS.E10000, x[0].code)
 
     def test_d1_nullable(self):
-        x = list(data_schema.validate(None, {"type": "dict",
+        x = list(data_schema.validate(None, {"$type": "dict",
                                              "nullable": True}))
         self.assertEqual(0, len(x))
 
     def test_d2(self):
-        x = list(data_schema.validate([], {"type": "map"}))
+        x = list(data_schema.validate([], {"$type": "map"}))
         self.assertEqual(1, len(x))
         self.assertEqual(SEVERITY.ERROR, x[0].severity)
         self.assertEqual(ERRORS.E10000, x[0].code)
@@ -1498,7 +1498,7 @@
     def test_d3(self):
         x = list(data_schema.validate(
             {"key": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "required": ["key2"]}))
         self.assertEqual(2, len(x))
         self.assertEqual(SEVERITY.ERROR, x[0].severity)
@@ -1511,9 +1511,9 @@
     def test_d4(self):
         x = list(data_schema.validate(
             {"key": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "keys": {
-                 "key": {"type": "string"},
+                 "key": {"$type": "string"},
              },
              "required": ["key"]}))
         self.assertEqual(0, len(x))
@@ -1521,7 +1521,7 @@
     def test_d5(self):
         x = list(data_schema.validate(
             {"key": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": False}))
         self.assertEqual(1, len(x))
         self.assertEqual(ERRORS.E10004, x[0].code)
@@ -1530,7 +1530,7 @@
     def test_d5_2(self):
         x = list(data_schema.validate(
             {"key": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": False},
             skip_keys=["key"]))
         self.assertEqual(0, len(x))
@@ -1539,7 +1539,7 @@
         x = list(data_schema.validate(
             {"key": "value",
              "key2": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": False},
             skip_keys=[re.compile(r"\Akey\d*\Z")]))
         self.assertEqual(0, len(x))
@@ -1548,7 +1548,7 @@
         x = list(data_schema.validate(
             {"key": "value",
              "key2": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": False},
             skip_keys=[re.compile(r"\A__.+"), re.compile(r"\Akey\d+\Z")]))
         self.assertEqual(1, len(x))
@@ -1558,24 +1558,24 @@
     def test_d6(self):
         x = list(data_schema.validate(
             {"key": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": True}))
         self.assertEqual(0, len(x))
 
     def test_d7(self):
         x = list(data_schema.validate(
             {"key": "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": {
-                 "type": "string"}}))
+                 "$type": "string"}}))
         self.assertEqual(0, len(x))
 
     def test_d8(self):
         x = list(data_schema.validate(
             {"key": 1234},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": {
-                 "type": "string"}}))
+                 "$type": "string"}}))
         self.assertEqual(1, len(x))
         self.assertEqual(ERRORS.E10002, x[0].code)
         self.assertEqual(1234, x[0].hint)
@@ -1583,16 +1583,16 @@
     def test_d8_2(self):
         x = list(data_schema.validate(
             {"key": 1234},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": {
-                 "type": "string"}},
+                 "$type": "string"}},
             skip_keys=["key"]))
         self.assertEqual(0, len(x))
 
     def test_d9_non_string_keys(self):
         pr = list(data_schema.validate(
             {0: "value"},
-            {"type": "dict",
+            {"$type": "dict",
              "additional-keys": True}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10003, pr[0].code)
@@ -1600,11 +1600,11 @@
     def test_d10_int_dict_keys(self):
         pr = list(data_schema.validate(
             {1: "value", 2: "value2"},
-            {"type": "dict",
+            {"$type": "dict",
              "keys": {
-                 1: {"type": "string"}},
+                 1: {"$type": "string"}},
              "additional-keys": True,
-             "key-names": {"type": "int"}}))
+             "key-names": {"$type": "int"}}))
         self.assertEqual(0, len(pr))
 
     def test_error_message(self):
@@ -1624,20 +1624,20 @@
     def test_str_enum(self):
         pr = list(data_schema.validate(
             "e1",
-            {"type": "string",
+            {"$type": "string",
              "enum": ["e1", "e2"]}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             "e2",
-            {"type": "string",
+            {"$type": "string",
              "enum": ["e1", "e2"]}))
         self.assertEqual(0, len(pr))
 
     def test_str_not_in_enum(self):
         pr = list(data_schema.validate(
             "e3",
-            {"type": "string",
+            {"$type": "string",
              "enum": ["e1", "e2"]}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10043, pr[0].code)
@@ -1645,46 +1645,46 @@
     def test_str_minlen(self):
         pr = list(data_schema.validate(
             "",
-            {"type": "string",
+            {"$type": "string",
              "min-length": 0}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             "",
-            {"type": "string",
+            {"$type": "string",
              "min-length": 1}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10006, pr[0].code)
 
         pr = list(data_schema.validate(
             "x",
-            {"type": "string",
+            {"$type": "string",
              "min-length": 1}))
         self.assertEqual(0, len(pr))
 
     def test_str_maxlen(self):
         pr = list(data_schema.validate(
             "",
-            {"type": "string",
+            {"$type": "string",
              "max-length": 0}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             "x",
-            {"type": "string",
+            {"$type": "string",
              "max-length": 0}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10007, pr[0].code)
 
         pr = list(data_schema.validate(
             "x",
-            {"type": "string",
+            {"$type": "string",
              "max-length": 1}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             b"x",
-            {"type": "string",
+            {"$type": "string",
              "max-length": 1}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10002, pr[0].code)
@@ -1697,27 +1697,27 @@
     def test_str_re(self):
         pr = list(data_schema.validate(
             "abc",
-            {"type": "string",
+            {"$type": "string",
              "pattern": r'\A[0-9]+\Z'}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10008, pr[0].code)
 
         pr = list(data_schema.validate(
             "123",
-            {"type": "string",
+            {"$type": "string",
              "pattern": re.compile(r'\A[a-z]+\Z')}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10008, pr[0].code)
 
         pr = list(data_schema.validate(
             "123",
-            {"type": "string",
+            {"$type": "string",
              "pattern": self._pattern_check_function}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             " 5   ",
-            {"type": "string",
+            {"$type": "string",
              "pattern": self._pattern_check_function}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10009, pr[0].code)
@@ -1725,13 +1725,13 @@
     def test_binary_basic(self):
         pr = list(data_schema.validate(
             b"",
-            {"type": "binary"}))
+            {"$type": "binary"}))
         self.assertEqual(0, len(pr))
 
     def test_str_is_not_binary(self):
         pr = list(data_schema.validate(
             "",
-            {"type": "binary"}))
+            {"$type": "binary"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10035, pr[0].code)
 
@@ -1743,13 +1743,13 @@
     def test_binary_pattern_check(self):
         pr = list(data_schema.validate(
             b"\x00",
-            {"type": "binary",
+            {"$type": "binary",
              "pattern": self._binary_pattern_check_function}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             b"\x01",
-            {"type": "binary",
+            {"$type": "binary",
              "pattern": self._binary_pattern_check_function}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10009, pr[0].code)
@@ -1757,21 +1757,21 @@
     def test_binary_re_str_match(self):
         pr = list(data_schema.validate(
             b"\x00\x00\x00",
-            {"type": "binary",
+            {"$type": "binary",
              "pattern": u"\\x00+"}))
         self.assertEqual(0, len(pr))
 
     def test_binary_re_bytes_match(self):
         pr = list(data_schema.validate(
             b"\x00\x00\x00",
-            {"type": "binary",
+            {"$type": "binary",
              "pattern": b"\x00+"}))
         self.assertEqual(0, len(pr))
 
     def test_binary_re_str_mismatch(self):
         pr = list(data_schema.validate(
             b"\x00\x00\x00",
-            {"type": "binary",
+            {"$type": "binary",
              "pattern": u"\\x01+"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10047, pr[0].code)
@@ -1779,7 +1779,7 @@
     def test_binary_re_bytes_mismatch(self):
         pr = list(data_schema.validate(
             b"\x00\x00\x00",
-            {"type": "binary",
+            {"$type": "binary",
              "pattern": b"\x01+"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10047, pr[0].code)
@@ -1787,66 +1787,66 @@
     def test_binary_length(self):
         pr = list(data_schema.validate(
             b"",
-            {"type": "binary",
+            {"$type": "binary",
              "min-length": 1}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10036, pr[0].code)
 
         pr = list(data_schema.validate(
             b"1",
-            {"type": "binary",
+            {"$type": "binary",
              "max-length": 0}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10037, pr[0].code)
 
     def test_deny(self):
-        pr = list(data_schema.validate("abc", {"type": "deny"}))
+        pr = list(data_schema.validate("abc", {"$type": "deny"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10010, pr[0].code)
 
     def test_accept(self):
-        pr = list(data_schema.validate("abc", {"type": "accept"}))
+        pr = list(data_schema.validate("abc", {"$type": "accept"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(None, {"type": "accept"}))
+        pr = list(data_schema.validate(None, {"$type": "accept"}))
         self.assertEqual(0, len(pr))
 
     def test_null(self):
-        pr = list(data_schema.validate(None, {"type": "none"}))
+        pr = list(data_schema.validate(None, {"$type": "none"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(None, {"type": "null"}))
+        pr = list(data_schema.validate(None, {"$type": "null"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(None, {"type": "nil"}))
+        pr = list(data_schema.validate(None, {"$type": "nil"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(None, {"type": None}))
+        pr = list(data_schema.validate(None, {"$type": None}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate({}, {"type": None}))
+        pr = list(data_schema.validate({}, {"$type": None}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10011, pr[0].code)
 
     def test_l1(self):
-        pr = list(data_schema.validate([], {"type": "list"}))
+        pr = list(data_schema.validate([], {"$type": "list"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(tuple(), {"type": "list"}))
+        pr = list(data_schema.validate(tuple(), {"$type": "list"}))
         self.assertEqual(0, len(pr))
 
     def test_l1_not_nullable(self):
-        pr = list(data_schema.validate(None, {"type": "list"}))
+        pr = list(data_schema.validate(None, {"$type": "list"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10001, pr[0].code)
 
     def test_l1_nullable(self):
         pr = list(data_schema.validate(
-            None, {"type": "list", "nullable": True}))
+            None, {"$type": "list", "nullable": True}))
         self.assertEqual(0, len(pr))
 
     def test_l2_default_schema_for_items_is_deny(self):
-        pr = list(data_schema.validate(["a", "b", "c"], {"type": "list"}))
+        pr = list(data_schema.validate(["a", "b", "c"], {"$type": "list"}))
         self.assertEqual(3, len(pr))
         for i in range(0, 3):
             self.assertEqual(ERRORS.E10010, pr[i].code)
@@ -1854,45 +1854,45 @@
     def test_l3_schema_for_items(self):
         pr = list(data_schema.validate(
             ["a", "b", "c"],
-            {"type": "array",
-             "items": {"type": "string"}}))
+            {"$type": "array",
+             "items": {"$type": "string"}}))
         self.assertEqual(0, len(pr))
 
     def test_t1(self):
-        pr = list(data_schema.validate([], {"type": "tuple"}))
+        pr = list(data_schema.validate([], {"$type": "tuple"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(tuple(), {"type": "tuple"}))
+        pr = list(data_schema.validate(tuple(), {"$type": "tuple"}))
         self.assertEqual(0, len(pr))
 
     def test_t1_not_nullable(self):
-        pr = list(data_schema.validate(None, {"type": "tuple"}))
+        pr = list(data_schema.validate(None, {"$type": "tuple"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10014, pr[0].code)
 
     def test_t1_nullable(self):
         pr = list(data_schema.validate(
-            None, {"type": "tuple", "nullable": True}))
+            None, {"$type": "tuple", "nullable": True}))
         self.assertEqual(0, len(pr))
 
     def test_t2(self):
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "items": [
-                 {"type": "string"},
-                 {"type": None},
-                 {"type": "accept"}]}))
+                 {"$type": "string"},
+                 {"$type": None},
+                 {"$type": "accept"}]}))
         self.assertEqual(0, len(pr))
 
     def test_t3(self):
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "items": [
-                 {"type": "string"},
-                 {"type": None},
-                 {"type": "deny"}]}))
+                 {"$type": "string"},
+                 {"$type": None},
+                 {"$type": "deny"}]}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10010, pr[0].code)
         self.assertEqual(2, pr[0].context.index)
@@ -1900,10 +1900,10 @@
     def test_t4(self):
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "items": [
-                 {"type": "string"},
-                 {"type": None}]}))
+                 {"$type": "string"},
+                 {"$type": None}]}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10017, pr[0].code)
         self.assertEqual(2, pr[0].context.index)
@@ -1911,23 +1911,23 @@
     def test_t5(self):
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "items": [
-                 {"type": "string"},
-                 {"type": None}],
+                 {"$type": "string"},
+                 {"$type": None}],
              "additional-items": True}))
         self.assertEqual(0, len(pr))
 
     def test_t6(self):
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}, {"key": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "items": [
-                 {"type": "string"},
-                 {"type": None}],
+                 {"$type": "string"},
+                 {"$type": None}],
              "additional-items": {
-                 "type": "dict",
-                 "keys": {"key": {"type": "string"}}
+                 "$type": "dict",
+                 "keys": {"key": {"$type": "string"}}
              }}))
         self.assertEqual(0, len(pr))
 
@@ -1935,14 +1935,14 @@
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}, {"key": "value"}, {"key2": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "max-length": 4,
              "items": [
-                 {"type": "string"},
-                 {"type": None}],
+                 {"$type": "string"},
+                 {"$type": None}],
              "additional-items": {
-                 "type": "dict",
-                 "keys": {"key": {"type": "string"}}
+                 "$type": "dict",
+                 "keys": {"key": {"$type": "string"}}
              }}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10016, pr[0].code)
@@ -1951,15 +1951,15 @@
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             ["a", None, {"key": "value"}, {"key": "value"}, {"key2": "value"}],
-            {"type": "tuple",
+            {"$type": "tuple",
              "min-length": 6,
              "max-length": 4,
              "items": [
-                 {"type": "string"},
-                 {"type": None}],
+                 {"$type": "string"},
+                 {"$type": None}],
              "additional-items": {
-                 "type": "dict",
-                 "keys": {"key": {"type": "string"}}
+                 "$type": "dict",
+                 "keys": {"key": {"$type": "string"}}
              }}))
         self.assertEqual(2, len(pr))
         self.assertEqual(ERRORS.E10015, pr[0].code)
@@ -1969,11 +1969,11 @@
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             set(["a", None, "b"]),
-            {"type": "set",
+            {"$type": "set",
              "min-length": 3,
              "items": {"any-of": [
-                 {"type": "string"},
-                 {"type": None}]}}
+                 {"$type": "string"},
+                 {"$type": None}]}}
              ))
         self.assertEqual(0, len(pr))
 
@@ -1981,7 +1981,7 @@
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             None,
-            {"type": "set"}))
+            {"$type": "set"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10038, pr[0].code)
 
@@ -1989,18 +1989,18 @@
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             None,
-            {"type": "set", "nullable": True}))
+            {"$type": "set", "nullable": True}))
         self.assertEqual(0, len(pr))
 
     def test_set2(self):
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             set(["a", None, "b"]),
-            {"type": "set",
+            {"$type": "set",
              "min-length": 4,
              "items": {"any-of": [
-                 {"type": "string"},
-                 {"type": None}]}}
+                 {"$type": "string"},
+                 {"$type": None}]}}
              ))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10039, pr[0].code)
@@ -2009,11 +2009,11 @@
         # do not check anything that exceeds max-length
         pr = list(data_schema.validate(
             set(["a", None, "b"]),
-            {"type": "set",
+            {"$type": "set",
              "max-length": 2,
              "items": {"any-of": [
-                 {"type": "string"},
-                 {"type": None}]}}
+                 {"$type": "string"},
+                 {"$type": None}]}}
              ))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10040, pr[0].code)
@@ -2021,10 +2021,10 @@
     def test_set4_itemschema(self):
         pr = list(data_schema.validate(
             set(["a", None, "b"]),
-            {"type": "set",
+            {"$type": "set",
              "items": {"any-of": [
-                 {"type": "string"},
-                 {"type": "int"}]}}
+                 {"$type": "string"},
+                 {"$type": "int"}]}}
              ))
         codes = set([p.code for p in pr])
 
@@ -2039,58 +2039,58 @@
         self.assertEqual(ERRORS.E10020, pr[0].cause[1].cause[0].code)
 
     def test_empty(self):
-        pr = list(data_schema.validate(None, {"type": "empty"}))
+        pr = list(data_schema.validate(None, {"$type": "empty"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate([], {"type": "empty"}))
+        pr = list(data_schema.validate([], {"$type": "empty"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(["a"], {"type": "empty"}))
+        pr = list(data_schema.validate(["a"], {"$type": "empty"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10018, pr[0].code)
 
-        pr = list(data_schema.validate(tuple(), {"type": "empty"}))
+        pr = list(data_schema.validate(tuple(), {"$type": "empty"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(set(), {"type": "empty"}))
+        pr = list(data_schema.validate(set(), {"$type": "empty"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(frozenset(), {"type": "empty"}))
+        pr = list(data_schema.validate(frozenset(), {"$type": "empty"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(tuple(["a"]), {"type": "empty"}))
+        pr = list(data_schema.validate(tuple(["a"]), {"$type": "empty"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10018, pr[0].code)
 
-        pr = list(data_schema.validate({}, {"type": "empty"}))
+        pr = list(data_schema.validate({}, {"$type": "empty"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate({"key": "value"}, {"type": "empty"}))
+        pr = list(data_schema.validate({"key": "value"}, {"$type": "empty"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10018, pr[0].code)
 
-        pr = list(data_schema.validate("", {"type": "empty"}))
+        pr = list(data_schema.validate("", {"$type": "empty"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10018, pr[0].code)
 
     def test_allOf(self):
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "all-of": [
-                    {"type": None},
-                    {"type": "accept"},
+                    {"$type": None},
+                    {"$type": "accept"},
                 ]
             }}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "all-of": [
-                    {"type": None},
-                    {"type": "accept"},
-                    {"type": "deny"},
+                    {"$type": None},
+                    {"$type": "accept"},
+                    {"$type": "deny"},
                 ]
             }}))
         self.assertEqual(1, len(pr))
@@ -2103,20 +2103,20 @@
     def test_anyOf(self):
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "any-of": [
-                    {"type": "deny"},
-                    {"type": None},
+                    {"$type": "deny"},
+                    {"$type": None},
                 ]
             }}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "any-of": [
-                    {"type": "string"},
-                    {"type": "deny"},
+                    {"$type": "string"},
+                    {"$type": "deny"},
                 ]
             }}))
         self.assertEqual(1, len(pr))
@@ -2132,17 +2132,17 @@
     def test_anyOf_with_list(self):
         pr = list(data_schema.validate(
             None,
-            {"type": [
-                {"type": "deny"},
-                {"type": None},
+            {"$type": [
+                {"$type": "deny"},
+                {"$type": None},
             ]}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             None,
-            {"type": [
-                {"type": "string"},
-                {"type": "deny"},
+            {"$type": [
+                {"$type": "string"},
+                {"$type": "deny"},
             ]}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10055, pr[0].code)
@@ -2157,20 +2157,20 @@
     def test_oneOf(self):
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "one-of": [
-                    {"type": "deny"},
-                    {"type": None},
+                    {"$type": "deny"},
+                    {"$type": None},
                 ]
             }}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "one-of": [
-                    {"type": "string"},
-                    {"type": "deny"},
+                    {"$type": "string"},
+                    {"$type": "deny"},
                 ]
             }}))
 
@@ -2186,12 +2186,12 @@
 
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "one-of": [
-                    {"type": "string"},
-                    {"type": "deny"},
-                    {"type": "empty"},
-                    {"type": None},
+                    {"$type": "string"},
+                    {"$type": "deny"},
+                    {"$type": "empty"},
+                    {"$type": None},
                 ]
             }}))
         self.assertEqual(1, len(pr))
@@ -2201,50 +2201,50 @@
     def test_not(self):
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "not": {
-                    "type": "empty"}}}))
+                    "$type": "empty"}}}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10029, pr[0].code)
 
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "not": {
-                    "type": {
+                    "$type": {
                         "not": {
-                            "type": "empty"}}}}}))
+                            "$type": "empty"}}}}}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             2,
-            {"type": {
+            {"$type": {
                 "not": {
-                    "type": "int"}}}))
+                    "$type": "int"}}}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10029, pr[0].code)
 
         pr = list(data_schema.validate(
             1,
-            {"type": {
+            {"$type": {
                 "not": {
-                    "type": {
+                    "$type": {
                         "not": {
-                            "type": "int"}}}}}))
+                            "$type": "int"}}}}}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             2.0,
-            {"type": {
+            {"$type": {
                 "not": {
-                    "type": "int"}}}))
+                    "$type": "int"}}}))
         self.assertEqual(0, len(pr))
 
     def test_not_shortcut(self):
         pr = list(data_schema.validate(
             None,
             {"not": {
-                "type": "empty"}}))
+                "$type": "empty"}}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10029, pr[0].code)
 
@@ -2252,13 +2252,13 @@
             None,
             {"not": {
                 "not": {
-                    "type": "empty"}}}))
+                    "$type": "empty"}}}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             2,
             {"not": {
-                "type": "int"}}))
+                "$type": "int"}}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10029, pr[0].code)
 
@@ -2266,26 +2266,26 @@
             1,
             {"not": {
                 "not": {
-                    "type": "int"}}}))
+                    "$type": "int"}}}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             2.0,
             {"not": {
-                "type": "int"}}))
+                "$type": "int"}}))
         self.assertEqual(0, len(pr))
 
     def test_integer(self):
-        pr = list(data_schema.validate(1, {"type": "integer"}))
+        pr = list(data_schema.validate(1, {"$type": "integer"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(1, {"type": "float"}))
+        pr = list(data_schema.validate(1, {"$type": "float"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10023, pr[0].code)
 
         pr = list(data_schema.validate(
             2,
-            {"type": "int",
+            {"$type": "int",
              "min-value": 3,
              "max-value": 1}))
 
@@ -2294,16 +2294,16 @@
         self.assertEqual(ERRORS.E10022, pr[1].code)
 
     def test_float(self):
-        pr = list(data_schema.validate(1.8, {"type": "float"}))
+        pr = list(data_schema.validate(1.8, {"$type": "float"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(1, {"type": "float"}))
+        pr = list(data_schema.validate(1, {"$type": "float"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10023, pr[0].code)
 
         pr = list(data_schema.validate(
             2.0,
-            {"type": "real",
+            {"$type": "real",
              "min-value": 2.1,
              "max-value": 1.9}))
 
@@ -2312,14 +2312,14 @@
         self.assertEqual(ERRORS.E10025, pr[1].code)
 
     def test_number(self):
-        pr = list(data_schema.validate(1.8, {"type": "number"}))
+        pr = list(data_schema.validate(1.8, {"$type": "number"}))
         self.assertEqual(0, len(pr))
-        pr = list(data_schema.validate(1, {"type": "num"}))
+        pr = list(data_schema.validate(1, {"$type": "num"}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             2.0,
-            {"type": "number",
+            {"$type": "number",
              "min-value": 3,
              "max-value": 1.3}))
 
@@ -2327,45 +2327,45 @@
         self.assertEqual(ERRORS.E10031, pr[0].code)
         self.assertEqual(ERRORS.E10032, pr[1].code)
 
-        pr = list(data_schema.validate({}, {"type": "number"}))
+        pr = list(data_schema.validate({}, {"$type": "number"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10030, pr[0].code)
 
     def test_bool(self):
-        pr = list(data_schema.validate(True, {"type": "bool"}))
+        pr = list(data_schema.validate(True, {"$type": "bool"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(True, {"type": "boolean",
+        pr = list(data_schema.validate(True, {"$type": "boolean",
                                               "value": True}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(True, {"type": "boolean",
+        pr = list(data_schema.validate(True, {"$type": "boolean",
                                               "value": False}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10028, pr[0].code)
 
-        pr = list(data_schema.validate(False, {"type": "boolean"}))
+        pr = list(data_schema.validate(False, {"$type": "boolean"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(False, {"type": "boolean",
+        pr = list(data_schema.validate(False, {"$type": "boolean",
                                                "value": False}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(False, {"type": "boolean",
+        pr = list(data_schema.validate(False, {"$type": "boolean",
                                                "value": True}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10027, pr[0].code)
 
     def test_bool_real(self):
-        pr = list(data_schema.validate([1, 2], {"type": "bool"}))
+        pr = list(data_schema.validate([1, 2], {"$type": "bool"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10026, pr[0].code)
 
-        pr = list(data_schema.validate([], {"type": "bool"}))
+        pr = list(data_schema.validate([], {"$type": "bool"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10026, pr[0].code)
 
-        pr = list(data_schema.validate(None, {"type": "bool"}))
+        pr = list(data_schema.validate(None, {"$type": "bool"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10026, pr[0].code)
 
@@ -2378,65 +2378,65 @@
     def test_timestamp(self):
         pr = list(data_schema.validate(
             datetime.datetime.utcnow(),
-            {"type": "timestamp"}))
+            {"$type": "timestamp"}))
 
         pr = list(data_schema.validate(
             datetime.datetime.fromtimestamp(180000),
-            {"type": "datetime",
+            {"$type": "datetime",
              "value": self._check_value_ts}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(
             datetime.datetime.fromtimestamp(0),
-            {"type": "datetime",
+            {"$type": "datetime",
              "value": self._check_value_ts}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10042, pr[0].code)
 
     def test_scalar(self):
-        pr = list(data_schema.validate(1, {"type": "scalar"}))
+        pr = list(data_schema.validate(1, {"$type": "scalar"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate("", {"type": "scalar"}))
+        pr = list(data_schema.validate("", {"$type": "scalar"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(False, {"type": "scalar"}))
+        pr = list(data_schema.validate(False, {"$type": "scalar"}))
         self.assertEqual(0, len(pr))
 
         pr = list(data_schema.validate(datetime.datetime.utcnow(),
-                                       {"type": "scalar"}))
+                                       {"$type": "scalar"}))
         self.assertEqual(0, len(pr))
 
-        pr = list(data_schema.validate(None, {"type": "scalar"}))
+        pr = list(data_schema.validate(None, {"$type": "scalar"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10033, pr[0].code)
 
-        pr = list(data_schema.validate({}, {"type": "scalar"}))
+        pr = list(data_schema.validate({}, {"$type": "scalar"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10033, pr[0].code)
 
-        pr = list(data_schema.validate([], {"type": "scalar"}))
+        pr = list(data_schema.validate([], {"$type": "scalar"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10033, pr[0].code)
 
-        pr = list(data_schema.validate(tuple(), {"type": "scalar"}))
+        pr = list(data_schema.validate(tuple(), {"$type": "scalar"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10033, pr[0].code)
 
-        pr = list(data_schema.validate(set(), {"type": "scalar"}))
+        pr = list(data_schema.validate(set(), {"$type": "scalar"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10033, pr[0].code)
 
-        pr = list(data_schema.validate(frozenset(), {"type": "scalar"}))
+        pr = list(data_schema.validate(frozenset(), {"$type": "scalar"}))
         self.assertEqual(1, len(pr))
         self.assertEqual(ERRORS.E10033, pr[0].code)
 
         pr = list(data_schema.validate(
             None,
-            {"type": {
+            {"$type": {
                 "one-of": [
-                    {"type": "scalar"},
-                    {"type": None},
+                    {"$type": "scalar"},
+                    {"$type": None},
                 ]}}))
         self.assertEqual(0, len(pr))