Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_api_namespace(self):
ns = ApiNamespace('files')
a1 = Struct('A1', None, ns)
a1.set_attributes(None, [StructField('f1', Boolean(), None, None)])
a2 = Struct('A2', None, ns)
a2.set_attributes(None, [StructField('f2', Boolean(), None, None)])
l1 = List(a1)
s = String()
route = ApiRoute('test/route', 1, None)
route.set_attributes(None, None, l1, a2, s, None)
ns.add_route(route)
# Test that only user-defined types are returned.
route_io = ns.get_route_io_data_types()
self.assertIn(a1, route_io)
self.assertIn(a2, route_io)
self.assertNotIn(l1, route_io)
self.assertNotIn(s, route_io)
def test_api_namespace(self):
ns = ApiNamespace('files')
a1 = Struct('A1', None, ns)
a1.set_attributes(None, [StructField('f1', Boolean(), None, None)])
a2 = Struct('A2', None, ns)
a2.set_attributes(None, [StructField('f2', Boolean(), None, None)])
l1 = List(a1)
s = String()
route = ApiRoute('test/route', 1, None)
route.set_attributes(None, None, l1, a2, s, None)
ns.add_route(route)
# Test that only user-defined types are returned.
route_io = ns.get_route_io_data_types()
self.assertIn(a1, route_io)
self.assertIn(a2, route_io)
self.assertNotIn(l1, route_io)
self.assertNotIn(s, route_io)
def test_struct_with_custom_annotations(self):
# type: () -> None
ns = ApiNamespace('files')
annotation_type = AnnotationType('MyAnnotationType', ns, None, [
AnnotationTypeParam('test_param', Int32(), None, False, None, None)
])
ns.add_annotation_type(annotation_type)
annotation = CustomAnnotation('MyAnnotation', ns, None, 'MyAnnotationType',
None, [], {'test_param': 42})
annotation.set_attributes(annotation_type)
ns.add_annotation(annotation)
struct = Struct('MyStruct', ns, None)
struct.set_attributes(None, [
StructField('annotated_field', Int32(), None, None),
StructField('unannotated_field', Int32(), None, None),
])
struct.fields[0].set_annotations([annotation])
result = self._evaluate_struct(ns, struct)
expected = textwrap.dedent('''\
class MyStruct(bb.Struct):
__slots__ = [
'_annotated_field_value',
'_annotated_field_present',
'_unannotated_field_value',
'_unannotated_field_present',
'quota': AstExampleField(
None,
None,
None,
'quota',
None)}))
self.assertEqual(
"Bad example for field 'quota': null is not a valid integer",
cm.exception.msg)
self.assertTrue(quota_info._has_example('default'))
quota_info.nullable = True
# test for structs within structs
account_info = Struct(
'AccountInfo',
None,
ns,
)
account_info.set_attributes(
"Information about an account.",
[
StructField('account_id', String(), 'Unique identifier for account.', None),
StructField('quota_info', quota_info, 'Quota', None)
],
)
account_info._add_example(
AstExample(
path=None,
lineno=None,
def _make_namespace_with_alias():
# type: (...) -> ApiNamespace
ns = ApiNamespace('ns_with_alias')
struct1 = Struct(name='Struct1', namespace=ns, ast_node=None)
struct1.set_attributes(None, [StructField('f1', Boolean(), None, None)])
ns.add_data_type(struct1)
alias = Alias(name='AliasToStruct1', namespace=ns, ast_node=None)
alias.set_attributes(doc=None, data_type=struct1)
ns.add_alias(alias)
str_type = String(min_length=3)
str_alias = Alias(name='NotUserDefinedAlias', namespace=ns, ast_node=None)
str_alias.set_attributes(doc=None, data_type=str_type)
ns.add_alias(str_alias)
return ns
def _make_namespace_with_many_structs():
# type: (...) -> ApiNamespace
ns = ApiNamespace('ns_with_many_structs')
struct1 = Struct(name='Struct1', namespace=ns, ast_node=None)
struct1.set_attributes(None, [StructField('f1', Boolean(), None, None)])
ns.add_data_type(struct1)
struct2 = Struct(name='Struct2', namespace=ns, ast_node=None)
struct2.set_attributes(
doc=None,
fields=[
StructField('f2', List(UInt64()), None, None),
StructField('f3', Timestamp(ISO_8601_FORMAT), None, None),
StructField('f4', Map(String(), UInt64()), None, None)
]
)
ns.add_data_type(struct2)
return ns
def _make_namespace_with_many_structs():
# type: (...) -> ApiNamespace
ns = ApiNamespace('ns_with_many_structs')
struct1 = Struct(name='Struct1', namespace=ns, ast_node=None)
struct1.set_attributes(None, [StructField('f1', Boolean(), None, None)])
ns.add_data_type(struct1)
struct2 = Struct(name='Struct2', namespace=ns, ast_node=None)
struct2.set_attributes(
doc=None,
fields=[
StructField('f2', List(UInt64()), None, None),
StructField('f3', Timestamp(ISO_8601_FORMAT), None, None),
StructField('f4', Map(String(), UInt64()), None, None)
]
)
ns.add_data_type(struct2)
return ns
if namespace.doc is not None:
self.emit('"""')
self.emit_raw(namespace.doc)
self.emit('"""')
self.emit()
self.emit_raw(validators_import)
# Generate import statements for all referenced namespaces.
self._generate_imports_for_referenced_namespaces(namespace)
for annotation_type in namespace.annotation_types:
self._generate_annotation_type_class(namespace, annotation_type)
for data_type in namespace.linearize_data_types():
if isinstance(data_type, Struct):
self._generate_struct_class(namespace, data_type)
elif isinstance(data_type, Union):
self._generate_union_class(namespace, data_type)
else:
raise TypeError('Cannot handle type %r' % type(data_type))
for alias in namespace.linearize_aliases():
self._generate_alias_definition(namespace, alias)
# Generate the struct->subtype tag mapping at the end so that
# references to later-defined subtypes don't cause errors.
for data_type in namespace.linearize_data_types():
if is_struct_type(data_type):
self._generate_struct_class_reflection_attributes(
namespace, data_type)
if data_type.has_enumerated_subtypes():
elif tag == 'type':
if '.' in val:
# Handle reference to type in imported namespace.
namespace_name, val = val.split('.', 1)
if namespace_name not in env:
raise InvalidSpec(
"Unknown doc reference to namespace '%s'." %
namespace_name, *loc)
env_to_check = env[namespace_name]
else:
env_to_check = env
if val not in env_to_check:
raise InvalidSpec(
"Unknown doc reference to type '%s'." % val,
*loc)
elif not isinstance(env_to_check[val], (Struct, Union)):
raise InvalidSpec(
'Doc reference to type %s is not a struct or union.' %
quote(val), *loc)
elif tag == 'val':
if not doc_ref_val_re.match(val):
raise InvalidSpec(
'Bad doc reference value %s.' % quote(val),
*loc)
else:
raise InvalidSpec(
'Unknown doc reference tag %s.' % quote(tag),
*loc)
def _create_type(self, env, item):
"""Create a forward reference for a union or struct."""
if item.name in env:
existing_dt = env[item.name]
raise InvalidSpec(
'Symbol %s already defined (%s:%d).' %
(quote(item.name), existing_dt._ast_node.path,
existing_dt._ast_node.lineno), item.lineno, item.path)
namespace = self.api.ensure_namespace(env.namespace_name)
if isinstance(item, AstStructDef):
try:
api_type = Struct(name=item.name, namespace=namespace,
ast_node=item)
except ParameterError as e:
raise InvalidSpec(
'Bad declaration of %s: %s' % (quote(item.name), e.args[0]),
item.lineno, item.path)
elif isinstance(item, AstUnionDef):
api_type = Union(
name=item.name, namespace=namespace, ast_node=item,
closed=item.closed)
else:
raise AssertionError('Unknown type definition %r' % type(item))
env[item.name] = api_type
return api_type