138138
139139from collections import namedtuple
140140from collections .abc import Iterable
141- import copy
142- from dataclasses import dataclass
143141import datetime
144142import pathlib
145143import re
146144import typing as t
147145from typing import overload
148- import unittest
149146
150147from music21 import base
151148from music21 import common
152- from music21 .common import deprecated
153149from music21 import defaults
154150from music21 import environment
155151from 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
0 commit comments