Skip to content

Commit

Permalink
use setdefault_path
Browse files Browse the repository at this point in the history
  • Loading branch information
tandav committed Jan 2, 2024
1 parent 81fe024 commit c2d0c87
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 24 deletions.
6 changes: 3 additions & 3 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ repos:
- id: autoflake

- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.1.3
rev: v0.1.9
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
Expand All @@ -54,14 +54,14 @@ repos:
additional_dependencies: [Flake8-pyproject, flake8-functions-names]

- repo: https://github.com/PyCQA/pylint
rev: v3.0.1
rev: v3.0.3
hooks:
- id: pylint
# additional_dependencies: ["pylint-per-file-ignores"]
# https://github.com/christopherpickering/pylint-per-file-ignores/issues/76

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.6.1
rev: v1.8.0
hooks:
- id: mypy
additional_dependencies: [svg.py, numpy]
Expand Down
3 changes: 2 additions & 1 deletion src/musiclib/intervalset.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from musiclib.interval import AbstractInterval
from musiclib.svg.reprsvg import ReprSVGMixin
from musiclib.util.cache import Cached
from musiclib.util.etc import setdefault_path

Self = TypeVar('Self', bound='IntervalSet')

Expand Down Expand Up @@ -68,5 +69,5 @@ def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
from musiclib.svg.card import PlanePiano
kwargs = kwargs.copy()
kwargs.setdefault('interval_colors', {i: config.interval_colors[i] for i in self.intervals})
kwargs['header_kwargs'].setdefault('title', str(self))
setdefault_path(kwargs, 'header_kwargs.title', str(self))
return PlanePiano(**kwargs).svg
26 changes: 14 additions & 12 deletions src/musiclib/noteset.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from musiclib.svg.isomorphic.text import FromIntervalDict
from musiclib.svg.reprsvg import ReprSVGMixin
from musiclib.util.cache import Cached
from musiclib.util.etc import setdefault_path

if TYPE_CHECKING:
from collections.abc import Iterator
Expand Down Expand Up @@ -116,8 +117,8 @@ def __repr__(self) -> str:
def svg_piano(self, **kwargs: Any) -> svg.SVG:
from musiclib.svg.card import Piano # hack to fix circular import
kwargs = kwargs.copy()
kwargs['header_kwargs'].setdefault('title', str(self))
kwargs['regular_piano_kwargs'].setdefault('note_colors', {note: config.RED for note in self})
setdefault_path(kwargs, 'header_kwargs.title', str(self))
setdefault_path(kwargs, 'regular_piano_kwargs.note_colors', {note: config.RED for note in self})
return Piano(**kwargs).svg

def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
Expand All @@ -138,7 +139,7 @@ def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
}, abstract=True,
),
)
kwargs['header_kwargs'].setdefault('title', str(self))
setdefault_path(kwargs, 'header_kwargs.title', str(self))
return PlanePiano(**kwargs).svg

def __getnewargs__(self) -> tuple[frozenset[Note]]:
Expand Down Expand Up @@ -265,10 +266,10 @@ def __getnewargs__(self) -> tuple[frozenset[SpecificNote]]:
def svg_piano(self, **kwargs: Any) -> svg.SVG:
from musiclib.svg.card import Piano
kwargs = kwargs.copy()
kwargs['header_kwargs'].setdefault('title', str(self))
kwargs['regular_piano_kwargs'].setdefault('note_colors', dict.fromkeys(self.notes, config.RED))
kwargs['regular_piano_kwargs'].setdefault('squares', {note: {'text': str(note), 'text_size': '8'} for note in self})
kwargs['regular_piano_kwargs'].setdefault('start_stop', (self[0], self[-1]) if self.notes else None)
setdefault_path(kwargs, 'header_kwargs.title', str(self))
setdefault_path(kwargs, 'regular_piano_kwargs.note_colors', dict.fromkeys(self.notes, config.RED))
setdefault_path(kwargs, 'regular_piano_kwargs.squares', {note: {'text': str(note), 'text_size': '8'} for note in self})
setdefault_path(kwargs, 'regular_piano_kwargs.start_stop', (self[0], self[-1]) if self.notes else None)
return Piano(**kwargs).svg

def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
Expand All @@ -288,7 +289,7 @@ def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
}),
)
kwargs.setdefault('n_cols', max(self) - min(self) + 1)
kwargs['header_kwargs'].setdefault('title', str(self))
setdefault_path(kwargs, 'header_kwargs.title', str(self))
return PlanePiano(**kwargs).svg


