Skip to content

Commit 555f6b8

Browse files
authored
Merge pull request #1820 from cuthbertLab/metadata_primitives
Update metadata.primitives
2 parents cbab1db + e952b26 commit 555f6b8

File tree

2 files changed

+61
-58
lines changed

2 files changed

+61
-58
lines changed

music21/metadata/__init__.py

Lines changed: 59 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -138,18 +138,14 @@
138138

139139
from collections import namedtuple
140140
from collections.abc import Iterable
141-
import copy
142-
from dataclasses import dataclass
143141
import datetime
144142
import pathlib
145143
import re
146144
import typing as t
147145
from typing import overload
148-
import unittest
149146

150147
from music21 import base
151148
from music21 import common
152-
from music21.common import deprecated
153149
from music21 import defaults
154150
from music21 import environment
155151
from music21 import exceptions21
@@ -1332,21 +1328,6 @@ def composers(self, value: Iterable[str]) -> None:
13321328
'''
13331329
setattr(self, 'composers', value)
13341330

1335-
@property
1336-
def date(self):
1337-
'''
1338-
The `.date` property is deprecated in v8 and will be removed in v10.
1339-
Use `dateCreated` instead.
1340-
'''
1341-
return self.dateCreated
1342-
1343-
@date.setter
1344-
def date(self, value: str) -> None:
1345-
'''
1346-
For type checking only. Does not run.
1347-
'''
1348-
setattr(self, 'date', value)
1349-
13501331
@property
13511332
def dateCreated(self):
13521333
r'''
@@ -2246,7 +2227,7 @@ def _add(self, name: str, value: t.Any|Iterable[t.Any], isCustom: bool):
22462227

22472228
convertedValues: list[ValueType] = []
22482229
for v in value:
2249-
convertedValues.append(self._convertValue(name, v))
2230+
convertedValues.append(self.convertValue(name, v))
22502231

22512232
prevValues: list[ValueType]|None = self._contents.get(name, None)
22522233
if not prevValues: # None or []
@@ -2308,46 +2289,71 @@ def _set(self, name: str, value: t.Any|Iterable[t.Any], isCustom: bool):
23082289
self._add(name, value, isCustom)
23092290

