Repository: altair-viz/altair
Pull request #564 (2018-03-09 19:20:37)

MAINT: fix behavior of from_dict
This is a maintenance fix for a subtle bug I came across. The issue was that when running ``from_dict``, altair would consider any subclass of ``SchemaBase`` as a potential wrapper for the generated class hierarchy.

What this meant is that if you, say, imported both vega-lite and vega wrappers, you could get cross-talk between them when using from_dict if they had common schemas.

This PR changes the auto-generated code so that each set of wrappers inherits from its own special base class, which ensures that this kind of cross-talk does not happen.


Patch:
diff --git a/altair/expr/core.py b/altair/expr/core.py
index ba4bce59..7c3df7bc 100644
--- a/altair/expr/core.py
+++ b/altair/expr/core.py
@@ -36,14 +36,7 @@ class Expression(SchemaBase):
     a Python syntax. Calling ``repr(obj)`` will return a Javascript
     representation of the object and the operations it encodes.
     """
-    # can't use {type: 'string'} directly because then this type would be
-    # picked up by ToDict mechanism.
-    _schema = {
-        '$ref': '#/definitions/JSExpressionType',
-        'definitions': {
-            'JSExpressionType': {'type': 'string'}
-        }
-    }
+    _schema = {'type': 'string'}
 
     def to_dict(self, *args, **kwargs):
         return repr(self)
diff --git a/altair/utils/schemapi.py b/altair/utils/schemapi.py
index 875bf665..6cafb804 100644
--- a/altair/utils/schemapi.py
+++ b/altair/utils/schemapi.py
@@ -81,11 +81,10 @@ Undefined = UndefinedType()
 class SchemaBase(object):
     """Base class for schema wrappers.
 
-    Each derived class should set the _json_schema class attribute which is
-    used for validation. If not specified in the class definition, an
-    appropriate __init__ function will be generated by SchemaBaseMeta.
+    Each derived class should set the _schema class attribute (and optionally
+    the _rootschema class attribute) which is used for validation.
     """
-    _schema = {}
+    _schema = None
     _rootschema = None
     _class_is_valid_at_instantiation = True
 
@@ -94,6 +93,11 @@ class SchemaBase(object):
         # derived classes:
         # - a single arg with no kwds, for, e.g. {'type': 'string'}
         # - zero args with zero or more kwds for {'type': 'object'}
+        if self._schema is None:
+            raise ValueError("Cannot instantiate object of type {0}: "
+                             "_schema class attribute is not defined."
+                             "".format(self.__class__))
+
         if kwds:
             assert len(args) == 0
         else:
@@ -259,7 +263,12 @@ class SchemaBase(object):
         return json.dumps(dct, indent=indent, sort_keys=sort_keys, **kwargs)
 
     @classmethod
-    def from_dict(cls, dct, validate=True):
+    def _default_wrapper_classes(cls):
+        """Return the set of classes used within cls.from_dict()"""
+        return SchemaBase.__subclasses__()
+
+    @classmethod
+    def from_dict(cls, dct, validate=True, _wrapper_classes=None):
         """Construct class from a dictionary representation
 
         Parameters
@@ -268,6 +277,10 @@ class SchemaBase(object):
             The dict from which to construct the class
         validate : boolean
             If True (default), then validate the input against the schema.
+        _wrapper_classes : list (optional)
+            The set of SchemaBase classes to use when constructing wrappers
+            of the dict inputs. If not specified, the result of
+            cls._default_wrapper_classes will be used.
 
         Returns
         -------
@@ -281,9 +294,12 @@ class SchemaBase(object):
         """
         if validate:
             cls.validate(dct)
-        converter = _FromDict(SchemaBase.__subclasses__())
+        if _wrapper_classes is None:
+            _wrapper_classes = cls._default_wrapper_classes()
+        converter = _FromDict(_wrapper_classes)
         return converter.from_dict(constructor=cls, root=cls,
                                    schema=cls._schema, dct=dct)
+
     @classmethod
     def from_json(cls, json_string, validate=True, **kwargs):
         """Instantiate the object from a valid JSON string
@@ -344,7 +360,8 @@ class _FromDict(object):
         # This lets us quickly determine the correct class to construct
         self.class_dict = collections.defaultdict(list)
         for cls in class_list:
-            self.class_dict[self.hash_schema(cls._schema)].append(cls)
+            if cls._schema is not None:
+                self.class_dict[self.hash_schema(cls._schema)].append(cls)
 
     @classmethod
     def hash_schema(cls, schema, use_json=True):
diff --git a/altair/vega/v2/schema/core.py b/altair/vega/v2/schema/core.py
index 4dc05de5..98361cf7 100644
--- a/altair/vega/v2/schema/core.py
+++ b/altair/vega/v2/schema/core.py
@@ -13,7 +13,13 @@ def load_schema():
         return json.load(f)
 
 
-class Root(SchemaBase):
+class VegaSchema(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return VegaSchema.__subclasses__()
+
+
+class Root(VegaSchema):
     """Root schema wrapper
     
     allOf(container, Mapping(required=[]))
@@ -31,7 +37,7 @@ class Root(SchemaBase):
                                    width=width, **kwds)
 
 
-class axis(SchemaBase):
+class axis(VegaSchema):
     """axis schema wrapper
     
     Mapping(required=[type, scale])
@@ -94,7 +100,7 @@ class axis(SchemaBase):
                                    **kwds)
 
 
-class background(SchemaBase):
+class background(VegaSchema):
     """background schema wrapper
     
     string
@@ -106,7 +112,7 @@ class background(SchemaBase):
         super(background, self).__init__(*args)
 
 
-class data(SchemaBase):
+class data(VegaSchema):
     """data schema wrapper
     
     allOf(Mapping(required=[name]), anyOf(Mapping(required=[name, modify]), 
@@ -119,7 +125,7 @@ class data(SchemaBase):
         super(data, self).__init__(name=name, format=format, modify=modify, transform=transform, **kwds)
 
 
-class legend(SchemaBase):
+class legend(VegaSchema):
     """legend schema wrapper
     
     anyOf(Mapping(required=[size]), Mapping(required=[shape]), Mapping(required=[fill]), 
@@ -135,7 +141,7 @@ class legend(SchemaBase):
         super(legend, self).__init__(*args, **kwds)
 
 
-class mark(SchemaBase):
+class mark(VegaSchema):
     """mark schema wrapper
     
     Mapping(required=[type])
@@ -171,7 +177,7 @@ class mark(SchemaBase):
                                    name=name, properties=properties, **kwds)
 
 
-class container(SchemaBase):
+class container(VegaSchema):
     """container schema wrapper
     
     Mapping(required=[])
@@ -198,7 +204,7 @@ class container(SchemaBase):
                                         scene=scene, **kwds)
 
 
-class groupMark(SchemaBase):
+class groupMark(VegaSchema):
     """groupMark schema wrapper
     
     allOf(Mapping(required=[type]), mark, container)
@@ -215,7 +221,7 @@ class groupMark(SchemaBase):
                                         **kwds)
 
 
-class visualMark(SchemaBase):
+class visualMark(VegaSchema):
     """visualMark schema wrapper
     
     allOf(not Mapping(required=[]), mark)
@@ -229,7 +235,7 @@ class visualMark(SchemaBase):
                                          key=key, name=name, properties=properties, **kwds)
 
 
-class modify(SchemaBase):
+class modify(VegaSchema):
     """modify schema wrapper
     
     List(oneOf(Mapping(required=[type, signal]), Mapping(required=[type, predicate]), 
@@ -242,7 +248,7 @@ class modify(SchemaBase):
         super(modify, self).__init__(*args)
 
 
-class padding(SchemaBase):
+class padding(VegaSchema):
     """padding schema wrapper
     
     oneOf(enum('strict', 'auto'), float, Mapping(required=[]))
@@ -254,7 +260,7 @@ class padding(SchemaBase):
         super(padding, self).__init__(*args, **kwds)
 
 
-class predicate(SchemaBase):
+class predicate(VegaSchema):
     """predicate schema wrapper
     
     oneOf(Mapping(required=[name, type, operands]), Mapping(required=[name, type, operands]), 
@@ -267,7 +273,7 @@ class predicate(SchemaBase):
         super(predicate, self).__init__(*args, **kwds)
 
 
-class rule(SchemaBase):
+class rule(VegaSchema):
     """rule schema wrapper
     
     anyOf(Mapping(required=[]), Mapping(required=[]))
@@ -279,7 +285,7 @@ class rule(SchemaBase):
         super(rule, self).__init__(*args, **kwds)
 
 
-class propset(SchemaBase):
+class propset(VegaSchema):
     """propset schema wrapper
     
     Mapping(required=[])
@@ -411,7 +417,7 @@ class propset(SchemaBase):
                                       x=x, x2=x2, xc=xc, y=y, y2=y2, yc=yc, **kwds)
 
 
-class signal(SchemaBase):
+class signal(VegaSchema):
     """signal schema wrapper
     
     Mapping(required=[name])
@@ -440,7 +446,7 @@ class signal(SchemaBase):
                                      verbose=verbose, **kwds)
 
 
-class spec(SchemaBase):
+class spec(VegaSchema):
     """spec schema wrapper
     
     allOf(container, Mapping(required=[]))
@@ -458,7 +464,7 @@ class spec(SchemaBase):
                                    width=width, **kwds)
 
 
-class streams(SchemaBase):
+class streams(VegaSchema):
     """streams schema wrapper
     
     List(Mapping(required=[type, expr]))
@@ -470,7 +476,7 @@ class streams(SchemaBase):
         super(streams, self).__init__(*args)
 
 
-class aggregateTransform(SchemaBase):
+class aggregateTransform(VegaSchema):
     """aggregateTransform schema wrapper
     
     Mapping(required=[type])
@@ -492,7 +498,7 @@ class aggregateTransform(SchemaBase):
         super(aggregateTransform, self).__init__(type=type, groupby=groupby, summarize=summarize, **kwds)
 
 
-class binTransform(SchemaBase):
+class binTransform(VegaSchema):
     """binTransform schema wrapper
     
     Mapping(required=[type, field])
@@ -535,7 +541,7 @@ class binTransform(SchemaBase):
                                            step=step, steps=steps, **kwds)
 
 
-class crossTransform(SchemaBase):
+class crossTransform(VegaSchema):
     """crossTransform schema wrapper
     
     Mapping(required=[type])
@@ -562,7 +568,7 @@ class crossTransform(SchemaBase):
                                              **kwds)
 
 
-class countpatternTransform(SchemaBase):
+class countpatternTransform(VegaSchema):
     """countpatternTransform schema wrapper
     
     Mapping(required=[type])
@@ -591,7 +597,7 @@ class countpatternTransform(SchemaBase):
                                                     pattern=pattern, stopwords=stopwords, **kwds)
 
 
-class linkpathTransform(SchemaBase):
+class linkpathTransform(VegaSchema):
     """linkpathTransform schema wrapper
     
     Mapping(required=[type])
@@ -627,7 +633,7 @@ class linkpathTransform(SchemaBase):
                                                 tension=tension, **kwds)
 
 
-class facetTransform(SchemaBase):
+class facetTransform(VegaSchema):
     """facetTransform schema wrapper
     
     Mapping(required=[type])
@@ -653,7 +659,7 @@ class facetTransform(SchemaBase):
                                              transform=transform, **kwds)
 
 
-class filterTransform(SchemaBase):
+class filterTransform(VegaSchema):
     """filterTransform schema wrapper
     
     Mapping(required=[type, test])
@@ -673,7 +679,7 @@ class filterTransform(SchemaBase):
         super(filterTransform, self).__init__(test=test, type=type, **kwds)
 
 
-class foldTransform(SchemaBase):
+class foldTransform(VegaSchema):
     """foldTransform schema wrapper
     
     Mapping(required=[type, fields])
@@ -695,7 +701,7 @@ class foldTransform(SchemaBase):
         super(foldTransform, self).__init__(fields=fields, type=type, output=output, **kwds)
 
 
-class forceTransform(SchemaBase):
+class forceTransform(VegaSchema):
     """forceTransform schema wrapper
     
     Mapping(required=[type, links])
@@ -754,7 +760,7 @@ class forceTransform(SchemaBase):
                                              output=output, size=size, theta=theta, **kwds)
 
 
-class formulaTransform(SchemaBase):
+class formulaTransform(VegaSchema):
     """formulaTransform schema wrapper
     
     Mapping(required=[type, field, expr])
@@ -776,7 +782,7 @@ class formulaTransform(SchemaBase):
         super(formulaTransform, self).__init__(expr=expr, field=field, type=type, **kwds)
 
 
-class geoTransform(SchemaBase):
+class geoTransform(VegaSchema):
     """geoTransform schema wrapper
     
     Mapping(required=[type, lon, lat])
@@ -822,7 +828,7 @@ class geoTransform(SchemaBase):
                                            scale=scale, translate=translate, **kwds)
 
 
-class geopathTransform(SchemaBase):
+class geopathTransform(VegaSchema):
     """geopathTransform schema wrapper
     
     Mapping(required=[type])
@@ -865,7 +871,7 @@ class geopathTransform(SchemaBase):
                                                rotate=rotate, scale=scale, translate=translate, **kwds)
 
 
-class hierarchyTransform(SchemaBase):
+class hierarchyTransform(VegaSchema):
     """hierarchyTransform schema wrapper
     
     Mapping(required=[type])
@@ -904,7 +910,7 @@ class hierarchyTransform(SchemaBase):
                                                  parent=parent, size=size, sort=sort, **kwds)
 
 
-class imputeTransform(SchemaBase):
+class imputeTransform(VegaSchema):
     """imputeTransform schema wrapper
     
     Mapping(required=[type, groupby, orderby, field])
@@ -934,7 +940,7 @@ class imputeTransform(SchemaBase):
                                               method=method, value=value, **kwds)
 
 
-class lookupTransform(SchemaBase):
+class lookupTransform(VegaSchema):
     """lookupTransform schema wrapper
     
     Mapping(required=[type, on, as, keys])
@@ -962,7 +968,7 @@ class lookupTransform(SchemaBase):
                                               **kwds)
 
 
-class pieTransform(SchemaBase):
+class pieTransform(VegaSchema):
     """pieTransform schema wrapper
     
     Mapping(required=[type])
@@ -993,7 +999,7 @@ class pieTransform(SchemaBase):
                                            sort=sort, startAngle=startAngle, **kwds)
 
 
-class rankTransform(SchemaBase):
+class rankTransform(VegaSchema):
     """rankTransform schema wrapper
     
     Mapping(required=[type])
@@ -1019,7 +1025,7 @@ class rankTransform(SchemaBase):
                                             **kwds)
 
 
-class sortTransform(SchemaBase):
+class sortTransform(VegaSchema):
     """sortTransform schema wrapper
     
     Mapping(required=[type, by])
@@ -1039,7 +1045,7 @@ class sortTransform(SchemaBase):
         super(sortTransform, self).__init__(by=by, type=type, **kwds)
 
 
-class stackTransform(SchemaBase):
+class stackTransform(VegaSchema):
     """stackTransform schema wrapper
     
     Mapping(required=[type, groupby, field])
@@ -1069,7 +1075,7 @@ class stackTransform(SchemaBase):
                                              output=output, sortby=sortby, **kwds)
 
 
-class treeifyTransform(SchemaBase):
+class treeifyTransform(VegaSchema):
     """treeifyTransform schema wrapper
     
     Mapping(required=[type, groupby])
@@ -1090,7 +1096,7 @@ class treeifyTransform(SchemaBase):
         super(treeifyTransform, self).__init__(groupby=groupby, type=type, output=output, **kwds)
 
 
-class treemapTransform(SchemaBase):
+class treemapTransform(VegaSchema):
     """treemapTransform schema wrapper
     
     Mapping(required=[type])
@@ -1134,7 +1140,7 @@ class treemapTransform(SchemaBase):
                                                sticky=sticky, **kwds)
 
 
-class voronoiTransform(SchemaBase):
+class voronoiTransform(VegaSchema):
     """voronoiTransform schema wrapper
     
     Mapping(required=[type])
@@ -1161,7 +1167,7 @@ class voronoiTransform(SchemaBase):
                                                y=y, **kwds)
 
 
-class wordcloudTransform(SchemaBase):
+class wordcloudTransform(VegaSchema):
     """wordcloudTransform schema wrapper
     
     Mapping(required=[type])
@@ -1212,7 +1218,7 @@ class wordcloudTransform(SchemaBase):
                                                  **kwds)
 
 
