131 lines
2.8 KiB
Python
131 lines
2.8 KiB
Python
import importlib
|
|
import inspect
|
|
import pkgutil
|
|
import sys
|
|
|
|
|
|
def sysarg_to_string(argv):
|
|
"""
|
|
Transform a list of strings into a single string
|
|
Add quotes if needed
|
|
:return:
|
|
"""
|
|
if argv is None or not argv:
|
|
return ""
|
|
|
|
result = ""
|
|
first = True
|
|
for s in argv:
|
|
if not first:
|
|
result += " "
|
|
|
|
result += '"' + s + '"' if " " in s else s
|
|
first = False
|
|
|
|
if result[0] in ('"', "'"):
|
|
result = result[1:-1] # strip quotes
|
|
return result
|
|
|
|
|
|
def get_class(qname):
|
|
"""
|
|
Loads a class from its full qualified name
|
|
:param qname:
|
|
:return:
|
|
"""
|
|
parts = qname.split('.')
|
|
module = ".".join(parts[:-1])
|
|
m = __import__(module)
|
|
for comp in parts[1:]:
|
|
m = getattr(m, comp)
|
|
return m
|
|
|
|
|
|
def get_module(qname):
|
|
"""
|
|
Loads a module from its full qualified name
|
|
:param qname:
|
|
:return:
|
|
"""
|
|
parts = qname.split('.')
|
|
m = __import__(qname)
|
|
for comp in parts[1:]:
|
|
m = getattr(m, comp)
|
|
return m
|
|
|
|
|
|
def new_object(kls, *args, **kwargs):
|
|
"""
|
|
New instance of an object
|
|
:param kls:
|
|
:param args:
|
|
:param kwargs:
|
|
:return:
|
|
"""
|
|
obj_type = get_class(kls)
|
|
return obj_type(*args, **kwargs)
|
|
|
|
|
|
def get_full_qualified_name(obj):
|
|
"""
|
|
Returns the full qualified name of a class (including its module name )
|
|
:param obj:
|
|
:return:
|
|
"""
|
|
module = obj.__class__.__module__
|
|
if module is None or module == str.__class__.__module__:
|
|
return obj.__class__.__name__ # Avoid reporting __builtin__
|
|
else:
|
|
return module + '.' + obj.__class__.__name__
|
|
|
|
|
|
def get_classes(module_name):
|
|
"""
|
|
Gets all classes, for a given module_name
|
|
:param module_name: name of the module
|
|
:return:
|
|
"""
|
|
mod = get_module(module_name)
|
|
for name in dir(mod):
|
|
obj = getattr(mod, name)
|
|
if inspect.isclass(obj):
|
|
yield obj
|
|
|
|
|
|
def get_classes_from_package(package_name):
|
|
"""
|
|
Gets all classes, for a given package
|
|
:param package_name: name of the package
|
|
:return:
|
|
"""
|
|
pkg = __import__(package_name)
|
|
prefix = pkg.__name__ + "."
|
|
for importer, modname, ispkg in pkgutil.iter_modules(pkg.__path__, prefix):
|
|
for c in get_classes(modname):
|
|
yield c
|
|
|
|
|
|
def get_sub_classes(package_name, base_class_name):
|
|
|
|
pkg = __import__(package_name)
|
|
prefix = pkg.__name__ + "."
|
|
for (module_loader, name, ispkg) in pkgutil.iter_modules(pkg.__path__, prefix):
|
|
importlib.import_module(name)
|
|
|
|
base_class = get_class(base_class_name)
|
|
return base_class.__subclasses__()
|
|
|
|
|
|
def remove_from_list(lst, to_remove):
|
|
"""
|
|
Removes elements from a list if they exist
|
|
:param lst:
|
|
:param to_remove:
|
|
:return:
|
|
"""
|
|
for item in to_remove:
|
|
if item in lst:
|
|
lst.remove(item)
|
|
|
|
return lst
|