Skip to content

Commit

Permalink
Version 5.2.1 - Implicit Import Fox
Browse files Browse the repository at this point in the history
### 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
  • Loading branch information
CCP-Zeulix committed Sep 24, 2024
1 parent 772f648 commit f260142
Show file tree
Hide file tree
Showing 47 changed files with 280 additions and 264 deletions.
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [5.2.1] - 2024-09-24

### 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


## [5.2.0] - 2024-09-23

### Added
Expand Down
2 changes: 1 addition & 1 deletion neobuilder/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = '5.2.0'
__version__ = '5.2.1'

__author__ = 'Thordur Matthiasson <[email protected]>'
__license__ = 'MIT License'
Expand Down
2 changes: 1 addition & 1 deletion neobuilder/data/templates/dataclass_module.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ __all__ = [
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm
{{ imports }}
Expand Down
5 changes: 3 additions & 2 deletions neobuilder/data/templates/grpc_receiver.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ __all__ = [
'{{ a }}',
{% endfor %}
]
from typing import *
import datetime
import typing
from protoplasm import plasm
{{ imports }}
if TYPE_CHECKING:
if typing.TYPE_CHECKING:
from grpc import ServicerContext
{{ api_import }}

Expand Down
5 changes: 3 additions & 2 deletions neobuilder/data/templates/grpc_sender.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ __all__ = [
'{{ a }}',
{% endfor %}
]
from typing import *
import datetime
import typing
from protoplasm import plasm
{{ imports }}
if TYPE_CHECKING:
if typing.TYPE_CHECKING:
from grpc import ChannelCredentials

import logging
Expand Down
2 changes: 1 addition & 1 deletion neobuilder/data/templates/interface.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ __all__ = [
{% endfor %}
]
import datetime
from typing import *
import typing
from protoplasm import plasm

{% for import_line in import_lines %}
Expand Down
2 changes: 1 addition & 1 deletion neobuilder/descwrap/_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class FieldKind(enum.IntFlag):
FIELD_ENUM_MAP = DATA_ENUM | KIND_MAP

def __repr__(self) -> str:
return self.name
return self.name or str(self.value)


@dataclasses.dataclass
Expand Down
2 changes: 1 addition & 1 deletion neobuilder/generators/servicebuilders/grpc_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def render(self) -> str:
i = self.base_indent
return (
f'{i}class {self.service.service_descriptor.name}(plasm.BaseGrpcClientImplementation, {self.service.service_descriptor.name}Interface):\n'
f'{i}{__}def __init__(self, grpc_host: str = \'localhost:50051\', credentials: Optional[Union[bool, \'ChannelCredentials\']] = None, options: Optional[Dict] = None, *args, **kwargs):\n'
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'
f'{i}{__}{__}super().__init__(pb2_grpc.{self.service.service_descriptor.name}Stub, grpc_host, credentials, options, *args, **kwargs)\n'
f'\n'
f'{self.render_methods()}'
Expand Down
14 changes: 7 additions & 7 deletions neobuilder/generators/symbols/dataclass.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def get_imports(self):

def output_google_type_proxy(self):
return {
'Empty': 'NoReturn'
'Empty': 'typing.NoReturn'
}.get(
self.get_class_name()
)
Expand Down Expand Up @@ -162,7 +162,7 @@ def render_api_request_arg(self, method_desc: MethodDescriptorWrapper):
type_hint = f'{self.self_import.get_import_name(method_desc.file_descriptor)}.{self.descriptor.name}'

if method_desc.io_type.is_input_stream():
return f', request_iterator: Iterable[{type_hint}]'
return f', request_iterator: typing.Iterable[{type_hint}]'
return f', {self.get_under_name()}: {type_hint}'

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

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

def get_type_hint(self, used_in_file: json_format.descriptor.FileDescriptor = None) -> str:
if self.is_struct():
return f'Dict[str, Any]'
return f'typing.Dict[str, typing.Any]'
elif self.is_map():
return f'Dict[{self.field_descriptor.key_py_type.name}, {self.get_py_type_name(used_in_file)}]'
return f'typing.Dict[{self.field_descriptor.key_py_type.name}, {self.get_py_type_name(used_in_file)}]'
elif self.is_list():
return f'List[{self.get_py_type_name(used_in_file)}]'
return f'typing.List[{self.get_py_type_name(used_in_file)}]'
elif self.is_empty():
return f'None'
return self.get_py_type_name(used_in_file)
Expand Down
4 changes: 2 additions & 2 deletions neobuilder/generators/symbols/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ def get_output_name(self):
def get_request_type_hint(self) -> str:
unary = f'{self.input.render_pb2_type_hint(self.service.module)}'
if self.io_type.is_input_stream():
return f'Iterable[{unary}]'
return f'typing.Iterable[{unary}]'
return unary

def get_request_dc_type_hint(self) -> str:
Expand All @@ -125,7 +125,7 @@ def get_response_type_hint(self) -> str:

def get_response_dc_type(self) -> str:
if self.io_type.is_output_stream():
return f'Iterable[{self.get_response_dc_class_type()}]'
return f'typing.Iterable[{self.get_response_dc_class_type()}]'
return self.get_response_dc_class_type()

def get_response_dc_class_type(self) -> str:
Expand Down
11 changes: 0 additions & 11 deletions neobuilder/neobuilder/render/renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,3 @@ def render_file(self, template_name: str, **kwargs) -> str:
except Exception as ex:
log.exception(f'Error in template: {template_name}: {ex!r}')
raise ex


def main():
t = TemplateRenderer()
print(t.render_file('root_init',
version='(3, 1, 0, 0)',
protoplasm_version='(4, 0, 0, 0)'))


if __name__ == '__main__':
main()
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/alpha_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

Expand Down
6 changes: 3 additions & 3 deletions tests/res/expected/sandbox/test/anytest_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

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


2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/beta_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm
from sandbox.test import alpha_dc as sandbox__test__alpha_dc
Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/clones_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/delta_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm
from sandbox.test import beta_dc as sandbox__test__beta_dc
Expand Down
18 changes: 9 additions & 9 deletions tests/res/expected/sandbox/test/enums_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

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


@dataclasses.dataclass
Expand Down Expand Up @@ -108,10 +108,10 @@ class InternalAliasEnum(enum.IntEnum):

my_internal_enum: WithInternalEnum.InternalEnum = dataclasses.field(default=0, metadata={'dictator': dictators.EnumDictator, 'is_enum': True})
my_internal_alias_enum: WithInternalEnum.InternalAliasEnum = dataclasses.field(default=0, metadata={'dictator': dictators.EnumDictator, 'is_enum': True})
my_internal_enum_list: List[WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
my_internal_alias_enum_list: List[WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
my_internal_enum_map: Dict[str, WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
my_internal_alias_enum_map: Dict[str, WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
my_internal_enum_list: typing.List[WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
my_internal_alias_enum_list: typing.List[WithInternalEnum.InternalAliasEnum] = dataclasses.field(default_factory=list, metadata={'dictator': dictators.EnumDictator, 'is_list': True, 'is_enum': True})
my_internal_enum_map: typing.Dict[str, WithInternalEnum.InternalEnum] = dataclasses.field(default_factory=dict, metadata={'dictator': dictators.EnumDictator, 'is_map': True, 'is_enum': True})
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})


@dataclasses.dataclass
Expand Down
4 changes: 2 additions & 2 deletions tests/res/expected/sandbox/test/googlestruct_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

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

2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/illnamedfields_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/illnamedservice_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
'ServiceWithBadRequestNamesInterface',
]
import datetime
from typing import *
import typing
from protoplasm import plasm

from sandbox.test import illnamedservice_dc as dc
Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/illnamedservice_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
__all__ = [
'ServiceWithBadRequestNamesGrpcServicer',
]
from typing import *
import datetime
import typing
from protoplasm import plasm
from sandbox.test import illnamedservice_dc as dc
from sandbox.test import illnamedservice_pb2 as pb2
from sandbox.test import illnamedservice_pb2_grpc as pb2_grpc
if TYPE_CHECKING:
if typing.TYPE_CHECKING:
from grpc import ServicerContext
from sandbox.test import illnamedservice_api as api

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,22 @@
__all__ = [
'ServiceWithBadRequestNames',
]
from typing import *
import datetime
import typing
from protoplasm import plasm
from sandbox.test import illnamedservice_dc as dc
from sandbox.test import illnamedservice_pb2_grpc as pb2_grpc
from sandbox.test.illnamedservice_api import *

if TYPE_CHECKING:
if typing.TYPE_CHECKING:
from grpc import ChannelCredentials

import logging
log = logging.getLogger(__name__)


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

def do_something(self, foo: str = None) -> str:
Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/imported_enum_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm
from sandbox.test import enums_dc as sandbox__test__enums_dc
Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/interfaceonly_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
'InterfaceOnlyServiceInterface',
]
import datetime
from typing import *
import typing
from protoplasm import plasm

from sandbox.test import interfaceonly_dc as dc
Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/interfaceonly_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

Expand Down
2 changes: 1 addition & 1 deletion tests/res/expected/sandbox/test/nested_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import dataclasses
import datetime
import enum
from typing import *
import typing
from protoplasm.casting import dictators
from protoplasm import plasm

Expand Down
Loading

0 comments on commit f260142

Please sign in to comment.