Skip to content

Commit

Permalink
Moved Properties into a new module (part of #12);
Browse files Browse the repository at this point in the history
  • Loading branch information
trystyncote committed Feb 22, 2024
1 parent 7a203f5 commit f08de99
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 48 deletions.
5 changes: 2 additions & 3 deletions scrivid/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from . import adjustments, errors, motion_tree, properties, qualms
from ._file_objects import create_image_reference, FileReference, ImageFileReference, ImageReference, VisibilityStatus
from ._file_objects import create_image_reference, FileReference, ImageFileReference, ImageReference
from ._version import __version__, __version_tuple__
from ._video_crafting import compile_video
from .metadata import Metadata


__all__ = [
"__version__", "__version_tuple__", "adjustments", "compile_video", "create_image_reference", "errors",
"FileReference", "ImageFileReference", "ImageReference", "Metadata", "motion_tree", "properties", "qualms",
"VisibilityStatus"
"FileReference", "ImageFileReference", "ImageReference", "Metadata", "motion_tree", "properties", "qualms"
]
3 changes: 1 addition & 2 deletions scrivid/_file_objects/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from ._status import VisibilityStatus
from .files import FileReference
from .images import create_image_reference, ImageFileReference, ImageReference


__all__ = ["create_image_reference", "FileReference", "ImageFileReference", "ImageReference", "VisibilityStatus"]
__all__ = ["create_image_reference", "FileReference", "ImageFileReference", "ImageReference"]
7 changes: 0 additions & 7 deletions scrivid/_file_objects/_status.py

This file was deleted.

18 changes: 9 additions & 9 deletions scrivid/_file_objects/images.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
from __future__ import annotations

from .. import errors
from .. import errors, properties
from .._utils.sentinel_objects import sentinel
from .files import call_close, FileAccess
from .properties import define_properties, EXCLUDED

from copy import copy, deepcopy
from pathlib import Path
Expand All @@ -13,14 +12,15 @@
from PIL import Image

if TYPE_CHECKING:
from ._status import VisibilityStatus
from .properties import Properties

from collections.abc import Hashable
from typing import Optional, Tuple, Union

Properties = properties.Properties
VisibilityStatus = properties.VisibilityStatus


_NS = sentinel("_NOT_SPECIFIED")
EXCLUDED = properties.EXCLUDED


class ImageFileReference:
Expand Down Expand Up @@ -182,7 +182,7 @@ def close(self):
def create_image_reference(
ID: Hashable,
file: Union[str, Path, FileAccess],
properties: Union[Properties, _NS] = _NS,
properties_: Union[Properties, _NS] = _NS,
/, *,
layer: Union[int, EXCLUDED] = EXCLUDED,
scale: Union[int, EXCLUDED] = EXCLUDED,
Expand All @@ -196,8 +196,8 @@ def create_image_reference(
if isinstance(file, Path):
file = ImageFileReference(file)

if properties is _NS:
properties = define_properties(
if properties_ is _NS:
properties_ = properties.create(
layer=layer,
scale=scale,
visibility=visibility,
Expand All @@ -215,4 +215,4 @@ def create_image_reference(
if attr is not EXCLUDED:
raise errors.AttributeError(f"Attribute \'{name}\' should not be specified if \'properties\' is.")

return ImageReference(ID, file, properties)
return ImageReference(ID, file, properties_)
9 changes: 3 additions & 6 deletions scrivid/_video_crafting/_frame_drawing.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
from __future__ import annotations

from .. import motion_tree

from .._file_objects import Properties, VisibilityStatus
from .. import adjustments
from .. import adjustments, motion_tree, properties
from .._utils import TemporaryAttribute

from copy import deepcopy
Expand Down Expand Up @@ -99,7 +96,7 @@ def create_frame(frame: _FrameCanvas, split_instructions: SeparatedInstructions)
index = frame.index
instructions = deepcopy(split_instructions) # Avoid modifying the
# original objects.
merge_settings = {"mode": Properties.MERGE_MODE.REVERSE_APPEND}
merge_settings = {"mode": properties.MergeMode.REVERSE_APPEND}

for ID, reference in instructions.references.items():
try:
Expand All @@ -119,7 +116,7 @@ def create_frame(frame: _FrameCanvas, split_instructions: SeparatedInstructions)

reference._properties = reference._properties.merge(adj._enact(*args), **merge_settings)

if reference.visibility is VisibilityStatus.HIDE:
if reference.visibility is properties.VisibilityStatus.HIDE:
continue

layer = reference.layer
Expand Down
24 changes: 13 additions & 11 deletions scrivid/adjustments/core.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
from __future__ import annotations

from ..abc import Adjustment

from .._file_objects._status import VisibilityStatus
from .._file_objects.properties import EXCLUDED, Properties
from .. import abc, properties

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from collections.abc import Hashable, Union

Properties = properties.Properties


EXCLUDED = properties.EXCLUDED


def _increment_value(
full_value: Union[float, int, EXCLUDED],
Expand All @@ -31,7 +33,7 @@ def _increment_value(
return value + (remainder - (excess_precision * precision))


class HideAdjustment(Adjustment):
class HideAdjustment(abc.Adjustment):
__slots__ = ("_activation_time", "_ID")

def __init__(self, ID: Hashable, activation_time: int):
Expand Down Expand Up @@ -60,17 +62,17 @@ def ID(self):
return self._ID

def _enact(self) -> Properties:
return Properties(visibility=VisibilityStatus.HIDE)
return properties.Properties(visibility=properties.VisibilityStatus.HIDE)


class MoveAdjustment(Adjustment):
class MoveAdjustment(abc.Adjustment):
__slots__ = ("_activation_time", "_change", "_ID", "duration")

def __init__(
self,
ID: Hashable,
activation_time: int,
change: Properties,
change: properties.Properties,
duration: int
):
self._change = change
Expand Down Expand Up @@ -118,10 +120,10 @@ def _split_change(self, length: int = 1) -> Properties:
x = _increment_value(self._change.x, self.duration, length, 1)
y = _increment_value(self._change.y, self.duration, length, 1)

return Properties(scale=scale, x=x, y=y)
return properties.Properties(scale=scale, x=x, y=y)


class ShowAdjustment(Adjustment):
class ShowAdjustment(abc.Adjustment):
__slots__ = ("_activation_time", "_ID")

def __init__(self, ID: Hashable, activation_time: int):
Expand Down Expand Up @@ -150,4 +152,4 @@ def ID(self):
return self._ID

def _enact(self) -> Properties:
return Properties(visibility=VisibilityStatus.SHOW)
return properties.Properties(visibility=properties.VisibilityStatus.SHOW)
7 changes: 6 additions & 1 deletion scrivid/properties.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from __future__ import annotations

from . import errors
from ._file_objects._status import VisibilityStatus
from ._utils import sentinel, SentinelBase

import enum
Expand Down Expand Up @@ -47,6 +46,12 @@ class MergeMode(enum.Enum):
_STRICT_MODES = (MergeMode.REVERSE_STRICT_REPLACEMENT, MergeMode.STRICT_REPLACEMENT)


class VisibilityStatus(enum.Enum):
HIDE = enum.auto()
SHOW = enum.auto()
UNKNOWN = enum.auto()


class Properties:
__slots__ = ("layer", "scale", "visibility", "x", "y")

Expand Down
18 changes: 9 additions & 9 deletions tests/test_properties.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from scrivid import errors, ImageReference, properties, VisibilityStatus
from scrivid import errors, ImageReference, properties

import pytest

Expand Down Expand Up @@ -87,15 +87,15 @@ def test_merge_missing_attribute_ampersand_operator():


def test_merge_mode_append():
a = properties.Properties(visibility=VisibilityStatus.HIDE, x=1)
b = properties.Properties(visibility=VisibilityStatus.SHOW, x=2)
a = properties.Properties(visibility=properties.VisibilityStatus.HIDE, x=1)
b = properties.Properties(visibility=properties.VisibilityStatus.SHOW, x=2)

c = a.merge(b, mode=properties.MergeMode.APPEND)
assert c.x == 3
assert c.visibility is VisibilityStatus.HIDE
assert c.visibility is properties.VisibilityStatus.HIDE

d = b.merge(a, mode=properties.MergeMode.APPEND)
assert d.visibility is VisibilityStatus.SHOW
assert d.visibility is properties.VisibilityStatus.SHOW
# 'visibility' is not invoked via appending the same way, since adding
# two enum objects is not possible, so it invokes the replacement
# behaviour instead. This is why there's a reverse-append option.
Expand All @@ -113,15 +113,15 @@ def test_merge_mode_replacement():


def test_merge_mode_reverse_append():
a = properties.Properties(visibility=VisibilityStatus.HIDE, x=1)
b = properties.Properties(visibility=VisibilityStatus.SHOW, x=2)
a = properties.Properties(visibility=properties.VisibilityStatus.HIDE, x=1)
b = properties.Properties(visibility=properties.VisibilityStatus.SHOW, x=2)

c = a.merge(b, mode=properties.MergeMode.REVERSE_APPEND)
assert c.x == 3
assert c.visibility is VisibilityStatus.SHOW
assert c.visibility is properties.VisibilityStatus.SHOW

d = b.merge(a, mode=properties.MergeMode.REVERSE_APPEND)
assert d.visibility is VisibilityStatus.HIDE
assert d.visibility is properties.VisibilityStatus.HIDE


def test_merge_mode_reverse_replacement():
Expand Down

0 comments on commit f08de99

Please sign in to comment.