Coverage for src / lexigram / contracts / data / sql / __init__.py: 93%

15 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-19 05:41 +0800

1"""SQL data contracts.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any 

6 

7if TYPE_CHECKING: 

8 from lexigram.contracts.data.sql.append_log import ( 

9 AppendLogProtocol, 

10 AppendLogSnapshotStore, 

11 ) 

12 from lexigram.contracts.data.sql.database import ( 

13 ConnectionPoolProtocol, 

14 ConnectionProtocol, 

15 CrudOperationsProtocol, 

16 DatabaseMetricsProtocol, 

17 DatabaseProviderProtocol, 

18 DeleteResult, 

19 HealthMonitorProtocol, 

20 InsertResult, 

21 IsolationLevel, 

22 MigrationManagerProtocol, 

23 MigrationRecord, 

24 QueryResult, 

25 SchemaManagerProtocol, 

26 TransactionManagerProtocol, 

27 UpdateResult, 

28 ) 

29 from lexigram.contracts.data.sql.mapper import ( 

30 DataMapperProtocol, 

31 ReadOnlyMapperProtocol, 

32 ) 

33 from lexigram.contracts.data.sql.migrations import MigrationRunnerProtocol 

34 from lexigram.contracts.data.sql.query_log import QueryLogEntry, QueryLoggerProtocol 

35 from lexigram.contracts.data.sql.sql import InvalidIdentifierError, RawSQL 

36 from lexigram.contracts.data.sql.sql_dialect import ( 

37 DEFAULT_MAX_IDENTIFIER_LENGTH, 

38 MAX_IDENTIFIER_LENGTHS, 

39 SQLDialect, 

40 ) 

41 from lexigram.contracts.data.sql.unit_of_work import UnitOfWorkProtocol 

42 

43_LAZY_IMPORTS: dict[str, tuple[str, str]] = { 

44 "DEFAULT_MAX_IDENTIFIER_LENGTH": ( 

45 "lexigram.contracts.data.sql.sql_dialect", 

46 "DEFAULT_MAX_IDENTIFIER_LENGTH", 

47 ), 

48 "MAX_IDENTIFIER_LENGTHS": ( 

49 "lexigram.contracts.data.sql.sql_dialect", 

50 "MAX_IDENTIFIER_LENGTHS", 

51 ), 

52 "AppendLogProtocol": ( 

53 "lexigram.contracts.data.sql.append_log", 

54 "AppendLogProtocol", 

55 ), 

56 "AppendLogSnapshotStore": ( 

57 "lexigram.contracts.data.sql.append_log", 

58 "AppendLogSnapshotStore", 

59 ), 

60 "ConnectionPoolProtocol": ( 

61 "lexigram.contracts.data.sql.database", 

62 "ConnectionPoolProtocol", 

63 ), 

64 "ConnectionProtocol": ( 

65 "lexigram.contracts.data.sql.database", 

66 "ConnectionProtocol", 

67 ), 

68 "CrudOperationsProtocol": ( 

69 "lexigram.contracts.data.sql.database", 

70 "CrudOperationsProtocol", 

71 ), 

72 "DataMapperProtocol": ( 

73 "lexigram.contracts.data.sql.mapper", 

74 "DataMapperProtocol", 

75 ), 

76 "DatabaseMetricsProtocol": ( 

77 "lexigram.contracts.data.sql.database", 

78 "DatabaseMetricsProtocol", 

79 ), 

80 "DatabaseProviderProtocol": ( 

81 "lexigram.contracts.data.sql.database", 

82 "DatabaseProviderProtocol", 

83 ), 

84 "DeleteResult": ( 

85 "lexigram.contracts.data.sql.database", 

86 "DeleteResult", 

87 ), 

88 "HealthMonitorProtocol": ( 

89 "lexigram.contracts.data.sql.database", 

90 "HealthMonitorProtocol", 

91 ), 

92 "InsertResult": ( 

93 "lexigram.contracts.data.sql.database", 

94 "InsertResult", 

95 ), 

96 "InvalidIdentifierError": ( 

97 "lexigram.contracts.data.sql.sql", 

98 "InvalidIdentifierError", 

99 ), 

100 "IsolationLevel": ( 

101 "lexigram.contracts.data.sql.database", 

102 "IsolationLevel", 

103 ), 

104 "MigrationManagerProtocol": ( 

105 "lexigram.contracts.data.sql.database", 

106 "MigrationManagerProtocol", 

107 ), 

108 "MigrationRecord": ( 

109 "lexigram.contracts.data.sql.database", 

110 "MigrationRecord", 

111 ), 

112 "MigrationRunnerProtocol": ( 

113 "lexigram.contracts.data.sql.migrations", 

114 "MigrationRunnerProtocol", 

115 ), 

116 "QueryLogEntry": ( 

117 "lexigram.contracts.data.sql.query_log", 

118 "QueryLogEntry", 

119 ), 

120 "QueryLoggerProtocol": ( 

121 "lexigram.contracts.data.sql.query_log", 

122 "QueryLoggerProtocol", 

123 ), 

124 "QueryResult": ( 

125 "lexigram.contracts.data.sql.database", 

126 "QueryResult", 

127 ), 

128 "RawSQL": ( 

129 "lexigram.contracts.data.sql.sql", 

130 "RawSQL", 

131 ), 

132 "ReadOnlyMapperProtocol": ( 

133 "lexigram.contracts.data.sql.mapper", 

134 "ReadOnlyMapperProtocol", 

135 ), 

136 "SQLDialect": ( 

137 "lexigram.contracts.data.sql.sql_dialect", 

138 "SQLDialect", 

139 ), 

140 "SchemaManagerProtocol": ( 

141 "lexigram.contracts.data.sql.database", 

142 "SchemaManagerProtocol", 

143 ), 

144 "TransactionManagerProtocol": ( 

145 "lexigram.contracts.data.sql.database", 

146 "TransactionManagerProtocol", 

147 ), 

148 "UnitOfWorkProtocol": ( 

149 "lexigram.contracts.data.sql.unit_of_work", 

150 "UnitOfWorkProtocol", 

151 ), 

152 "UpdateResult": ( 

153 "lexigram.contracts.data.sql.database", 

154 "UpdateResult", 

155 ), 

156} 

157 

158 

159def __getattr__(name: str) -> Any: 

160 """Lazy-load symbols on first access.""" 

161 if name in _LAZY_IMPORTS: 

162 import importlib 

163 

164 module_path, attr_name = _LAZY_IMPORTS[name] 

165 module = importlib.import_module(module_path) 

166 value = getattr(module, attr_name) 

167 globals()[name] = value 

168 return value 

169 raise AttributeError(f"module {__name__!r} has no attribute {name!r}") 

170 

171 

172def __dir__() -> list[str]: 

173 """Enumerate available attributes for IDE support.""" 

174 return sorted(set(__all__) | set(_LAZY_IMPORTS.keys())) 

175 

176 

177__all__ = [ 

178 "DEFAULT_MAX_IDENTIFIER_LENGTH", 

179 "MAX_IDENTIFIER_LENGTHS", 

180 "AppendLogProtocol", 

181 "AppendLogSnapshotStore", 

182 "ConnectionPoolProtocol", 

183 "ConnectionProtocol", 

184 "CrudOperationsProtocol", 

185 "DataMapperProtocol", 

186 "DatabaseMetricsProtocol", 

187 "DatabaseProviderProtocol", 

188 "DeleteResult", 

189 "HealthMonitorProtocol", 

190 "InsertResult", 

191 "InvalidIdentifierError", 

192 "IsolationLevel", 

193 "MigrationManagerProtocol", 

194 "MigrationRecord", 

195 "MigrationRunnerProtocol", 

196 "QueryLogEntry", 

197 "QueryLoggerProtocol", 

198 "QueryResult", 

199 "RawSQL", 

200 "ReadOnlyMapperProtocol", 

201 "SQLDialect", 

202 "SchemaManagerProtocol", 

203 "TransactionManagerProtocol", 

204 "UnitOfWorkProtocol", 

205 "UpdateResult", 

206]