Example #1
0
    def call(self, args, keywords, starargs, context, dryrun, orig_args):
        assert isinstance(orig_args[0], _ast.Str)
        assert args[0] == Union(STR)
        if args[1] == Union.EMPTY:
            context.log_error("no metadata specified")
            return Union.EMPTY
        assert args[1] == Union(MetaData.instance()), (args[1].display(),
                                                       args[1].types())

        cols = []
        for a in args[2:]:
            if not a.types():
                return Union.EMPTY
            assert len(a.types()) == 1
            t, = a.types()

            assert isinstance(t, ColumnType)
            cols.append(t)

        t = context.get_cached(self.call)
        if not t:
            t = TableType(orig_args[0].s, cols)
            context.set_cached(self.call, t)
        else:
            assert t._cols == cols, (t._cols, cols)

        return Union(t)
Example #2
0
def _fetchall_rtn(args, keywords, starargs, context, dryrun, orig_args):
    r = args[0].types()[0]
    assert isinstance(r, ResultProxyType)

    t = context.get_cached(_fetchall_rtn)
    if not t:
        t = InstanceType(ListClass, [Union(r._rptype)])
        context.set_cached(_fetchall_rtn, t)

    return Union(t)
Example #3
0
    def __init__(self, cols):
        assert cols, cols
        assert isinstance(cols, list), cols
        super(ExpressionType, self).__init__(Expression, [])

        self._cols = cols

        f = FixedFunction([ANY], FixedArg(Union(self)), ndefaults=1)
        for n in ("order_by", "limit", "asc", "desc", "not_", "null",
                  "group_by", "offset"):
            self.setattr(n, Union(f))
Example #4
0
def _select_rtn(args, keywords, starargs, context, dryrun, orig_args):
    if args[0] == Union.EMPTY:
        context.log_error("Don't know what this is a select of")
        return Union.EMPTY

    l = args[0].types()[0]

    if not isinstance(l, InstanceType):
        context.log_error("Passed in a '%s'?" % (l.display(), ))
        return Union.EMPTY

    if l.cls is ListClass:
        if l.unions[0] == Union.EMPTY:
            context.log_error("Passed in an empty list of columns")
            return Union.EMPTY
        cols = list(l.unions[0].types())
    elif l.cls is TupleClass:
        # if not all(u.types() for u in l.unions):
        # context.log_error("Passed in a potentially-undefined column")
        # return Union.EMPTY
        cols = [
            u.types()[0] for u in l.unions
            if u.types() and isinstance(u.types()[0], ColumnType)
        ]
        if not cols:
            context.log_error("Passed in no analyzable columns")
            return Union.EMPTY
    elif l.cls is Column:
        cols = [l]
    elif l.cls is ColumnCollection:
        cols = list(l._cols)
        assert all(isinstance(c, ColumnType) for c in cols), cols
    else:
        raise Exception(l.cls.name)

    assert cols
    for c in cols:
        if not isinstance(c, ColumnType):
            context.log_error("Passed in '%s' instead of a column?" %
                              (c.display(), ))
            return Union.EMPTY

    t = context.get_cached(_select_rtn)
    if not t:
        t = ExpressionType(cols)
        context.set_cached(_select_rtn, t)
    else:
        if cols != t._cols:
            context.log_error(
                "don't pass in different columns, can't analyze that")
            return Union(TOP)
    return Union(t)
Example #5
0
def _table_select_rtn(args, keywords, starargs, context, dryrun, orig_args):
    t = args[0].types()[0]

    r = context.get_cached(_table_select_rtn)
    if not r:
        r = ExpressionType(t._cols)
        context.set_cached(_table_select_rtn, r)
    else:
        if r._cols != t._cols:
            context.log_error(
                "don't pass in different tables, can't analyze that")
            return Union(TOP)
    return Union(r)
Example #6
0
    def __init__(self, cols):
        for c in cols:
            assert isinstance(c, ColumnType)
        super(ColumnCollectionType, self).__init__(ColumnCollection, [])

        for c in cols:
            self.setattr(c._name, Union(c))
        self._cols = cols
