Beispiel #1
0
 def test_first_value_1(self):
     sf1 = SubField('a', 'First value')
     sf2 = SubField('b', 'Second value')
     field = RecordField(100, sf1, sf2)
     self.assertEqual(field.first_value('a'), sf1.value)
     self.assertEqual(field.first_value('b'), sf2.value)
     self.assertIsNone(field.first_value('c'))
Beispiel #2
0
 def test_setitem_1(self):
     f100 = RecordField(100, 'Field 100')
     f200 = RecordField(200, SubField('a', 'SubA'), SubField('b', 'SubB'))
     record = MarcRecord()
     record.fields.append(f100)
     record.fields.append(f200)
     new_value = 'New value'
     record[100] = new_value
     self.assertEqual(f100.value, new_value)
     record[200] = '^aNewA^bNewB'
     self.assertEqual(f200.subfields[0].value, 'NewA')
     self.assertEqual(f200.subfields[1].value, 'NewB')
     record[300] = new_value
     self.assertEqual(len(record.fields), 3)
     self.assertEqual(record.fields[2].tag, 300)
     self.assertEqual(record.fields[2].value, new_value)
     record[400] = RecordField().add('a', 'NewA').add('b', 'NewB')
     self.assertEqual(len(record.fields), 4)
     self.assertEqual(record.fields[3].tag, 400)
     self.assertEqual(record.fields[3].subfields[0].value, 'NewA')
     self.assertEqual(record.fields[3].subfields[1].value, 'NewB')
     record[300] = SubField('a', 'OtherA')
     self.assertEqual(len(record.fields), 4)
     self.assertEqual(record.fields[2].tag, 300)
     self.assertIsNone(record.fields[2].value)
     self.assertEqual(record.fields[2].subfields[0].value, 'OtherA')
Beispiel #3
0
 def test_iter_1(self):
     record = MarcRecord().add(100, 'Field 100') \
         .add(200, SubField('a', 'SubA'), SubField('b', 'SubB'))
     s = list(record)
     self.assertEqual(len(s), 2)
     self.assertEqual(s[0].tag, 100)
     self.assertEqual(s[1].tag, 200)
Beispiel #4
0
 def test_encode_1(self):
     record = MarcRecord()
     record.mfn = 123
     record.version = 321
     record.status = LAST
     record.add(100, 'Field100').add(200, SubField('a', 'SubA'), SubField('b', 'SubB'))
     self.assertEqual(record.encode(), ['123#32', '0#321', '100#Field100', '200#^aSubA^bSubB'])
Beispiel #5
0
 def test_isub_2(self):
     sfa = SubField('a', 'SubA')
     sfb = SubField('b', 'SubB')
     field = RecordField(100, sfa, sfb)
     field -= (sfa, sfb)
     self.assertEqual(len(field.subfields), 0)
     field -= (sfa, sfb)
     self.assertEqual(len(field.subfields), 0)
Beispiel #6
0
 def test_iadd_1(self):
     field = RecordField(100)
     self.assertEqual(len(field.subfields), 0)
     field += SubField('a', 'SubA')
     self.assertEqual(len(field.subfields), 1)
     field += SubField('b', 'SubB')
     self.assertEqual(len(field.subfields), 2)
     self.assertEqual(str(field), '100#^aSubA^bSubB')
Beispiel #7
0
 def test_iter_1(self):
     field = RecordField(100, SubField('a', 'SubA'), SubField('b', 'SubB'))
     s = list(field)
     self.assertEqual(len(s), 2)
     self.assertEqual(s[0].code, field.subfields[0].code)
     self.assertEqual(s[0].value, field.subfields[0].value)
     self.assertEqual(s[1].code, field.subfields[1].code)
     self.assertEqual(s[1].value, field.subfields[1].value)
Beispiel #8
0
 def test_getitem_2(self):
     sfa = SubField('a', 'SubA')
     sfb = SubField('b', 'SubB')
     field = RecordField(100, sfa, sfb)
     found = field[0]
     self.assertIs(found, sfa)
     found = field[1]
     self.assertIs(found, sfb)
