예제 #1
0
def register_table(table: typing.NamedTuple) -> None:
    keyspace = getattr(table, '__keyspace__', None)
    if keyspace is None:
        raise NotImplementedError(f'Table[{table.__class__}] missing Keyspace')

    field_names = []
    field_transliterators = []
    for field_name, annotation in table.__annotations__.items():
        field_names.append(field_name)
        try:
            transliterator = DT_MAP[annotation]
        except KeyError:
            if isinstance(annotation, Set):
                import pdb
                pdb.set_trace()
                pass

            elif issubclass(annotation, enum.Enum):
                transliterator = EnumTransliterator(annotation)

            else:
                transliterator = UDT_MAP.get(annotation, None)
                if transliterator is None:
                    raise NotImplementedError

        field_transliterators.append(transliterator)

    pk_fields = getattr(table, '__primary_keys__', [])[:] or field_names[:]
    for pk_field in pk_fields:
        if not pk_field in field_names:
            raise NotImplementedError(
                f'Field[{pk_field}] not in Table[{table.__class__}]')

    ordered_by_primary_keys = getattr(table, '__ordered_by_primary_keys__',
                                      TableOrdering.Nope)
    assert ordered_by_primary_keys.__class__ is TableOrdering, 'Invalid Datatype. Using corm.datatypes.TableOrdering object'

    corm_details = CORMDetails(table.__keyspace__, table.__name__.lower(),
                               field_names, field_transliterators, pk_fields,
                               ordered_by_primary_keys)

    TABLES[corm_details.table_name] = corm_details
    table._corm_details = corm_details
예제 #2
0
def register_table(table: typing.NamedTuple) -> None:
    keyspace = getattr(table, '__keyspace__', None)
    if keyspace is None:
        raise NotImplementedError(f'Table[{table.__class__}] missing Keyspace')

    field_names = []
    field_transliterators = []
    for field_name, annotation in table.__annotations__.items():
        field_names.append(field_name)
        field_transliterators.append(DT_MAP[annotation])

    pk_fields = getattr(table, 'primary_key', None) or field_names[:]
    for pk_field in pk_fields:
        if not pk_field in field_names:
            raise NotImplementedError(
                f'Field[{pk_field}] not in Table[{table.__class__}]')

    corm_details = CORMDetails(table.__keyspace__, table.__name__.lower(),
                               field_names, field_transliterators, pk_fields)

    TABLES[corm_details.table_name] = corm_details
    table._corm_details = corm_details