Skip to content

Commit f260142

Browse files
committed
Version 5.2.1 - Implicit Import Fox
### Changed - The line `from typing import *` in most templates to `import typing` and now references to classes an such from `typing` are explicit (i.e. `List` -> `typing.List`) ### Fixed - Side-effects caused by `from typing import *` when messages/classes share a name of classes in the `typing` package - Bug where `datetime` was missing from imports in gRPC senders and receivers
1 parent 772f648 commit f260142

Some content is hidden

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

47 files changed

+280
-264
lines changed

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [5.2.1] - 2024-09-24
9+
10+
### Changed
11+
12+
- The line `from typing import *` in most templates to `import typing` and now
13+
references to classes an such from `typing` are explicit (i.e. `List` ->
14+
`typing.List`)
15+
16+
### Fixed
17+
18+
- Side-effects caused by `from typing import *` when messages/classes share a
19+
name of classes in the `typing` package
20+
- Bug where `datetime` was missing from imports in gRPC senders and receivers
21+
22+
823
## [5.2.0] - 2024-09-23
924

1025
### Added

neobuilder/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = '5.2.0'
1+
__version__ = '5.2.1'
22

33
__author__ = 'Thordur Matthiasson <thordurm@ccpgames.com>'
44
__license__ = 'MIT License'

