@@ -359,7 +359,12 @@ def _write_metadata(self, metadata):
359
359
writer = self .writer
360
360
361
361
if 'Title' in metadata :
362
- writer .element ('title' , text = metadata ['Title' ])
362
+ title = metadata ['Title' ]
363
+ if isinstance (title , str ):
364
+ writer .element ('title' , text = metadata ['Title' ])
365
+ else :
366
+ raise TypeError (f'Invalid type for Title metadata. Expected'
367
+ f' str, not { type (title )} .' )
363
368
364
369
# Special handling.
365
370
date = metadata .get ('Date' , None )
@@ -376,14 +381,14 @@ def _write_metadata(self, metadata):
376
381
elif isinstance (d , (datetime .datetime , datetime .date )):
377
382
dates .append (d .isoformat ())
378
383
else :
379
- raise ValueError (
384
+ raise TypeError (
380
385
'Invalid type for Date metadata. '
381
386
'Expected iterable of str, date, or datetime, '
382
- 'not {!r }.' .format (type (d )))
387
+ 'not {}.' .format (type (d )))
383
388
else :
384
- raise ValueError ('Invalid type for Date metadata. '
385
- 'Expected str, date, datetime, or iterable '
386
- 'of the same, not {!r }.' .format (type (date )))
389
+ raise TypeError ('Invalid type for Date metadata. '
390
+ 'Expected str, date, datetime, or iterable '
391
+ 'of the same, not {}.' .format (type (date )))
387
392
metadata ['Date' ] = '/' .join (dates )
388
393
elif 'Date' not in metadata :
389
394
# Do not add `Date` if the user explicitly set `Date` to `None`
@@ -420,8 +425,12 @@ def ensure_metadata(mid):
420
425
info = metadata .pop (key .title (), None )
421
426
if info is not None :
422
427
mid = ensure_metadata (mid )
423
- writer .element (f'dc:{ key } ' , text = info )
424
-
428
+ if isinstance (info , str ):
429
+ writer .element (f'dc:{ key } ' , text = info )
430
+ else :
431
+ raise TypeError (f'Invalid type for { key .title ()} '
432
+ f'metadata. Expected str'
433
+ f', not { type (info )} .' )
425
434
# Multiple Agent values.
426
435
for key in ['creator' , 'contributor' , 'publisher' , 'rights' ]:
427
436
agents = metadata .pop (key .title (), None )
@@ -431,27 +440,46 @@ def ensure_metadata(mid):
431
440
if isinstance (agents , str ):
432
441
agents = [agents ]
433
442
434
- mid = ensure_metadata (mid )
435
- writer .start (f'dc:{ key } ' )
436
- for agent in agents :
437
- writer .start ('cc:Agent' )
438
- writer .element ('dc:title' , text = agent )
439
- writer .end ('cc:Agent' )
440
- writer .end (f'dc:{ key } ' )
443
+ if np .iterable (agents ):
444
+ mid = ensure_metadata (mid )
445
+ writer .start (f'dc:{ key } ' )
446
+ for agent in agents :
447
+ writer .start ('cc:Agent' )
448
+ if isinstance (agent , str ):
449
+ writer .element ('dc:title' , text = agent )
450
+ else :
451
+ raise TypeError (f'Invalid type for { key .title ()} '
452
+ f'metadata. Expected iterable of str'
453
+ f', not { type (agent )} .' )
454
+ writer .end ('cc:Agent' )
455
+ writer .end (f'dc:{ key } ' )
456
+ else :
457
+ raise TypeError (f'Invalid type for { key .title ()} metadata. '
458
+ f'Expected str or iterable '
459
+ f'of str, not { type (agents )} .' )
441
460
442
461
# Multiple values.
443
462
keywords = metadata .pop ('Keywords' , None )
444
463
if keywords is not None :
445
464
if isinstance (keywords , str ):
446
465
keywords = [keywords ]
447
-
448
- mid = ensure_metadata (mid )
449
- writer .start ('dc:subject' )
450
- writer .start ('rdf:Bag' )
451
- for keyword in keywords :
452
- writer .element ('rdf:li' , text = keyword )
453
- writer .end ('rdf:Bag' )
454
- writer .end ('dc:subject' )
466
+ if np .iterable (keywords ):
467
+ mid = ensure_metadata (mid )
468
+ writer .start ('dc:subject' )
469
+ writer .start ('rdf:Bag' )
470
+ for keyword in keywords :
471
+ if isinstance (keyword , str ):
472
+ writer .element ('rdf:li' , text = keyword )
473
+ else :
474
+ raise TypeError ('Invalid type for Keywords metadata. '
475
+ 'Expected iterable of str'
476
+ ', not {}.' .format (type (keyword )))
477
+ writer .end ('rdf:Bag' )
478
+ writer .end ('dc:subject' )
479
+ else :
480
+ raise TypeError ('Invalid type for Keywords metadata. '
481
+ 'Expected str or iterable '
482
+ 'of str, not {}.' .format (type (keywords )))
455
483
456
484
if mid is not None :
457
485
writer .close (mid )
0 commit comments