import struct
import os
FIELD_TERMINATOR = b'\x1e'
SUBFIELD_DELIMITER = b'\x1f'
RECORD_TERMINATOR = b'\x1d'
def create_simple_book_record():
fields_data = {}
field_100 = b'1 ' + SUBFIELD_DELIMITER + b'aFitzgerald, F. Scott' + FIELD_TERMINATOR
fields_data['100'] = field_100
field_245 = b'10' + SUBFIELD_DELIMITER + b'aThe Great Gatsby' + \
SUBFIELD_DELIMITER + b'cF. Scott Fitzgerald' + FIELD_TERMINATOR
fields_data['245'] = field_245
field_650 = b' 0' + SUBFIELD_DELIMITER + b'aAmerican fiction' + FIELD_TERMINATOR
fields_data['650'] = field_650
return build_marc_record(fields_data)
def create_music_record():
fields_data = {}
field_100 = b'1 ' + SUBFIELD_DELIMITER + b'aBeethoven, Ludwig van' + FIELD_TERMINATOR
fields_data['100'] = field_100
field_245 = b'10' + SUBFIELD_DELIMITER + b'aBeethovens Ninth Symphony' + FIELD_TERMINATOR
fields_data['245'] = field_245
data_area, directory = build_directory_and_data(fields_data)
base_address = 24 + len(directory)
record_length = base_address + len(data_area) + 1
leader = build_leader(record_length, base_address, record_type='c')
record = leader + directory + data_area + RECORD_TERMINATOR
return record
def create_with_control_fields():
fields_data = {}
field_008 = b'200101s2020 xxua j 000 0 eng d' + FIELD_TERMINATOR
fields_data['008'] = field_008
field_245 = b'00' + SUBFIELD_DELIMITER + b"aChildren's Book" + FIELD_TERMINATOR
fields_data['245'] = field_245
return build_marc_record(fields_data)
def build_directory_and_data(fields_data):
data_area = b''
directory = b''
current_pos = 0
for tag in sorted(fields_data.keys()):
field_bytes = fields_data[tag]
field_length = len(field_bytes)
directory += tag.encode('ascii')
directory += f'{field_length:04d}'.encode('ascii')
directory += f'{current_pos:05d}'.encode('ascii')
data_area += field_bytes
current_pos += field_length
directory += FIELD_TERMINATOR
return data_area, directory
def build_leader(record_length, base_address, record_type='a', bib_level='m'):
leader = bytearray()
leader.extend(f'{record_length:05d}'.encode('ascii')) leader.append(ord('n')) leader.append(ord(record_type)) leader.append(ord(bib_level)) leader.append(ord(' ')) leader.append(ord('a')) leader.append(ord('2')) leader.append(ord('2')) leader.extend(f'{base_address:05d}'.encode('ascii')) leader.append(ord(' ')) leader.append(ord(' ')) leader.append(ord(' ')) leader.extend(b'4500')
return bytes(leader)
def build_marc_record(fields_data):
data_area, directory = build_directory_and_data(fields_data)
base_address = 24 + len(directory)
record_length = base_address + len(data_area) + 1
leader = build_leader(record_length, base_address)
record = leader + directory + data_area + RECORD_TERMINATOR
return record
def main():
os.makedirs('tests/data', exist_ok=True)
records = [
('tests/data/simple_book.mrc', create_simple_book_record()),
('tests/data/music_score.mrc', create_music_record()),
('tests/data/with_control_fields.mrc', create_with_control_fields()),
]
for filename, record_data in records:
with open(filename, 'wb') as f:
f.write(record_data)
print(f'Created {filename}')
with open('tests/data/multi_records.mrc', 'wb') as f:
for record_data in [
create_simple_book_record(),
create_music_record(),
create_with_control_fields(),
]:
f.write(record_data)
print('Created tests/data/multi_records.mrc')
if __name__ == '__main__':
main()