Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement #250 #325

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions pyblish/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,12 @@ def Iterator(plugins, context, state=None):

"""

# Run ContextPlugin only if instance of family is present when not "*"
# This is to preserve backwards compatility.
PYBLISH_CONTEXTPLUGIN_ON_FAMILY = bool(
os.getenv("PYBLISH_CONTEXTPLUGIN_ON_FAMILY")
)

test = registered_test()
state = state or {
"nextOrder": None,
Expand Down Expand Up @@ -381,4 +387,13 @@ def Iterator(plugins, context, state=None):
yield plugin, instance

else:

if PYBLISH_CONTEXTPLUGIN_ON_FAMILY:
# When filtering to families at least a single instance with
# that family must be active in the current publish
if "*" not in plugin.families:
if not any(instance.data.get("publish") is not False
for instance in instances):
continue

yield plugin, None
15 changes: 15 additions & 0 deletions tests/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,18 @@ def tempdir():
yield tempdir
finally:
shutil.rmtree(tempdir)


@contextlib.contextmanager
def env_override(overrides):
"""Temporarily override environment variables"""
assert isinstance(overrides, dict)
original = os.environ.copy()
os.environ.update(overrides)

try:
yield
finally:
# Reset
os.environ.clear()
os.environ.update(original)
60 changes: 60 additions & 0 deletions tests/test_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,66 @@ def process(self, instance):
assert count["#"] == 101, count


@with_setup(lib.setup, lib.teardown)
def test_contextplugin_on_family_iterator():
"""Iterator skips ContextPlugin filtered to family

This functionality is only enabled when PYBLISH_CONTEXTPLUGIN_ON_FAMILY
environment variable is set to a True value to preserve backwards
compatibility.

"""

count = {"#": 0}

class MyCollector(api.ContextPlugin):
order = api.CollectorOrder

def process(self, context):
instance = context.create_instance("A1")
instance.data['families'] = ["A"]
instance = context.create_instance("A2")
instance.data['families'] = ["A"]
instance = context.create_instance("C1")
instance.data['families'] = ["C"]

count["#"] += 1

class ValidateA(api.ContextPlugin):
families = ["A"]
order = api.CollectorOrder

def process(self, context):
count["#"] += 10

class ValidateB(api.ContextPlugin):
families = ["B"]
order = api.CollectorOrder

def process(self, context):
count["#"] += 100

class ValidateAC(api.ContextPlugin):
families = ["A", "C"]
order = api.CollectorOrder

def process(self, context):
count["#"] += 1000

context = api.Context()
plugins = [MyCollector, ValidateA, ValidateB, ValidateAC]

assert count["#"] == 0, count

with lib.env_override({"PYBLISH_CONTEXTPLUGIN_ON_FAMILY": "True"}):
for Plugin, instance in logic.Iterator(plugins, context):
assert Plugin.__name__ != "ValidateB"
plugin.process(Plugin, context, instance)

# Collector runs once, one Validator runs once
assert count["#"] == 1011, count


def test_register_gui():
"""Registering at run-time takes precedence over those from environment"""

Expand Down