neobuilder/data/templates/dataclass_module.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ __all__ = [
1010
import dataclasses
1111
import datetime
1212
import enum
13-
from typing import *
13+
import typing
1414
from protoplasm.casting import dictators
1515
from protoplasm import plasm
1616
{{ imports }}

neobuilder/data/templates/grpc_receiver.jinja2

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ __all__ = [
66
'{{ a }}',
77
{% endfor %}
88
]
9-
from typing import *
9+
import datetime
10+
import typing
1011
from protoplasm import plasm
1112
{{ imports }}
12-
if TYPE_CHECKING:
13+
if typing.TYPE_CHECKING:
1314
from grpc import ServicerContext
1415
{{ api_import }}
1516

neobuilder/data/templates/grpc_sender.jinja2

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ __all__ = [
77
'{{ a }}',
88
{% endfor %}
99
]
10-
from typing import *
10+
import datetime
11+
import typing
1112
from protoplasm import plasm
1213
{{ imports }}
13-
if TYPE_CHECKING:
14+
if typing.TYPE_CHECKING:
1415
from grpc import ChannelCredentials
1516

1617
import logging

neobuilder/data/templates/interface.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ __all__ = [
88
{% endfor %}
99
]
1010
import datetime
11-
from typing import *
11+
import typing
1212
from protoplasm import plasm
1313

1414
{% for import_line in import_lines %}

neobuilder/descwrap/_field.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class FieldKind(enum.IntFlag):
5353
FIELD_ENUM_MAP = DATA_ENUM | KIND_MAP
5454

5555
def __repr__(self) -> str:
56-
return self.name
56+
return self.name or str(self.value)
5757

5858

5959
@dataclasses.dataclass

neobuilder/generators/servicebuilders/grpc_sender.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def render(self) -> str:
4848
i = self.base_indent
4949
return (
5050
f'{i}class {self.service.service_descriptor.name}(plasm.BaseGrpcClientImplementation, {self.service.service_descriptor.name}Interface):\n'
51-
f'{i}{__}def __init__(self, grpc_host: str = \'localhost:50051\', credentials: Optional[Union[bool, \'ChannelCredentials\']] = None, options: Optional[Dict] = None, *args, **kwargs):\n'
51+
f'{i}{__}def __init__(self, grpc_host: str = \'localhost:50051\', credentials: typing.Optional[typing.Union[bool, \'ChannelCredentials\']] = None, options: typing.Optional[typing.Dict] = None, *args, **kwargs):\n'
5252
f'{i}{__}{__}super().__init__(pb2_grpc.{self.service.service_descriptor.name}Stub, grpc_host, credentials, options, *args, **kwargs)\n'
5353
f'\n'
5454
f'{self.render_methods()}'

neobuilder/generators/symbols/dataclass.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def get_imports(self):
9494

9595
def output_google_type_proxy(self):
9696
return {
97-
'Empty': 'NoReturn'
97+
'Empty': 'typing.NoReturn'
9898
}.get(
9999
self.get_class_name()
100100
)
@@ -162,7 +162,7 @@ def render_api_request_arg(self, method_desc: MethodDescriptorWrapper):
162162
type_hint = f'{self.self_import.get_import_name(method_desc.file_descriptor)}.{self.descriptor.name}'
163163

164164
if method_desc.io_type.is_input_stream():
165-
return f', request_iterator: Iterable[{type_hint}]'
165+
return f', request_iterator: typing.Iterable[{type_hint}]'
166166
return f', {self.get_under_name()}: {type_hint}'
167167

168168
def render_forwarded_args(self):
@@ -179,8 +179,8 @@ def render_api_return_args(self, api_file: typing.Optional[pro_desc.FileDescript
179179
if len(type_hint_list) == 1:
180180
return type_hint_list[0]
181181
else:
182-
return f"Tuple[{', '.join(type_hint_list)}]"
183-
return 'NoReturn'
182+
return f"typing.Tuple[{', '.join(type_hint_list)}]"
183+
return 'typing.NoReturn'
184184

185185
def render_api_return_dataclass(self, api_file: typing.Optional[pro_desc.FileDescriptor] = None):
186186
if self.descriptor.file.package == 'google.protobuf':
@@ -280,11 +280,11 @@ def get_py_type_name(self, used_in_file: json_format.descriptor.FileDescriptor =
280280

281281
def get_type_hint(self, used_in_file: json_format.descriptor.FileDescriptor = None) -> str:
282282
if self.is_struct():
283-
return f'Dict[str, Any]'
283+
return f'typing.Dict[str, typing.Any]'
284284
elif self.is_map():
285-
return f'Dict[{self.field_descriptor.key_py_type.name}, {self.get_py_type_name(used_in_file)}]'
285+
return f'typing.Dict[{self.field_descriptor.key_py_type.name}, {self.get_py_type_name(used_in_file)}]'
286286
elif self.is_list():
287-
return f'List[{self.get_py_type_name(used_in_file)}]'
287+
return f'typing.List[{self.get_py_type_name(used_in_file)}]'
288288
elif self.is_empty():
289289
return f'None'
290290
return self.get_py_type_name(used_in_file)

neobuilder/generators/symbols/service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def get_output_name(self):
114114
def get_request_type_hint(self) -> str:
115115
unary = f'{self.input.render_pb2_type_hint(self.service.module)}'
116116
if self.io_type.is_input_stream():
117-
return f'Iterable[{unary}]'
117+
return f'typing.Iterable[{unary}]'
118118
return unary
119119

120120
def get_request_dc_type_hint(self) -> str:
@@ -125,7 +125,7 @@ def get_response_type_hint(self) -> str:
125125

126126
def get_response_dc_type(self) -> str:
127127
if self.io_type.is_output_stream():
128-
return f'Iterable[{self.get_response_dc_class_type()}]'
128+
return f'typing.Iterable[{self.get_response_dc_class_type()}]'
129129
return self.get_response_dc_class_type()
130130

131131
def get_response_dc_class_type(self) -> str:

neobuilder/neobuilder/render/renderer.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,3 @@ def render_file(self, template_name: str, **kwargs) -> str:
4343
except Exception as ex:
4444
log.exception(f'Error in template: {template_name}: {ex!r}')
4545
raise ex
46-
47-
48-
def main():
49-
t = TemplateRenderer()
50-
print(t.render_file('root_init',
51-
version='(3, 1, 0, 0)',
52-
protoplasm_version='(4, 0, 0, 0)'))
53-
54-
55-
if __name__ == '__main__':
56-
main()

tests/res/expected/sandbox/test/alpha_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515

tests/res/expected/sandbox/test/anytest_dc.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515

@@ -23,7 +23,7 @@
2323
class AnyMessage(plasm.DataclassBase):
2424
__proto_cls__ = pb2.AnyMessage
2525
my_any: plasm.DataclassBase = dataclasses.field(default=None, metadata={'dictator': dictators.AnyDictator})
26-
my_any_list: List[plasm.DataclassBase] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.AnyDictator, 'is_list': True})
27-
my_any_map: Dict[str, plasm.DataclassBase] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.AnyDictator, 'is_map': True})
26+
my_any_list: typing.List[plasm.DataclassBase] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.AnyDictator, 'is_list': True})
27+
my_any_map: typing.Dict[str, plasm.DataclassBase] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.AnyDictator, 'is_map': True})
2828

