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