Example #7
0
def _execute_rtn(args, keywords, starargs, context, dryrun, orig_args):
    if starargs:
        context.log_error("why??")
        return Union.EMPTY

    c = args[0].types()[0]
    assert isinstance(c, InstanceType)
    assert c.cls in (Connection, Engine)
    if len(args[1].types()) != 1:
        context.log_error("bad first arg to execute")
        return Union.EMPTY
    a = args[1].types()[0]
    if a is STR:
        return Union(TOP)

    if a is TOP:
        return Union(TOP)

    if isinstance(a, InstanceType):
        if a.cls is ListClass:
            cols = []
            for t in a.unions[0].types():
                if isinstance(t, ColumnType):
                    cols.append(t)
        elif a.cls is Expression:
            cols = a._cols
        elif a.cls is TupleClass:
            cols = [u.types()[0] for u in a.unions]
        elif a.cls is Column:
            cols = [a]
        else:
            context.log_error("don't understand argument: %s" %
                              (a.display(), ))
            return Union.EMPTY
    else:
        context.log_error("didn't expect a %s" % (a.display(), ))
        return Union.EMPTY

    t = context.get_cached(_execute_rtn)
    if not t:
        t = ResultProxyType(cols)
        context.set_cached(_execute_rtn, t)
    else:
        assert t._cols == cols
    return Union(t)
Example #8
0
def _mapper_rtn(args, keywords, starargs, context, dryrun, orig_args):
    if args[0] == Union.EMPTY or args[1] == Union.EMPTY:
        return Union.EMPTY

    cls = args[0].types()[0]
    table = args[1].types()[0]

    for col in table._cols:
        cls.setattr(col._name, Union(col._type._t))
    return Union.EMPTY
Example #9
0
    def __init__(self, cols):
        assert cols, cols
        assert isinstance(cols, list), cols
        for c in cols:
            assert isinstance(c, ColumnType)
        super(RowProxyType, self).__init__(RowProxy, [])

        self._cols = cols
        for c in cols:
            self.setattr(c._name, Union(c._type._t))
Example #10
0
    def call(self, args, keywords, starargs, context, dryrun, orig_args):
        assert isinstance(orig_args[0], _ast.Str)
        assert args[0] == Union(STR)

        t = context.get_cached(self.call)
        if not t:
            if args[1] == Union.EMPTY:
                context.log_error("no column type specified")
                return Union.EMPTY
            t = ColumnType(orig_args[0].s, args[1].types()[0], context)
            context.set_cached(self.call, t)
        else:
            assert t._name == orig_args[0].s
            assert isinstance(
                args[1].types()[0],
                FixedFunction) or t._type == args[1].types()[0], (
                    t._type, args[1].types()[0])

        return Union(t)
Example #11
0
    def __init__(self, cols):
        assert cols, cols
        assert isinstance(cols, list), cols
        for c in cols:
            assert isinstance(c, ColumnType)
        super(ResultProxyType, self).__init__(ResultProxy, [])

        self._cols = cols
        self.setattr(
            "scalar",
            Union(FixedFunction([], FixedArg(Union(cols[0]._type._t)))))
        self._rptype = RowProxyType(self._cols)
        self.setattr(
            "__iter__",
            Union(
                FixedFunction([],
                              FixedArg(
                                  Union(
                                      InstanceType(Iterator,
                                                   [Union(self._rptype)]))))))
Example #12
0
    def __init__(self, name, cols):
        assert isinstance(name, str)
        for c in cols:
            assert isinstance(c, ColumnType)
        super(TableType, self).__init__(Table, [])

        self._name = name
        self._cols = cols
        for c in cols:
            c._table = self
        col_collection = Union(ColumnCollectionType(cols))
        self.setattr("c", col_collection)
        self.setattr("columns", col_collection)
Example #13
0
def _fetchone_rtn(args, keywords, starargs, context, dryrun, orig_args):
    r = args[0].types()[0]
    assert isinstance(r, ResultProxyType)
    return Union(r._rptype)
Example #14
0
    translate_call,
    _FuncArgsError,
    get_iter_type,
    Subtype,
    InstanceArg,
    Var,
    FixedArg,
    ANY,
    BOT,
)

from icbd.type_analyzer.builtins import (BUILTINS, KNOWN_MODULES, make_class)