Beispiel #9
0
 def test_fm_2(self):
     record = MarcRecord().add(100, '', SubField('a', '100A'), SubField('b', '100B'))
     record.add(200, '', SubField('b', '200B'), SubField('c', '200C'))
     self.assertEqual('100A', record.fm(100, 'a'))
     self.assertEqual('100B', record.fm(100, 'b'))
     self.assertIsNone(record.fm(100, 'c'))
     self.assertIsNone(record.fm(200, 'a'))
     self.assertEqual('200B', record.fm(200, 'b'))
     self.assertEqual('200C', record.fm(200, 'c'))
Beispiel #10
0
 def test_assign_from_1(self):
     first = RecordField(100, 'Some value', SubField('a', 'SubA'))
     second = RecordField(200, 'Other value', SubField('b', 'SubB'))
     second.assign_from(first)
     self.assertEqual(second.tag, 200)
     self.assertEqual(first.value, second.value)
     self.assertEqual(len(first.subfields), len(second.subfields))
     self.assertEqual(first.subfields[0].code, second.subfields[0].code)
     self.assertEqual(first.subfields[0].value, second.subfields[0].value)
Beispiel #11
0
 def test_getitem_1(self):
     sfa = SubField('a', 'SubA')
     sfb = SubField('b', 'SubB')
     field = RecordField(100, sfa, sfb)
     found = field['a']
     self.assertIs(found, sfa)
     found = field['b']
     self.assertIs(found, sfb)
     found = field['c']
     self.assertIsNone(found)
Beispiel #12
0
 def test_fma_1(self):
     record = MarcRecord().add(100, 'Field 100/1').add(100, 'Field 100/2')
     record.add(200, SubField('a', 'SubA/1'), SubField('b', 'SubB/1'))
     record.add(200, SubField('a', 'SubA/2'), SubField('b', 'SubB/2'))
     self.assertEqual(record.fma(100), ['Field 100/1', 'Field 100/2'])
     self.assertEqual(record.fma(200, 'a'), ['SubA/1', 'SubA/2'])
     self.assertEqual(record.fma(200, 'b'), ['SubB/1', 'SubB/2'])
     self.assertEqual(record.fma(200, 'c'), [])
     self.assertEqual(record.fma(300), [])
     self.assertEqual(record.fma(300, 'a'), [])
Beispiel #13
0
 def test_setitem_2(self):
     f100 = RecordField(100, 'Field 100')
     f200 = RecordField(200, SubField('a', 'SubA'), SubField('b', 'SubB'))
     record = MarcRecord()
     record.fields.append(f100)
     record.fields.append(f200)
     self.assertEqual(len(record.fields), 2)
     record[100] = None
     self.assertEqual(len(record.fields), 1)
     record[200] = None
     self.assertEqual(len(record.fields), 0)
Beispiel #14
0
 def test_setitem_2(self):
     sfa = SubField('a', 'SubA')
     sfb = SubField('b', 'SubB')
     field = RecordField(100, sfa, sfb)
     self.assertEqual(len(field.subfields), 2)
     field['a'] = None
     self.assertEqual(len(field.subfields), 1)
     field['b'] = None
     self.assertEqual(len(field.subfields), 0)
     field['c'] = None
     self.assertEqual(len(field.subfields), 0)
Beispiel #15
0
 def test_setitem_1(self):
     sfa = SubField('a', 'SubA')
     sfb = SubField('b', 'SubB')
     field = RecordField(100, sfa, sfb)
     new_value = 'New value'
     field['a'] = new_value
     self.assertEqual(sfa.value, new_value)
     field['b'] = new_value
     self.assertEqual(sfb.value, new_value)
     field['c'] = new_value
     self.assertEqual(len(field.subfields), 3)
     sfc = field.subfields[2]
     self.assertEqual(sfc.value, new_value)
Beispiel #16
0
 def test_iter_2(self):
     record = MarcRecord().add(100, 'Field 100') \
         .add(200, SubField('a', 'SubA'), SubField('b', 'SubB'))
     i = iter(record)
     f = next(i)
     self.assertEqual(f.tag, 100)
     f = next(i)
     self.assertEqual(f.tag, 200)
     ok = False
     try:
         next(i)
     except StopIteration:
         ok = True
     self.assertTrue(ok)