23102291
@staticmethod
2311-
def _convertValue(uniqueName: str, value: t.Any) -> ValueType:
2292+
def convertValue(uniqueName: str, value: t.Any) -> ValueType:
23122293
'''
2313-
Converts a value to the appropriate valueType (looked up in STDPROPERTIES by
2314-
uniqueName).
2294+
Converts a value (string, date, etc.) to the appropriate ValueType
2295+
(defined by uniqueName and metadata.proporties.UNIQUE_NAME_TO_VALUE_TYPE).
23152296
2316-
Converts certain named values to Text
2297+
Converts certain named values to Text:
23172298
2318-
>>> metadata.Metadata._convertValue('title', 3.4)
2319-
<music21.metadata.primitives.Text 3.4>
2320-
>>> metadata.Metadata._convertValue('title', '3.4')
2321-
<music21.metadata.primitives.Text 3.4>
2322-
>>> metadata.Metadata._convertValue('title', metadata.Text('3.4'))
2323-
<music21.metadata.primitives.Text 3.4>
2299+
>>> metadata.Metadata.convertValue('title', 'Density 21.5')
2300+
<music21.metadata.primitives.Text Density 21.5>
23242301
2325-
Converts certain named values to Copyright
2302+
Non-string values can often be converted automatically
23262303
2327-
>>> metadata.Metadata._convertValue('copyright', 'copyright str')
2328-
<music21.metadata.primitives.Copyright copyright str>
2329-
>>> metadata.Metadata._convertValue('copyright', metadata.Text('copyright text'))
2330-
<music21.metadata.primitives.Copyright copyright text>
2331-
>>> metadata.Metadata._convertValue('copyright', metadata.Copyright('copyright'))
2332-
<music21.metadata.primitives.Copyright copyright>
2304+
>>> metadata.Metadata.convertValue('title', 21.5)
2305+
<music21.metadata.primitives.Text 21.5>
23332306
2334-
Converts certain named values to Contributor
23352307
2336-
>>> metadata.Metadata._convertValue('composer', 'composer str')
2337-
<music21.metadata.primitives.Contributor composer:composer str>
2338-
>>> metadata.Metadata._convertValue('composer', metadata.Text('composer text'))
2339-
<music21.metadata.primitives.Contributor composer:composer text>
2340-
>>> metadata.Metadata._convertValue('composer',
2341-
... metadata.Contributor(role='random', name='Joe'))
2342-
<music21.metadata.primitives.Contributor random:Joe>
2308+
If it is already the appropriate type, no change is made
23432309
2344-
Converts certain named values to DateSingle
2310+
>>> md_text = metadata.Text('The Desert Music')
2311+
>>> metadata.Metadata.convertValue('title', md_text)
2312+
<music21.metadata.primitives.Text The Desert Music>
2313+
>>> metadata.Metadata.convertValue('title', md_text) is md_text
2314+
True
23452315
2346-
>>> metadata.Metadata._convertValue('dateCreated', '1938')
2347-
<music21.metadata.primitives.DateSingle 1938/--/-->
2348-
>>> metadata.Metadata._convertValue('dateCreated', metadata.Text('1938'))
2316+
Converts copyright named values to Copyright:
2317+
2318+
>>> metadata.Metadata.convertValue('copyright', 'copyright-as-string')
2319+
<music21.metadata.primitives.Copyright copyright-as-string>
2320+
>>> metadata.Metadata.convertValue('copyright', metadata.Text('copyright-as-text'))
2321+
<music21.metadata.primitives.Copyright copyright-as-text>
2322+
>>> metadata.Metadata.convertValue('copyright', metadata.Copyright('2025 Ariadne Press'))
2323+
<music21.metadata.primitives.Copyright 2025 Ariadne Press>
2324+
2325+
Converts composer or other named values to Contributors:
2326+
2327+
>>> metadata.Metadata.convertValue('composer', 'Kayleigh Rose Amstutz')
2328+
<music21.metadata.primitives.Contributor composer:Kayleigh Rose Amstutz>
2329+
>>> metadata.Metadata.convertValue('librettist', metadata.Text('Da Ponte'))
2330+
<music21.metadata.primitives.Contributor librettist:Da Ponte>
2331+
2332+
Unusual roles need to be passed with "otherContributor" and role already defined.
2333+
(Essentially, make your own)
2334+
2335+
>>> metadata.Metadata.convertValue('otherContributor',
2336+
... metadata.Contributor(role='conceptual-artist', name='Robert Wilson'))
2337+
<music21.metadata.primitives.Contributor conceptual-artist:Robert Wilson>
2338+
2339+
Converts certain named values to DateSingle:
2340+
2341+
>>> metadata.Metadata.convertValue('dateCreated', '1938')
23492342
<music21.metadata.primitives.DateSingle 1938/--/-->
2350-
>>> metadata.Metadata._convertValue('dateCreated',
2343+
>>> metadata.Metadata.convertValue('dateCreated', metadata.Text('1938/02'))
2344+
<music21.metadata.primitives.DateSingle 1938/02/-->
2345+
2346+
Datetime objects, like this one for the Rite of Spring riot, also get converted.
2347+
2348+
>>> from datetime import datetime
2349+
>>> dt = datetime(1913, 5, 29)
2350+
>>> metadata.Metadata.convertValue('dateCreated', dt)
2351+
<music21.metadata.primitives.DateSingle 1913/05/29>
2352+
2353+
For DateBetween objects one must pass their own already created primitive
2354+
(so no need to use this)
2355+
2356+
>>> metadata.Metadata.convertValue('dateCreated',
23512357
... metadata.DateBetween(['1938', '1939']))
23522358
<music21.metadata.primitives.DateBetween 1938/--/-- to 1939/--/-->
23532359
'''
@@ -2392,14 +2398,11 @@ def _convertValue(uniqueName: str, value: t.Any) -> ValueType:
23922398
return value
23932399

23942400
if isinstance(value, (str, datetime.datetime, Date)):
2395-
# noinspection PyBroadException
2396-
# pylint: disable=bare-except
23972401
try:
23982402
return DateSingle(value)
2399-
except:
2403+
except ValueError:
24002404
# Couldn't convert; just return a generic text.
24012405
return Text(str(originalValue))
2402-
# pylint: enable=bare-except
24032406

24042407
raise exceptions21.MetadataException(
24052408
f'invalid type for DateSingle: {type(value).__name__}')
@@ -2415,13 +2418,11 @@ def _convertValue(uniqueName: str, value: t.Any) -> ValueType:
24152418
f'invalid type for Contributor: {type(value).__name__}')
24162419

24172420
if valueType is int:
2418-
# noinspection PyBroadException
24192421
try:
24202422
return int(value)
2421-
except:
2423+
except ValueError as e:
24222424
raise exceptions21.MetadataException(
2423-
f'invalid type for int: {type(value).__name__}')
2424-
# pylint: enable=bare-except
2425+
f'invalid type for int: {type(value).__name__}') from e
24252426

24262427
raise exceptions21.MetadataException('internal error: invalid valueType')
24272428

music21/metadata/primitives.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
'Creator',
1919
'Date',
2020
'DateBetween',
21+
'DatePrimitive',
2122
'DateRelative',
2223
'DateSelection',
2324
'DateSingle',
2425
'Imprint',
2526
'Text',
27+
'ValueType',
2628
]
2729

2830
from collections.abc import Iterable

0 commit comments

Comments
 (0)