# Copyright 2014 - Mirantis, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import inspect import json def get_public_fields(obj): """Returns only public fields from object or class.""" public_attributes = [attr for attr in dir(obj) if not attr.startswith("_")] public_fields = {} for attribute_str in public_attributes: attr = getattr(obj, attribute_str) is_field = not (inspect.isbuiltin(attr) or inspect.isfunction(attr) or inspect.ismethod(attr)) if is_field: public_fields[attribute_str] = attr return public_fields def get_docstring(obj): return inspect.getdoc(obj) def get_arg_list(func): argspec = inspect.getargspec(func) args = argspec.args if 'self' in args: args.remove('self') return args def get_arg_list_as_str(func): args = getattr(func, "__arguments__", None) if args: return args argspec = inspect.getargspec(func) defs = list(argspec.defaults or []) args = get_arg_list(func) diff_args_defs = len(args) - len(defs) arg_str_list = [] for index, default in enumerate(args): if index >= diff_args_defs: try: arg_str_list.append( "%s=%s" % ( args[index], json.dumps(defs[index - diff_args_defs]) ) ) except TypeError: pass else: arg_str_list.append("%s" % args[index]) if argspec.keywords: arg_str_list.append("**%s" % argspec.keywords) return ", ".join(arg_str_list)