Skip to content

Commit

Permalink
Implemented pyblish#140
Browse files Browse the repository at this point in the history
  • Loading branch information
mottosso committed May 18, 2015
1 parent 1c0b736 commit d4c3f4b
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 62 deletions.
2 changes: 1 addition & 1 deletion pyblish/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@


config = {}
manager = None

_registered_paths = list()
_registered_plugins = dict()


def is_initialized():
Expand Down
2 changes: 1 addition & 1 deletion pyblish/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
deregister_plugin_path, deregister_all,
registered_paths, environment_paths, configured_paths,
plugins_by_family, plugins_by_host, instances_by_plugin,
current_host, sort)
current_host, sort, register_plugin, deregister_plugin)

from .plugin import Config as __Config
from .plugin import sort as sort_plugins
Expand Down
142 changes: 83 additions & 59 deletions pyblish/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,14 @@ def current_host():
raise ValueError("Could not determine host")


def register_plugin(plugin):
pyblish._registered_plugins[plugin.__name__] = plugin


def deregister_plugin(plugin):
pyblish._registered_plugins.pop(plugin.__name__)


def register_plugin_path(path):
"""Plug-ins are looked up at run-time from directories registered here
Expand Down Expand Up @@ -835,65 +843,7 @@ def discover(type=None, regex=None, paths=None):
if type is not None and type not in patterns:
raise ValueError("Type not recognised: %s" % type)

discovered_plugins = dict()

def version_is_compatible(plugin):
"""Lookup compatibility between plug-in and current version of Pyblish
Arguments:
plugin (Plugin): Plug-in to test against
"""

if not iscompatible.iscompatible(requirements=plugin.requires,
version=pyblish.version_info):
log.warning("Plug-in %s not compatible with this version "
"(%s) of Pyblish." % (plugin, pyblish.__version__))
return False
return True

def plugin_is_valid(plugin):
if not inspect.isclass(plugin):
return False

if not issubclass(plugin, Plugin):
return False

if plugin.order is None:
log.error("Plug-in must have an order: %s", plugin)
return False

if not isinstance(plugin.requires, basestring):
log.error("Plug-in requires must be of type string: %s", plugin)
return False

try:
if (issubclass(plugin, Selector)
and not getattr(plugin, "hosts")):
raise Exception(0)
if (issubclass(plugin, (Validator, Extractor))
and not getattr(plugin, "families")
and not getattr(plugin, "hosts")):
raise Exception(1)

if (issubclass(plugin, Conformer)
and not getattr(plugin, "families")):
raise Exception(2)

except Exception as e:
if e.message == 0:
log.error("%s: Plug-in not valid, missing hosts.", plugin)
if e.message == 1:
log.error("%s: Plug-in not valid, missing hosts and families.",
plugin)
if e.message == 2:
log.error("%s: Plug-in not valid, missing families.", plugin)
return False

return True

def host_is_compatible(plugin):
return any(["*" in plugin.hosts, current_host() in plugin.hosts])
discovered_plugins = pyblish._registered_plugins.copy()

paths_to_check = paths
if paths_to_check is None:
Expand Down Expand Up @@ -940,6 +890,9 @@ def host_is_compatible(plugin):
continue

if not version_is_compatible(obj):
log.warning("Plug-in %s not compatible with "
"this version (%s) of Pyblish." % (
plugin, pyblish.__version__))
continue

if not host_is_compatible(obj):
Expand All @@ -957,6 +910,77 @@ def host_is_compatible(plugin):
return plugins


def plugin_is_valid(plugin):
"""Determine whether or not plug-in `plugin` is valid
Arguments:
plugin (Plugin): Plug-in to assess
"""

if not inspect.isclass(plugin):
return False

if not issubclass(plugin, Plugin):
return False

if not isinstance(plugin.requires, basestring):
log.error("Plug-in requires must be of type string: %s", plugin)
return False

try:
if (issubclass(plugin, Selector)
and not getattr(plugin, "hosts")):
raise Exception(0)
if (issubclass(plugin, (Validator, Extractor))
and not getattr(plugin, "families")
and not getattr(plugin, "hosts")):
raise Exception(1)

if (issubclass(plugin, Conformer)
and not getattr(plugin, "families")):
raise Exception(2)

except Exception as e:
if e.message == 0:
log.error("%s: Plug-in not valid, missing hosts.", plugin)
if e.message == 1:
log.error("%s: Plug-in not valid, missing hosts and families.",
plugin)
if e.message == 2:
log.error("%s: Plug-in not valid, missing families.", plugin)
return False

return True


def version_is_compatible(plugin):
"""Lookup compatibility between plug-in and current version of Pyblish
Arguments:
plugin (Plugin): Plug-in to test against
"""

if not iscompatible.iscompatible(requirements=plugin.requires,
version=pyblish.version_info):
return False
return True


def host_is_compatible(plugin):
"""Determine whether plug-in `plugin` is compatible with the current host
The current host is determined by :func:`current_host`.
Arguments:
plugin (Plugin): Plug-in to assess.
"""

return any(["*" in plugin.hosts, current_host() in plugin.hosts])


def sort(plugins):
"""Sort `plugins` in-place
Expand Down
6 changes: 6 additions & 0 deletions pyblish/tests/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ def setup():
pyblish.plugin.register_plugin_path(PLUGINPATH)


def setup_empty():
"""Disable all plug-ins"""
setup()
pyblish.plugin.deregister_all()


def setup_failing():
"""Expose failing plugins to discovery mechanism"""
setup()
Expand Down
24 changes: 23 additions & 1 deletion pyblish/tests/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@

from pyblish.tests.lib import (
setup, teardown, setup_failing, HOST, FAMILY,
setup_duplicate, setup_invalid, setup_wildcard)
setup_duplicate, setup_invalid, setup_wildcard,
setup_empty)
from pyblish.vendor.nose.tools import *


Expand Down Expand Up @@ -493,3 +494,24 @@ def test_plugins_sorted():
order = plugin.order

assert order > 0, plugins


@with_setup(setup_empty, teardown)
def test_inmemory_plugins():
"""In-memory plug-ins works fine"""

class InMemoryPlugin(pyblish.api.Selector):
hosts = ["*"]
families = ["*"]

def process_context(self, context):
context.set_data("workingFine", True)

pyblish.api.register_plugin(InMemoryPlugin)

context = pyblish.api.Context()
for plugin in pyblish.api.discover():
assert plugin is InMemoryPlugin
plugin().process_context(context)

assert context.data("workingFine") is True

0 comments on commit d4c3f4b

Please sign in to comment.