2929

tests/res/expected/sandbox/test/beta_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515
from sandbox.test import alpha_dc as sandbox__test__alpha_dc

tests/res/expected/sandbox/test/clones_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import dataclasses
1212
import datetime
1313
import enum
14-
from typing import *
14+
import typing
1515
from protoplasm.casting import dictators
1616
from protoplasm import plasm
1717

tests/res/expected/sandbox/test/delta_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515
from sandbox.test import beta_dc as sandbox__test__beta_dc

tests/res/expected/sandbox/test/enums_dc.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import dataclasses
1414
import datetime
1515
import enum
16-
from typing import *
16+
import typing
1717
from protoplasm.casting import dictators
1818
from protoplasm import plasm
1919

@@ -64,10 +64,10 @@ class WithExternalEnum(plasm.DataclassBase):
6464
__proto_cls__ = pb2.WithExternalEnum
6565
my_enum: ExternalEnum = dataclasses.field(default=0, metadata={'dictator': dictators.EnumDictator, 'is_enum': True})
6666
my_alias_enum: ExternalAliasEnum = dataclasses.field(default=0, metadata={'dictator': dictators.EnumDictator, 'is_enum': True})
67-
my_enum_list: List[ExternalEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
68-
my_alias_enum_list: List[ExternalAliasEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
69-
my_enum_map: Dict[str, ExternalEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
70-
my_alias_enum_map: Dict[str, ExternalAliasEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
67+
my_enum_list: typing.List[ExternalEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
68+
my_alias_enum_list: typing.List[ExternalAliasEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
69+
my_enum_map: typing.Dict[str, ExternalEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
70+
my_alias_enum_map: typing.Dict[str, ExternalAliasEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
7171

7272

7373
@dataclasses.dataclass
@@ -108,10 +108,10 @@ class InternalAliasEnum(enum.IntEnum):
108108

109109
my_internal_enum: WithInternalEnum.InternalEnum = dataclasses.field(default=0, metadata={'dictator': dictators.EnumDictator, 'is_enum': True})
110110
my_internal_alias_enum: WithInternalEnum.InternalAliasEnum = dataclasses.field(default=0, metadata={'dictator': dictators.EnumDictator, 'is_enum': True})
111-
my_internal_enum_list: List[WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
112-
my_internal_alias_enum_list: List[WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
113-
my_internal_enum_map: Dict[str, WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
114-
my_internal_alias_enum_map: Dict[str, WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
111+
my_internal_enum_list: typing.List[WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
112+
my_internal_alias_enum_list: typing.List[WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
113+
my_internal_enum_map: typing.Dict[str, WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
114+
my_internal_alias_enum_map: typing.Dict[str, WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
115115

116116

117117
@dataclasses.dataclass

tests/res/expected/sandbox/test/googlestruct_dc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515

@@ -22,5 +22,5 @@
2222
@dataclasses.dataclass
2323
class StructMessage(plasm.DataclassBase):
2424
__proto_cls__ = pb2.StructMessage
25-
my_struct: Dict[str, Any] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.StructDictator, 'is_struct': True})
25+
my_struct: typing.Dict[str, typing.Any] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.StructDictator, 'is_struct': True})
2626

tests/res/expected/sandbox/test/illnamedfields_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515

tests/res/expected/sandbox/test/illnamedservice_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'ServiceWithBadRequestNamesInterface',
77
]
88
import datetime
9-
from typing import *
9+
import typing
1010
from protoplasm import plasm
1111

1212
from sandbox.test import illnamedservice_dc as dc

tests/res/expected/sandbox/test/illnamedservice_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import dataclasses
1111
import datetime
1212
import enum
13-
from typing import *
13+
import typing
1414
from protoplasm.casting import dictators
1515
from protoplasm import plasm
1616

tests/res/expected/sandbox/test/illnamedservice_grpc_receiver.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
__all__ = [
66
'ServiceWithBadRequestNamesGrpcServicer',
77
]
8-
from typing import *
8+
import datetime
9+
import typing
910
from protoplasm import plasm
1011
from sandbox.test import illnamedservice_dc as dc
1112
from sandbox.test import illnamedservice_pb2 as pb2
1213
from sandbox.test import illnamedservice_pb2_grpc as pb2_grpc
13-
if TYPE_CHECKING:
14+
if typing.TYPE_CHECKING:
1415
from grpc import ServicerContext
1516
from sandbox.test import illnamedservice_api as api
1617

tests/res/expected/sandbox/test/illnamedservice_grpc_sender.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66
__all__ = [
77
'ServiceWithBadRequestNames',
88
]
9-
from typing import *
9+
import datetime
10+
import typing
1011
from protoplasm import plasm
1112
from sandbox.test import illnamedservice_dc as dc
1213
from sandbox.test import illnamedservice_pb2_grpc as pb2_grpc
1314
from sandbox.test.illnamedservice_api import *
1415

15-
if TYPE_CHECKING:
16+
if typing.TYPE_CHECKING:
1617
from grpc import ChannelCredentials
1718

1819
import logging
1920
log = logging.getLogger(__name__)
2021

2122

2223
class ServiceWithBadRequestNames(plasm.BaseGrpcClientImplementation, ServiceWithBadRequestNamesInterface):
23-
def __init__(self, grpc_host: str = 'localhost:50051', credentials: Optional[Union[bool, 'ChannelCredentials']] = None, options: Optional[Dict] = None, *args, **kwargs):
24+
def __init__(self, grpc_host: str = 'localhost:50051', credentials: typing.Optional[typing.Union[bool, 'ChannelCredentials']] = None, options: typing.Optional[typing.Dict] = None, *args, **kwargs):
2425
super().__init__(pb2_grpc.ServiceWithBadRequestNamesStub, grpc_host, credentials, options, *args, **kwargs)
2526

2627
def do_something(self, foo: str = None) -> str:

tests/res/expected/sandbox/test/imported_enum_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515
from sandbox.test import enums_dc as sandbox__test__enums_dc

tests/res/expected/sandbox/test/interfaceonly_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'InterfaceOnlyServiceInterface',
77
]
88
import datetime
9-
from typing import *
9+
import typing
1010
from protoplasm import plasm
1111

1212
from sandbox.test import interfaceonly_dc as dc

tests/res/expected/sandbox/test/interfaceonly_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import dataclasses
1111
import datetime
1212
import enum
13-
from typing import *
13+
import typing
1414
from protoplasm.casting import dictators
1515
from protoplasm import plasm
1616

tests/res/expected/sandbox/test/nested_dc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import datetime
1111
import enum
12-
from typing import *
12+
import typing
1313
from protoplasm.casting import dictators
1414
from protoplasm import plasm
1515

0 commit comments

Comments
 (0)