@@ -298,6 +298,23 @@ def generate_css(attrib=None):
298
298
_capstyle_d = {'projecting' : 'square' , 'butt' : 'butt' , 'round' : 'round' }
299
299
300
300
301
+ def _check_is_str (info , key ):
302
+ if not isinstance (info , str ):
303
+ raise TypeError (f'Invalid type for { key } metadata. Expected str, not '
304
+ f'{ type (info )} .' )
305
+
306
+
307
+ def _check_is_iterable_of_str (infos , key ):
308
+ if np .iterable (infos ):
309
+ for info in infos :
310
+ if not isinstance (info , str ):
311
+ raise TypeError (f'Invalid type for { key } metadata. Expected '
312
+ f'iterable of str, not { type (info )} .' )
313
+ else :
314
+ raise TypeError (f'Invalid type for { key } metadata. Expected str or '
315
+ f'iterable of str, not { type (infos )} .' )
316
+
317
+
301
318
class RendererSVG (RendererBase ):
302
319
def __init__ (self , width , height , svgwriter , basename = None , image_dpi = 72 ,
303
320
* , metadata = None ):
@@ -359,7 +376,9 @@ def _write_metadata(self, metadata):
359
376
writer = self .writer
360
377
361
378
if 'Title' in metadata :
362
- writer .element ('title' , text = metadata ['Title' ])
379
+ title = metadata ['Title' ]
380
+ _check_is_str (title , 'Title' )
381
+ writer .element ('title' , text = title )
363
382
364
383
# Special handling.
365
384
date = metadata .get ('Date' , None )
@@ -376,14 +395,14 @@ def _write_metadata(self, metadata):
376
395
elif isinstance (d , (datetime .datetime , datetime .date )):
377
396
dates .append (d .isoformat ())
378
397
else :
379
- raise ValueError (
380
- 'Invalid type for Date metadata. '
381
- 'Expected iterable of str, date, or datetime, '
382
- 'not {!r}.' . format ( type (d )) )
398
+ raise TypeError (
399
+ f 'Invalid type for Date metadata. '
400
+ f 'Expected iterable of str, date, or datetime, '
401
+ f 'not { type (d )} .' )
383
402
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 )) )
403
+ raise TypeError ( f 'Invalid type for Date metadata. '
404
+ f 'Expected str, date, datetime, or iterable '
405
+ f 'of the same, not { type (date )} .' )
387
406
metadata ['Date' ] = '/' .join (dates )
388
407
elif 'Date' not in metadata :
389
408
# Do not add `Date` if the user explicitly set `Date` to `None`
@@ -415,36 +434,40 @@ def ensure_metadata(mid):
415
434
writer .element ('dc:type' , attrib = {'rdf:resource' : uri })
416
435
417
436
# Single value only.
418
- for key in ['title ' , 'coverage ' , 'date ' , 'description ' , 'format ' ,
419
- 'identifier ' , 'language ' , 'relation ' , 'source ' ]:
420
- info = metadata .pop (key . title () , None )
437
+ for key in ['Title ' , 'Coverage ' , 'Date ' , 'Description ' , 'Format ' ,
438
+ 'Identifier ' , 'Language ' , 'Relation ' , 'Source ' ]:
439
+ info = metadata .pop (key , None )
421
440
if info is not None :
422
441
mid = ensure_metadata (mid )
423
- writer .element (f'dc:{ key } ' , text = info )
442
+ _check_is_str (info , key )
443
+ writer .element (f'dc:{ key .lower ()} ' , text = info )
424
444
425
445
# Multiple Agent values.
426
- for key in ['creator ' , 'contributor ' , 'publisher ' , 'rights ' ]:
427
- agents = metadata .pop (key . title () , None )
446
+ for key in ['Creator ' , 'Contributor ' , 'Publisher ' , 'Rights ' ]:
447
+ agents = metadata .pop (key , None )
428
448
if agents is None :
429
449
continue
430
450
431
451
if isinstance (agents , str ):
432
452
agents = [agents ]
433
453
454
+ _check_is_iterable_of_str (agents , key )
455
+ # Now we know that we have an iterable of str
434
456
mid = ensure_metadata (mid )
435
- writer .start (f'dc:{ key } ' )
457
+ writer .start (f'dc:{ key . lower () } ' )
436
458
for agent in agents :
437
459
writer .start ('cc:Agent' )
438
460
writer .element ('dc:title' , text = agent )
439
461
writer .end ('cc:Agent' )
440
- writer .end (f'dc:{ key } ' )
462
+ writer .end (f'dc:{ key . lower () } ' )
441
463
442
464
# Multiple values.
443
465
keywords = metadata .pop ('Keywords' , None )
444
466
if keywords is not None :
445
467
if isinstance (keywords , str ):
446
468
keywords = [keywords ]
447
-
469
+ _check_is_iterable_of_str (keywords , 'Keywords' )
470
+ # Now we know that we have an iterable of str
448
471
mid = ensure_metadata (mid )
449
472
writer .start ('dc:subject' )
450
473
writer .start ('rdf:Bag' )
0 commit comments