def _normalize_isbn(ctx): _isbn = isbn(ctx) if callable(isbn) else isbn _isbn = [_isbn] if not isinstance(_isbn, list) else _isbn return [ compute_ean13_check(i) for i, t in isbn_list([i for i in _isbn if i]) ]
def isbn_instancegen(params, loop, model): ''' Default handling of the idea of splitting a MARC record with FRBR Work info as well as instances signalled by ISBNs According to Vicki Instances can be signalled by 007, 020 or 3XX, but we stick to 020 for now ''' #Handle ISBNs re: https://foundry.zepheira.com/issues/1976 entbase = params['entbase'] output_model = params['output_model'] input_model = params['input_model'] vocabbase = params['vocabbase'] logger = params['logger'] materialize_entity = params['materialize_entity'] existing_ids = params['existing_ids'] workid = params['workid'] ids = params['ids'] plugins = params['plugins'] INSTANTIATES_REL = I(iri.absolutize('instantiates', vocabbase)) isbns = list(( val for code, val in marc_lookup(input_model, '020$a'))) logger.debug('Raw ISBNS:\t{0}'.format(isbns)) # sorted to remove non-determinism which interferes with canonicalization normalized_isbns = sorted(list(isbn_list(isbns, logger=logger))) subscript = ord('a') instance_ids = [] logger.debug('Normalized ISBN:\t{0}'.format(normalized_isbns)) if normalized_isbns: for inum, itype in normalized_isbns: ean13 = compute_ean13_check(inum) data = [['instantiates', workid], [ISBNNS + 'isbn', ean13]] instanceid = materialize_entity('Instance', ctx_params=params, loop=loop, model_to_update=params['output_model'], data=data) if entbase: instanceid = I(iri.absolutize(instanceid, entbase)) output_model.add(I(instanceid), ISBN_REL, ean13) output_model.add(I(instanceid), INSTANTIATES_REL, I(workid)) if itype: output_model.add(I(instanceid), ISBN_TYPE_REL, itype) existing_ids.add(instanceid) instance_ids.append(instanceid) else: #If there are no ISBNs, we'll generate a default Instance data = [['instantiates', workid]] instanceid = materialize_entity('Instance', ctx_params=params, loop=loop, model_to_update=params['output_model'], data=data) instanceid = I(iri.absolutize(instanceid, entbase)) if entbase else I(instanceid) output_model.add(I(instanceid), INSTANTIATES_REL, I(workid)) existing_ids.add(instanceid) instance_ids.append(instanceid) #output_model.add(instance_ids[0], I(iri.absolutize('instantiates', vocabbase)), I(workid)) #output_model.add(I(instance_ids[0]), TYPE_REL, I(iri.absolutize('Instance', vocabbase))) return instance_ids
def test_compute_ean13_check(inputdata, expected): result = compute_ean13_check(inputdata) assert len(result) == 13, (result,) assert result == expected, (result, expected)
def isbn_instancegen(params, loop, model): ''' Default handling of the idea of splitting a MARC record with FRBR Work info as well as instances signalled by ISBNs According to Vicki Instances can be signalled by 007, 020 or 3XX, but we stick to 020 for now ''' #Handle ISBNs re: https://foundry.zepheira.com/issues/1976 entbase = params['entbase'] output_model = params['output_model'] input_model = params['input_model'] vocabbase = params['vocabbase'] logger = params['logger'] materialize_entity = params['materialize_entity'] existing_ids = params['existing_ids'] workid = params['default-origin'] ids = params['ids'] plugins = params['plugins'] INSTANTIATES_REL = I(iri.absolutize('instantiates', vocabbase)) isbns = list((val for code, val in marc_lookup(input_model, '020$a'))) logger.debug('Raw ISBNS:\t{0}'.format(isbns)) # sorted to remove non-determinism which interferes with canonicalization normalized_isbns = sorted(list(isbn_list(isbns, logger=logger))) subscript = ord('a') instance_ids = [] logger.debug('Normalized ISBN:\t{0}'.format(normalized_isbns)) if normalized_isbns: for inum, itype in normalized_isbns: ean13 = compute_ean13_check(inum) data = [['instantiates', workid], [ISBNNS + 'isbn', ean13]] instanceid = materialize_entity('Instance', ctx_params=params, model_to_update=output_model, data=data, loop=loop) if entbase: instanceid = I(iri.absolutize(instanceid, entbase)) output_model.add(I(instanceid), ISBN_REL, ean13) output_model.add(I(instanceid), INSTANTIATES_REL, I(workid)) if itype: output_model.add(I(instanceid), ISBN_VTYPE_REL, itype) existing_ids.add(instanceid) instance_ids.append(instanceid) else: #If there are no ISBNs, we'll generate a default Instance data = [['instantiates', workid]] instanceid = materialize_entity('Instance', ctx_params=params, model_to_update=output_model, data=data, loop=loop) instanceid = I(iri.absolutize(instanceid, entbase)) if entbase else I(instanceid) output_model.add(I(instanceid), INSTANTIATES_REL, I(workid)) existing_ids.add(instanceid) instance_ids.append(instanceid) #output_model.add(instance_ids[0], I(iri.absolutize('instantiates', vocabbase)), I(workid)) #output_model.add(I(instance_ids[0]), VTYPE_REL, I(iri.absolutize('Instance', vocabbase))) return instance_ids