Skip to content

Commit a3cf45c

Browse files
authored
Enabling Ruff Preview (#104)
* enable preview * fix FURB152 * fix ruf errors * enable ruff preview * fragment * ci format=github * fix pipeline errors * missing queries file
1 parent 4493cf7 commit a3cf45c

File tree

106 files changed

+1433
-762
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+1433
-762
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Added
2+
body: 'Enabled ruff `preview` config option. '
3+
time: 2025-05-24T21:59:48.7591041Z
4+
custom:
5+
Author: rayakame
6+
PR: "104"

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ jobs:
139139

140140
- name: Run ruff via nox
141141
run: |
142-
uv run nox -s ruff_check
142+
uv run nox -s ruff_check -- --output-format=github
143143
pyright:
144144
runs-on: ubuntu-latest
145145
name: "Run pyright via nox"

internal/codegen/builders/query_results.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import "fmt"
44

55
func (b *IndentStringBuilder) WriteSyncQueryResultsClassHeader(connType string, initFields []string, driverReturnType string) {
66
b.WriteLine(`T = typing.TypeVar("T")`)
7-
b.NewLine()
7+
b.NNewLine(2)
88
b.WriteLine("class QueryResults(typing.Generic[T]):")
99
b.WriteQueryResultsClassDocstring(connType, driverReturnType)
1010
b.WriteIndentedLine(1, `__slots__ = ("_args", "_conn", "_cursor", "_decode_hook", "_iterator", "_sql")`)
@@ -33,7 +33,7 @@ func (b *IndentStringBuilder) WriteSyncQueryResultsClassHeader(connType string,
3333

3434
func (b *IndentStringBuilder) WriteAsyncQueryResultsClassHeader(connType string, initFields []string, driverReturnType string) {
3535
b.WriteLine(`T = typing.TypeVar("T")`)
36-
b.NewLine()
36+
b.NNewLine(2)
3737
b.WriteLine("class QueryResults(typing.Generic[T]):")
3838
b.WriteQueryResultsClassDocstring(connType, driverReturnType)
3939
b.WriteIndentedLine(1, `__slots__ = ("_args", "_conn", "_cursor", "_decode_hook", "_iterator", "_sql")`)

internal/codegen/drivers/aiosqlite.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,61 +63,61 @@ func AioSQLiteBuildTypeConvFunc(queries []core.Query, body *builders.IndentStrin
6363
if _, found := toConvert["datetime.date"]; found {
6464
body.WriteLine("def _adapt_date(val: datetime.date) -> str:")
6565
body.WriteIndentedLine(1, "return val.isoformat()")
66-
body.NewLine()
66+
body.NNewLine(2)
6767
adapters = append(adapters, "aiosqlite.register_adapter(datetime.date, _adapt_date)")
6868
body.WriteLine("def _convert_date(val: bytes) -> datetime.date:")
6969
if conf.Speedups {
7070
body.WriteIndentedLine(1, "return ciso8601.parse_datetime(val.decode()).date()")
7171
} else {
7272
body.WriteIndentedLine(1, "return datetime.date.fromisoformat(val.decode())")
7373
}
74-
body.NewLine()
74+
body.NNewLine(2)
7575
converters = append(converters, `aiosqlite.register_converter("date", _convert_date)`)
7676
}
7777
if _, found := toConvert["decimal.Decimal"]; found {
7878
body.WriteLine("def _adapt_decimal(val: decimal.Decimal) -> str:")
7979
body.WriteIndentedLine(1, "return str(val)")
80-
body.NewLine()
80+
body.NNewLine(2)
8181
adapters = append(adapters, "aiosqlite.register_adapter(decimal.Decimal, _adapt_decimal)")
8282
body.WriteLine("def _convert_decimal(val: bytes) -> decimal.Decimal:")
8383
body.WriteIndentedLine(1, "return decimal.Decimal(val.decode())")
84-
body.NewLine()
84+
body.NNewLine(2)
8585
converters = append(converters, `aiosqlite.register_converter("decimal", _convert_decimal)`)
8686
}
8787
if _, found := toConvert["datetime.datetime"]; found {
8888
body.WriteLine("def _adapt_datetime(val: datetime.datetime) -> str:")
8989
body.WriteIndentedLine(1, "return val.isoformat()")
90-
body.NewLine()
90+
body.NNewLine(2)
9191
adapters = append(adapters, "aiosqlite.register_adapter(datetime.datetime, _adapt_datetime)")
9292
body.WriteLine("def _convert_datetime(val: bytes) -> datetime.datetime:")
9393
if conf.Speedups {
9494
body.WriteIndentedLine(1, "return ciso8601.parse_datetime(val.decode())")
9595
} else {
9696
body.WriteIndentedLine(1, "return datetime.datetime.fromisoformat(val.decode())")
9797
}
98-
body.NewLine()
98+
body.NNewLine(2)
9999
converters = append(converters, `aiosqlite.register_converter("datetime", _convert_datetime)`)
100100
converters = append(converters, `aiosqlite.register_converter("timestamp", _convert_datetime)`)
101101
}
102102
if _, found := toConvert["bool"]; found {
103103
body.WriteLine("def _adapt_bool(val: bool) -> int:")
104104
body.WriteIndentedLine(1, "return int(val)")
105-
body.NewLine()
105+
body.NNewLine(2)
106106
adapters = append(adapters, "aiosqlite.register_adapter(bool, _adapt_bool)")
107107
body.WriteLine("def _convert_bool(val: bytes) -> bool:")
108108
body.WriteIndentedLine(1, "return bool(int(val))")
109-
body.NewLine()
109+
body.NNewLine(2)
110110
converters = append(converters, `aiosqlite.register_converter("bool", _convert_bool)`)
111111
converters = append(converters, `aiosqlite.register_converter("boolean", _convert_bool)`)
112112
}
113113
if _, found := toConvert["memoryview"]; found {
114114
body.WriteLine("def _adapt_memoryview(val: memoryview) -> bytes:")
115115
body.WriteIndentedLine(1, "return val.tobytes()")
116-
body.NewLine()
116+
body.NNewLine(2)
117117
adapters = append(adapters, "aiosqlite.register_adapter(memoryview, _adapt_memoryview)")
118118
body.WriteLine("def _convert_memoryview(val: bytes) -> memoryview:")
119119
body.WriteIndentedLine(1, "return memoryview(val)")
120-
body.NewLine()
120+
body.NNewLine(2)
121121
converters = append(converters, `aiosqlite.register_converter("blob", _convert_memoryview)`)
122122
}
123123
for i, line := range adapters {
@@ -240,9 +240,12 @@ func AioSQLiteBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBui
240240
} else if query.Cmd == metadata.CmdMany {
241241
body.WriteLine(fmt.Sprintf(") -> QueryResults[%s]:", retType.Type))
242242
body.WriteQueryFunctionDocstring(indentLevel+1, query, docstringConnType, args, retType)
243-
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", Sqlite3Result, retType.Type))
244243

245-
if query.Ret.IsStruct() {
244+
decode_hook := "_decode_hook"
245+
if !query.Ret.IsStruct() {
246+
decode_hook = "operator.itemgetter(0)"
247+
} else {
248+
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", Sqlite3Result, retType.Type))
246249
body.WriteIndentedString(indentLevel+2, fmt.Sprintf("return %s(", retType.Type))
247250
i := 0
248251
for _, col := range query.Ret.Table.Columns {
@@ -263,10 +266,8 @@ func AioSQLiteBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBui
263266
}
264267
}
265268
body.WriteLine(")")
266-
} else {
267-
body.WriteIndentedLine(indentLevel+2, "return row[0]")
268269
}
269-
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("return QueryResults[%s](%s, %s, _decode_hook", retType.Type, conn, query.ConstantName))
270+
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("return QueryResults[%s](%s, %s, %s", retType.Type, conn, query.ConstantName, decode_hook))
270271
params := ""
271272
for i, arg := range query.Args {
272273
if !arg.IsEmpty() {

internal/codegen/drivers/asyncpg.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ func AsyncpgBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
149149
i++
150150
}
151151
}
152-
body.WriteString(" ")
153152
body.WriteLine(")")
154153
} else {
155154
if typeConversion.AsyncpgDoTypeConversion(retType.SqlType) {
@@ -161,8 +160,14 @@ func AsyncpgBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
161160
} else if query.Cmd == metadata.CmdMany {
162161
body.WriteLine(fmt.Sprintf(") -> QueryResults[%s]:", retType.Type))
163162
body.WriteQueryFunctionDocstring(indentLevel+1, query, docstringConnType, args, retType)
164-
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", AsyncpgResult, retType.Type))
165-
if query.Ret.IsStruct() {
163+
decode_hook := "_decode_hook"
164+
if !query.Ret.IsStruct() && !typeConversion.AsyncpgDoTypeConversion(retType.SqlType) {
165+
decode_hook = "operator.itemgetter(0)"
166+
} else if !query.Ret.IsStruct() {
167+
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", AsyncpgResult, retType.Type))
168+
body.WriteIndentedLine(indentLevel+2, fmt.Sprintf("return %s(row[0])", retType.Type))
169+
} else {
170+
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", AsyncpgResult, retType.Type))
166171
body.WriteIndentedString(indentLevel+2, fmt.Sprintf("return %s(", retType.Type))
167172
i := 0
168173
for _, col := range query.Ret.Table.Columns {
@@ -191,14 +196,8 @@ func AsyncpgBuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
191196
}
192197
}
193198
body.WriteLine(")")
194-
} else {
195-
if typeConversion.AsyncpgDoTypeConversion(retType.SqlType) {
196-
body.WriteIndentedLine(indentLevel+2, fmt.Sprintf("return %s(row[0])", retType.Type))
197-
} else {
198-
body.WriteIndentedLine(indentLevel+2, "return row[0]")
199-
}
200199
}
201-
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("return QueryResults[%s](%s, %s, _decode_hook", retType.Type, conn, query.ConstantName))
200+
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("return QueryResults[%s](%s, %s, %s", retType.Type, conn, query.ConstantName, decode_hook))
202201
asyncpgWriteParams(query, body)
203202
body.WriteLine(")")
204203
}

internal/codegen/drivers/sqlite3.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,61 +64,61 @@ func SQLite3BuildTypeConvFunc(queries []core.Query, body *builders.IndentStringB
6464
if _, found := toConvert["datetime.date"]; found {
6565
body.WriteLine("def _adapt_date(val: datetime.date) -> str:")
6666
body.WriteIndentedLine(1, "return val.isoformat()")
67-
body.NewLine()
67+
body.NNewLine(2)
6868
adapters = append(adapters, "sqlite3.register_adapter(datetime.date, _adapt_date)")
6969
body.WriteLine("def _convert_date(val: bytes) -> datetime.date:")
7070
if conf.Speedups {
7171
body.WriteIndentedLine(1, "return ciso8601.parse_datetime(val.decode()).date()")
7272
} else {
7373
body.WriteIndentedLine(1, "return datetime.date.fromisoformat(val.decode())")
7474
}
75-
body.NewLine()
75+
body.NNewLine(2)
7676
converters = append(converters, `sqlite3.register_converter("date", _convert_date)`)
7777
}
7878
if _, found := toConvert["decimal.Decimal"]; found {
7979
body.WriteLine("def _adapt_decimal(val: decimal.Decimal) -> str:")
8080
body.WriteIndentedLine(1, "return str(val)")
81-
body.NewLine()
81+
body.NNewLine(2)
8282
adapters = append(adapters, "sqlite3.register_adapter(decimal.Decimal, _adapt_decimal)")
8383
body.WriteLine("def _convert_decimal(val: bytes) -> decimal.Decimal:")
8484
body.WriteIndentedLine(1, "return decimal.Decimal(val.decode())")
85-
body.NewLine()
85+
body.NNewLine(2)
8686
converters = append(converters, `sqlite3.register_converter("decimal", _convert_decimal)`)
8787
}
8888
if _, found := toConvert["datetime.datetime"]; found {
8989
body.WriteLine("def _adapt_datetime(val: datetime.datetime) -> str:")
9090
body.WriteIndentedLine(1, "return val.isoformat()")
91-
body.NewLine()
91+
body.NNewLine(2)
9292
adapters = append(adapters, "sqlite3.register_adapter(datetime.datetime, _adapt_datetime)")
9393
body.WriteLine("def _convert_datetime(val: bytes) -> datetime.datetime:")
9494
if conf.Speedups {
9595
body.WriteIndentedLine(1, "return ciso8601.parse_datetime(val.decode())")
9696
} else {
9797
body.WriteIndentedLine(1, "return datetime.datetime.fromisoformat(val.decode())")
9898
}
99-
body.NewLine()
99+
body.NNewLine(2)
100100
converters = append(converters, `sqlite3.register_converter("datetime", _convert_datetime)`)
101101
converters = append(converters, `sqlite3.register_converter("timestamp", _convert_datetime)`)
102102
}
103103
if _, found := toConvert["bool"]; found {
104104
body.WriteLine("def _adapt_bool(val: bool) -> int:")
105105
body.WriteIndentedLine(1, "return int(val)")
106-
body.NewLine()
106+
body.NNewLine(2)
107107
adapters = append(adapters, "sqlite3.register_adapter(bool, _adapt_bool)")
108108
body.WriteLine("def _convert_bool(val: bytes) -> bool:")
109109
body.WriteIndentedLine(1, "return bool(int(val))")
110-
body.NewLine()
110+
body.NNewLine(2)
111111
converters = append(converters, `sqlite3.register_converter("bool", _convert_bool)`)
112112
converters = append(converters, `sqlite3.register_converter("boolean", _convert_bool)`)
113113
}
114114
if _, found := toConvert["memoryview"]; found {
115115
body.WriteLine("def _adapt_memoryview(val: memoryview) -> bytes:")
116116
body.WriteIndentedLine(1, "return val.tobytes()")
117-
body.NewLine()
117+
body.NNewLine(2)
118118
adapters = append(adapters, "sqlite3.register_adapter(memoryview, _adapt_memoryview)")
119119
body.WriteLine("def _convert_memoryview(val: bytes) -> memoryview:")
120120
body.WriteIndentedLine(1, "return memoryview(val)")
121-
body.NewLine()
121+
body.NNewLine(2)
122122
converters = append(converters, `sqlite3.register_converter("blob", _convert_memoryview)`)
123123
}
124124
for i, line := range adapters {
@@ -237,9 +237,11 @@ func SQLite3BuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
237237
} else if query.Cmd == metadata.CmdMany {
238238
body.WriteLine(fmt.Sprintf(") -> QueryResults[%s]:", retType.Type))
239239
body.WriteQueryFunctionDocstring(indentLevel+1, query, docstringConnType, args, retType)
240-
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", Sqlite3Result, retType.Type))
241-
242-
if query.Ret.IsStruct() {
240+
decode_hook := "_decode_hook"
241+
if !query.Ret.IsStruct() {
242+
decode_hook = "operator.itemgetter(0)"
243+
} else {
244+
body.WriteIndentedLine(indentLevel+1, fmt.Sprintf("def _decode_hook(row: %s) -> %s:", Sqlite3Result, retType.Type))
243245
body.WriteIndentedString(indentLevel+2, fmt.Sprintf("return %s(", retType.Type))
244246
i := 0
245247
for _, col := range query.Ret.Table.Columns {
@@ -260,10 +262,8 @@ func SQLite3BuildPyQueryFunc(query *core.Query, body *builders.IndentStringBuild
260262
}
261263
}
262264
body.WriteLine(")")
263-
} else {
264-
body.WriteIndentedLine(indentLevel+2, "return row[0]")
265265
}
266-
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("return QueryResults[%s](%s, %s, _decode_hook", retType.Type, conn, query.ConstantName))
266+
body.WriteIndentedString(indentLevel+1, fmt.Sprintf("return QueryResults[%s](%s, %s, %s", retType.Type, conn, query.ConstantName, decode_hook))
267267
params := ""
268268
for i, arg := range query.Args {
269269
if !arg.IsEmpty() {
@@ -307,5 +307,5 @@ func sqlite3WriteParams(query *core.Query, body *builders.IndentStringBuilder) {
307307
}
308308
}
309309
}
310-
body.WriteString("," + params + ")")
310+
body.WriteString(", " + params + ")")
311311
}

internal/codegen/queries.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func (dr *Driver) buildPyQueriesFile(imp *core.Importer, queries []core.Query, s
142142
if core.IsAnyQueryMany(queries) {
143143
funcBody.NewLine()
144144
allNames = append(allNames, dr.driverBuildQueryResults(funcBody))
145+
funcBody.NewLine()
145146
}
146147
funcBody.NewLine()
147148
if dr.conf.EmitClasses {

internal/codegen/tables.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ func (dr *Driver) buildPyTables(imp *core.Importer, tables []core.Table) (string
6767
body.WriteIndentedLine(1, imp)
6868
}
6969
}
70-
body.WriteLine("")
71-
for _, imp := range pkg {
70+
for i, imp := range pkg {
71+
if i == 0 {
72+
body.NewLine()
73+
}
7274
body.WriteLine(imp)
7375
}
7476
for _, table := range tables {

internal/core/importer.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,14 @@ func (i *Importer) queryImportSpecs(_ string) (map[string]importSpec, map[string
205205
}
206206
return *uses, *typeChecking
207207
}
208+
querySimpleReturn := func(conv typeConversion.TypeDoTypeConversion) bool {
209+
for _, q := range i.Queries {
210+
if !q.Ret.IsStruct() && !conv(q.Ret.Typ.SqlType) {
211+
return true
212+
}
213+
}
214+
return false
215+
}
208216

209217
std := stdImports(queryUses)
210218
std, typeChecking := i.splitTypeChecking(std)
@@ -213,6 +221,9 @@ func (i *Importer) queryImportSpecs(_ string) (map[string]importSpec, map[string
213221

214222
if IsAnyQueryMany(i.Queries) {
215223
typeChecking[string(SQLDriverAsyncpg)+".cursor"] = importSpec{Module: string(SQLDriverAsyncpg) + ".cursor"}
224+
if querySimpleReturn(typeConversion.AsyncpgDoTypeConversion) {
225+
std["operator"] = importSpec{Module: "operator"}
226+
}
216227
}
217228
} else if i.C.SqlDriver == SQLDriverAioSQLite {
218229
// if the std mapping has exactly 2 members, these two are collections and typing,
@@ -225,6 +236,9 @@ func (i *Importer) queryImportSpecs(_ string) (map[string]importSpec, map[string
225236
}
226237
if IsAnyQueryMany(i.Queries) {
227238
typeChecking[string(SQLDriverSQLite)] = importSpec{Module: string(SQLDriverSQLite)}
239+
if querySimpleReturn(typeConversion.SqliteDoTypeConversion) {
240+
std["operator"] = importSpec{Module: "operator"}
241+
}
228242
}
229243
} else if i.C.SqlDriver == SQLDriverSQLite {
230244
// if the std mapping has exactly 2 members, these two are collections and typing,
@@ -235,6 +249,11 @@ func (i *Importer) queryImportSpecs(_ string) (map[string]importSpec, map[string
235249
} else {
236250
typeChecking[string(SQLDriverSQLite)] = importSpec{Module: string(SQLDriverSQLite)}
237251
}
252+
if IsAnyQueryMany(i.Queries) {
253+
if querySimpleReturn(typeConversion.SqliteDoTypeConversion) {
254+
std["operator"] = importSpec{Module: "operator"}
255+
}
256+
}
238257
}
239258
if addCiso {
240259
std["ciso8601"] = importSpec{Module: "ciso8601"}
@@ -280,7 +299,7 @@ func (i *Importer) queryImports(fileName string) ([]string, []string, []string)
280299
if len(typeCheck) != 0 {
281300
typeLines[len(typeLines)-1] = typeLines[len(typeLines)-1] + "\n"
282301
}
283-
queryResultsArgsType := "QueryResultsArgsType: typing.TypeAlias = int | float | str | memoryview | None"
302+
queryResultsArgsType := "QueryResultsArgsType: typing.TypeAlias = int | float | str | memoryview"
284303
if IsInMultipleMaps("decimal", std, typeCheck) {
285304
queryResultsArgsType += " | decimal.Decimal"
286305
}
@@ -290,6 +309,7 @@ func (i *Importer) queryImports(fileName string) ([]string, []string, []string)
290309
if IsInMultipleMaps("datetime", std, typeCheck) {
291310
queryResultsArgsType += " | datetime.date | datetime.time | datetime.datetime | datetime.timedelta"
292311
}
312+
queryResultsArgsType += " | None"
293313
typeLines = append(typeLines, queryResultsArgsType)
294314
}
295315

internal/typeConversion/common.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package typeConversion
2+
3+
type TypeDoTypeConversion func(string) bool

0 commit comments

Comments
 (0)