• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

agronholm / sqlacodegen / 12938863942

23 Jan 2025 10:01PM UTC coverage: 97.025% (-2.0%) from 99.035%
12938863942

push

github

web-flow
SQLModel Code generation fixes  (#358)

12 of 15 new or added lines in 1 file covered. (80.0%)

33 existing lines in 3 files now uncovered.

1337 of 1378 relevant lines covered (97.02%)

4.85 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.91
/src/sqlacodegen/models.py
1
from __future__ import annotations
5✔
2

3
from dataclasses import dataclass, field
5✔
4
from enum import Enum, auto
5✔
5
from typing import Any, Tuple, Union
5✔
6

7
from sqlalchemy.sql.schema import Column, ForeignKeyConstraint, Table
5✔
8

9

10
@dataclass
5✔
11
class Model:
5✔
12
    table: Table
5✔
13
    name: str = field(init=False, default="")
5✔
14

15
    @property
5✔
16
    def schema(self) -> str | None:
5✔
17
        return self.table.schema
5✔
18

19

20
@dataclass
5✔
21
class ModelClass(Model):
5✔
22
    columns: list[ColumnAttribute] = field(default_factory=list)
5✔
23
    relationships: list[RelationshipAttribute] = field(default_factory=list)
5✔
24
    parent_class: ModelClass | None = None
5✔
25
    children: list[ModelClass] = field(default_factory=list)
5✔
26

27
    def get_column_attribute(self, column_name: str) -> ColumnAttribute:
5✔
28
        for column in self.columns:
5✔
29
            if column.column.name == column_name:
5✔
30
                return column
5✔
31

32
        raise LookupError(f"Cannot find column attribute for {column_name!r}")
×
33

34

35
class RelationshipType(Enum):
5✔
36
    ONE_TO_ONE = auto()
5✔
37
    ONE_TO_MANY = auto()
5✔
38
    MANY_TO_ONE = auto()
5✔
39
    MANY_TO_MANY = auto()
5✔
40

41

42
@dataclass
5✔
43
class ColumnAttribute:
5✔
44
    model: ModelClass
5✔
45
    column: Column[Any]
5✔
46
    name: str = field(init=False, default="")
5✔
47

48
    def __repr__(self) -> str:
5✔
49
        return f"{self.__class__.__name__}(name={self.name!r}, type={self.column.type})"
×
50

51
    def __str__(self) -> str:
5✔
52
        return self.name
×
53

54

55
JoinType = Tuple[Model, Union[ColumnAttribute, str], Model, Union[ColumnAttribute, str]]
5✔
56

57

58
@dataclass
5✔
59
class RelationshipAttribute:
5✔
60
    type: RelationshipType
5✔
61
    source: ModelClass
5✔
62
    target: ModelClass
5✔
63
    constraint: ForeignKeyConstraint | None = None
5✔
64
    association_table: Model | None = None
5✔
65
    backref: RelationshipAttribute | None = None
5✔
66
    remote_side: list[ColumnAttribute] = field(default_factory=list)
5✔
67
    foreign_keys: list[ColumnAttribute] = field(default_factory=list)
5✔
68
    primaryjoin: list[JoinType] = field(default_factory=list)
5✔
69
    secondaryjoin: list[JoinType] = field(default_factory=list)
5✔
70
    name: str = field(init=False, default="")
5✔
71

72
    def __repr__(self) -> str:
5✔
UNCOV
73
        return (
×
74
            f"{self.__class__.__name__}(name={self.name!r}, type={self.type}, "
75
            f"target={self.target.name})"
76
        )
77

78
    def __str__(self) -> str:
5✔
79
        return self.name
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc