Skip to content

Commit

Permalink
Finish v0.8.0rc1
Browse files Browse the repository at this point in the history
  • Loading branch information
SillyFreak committed Feb 18, 2019
2 parents 5755659 + d5732c5 commit dc829a0
Show file tree
Hide file tree
Showing 22 changed files with 930 additions and 76 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Expand Up @@ -3,7 +3,7 @@ sudo: false

matrix:
include:
- python: 3.7
- python: '3.7'
dist: xenial # https://github.com/travis-ci/travis-ci/issues/9815
sudo: true

Expand Down
20 changes: 20 additions & 0 deletions gsl_protocol_python/python.yaml
Expand Up @@ -36,6 +36,18 @@ io.DigitalMessage:
subscription:
typ: Subscription

imu.ImuMessage:
kind:
typ: ImuKind
x:
typ: int
y:
typ: int
z:
typ: int
subscription:
typ: Subscription

motor.MotorAction:
port:
typ: int
Expand All @@ -52,6 +64,10 @@ motor.MotorAction:
absolute:
typ: int

motor.MotorConfigAction:
port:
typ: int

motor.MotorCommandMessage:
port:
typ: int
Expand Down Expand Up @@ -128,3 +144,7 @@ process.ProcessExitUpdate:
typ: int
exit_code:
typ: int

speaker.SpeakerAction:
frequency:
typ: int
67 changes: 51 additions & 16 deletions gsl_protocol_python/python_target.py
Expand Up @@ -17,18 +17,30 @@ def generate_module_code(model, mod, root):

@generate(out_file)
def code():
def map_params(messageClass, mandatory, repeated, optional):
def map_params(messageClass, mandatory, repeated, optional, custom=None):
def has(attr_caller):
try:
attr_caller()
except AttributeError:
return False
else:
return True

for param in messageClass.params:
if isinstance(param, MandatoryParam):
if isinstance(param, MandatoryParam) and has(lambda: param.field.python_spec):
yield mandatory(param)
elif isinstance(param, RepeatedParam):
elif isinstance(param, RepeatedParam) and has(lambda: param.field.python_spec):
yield repeated(param)
elif isinstance(param, OptionalParam):
elif isinstance(param, OptionalParam) and has(lambda: [field.python_spec for field in param.fields]):
for i in range(len(param.options)):
yield optional(param, i)
elif custom:
yield custom(param)
else:
raise RuntimeError(f"Unexpected custom parameter: {param}")

def map_params_code(messageClass, mandatory, repeated, optional):
for generator in map_params(messageClass, mandatory, repeated, optional):
def map_params_code(messageClass, mandatory, repeated, optional, custom=None):
for generator in map_params(messageClass, mandatory, repeated, optional, custom):
yield from generator

def field_names(messageClass):
Expand All @@ -37,6 +49,7 @@ def field_names(messageClass):
mandatory=lambda param: param.name,
repeated=lambda param: param.name,
optional=lambda param, i: param.options[i],
custom=lambda param: param.name,
)

def message_class_code(messageClass):
Expand Down Expand Up @@ -66,7 +79,10 @@ def optional(param, i):
python = param.fields[i].python_spec
yield field_str(param.options[i], python.typ, python.default, optional=True)

yield from map_params_code(messageClass, mandatory, repeated, optional)
def custom(param):
yield field_str(param.name, 'Any')

yield from map_params_code(messageClass, mandatory, repeated, optional, custom)

def message_init_code():
# only generate an __init__ method if the dataclass __init__ is not enough
Expand Down Expand Up @@ -96,8 +112,11 @@ def optional(param, i):
python = param.fields[i].python_spec
return param_str(param.options[i], python.typ, python.default, optional=True)

def custom(param):
return param.name

yield "self"
yield from map_params(messageClass, mandatory, repeated, optional)
yield from map_params(messageClass, mandatory, repeated, optional, custom)

