protoc-gen-sqlmodel 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: protoc-gen-sqlmodel
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: protoc plugin to generate SQLModel classes
5
5
  Author: River Studio
6
6
  Author-email: River Studio <git@river-studio.net>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "protoc-gen-sqlmodel"
3
- version = "0.2.0"
3
+ version = "0.3.0"
4
4
  description = "protoc plugin to generate SQLModel classes"
5
5
  readme = "README.md"
6
6
  classifiers = [
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "protoc-gen-sqlmodel"
3
- version = "0.2.0"
3
+ version = "0.3.0"
4
4
  description = "protoc plugin to generate SQLModel classes"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -25,4 +25,5 @@ extend google.protobuf.FieldOptions {
25
25
  string passive_deletes = 50013;
26
26
  string link_model = 50014;
27
27
  string server_default = 50015;
28
+ bool nullable = 50016;
28
29
  }
@@ -121,9 +121,16 @@ extend google.protobuf.FieldOptions { optional string server_default = 50015 [js
121
121
  ```
122
122
  """
123
123
 
124
+ ext_nullable: Final[Extension[FieldOptions, bool]] = Extension()
125
+ """
126
+ ```proto
127
+ extend google.protobuf.FieldOptions { optional bool nullable = 50016 [json_name = "[example.sqlmodel.nullable]"] }
128
+ ```
129
+ """
130
+
124
131
 
125
132
  _DESC = file_desc(
126
- b'\n\x19sqlmodel_extensions.proto\x12\x10example.sqlmodel\x1a google/protobuf/descriptor.proto:7\n\x05table\x18\xd1\x86\x03 \x01(\x08\x12\x1f.google.protobuf.MessageOptionsR\x05table:8\n\x07sa_type\x18\xd2\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x06saType:@\n\x0bprimary_key\x18\xd3\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\nprimaryKey:J\n\x10sqlmodel_default\x18\xd4\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x0fsqlmodelDefault:Y\n\x18sqlmodel_default_factory\x18\xd5\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x16sqlmodelDefaultFactory:>\n\npy_default\x18\xd6\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\tpyDefault:5\n\x05index\x18\xd7\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x05index:@\n\x0bforeign_key\x18\xd8\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\nforeignKey:C\n\x0crelationship\x18\xd9\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x0crelationship:F\n\x0eback_populates\x18\xda\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\rbackPopulates:F\n\x0ecascade_delete\x18\xdb\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\rcascadeDelete:<\n\ton_delete\x18\xdc\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x08onDelete:H\n\x0fpassive_deletes\x18\xdd\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x0epassiveDeletes:>\n\nlink_model\x18\xde\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\tlinkModel:F\n\x0eserver_default\x18\xdf\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\rserverDefaultb\x06proto3',
133
+ b'\n\x19sqlmodel_extensions.proto\x12\x10example.sqlmodel\x1a google/protobuf/descriptor.proto:7\n\x05table\x18\xd1\x86\x03 \x01(\x08\x12\x1f.google.protobuf.MessageOptionsR\x05table:8\n\x07sa_type\x18\xd2\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x06saType:@\n\x0bprimary_key\x18\xd3\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\nprimaryKey:J\n\x10sqlmodel_default\x18\xd4\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x0fsqlmodelDefault:Y\n\x18sqlmodel_default_factory\x18\xd5\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x16sqlmodelDefaultFactory:>\n\npy_default\x18\xd6\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\tpyDefault:5\n\x05index\x18\xd7\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x05index:@\n\x0bforeign_key\x18\xd8\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\nforeignKey:C\n\x0crelationship\x18\xd9\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x0crelationship:F\n\x0eback_populates\x18\xda\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\rbackPopulates:F\n\x0ecascade_delete\x18\xdb\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\rcascadeDelete:<\n\ton_delete\x18\xdc\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x08onDelete:H\n\x0fpassive_deletes\x18\xdd\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\x0epassiveDeletes:>\n\nlink_model\x18\xde\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\tlinkModel:F\n\x0eserver_default\x18\xdf\x86\x03 \x01(\t\x12\x1d.google.protobuf.FieldOptionsR\rserverDefault:;\n\x08nullable\x18\xe0\x86\x03 \x01(\x08\x12\x1d.google.protobuf.FieldOptionsR\x08nullableb\x06proto3',
127
134
  [
128
135
  descriptor_pb.desc(),
129
136
  ],
@@ -143,6 +150,7 @@ _DESC = file_desc(
143
150
  "passive_deletes": ext_passive_deletes,
144
151
  "link_model": ext_link_model,
145
152
  "server_default": ext_server_default,
153
+ "nullable": ext_nullable,
146
154
  },
147
155
  )
148
156
 
@@ -1,6 +1,7 @@
1
1
  from protobuf import (
2
2
  DescEnum,
3
3
  DescExtension,
4
+ DescField,
4
5
  DescFieldValueScalar,
5
6
  DescMessage,
6
7
  ScalarType,
@@ -8,6 +9,8 @@ from protobuf import (
8
9
  from protobuf._descriptors import SupportedFieldPresence
9
10
  from protobuf.plugin import File, Module
10
11
 
12
+ from protoc_gen_sqlmodel.proto.sqlmodel_extensions_pb import ext_server_default
13
+
11
14
  ENUM = Module("enum").ident("Enum")
12
15
  FINAL = Module("typing").ident("Final")
13
16
  EXTENSION = Module("protobuf").ident("Extension")
@@ -25,7 +28,12 @@ def get_presence(presence: SupportedFieldPresence) -> str:
25
28
  return ""
26
29
 
27
30
 
28
- def get_python_scalar_type(scalar: ScalarType):
31
+ def get_python_scalar_type(scalar: ScalarType, desc: DescField | None = None):
32
+ if desc and (opts := desc.proto.options) and ext_server_default in opts:
33
+ server_default = opts[ext_server_default]
34
+ if "uuid" in server_default:
35
+ return Module("uuid").ident("uuid7")
36
+
29
37
  match scalar:
30
38
  case ScalarType.BOOL:
31
39
  return "bool"
@@ -20,6 +20,7 @@ from protoc_gen_sqlmodel.proto.sqlmodel_extensions_pb import (
20
20
  ext_foreign_key,
21
21
  ext_index,
22
22
  ext_link_model,
23
+ ext_nullable,
23
24
  ext_on_delete,
24
25
  ext_passive_deletes,
25
26
  ext_primary_key,
@@ -51,9 +52,9 @@ FIELD_EXTENSIONS = {
51
52
  ext_primary_key: "primary_key",
52
53
  ext_py_default: "py_default",
53
54
  ext_sa_type: "sa_type",
54
- ext_server_default: "server_default",
55
55
  ext_sqlmodel_default: "sqlmodel_default",
56
56
  ext_sqlmodel_default_factory: "sqlmodel_default_factory",
57
+ ext_nullable: "nullable",
57
58
  }
58
59
 
59
60
 
@@ -74,6 +75,12 @@ def handle_field_extensions(desc: DescField, default_value: Any | None):
74
75
  field_options.append(f"default={default_value}")
75
76
  options = True
76
77
 
78
+ if ext_server_default in opts:
79
+ server_default = opts[ext_server_default]
80
+ field_options.append('sa_column_kwargs={"server_default": text("')
81
+ field_options.append(server_default)
82
+ field_options.append('")}, ')
83
+
77
84
  for ext, field_name in FIELD_EXTENSIONS.items():
78
85
  if ext in opts:
79
86
  field_options.append(f"{field_name}=")
@@ -96,7 +103,7 @@ def handle_leaf_field(desc: DescField, f: File):
96
103
 
97
104
  match desc.value:
98
105
  case DescFieldValueScalar(scalar, default_value, _):
99
- print_components.append(get_python_scalar_type(scalar))
106
+ print_components.append(get_python_scalar_type(scalar, desc))
100
107
  print_components.append(field_presence)
101
108
  if default_value or field_presence:
102
109
  field_default = default_value