|
|
@ -32,33 +32,85 @@ from pathlib import Path |
|
|
|
# == Profile Index == |
|
|
|
# == Profile Index == |
|
|
|
index = {} |
|
|
|
index = {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
profiles_package = __package__ + ".profiles" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_qname(module, name): |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
Create a qualified name for a profile |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
# The global profiles package is omitted from the front |
|
|
|
|
|
|
|
if module.startswith("%s." % profiles_package): |
|
|
|
|
|
|
|
module = module[len(profiles_package) + 1:] |
|
|
|
|
|
|
|
# But arbitrary packages can be specified by prepending : |
|
|
|
|
|
|
|
# This, among other things, allows to use profiles defined |
|
|
|
|
|
|
|
# in .py files in the working dir. |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
module = ":" + module |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# If it's not deeply nested and the module name |
|
|
|
|
|
|
|
# and profile name are the same, the latter |
|
|
|
|
|
|
|
# can be omitted. |
|
|
|
|
|
|
|
if module.strip(":") != name: |
|
|
|
|
|
|
|
return "%s.%s" % (module, name) |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
return module |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Examples: |
|
|
|
|
|
|
|
# Profile xconv.profiles.opus/opus: |
|
|
|
|
|
|
|
# - opus |
|
|
|
|
|
|
|
# - opus.opus |
|
|
|
|
|
|
|
# - :xconv.profiles.opus.opus |
|
|
|
|
|
|
|
# Watch out for xconv.profiles/opus (not valid): |
|
|
|
|
|
|
|
# - :xconv.profiles.opus |
|
|
|
|
|
|
|
# Profile xconv.profiles.opus/stuff: |
|
|
|
|
|
|
|
# - opus.stuff |
|
|
|
|
|
|
|
# - :xconv.profiles.opus.stuff |
|
|
|
|
|
|
|
# Profile test/test: |
|
|
|
|
|
|
|
# - :test |
|
|
|
|
|
|
|
# - :test.test |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_profile(name): |
|
|
|
def load_profile(name): |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
Find and load a XConv profile. |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
# Check if it's already loaded |
|
|
|
if name in index: |
|
|
|
if name in index: |
|
|
|
return index[name] |
|
|
|
return index[name] |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
# See if it's a qualified name |
|
|
|
import_module(".profiles.%s" % name, __package__) |
|
|
|
module = name.rsplit(".", 1)[0] if "." in name[1:] else name |
|
|
|
except ImportError as e: |
|
|
|
|
|
|
|
print(e) |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if name in index: |
|
|
|
# Check if it's in the global profiles package or not |
|
|
|
return index[name] |
|
|
|
if module[0] == ":": |
|
|
|
|
|
|
|
module = module[1:] |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
module = "." + module |
|
|
|
|
|
|
|
|
|
|
|
load_all_profiles() |
|
|
|
# Try to import the module |
|
|
|
|
|
|
|
import_module(module, profiles_package) |
|
|
|
|
|
|
|
|
|
|
|
if name in index: |
|
|
|
# Return the profile |
|
|
|
|
|
|
|
try: |
|
|
|
return index[name] |
|
|
|
return index[name] |
|
|
|
|
|
|
|
except KeyError: |
|
|
|
raise ImportError("Could not find XConv profile '%s'" % name) |
|
|
|
# Fully qualifying the global profiles package is technically valid. |
|
|
|
|
|
|
|
if name.startswith(":%s." % profiles_package): |
|
|
|
|
|
|
|
qname = make_qname(*name[1:].rsplit(".", 1)) |
|
|
|
|
|
|
|
if qname in index: |
|
|
|
|
|
|
|
return index[qname] |
|
|
|
|
|
|
|
raise ImportError("Module %s doesn't contain XConv profile %s" % (module, name)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_all_profiles(): |
|
|
|
def load_all_profiles(): |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
Load all profile definitions |
|
|
|
|
|
|
|
""" |
|
|
|
for location in profilepaths: |
|
|
|
for location in profilepaths: |
|
|
|
for mod in (x for x in Path(location).iterdir() if x.is_file() and x.suffix == ".py"): |
|
|
|
for mod in (x for x in Path(location).iterdir() if x.is_file() and x.suffix == ".py"): |
|
|
|
try: |
|
|
|
try: |
|
|
|
import_module(".profiles.%s" % mod.stem, __package__) |
|
|
|
import_module(".%s" % mod.stem, profiles_package) |
|
|
|
except ImportError: |
|
|
|
except ImportError: |
|
|
|
pass |
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|