sqlalchemy = Module("sqlalchemy", "__builtin__")
schema = Module("schema", "__builtin__")
sqlalchemy.setattr("schema", Union(schema))

MetaData = UserClassType("MetaData", (ObjectClass, ))


class TableClassType(CustomClass):
    def __init__(self):
        super(TableClassType, self).__init__("Table")

    def call(self, args, keywords, starargs, context, dryrun, orig_args):
        assert isinstance(orig_args[0], _ast.Str)
        assert args[0] == Union(STR)
        if args[1] == Union.EMPTY:
            context.log_error("no metadata specified")
            return Union.EMPTY
        assert args[1] == Union(MetaData.instance()), (args[1].display(),
Example #15
0
def _load(e, fn):
    generated = {}
    type_map = {
        "int64": Union(INT),
        "int32": Union(INT),
        "string": Union(STR),
        "bytes": Union(STR),
        "double": Union(FLOAT),
        "bool": Union(BOOL),
    }
    with open(fn) as f:
        stack = []
        type_stack = []
        field_names = []
        for l in f:
            if '//' in l:
                l = l[:l.find('//')]
            sp = l.split()
            if not sp:
                continue
            if sp[0] == "message":
                cls = Union(UserClassType(sp[1], (ObjectClass, )))
                if stack:
                    type_stack[-1][sp[1]] = cls
                    stack[-1].setattr(sp[1], cls)
                else:
                    generated[sp[1]] = cls

                stack.append(cls)
                type_stack.append({})
                field_names.append([])
            elif sp[0] in ("required", "optional", "repeated"):
                t = None

                for types in [type_map] + list(
                        reversed(type_stack)) + [generated]:
                    t = types.get(sp[1])
                    if t:
                        break

                assert t, sp[1]
                assert isinstance(t, Union)
                name = sp[2]

                if sp[0] == "repeated":
                    t = Union(InstanceType(ListClass, [t]))
                stack[-1].setattr(name, t)
                field_names[-1].append(name)
            elif sp[0] == "enum":
                assert stack
                # stack[-1].setattr(sp[1], Union(INT))
                type_stack[-1][sp[1]] = Union(INT)
                stack.append(None)
                type_stack.append(None)
                field_names.append(None)
            elif len(sp) >= 2 and sp[1] == '=':
                assert stack[-1] is None
                stack[-2].setattr(sp[0], Union(INT))
            elif sp[0] == "}":
                fields = field_names.pop()
                c = stack.pop()
                if isinstance(c, Union):
                    [c] = c.types()
                    field_types = [c._attributes[f] for f in fields]
                    args = []
                    for u in field_types:
                        assert len(u.types()) == 1
                        [t] = u.types()
                        if isinstance(t, UserClassType):
                            args.append(FixedArg(Union(t.instance())))
                        else:
                            args.append(FixedArg(u))
                    c.setattr(
                        "__init__",
                        Union(
                            FixedFunction([InstanceArg(c, [])] + args,
                                          NONE,
                                          ndefaults=len(field_types),
                                          arg_names=["self"] + fields)))
                type_stack.pop()
            else:
                raise Exception(l)

    assert not stack
    assert not type_stack

    e.add_overrides(generated)
Example #16
0
    translate_call,
    _FuncArgsError,
    get_iter_type,
    Subtype,
    InstanceArg,
    Var,
    FixedArg,
    ANY,
    BOT,
)

from icbd.type_analyzer.builtins import (BUILTINS, KNOWN_MODULES, make_class)

pylons = Module("pylons", "__builtin__")
controllers = Module("controllers", "__builtin__")
pylons.setattr("controllers", Union(controllers))
WSGIController = UserClassType("WSGIController", (ObjectClass, ))
controllers.setattr("WSGIController", Union(WSGIController))

StackedObjectProxy = UserClassType("StackedObjectProxy", (ObjectClass, ))


class StackedObjectProxyType(CustomInstance):
    def __init__(self):
        super(StackedObjectProxyType, self).__init__(StackedObjectProxy, [])

    def getattr(self, attr, context):
        u = super(StackedObjectProxyType, self).get_name(attr, context)
        if u:
            return u