Beispiel #17
0
 def test_iter_3(self):
     field = RecordField(100, SubField('a', 'SubA'), SubField('b', 'SubB'))
     i = iter(field)
     sf = next(i)
     self.assertEqual(sf.code, 'a')
     self.assertEqual(sf.value, 'SubA')
     sf = next(i)
     self.assertEqual(sf.code, 'b')
     self.assertEqual(sf.value, 'SubB')
     ok = False
     try:
         next(i)
     except StopIteration:
         ok = True
     self.assertTrue(ok)
Beispiel #18
0
 def test_iadd_1(self):
     record = MarcRecord()
     self.assertEqual(len(record.fields), 0)
     record += RecordField(100, 'Field 100')
     self.assertEqual(len(record.fields), 1)
     record += RecordField(200, SubField('a', 'SubA'))
     self.assertEqual(len(record.fields), 2)
Beispiel #19
0
    def write_dummy_records(self, database: str):
        sf = SubField
        for i in range(10):
            # Создаем запись
            record = MarcRecord()
            record.database = database

            # Наполняем её полями: первый автор
            record.add(700, sf('a', 'Миронов'), sf('b', 'А. В.'),
                       sf('g', 'Алексей Владимирович'))

            # заглавие
            record.add(200, sf('a', f'Работа с ИРБИС64: версия {i}.0'),
                       sf('e', 'руководство пользователя'))

            # выходные данные
            record.add(210, sf('a', 'Иркутск'), SubField('c', 'ИРНИТУ'),
                       sf('d', '2018'))

            # рабочий лист
            record.add(920, 'PAZK')

            # Отсылаем запись на сервер.
            # Обратно приходит запись, обработанная AUTOIN.GBL
            self.connection.write_record(record)
            print(f'Write record: {i}')
            print()
Beispiel #20
0
 def test_isub_1(self):
     f100 = RecordField(100, 'Field 100')
     f200 = RecordField(200, SubField('a', 'SubA'))
     record = MarcRecord(f100, f200)
     record -= (f100, f200)
     self.assertEqual(len(record.fields), 0)
     record -= (f100, f200)
     self.assertEqual(len(record.fields), 0)
Beispiel #21
0
 def test_14_write_record(self):
     record = MarcRecord()
     record.add(200, SubField('a', 'Сгенерированная запись'))
     record.add(300, 'Комментарий')
     record.add(700, SubField('a', 'Пайтон'), SubField('b', 'М.'),
                SubField('g', 'Монти'))
     record.add(910, SubField('a', '0'), SubField('b', '1'),
                SubField('c', '?'), SubField('d', 'ФКХ'))
     print('Write record')
     max_mfn = self.connection.write_record(record)
     print('New max MFN=', max_mfn, sep='')
     print(record)
     print()
Beispiel #22
0
 def test_write_text_record(self):
     sf = SubField
     with random_text_file() as stream:
         for i in range(10):
             record = MarcRecord()
             record.add(700, sf('a', 'Миронов'), sf('b', 'А. В.'),
                        sf('g', 'Алексей Владимирович'))
             record.add(200, sf('a', f'Работа с ИРБИС64: версия {i}.0'),
                        sf('e', 'руководство пользователя'))
             record.add(210, sf('a', 'Иркутск'), SubField('c', 'ИРНИТУ'),
                        sf('d', '2018'))
             record.add(920, 'PAZK')
             write_text_record(stream, record)
Beispiel #23
0
 def test_write_record_01(self):
     sf = SubField
     with random_binary_file() as stream:
         record = MarcRecord()
         record.add(700, sf('a', 'Миронов'), sf('b', 'А. В.'),
                    sf('g', 'Алексей Владимирович'))
         record.add(200, sf('a', f'Работа с ИРБИС64: версия 0.0'),
                    sf('e', 'руководство пользователя'))
         record.add(210, sf('a', 'Иркутск'), SubField('c', 'ИРНИТУ'),
                    sf('d', '2018'))
         record.add(920, 'PAZK')
         iso.write_record(stream, record, UTF)
     self.assertTrue(stream.name)
Beispiel #24
0
 def test_33_format_record(self):
     sf = SubField
     record = MarcRecord()
     record.add(700, sf('a', 'Миронов'), sf('b', 'А. В.'),
                sf('g', 'Алексей Владимирович'))
     record.add(200, sf('a', f'Работа с ИРБИС64: версия 1.0'),
                sf('e', 'руководство пользователя'))
     record.add(210, sf('a', 'Иркутск'), SubField('c', 'ИРНИТУ'),
                sf('d', '2018'))
     record.add(920, 'PAZK')
     text = self.connection.format_record('@brief', record)
     self.assertEqual(
         text, 'Миронов, Алексей Владимирович. Работа с ИРБИС64: '
         'версия 1.0 [Текст] : руководство пользователя, 2018')
