def parse_resource( name: str, resource: Boto3ServiceResource, service_name: ServiceName, shape_parser: ShapeParser, ) -> Resource: """ Parse boto3 sub Resource data. Arguments: resource -- Original boto3 resource. Returns: Resource structure. """ result = Resource( name=name, service_name=service_name, ) shape_method_map = shape_parser.get_resource_method_map(name) public_methods = get_resource_public_methods(resource.__class__) for method_name, public_method in public_methods.items(): if method_name in shape_method_map: method = shape_method_map[method_name] else: method = parse_method(name, method_name, public_method, service_name) docstring = get_short_docstring(inspect.getdoc(public_method) or "") method.docstring = "".join(( f"{docstring}\n\n" if docstring else "", "[Show boto3 documentation]", f"({service_name.get_boto3_doc_link(name, method_name)})\n", "[Show boto3-stubs documentation]", f"({service_name.get_doc_link('service_resource', name, f'{method_name} method')})", )) result.methods.append(method) result.attributes.extend(parse_attributes(service_name, name, resource)) result.attributes.extend(parse_identifiers(resource)) result.attributes.extend(parse_references(resource)) collections = parse_collections(name, resource, service_name, shape_parser) for collection in collections: result.collections.append(collection) result.attributes.append( Attribute( collection.attribute_name, InternalImport(collection.name, service_name, stringify=False), )) return result
def parse_resource( name: str, resource: Boto3ServiceResource, service_name: ServiceName, shape_parser: ShapeParser, ) -> Resource: """ Parse boto3 sub Resource data. Arguments: resource -- Original boto3 resource. Returns: Resource structure. """ result = Resource( name=name, service_name=service_name, ) shape_method_map = shape_parser.get_resource_method_map(name) public_methods = get_resource_public_methods(resource.__class__) for method_name, public_method in public_methods.items(): if method_name in shape_method_map: method = shape_method_map[method_name] else: method = parse_method(name, method_name, public_method, service_name) docstring = get_short_docstring(inspect.getdoc(public_method) or "") method.docstring = docstring result.methods.append(method) attributes = parse_attributes(service_name, name, resource, shape_parser) result.attributes.extend(attributes) identifiers = parse_identifiers(resource) result.attributes.extend(identifiers) references = parse_references(resource) result.attributes.extend(references) collections = parse_collections(name, resource, service_name, shape_parser) for collection in collections: result.collections.append(collection) result.attributes.append( Attribute( collection.attribute_name, InternalImport(collection.name, service_name, stringify=False), )) return result
def parse_resource( name: str, resource: Boto3ServiceResource, service_name: ServiceName, shape_parser: ShapeParser, ) -> Resource: """ Parse boto3 sub Resource data. Arguments: resource -- Original boto3 resource. Returns: Resource structure. """ result = Resource( name=name, docstring=(f"[{name} documentation]" f"({service_name.doc_link}.ServiceResource.{name})"), ) shape_method_map = shape_parser.get_resource_method_map(name) public_methods = get_resource_public_methods(resource.__class__) for method_name, public_method in public_methods.items(): if method_name in shape_method_map: method = shape_method_map[method_name] else: method = parse_method(name, method_name, public_method, service_name) method.docstring = ( f"[{name}.{method_name} documentation]" f"({service_name.doc_link}.{name}.{method_name})" ) result.methods.append(method) result.attributes.extend(parse_attributes(service_name, name, resource)) result.attributes.extend(parse_identifiers(resource)) result.attributes.extend(parse_references(resource)) collections = parse_collections(name, resource, service_name, shape_parser) for collection in collections: result.collections.append(collection) result.attributes.append( Attribute( collection.attribute_name, InternalImport(collection.name, service_name, stringify=False), ) ) return result
def parse_service_resource( session: Session, service_name: ServiceName, shape_parser: ShapeParser) -> Optional[ServiceResource]: """ Parse boto3 ServiceResource data. Arguments: session -- boto3 session. service_name -- Target service name. Returns: ServiceResource structure or None if service does not have a resource. """ service_resource = get_boto3_resource(session, service_name) if service_resource is None: return None logger = get_logger() logger.debug("Parsing ServiceResource") result = ServiceResource( name=f"{service_name.class_name}ServiceResource", service_name=service_name, boto3_service_resource=service_resource, docstring=(f"[{service_name.class_name}.ServiceResource documentation]" f"({service_name.doc_link}.ServiceResource)"), ) public_methods = get_public_methods(service_resource) shape_method_map = shape_parser.get_service_resource_method_map() for method_name, public_method in public_methods.items(): if method_name in shape_method_map: method = shape_method_map[method_name] else: method = parse_method("ServiceResource", method_name, public_method, service_name) method.docstring = ( f"[ServiceResource.{method_name} documentation]" f"({service_name.doc_link}.ServiceResource.{method_name})") result.methods.append(method) logger.debug("Parsing ServiceResource attributes") result.attributes.extend( parse_attributes(service_name, "ServiceResource", service_resource)) result.attributes.extend(parse_identifiers(service_resource)) result.attributes.extend(parse_references(service_resource)) logger.debug("Parsing ServiceResource collections") collections = parse_collections("ServiceResource", service_resource, service_name, shape_parser) for collection in collections: result.collections.append(collection) result.attributes.append( Attribute( collection.attribute_name, InternalImport( collection.name, service_name, stringify=False, ), )) for sub_resource in get_sub_resources(session, service_name, service_resource): sub_resource_name = sub_resource.__class__.__name__.split(".", 1)[-1] logger.debug(f"Parsing {sub_resource_name} sub resource") result.sub_resources.append( parse_resource(sub_resource_name, sub_resource, service_name, shape_parser)) return result