yield from lines(f"""\
Expand All @@ -117,6 +136,7 @@ def init_param_strs():
mandatory=lambda param: param.name,
repeated=lambda param: f"*{param.name}",
optional=lambda param, i: f"{param.options[i]}={param.options[i]}",
custom=lambda param: param.name,
)

yield from lines(f"""\
Expand All @@ -134,6 +154,11 @@ def _parse(cls, msg: {proto.name}_pb2.{message.name}) -> '{messageClass.name}':"
{param.options[i]} = msg.{param.options[i]}""")
if len(param.options) == 1 else lines(f"""\
{param.options[i]} = msg.{param.options[i]} if msg.HasField('{param.options[i]}') else None"""),
custom=lambda param: lines(f"""\
# <default GSL customizable: {messageClass.name}-parse-{param.name}>
# TODO parse custom field '{param.name}'
{param.name} = msg.{param.name}
# </GSL customizable: {messageClass.name}-parse-{param.name}>"""),
)

yield from lines(f"""\
Expand All @@ -152,18 +177,27 @@ def assignment_str(name, nested=False, repeated=False):
else:
return f"msg.{name} = self.{name}"

yield from map_params_code(
messageClass,
mandatory=lambda param: lines(f"""\
if not messageClass.params:
yield from lines(f"""\
pass""")
else:
yield from map_params_code(
messageClass,
mandatory=lambda param: lines(f"""\
{assignment_str(param.name, nested=param.field.nested)}"""),
repeated=lambda param: lines(f"""\
repeated=lambda param: lines(f"""\
{assignment_str(param.name, nested=param.field.nested, repeated=True)}"""),
optional=lambda param, i: lines(f"""\
optional=lambda param, i: lines(f"""\
{assignment_str(param.options[i], nested=param.fields[i].nested)}""")
if len(param.options) == 1 else lines(f"""\
if len(param.options) == 1 else lines(f"""\
if self.{param.options[i]} is not None:
{assignment_str(param.options[i], nested=param.fields[i].nested)}"""),
)
custom=lambda param: lines(f"""\
# <default GSL customizable: {messageClass.name}-serialize-{param.name}>
# TODO serialize custom field '{param.name}'
{assignment_str(param.name)}
# </GSL customizable: {messageClass.name}-serialize-{param.name}>"""),
)

request = messageClass.direction == "=>"
is_async = messageClass.direction == "<-"
Expand Down Expand Up @@ -212,6 +246,7 @@ def init_param_strs(messageClass):
mandatory=lambda param: param.name,
repeated=lambda param: f"*{param.name}",
optional=lambda param, i: f"{param.options[i]}={param.options[i]}",
custom=lambda param: param.name,
)

messageClasses = message.requestClasses if request else message.replyClasses
Expand Down Expand Up @@ -255,7 +290,7 @@ def {method_name}(msg: {proto.name}_pb2.{message.name}) \
# </GSL customizable: {method_name}-return>""")

yield from lines(f"""\
from typing import Sequence, Union
from typing import Any, Sequence, Union
from dataclasses import dataclass
from {'.' * (len(mod.path) + 1)} import RequestMsg, ReplyMsg, Message, SimpleMessage""")
Expand Down
2 changes: 1 addition & 1 deletion hedgehog/protocol/messages/ack.py
@@ -1,4 +1,4 @@
from typing import Sequence, Union
from typing import Any, Sequence, Union
from dataclasses import dataclass

from . import RequestMsg, ReplyMsg, Message, SimpleMessage
Expand Down
2 changes: 1 addition & 1 deletion hedgehog/protocol/messages/analog.py
@@ -1,4 +1,4 @@
from typing import Sequence, Union
from typing import Any, Sequence, Union
from dataclasses import dataclass

from . import RequestMsg, ReplyMsg, Message, SimpleMessage
Expand Down
2 changes: 1 addition & 1 deletion hedgehog/protocol/messages/digital.py
@@ -1,4 +1,4 @@
from typing import Sequence, Union
from typing import Any, Sequence, Union
from dataclasses import dataclass

from . import RequestMsg, ReplyMsg, Message, SimpleMessage
Expand Down

0 comments on commit dc829a0

Please sign in to comment.