Beispiel #25
0
    def test_write_record_2(self):
        sf = SubField
        with random_binary_file() as stream:
            for i in range(10):
                record = MarcRecord()
                record.add(700, sf('a', 'Миронов'), sf('b', 'А. В.'),
                           sf('g', 'Алексей Владимирович'))
                record.add(200, sf('a', f'Работа с ИРБИС64: версия {i}.0'),
                           sf('e', 'руководство пользователя'))
                record.add(210, sf('a', 'Иркутск'), SubField('c', 'ИРНИТУ'),
                           sf('d', '2018'))
                record.add(920, 'PAZK')
                iso.write_record(stream, record, UTF)
            filename = stream.name

        with open(filename, 'rb') as fh:
            count = 0
            while True:
                record = iso.read_record(fh, UTF)
                if record is None:
                    break
                self.assertEqual(len(record.fields), 4)
                count += 1
        self.assertEqual(count, 10)
Beispiel #26
0
def read_record(stream: BinaryIO, charset=ANSI) -> Optional[MarcRecord]:
    """
    Чтение записи из файла в формате ISO 2709.

    :param stream: Файл или файлоподобный объект
    :param charset: Кодировка
    :return: Декодированная запись либо None
    """

    # Считываем длину записи
    marker = stream.read(5)
    if len(marker) != 5:
        return None

    # а затем и ее остаток
    record_length = parse_int(marker)
    need = record_length - 5
    tail = stream.read(need)
    if len(tail) != need:
        return None

    # Простая проверка, что мы имеем дело с нормальной ISO-записью
    record = marker + tail
    if record[record_length - 1] != RECORD_DELIMITER:
        return None

    # Превращаем запись в Unicode
    indicator_length = parse_int(record[10:11])
    base_address = parse_int(record[12:17])

    # Начинаем собственно конверсию
    result = MarcRecord()

    # Пошли по полям при помощи справочника
    directory = MARKER_LENGTH
    while record[directory] != FIELD_DELIMITER:
        # если нарвались на разделитель, значит, справочник закончился

        tag = parse_int(record[directory:directory + 3])
        field_length = parse_int(record[directory + 3:directory + 7])
        field_offset = parse_int(
            record[directory + 7:directory + 12]) + base_address
        field = RecordField(tag)
        result.fields.append(field)

        if tag < 10:
            # фиксированное поле
            # не может содержать подполей и индикаторов
            field.value = record[field_offset:field_offset + field_length -
                                 1].decode(charset)
        else:
            # поле переменной длины
            # содержит два однобайтных индикатора
            # может содержать подполя
            start = field_offset + indicator_length
            stop = field_offset + field_length - indicator_length + 1
            position = start

            # ищем значение поля до первого разделителя
            while position < stop:
                if record[start] == SUBFIELD_DELIMITER:
                    break
                position += 1

            # если есть текст до первого раздлителя, запоминаем его
            if position != start:
                field.value = record[start:position].decode(charset)

            # просматриваем подполя
            start = position
            while start < stop:
                position = start + 1
                while position < stop:
                    if record[position] == SUBFIELD_DELIMITER:
                        break
                    position += 1
                subfield = SubField(chr(record[start + 1]),
                                    record[start + 2:position].decode(charset))
                field.subfields.append(subfield)
                start = position

        # переходим к следующему полю в справочнике
        directory += 12

    return result
Beispiel #27
0
 def test_bool_3(self):
     sf = SubField()
     self.assertFalse(bool(sf))
Beispiel #28
0
 def test_bool_2(self):
     sf = SubField('a')
     self.assertFalse(bool(sf))
Beispiel #29
0
 def test_bool_1(self):
     sf = SubField('a', 'Some text')
     self.assertTrue(bool(sf))
Beispiel #30
0
 def test_assign_1(self):
     first = SubField('a', 'Some text')
     second = SubField('b', 'Other text')
     second.assign_from(first)
     self.assertEqual(first.code, second.code)
     self.assertEqual(first.value, second.value)