Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# Define a class for each struct
class_def = 'class {}(object):'.format(fmt_class(data_type.name))
self.emit(class_def)
with self.indent():
if data_type.doc:
self.emit('"""')
self.emit_wrapped_text(data_type.doc)
self.emit('"""')
self.emit()
# Define constructor to take each field
args = ['self']
for field in data_type.fields:
args.append(fmt_var(field.name))
self.generate_multiline_list(args, 'def __init__', ':')
with self.indent():
if data_type.fields:
self.emit()
# Body of init should assign all init vars
for field in data_type.fields:
if field.doc:
self.emit_wrapped_text(field.doc, '# ', '# ')
member_name = fmt_var(field.name)
self.emit('self.{0} = {0}'.format(member_name))
else:
self.emit('pass')
self.emit()
The _process_custom_annotations function allows client code to access
custom annotations defined in the spec.
"""
self.emit('def _process_custom_annotations(self, annotation_type, field_path, processor):')
with self.indent(), emit_pass_if_nothing_emitted(self):
self.emit(
(
'super({}, self)._process_custom_annotations(annotation_type, field_path, '
'processor)'
).format(class_name_for_data_type(data_type))
)
self.emit()
for field in data_type.fields:
field_name = fmt_var(field.name, check_reserved=True)
for annotation_type, processor in self._generate_custom_annotation_processors(
ns, field.data_type, field.custom_annotations):
annotation_class = class_name_for_annotation_type(annotation_type, ns)
self.emit('if annotation_type is {}:'.format(annotation_class))
with self.indent():
self.emit('self.{} = {}'.format(
field_name,
generate_func_call(
processor,
args=[
"'{{}}.{}'.format(field_path)".format(field_name),
'self.{}'.format(field_name),
])
))
self.emit()
with self.indent():
lineno = self.lineno
# Call the parent constructor if a super type exists
if data_type.parent_type:
class_name = class_name_for_data_type(data_type)
all_parent_fields = [fmt_func(f.name, check_reserved=True)
for f in data_type.parent_type.all_fields]
self.generate_multiline_list(
all_parent_fields,
before='super({}, self).__init__'.format(class_name))
# initialize each field
for field in data_type.fields:
field_var_name = fmt_var(field.name)
self.emit('self._{}_value = None'.format(field_var_name))
self.emit('self._{}_present = False'.format(field_var_name))
# handle arguments that were set
for field in data_type.fields:
field_var_name = fmt_var(field.name, True)
self.emit('if {} is not None:'.format(field_var_name))
with self.indent():
self.emit('self.{0} = {0}'.format(field_var_name))
if lineno == self.lineno:
self.emit('pass')
self.emit()
def _generate_struct_class_slots(self, data_type):
"""Creates a slots declaration for struct classes.
Slots are an optimization in Python. They reduce the memory footprint
of instances since attributes cannot be added after declaration.
"""
with self.block('__slots__ =', delim=('[', ']')):
for field in data_type.fields:
field_name = fmt_var(field.name)
self.emit("'_%s_value'," % field_name)
self.emit("'_%s_present'," % field_name)
self.emit()
class_name = class_name_for_data_type(data_type)
all_parent_fields = [fmt_func(f.name, check_reserved=True)
for f in data_type.parent_type.all_fields]
self.generate_multiline_list(
all_parent_fields,
before='super({}, self).__init__'.format(class_name))
# initialize each field
for field in data_type.fields:
field_var_name = fmt_var(field.name)
self.emit('self._{}_value = None'.format(field_var_name))
self.emit('self._{}_present = False'.format(field_var_name))
# handle arguments that were set
for field in data_type.fields:
field_var_name = fmt_var(field.name, True)
self.emit('if {} is not None:'.format(field_var_name))
with self.indent():
self.emit('self.{0} = {0}'.format(field_var_name))
if lineno == self.lineno:
self.emit('pass')
self.emit()
def _generate_union_class_reflection_attributes(self, ns, data_type):
"""
Adds a class attribute for each union member assigned to a validator.
Also adds an attribute that is a map from tag names to validators.
"""
class_name = fmt_class(data_type.name)
for field in data_type.fields:
field_name = fmt_var(field.name)
validator_name = generate_validator_constructor(
ns, field.data_type)
full_validator_name = '{}._{}_validator'.format(class_name, field_name)
self.emit('{} = {}'.format(full_validator_name, validator_name))
if field.redactor:
self._generate_redactor(full_validator_name, field.redactor)
# generate _all_fields_ for each omitted caller (and public)
child_omitted_callers = data_type.get_all_omitted_callers()
parent_omitted_callers = data_type.parent_type.get_all_omitted_callers() if \
data_type.parent_type else set([])
all_omitted_callers = child_omitted_callers | parent_omitted_callers
if len(all_omitted_callers) != 0:
self.emit('{}._permissioned_tagmaps = {}'.format(class_name, all_omitted_callers))
def _generate_custom_annotation_instance(self, ns, annotation):
"""
Generates code to construct an instance of an annotation type object
with parameters from the specified annotation.
"""
annotation_class = class_name_for_annotation_type(annotation.annotation_type, ns)
return generate_func_call(
annotation_class,
kwargs=((fmt_var(k, True), self._generate_python_value(ns, v))
for k, v in annotation.kwargs.items())
)
def _generate_python_value(self, ns, value):
if is_tag_ref(value):
ref = '{}.{}'.format(class_name_for_data_type(value.union_data_type),
fmt_var(value.tag_name))
if ns != value.union_data_type.namespace:
ref = '{}.{}'.format(fmt_namespace(value.union_data_type.namespace.name), ref)
return ref
else:
return fmt_obj(value)