-class transform(SchemaBase):
+class transform(VegaSchema):
     """transform schema wrapper
     
     List(oneOf(aggregateTransform, binTransform, crossTransform, countpatternTransform, 
@@ -1228,7 +1234,7 @@ class transform(SchemaBase):
         super(transform, self).__init__(*args)
 
 
-class scale(SchemaBase):
+class scale(VegaSchema):
     """scale schema wrapper
     
     allOf(Mapping(required=[name]), oneOf(Mapping(required=[type]), Mapping(required=[type]), 
@@ -1245,7 +1251,7 @@ class scale(SchemaBase):
                                     type=type, **kwds)
 
 
-class operand(SchemaBase):
+class operand(VegaSchema):
     """operand schema wrapper
     
     oneOf(Mapping(required=[value]), Mapping(required=[arg]), signal, 
@@ -1258,7 +1264,7 @@ class operand(SchemaBase):
         super(operand, self).__init__(*args, **kwds)
 
 
-class field(SchemaBase):
+class field(VegaSchema):
     """field schema wrapper
     
     oneOf(string, oneOf(signal, Mapping(required=[datum]), Mapping(required=[group]), 
@@ -1271,7 +1277,7 @@ class field(SchemaBase):
         super(field, self).__init__(*args, **kwds)
 
 
-class scale(SchemaBase):
+class scale(VegaSchema):
     """scale schema wrapper
     
     oneOf(field, Mapping(required=[name]))
@@ -1283,7 +1289,7 @@ class scale(SchemaBase):
         super(scale, self).__init__(*args, **kwds)
 
 
-class stringModifiers(SchemaBase):
+class stringModifiers(VegaSchema):
     """stringModifiers schema wrapper
     
     Mapping(required=[])
@@ -1300,7 +1306,7 @@ class stringModifiers(SchemaBase):
         super(stringModifiers, self).__init__(scale=scale, **kwds)
 
 
-class numberModifiers(SchemaBase):
+class numberModifiers(VegaSchema):
     """numberModifiers schema wrapper
     
     Mapping(required=[])
@@ -1321,7 +1327,7 @@ class numberModifiers(SchemaBase):
         super(numberModifiers, self).__init__(mult=mult, offset=offset, scale=scale, **kwds)
 
 
-class value(SchemaBase):
+class value(VegaSchema):
     """value schema wrapper
     
     oneOf(Mapping(required=[rule]), List(allOf(rule, allOf(stringModifiers, oneOf(signal, 
@@ -1336,7 +1342,7 @@ class value(SchemaBase):
         super(value, self).__init__(*args, **kwds)
 
 
-class numberValue(SchemaBase):
+class numberValue(VegaSchema):
     """numberValue schema wrapper
     
     oneOf(Mapping(required=[rule]), List(allOf(rule, allOf(numberModifiers, oneOf(signal, 
@@ -1351,7 +1357,7 @@ class numberValue(SchemaBase):
         super(numberValue, self).__init__(*args, **kwds)
 
 
-class stringValue(SchemaBase):
+class stringValue(VegaSchema):
     """stringValue schema wrapper
     
     oneOf(Mapping(required=[rule]), List(allOf(rule, allOf(stringModifiers, oneOf(signal, 
@@ -1367,7 +1373,7 @@ class stringValue(SchemaBase):
         super(stringValue, self).__init__(*args, **kwds)
 
 
-class booleanValue(SchemaBase):
+class booleanValue(VegaSchema):
     """booleanValue schema wrapper
     
     oneOf(Mapping(required=[rule]), List(allOf(rule, allOf(stringModifiers, oneOf(signal, 
@@ -1382,7 +1388,7 @@ class booleanValue(SchemaBase):
         super(booleanValue, self).__init__(*args, **kwds)
 
 
-class arrayValue(SchemaBase):
+class arrayValue(VegaSchema):
     """arrayValue schema wrapper
     
     oneOf(Mapping(required=[rule]), List(allOf(rule, allOf(stringModifiers, oneOf(signal, 
@@ -1397,7 +1403,7 @@ class arrayValue(SchemaBase):
         super(arrayValue, self).__init__(*args, **kwds)
 
 
-class colorValue(SchemaBase):
+class colorValue(VegaSchema):
     """colorValue schema wrapper
     
     oneOf(stringValue, Mapping(required=[r, g, b]), Mapping(required=[h, s, l]), 
@@ -1410,7 +1416,7 @@ class colorValue(SchemaBase):
         super(colorValue, self).__init__(*args, **kwds)
 
 
-class signal(SchemaBase):
+class signal(VegaSchema):
     """signal schema wrapper
     
     Mapping(required=[signal])
@@ -1427,7 +1433,7 @@ class signal(SchemaBase):
         super(signal, self).__init__(signal=signal, **kwds)
 
 
-class scopedScale(SchemaBase):
+class scopedScale(VegaSchema):
     """scopedScale schema wrapper
     
     oneOf(string, Mapping(required=[name]))
@@ -1439,7 +1445,7 @@ class scopedScale(SchemaBase):
         super(scopedScale, self).__init__(*args, **kwds)
 
 
-class data(SchemaBase):
+class data(VegaSchema):
     """data schema wrapper
     
     Mapping(required=[])
diff --git a/altair/vega/v3/schema/core.py b/altair/vega/v3/schema/core.py
index a5942700..735ab3fa 100644
--- a/altair/vega/v3/schema/core.py
+++ b/altair/vega/v3/schema/core.py
@@ -13,7 +13,13 @@ def load_schema():
         return json.load(f)
 
 
-class Root(SchemaBase):
+class VegaSchema(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return VegaSchema.__subclasses__()
+
+
+class Root(VegaSchema):
     """Root schema wrapper
     
     allOf(scope, Mapping(required=[]))
@@ -33,7 +39,7 @@ class Root(SchemaBase):
                                    usermeta=usermeta, width=width, **kwds)
 
 
-class autosize(SchemaBase):
+class autosize(VegaSchema):
     """autosize schema wrapper
     
     oneOf(enum('pad', 'fit', 'none'), Mapping(required=[type]))
@@ -45,7 +51,7 @@ class autosize(SchemaBase):
         super(autosize, self).__init__(*args, **kwds)
 
 
-class axis(SchemaBase):
+class axis(VegaSchema):
     """axis schema wrapper
     
     Mapping(required=[orient, scale])
@@ -121,7 +127,7 @@ class axis(SchemaBase):
                                    zindex=zindex, **kwds)
 
 
-class background(SchemaBase):
+class background(VegaSchema):
     """background schema wrapper
     
     string
@@ -133,7 +139,7 @@ class background(SchemaBase):
         super(background, self).__init__(*args)
 
 
-class bind(SchemaBase):
+class bind(VegaSchema):
     """bind schema wrapper
     
     oneOf(Mapping(required=[input]), Mapping(required=[input, options]), 
@@ -146,7 +152,7 @@ class bind(SchemaBase):
         super(bind, self).__init__(*args, **kwds)
 
 
-class data(SchemaBase):
+class data(VegaSchema):
     """data schema wrapper
     
     allOf(Mapping(required=[name]), anyOf(Mapping(required=[name]), 
@@ -159,7 +165,7 @@ class data(SchemaBase):
         super(data, self).__init__(name=name, format=format, on=on, transform=transform, **kwds)
 
 
-class rule(SchemaBase):
+class rule(VegaSchema):
     """rule schema wrapper
     
     Mapping(required=[])
@@ -176,7 +182,7 @@ class rule(SchemaBase):
         super(rule, self).__init__(test=test, **kwds)
 
 
-class encodeEntry(SchemaBase):
+class encodeEntry(VegaSchema):
     """encodeEntry schema wrapper
     
     Mapping(required=[])
@@ -319,7 +325,7 @@ class encodeEntry(SchemaBase):
                                           x=x, x2=x2, xc=xc, y=y, y2=y2, yc=yc, **kwds)
 
 
-class encode(SchemaBase):
+class encode(VegaSchema):
     """encode schema wrapper
     
     Mapping(required=[])
@@ -331,7 +337,7 @@ class encode(SchemaBase):
         super(encode, self).__init__(**kwds)
 
 
-class layout(SchemaBase):
+class layout(VegaSchema):
     """layout schema wrapper
     
     oneOf(Mapping(required=[]), signal)
@@ -343,7 +349,7 @@ class layout(SchemaBase):
         super(layout, self).__init__(*args, **kwds)
 
 
-class guideEncode(SchemaBase):
+class guideEncode(VegaSchema):
     """guideEncode schema wrapper
     
     Mapping(required=[])
@@ -364,7 +370,7 @@ class guideEncode(SchemaBase):
         super(guideEncode, self).__init__(interactive=interactive, name=name, style=style, **kwds)
 
 
-class legend(SchemaBase):
+class legend(VegaSchema):
     """legend schema wrapper
     
     anyOf(Mapping(required=[size]), Mapping(required=[shape]), Mapping(required=[fill]), 
@@ -380,7 +386,7 @@ class legend(SchemaBase):
         super(legend, self).__init__(*args, **kwds)
 
 
-class mark(SchemaBase):
+class mark(VegaSchema):
     """mark schema wrapper
     
     Mapping(required=[type])
@@ -421,7 +427,7 @@ class mark(SchemaBase):
                                    transform=transform, **kwds)
 
 
-class markGroup(SchemaBase):
+class markGroup(VegaSchema):
     """markGroup schema wrapper
     
     allOf(Mapping(required=[type]), mark, scope, Mapping(required=[]))
@@ -442,7 +448,7 @@ class markGroup(SchemaBase):
                                         transform=transform, **kwds)
 
 
-class markVisual(SchemaBase):
+class markVisual(VegaSchema):
     """markVisual schema wrapper
     
     allOf(not Mapping(required=[]), mark, Mapping(required=[]))
@@ -458,7 +464,7 @@ class markVisual(SchemaBase):
                                          transform=transform, **kwds)
 
 
-class listener(SchemaBase):
+class listener(VegaSchema):
     """listener schema wrapper
     
     oneOf(signal, Mapping(required=[scale]), stream)
@@ -470,7 +476,7 @@ class listener(SchemaBase):
         super(listener, self).__init__(*args, **kwds)
 
 
-class onEvents(SchemaBase):
+class onEvents(VegaSchema):
     """onEvents schema wrapper
     
     List(allOf(Mapping(required=[events]), oneOf(Mapping(required=[encode]), 
@@ -483,7 +489,7 @@ class onEvents(SchemaBase):
         super(onEvents, self).__init__(*args)
 
 
-class onTrigger(SchemaBase):
+class onTrigger(VegaSchema):
     """onTrigger schema wrapper
     
     List(Mapping(required=[trigger]))
@@ -495,7 +501,7 @@ class onTrigger(SchemaBase):
         super(onTrigger, self).__init__(*args)
 
 
-class onMarkTrigger(SchemaBase):
+class onMarkTrigger(VegaSchema):
     """onMarkTrigger schema wrapper
     
     List(Mapping(required=[trigger]))
@@ -507,7 +513,7 @@ class onMarkTrigger(SchemaBase):
         super(onMarkTrigger, self).__init__(*args)
 
 
-class padding(SchemaBase):
+class padding(VegaSchema):
     """padding schema wrapper
     
     oneOf(float, Mapping(required=[]))
@@ -519,7 +525,7 @@ class padding(SchemaBase):
         super(padding, self).__init__(*args, **kwds)
 
 
-class projection(SchemaBase):
+class projection(VegaSchema):
     """projection schema wrapper
     
     Mapping(required=[name, type])
@@ -569,7 +575,7 @@ class projection(SchemaBase):
                                          translate=translate, **kwds)
 
 
-class scale(SchemaBase):
+class scale(VegaSchema):
     """scale schema wrapper
     
     allOf(Mapping(required=[name]), oneOf(Mapping(required=[type]), Mapping(required=[type]), 
@@ -588,7 +594,7 @@ class scale(SchemaBase):
                                     round=round, type=type, **kwds)
 
 
-class scope(SchemaBase):
+class scope(VegaSchema):
     """scope schema wrapper
     
     Mapping(required=[])
@@ -627,7 +633,7 @@ class scope(SchemaBase):
                                     signals=signals, title=title, **kwds)
 
 
-class signal(SchemaBase):
+class signal(VegaSchema):
     """signal schema wrapper
     
     oneOf(signalPush, signalNew)
@@ -639,7 +645,7 @@ class signal(SchemaBase):
         super(signal, self).__init__(*args, **kwds)
 
 
-class signalName(SchemaBase):
+class signalName(VegaSchema):
     """signalName schema wrapper
     
     not Mapping(required=[])
@@ -651,7 +657,7 @@ class signalName(SchemaBase):
         super(signalName, self).__init__(*args)
 
 
-class signalNew(SchemaBase):
+class signalNew(VegaSchema):
     """signalNew schema wrapper
     
     Mapping(required=[name])
@@ -682,7 +688,7 @@ class signalNew(SchemaBase):
                                         react=react, update=update, value=value, **kwds)
 
 
-class signalPush(SchemaBase):
+class signalPush(VegaSchema):
     """signalPush schema wrapper
     
     Mapping(required=[name, push])
@@ -705,7 +711,7 @@ class signalPush(SchemaBase):
         super(signalPush, self).__init__(name=name, push=push, description=description, on=on, **kwds)
 
 
-class streamParams(SchemaBase):
+class streamParams(VegaSchema):
     """streamParams schema wrapper
     
     Mapping(required=[])
@@ -737,7 +743,7 @@ class streamParams(SchemaBase):
                                            throttle=throttle, **kwds)
 
 
-class streamEvents(SchemaBase):
+class streamEvents(VegaSchema):
     """streamEvents schema wrapper
     
     Mapping(required=[type])
@@ -756,7 +762,7 @@ class streamEvents(SchemaBase):
         super(streamEvents, self).__init__(type=type, source=source, **kwds)
 
 
-class stream(SchemaBase):
+class stream(VegaSchema):
     """stream schema wrapper
     
     allOf(streamParams, oneOf(streamEvents, Mapping(required=[stream]), 
@@ -771,7 +777,7 @@ class stream(SchemaBase):
                                      markname=markname, marktype=marktype, throttle=throttle, **kwds)
 
 
-class titleEncode(SchemaBase):
+class titleEncode(VegaSchema):
     """titleEncode schema wrapper
     
     Mapping(required=[])
@@ -783,7 +789,7 @@ class titleEncode(SchemaBase):
         super(titleEncode, self).__init__(**kwds)
 
 
-class title(SchemaBase):
+class title(VegaSchema):
     """title schema wrapper
     
     oneOf(string, Mapping(required=[text]))
@@ -795,7 +801,7 @@ class title(SchemaBase):
         super(title, self).__init__(*args, **kwds)
 
 
-class transform(SchemaBase):
+class transform(VegaSchema):
     """transform schema wrapper
     
     oneOf(aggregateTransform, binTransform, collectTransform, countpatternTransform, 
@@ -815,7 +821,7 @@ class transform(SchemaBase):
         super(transform, self).__init__(*args, **kwds)
 
 
-class transformMark(SchemaBase):
+class transformMark(VegaSchema):
     """transformMark schema wrapper
     
     oneOf(binTransform, collectTransform, extentTransform, formulaTransform, 
@@ -832,7 +838,7 @@ class transformMark(SchemaBase):
         super(transformMark, self).__init__(*args, **kwds)
 
 
-class aggregateTransform(SchemaBase):
+class aggregateTransform(VegaSchema):
     """aggregateTransform schema wrapper
     
     Mapping(required=[type])
@@ -868,7 +874,7 @@ class aggregateTransform(SchemaBase):
                                                  **kwds)
 
 
-class binTransform(SchemaBase):
+class binTransform(VegaSchema):
     """binTransform schema wrapper
     
     Mapping(required=[type, field, extent])
@@ -914,7 +920,7 @@ class binTransform(SchemaBase):
                                            **kwds)
 
 
-class collectTransform(SchemaBase):
+class collectTransform(VegaSchema):
     """collectTransform schema wrapper
     
     Mapping(required=[type])
@@ -935,7 +941,7 @@ class collectTransform(SchemaBase):
         super(collectTransform, self).__init__(type=type, signal=signal, sort=sort, **kwds)
 
 
-class countpatternTransform(SchemaBase):
+class countpatternTransform(VegaSchema):
     """countpatternTransform schema wrapper
     
     Mapping(required=[type, field])
@@ -964,7 +970,7 @@ class countpatternTransform(SchemaBase):
                                                     signal=signal, stopwords=stopwords, **kwds)
 
 
-class crossTransform(SchemaBase):
+class crossTransform(VegaSchema):
     """crossTransform schema wrapper
     
     Mapping(required=[type])
@@ -985,7 +991,7 @@ class crossTransform(SchemaBase):
         super(crossTransform, self).__init__(type=type, filter=filter, signal=signal, **kwds)
 
 
-class densityTransform(SchemaBase):
+class densityTransform(VegaSchema):
     """densityTransform schema wrapper
     
     Mapping(required=[type])
@@ -1015,7 +1021,7 @@ class densityTransform(SchemaBase):
                                                method=method, signal=signal, steps=steps, **kwds)
 
 
-class extentTransform(SchemaBase):
+class extentTransform(VegaSchema):
     """extentTransform schema wrapper
     
     Mapping(required=[type, field])
@@ -1036,7 +1042,7 @@ class extentTransform(SchemaBase):
         super(extentTransform, self).__init__(field=field, type=type, signal=signal, **kwds)
 
 
-class filterTransform(SchemaBase):
+class filterTransform(VegaSchema):
     """filterTransform schema wrapper
     
     Mapping(required=[type, expr])
@@ -1057,7 +1063,7 @@ class filterTransform(SchemaBase):
         super(filterTransform, self).__init__(expr=expr, type=type, signal=signal, **kwds)
 
 
-class foldTransform(SchemaBase):
+class foldTransform(VegaSchema):
     """foldTransform schema wrapper
     
     Mapping(required=[type, fields])
@@ -1078,7 +1084,7 @@ class foldTransform(SchemaBase):
         super(foldTransform, self).__init__(fields=fields, type=type, signal=signal, **kwds)
 
 
-class formulaTransform(SchemaBase):
+class formulaTransform(VegaSchema):
     """formulaTransform schema wrapper
     
     Mapping(required=[type, expr, as])
@@ -1102,7 +1108,7 @@ class formulaTransform(SchemaBase):
                                                **kwds)
 
 
-class imputeTransform(SchemaBase):
+class imputeTransform(VegaSchema):
     """imputeTransform schema wrapper
     
     Mapping(required=[type, field, key])
@@ -1136,7 +1142,7 @@ class imputeTransform(SchemaBase):
                                               value=value, **kwds)
 
 
-class joinaggregateTransform(SchemaBase):
+class joinaggregateTransform(VegaSchema):
     """joinaggregateTransform schema wrapper
     
     Mapping(required=[type])
@@ -1167,7 +1173,7 @@ class joinaggregateTransform(SchemaBase):
                                                      ops=ops, signal=signal, **kwds)
 
 
-class lookupTransform(SchemaBase):
+class lookupTransform(VegaSchema):
     """lookupTransform schema wrapper
     
     Mapping(required=[type, from, key, fields])
@@ -1196,7 +1202,7 @@ class lookupTransform(SchemaBase):
                                               signal=signal, values=values, **kwds)
 
 
-class projectTransform(SchemaBase):
+class projectTransform(VegaSchema):
     """projectTransform schema wrapper
     
     Mapping(required=[type])
@@ -1217,7 +1223,7 @@ class projectTransform(SchemaBase):
         super(projectTransform, self).__init__(type=type, fields=fields, signal=signal, **kwds)
 
 
-class sampleTransform(SchemaBase):
+class sampleTransform(VegaSchema):
     """sampleTransform schema wrapper
     
     Mapping(required=[type])
@@ -1238,7 +1244,7 @@ class sampleTransform(SchemaBase):
         super(sampleTransform, self).__init__(type=type, signal=signal, size=size, **kwds)
 
 
-class sequenceTransform(SchemaBase):
+class sequenceTransform(VegaSchema):
     """sequenceTransform schema wrapper
     
     Mapping(required=[type, start, stop])
@@ -1265,7 +1271,7 @@ class sequenceTransform(SchemaBase):
                                                 step=step, **kwds)
 
 
-class windowTransform(SchemaBase):
+class windowTransform(VegaSchema):
     """windowTransform schema wrapper
     
     Mapping(required=[type])
@@ -1306,7 +1312,7 @@ class windowTransform(SchemaBase):
                                               signal=signal, sort=sort, **kwds)
 
 
-class identifierTransform(SchemaBase):
+class identifierTransform(VegaSchema):
     """identifierTransform schema wrapper
     
     Mapping(required=[type, as])
@@ -1325,7 +1331,7 @@ class identifierTransform(SchemaBase):
         super(identifierTransform, self).__init__(type=type, signal=signal, **kwds)
 
 
-class linkpathTransform(SchemaBase):
+class linkpathTransform(VegaSchema):
     """linkpathTransform schema wrapper
     
     Mapping(required=[type])
@@ -1359,7 +1365,7 @@ class linkpathTransform(SchemaBase):
                                                 targetY=targetY, **kwds)
 
 
-class pieTransform(SchemaBase):
+class pieTransform(VegaSchema):
     """pieTransform schema wrapper
     
     Mapping(required=[type])
@@ -1388,7 +1394,7 @@ class pieTransform(SchemaBase):
                                            sort=sort, startAngle=startAngle, **kwds)
 
 
-class stackTransform(SchemaBase):
+class stackTransform(VegaSchema):
     """stackTransform schema wrapper
     
     Mapping(required=[type])
@@ -1417,7 +1423,7 @@ class stackTransform(SchemaBase):
                                              signal=signal, sort=sort, **kwds)
 
 
-class contourTransform(SchemaBase):
+class contourTransform(VegaSchema):
     """contourTransform schema wrapper
     
     Mapping(required=[type, size])
@@ -1458,7 +1464,7 @@ class contourTransform(SchemaBase):
                                                thresholds=thresholds, values=values, x=x, y=y, **kwds)
 
 
-class geojsonTransform(SchemaBase):
+class geojsonTransform(VegaSchema):
     """geojsonTransform schema wrapper
     
     Mapping(required=[type])
@@ -1482,7 +1488,7 @@ class geojsonTransform(SchemaBase):
                                                **kwds)
 
 
-class geopathTransform(SchemaBase):
+class geopathTransform(VegaSchema):
     """geopathTransform schema wrapper
     
     Mapping(required=[type])
@@ -1506,7 +1512,7 @@ class geopathTransform(SchemaBase):
                                                signal=signal, **kwds)
 
 
-class geopointTransform(SchemaBase):
+class geopointTransform(VegaSchema):
     """geopointTransform schema wrapper
     
     Mapping(required=[type, projection, fields])
@@ -1530,7 +1536,7 @@ class geopointTransform(SchemaBase):
                                                 signal=signal, **kwds)
 
 
-class geoshapeTransform(SchemaBase):
+class geoshapeTransform(VegaSchema):
     """geoshapeTransform schema wrapper
     
     Mapping(required=[type])
@@ -1554,7 +1560,7 @@ class geoshapeTransform(SchemaBase):
                                                 signal=signal, **kwds)
 
 
-class graticuleTransform(SchemaBase):
+class graticuleTransform(VegaSchema):
     """graticuleTransform schema wrapper
     
     Mapping(required=[type])
@@ -1592,7 +1598,7 @@ class graticuleTransform(SchemaBase):
                                                  stepMinor=stepMinor, **kwds)
 
 
-class forceTransform(SchemaBase):
+class forceTransform(VegaSchema):
     """forceTransform schema wrapper
     
     Mapping(required=[type])
@@ -1634,7 +1640,7 @@ class forceTransform(SchemaBase):
                                              static=static, velocityDecay=velocityDecay, **kwds)
 
 
-class nestTransform(SchemaBase):
+class nestTransform(VegaSchema):
     """nestTransform schema wrapper
     
     Mapping(required=[type])
@@ -1661,7 +1667,7 @@ class nestTransform(SchemaBase):
                                             signal=signal, **kwds)
 
 
-class packTransform(SchemaBase):
+class packTransform(VegaSchema):
     """packTransform schema wrapper
     
     Mapping(required=[type])
@@ -1692,7 +1698,7 @@ class packTransform(SchemaBase):
                                             signal=signal, size=size, sort=sort, **kwds)
 
 
-class partitionTransform(SchemaBase):
+class partitionTransform(VegaSchema):
     """partitionTransform schema wrapper
     
     Mapping(required=[type])
@@ -1723,7 +1729,7 @@ class partitionTransform(SchemaBase):
                                                  signal=signal, size=size, sort=sort, **kwds)
 
 
-class stratifyTransform(SchemaBase):
+class stratifyTransform(VegaSchema):
     """stratifyTransform schema wrapper
     
     Mapping(required=[type, key, parentKey])
@@ -1747,7 +1753,7 @@ class stratifyTransform(SchemaBase):
                                                 **kwds)
 
 
-class treeTransform(SchemaBase):
+class treeTransform(VegaSchema):
     """treeTransform schema wrapper
     
     Mapping(required=[type])
@@ -1778,7 +1784,7 @@ class treeTransform(SchemaBase):
                                             signal=signal, size=size, sort=sort, **kwds)
 
 
-class treelinksTransform(SchemaBase):
+class treelinksTransform(VegaSchema):
     """treelinksTransform schema wrapper
     
     Mapping(required=[type])
@@ -1799,7 +1805,7 @@ class treelinksTransform(SchemaBase):
         super(treelinksTransform, self).__init__(type=type, key=key, signal=signal, **kwds)
 
 
-class treemapTransform(SchemaBase):
+class treemapTransform(VegaSchema):
     """treemapTransform schema wrapper
     
     Mapping(required=[type])
@@ -1853,7 +1859,7 @@ class treemapTransform(SchemaBase):
                                                sort=sort, **kwds)
 
 
-class voronoiTransform(SchemaBase):
+class voronoiTransform(VegaSchema):
     """voronoiTransform schema wrapper
     
     Mapping(required=[type, x, y])
@@ -1882,7 +1888,7 @@ class voronoiTransform(SchemaBase):
                                                size=size, **kwds)
 
 
-class wordcloudTransform(SchemaBase):
+class wordcloudTransform(VegaSchema):
     """wordcloudTransform schema wrapper
     
     Mapping(required=[type])
@@ -1927,7 +1933,7 @@ class wordcloudTransform(SchemaBase):
                                                  **kwds)
 
 
-class crossfilterTransform(SchemaBase):
+class crossfilterTransform(VegaSchema):
     """crossfilterTransform schema wrapper
     
     Mapping(required=[type, fields, query])
@@ -1951,7 +1957,7 @@ class crossfilterTransform(SchemaBase):
                                                    **kwds)
 
 
-class resolvefilterTransform(SchemaBase):
+class resolvefilterTransform(VegaSchema):
     """resolvefilterTransform schema wrapper
     
     Mapping(required=[type, ignore, filter])
@@ -1975,7 +1981,7 @@ class resolvefilterTransform(SchemaBase):
                                                      signal=signal, **kwds)
 
 
-class tickCount(SchemaBase):
+class tickCount(VegaSchema):
     """tickCount schema wrapper
     
     oneOf(float, enum('millisecond', 'second', 'minute', 'hour', 'day', 'week', 'month', 
@@ -1988,7 +1994,7 @@ class tickCount(SchemaBase):
         super(tickCount, self).__init__(*args, **kwds)
 
 
-class element(SchemaBase):
+class element(VegaSchema):
     """element schema wrapper
     
     string
@@ -2000,7 +2006,7 @@ class element(SchemaBase):
         super(element, self).__init__(*args)
 
 
-class paramField(SchemaBase):
+class paramField(VegaSchema):
     """paramField schema wrapper
     
     Mapping(required=[field])
@@ -2017,7 +2023,7 @@ class paramField(SchemaBase):
         super(paramField, self).__init__(field=field, **kwds)
 
 
-class field(SchemaBase):
+class field(VegaSchema):
     """field schema wrapper
     
     oneOf(string, oneOf(signal, Mapping(required=[datum]), Mapping(required=[group]), 
@@ -2030,7 +2036,7 @@ class field(SchemaBase):
         super(field, self).__init__(*args, **kwds)
 
 
-class scale(SchemaBase):
+class scale(VegaSchema):
     """scale schema wrapper
     
     oneOf(string, oneOf(signal, Mapping(required=[datum]), Mapping(required=[group]), 
@@ -2043,7 +2049,7 @@ class scale(SchemaBase):
         super(scale, self).__init__(*args, **kwds)
 
 
-class stringModifiers(SchemaBase):
+class stringModifiers(VegaSchema):
     """stringModifiers schema wrapper
     
     Mapping(required=[])
@@ -2060,7 +2066,7 @@ class stringModifiers(SchemaBase):
         super(stringModifiers, self).__init__(scale=scale, **kwds)
 
 
-class numberModifiers(SchemaBase):
+class numberModifiers(VegaSchema):
     """numberModifiers schema wrapper
     
     Mapping(required=[])
@@ -2091,7 +2097,7 @@ class numberModifiers(SchemaBase):
                                               offset=offset, round=round, scale=scale, **kwds)
 
 
-class value(SchemaBase):
+class value(VegaSchema):
     """value schema wrapper
     
     oneOf(List(allOf(rule, allOf(stringModifiers, anyOf(oneOf(signal, Mapping(required=[value]),
@@ -2108,7 +2114,7 @@ class value(SchemaBase):
         super(value, self).__init__(*args, **kwds)
 
 
-class numberValue(SchemaBase):
+class numberValue(VegaSchema):
     """numberValue schema wrapper
     
     oneOf(List(allOf(rule, allOf(numberModifiers, anyOf(oneOf(signal, Mapping(required=[value]),
@@ -2125,7 +2131,7 @@ class numberValue(SchemaBase):
         super(numberValue, self).__init__(*args, **kwds)
 
 
-class stringValue(SchemaBase):
+class stringValue(VegaSchema):
     """stringValue schema wrapper
     
     oneOf(List(allOf(rule, allOf(stringModifiers, anyOf(oneOf(signal, Mapping(required=[value]),
@@ -2142,7 +2148,7 @@ class stringValue(SchemaBase):
         super(stringValue, self).__init__(*args, **kwds)
 
 
-class booleanValue(SchemaBase):
+class booleanValue(VegaSchema):
     """booleanValue schema wrapper
     
     oneOf(List(allOf(rule, allOf(stringModifiers, anyOf(oneOf(signal, Mapping(required=[value]),
@@ -2159,7 +2165,7 @@ class booleanValue(SchemaBase):
         super(booleanValue, self).__init__(*args, **kwds)
 
 
-class arrayValue(SchemaBase):
+class arrayValue(VegaSchema):
     """arrayValue schema wrapper
     
     oneOf(List(allOf(rule, allOf(stringModifiers, anyOf(oneOf(signal, Mapping(required=[value]),
@@ -2176,7 +2182,7 @@ class arrayValue(SchemaBase):
         super(arrayValue, self).__init__(*args, **kwds)
 
 
-class nullableStringValue(SchemaBase):
+class nullableStringValue(VegaSchema):
     """nullableStringValue schema wrapper
     
     oneOf(List(allOf(rule, allOf(stringModifiers, anyOf(oneOf(signal, Mapping(required=[value]),
@@ -2193,7 +2199,7 @@ class nullableStringValue(SchemaBase):
         super(nullableStringValue, self).__init__(*args, **kwds)
 
 
-class colorRGB(SchemaBase):
+class colorRGB(VegaSchema):
     """colorRGB schema wrapper
     
     Mapping(required=[r, g, b])
@@ -2214,7 +2220,7 @@ class colorRGB(SchemaBase):
         super(colorRGB, self).__init__(b=b, g=g, r=r, **kwds)
 
 
-class colorHSL(SchemaBase):
+class colorHSL(VegaSchema):
     """colorHSL schema wrapper
     
     Mapping(required=[h, s, l])
@@ -2235,7 +2241,7 @@ class colorHSL(SchemaBase):
         super(colorHSL, self).__init__(h=h, l=l, s=s, **kwds)
 
 
-class colorLAB(SchemaBase):
+class colorLAB(VegaSchema):
     """colorLAB schema wrapper
     
     Mapping(required=[l, a, b])
@@ -2256,7 +2262,7 @@ class colorLAB(SchemaBase):
         super(colorLAB, self).__init__(a=a, b=b, l=l, **kwds)
 
 
-class colorHCL(SchemaBase):
+class colorHCL(VegaSchema):
     """colorHCL schema wrapper
     
     Mapping(required=[h, c, l])
@@ -2277,7 +2283,7 @@ class colorHCL(SchemaBase):
         super(colorHCL, self).__init__(c=c, h=h, l=l, **kwds)
 
 
-class colorValue(SchemaBase):
+class colorValue(VegaSchema):
     """colorValue schema wrapper
     
     oneOf(nullableStringValue, Mapping(required=[gradient]), Mapping(required=[color]))
@@ -2289,7 +2295,7 @@ class colorValue(SchemaBase):
         super(colorValue, self).__init__(*args, **kwds)
 
 
-class expr(SchemaBase):
+class expr(VegaSchema):
     """expr schema wrapper
     
     Mapping(required=[expr])
@@ -2306,7 +2312,7 @@ class expr(SchemaBase):
         super(expr, self).__init__(expr=expr, **kwds)
 
 
-class exprString(SchemaBase):
+class exprString(VegaSchema):
     """exprString schema wrapper
     
     string
@@ -2318,7 +2324,7 @@ class exprString(SchemaBase):
         super(exprString, self).__init__(*args)
 
 
-class compare(SchemaBase):
+class compare(VegaSchema):
     """compare schema wrapper
     
     oneOf(Mapping(required=[]), Mapping(required=[]))
@@ -2330,7 +2336,7 @@ class compare(SchemaBase):
         super(compare, self).__init__(*args, **kwds)
 
 
-class from_(SchemaBase):
+class from_(VegaSchema):
     """from_ schema wrapper
     
     Mapping(required=[])
@@ -2347,7 +2353,7 @@ class from_(SchemaBase):
         super(from_, self).__init__(data=data, **kwds)
 
 
-class facet(SchemaBase):
+class facet(VegaSchema):
     """facet schema wrapper
     
     Mapping(required=[facet])
@@ -2367,7 +2373,7 @@ class facet(SchemaBase):
         super(facet, self).__init__(facet=facet, data=data, **kwds)
 
 
-class style(SchemaBase):
+class style(VegaSchema):
     """style schema wrapper
     
     oneOf(string, List(string))
@@ -2379,7 +2385,7 @@ class style(SchemaBase):
         super(style, self).__init__(*args, **kwds)
 
 
-class marktype(SchemaBase):
+class marktype(VegaSchema):
     """marktype schema wrapper
     
     string
@@ -2391,7 +2397,7 @@ class marktype(SchemaBase):
         super(marktype, self).__init__(*args)
 
 
-class sortOrder(SchemaBase):
+class sortOrder(VegaSchema):
     """sortOrder schema wrapper
     
     oneOf(enum('ascending', 'descending'), signal)
@@ -2403,7 +2409,7 @@ class sortOrder(SchemaBase):
         super(sortOrder, self).__init__(*args, **kwds)
 
 
-class scaleField(SchemaBase):
+class scaleField(VegaSchema):
     """scaleField schema wrapper
     
     oneOf(string, signal)
@@ -2415,7 +2421,7 @@ class scaleField(SchemaBase):
         super(scaleField, self).__init__(*args, **kwds)
 
 
-class scaleInterpolate(SchemaBase):
+class scaleInterpolate(VegaSchema):
     """scaleInterpolate schema wrapper
     
     oneOf(string, signal, Mapping(required=[type]))
@@ -2427,7 +2433,7 @@ class scaleInterpolate(SchemaBase):
         super(scaleInterpolate, self).__init__(*args, **kwds)
 
 
-class scaleData(SchemaBase):
+class scaleData(VegaSchema):
     """scaleData schema wrapper
     
     oneOf(Mapping(required=[data, field]), Mapping(required=[data, fields]), 
@@ -2440,7 +2446,7 @@ class scaleData(SchemaBase):
         super(scaleData, self).__init__(*args, **kwds)
 
 
-class selector(SchemaBase):
+class selector(VegaSchema):
     """selector schema wrapper
     
     string
@@ -2452,7 +2458,7 @@ class selector(SchemaBase):
         super(selector, self).__init__(*args)
 
 
-class signal(SchemaBase):
+class signal(VegaSchema):
     """signal schema wrapper
     
     Mapping(required=[signal])
@@ -2469,7 +2475,7 @@ class signal(SchemaBase):
         super(signal, self).__init__(signal=signal, **kwds)
 
 
-class booleanOrSignal(SchemaBase):
+class booleanOrSignal(VegaSchema):
     """booleanOrSignal schema wrapper
     
     oneOf(boolean, signal)
@@ -2481,7 +2487,7 @@ class booleanOrSignal(SchemaBase):
         super(booleanOrSignal, self).__init__(*args, **kwds)
 
 
-class numberOrSignal(SchemaBase):
+class numberOrSignal(VegaSchema):
     """numberOrSignal schema wrapper
     
     oneOf(float, signal)
@@ -2493,7 +2499,7 @@ class numberOrSignal(SchemaBase):
         super(numberOrSignal, self).__init__(*args, **kwds)
 
 
-class stringOrSignal(SchemaBase):
+class stringOrSignal(VegaSchema):
     """stringOrSignal schema wrapper
     
     oneOf(string, signal)
diff --git a/altair/vegalite/v1/schema/core.py b/altair/vegalite/v1/schema/core.py
index 29607061..c9a36d57 100644
--- a/altair/vegalite/v1/schema/core.py
+++ b/altair/vegalite/v1/schema/core.py
@@ -13,7 +13,13 @@ def load_schema():
         return json.load(f)
 
 
-class Root(SchemaBase):
+class VegaLiteSchema(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return VegaLiteSchema.__subclasses__()
+
+
+class Root(VegaLiteSchema):
     """Root schema wrapper
     
     anyOf(ExtendedUnitSpec, FacetSpec, LayerSpec)
@@ -25,7 +31,7 @@ class Root(SchemaBase):
         super(Root, self).__init__(*args, **kwds)
 
 
-class ExtendedUnitSpec(SchemaBase):
+class ExtendedUnitSpec(VegaLiteSchema):
     """ExtendedUnitSpec schema wrapper
     
     Mapping(required=[mark])
@@ -74,7 +80,7 @@ class ExtendedUnitSpec(SchemaBase):
                                                width=width, **kwds)
 
 
-class Mark(SchemaBase):
+class Mark(VegaLiteSchema):
     """Mark schema wrapper
     
     enum('area', 'bar', 'line', 'point', 'text', 'tick', 'rule', 'circle', 'square', 'errorBar')
@@ -86,7 +92,7 @@ class Mark(SchemaBase):
         super(Mark, self).__init__(*args)
 
 
-class Encoding(SchemaBase):
+class Encoding(VegaLiteSchema):
     """Encoding schema wrapper
     
     Mapping(required=[])
@@ -145,7 +151,7 @@ class Encoding(SchemaBase):
                                        size=size, text=text, x=x, x2=x2, y=y, y2=y2, **kwds)
 
 
-class PositionChannelDef(SchemaBase):
+class PositionChannelDef(VegaLiteSchema):
     """PositionChannelDef schema wrapper
     
     Mapping(required=[])
@@ -189,7 +195,7 @@ class PositionChannelDef(SchemaBase):
                                                  type=type, value=value, **kwds)
 
 
-class Axis(SchemaBase):
+class Axis(VegaLiteSchema):
     """Axis schema wrapper
     
     anyOf(Mapping(required=[]), None)
@@ -201,7 +207,7 @@ class Axis(SchemaBase):
         super(Axis, self).__init__(*args, **kwds)
 
 
-class AxisOrient(SchemaBase):
+class AxisOrient(VegaLiteSchema):
     """AxisOrient schema wrapper
     
     enum('top', 'right', 'left', 'bottom')
@@ -213,7 +219,7 @@ class AxisOrient(SchemaBase):
         super(AxisOrient, self).__init__(*args)
 
 
-class DateTime(SchemaBase):
+class DateTime(VegaLiteSchema):
     """DateTime schema wrapper
     
     Mapping(required=[])
@@ -263,7 +269,7 @@ class DateTime(SchemaBase):
                                        year=year, **kwds)
 
 
-class Scale(SchemaBase):
+class Scale(VegaLiteSchema):
     """Scale schema wrapper
     
     Mapping(required=[])
@@ -332,7 +338,7 @@ class Scale(SchemaBase):
                                     useRawDomain=useRawDomain, zero=zero, **kwds)
 
 
-class ScaleType(SchemaBase):
+class ScaleType(VegaLiteSchema):
     """ScaleType schema wrapper
     
     enum('linear', 'log', 'pow', 'sqrt', 'quantile', 'quantize', 'ordinal', 'time', 'utc')
@@ -344,7 +350,7 @@ class ScaleType(SchemaBase):
         super(ScaleType, self).__init__(*args)
 
 
-class BandSize(SchemaBase):
+class BandSize(VegaLiteSchema):
     """BandSize schema wrapper
     
     enum('fit')
@@ -356,7 +362,7 @@ class BandSize(SchemaBase):
         super(BandSize, self).__init__(*args)
 
 
-class NiceTime(SchemaBase):
+class NiceTime(VegaLiteSchema):
     """NiceTime schema wrapper
     
     enum('second', 'minute', 'hour', 'day', 'week', 'month', 'year')
@@ -368,7 +374,7 @@ class NiceTime(SchemaBase):
         super(NiceTime, self).__init__(*args)
 
 
-class SortOrder(SchemaBase):
+class SortOrder(VegaLiteSchema):
     """SortOrder schema wrapper
     
     enum('ascending', 'descending', 'none')
@@ -380,7 +386,7 @@ class SortOrder(SchemaBase):
         super(SortOrder, self).__init__(*args)
 
 
-class SortField(SchemaBase):
+class SortField(VegaLiteSchema):
     """SortField schema wrapper
     
     Mapping(required=[field, op])
@@ -401,7 +407,7 @@ class SortField(SchemaBase):
         super(SortField, self).__init__(field=field, op=op, order=order, **kwds)
 
 
-class AggregateOp(SchemaBase):
+class AggregateOp(VegaLiteSchema):
     """AggregateOp schema wrapper
     
     enum('values', 'count', 'valid', 'missing', 'distinct', 'sum', 'mean', 'average', 
@@ -415,7 +421,7 @@ class AggregateOp(SchemaBase):
         super(AggregateOp, self).__init__(*args)
 
 
-class Type(SchemaBase):
+class Type(VegaLiteSchema):
     """Type schema wrapper
     
     enum('quantitative', 'ordinal', 'temporal', 'nominal')
@@ -427,7 +433,7 @@ class Type(SchemaBase):
         super(Type, self).__init__(*args)
 
 
-class TimeUnit(SchemaBase):
+class TimeUnit(VegaLiteSchema):
     """TimeUnit schema wrapper
     
     enum('year', 'month', 'day', 'date', 'hours', 'minutes', 'seconds', 'milliseconds', 
@@ -443,7 +449,7 @@ class TimeUnit(SchemaBase):
         super(TimeUnit, self).__init__(*args)
 
 
-class Bin(SchemaBase):
+class Bin(VegaLiteSchema):
     """Bin schema wrapper
     
     Mapping(required=[])
@@ -484,7 +490,7 @@ class Bin(SchemaBase):
                                   minstep=minstep, step=step, steps=steps, **kwds)
 
 
-class FieldDef(SchemaBase):
+class FieldDef(VegaLiteSchema):
     """FieldDef schema wrapper
     
     Mapping(required=[])
@@ -520,7 +526,7 @@ class FieldDef(SchemaBase):
                                        title=title, type=type, value=value, **kwds)
 
 
-class ChannelDefWithLegend(SchemaBase):
+class ChannelDefWithLegend(VegaLiteSchema):
     """ChannelDefWithLegend schema wrapper
     
     Mapping(required=[])
@@ -565,7 +571,7 @@ class ChannelDefWithLegend(SchemaBase):
                                                    value=value, **kwds)
 
 
-class Legend(SchemaBase):
+class Legend(VegaLiteSchema):
     """Legend schema wrapper
     
     anyOf(Mapping(required=[]), None)
@@ -577,7 +583,7 @@ class Legend(SchemaBase):
         super(Legend, self).__init__(*args, **kwds)
 
 
-class OrderChannelDef(SchemaBase):
+class OrderChannelDef(VegaLiteSchema):
     """OrderChannelDef schema wrapper
     
     Mapping(required=[])
@@ -616,7 +622,7 @@ class OrderChannelDef(SchemaBase):
                                               **kwds)
 
 
-class Data(SchemaBase):
+class Data(VegaLiteSchema):
     """Data schema wrapper
     
     Mapping(required=[])
@@ -638,7 +644,7 @@ class Data(SchemaBase):
         super(Data, self).__init__(format=format, url=url, values=values, **kwds)
 
 
-class DataFormat(SchemaBase):
+class DataFormat(VegaLiteSchema):
     """DataFormat schema wrapper
     
     Mapping(required=[])
@@ -685,7 +691,7 @@ class DataFormat(SchemaBase):
                                          type=type, **kwds)
 
 
-class DataFormatType(SchemaBase):
+class DataFormatType(VegaLiteSchema):
     """DataFormatType schema wrapper
     
     enum('json', 'csv', 'tsv', 'topojson')
@@ -697,7 +703,7 @@ class DataFormatType(SchemaBase):
         super(DataFormatType, self).__init__(*args)
 
 
-class Transform(SchemaBase):
+class Transform(VegaLiteSchema):
     """Transform schema wrapper
     
     Mapping(required=[])
@@ -725,7 +731,7 @@ class Transform(SchemaBase):
                                         **kwds)
 
 
-class EqualFilter(SchemaBase):
+class EqualFilter(VegaLiteSchema):
     """EqualFilter schema wrapper
     
     Mapping(required=[field, equal])
@@ -746,7 +752,7 @@ class EqualFilter(SchemaBase):
         super(EqualFilter, self).__init__(equal=equal, field=field, timeUnit=timeUnit, **kwds)
 
 
-class RangeFilter(SchemaBase):
+class RangeFilter(VegaLiteSchema):
     """RangeFilter schema wrapper
     
     Mapping(required=[field, range])
@@ -768,7 +774,7 @@ class RangeFilter(SchemaBase):
         super(RangeFilter, self).__init__(field=field, range=range, timeUnit=timeUnit, **kwds)
 
 
-class OneOfFilter(SchemaBase):
+class OneOfFilter(VegaLiteSchema):
     """OneOfFilter schema wrapper
     
     Mapping(required=[field, oneOf])
@@ -790,7 +796,7 @@ class OneOfFilter(SchemaBase):
         super(OneOfFilter, self).__init__(field=field, oneOf=oneOf, timeUnit=timeUnit, **kwds)
 
 
-class Formula(SchemaBase):
+class Formula(VegaLiteSchema):
     """Formula schema wrapper
     
     Mapping(required=[field, expr])
@@ -811,7 +817,7 @@ class Formula(SchemaBase):
         super(Formula, self).__init__(expr=expr, field=field, **kwds)
 
 
-class Config(SchemaBase):
+class Config(VegaLiteSchema):
     """Config schema wrapper
     
     Mapping(required=[])
@@ -858,7 +864,7 @@ class Config(SchemaBase):
                                      viewport=viewport, **kwds)
 
 
-class CellConfig(SchemaBase):
+class CellConfig(VegaLiteSchema):
     """CellConfig schema wrapper
     
     Mapping(required=[])
@@ -898,7 +904,7 @@ class CellConfig(SchemaBase):
                                          strokeWidth=strokeWidth, width=width, **kwds)
 
 
-class MarkConfig(SchemaBase):
+class MarkConfig(VegaLiteSchema):
     """MarkConfig schema wrapper
     
     Mapping(required=[])
@@ -1030,7 +1036,7 @@ class MarkConfig(SchemaBase):
                                          **kwds)
 
 
-class StackOffset(SchemaBase):
+class StackOffset(VegaLiteSchema):
     """StackOffset schema wrapper
     
     enum('zero', 'center', 'normalize', 'none')
@@ -1042,7 +1048,7 @@ class StackOffset(SchemaBase):
         super(StackOffset, self).__init__(*args)
 
 
-class Orient(SchemaBase):
+class Orient(VegaLiteSchema):
     """Orient schema wrapper
     
     enum('horizontal', 'vertical')
@@ -1054,7 +1060,7 @@ class Orient(SchemaBase):
         super(Orient, self).__init__(*args)
 
 
-class Interpolate(SchemaBase):
+class Interpolate(VegaLiteSchema):
     """Interpolate schema wrapper
     
     enum('linear', 'linear-closed', 'step', 'step-before', 'step-after', 'basis', 'basis-open', 
@@ -1067,7 +1073,7 @@ class Interpolate(SchemaBase):
         super(Interpolate, self).__init__(*args)
 
 
-class Shape(SchemaBase):
+class Shape(VegaLiteSchema):
     """Shape schema wrapper
     
     enum('circle', 'square', 'cross', 'diamond', 'triangle-up', 'triangle-down')
@@ -1079,7 +1085,7 @@ class Shape(SchemaBase):
         super(Shape, self).__init__(*args)
 
 
-class HorizontalAlign(SchemaBase):
+class HorizontalAlign(VegaLiteSchema):
     """HorizontalAlign schema wrapper
     
     enum('left', 'right', 'center')
@@ -1091,7 +1097,7 @@ class HorizontalAlign(SchemaBase):
         super(HorizontalAlign, self).__init__(*args)
 
 
-class VerticalAlign(SchemaBase):
+class VerticalAlign(VegaLiteSchema):
     """VerticalAlign schema wrapper
     
     enum('top', 'middle', 'bottom')
@@ -1103,7 +1109,7 @@ class VerticalAlign(SchemaBase):
         super(VerticalAlign, self).__init__(*args)
 
 
-class FontStyle(SchemaBase):
+class FontStyle(VegaLiteSchema):
     """FontStyle schema wrapper
     
     enum('normal', 'italic')
@@ -1115,7 +1121,7 @@ class FontStyle(SchemaBase):
         super(FontStyle, self).__init__(*args)
 
 
-class FontWeight(SchemaBase):
+class FontWeight(VegaLiteSchema):
     """FontWeight schema wrapper
     
     enum('normal', 'bold')
@@ -1127,7 +1133,7 @@ class FontWeight(SchemaBase):
         super(FontWeight, self).__init__(*args)
 
 
-class OverlayConfig(SchemaBase):
+class OverlayConfig(VegaLiteSchema):
     """OverlayConfig schema wrapper
     
     Mapping(required=[])
@@ -1151,7 +1157,7 @@ class OverlayConfig(SchemaBase):
                                             pointStyle=pointStyle, **kwds)
 
 
-class AreaOverlay(SchemaBase):
+class AreaOverlay(VegaLiteSchema):
     """AreaOverlay schema wrapper
     
     enum('line', 'linepoint', 'none')
@@ -1163,7 +1169,7 @@ class AreaOverlay(SchemaBase):
         super(AreaOverlay, self).__init__(*args)
 
 
-class ScaleConfig(SchemaBase):
+class ScaleConfig(VegaLiteSchema):
     """ScaleConfig schema wrapper
     
     Mapping(required=[])
@@ -1224,7 +1230,7 @@ class ScaleConfig(SchemaBase):
                                           tickSizeRange=tickSizeRange, useRawDomain=useRawDomain, **kwds)
 
 
-class AxisConfig(SchemaBase):
+class AxisConfig(VegaLiteSchema):
     """AxisConfig schema wrapper
     
     Mapping(required=[])
@@ -1344,7 +1350,7 @@ class AxisConfig(SchemaBase):
                                          titleOffset=titleOffset, **kwds)
 
 
-class LegendConfig(SchemaBase):
+class LegendConfig(VegaLiteSchema):
     """LegendConfig schema wrapper
     
     Mapping(required=[])
@@ -1430,7 +1436,7 @@ class LegendConfig(SchemaBase):
                                            titleFontWeight=titleFontWeight, **kwds)
 
 
-class FacetConfig(SchemaBase):
+class FacetConfig(VegaLiteSchema):
     """FacetConfig schema wrapper
     
     Mapping(required=[])
@@ -1453,7 +1459,7 @@ class FacetConfig(SchemaBase):
         super(FacetConfig, self).__init__(axis=axis, cell=cell, grid=grid, scale=scale, **kwds)
 
 
-class FacetScaleConfig(SchemaBase):
+class FacetScaleConfig(VegaLiteSchema):
     """FacetScaleConfig schema wrapper
     
     Mapping(required=[])
@@ -1472,7 +1478,7 @@ class FacetScaleConfig(SchemaBase):
         super(FacetScaleConfig, self).__init__(padding=padding, round=round, **kwds)
 
 
-class FacetGridConfig(SchemaBase):
+class FacetGridConfig(VegaLiteSchema):
     """FacetGridConfig schema wrapper
     
     Mapping(required=[])
@@ -1493,7 +1499,7 @@ class FacetGridConfig(SchemaBase):
         super(FacetGridConfig, self).__init__(color=color, offset=offset, opacity=opacity, **kwds)
 
 
-class FacetSpec(SchemaBase):
+class FacetSpec(VegaLiteSchema):
     """FacetSpec schema wrapper
     
     Mapping(required=[facet, spec])
@@ -1525,7 +1531,7 @@ class FacetSpec(SchemaBase):
                                         description=description, name=name, transform=transform, **kwds)
 
 
-class Facet(SchemaBase):
+class Facet(VegaLiteSchema):
     """Facet schema wrapper
     
     Mapping(required=[])
@@ -1544,7 +1550,7 @@ class Facet(SchemaBase):
         super(Facet, self).__init__(column=column, row=row, **kwds)
 
 
-class UnitSpec(SchemaBase):
+class UnitSpec(VegaLiteSchema):
     """UnitSpec schema wrapper
     
     Mapping(required=[mark])
@@ -1583,7 +1589,7 @@ class UnitSpec(SchemaBase):
                                        width=width, **kwds)
 
 
-class UnitEncoding(SchemaBase):
+class UnitEncoding(VegaLiteSchema):
     """UnitEncoding schema wrapper
     
     Mapping(required=[])
@@ -1637,7 +1643,7 @@ class UnitEncoding(SchemaBase):
                                            x=x, x2=x2, y=y, y2=y2, **kwds)
 
 
-class LayerSpec(SchemaBase):
+class LayerSpec(VegaLiteSchema):
     """LayerSpec schema wrapper
     
     Mapping(required=[layers])
diff --git a/altair/vegalite/v2/api.py b/altair/vegalite/v2/api.py
index 2438b944..7b73a02a 100644
--- a/altair/vegalite/v2/api.py
+++ b/altair/vegalite/v2/api.py
@@ -41,7 +41,7 @@ def _get_channels_mapping():
 
 # -------------------------------------------------------------------------
 # Tools for working with selections
-class SelectionMapping(core.SchemaBase):
+class SelectionMapping(core.VegaLiteSchema):
     """A mapping of selection names to selection definitions"""
     _schema = {
         'type': 'object',
@@ -163,7 +163,7 @@ def condition(predicate, if_true, if_false, **kwargs):
 
     Returns
     -------
-    spec: dict or SchemaBase
+    spec: dict or VegaLiteSchema
         the spec that describes the condition
     """
     selection_predicates = (core.SelectionNot, core.SelectionOr,
diff --git a/altair/vegalite/v2/schema/core.py b/altair/vegalite/v2/schema/core.py
index 2dffe003..76efcbc4 100644
--- a/altair/vegalite/v2/schema/core.py
+++ b/altair/vegalite/v2/schema/core.py
@@ -13,7 +13,13 @@ def load_schema():
         return json.load(f)
 
 
-class Root(SchemaBase):
+class VegaLiteSchema(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return VegaLiteSchema.__subclasses__()
+
+
+class Root(VegaLiteSchema):
     """Root schema wrapper
     
     anyOf(TopLevelFacetedUnitSpec, TopLevelLayerSpec, TopLevelFacetSpec, TopLevelRepeatSpec, 
@@ -26,7 +32,7 @@ class Root(SchemaBase):
         super(Root, self).__init__(*args, **kwds)
 
 
-class Aggregate(SchemaBase):
+class Aggregate(VegaLiteSchema):
     """Aggregate schema wrapper
     
     enum('argmax', 'argmin', 'average', 'count', 'distinct', 'max', 'mean', 'median', 'min', 
@@ -40,7 +46,7 @@ class Aggregate(SchemaBase):
         super(Aggregate, self).__init__(*args)
 
 
-class AggregateOp(SchemaBase):
+class AggregateOp(VegaLiteSchema):
     """AggregateOp schema wrapper
     
     enum('argmax', 'argmin', 'average', 'count', 'distinct', 'max', 'mean', 'median', 'min', 
@@ -54,7 +60,7 @@ class AggregateOp(SchemaBase):
         super(AggregateOp, self).__init__(*args)
 
 
-class AggregateTransform(SchemaBase):
+class AggregateTransform(VegaLiteSchema):
     """AggregateTransform schema wrapper
     
     Mapping(required=[aggregate])
@@ -74,7 +80,7 @@ class AggregateTransform(SchemaBase):
         super(AggregateTransform, self).__init__(aggregate=aggregate, groupby=groupby, **kwds)
 
 
-class AggregatedFieldDef(SchemaBase):
+class AggregatedFieldDef(VegaLiteSchema):
     """AggregatedFieldDef schema wrapper
     
     Mapping(required=[op, field, as])
@@ -96,7 +102,7 @@ class AggregatedFieldDef(SchemaBase):
         super(AggregatedFieldDef, self).__init__(field=field, op=op, **kwds)
 
 
-class Anchor(SchemaBase):
+class Anchor(VegaLiteSchema):
     """Anchor schema wrapper
     
     enum('start', 'middle', 'end')
@@ -108,7 +114,7 @@ class Anchor(SchemaBase):
         super(Anchor, self).__init__(*args)
 
 
-class AnyMark(SchemaBase):
+class AnyMark(VegaLiteSchema):
     """AnyMark schema wrapper
     
     anyOf(Mark, MarkDef)
@@ -120,7 +126,7 @@ class AnyMark(SchemaBase):
         super(AnyMark, self).__init__(*args, **kwds)
 
 
-class AutoSizeParams(SchemaBase):
+class AutoSizeParams(VegaLiteSchema):
     """AutoSizeParams schema wrapper
     
     Mapping(required=[])
@@ -149,7 +155,7 @@ class AutoSizeParams(SchemaBase):
         super(AutoSizeParams, self).__init__(contains=contains, resize=resize, type=type, **kwds)
 
 
-class AutosizeType(SchemaBase):
+class AutosizeType(VegaLiteSchema):
     """AutosizeType schema wrapper
     
     enum('pad', 'fit', 'none')
@@ -161,7 +167,7 @@ class AutosizeType(SchemaBase):
         super(AutosizeType, self).__init__(*args)
 
 
-class Axis(SchemaBase):
+class Axis(VegaLiteSchema):
     """Axis schema wrapper
     
     Mapping(required=[])
@@ -285,7 +291,7 @@ class Axis(SchemaBase):
                                    values=values, zindex=zindex, **kwds)
 
 
-class AxisConfig(SchemaBase):
+class AxisConfig(VegaLiteSchema):
     """AxisConfig schema wrapper
     
     Mapping(required=[])
@@ -437,7 +443,7 @@ class AxisConfig(SchemaBase):
                                          titlePadding=titlePadding, titleX=titleX, titleY=titleY, **kwds)
 
 
-class AxisOrient(SchemaBase):
+class AxisOrient(VegaLiteSchema):
     """AxisOrient schema wrapper
     
     enum('top', 'right', 'left', 'bottom')
@@ -449,7 +455,7 @@ class AxisOrient(SchemaBase):
         super(AxisOrient, self).__init__(*args)
 
 
-class AxisResolveMap(SchemaBase):
+class AxisResolveMap(VegaLiteSchema):
     """AxisResolveMap schema wrapper
     
     Mapping(required=[])
@@ -468,7 +474,7 @@ class AxisResolveMap(SchemaBase):
         super(AxisResolveMap, self).__init__(x=x, y=y, **kwds)
 
 
-class BarConfig(SchemaBase):
+class BarConfig(VegaLiteSchema):
     """BarConfig schema wrapper
     
     Mapping(required=[])
@@ -618,7 +624,7 @@ class BarConfig(SchemaBase):
                                         theta=theta, **kwds)
 
 
-class BasicType(SchemaBase):
+class BasicType(VegaLiteSchema):
     """BasicType schema wrapper
     
     enum('quantitative', 'ordinal', 'temporal', 'nominal')
@@ -630,7 +636,7 @@ class BasicType(SchemaBase):
         super(BasicType, self).__init__(*args)
 
 
-class BinParams(SchemaBase):
+class BinParams(VegaLiteSchema):
     """BinParams schema wrapper
     
     Mapping(required=[])
@@ -672,7 +678,7 @@ class BinParams(SchemaBase):
                                         minstep=minstep, nice=nice, step=step, steps=steps, **kwds)
 
 
-class BinTransform(SchemaBase):
+class BinTransform(VegaLiteSchema):
     """BinTransform schema wrapper
     
     Mapping(required=[bin, field, as])
@@ -692,7 +698,7 @@ class BinTransform(SchemaBase):
         super(BinTransform, self).__init__(bin=bin, field=field, **kwds)
 
 
-class BrushConfig(SchemaBase):
+class BrushConfig(VegaLiteSchema):
     """BrushConfig schema wrapper
     
     Mapping(required=[])
@@ -726,7 +732,7 @@ class BrushConfig(SchemaBase):
                                           strokeOpacity=strokeOpacity, strokeWidth=strokeWidth, **kwds)
 
 
-class CalculateTransform(SchemaBase):
+class CalculateTransform(VegaLiteSchema):
     """CalculateTransform schema wrapper
     
     Mapping(required=[calculate, as])
@@ -744,7 +750,7 @@ class CalculateTransform(SchemaBase):
         super(CalculateTransform, self).__init__(calculate=calculate, **kwds)
 
 
-class CompositeUnitSpec(SchemaBase):
+class CompositeUnitSpec(VegaLiteSchema):
     """CompositeUnitSpec schema wrapper
     
     Mapping(required=[mark])
@@ -827,7 +833,7 @@ class CompositeUnitSpec(SchemaBase):
                                                 transform=transform, width=width, **kwds)
 
 
-class ConditionalFieldDef(SchemaBase):
+class ConditionalFieldDef(VegaLiteSchema):
     """ConditionalFieldDef schema wrapper
     
     anyOf(ConditionalPredicateFieldDef, ConditionalSelectionFieldDef)
@@ -839,7 +845,7 @@ class ConditionalFieldDef(SchemaBase):
         super(ConditionalFieldDef, self).__init__(*args, **kwds)
 
 
-class ConditionalMarkPropFieldDef(SchemaBase):
+class ConditionalMarkPropFieldDef(VegaLiteSchema):
     """ConditionalMarkPropFieldDef schema wrapper
     
     anyOf(ConditionalPredicateMarkPropFieldDef, ConditionalSelectionMarkPropFieldDef)
@@ -851,7 +857,7 @@ class ConditionalMarkPropFieldDef(SchemaBase):
         super(ConditionalMarkPropFieldDef, self).__init__(*args, **kwds)
 
 
-class ConditionalTextFieldDef(SchemaBase):
+class ConditionalTextFieldDef(VegaLiteSchema):
     """ConditionalTextFieldDef schema wrapper
     
     anyOf(ConditionalPredicateTextFieldDef, ConditionalSelectionTextFieldDef)
@@ -863,7 +869,7 @@ class ConditionalTextFieldDef(SchemaBase):
         super(ConditionalTextFieldDef, self).__init__(*args, **kwds)
 
 
-class ConditionalValueDef(SchemaBase):
+class ConditionalValueDef(VegaLiteSchema):
     """ConditionalValueDef schema wrapper
     
     anyOf(ConditionalPredicateValueDef, ConditionalSelectionValueDef)
@@ -875,7 +881,7 @@ class ConditionalValueDef(SchemaBase):
         super(ConditionalValueDef, self).__init__(*args, **kwds)
 
 
-class ConditionalPredicateFieldDef(SchemaBase):
+class ConditionalPredicateFieldDef(VegaLiteSchema):
     """ConditionalPredicateFieldDef schema wrapper
     
     Mapping(required=[test, type])
@@ -923,7 +929,7 @@ class ConditionalPredicateFieldDef(SchemaBase):
                                                            **kwds)
 
 
-class ConditionalPredicateMarkPropFieldDef(SchemaBase):
+class ConditionalPredicateMarkPropFieldDef(VegaLiteSchema):
     """ConditionalPredicateMarkPropFieldDef schema wrapper
     
     Mapping(required=[test, type])
@@ -990,7 +996,7 @@ class ConditionalPredicateMarkPropFieldDef(SchemaBase):
                                                                    timeUnit=timeUnit, **kwds)
 
 
-class ConditionalPredicateTextFieldDef(SchemaBase):
+class ConditionalPredicateTextFieldDef(VegaLiteSchema):
     """ConditionalPredicateTextFieldDef schema wrapper
     
     Mapping(required=[test, type])
@@ -1042,7 +1048,7 @@ class ConditionalPredicateTextFieldDef(SchemaBase):
                                                                timeUnit=timeUnit, **kwds)
 
 
-class ConditionalPredicateValueDef(SchemaBase):
+class ConditionalPredicateValueDef(VegaLiteSchema):
     """ConditionalPredicateValueDef schema wrapper
     
     Mapping(required=[test, value])
@@ -1062,7 +1068,7 @@ class ConditionalPredicateValueDef(SchemaBase):
         super(ConditionalPredicateValueDef, self).__init__(test=test, value=value, **kwds)
 
 
-class ConditionalSelectionFieldDef(SchemaBase):
+class ConditionalSelectionFieldDef(VegaLiteSchema):
     """ConditionalSelectionFieldDef schema wrapper
     
     Mapping(required=[selection, type])
@@ -1112,7 +1118,7 @@ class ConditionalSelectionFieldDef(SchemaBase):
                                                            timeUnit=timeUnit, **kwds)
 
 
-class ConditionalSelectionMarkPropFieldDef(SchemaBase):
+class ConditionalSelectionMarkPropFieldDef(VegaLiteSchema):
     """ConditionalSelectionMarkPropFieldDef schema wrapper
     
     Mapping(required=[selection, type])
@@ -1181,7 +1187,7 @@ class ConditionalSelectionMarkPropFieldDef(SchemaBase):
                                                                    timeUnit=timeUnit, **kwds)
 
 
-class ConditionalSelectionTextFieldDef(SchemaBase):
+class ConditionalSelectionTextFieldDef(VegaLiteSchema):
     """ConditionalSelectionTextFieldDef schema wrapper
     
     Mapping(required=[selection, type])
@@ -1235,7 +1241,7 @@ class ConditionalSelectionTextFieldDef(SchemaBase):
                                                                timeUnit=timeUnit, **kwds)
 
 
-class ConditionalSelectionValueDef(SchemaBase):
+class ConditionalSelectionValueDef(VegaLiteSchema):
     """ConditionalSelectionValueDef schema wrapper
     
     Mapping(required=[selection, value])
@@ -1257,7 +1263,7 @@ class ConditionalSelectionValueDef(SchemaBase):
         super(ConditionalSelectionValueDef, self).__init__(selection=selection, value=value, **kwds)
 
 
-class Config(SchemaBase):
+class Config(VegaLiteSchema):
     """Config schema wrapper
     
     Mapping(required=[])
@@ -1400,7 +1406,7 @@ class Config(SchemaBase):
                                      title=title, view=view, **kwds)
 
 
-class CsvDataFormat(SchemaBase):
+class CsvDataFormat(VegaLiteSchema):
     """CsvDataFormat schema wrapper
     
     Mapping(required=[])
@@ -1431,7 +1437,7 @@ class CsvDataFormat(SchemaBase):
         super(CsvDataFormat, self).__init__(parse=parse, type=type, **kwds)
 
 
-class Data(SchemaBase):
+class Data(VegaLiteSchema):
     """Data schema wrapper
     
     anyOf(UrlData, InlineData, NamedData)
@@ -1443,7 +1449,7 @@ class Data(SchemaBase):
         super(Data, self).__init__(*args, **kwds)
 
 
-class DataFormat(SchemaBase):
+class DataFormat(VegaLiteSchema):
     """DataFormat schema wrapper
     
     anyOf(CsvDataFormat, JsonDataFormat, TopoDataFormat)
@@ -1455,7 +1461,7 @@ class DataFormat(SchemaBase):
         super(DataFormat, self).__init__(*args, **kwds)
 
 
-class DateTime(SchemaBase):
+class DateTime(VegaLiteSchema):
     """DateTime schema wrapper
     
     Mapping(required=[])
@@ -1505,7 +1511,7 @@ class DateTime(SchemaBase):
                                        utc=utc, year=year, **kwds)
 
 
-class Day(SchemaBase):
+class Day(VegaLiteSchema):
     """Day schema wrapper
     
     float
@@ -1517,7 +1523,7 @@ class Day(SchemaBase):
         super(Day, self).__init__(*args)
 
 
-class Encoding(SchemaBase):
+class Encoding(VegaLiteSchema):
     """Encoding schema wrapper
     
     Mapping(required=[])
@@ -1579,7 +1585,7 @@ class Encoding(SchemaBase):
                                        x=x, x2=x2, y=y, y2=y2, **kwds)
 
 
-class EncodingWithFacet(SchemaBase):
+class EncodingWithFacet(VegaLiteSchema):
     """EncodingWithFacet schema wrapper
     
     Mapping(required=[])
@@ -1647,7 +1653,7 @@ class EncodingWithFacet(SchemaBase):
                                                 y2=y2, **kwds)
 
 
-class FacetFieldDef(SchemaBase):
+class FacetFieldDef(VegaLiteSchema):
     """FacetFieldDef schema wrapper
     
     Mapping(required=[type])
@@ -1696,7 +1702,7 @@ class FacetFieldDef(SchemaBase):
                                             header=header, sort=sort, timeUnit=timeUnit, **kwds)
 
 
-class FacetMapping(SchemaBase):
+class FacetMapping(VegaLiteSchema):
     """FacetMapping schema wrapper
     
     Mapping(required=[])
@@ -1715,7 +1721,7 @@ class FacetMapping(SchemaBase):
         super(FacetMapping, self).__init__(column=column, row=row, **kwds)
 
 
-class FieldDef(SchemaBase):
+class FieldDef(VegaLiteSchema):
     """FieldDef schema wrapper
     
     Mapping(required=[type])
@@ -1761,7 +1767,7 @@ class FieldDef(SchemaBase):
                                        timeUnit=timeUnit, **kwds)
 
 
-class FieldDefWithCondition(SchemaBase):
+class FieldDefWithCondition(VegaLiteSchema):
     """FieldDefWithCondition schema wrapper
     
     Mapping(required=[type])
@@ -1818,7 +1824,7 @@ class FieldDefWithCondition(SchemaBase):
                                                     **kwds)
 
 
-class MarkPropFieldDefWithCondition(SchemaBase):
+class MarkPropFieldDefWithCondition(VegaLiteSchema):
     """MarkPropFieldDefWithCondition schema wrapper
     
     Mapping(required=[type])
@@ -1893,7 +1899,7 @@ class MarkPropFieldDefWithCondition(SchemaBase):
                                                             timeUnit=timeUnit, **kwds)
 
 
-class TextFieldDefWithCondition(SchemaBase):
+class TextFieldDefWithCondition(VegaLiteSchema):
     """TextFieldDefWithCondition schema wrapper
     
     Mapping(required=[type])
@@ -1953,7 +1959,7 @@ class TextFieldDefWithCondition(SchemaBase):
                                                         timeUnit=timeUnit, **kwds)
 
 
-class FieldEqualPredicate(SchemaBase):
+class FieldEqualPredicate(VegaLiteSchema):
     """FieldEqualPredicate schema wrapper
     
     Mapping(required=[field, equal])
@@ -1974,7 +1980,7 @@ class FieldEqualPredicate(SchemaBase):
         super(FieldEqualPredicate, self).__init__(equal=equal, field=field, timeUnit=timeUnit, **kwds)
 
 
-class FieldOneOfPredicate(SchemaBase):
+class FieldOneOfPredicate(VegaLiteSchema):
     """FieldOneOfPredicate schema wrapper
     
     Mapping(required=[field, oneOf])
@@ -1996,7 +2002,7 @@ class FieldOneOfPredicate(SchemaBase):
         super(FieldOneOfPredicate, self).__init__(field=field, oneOf=oneOf, timeUnit=timeUnit, **kwds)
 
 
-class FieldRangePredicate(SchemaBase):
+class FieldRangePredicate(VegaLiteSchema):
     """FieldRangePredicate schema wrapper
     
     Mapping(required=[field, range])
@@ -2018,7 +2024,7 @@ class FieldRangePredicate(SchemaBase):
         super(FieldRangePredicate, self).__init__(field=field, range=range, timeUnit=timeUnit, **kwds)
 
 
-class FilterTransform(SchemaBase):
+class FilterTransform(VegaLiteSchema):
     """FilterTransform schema wrapper
     
     Mapping(required=[filter])
@@ -2044,7 +2050,7 @@ class FilterTransform(SchemaBase):
         super(FilterTransform, self).__init__(filter=filter, **kwds)
 
 
-class FontStyle(SchemaBase):
+class FontStyle(VegaLiteSchema):
     """FontStyle schema wrapper
     
     enum('normal', 'italic')
@@ -2056,7 +2062,7 @@ class FontStyle(SchemaBase):
         super(FontStyle, self).__init__(*args)
 
 
-class FontWeight(SchemaBase):
+class FontWeight(VegaLiteSchema):
     """FontWeight schema wrapper
     
     enum('normal', 'bold')
@@ -2068,7 +2074,7 @@ class FontWeight(SchemaBase):
         super(FontWeight, self).__init__(*args)
 
 
-class FontWeightNumber(SchemaBase):
+class FontWeightNumber(VegaLiteSchema):
     """FontWeightNumber schema wrapper
     
     float
@@ -2080,7 +2086,7 @@ class FontWeightNumber(SchemaBase):
         super(FontWeightNumber, self).__init__(*args)
 
 
-class FacetSpec(SchemaBase):
+class FacetSpec(VegaLiteSchema):
     """FacetSpec schema wrapper
     
     Mapping(required=[facet, spec])
@@ -2115,7 +2121,7 @@ class FacetSpec(SchemaBase):
                                         **kwds)
 
 
-class HConcatSpec(SchemaBase):
+class HConcatSpec(VegaLiteSchema):
     """HConcatSpec schema wrapper
     
     Mapping(required=[hconcat])
@@ -2147,7 +2153,7 @@ class HConcatSpec(SchemaBase):
                                           **kwds)
 
 
-class LayerSpec(SchemaBase):
+class LayerSpec(VegaLiteSchema):
     """LayerSpec schema wrapper
     
     Mapping(required=[layer])
@@ -2223,7 +2229,7 @@ class LayerSpec(SchemaBase):
                                         width=width, **kwds)
 
 
-class RepeatSpec(SchemaBase):
+class RepeatSpec(VegaLiteSchema):
     """RepeatSpec schema wrapper
     
     Mapping(required=[repeat, spec])
@@ -2258,7 +2264,7 @@ class RepeatSpec(SchemaBase):
                                          **kwds)
 
 
-class Spec(SchemaBase):
+class Spec(VegaLiteSchema):
     """Spec schema wrapper
     
     anyOf(CompositeUnitSpec, LayerSpec, FacetSpec, RepeatSpec, VConcatSpec, HConcatSpec)
@@ -2270,7 +2276,7 @@ class Spec(SchemaBase):
         super(Spec, self).__init__(*args, **kwds)
 
 
-class CompositeUnitSpecAlias(SchemaBase):
+class CompositeUnitSpecAlias(VegaLiteSchema):
     """CompositeUnitSpecAlias schema wrapper
     
     Mapping(required=[mark])
@@ -2354,7 +2360,7 @@ class CompositeUnitSpecAlias(SchemaBase):
                                                      **kwds)
 
 
-class FacetedCompositeUnitSpecAlias(SchemaBase):
+class FacetedCompositeUnitSpecAlias(VegaLiteSchema):
     """FacetedCompositeUnitSpecAlias schema wrapper
     
     Mapping(required=[mark])
@@ -2439,7 +2445,7 @@ class FacetedCompositeUnitSpecAlias(SchemaBase):
                                                             width=width, **kwds)
 
 
-class VConcatSpec(SchemaBase):
+class VConcatSpec(VegaLiteSchema):
     """VConcatSpec schema wrapper
     
     Mapping(required=[vconcat])
@@ -2471,7 +2477,7 @@ class VConcatSpec(SchemaBase):
                                           **kwds)
 
 
-class GeoType(SchemaBase):
+class GeoType(VegaLiteSchema):
     """GeoType schema wrapper
     
     enum('latitude', 'longitude', 'geojson')
@@ -2483,7 +2489,7 @@ class GeoType(SchemaBase):
         super(GeoType, self).__init__(*args)
 
 
-class Header(SchemaBase):
+class Header(VegaLiteSchema):
     """Header schema wrapper
     
     Mapping(required=[])
@@ -2519,7 +2525,7 @@ class Header(SchemaBase):
         super(Header, self).__init__(format=format, labelAngle=labelAngle, title=title, **kwds)
 
 
-class HorizontalAlign(SchemaBase):
+class HorizontalAlign(VegaLiteSchema):
     """HorizontalAlign schema wrapper
     
     enum('left', 'right', 'center')
@@ -2531,7 +2537,7 @@ class HorizontalAlign(SchemaBase):
         super(HorizontalAlign, self).__init__(*args)
 
 
-class InlineData(SchemaBase):
+class InlineData(VegaLiteSchema):
     """InlineData schema wrapper
     
     Mapping(required=[values])
@@ -2553,7 +2559,7 @@ class InlineData(SchemaBase):
         super(InlineData, self).__init__(values=values, format=format, **kwds)
 
 
-class Interpolate(SchemaBase):
+class Interpolate(VegaLiteSchema):
     """Interpolate schema wrapper
     
     enum('linear', 'linear-closed', 'step', 'step-before', 'step-after', 'basis', 'basis-open', 
@@ -2566,7 +2572,7 @@ class Interpolate(SchemaBase):
         super(Interpolate, self).__init__(*args)
 
 
-class IntervalSelection(SchemaBase):
+class IntervalSelection(VegaLiteSchema):
     """IntervalSelection schema wrapper
     
     Mapping(required=[type])
@@ -2624,7 +2630,7 @@ class IntervalSelection(SchemaBase):
                                                 translate=translate, zoom=zoom, **kwds)
 
 
-class IntervalSelectionConfig(SchemaBase):
+class IntervalSelectionConfig(VegaLiteSchema):
     """IntervalSelectionConfig schema wrapper
     
     Mapping(required=[])
@@ -2680,7 +2686,7 @@ class IntervalSelectionConfig(SchemaBase):
                                                       translate=translate, zoom=zoom, **kwds)
 
 
-class JsonDataFormat(SchemaBase):
+class JsonDataFormat(VegaLiteSchema):
     """JsonDataFormat schema wrapper
     
     Mapping(required=[])
@@ -2716,7 +2722,7 @@ class JsonDataFormat(SchemaBase):
         super(JsonDataFormat, self).__init__(parse=parse, property=property, type=type, **kwds)
 
 
-class Legend(SchemaBase):
+class Legend(VegaLiteSchema):
     """Legend schema wrapper
     
     Mapping(required=[])
@@ -2776,7 +2782,7 @@ class Legend(SchemaBase):
                                      type=type, values=values, zindex=zindex, **kwds)
 
 
-class LegendConfig(SchemaBase):
+class LegendConfig(VegaLiteSchema):
     """LegendConfig schema wrapper
     
     Mapping(required=[])
@@ -2898,7 +2904,7 @@ class LegendConfig(SchemaBase):
                                            titleLimit=titleLimit, titlePadding=titlePadding, **kwds)
 
 
-class LegendOrient(SchemaBase):
+class LegendOrient(VegaLiteSchema):
     """LegendOrient schema wrapper
     
     enum('left', 'right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none')
@@ -2910,7 +2916,7 @@ class LegendOrient(SchemaBase):
         super(LegendOrient, self).__init__(*args)
 
 
-class LegendResolveMap(SchemaBase):
+class LegendResolveMap(VegaLiteSchema):
     """LegendResolveMap schema wrapper
     
     Mapping(required=[])
@@ -2934,7 +2940,7 @@ class LegendResolveMap(SchemaBase):
                                                **kwds)
 
 
-class LocalMultiTimeUnit(SchemaBase):
+class LocalMultiTimeUnit(VegaLiteSchema):
     """LocalMultiTimeUnit schema wrapper
     
     enum('yearquarter', 'yearquartermonth', 'yearmonth', 'yearmonthdate', 'yearmonthdatehours', 
@@ -2948,7 +2954,7 @@ class LocalMultiTimeUnit(SchemaBase):
         super(LocalMultiTimeUnit, self).__init__(*args)
 
 
-class LocalSingleTimeUnit(SchemaBase):
+class LocalSingleTimeUnit(VegaLiteSchema):
     """LocalSingleTimeUnit schema wrapper
     
     enum('year', 'quarter', 'month', 'day', 'date', 'hours', 'minutes', 'seconds', 
@@ -2961,7 +2967,7 @@ class LocalSingleTimeUnit(SchemaBase):
         super(LocalSingleTimeUnit, self).__init__(*args)
 
 
-class LogicalAndPredicate(SchemaBase):
+class LogicalAndPredicate(VegaLiteSchema):
     """LogicalAndPredicate schema wrapper
     
     Mapping(required=[and])
@@ -2976,7 +2982,7 @@ class LogicalAndPredicate(SchemaBase):
         super(LogicalAndPredicate, self).__init__(**kwds)
 
 
-class SelectionAnd(SchemaBase):
+class SelectionAnd(VegaLiteSchema):
     """SelectionAnd schema wrapper
     
     Mapping(required=[and])
@@ -2991,7 +2997,7 @@ class SelectionAnd(SchemaBase):
         super(SelectionAnd, self).__init__(**kwds)
 
 
-class LogicalNotPredicate(SchemaBase):
+class LogicalNotPredicate(VegaLiteSchema):
     """LogicalNotPredicate schema wrapper
     
     Mapping(required=[not])
@@ -3006,7 +3012,7 @@ class LogicalNotPredicate(SchemaBase):
         super(LogicalNotPredicate, self).__init__(**kwds)
 
 
-class SelectionNot(SchemaBase):
+class SelectionNot(VegaLiteSchema):
     """SelectionNot schema wrapper
     
     Mapping(required=[not])
@@ -3021,7 +3027,7 @@ class SelectionNot(SchemaBase):
         super(SelectionNot, self).__init__(**kwds)
 
 
-class LogicalOperandPredicate(SchemaBase):
+class LogicalOperandPredicate(VegaLiteSchema):
     """LogicalOperandPredicate schema wrapper
     
     anyOf(LogicalNotPredicate, LogicalAndPredicate, LogicalOrPredicate, Predicate)
@@ -3033,7 +3039,7 @@ class LogicalOperandPredicate(SchemaBase):
         super(LogicalOperandPredicate, self).__init__(*args, **kwds)
 
 
-class SelectionOperand(SchemaBase):
+class SelectionOperand(VegaLiteSchema):
     """SelectionOperand schema wrapper
     
     anyOf(SelectionNot, SelectionAnd, SelectionOr, string)
@@ -3045,7 +3051,7 @@ class SelectionOperand(SchemaBase):
         super(SelectionOperand, self).__init__(*args, **kwds)
 
 
-class LogicalOrPredicate(SchemaBase):
+class LogicalOrPredicate(VegaLiteSchema):
     """LogicalOrPredicate schema wrapper
     
     Mapping(required=[or])
@@ -3060,7 +3066,7 @@ class LogicalOrPredicate(SchemaBase):
         super(LogicalOrPredicate, self).__init__(**kwds)
 
 
-class SelectionOr(SchemaBase):
+class SelectionOr(VegaLiteSchema):
     """SelectionOr schema wrapper
     
     Mapping(required=[or])
@@ -3075,7 +3081,7 @@ class SelectionOr(SchemaBase):
         super(SelectionOr, self).__init__(**kwds)
 
 
-class LookupData(SchemaBase):
+class LookupData(VegaLiteSchema):
     """LookupData schema wrapper
     
     Mapping(required=[data, key])
@@ -3096,7 +3102,7 @@ class LookupData(SchemaBase):
         super(LookupData, self).__init__(data=data, key=key, fields=fields, **kwds)
 
 
-class LookupTransform(SchemaBase):
+class LookupTransform(VegaLiteSchema):
     """LookupTransform schema wrapper
     
     Mapping(required=[lookup, from])
@@ -3115,7 +3121,7 @@ class LookupTransform(SchemaBase):
         super(LookupTransform, self).__init__(lookup=lookup, default=default, **kwds)
 
 
-class Mark(SchemaBase):
+class Mark(VegaLiteSchema):
     """Mark schema wrapper
     
     enum('area', 'bar', 'line', 'point', 'text', 'tick', 'rect', 'rule', 'circle', 'square', 
@@ -3129,7 +3135,7 @@ class Mark(SchemaBase):
         super(Mark, self).__init__(*args)
 
 
-class MarkConfig(SchemaBase):
+class MarkConfig(VegaLiteSchema):
     """MarkConfig schema wrapper
     
     Mapping(required=[])
@@ -3268,7 +3274,7 @@ class MarkConfig(SchemaBase):
                                          theta=theta, **kwds)
 
 
-class MarkDef(SchemaBase):
+class MarkDef(VegaLiteSchema):
     """MarkDef schema wrapper
     
     Mapping(required=[type])
@@ -3423,7 +3429,7 @@ class MarkDef(SchemaBase):
                                       theta=theta, **kwds)
 
 
-class Month(SchemaBase):
+class Month(VegaLiteSchema):
     """Month schema wrapper
     
     float
@@ -3435,7 +3441,7 @@ class Month(SchemaBase):
         super(Month, self).__init__(*args)
 
 
-class MultiSelection(SchemaBase):
+class MultiSelection(VegaLiteSchema):
     """MultiSelection schema wrapper
     
     Mapping(required=[type])
@@ -3484,7 +3490,7 @@ class MultiSelection(SchemaBase):
                                              **kwds)
 
 
-class MultiSelectionConfig(SchemaBase):
+class MultiSelectionConfig(VegaLiteSchema):
     """MultiSelectionConfig schema wrapper
     
     Mapping(required=[])
@@ -3531,7 +3537,7 @@ class MultiSelectionConfig(SchemaBase):
                                                    toggle=toggle, **kwds)
 
 
-class MultiTimeUnit(SchemaBase):
+class MultiTimeUnit(VegaLiteSchema):
     """MultiTimeUnit schema wrapper
     
     anyOf(LocalMultiTimeUnit, UtcMultiTimeUnit)
@@ -3543,7 +3549,7 @@ class MultiTimeUnit(SchemaBase):
         super(MultiTimeUnit, self).__init__(*args, **kwds)
 
 
-class NamedData(SchemaBase):
+class NamedData(VegaLiteSchema):
     """NamedData schema wrapper
     
     Mapping(required=[name])
@@ -3562,7 +3568,7 @@ class NamedData(SchemaBase):
         super(NamedData, self).__init__(name=name, format=format, **kwds)
 
 
-class NiceTime(SchemaBase):
+class NiceTime(VegaLiteSchema):
     """NiceTime schema wrapper
     
     enum('second', 'minute', 'hour', 'day', 'week', 'month', 'year')
@@ -3574,7 +3580,7 @@ class NiceTime(SchemaBase):
         super(NiceTime, self).__init__(*args)
 
 
-class OrderFieldDef(SchemaBase):
+class OrderFieldDef(VegaLiteSchema):
     """OrderFieldDef schema wrapper
     
     Mapping(required=[type])
@@ -3621,7 +3627,7 @@ class OrderFieldDef(SchemaBase):
                                             sort=sort, timeUnit=timeUnit, **kwds)
 
 
-class Orient(SchemaBase):
+class Orient(VegaLiteSchema):
     """Orient schema wrapper
     
     enum('horizontal', 'vertical')
@@ -3633,7 +3639,7 @@ class Orient(SchemaBase):
         super(Orient, self).__init__(*args)
 
 
-class Padding(SchemaBase):
+class Padding(VegaLiteSchema):
     """Padding schema wrapper
     
     anyOf(float, Mapping(required=[]))
@@ -3645,7 +3651,7 @@ class Padding(SchemaBase):
         super(Padding, self).__init__(*args, **kwds)
 
 
-class PositionFieldDef(SchemaBase):
+class PositionFieldDef(VegaLiteSchema):
     """PositionFieldDef schema wrapper
     
     Mapping(required=[type])
@@ -3727,7 +3733,7 @@ class PositionFieldDef(SchemaBase):
                                                timeUnit=timeUnit, **kwds)
 
 
-class Predicate(SchemaBase):
+class Predicate(VegaLiteSchema):
     """Predicate schema wrapper
     
     anyOf(FieldEqualPredicate, FieldRangePredicate, FieldOneOfPredicate, SelectionPredicate, 
@@ -3740,7 +3746,7 @@ class Predicate(SchemaBase):
         super(Predicate, self).__init__(*args, **kwds)
 
 
-class Projection(SchemaBase):
+class Projection(VegaLiteSchema):
     """Projection schema wrapper
     
     Mapping(required=[])
@@ -3810,7 +3816,7 @@ class Projection(SchemaBase):
                                          tilt=tilt, type=type, **kwds)
 
 
-class ProjectionConfig(SchemaBase):
+class ProjectionConfig(VegaLiteSchema):
     """ProjectionConfig schema wrapper
     
     Mapping(required=[])
@@ -3882,7 +3888,7 @@ class ProjectionConfig(SchemaBase):
                                                type=type, **kwds)
 
 
-class ProjectionType(SchemaBase):
+class ProjectionType(VegaLiteSchema):
     """ProjectionType schema wrapper
     
     enum('albers', 'albersUsa', 'azimuthalEqualArea', 'azimuthalEquidistant', 'conicConformal', 
@@ -3896,7 +3902,7 @@ class ProjectionType(SchemaBase):
         super(ProjectionType, self).__init__(*args)
 
 
-class RangeConfig(SchemaBase):
+class RangeConfig(VegaLiteSchema):
     """RangeConfig schema wrapper
     
     Mapping(required=[])
@@ -3925,7 +3931,7 @@ class RangeConfig(SchemaBase):
                                           ordinal=ordinal, ramp=ramp, symbol=symbol, **kwds)
 
 
-class RangeConfigValue(SchemaBase):
+class RangeConfigValue(VegaLiteSchema):
     """RangeConfigValue schema wrapper
     
     anyOf(List(anyOf(float, string)), VgScheme, Mapping(required=[step]))
@@ -3937,7 +3943,7 @@ class RangeConfigValue(SchemaBase):
         super(RangeConfigValue, self).__init__(*args, **kwds)
 
 
-class Repeat(SchemaBase):
+class Repeat(VegaLiteSchema):
     """Repeat schema wrapper
     
     Mapping(required=[])
@@ -3956,7 +3962,7 @@ class Repeat(SchemaBase):
         super(Repeat, self).__init__(column=column, row=row, **kwds)
 
 
-class RepeatRef(SchemaBase):
+class RepeatRef(VegaLiteSchema):
     """RepeatRef schema wrapper
     
     Mapping(required=[repeat])
@@ -3974,7 +3980,7 @@ class RepeatRef(SchemaBase):
         super(RepeatRef, self).__init__(repeat=repeat, **kwds)
 
 
-class Resolve(SchemaBase):
+class Resolve(VegaLiteSchema):
     """Resolve schema wrapper
     
     Mapping(required=[])
@@ -3997,7 +4003,7 @@ class Resolve(SchemaBase):
         super(Resolve, self).__init__(axis=axis, legend=legend, scale=scale, **kwds)
 
 
-class ResolveMode(SchemaBase):
+class ResolveMode(VegaLiteSchema):
     """ResolveMode schema wrapper
     
     enum('independent', 'shared')
@@ -4009,7 +4015,7 @@ class ResolveMode(SchemaBase):
         super(ResolveMode, self).__init__(*args)
 
 
-class Scale(SchemaBase):
+class Scale(VegaLiteSchema):
     """Scale schema wrapper
     
     Mapping(required=[])
@@ -4157,7 +4163,7 @@ class Scale(SchemaBase):
                                     zero=zero, **kwds)
 
 
-class ScaleConfig(SchemaBase):
+class ScaleConfig(VegaLiteSchema):
     """ScaleConfig schema wrapper
     
     Mapping(required=[])
@@ -4244,7 +4250,7 @@ class ScaleConfig(SchemaBase):
                                           useUnaggregatedDomain=useUnaggregatedDomain, **kwds)
 
 
-class ScaleInterpolate(SchemaBase):
+class ScaleInterpolate(VegaLiteSchema):
     """ScaleInterpolate schema wrapper
     
     enum('rgb', 'lab', 'hcl', 'hsl', 'hsl-long', 'hcl-long', 'cubehelix', 'cubehelix-long')
@@ -4256,7 +4262,7 @@ class ScaleInterpolate(SchemaBase):
         super(ScaleInterpolate, self).__init__(*args)
 
 
-class ScaleInterpolateParams(SchemaBase):
+class ScaleInterpolateParams(VegaLiteSchema):
     """ScaleInterpolateParams schema wrapper
     
     Mapping(required=[type])
@@ -4275,7 +4281,7 @@ class ScaleInterpolateParams(SchemaBase):
         super(ScaleInterpolateParams, self).__init__(type=type, gamma=gamma, **kwds)
 
 
-class ScaleResolveMap(SchemaBase):
+class ScaleResolveMap(VegaLiteSchema):
     """ScaleResolveMap schema wrapper
     
     Mapping(required=[])
@@ -4304,7 +4310,7 @@ class ScaleResolveMap(SchemaBase):
                                               y=y, **kwds)
 
 
-class ScaleType(SchemaBase):
+class ScaleType(VegaLiteSchema):
     """ScaleType schema wrapper
     
     enum('linear', 'bin-linear', 'log', 'pow', 'sqrt', 'time', 'utc', 'sequential', 'ordinal', 
@@ -4317,7 +4323,7 @@ class ScaleType(SchemaBase):
         super(ScaleType, self).__init__(*args)
 
 
-class SchemeParams(SchemaBase):
+class SchemeParams(VegaLiteSchema):
     """SchemeParams schema wrapper
     
     Mapping(required=[name])
@@ -4340,7 +4346,7 @@ class SchemeParams(SchemaBase):
         super(SchemeParams, self).__init__(name=name, extent=extent, **kwds)
 
 
-class SelectionConfig(SchemaBase):
+class SelectionConfig(VegaLiteSchema):
     """SelectionConfig schema wrapper
     
     Mapping(required=[])
@@ -4371,7 +4377,7 @@ class SelectionConfig(SchemaBase):
         super(SelectionConfig, self).__init__(interval=interval, multi=multi, single=single, **kwds)
 
 
-class SelectionDef(SchemaBase):
+class SelectionDef(VegaLiteSchema):
     """SelectionDef schema wrapper
     
     anyOf(SingleSelection, MultiSelection, IntervalSelection)
@@ -4383,7 +4389,7 @@ class SelectionDef(SchemaBase):
         super(SelectionDef, self).__init__(*args, **kwds)
 
 
-class SelectionDomain(SchemaBase):
+class SelectionDomain(VegaLiteSchema):
     """SelectionDomain schema wrapper
     
     anyOf(Mapping(required=[selection]), Mapping(required=[selection]))
@@ -4395,7 +4401,7 @@ class SelectionDomain(SchemaBase):
         super(SelectionDomain, self).__init__(*args, **kwds)
 
 
-class SelectionPredicate(SchemaBase):
+class SelectionPredicate(VegaLiteSchema):
     """SelectionPredicate schema wrapper
     
     Mapping(required=[selection])
@@ -4412,7 +4418,7 @@ class SelectionPredicate(SchemaBase):
         super(SelectionPredicate, self).__init__(selection=selection, **kwds)
 
 
-class SelectionResolution(SchemaBase):
+class SelectionResolution(VegaLiteSchema):
     """SelectionResolution schema wrapper
     
     enum('global', 'union', 'intersect')
@@ -4424,7 +4430,7 @@ class SelectionResolution(SchemaBase):
         super(SelectionResolution, self).__init__(*args)
 
 
-class SingleDefChannel(SchemaBase):
+class SingleDefChannel(VegaLiteSchema):
     """SingleDefChannel schema wrapper
     
     enum('x', 'y', 'x2', 'y2', 'row', 'column', 'size', 'shape', 'color', 'opacity', 'text', 
@@ -4437,7 +4443,7 @@ class SingleDefChannel(SchemaBase):
         super(SingleDefChannel, self).__init__(*args)
 
 
-class SingleSelection(SchemaBase):
+class SingleSelection(VegaLiteSchema):
     """SingleSelection schema wrapper
     
     Mapping(required=[type])
@@ -4485,7 +4491,7 @@ class SingleSelection(SchemaBase):
                                               **kwds)
 
 
-class SingleSelectionConfig(SchemaBase):
+class SingleSelectionConfig(VegaLiteSchema):
     """SingleSelectionConfig schema wrapper
     
     Mapping(required=[])
@@ -4531,7 +4537,7 @@ class SingleSelectionConfig(SchemaBase):
                                                     resolve=resolve, **kwds)
 
 
-class SingleTimeUnit(SchemaBase):
+class SingleTimeUnit(VegaLiteSchema):
     """SingleTimeUnit schema wrapper
     
     anyOf(LocalSingleTimeUnit, UtcSingleTimeUnit)
@@ -4543,7 +4549,7 @@ class SingleTimeUnit(SchemaBase):
         super(SingleTimeUnit, self).__init__(*args, **kwds)
 
 
-class SortField(SchemaBase):
+class SortField(VegaLiteSchema):
     """SortField schema wrapper
     
     Mapping(required=[op])
@@ -4569,7 +4575,7 @@ class SortField(SchemaBase):
         super(SortField, self).__init__(op=op, field=field, order=order, **kwds)
 
 
-class SortOrder(SchemaBase):
+class SortOrder(VegaLiteSchema):
     """SortOrder schema wrapper
     
     enum('ascending', 'descending', None)
@@ -4581,7 +4587,7 @@ class SortOrder(SchemaBase):
         super(SortOrder, self).__init__(*args)
 
 
-class StackOffset(SchemaBase):
+class StackOffset(VegaLiteSchema):
     """StackOffset schema wrapper
     
     enum('zero', 'center', 'normalize')
@@ -4593,7 +4599,7 @@ class StackOffset(SchemaBase):
         super(StackOffset, self).__init__(*args)
 
 
-class StyleConfigIndex(SchemaBase):
+class StyleConfigIndex(VegaLiteSchema):
     """StyleConfigIndex schema wrapper
     
     Mapping(required=[])
@@ -4605,7 +4611,7 @@ class StyleConfigIndex(SchemaBase):
         super(StyleConfigIndex, self).__init__(**kwds)
 
 
-class TextConfig(SchemaBase):
+class TextConfig(VegaLiteSchema):
     """TextConfig schema wrapper
     
     Mapping(required=[])
@@ -4746,7 +4752,7 @@ class TextConfig(SchemaBase):
                                          tension=tension, text=text, theta=theta, **kwds)
 
 
-class TickConfig(SchemaBase):
+class TickConfig(VegaLiteSchema):
     """TickConfig schema wrapper
     
     Mapping(required=[])
@@ -4889,7 +4895,7 @@ class TickConfig(SchemaBase):
                                          theta=theta, thickness=thickness, **kwds)
 
 
-class TimeUnit(SchemaBase):
+class TimeUnit(VegaLiteSchema):
     """TimeUnit schema wrapper
     
     anyOf(SingleTimeUnit, MultiTimeUnit)
@@ -4901,7 +4907,7 @@ class TimeUnit(SchemaBase):
         super(TimeUnit, self).__init__(*args, **kwds)
 
 
-class TimeUnitTransform(SchemaBase):
+class TimeUnitTransform(VegaLiteSchema):
     """TimeUnitTransform schema wrapper
     
     Mapping(required=[timeUnit, field, as])
@@ -4920,7 +4926,7 @@ class TimeUnitTransform(SchemaBase):
         super(TimeUnitTransform, self).__init__(field=field, timeUnit=timeUnit, **kwds)
 
 
-class TitleOrient(SchemaBase):
+class TitleOrient(VegaLiteSchema):
     """TitleOrient schema wrapper
     
     enum('top', 'bottom', 'left', 'right')
@@ -4932,7 +4938,7 @@ class TitleOrient(SchemaBase):
         super(TitleOrient, self).__init__(*args)
 
 
-class TitleParams(SchemaBase):
+class TitleParams(VegaLiteSchema):
     """TitleParams schema wrapper
     
     Mapping(required=[text])
@@ -4968,7 +4974,7 @@ class TitleParams(SchemaBase):
                                           style=style, **kwds)
 
 
-class TopLevelFacetedUnitSpec(SchemaBase):
+class TopLevelFacetedUnitSpec(VegaLiteSchema):
     """TopLevelFacetedUnitSpec schema wrapper
     
     Mapping(required=[mark])
@@ -5072,7 +5078,7 @@ class TopLevelFacetedUnitSpec(SchemaBase):
                                                       **kwds)
 
 
-class TopLevelFacetSpec(SchemaBase):
+class TopLevelFacetSpec(VegaLiteSchema):
     """TopLevelFacetSpec schema wrapper
     
     Mapping(required=[facet, spec])
@@ -5127,7 +5133,7 @@ class TopLevelFacetSpec(SchemaBase):
                                                 **kwds)
 
 
-class TopLevelHConcatSpec(SchemaBase):
+class TopLevelHConcatSpec(VegaLiteSchema):
     """TopLevelHConcatSpec schema wrapper
     
     Mapping(required=[hconcat])
@@ -5179,7 +5185,7 @@ class TopLevelHConcatSpec(SchemaBase):
                                                   **kwds)
 
 
-class TopLevelLayerSpec(SchemaBase):
+class TopLevelLayerSpec(VegaLiteSchema):
     """TopLevelLayerSpec schema wrapper
     
     Mapping(required=[layer])
@@ -5275,7 +5281,7 @@ class TopLevelLayerSpec(SchemaBase):
                                                 width=width, **kwds)
 
 
-class TopLevelRepeatSpec(SchemaBase):
+class TopLevelRepeatSpec(VegaLiteSchema):
     """TopLevelRepeatSpec schema wrapper
     
     Mapping(required=[repeat, spec])
@@ -5330,7 +5336,7 @@ class TopLevelRepeatSpec(SchemaBase):
                                                  **kwds)
 
 
-class TopLevelVConcatSpec(SchemaBase):
+class TopLevelVConcatSpec(VegaLiteSchema):
     """TopLevelVConcatSpec schema wrapper
     
     Mapping(required=[vconcat])
@@ -5382,7 +5388,7 @@ class TopLevelVConcatSpec(SchemaBase):
                                                   **kwds)
 
 
-class TopLevelExtendedSpec(SchemaBase):
+class TopLevelExtendedSpec(VegaLiteSchema):
     """TopLevelExtendedSpec schema wrapper
     
     anyOf(TopLevelFacetedUnitSpec, TopLevelLayerSpec, TopLevelFacetSpec, TopLevelRepeatSpec, 
@@ -5395,7 +5401,7 @@ class TopLevelExtendedSpec(SchemaBase):
         super(TopLevelExtendedSpec, self).__init__(*args, **kwds)
 
 
-class TopoDataFormat(SchemaBase):
+class TopoDataFormat(VegaLiteSchema):
     """TopoDataFormat schema wrapper
     
     Mapping(required=[])
@@ -5438,7 +5444,7 @@ class TopoDataFormat(SchemaBase):
         super(TopoDataFormat, self).__init__(feature=feature, mesh=mesh, parse=parse, type=type, **kwds)
 
 
-class Transform(SchemaBase):
+class Transform(VegaLiteSchema):
     """Transform schema wrapper
     
     anyOf(FilterTransform, CalculateTransform, LookupTransform, BinTransform, TimeUnitTransform,
@@ -5451,7 +5457,7 @@ class Transform(SchemaBase):
         super(Transform, self).__init__(*args, **kwds)
 
 
-class Type(SchemaBase):
+class Type(VegaLiteSchema):
     """Type schema wrapper
     
     anyOf(BasicType, GeoType)
@@ -5465,7 +5471,7 @@ class Type(SchemaBase):
         super(Type, self).__init__(*args, **kwds)
 
 
-class UrlData(SchemaBase):
+class UrlData(VegaLiteSchema):
     """UrlData schema wrapper
     
     Mapping(required=[url])
@@ -5485,7 +5491,7 @@ class UrlData(SchemaBase):
         super(UrlData, self).__init__(url=url, format=format, **kwds)
 
 
-class UtcMultiTimeUnit(SchemaBase):
+class UtcMultiTimeUnit(VegaLiteSchema):
     """UtcMultiTimeUnit schema wrapper
     
     enum('utcyearquarter', 'utcyearquartermonth', 'utcyearmonth', 'utcyearmonthdate', 
@@ -5500,7 +5506,7 @@ class UtcMultiTimeUnit(SchemaBase):
         super(UtcMultiTimeUnit, self).__init__(*args)
 
 
-class UtcSingleTimeUnit(SchemaBase):
+class UtcSingleTimeUnit(VegaLiteSchema):
     """UtcSingleTimeUnit schema wrapper
     
     enum('utcyear', 'utcquarter', 'utcmonth', 'utcday', 'utcdate', 'utchours', 'utcminutes', 
@@ -5513,7 +5519,7 @@ class UtcSingleTimeUnit(SchemaBase):
         super(UtcSingleTimeUnit, self).__init__(*args)
 
 
-class ValueDef(SchemaBase):
+class ValueDef(VegaLiteSchema):
     """ValueDef schema wrapper
     
     Mapping(required=[value])
@@ -5532,7 +5538,7 @@ class ValueDef(SchemaBase):
         super(ValueDef, self).__init__(value=value, **kwds)
 
 
-class ValueDefWithCondition(SchemaBase):
+class ValueDefWithCondition(VegaLiteSchema):
     """ValueDefWithCondition schema wrapper
     
     Mapping(required=[])
@@ -5556,7 +5562,7 @@ class ValueDefWithCondition(SchemaBase):
         super(ValueDefWithCondition, self).__init__(condition=condition, value=value, **kwds)
 
 
-class MarkPropValueDefWithCondition(SchemaBase):
+class MarkPropValueDefWithCondition(VegaLiteSchema):
     """MarkPropValueDefWithCondition schema wrapper
     
     Mapping(required=[])
@@ -5581,7 +5587,7 @@ class MarkPropValueDefWithCondition(SchemaBase):
         super(MarkPropValueDefWithCondition, self).__init__(condition=condition, value=value, **kwds)
 
 
-class TextValueDefWithCondition(SchemaBase):
+class TextValueDefWithCondition(VegaLiteSchema):
     """TextValueDefWithCondition schema wrapper
     
     Mapping(required=[])
@@ -5605,7 +5611,7 @@ class TextValueDefWithCondition(SchemaBase):
         super(TextValueDefWithCondition, self).__init__(condition=condition, value=value, **kwds)
 
 
-class VerticalAlign(SchemaBase):
+class VerticalAlign(VegaLiteSchema):
     """VerticalAlign schema wrapper
     
     enum('top', 'middle', 'bottom')
@@ -5617,7 +5623,7 @@ class VerticalAlign(SchemaBase):
         super(VerticalAlign, self).__init__(*args)
 
 
-class VgAxisConfig(SchemaBase):
+class VgAxisConfig(VegaLiteSchema):
     """VgAxisConfig schema wrapper
     
     Mapping(required=[])
@@ -5766,7 +5772,7 @@ class VgAxisConfig(SchemaBase):
                                            **kwds)
 
 
-class VgBinding(SchemaBase):
+class VgBinding(VegaLiteSchema):
     """VgBinding schema wrapper
     
     anyOf(VgCheckboxBinding, VgRadioBinding, VgSelectBinding, VgRangeBinding, VgGenericBinding)
@@ -5778,7 +5784,7 @@ class VgBinding(SchemaBase):
         super(VgBinding, self).__init__(*args, **kwds)
 
 
-class VgCheckboxBinding(SchemaBase):
+class VgCheckboxBinding(VegaLiteSchema):
     """VgCheckboxBinding schema wrapper
     
     Mapping(required=[input])
@@ -5797,7 +5803,7 @@ class VgCheckboxBinding(SchemaBase):
         super(VgCheckboxBinding, self).__init__(input=input, element=element, **kwds)
 
 
-class VgEventStream(SchemaBase):
+class VgEventStream(VegaLiteSchema):
     """VgEventStream schema wrapper
     
     Mapping(required=[])
@@ -5809,7 +5815,7 @@ class VgEventStream(SchemaBase):
         super(VgEventStream, self).__init__(**kwds)
 
 
-class VgGenericBinding(SchemaBase):
+class VgGenericBinding(VegaLiteSchema):
     """VgGenericBinding schema wrapper
     
     Mapping(required=[input])
@@ -5828,7 +5834,7 @@ class VgGenericBinding(SchemaBase):
         super(VgGenericBinding, self).__init__(input=input, element=element, **kwds)
 
 
-class VgMarkConfig(SchemaBase):
+class VgMarkConfig(VegaLiteSchema):
     """VgMarkConfig schema wrapper
     
     Mapping(required=[])
@@ -5955,7 +5961,7 @@ class VgMarkConfig(SchemaBase):
                                            tension=tension, text=text, theta=theta, **kwds)
 
 
-class VgProjectionType(SchemaBase):
+class VgProjectionType(VegaLiteSchema):
     """VgProjectionType schema wrapper
     
     enum('albers', 'albersUsa', 'azimuthalEqualArea', 'azimuthalEquidistant', 'conicConformal', 
@@ -5969,7 +5975,7 @@ class VgProjectionType(SchemaBase):
         super(VgProjectionType, self).__init__(*args)
 
 
-class VgRadioBinding(SchemaBase):
+class VgRadioBinding(VegaLiteSchema):
     """VgRadioBinding schema wrapper
     
     Mapping(required=[input, options])
@@ -5990,7 +5996,7 @@ class VgRadioBinding(SchemaBase):
         super(VgRadioBinding, self).__init__(input=input, options=options, element=element, **kwds)
 
 
-class VgRangeBinding(SchemaBase):
+class VgRangeBinding(VegaLiteSchema):
     """VgRangeBinding schema wrapper
     
     Mapping(required=[input])
@@ -6017,7 +6023,7 @@ class VgRangeBinding(SchemaBase):
                                              **kwds)
 
 
-class VgScheme(SchemaBase):
+class VgScheme(VegaLiteSchema):
     """VgScheme schema wrapper
     
     Mapping(required=[scheme])
@@ -6038,7 +6044,7 @@ class VgScheme(SchemaBase):
         super(VgScheme, self).__init__(scheme=scheme, count=count, extent=extent, **kwds)
 
 
-class VgSelectBinding(SchemaBase):
+class VgSelectBinding(VegaLiteSchema):
     """VgSelectBinding schema wrapper
     
     Mapping(required=[input, options])
@@ -6059,7 +6065,7 @@ class VgSelectBinding(SchemaBase):
         super(VgSelectBinding, self).__init__(input=input, options=options, element=element, **kwds)
 
 
-class VgTitleConfig(SchemaBase):
+class VgTitleConfig(VegaLiteSchema):
     """VgTitleConfig schema wrapper
     
     Mapping(required=[])
@@ -6104,7 +6110,7 @@ class VgTitleConfig(SchemaBase):
                                             limit=limit, offset=offset, orient=orient, **kwds)
 
 
-class ViewConfig(SchemaBase):
+class ViewConfig(VegaLiteSchema):
     """ViewConfig schema wrapper
     
     Mapping(required=[])
diff --git a/tools/generate_schema_wrapper.py b/tools/generate_schema_wrapper.py
index ce3685ea..3aface30 100644
--- a/tools/generate_schema_wrapper.py
+++ b/tools/generate_schema_wrapper.py
@@ -11,6 +11,13 @@ from schemapi.codegen import schema_class, CodeSnippet
 from schemapi.utils import get_valid_identifier, SchemaInfo, indent_arglist
 
 
+BASE_SCHEMA = """
+class {basename}(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return {basename}.__subclasses__()
+"""
+
 LOAD_SCHEMA = '''
 import os
 import json
@@ -107,20 +114,24 @@ def copy_schemapi_util():
 def generate_vegalite_schema_wrapper(schema_file):
     """Generate a schema wrapper at the given path."""
     # TODO: generate simple tests for each wrapper
+    basename = 'VegaLiteSchema'
+
     with open(schema_file) as f:
         rootschema = json.load(f)
     contents = [HEADER,
                 "from altair.utils.schemapi import SchemaBase, Undefined",
                 LOAD_SCHEMA.format(schemafile='vega-lite-schema.json')]
-    contents.append(schema_class('Root', schema=rootschema,
+    contents.append(BASE_SCHEMA.format(basename=basename))
+    contents.append(schema_class('Root', schema=rootschema, basename=basename,
                                  schemarepr=CodeSnippet('load_schema()')))
+
     for name in rootschema['definitions']:
         defschema = {'$ref': '#/definitions/' + name}
         defschema_repr = {'$ref': '#/definitions/' + name}
 
         contents.append(schema_class(get_valid_identifier(name),
                                      schema=defschema, schemarepr=defschema_repr,
-                                     rootschema=rootschema,
+                                     rootschema=rootschema, basename=basename,
                                      rootschemarepr=CodeSnippet("Root._schema")))
     contents.append('')  # end with newline
     return '\n'.join(contents)
@@ -129,12 +140,15 @@ def generate_vegalite_schema_wrapper(schema_file):
 def generate_vega_schema_wrapper(schema_file):
     """Generate a schema wrapper at the given path."""
     # TODO: generate simple tests for each wrapper
+    basename = 'VegaSchema'
+
     with open(schema_file) as f:
         rootschema = json.load(f)
     contents = [HEADER,
                 "from altair.utils.schemapi import SchemaBase, Undefined",
                 LOAD_SCHEMA.format(schemafile='vega-schema.json')]
-    contents.append(schema_class('Root', schema=rootschema,
+    contents.append(BASE_SCHEMA.format(basename=basename))
+    contents.append(schema_class('Root', schema=rootschema, basename=basename,
                                  schemarepr=CodeSnippet('load_schema()')))
     for deflist in ['defs', 'refs']:
         for name in rootschema[deflist]:
@@ -142,7 +156,7 @@ def generate_vega_schema_wrapper(schema_file):
             defschema_repr = {'$ref': '#/{0}/{1}'.format(deflist,name)}
             contents.append(schema_class(get_valid_identifier(name),
                                          schema=defschema, schemarepr=defschema_repr,
-                                         rootschema=rootschema,
+                                         rootschema=rootschema, basename=basename,
                                          rootschemarepr=CodeSnippet("Root._schema")))
     contents.append('')  # end with newline
     return '\n'.join(contents)
diff --git a/tools/schemapi/schemapi.py b/tools/schemapi/schemapi.py
index cf915c56..2f92aec9 100644
--- a/tools/schemapi/schemapi.py
+++ b/tools/schemapi/schemapi.py
@@ -79,11 +79,10 @@ Undefined = UndefinedType()
 class SchemaBase(object):
     """Base class for schema wrappers.
 
-    Each derived class should set the _json_schema class attribute which is
-    used for validation. If not specified in the class definition, an
-    appropriate __init__ function will be generated by SchemaBaseMeta.
+    Each derived class should set the _schema class attribute (and optionally
+    the _rootschema class attribute) which is used for validation.
     """
-    _schema = {}
+    _schema = None
     _rootschema = None
     _class_is_valid_at_instantiation = True
 
@@ -92,6 +91,11 @@ class SchemaBase(object):
         # derived classes:
         # - a single arg with no kwds, for, e.g. {'type': 'string'}
         # - zero args with zero or more kwds for {'type': 'object'}
+        if self._schema is None:
+            raise ValueError("Cannot instantiate object of type {0}: "
+                             "_schema class attribute is not defined."
+                             "".format(self.__class__))
+
         if kwds:
             assert len(args) == 0
         else:
@@ -257,7 +261,12 @@ class SchemaBase(object):
         return json.dumps(dct, indent=indent, sort_keys=sort_keys, **kwargs)
 
     @classmethod
-    def from_dict(cls, dct, validate=True):
+    def _default_wrapper_classes(cls):
+        """Return the set of classes used within cls.from_dict()"""
+        return SchemaBase.__subclasses__()
+
+    @classmethod
+    def from_dict(cls, dct, validate=True, _wrapper_classes=None):
         """Construct class from a dictionary representation
 
         Parameters
@@ -266,6 +275,10 @@ class SchemaBase(object):
             The dict from which to construct the class
         validate : boolean
             If True (default), then validate the input against the schema.
+        _wrapper_classes : list (optional)
+            The set of SchemaBase classes to use when constructing wrappers
+            of the dict inputs. If not specified, the result of
+            cls._default_wrapper_classes will be used.
 
         Returns
         -------
@@ -279,9 +292,12 @@ class SchemaBase(object):
         """
         if validate:
             cls.validate(dct)
-        converter = _FromDict(SchemaBase.__subclasses__())
+        if _wrapper_classes is None:
+            _wrapper_classes = cls._default_wrapper_classes()
+        converter = _FromDict(_wrapper_classes)
         return converter.from_dict(constructor=cls, root=cls,
                                    schema=cls._schema, dct=dct)
+
     @classmethod
     def from_json(cls, json_string, validate=True, **kwargs):
         """Instantiate the object from a valid JSON string
@@ -342,7 +358,8 @@ class _FromDict(object):
         # This lets us quickly determine the correct class to construct
         self.class_dict = collections.defaultdict(list)
         for cls in class_list:
-            self.class_dict[self.hash_schema(cls._schema)].append(cls)
+            if cls._schema is not None:
+                self.class_dict[self.hash_schema(cls._schema)].append(cls)
 
     @classmethod
     def hash_schema(cls, schema, use_json=True):


Test patch:
diff --git a/altair/utils/tests/test_schemapi.py b/altair/utils/tests/test_schemapi.py
index 07ecfe55..d1164066 100644
--- a/altair/utils/tests/test_schemapi.py
+++ b/altair/utils/tests/test_schemapi.py
@@ -7,8 +7,16 @@ import pytest
 
 from ..schemapi import UndefinedType, SchemaBase, Undefined
 
+# Make tests inherit from _TestSchema, so that when we test from_dict it won't
+# try to use SchemaBase objects defined elsewhere as wrappers.
 
-class MySchema(SchemaBase):
+class _TestSchema(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return _TestSchema.__subclasses__()
+
+
+class MySchema(_TestSchema):
     _schema = {
         'definitions': {
             'StringMapping': {'type': 'object', 'additionalProperties': {'type': 'string'}},
@@ -26,17 +34,17 @@ class MySchema(SchemaBase):
     }
 
 
-class StringMapping(SchemaBase):
+class StringMapping(_TestSchema):
     _schema = {'$ref': '#/definitions/StringMapping'}
     _rootschema = MySchema._schema
 
 
-class StringArray(SchemaBase):
+class StringArray(_TestSchema):
     _schema = {'$ref': '#/definitions/StringArray'}
     _rootschema = MySchema._schema
 
 
-class Derived(SchemaBase):
+class Derived(_TestSchema):
     _schema = {
         'definitions': {
             'Foo': {
@@ -57,21 +65,21 @@ class Derived(SchemaBase):
     }
 
 
-class Foo(SchemaBase):
+class Foo(_TestSchema):
     _schema = {"$ref": "#/definitions/Foo"}
     _rootschema = Derived._schema
 
 
-class Bar(SchemaBase):
+class Bar(_TestSchema):
     _schema = {"$ref": "#/definitions/Bar"}
     _rootschema = Derived._schema
 
 
-class SimpleUnion(SchemaBase):
+class SimpleUnion(_TestSchema):
     _schema = {'anyOf' : [{'type': 'integer'}, {'type': 'string'}]}
 
 
-class DefinitionUnion(SchemaBase):
+class DefinitionUnion(_TestSchema):
     _schema = {
         "anyOf": [
             {"$ref": "#/definitions/Foo"},
@@ -81,7 +89,7 @@ class DefinitionUnion(SchemaBase):
     _rootschema = Derived._schema
 
 
-class SimpleArray(SchemaBase):
+class SimpleArray(_TestSchema):
     _schema = {
         'type': 'array',
         'items': {
@@ -90,7 +98,7 @@ class SimpleArray(SchemaBase):
     }
 
 
-class InvalidProperties(SchemaBase):
+class InvalidProperties(_TestSchema):
     _schema = {
         'type': 'object',
         'properties': {
@@ -252,3 +260,12 @@ def test_to_from_json():
     new_dct = MySchema.from_json(json_str).to_dict()
 
     assert new_dct == dct
+
+
+def test_class_with_no_schema():
+    class BadSchema(SchemaBase):
+        pass
+
+    with pytest.raises(ValueError) as err:
+        BadSchema(4)
+    assert str(err.value).startswith("Cannot instantiate object")
diff --git a/tools/schemapi/tests/test_schemapi.py b/tools/schemapi/tests/test_schemapi.py
index 534525a2..a3e58bc7 100644
--- a/tools/schemapi/tests/test_schemapi.py
+++ b/tools/schemapi/tests/test_schemapi.py
@@ -5,8 +5,16 @@ import pytest
 
 from ..schemapi import UndefinedType, SchemaBase, Undefined
 
+# Make tests inherit from _TestSchema, so that when we test from_dict it won't
+# try to use SchemaBase objects defined elsewhere as wrappers.
 
-class MySchema(SchemaBase):
+class _TestSchema(SchemaBase):
+    @classmethod
+    def _default_wrapper_classes(cls):
+        return _TestSchema.__subclasses__()
+
+
+class MySchema(_TestSchema):
     _schema = {
         'definitions': {
             'StringMapping': {'type': 'object', 'additionalProperties': {'type': 'string'}},
@@ -24,17 +32,17 @@ class MySchema(SchemaBase):
     }
 
 
-class StringMapping(SchemaBase):
+class StringMapping(_TestSchema):
     _schema = {'$ref': '#/definitions/StringMapping'}
     _rootschema = MySchema._schema
 
 
-class StringArray(SchemaBase):
+class StringArray(_TestSchema):
     _schema = {'$ref': '#/definitions/StringArray'}
     _rootschema = MySchema._schema
 
 
-class Derived(SchemaBase):
+class Derived(_TestSchema):
     _schema = {
         'definitions': {
             'Foo': {
@@ -55,21 +63,21 @@ class Derived(SchemaBase):
     }
 
 
-class Foo(SchemaBase):
+class Foo(_TestSchema):
     _schema = {"$ref": "#/definitions/Foo"}
     _rootschema = Derived._schema
 
 
-class Bar(SchemaBase):
+class Bar(_TestSchema):
     _schema = {"$ref": "#/definitions/Bar"}
     _rootschema = Derived._schema
 
 
-class SimpleUnion(SchemaBase):
+class SimpleUnion(_TestSchema):
     _schema = {'anyOf' : [{'type': 'integer'}, {'type': 'string'}]}
 
 
-class DefinitionUnion(SchemaBase):
+class DefinitionUnion(_TestSchema):
     _schema = {
         "anyOf": [
             {"$ref": "#/definitions/Foo"},
@@ -79,7 +87,7 @@ class DefinitionUnion(SchemaBase):
     _rootschema = Derived._schema
 
 
-class SimpleArray(SchemaBase):
+class SimpleArray(_TestSchema):
     _schema = {
         'type': 'array',
         'items': {
@@ -88,7 +96,7 @@ class SimpleArray(SchemaBase):
     }
 
 
-class InvalidProperties(SchemaBase):
+class InvalidProperties(_TestSchema):
     _schema = {
         'type': 'object',
         'properties': {
@@ -250,3 +258,12 @@ def test_to_from_json():
     new_dct = MySchema.from_json(json_str).to_dict()
 
     assert new_dct == dct
+
+
+def test_class_with_no_schema():
+    class BadSchema(SchemaBase):
+        pass
+
+    with pytest.raises(ValueError) as err:
+        BadSchema(4)
+    assert str(err.value).startswith("Cannot instantiate object")