def _test_accessors(self, obj): names = list(get_domain_class_attribute_names(obj)) self.assert_equal(list(names), ['id', 'parent', 'children', 'text', 'text_ent', 'number', 'date_time', 'parent.text_ent']) self.assert_equal(list(get_domain_class_attributes(obj).keys()), names) term_attr_name = 'number' term_attr = get_domain_class_attribute(obj, term_attr_name) self.assert_equal(term_attr.entity_attr, term_attr_name) self.assert_true( is_domain_class_terminal_attribute(obj, term_attr_name)) ent_attr_name = 'parent' ent_attr = get_domain_class_attribute(obj, ent_attr_name) self.assert_equal(ent_attr.entity_attr, ent_attr_name) self.assert_true( is_domain_class_member_attribute(obj, ent_attr_name)) self.assert_true( is_domain_class_domain_attribute(obj, ent_attr_name)) agg_attr_name = 'children' agg_attr = get_domain_class_attribute(obj, agg_attr_name) self.assert_equal(agg_attr.entity_attr, agg_attr_name) self.assert_true( is_domain_class_collection_attribute(obj, agg_attr_name)) self.assert_true( is_domain_class_domain_attribute(obj, agg_attr_name)) for attr in get_domain_class_terminal_attribute_iterator(obj): self.assert_equal(attr.kind, RESOURCE_ATTRIBUTE_KINDS.TERMINAL) for attr in get_domain_class_member_attribute_iterator(obj): self.assert_equal(attr.kind, RESOURCE_ATTRIBUTE_KINDS.MEMBER) for attr in get_domain_class_collection_attribute_iterator(obj): self.assert_equal(attr.kind, RESOURCE_ATTRIBUTE_KINDS.COLLECTION) for attr in get_domain_class_relationship_attribute_iterator(obj): self.assert_true(attr.kind in (RESOURCE_ATTRIBUTE_KINDS.MEMBER, RESOURCE_ATTRIBUTE_KINDS.COLLECTION))
def inspect(entity_class, attribute_name): attr_tokens = attribute_name.split('.') infos = [] for idx, attr_token in enumerate(attr_tokens): do_append = True try: attr = get_domain_class_attributes(entity_class)[attr_token] except KeyError: if attr_token != 'slug': # If we encounter a non-resource attribute, we assume # an embedded document (which implies that the last # token was a terminal). infos[-1][-1] = \ '.'.join([infos[-1][-1]] + attr_tokens[idx:]) # Unfortunately, we can not infer the type of embedded # attributes. infos[-1][1] = None do_append = False else: # The 'slug' attribute is special as it is not a properly # declared resource attribute but needs to be queryable. attr_kind = RESOURCE_ATTRIBUTE_KINDS.TERMINAL attr_type = str else: attr_kind = attr.kind if attr_kind != RESOURCE_ATTRIBUTE_KINDS.TERMINAL: entity_class = get_entity_class(attr.attr_type) attr_type = entity_class else: attr_type = attr.attr_type if do_append: infos.append([attr_kind, attr_type, attr_token]) return infos