Expand Down Expand Up @@ -334,20 +335,21 @@ def __repr__(self) -> str:
def svg_piano(self, **kwargs: Any) -> svg.SVG:
from musiclib.svg.card import Piano
kwargs = kwargs.copy()
kwargs['regular_piano_kwargs'].setdefault(
'note_colors',
setdefault_path(
kwargs,
'regular_piano_kwargs.note_colors',
dict.fromkeys(self.del_notes, config.RED) |
dict.fromkeys(self.new_notes, config.GREEN) |
dict.fromkeys(self.shared_notes, config.BLUE),
)
kwargs['header_kwargs'].setdefault('title', str(self))
setdefault_path(kwargs, 'header_kwargs.title', str(self))
return Piano(**kwargs).svg

def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
from musiclib.svg.card import PlanePiano
kwargs = kwargs.copy()
n0 = Note(config.chromatic_notes[0])
kwargs['header_kwargs'].setdefault('title', str(self))
setdefault_path(kwargs, 'header_kwargs.title', str(self))
kwargs.setdefault(
'interval_colors',
dict.fromkeys([n - n0 for n in self.del_notes], config.RED) |
Expand Down
7 changes: 4 additions & 3 deletions src/musiclib/scale.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from musiclib.svg.card import PlanePiano
from musiclib.svg.reprsvg import ReprSVGMixin
from musiclib.util.cache import Cached
from musiclib.util.etc import setdefault_path

Self = TypeVar('Self', bound='Scale')

Expand Down Expand Up @@ -125,12 +126,12 @@ def svg_piano(self, **kwargs: Any) -> svg.SVG:
from musiclib.svg.card import Piano
kwargs = kwargs.copy()
kwargs.setdefault('class_', tuple(self.intervalset.names))
kwargs['header_kwargs'].setdefault('title', self.str_names)
kwargs['regular_piano_kwargs'].setdefault('note_colors', {note: config.interval_colors[interval] for note, interval in self.note_to_interval.items()})
setdefault_path(kwargs, 'header_kwargs.title', self.str_names)
setdefault_path(kwargs, 'regular_piano_kwargs.note_colors', {note: config.interval_colors[interval] for note, interval in self.note_to_interval.items()})
return Piano(**kwargs).svg

def svg_plane_piano(self, **kwargs: Any) -> svg.SVG:
kwargs = kwargs.copy()
kwargs.setdefault('interval_colors', {i: config.interval_colors[i] for i in self.intervalset.intervals})
kwargs['header_kwargs'].setdefault('title', self.str_names)
setdefault_path(kwargs, 'header_kwargs.title', self.str_names)
return PlanePiano(**kwargs).svg
7 changes: 3 additions & 4 deletions src/musiclib/util/etc.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,14 +150,13 @@ def deep_setdefault(mapping: dict[KeyType, Any], updating_mapping: dict[KeyType,
return updated_mapping


def setdefault_path(mapping: dict[KeyType, Any], path: str, value: Any) -> dict[KeyType, Any]:
updated_mapping = mapping.copy()
def setdefault_path(mapping: dict[str, Any], path: str, value: Any) -> dict[str, Any]:
*prefix_keys, value_key = path.split('.')
_mapping = updated_mapping
_mapping = mapping
for key in prefix_keys:
_mapping.setdefault(key, {})
_mapping = _mapping[key]
if not isinstance(_mapping, dict):
raise KeyError('non-dict value for path')
_mapping.setdefault(value_key, value)
return updated_mapping
return mapping
2 changes: 1 addition & 1 deletion tests/util/etc_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def test_intervals_rotations(intervals, expected):
({'a': {'b': {'c': {'d': 3}}}}, 'a.b.e', 4, {'a': {'b': {'c': {'d': 3}, 'e': 4}}}),
({'a': {'b': {'c': {'d': 3}}}}, 'a.b.e.f', 4, {'a': {'b': {'c': {'d': 3}, 'e': {'f': 4}}}}),
({'a': {'b': {'c': {'d': 3}}}}, 'a.b.e.f.g', 4, {'a': {'b': {'c': {'d': 3}, 'e': {'f': {'g': 4}}}}}),
]
],
)
def test_setdefault_path(mapping, path, value, expected):
if isinstance(expected, type) and issubclass(expected, Exception):
Expand Down

0 comments on commit c2d0c87

Please sign in to comment.