Ejemplo n.º 1
0
    def load_one(self, schema, val, path):
        is_path = schema.kind == types.Kind.Path
        if isinstance(val, types.Var):
            if val.name not in self.variables:
                raise UnboundVariable(path)
            elif not does_substition_match(self.variables[val.name],
                                           schema.kind):
                raise TypeMismatch(path)

            return types.Value(types.Var(val.name, choices=schema.choices),
                               is_path)
        elif isinstance(val, types.Call):
            if val.name not in self.functions:
                raise InvalidFunction(path)
            elif not does_substition_match(
                    self.functions[val.name].return_type, schema.kind):

                raise TypeMismatch(path)

            return types.Value(types.Call(val.name, val.args), is_path)
        else:
            result = {
                types.Kind.Any: self.load_any,
                types.Kind.Bool: self.load_bool,
                types.Kind.String: self.load_string,
                types.Kind.Path: self.load_path,
                types.Kind.Array: self.load_array,
                types.Kind.Object: self.load_object,
            }[schema.kind](schema, val, path)

            if schema.choices is not None:
                if result.data not in schema.choices:
                    raise InvalidChoice()

            return result
Ejemplo n.º 2
0
 def test_object(self):
     schema = phase2.MODEL.parse("{ foo: string; }", 'type')
     result = phase2.Phase2.load(schema, {'foo': 'bar'})
     self.assertEqual(result.foo, types.Value('bar'))
     result = phase2.Phase2.load(schema, {})
     self.assertEqual(result.foo, types.Value(None))
     with self.assertRaises(phase2.InvalidKey):
         phase2.Phase2.load(schema, {'bad-key': 'bar'})
Ejemplo n.º 3
0
 def test_any(self):
     schema = phase2.MODEL.parse('any', 'type')
     result = phase2.Phase2.load(schema, 'myString')
     self.assertEqual(result, types.Value('myString'))
     result = phase2.Phase2.load(schema, True)
     self.assertEqual(result, types.Value(True))
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, None)
Ejemplo n.º 4
0
 def test_string_array(self):
     schema = phase2.MODEL.parse('string[]', 'type')
     result = phase2.Phase2.load(schema, ['a', 'b'])
     self.assertEqual(result, [types.Value('a'), types.Value('b')])
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, 'foo')
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, [True])
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, ['foo', True])
Ejemplo n.º 5
0
    def test_var_choices(self):
        class Context:
            def resolve(self, _):
                # pylint: disable=no-self-use
                return 'z'

        self.assertEqual(
            phase3.resolve_value(
                types.Value(types.Var('foo', choices=('x', 'z'))), Context()),
            'z')
        with self.assertRaises(phase2.InvalidChoice):
            phase3.resolve_value(
                types.Value(types.Var('foo', choices=('x', 'y'))), Context())
Ejemplo n.º 6
0
 def load_object(self, schema, val, path):
     if isinstance(val, types.Step):
         return self.load_step(schema, val, path)
     else:
         if not isinstance(val, collections.abc.Mapping):
             raise TypeMismatch(path)
         temp_obj = {}
         if schema.wildcard_key():
             for key in val:
                 subpath = path + [key]
                 temp_obj[key] = self.load_one(schema.fields[Key('*')],
                                               val[key], subpath)
         else:
             for key in val:
                 if Key(key) not in schema.fields:
                     raise InvalidKey(path, key)
                 subpath = path + [key]
                 temp_obj[key] = self.load_one(schema.fields[Key(key)],
                                               val[key], subpath)
         for key in schema.fields:
             if key.name not in temp_obj and key.name != '*':
                 temp_obj[key.name] = types.Value(None)
             if key.is_required:
                 if key.name not in val:
                     raise MissingKey(path)
         temp_obj = make_keys_safe(temp_obj)
         cls = attr.make_class('SchemaClass', list(temp_obj.keys()))
         return cls(**temp_obj)
Ejemplo n.º 7
0
 def test_call_to_path(self):
     schema = phase2.MODEL.parse('path', 'type')
     result = phase2.Phase2.load(schema, types.Call('env', ('key', )))
     self.assertEqual(
         result, types.Value(types.Call('env', ('key', )), is_path=True))
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, True)
Ejemplo n.º 8
0
 def test_run(self):
     cls = attr.make_class('MockSet', ['a'])
     recipe = cls(types.Value('b'))
     steps = [types.Step('set', recipe, None)]
     ctx = phase3.Context()
     phase3.run(steps, ctx)
     self.assertEqual(ctx.variables, {'a': 'b'})
Ejemplo n.º 9
0
    def test_path(self):
        class Context:
            def repath(self, path):
                # pylint: disable=no-self-use
                return os.path.join('/root', path)

        self.assertEqual(
            phase3.resolve_value(types.Value('foo', is_path=True), Context()),
            '/root/foo')
Ejemplo n.º 10
0
 def test_var(self):
     schema = phase2.MODEL.parse('string', 'type')
     result = phase2.Phase2.load(schema, types.Var('x'),
                                 {'x': types.Kind.String})
     self.assertEqual(result, types.Value(types.Var('x')))
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, types.Var('x'), {'x': types.Kind.Bool})
     with self.assertRaises(phase2.UnboundVariable):
         phase2.Phase2.load(schema, types.Var('x'))
Ejemplo n.º 11
0
    def test_var(self):
        this = self

        class Context:
            def resolve(self, var):
                # pylint: disable=no-self-use
                this.assertEqual(var.name, 'foo')
                return 'myResult'

        self.assertEqual(
            phase3.resolve_value(types.Value(types.Var('foo')), Context()),
            'myResult')
Ejemplo n.º 12
0
    def test_call(self):
        this = self

        class Context:
            def call(self, call):
                # pylint: disable=no-self-use
                this.assertEqual(call.name, 'foo')
                return 'myResult'

        self.assertEqual(
            phase3.resolve_value(types.Value(types.Call('foo', ())),
                                 Context()), 'myResult')
Ejemplo n.º 13
0
 def load_path(self, _, val, path):
     # pylint: disable=no-self-use
     if not isinstance(val, str):
         raise TypeMismatch(path)
     return types.Value(val, is_path=True)
Ejemplo n.º 14
0
 def test_object(self):
     cls = attr.make_class('Mock', ['foo'])
     obj = cls(types.Value('bar'))
     obj = phase3.resolve(obj, None)
     self.assertEqual(obj.foo, 'bar')
Ejemplo n.º 15
0
 def test_list(self):
     lst = [types.Value('x'), types.Value('y')]
     self.assertEqual(phase3.resolve(lst, None), ['x', 'y'])
Ejemplo n.º 16
0
 def test_call(self):
     ctx = phase3.Context()
     os.environ['FOO'] = 'bar'
     call = types.Call('env', ('FOO', ))
     self.assertEqual(phase3.resolve(types.Value(call), ctx), 'bar')
Ejemplo n.º 17
0
 def test_var(self):
     ctx = phase3.Context()
     ctx.variables['foo'] = 'bar'
     self.assertEqual(phase3.resolve(types.Value(types.Var('foo')), ctx),
                      'bar')
Ejemplo n.º 18
0
 def test_none(self):
     self.assertIs(phase3.resolve_value(types.Value(None), None), None)
Ejemplo n.º 19
0
 def load_any(self, _, val, path):
     # pylint: disable=no-self-use
     if val is None:
         raise TypeMismatch(path)
     return types.Value(val)
Ejemplo n.º 20
0
 def test_required_key(self):
     schema = phase2.MODEL.parse("{ required foo: string; }", 'type')
     result = phase2.Phase2.load(schema, {'foo': 'bar'})
     self.assertEqual(result.foo, types.Value('bar'))
     with self.assertRaises(phase2.MissingKey):
         phase2.Phase2.load(schema, {})
Ejemplo n.º 21
0
 def test_call(self):
     schema = phase2.MODEL.parse('string', 'type')
     result = phase2.Phase2.load(schema, types.Call('env', ('x', )))
     self.assertEqual(result, types.Value(types.Call('env', ('x', ))))
     with self.assertRaises(phase2.InvalidFunction):
         phase2.Phase2.load(schema, types.Call('x', ()))
Ejemplo n.º 22
0
 def test_string(self):
     self.assertEqual(phase3.resolve_value(types.Value('foo'), None), 'foo')
Ejemplo n.º 23
0
 def test_wildcard(self):
     schema = phase2.MODEL.parse("{ *: string; }", 'type')
     phase2.Phase2.load(schema, {})
     result = phase2.Phase2.load(schema, {'foo': 'bar'})
     self.assertEqual(result.foo, types.Value('bar'))
Ejemplo n.º 24
0
 def test_bool(self):
     self.assertEqual(phase3.resolve_value(types.Value(True), None), True)
     self.assertEqual(phase3.resolve_value(types.Value(False), None), False)
Ejemplo n.º 25
0
 def test_path(self):
     schema = phase2.MODEL.parse('path', 'type')
     result = phase2.Phase2.load(schema, 'myPath')
     self.assertEqual(result, types.Value('myPath', is_path=True))
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, True)
Ejemplo n.º 26
0
 def test_invalid_value(self):
     with self.assertRaises(TypeError):
         phase3.resolve_value(types.Value(object()), None)
Ejemplo n.º 27
0
 def test_bool(self):
     schema = phase2.MODEL.parse('bool', 'type')
     result = phase2.Phase2.load(schema, True)
     self.assertEqual(result, types.Value(True))
     with self.assertRaises(phase2.TypeMismatch):
         phase2.Phase2.load(schema, 'foo')
Ejemplo n.º 28
0
 def test_primitive(self):
     self.assertEqual(phase3.resolve(types.Value(True), None), True)
     self.assertEqual(phase3.resolve(types.Value('foo'), None), 'foo')
Ejemplo n.º 29
0
 def load_bool(self, _, val, path):
     # pylint: disable=no-self-use
     if not isinstance(val, bool):
         raise TypeMismatch(path)
     return types.Value(val)
Ejemplo n.º 30
0
 def test_choice(self):
     schema = phase2.MODEL.parse("string choices('x', 'y')", 'type')
     result = phase2.Phase2.load(schema, 'x')
     self.assertEqual(result, types.Value('x'))
     with self.assertRaises(phase2.InvalidChoice):
         phase2.Phase2.load(schema, 'foo')