Skip to content

Latest commit

 

History

History
313 lines (228 loc) · 37.4 KB

CHANGELOG.md

File metadata and controls

313 lines (228 loc) · 37.4 KB

CHANGELOG

[1.3.1] - 2022-11-11

  • Небольшая доработка лексера и парсера контролей.
    • При генерации правил больше не возникают конфликты, которые до этого решались автоматически ply'ем.
  • Исправил ошибку при проверке котроля в формуле которого указан раздел отсутствующий в отчёте и не описанный в самом шаблоне.
  • Поправил лицензию, дополнил README и setup.py.

[1.3.0] - 2022-11-09

  • Исправлена ошибка из-за которой при проверках контролей со спецификами стали учитываться строки без специфик.
    • Оказалось, что более нет необходимости в проверках на "игнорируемые" специфики при итерации по строкам.
  • Небольшой рефакториг методов класса ElemLogic.
  • Выполненные доработки снизили кол-во ложных результатов проверок по сравнению с версией 1.2.6.

[1.3.0.dev0] - 2022-02-21

  • Парсер отчёта.
    • Выполнен полный рефакторинг модуля.
    • Все классы обзавелись методом iter взамен items для итерации по их элементам. Метод вобрал в себя функции прежнего items, а так же часть условий болтавшихся в классе ElemList, включая возврат "заглушек" если элемента(-ов) нет.
    • В Row метод filter переименован в match, условия стали понятнее.
    • В Row метод добавления колонки (графы) добавляет в словарь не значение, а именованный кортеж Column одно из полей которого хранит код этой колонки.
    • В Report метод чтения заголовков создаёт список именованных кортежей Title, вместо обычного кортежа из двух элементов.
    • Удалены бесполезные флаги.
  • Список элементов распаршенной формулы контроля (ElemList).
    • Убрана конвертация списка кодов в множество (set).
    • Для единообразия, разделы теперь так же храняться в классе списком.
    • Списки отдельно взятых специфик теперь храняться отдельными полями (s1, s2, s3).
    • Специфики теперь подготавливаются не до чтения отчёта, а в процессе, для каждой строки.
      • Механизм получения параметров и каталогов для "развертывания" специфик переехал в класс Specific.
      • Единожды подготовленные специфики сохраняются в словарь для последующего использования.
    • При чтении отчёта добавлена проверка наличия описания формата для строки, если формата нет, проверка прекращается.
  • Вспомогательные классы.
    • В SchemaFormats добавлен отдельный метод проверки наличия формата для строки. Необходим для пропуска контролей в которых указаны строки, для которых нет формата.
    • В SchemaFormats методы получения кода и параметров специфики больше не принимают и не возвращают код колонки если не найден код специфики.
      • Спорная ситуация. В формуле контроля есть специфики, но в блоке форматов нет ноды с типом S, указывающим на код колонки с атрибутом справочника.
    • В NestedDefaultdict метод getall переименован в get, новый getall просто возвращает список всех значений.
  • Везде где проводилась работа со спецификами, вместо индекса используется сам ключ специфики (s1, s2, s3).

[1.2.6] - 2022-01-11

  • Исправил ошибку проверки значения на вхождение в диапазон когда границы диапазона являются числами с точкой.
  • Исправил метод применения функций к элементу (Elem). Из-за передачи самого элемента в функцию, к нему применялись все действия подряд, давая на выходе неверный результат. Теперь для каждого действия передаётся копия самого элемента.
  • Исправил разбор формулы, где логическому элементу добавляется функция.
    • Так же реализовал применение этих функции к левому операнду.

[1.2.5] - 2021-11-12

  • Исправил ошибку из-за которой не удавалось получить набор параметров для определения специфик строки.
  • Исправил ошибку проверки формата ячейки если значения в ней нет. Теперь для проверки берётся дефолтное значение из схемы если оно там есть.
  • Правки не влияющие на работоспособность и нацеленные на облегчение отладки.
    • Поправил передачу параметров при инициализации элемента Elem. Конвертация в set строки, приводила к разбиению кодов длиной более одного символа.
    • Добавил __repr__ для Nullablefloat, который явно вызывается при принте элемента и возвращает значение 'null' если объект инициализирован без передачи значения.

[1.2.4] - 2021-11-03

  • Исправил ошибку при проверке контроля с формулой вида SUM{}|=|1|=|SUM{}.
  • Исправил ошибку из-за которой при фильтрации строк по спецификам не возвращалась ни одна строка.
    • Причина была в том, что не учитывалась возможность дефолтного значения специфик для строк отчёта где они явно не указаны.

[1.2.3] - 2021-08-02

  • Исправил разбор формулы контроля/условия. В них так же есть коды вида "01", тогда как в отчёте в коде нет нуля.
  • Исправил проверку дубликатов строк. Ошибкой было считать дубли по всему отчёту. Теперь они считаются в рамках каждого раздела.

[1.2.2] - 2021-07-30

  • Исправил ошибку из-за которой значение, которое должно было быть NULL и заменяться методом isnull, не заменялось.
    • Причиной было то, что строки заполнялись колонками со значением 0, которое, очевидно, не NULL. Значение не мешало подсчётам, кроме случаев когда в формуле контроля есть метод isnull. Решением стало создание своего класса обёртки над типом float, который хранит признак NULL и передаёт его при математичеких операциях результату вычислений.

[1.2.1] - 2021-04-20

  • В сообщениях об ошибках проверки полей заголовка теперь возвращаются названия полей, где это возможно, и их идентификатор.
  • Исправил ошибку проверки периода контроля в формуле которого есть оператор "<>".
  • Исправил проверку отчёта в графе которого есть значение, которое нельзя привести к числу. Значение будет выставлено в None.

[1.2.0] - 2021-04-13

  • Изменение логики итерации по строкам раздела и обработке пустых строк.
    • Методы items и get_rows класса Section больше не принимают словарь специфик. Фильтрация будет происходить снаружи.
    • Метод get_rows возвращает список с одной пустой строкой "заглушкой" если эта строка отсутствует в отчёте.
    • Метод проверки строки на соответствие спицификам перенес из Section в Row и переименовал в filter.
    • Из класса ElemList удалены методы заполнения строки элементами заглушками если вернулся пустой список, так как get_rows теперь всегда вернёт хотя бы одну строку. Колонками её заполнит метод, который обрабатывает не пустой список.
  • Исправил ошибку проверки формата отчёта по схемам в которых отсутствуют параметры, определяющие формат проверок для специфики указанного раздела и строки.
  • Сделал хэлпер ограниченно имитирующий MultiDict из одноименной библиотеки. Помогает в работе с мультистроками.
  • Отрефакторил метод _zip. Вынес каждый шаг в отдельный метод для читабельности.
  • Перед логической проверкой теперь происходит проверка, что ни один элемент не пустой. Иначе будет возбуждено исключение NoElemToCompareError.
  • Методы проверки контролей условий и правил обёрнуты декораторами для отлова исключения NoElemToCompareError. Декоратор возвращает пустой список если поймает его.
  • Поправил проверку специфики на вхождение в пересечение справочников. Ранее проверялось лишь вхождение в справочинк приложение.

[1.1.1] - 2021-04-07

  • Исправил ошибку разбора контролей с пробелами в операторах сравнения.
  • Исправил ошибку разбора контролей с символами переноса строк в кодах/спецификах.
  • Исправил ошибку разбора формулы проверки периода. Появились формулы со значениями вида "01". Требуется приводить к числу, избавляясь от нуля.
  • Исправил ошибку сравнения элементов. Теперь после сравнения, левый элемент, кроме списка контролей, получает и значение правого элемента.

[1.1.0] - 2021-03-26

  • Исправил проверку ОКПО. 10-значные номера не будут выдавать ошибку.
  • Доработал класс Elem. Теперь он как и ElemList умеет принимать и применять к значению функцию (только одну и только математическую).
  • Доработал проверку множества логических условий OR. Теперь в результатах не будет возвращаться множество дублей ложных ошибок.

[1.0.0] - 2021-03-16

  • Исправил ошибку при проверке контроля с формулой вида SUM{[5][*][*]}, где раздел отчёта, указанный в арументе формулы, пуст.
  • Исправил ошибку в методе isnull. Вместо конструкции val or replace, теперь явное сравнение с None.
  • Исправил обработку исключения PrevPeriodNotImpl при проверке контролей. Теперь оно корректно добавляется в список ошибок если проверка выполняется с флагом skip_warns=False.
  • Исключения связанные с ошибками разбора условия и правила контроля теперь не вкладываются в список, а райзятся наружу с идентификатором контроля. Для пользователя ошибка будет выглядеть как и прежде ("Непредвиденная ошибка"). Для разработчика понятный трэйсбэк, вместо совершенно другого исключения, возникающего на более позднем этапе проверки.
  • В сообщении ошибки дублирования строк, поправил форматирование параметров дублирующейся строки.
  • Ещё раз (скорее всего окончательно) изменил формат ответа. Поле message переименовал в description, поле tip в level. В поле level возвращается число (integer). 1 - бывшее True, 0 - бывшее False.

[0.7.3] - 2021-02-24

  • Метод проверки возможности проведения логического контроля, добавленный в версии 0.6.0, удалён. Проверка оказалась не только бесполезной, но и приводящей к неверному результату для некоторых схем. Теперь логический контроль происходит всегда.
  • Удалил из элементов устаревшие, более не используемые поля-признаки: stub (заглушка), scalar (скаляр), blank_row (пустая строка).
  • В сообщениях ошибок проверки контролей поменял местами значения левого и правого элементов. Были перепутаны.
  • Вынес признак обязательности из сообщения в отдельное поле - tip.
    • Для непредвиденной ошибки (0.0) значение равно False.
    • Для ошибок проверки атрибутов, полей заголовка и формата True.
    • Для контролей зависит от значения из схемы.

[0.7.2] - 2021-02-20

  • Исправил ошибку при проверке контроля в котором есть диапазон специфик вида хх.хх.хх-хх.хх.хх.
    • Диапазон такого вида пропускается при парсинге схемы. Он "разворачивается" непосредственно перед проверкой на основании справочника и параметров каждой специфики.
    • При парсинге схемы, кроме справочника-словарая создаю список одних только идентификаторв. Призван помочь в "разворачивании" диапазонов специфик.
  • Сделал пару хэлперов.
    • Словарь параметров проверки форматов с методом определения набора параметров специфики по её индексу.
    • Словарь, создающий и возвращающий defaultdict(default_factory) при попытке получить значение по отсутствующему ключу. Иначе говоря, чуть более прозрачная версия defaultdict(lambda: defaultdict(default_factory)).
  • Рефакторинг.
    • Вместо нод с правилами проверки форматов беру непосредственно словарь атрибутов этой ноды.
    • Все методы и переменные, связанные со справочником "dic", переименовал в "catalog".
    • Все методы и переменные, связанные с графами "entry" в классах модуля elements, переименовал в "columns" и производные. Для унификации с именованием этих сущностей в отчёте.
    • Написал doc-string'и методам всех классов отвечающих за парсинг отчёта и работу с ним.
    • Добавил классу строки отчёта метод получения значения специфики по её индесу.
    • Заменил метод нахождения НОД на нативный из модуля math.

[0.7.1] - 2021-02-12

  • Теперь на вход передаются строго ElementTree, Element, bytes, file name/path, или file-like объекты.
  • Добавил сортировку по возрастанию при итерациям по строкам раздела отчёта. Ранее порядок не гарантировался, из-за чего при определенном сочетаний ошибок, результат проверки мог отличаться от запуска к запуску.
  • Переработал обработку ошибок в "блоке" проверок формата.
    • Все ошибки перенесены в отдельный модуль и выполнены в виде Exception'ов.
    • Некоторые ошбики общего вида, разделились на несколько самостоятельных. Следовательно, появились новые коды ошибок, а у некоторых старых они изменились.
    • При возбуждении какой либо ошибки, проверка прекращается. Другими словами, проверки стали "ленивыми".
    • Добавил исключения для ситуаций, когда для проверяемого раздела или значения не указаны правила в шаблоне.
  • Выписал все возможные на данный момент коды ошибок в docs.md
  • Исправил ошибку в сообщениях ошибок проверки специфик.

[0.7.0] - 2020-11-06

  • Изменил формат ответа.
    • Теперь это не список строк, а список словарей вида {'code': '1.1', 'name': 'Проверка атрибутов', 'message': 'Указан недопустимый год'}
    • code - код ошибки в формате <номер группы проверок>.<номер проверки>. Для проверки контролей, "номер проверки" является номером контроля в схеме.
    • name - название группы проверок.
    • message - сообщение об ошибке.
  • Рефакторинг.
    • Сгруппировал проверки и вынес их из парсера схемы в собственные классы.
    • Комплексные проверки, такие как, проверка специфик, значений, формул периодов и контролей также выделил в отдельные классы "инспекторы".
    • Мелкие оптимизации и доработки.

[0.6.3] - 2020-09-22

  • Доработка проверки периодов. Если формат периода отчета отличается от описанного формата в документации. Происходит попытка конвертации его допустимый. Механизм конвертации должен полностью повторять аналогичный в оффициальной программе от РосСтата.
  • Вернул на место проверку формата значений ячеек. Удалил по невнимательности.

[0.6.2] - 2020-09-21

  • Доработка проверок формата строк и значений в графах:
    • Реализовал пропущенную проверку строки с типом 5. Выяснил, что проверки с типом 4 и 5 выполняются над спецификами строк, а не над значениями в графах.
    • В классе FormatChecker выделил обработку строки и значения в графе с выбором метода проверки в отдельные методы. Выполнил небольшой рефакторинг.
    • В классе Schema добавил парсинг специфик в отдельный словарь и переработал парсинг справочников, так как нужно учитывать все атрибуты в нодах term.
  • Добавил лицензию.

[0.6.1] - 2020-09-17

  • Реализовал следующие проверки:
    • Наличия в отчёте раздела в соответствии со схемой.
    • Формат ОКПО указанного в отчете в блоке title.
    • Формат года указанного в отчете.

[0.6.0] - 2020-09-16

  • Добавил отчету и строкам свойства blank. Положительное значение у строки говорит о том, что в строке нет граф. У отчёта, о том, что во всём отчете нет ни одной графы, соответственно.
    • Пустой отчет теперь не проверяется, вернётся пустой список ошибок.
  • Специфика вида "XX" у строки отчёта, теперь считается как удовлетворяющая любому значению специфики в контроле.
  • При проверке контроля, создаваемые элементы принимают параметр-признак пустой строки.
  • Переработал механизм логических проверок в классе ElemLogic.
    • Признаки скаляра и "заглушки" устратили свою силу, но веременно остануться в коде, пока не будет уверенности в их полной бесполезности.
    • Метод проверки возможности проведения логического контроля теперь возвращает отрицательный результат только в одном случае. Если проверяемая формула является условием (condition), оператор проверки не относиться к логическим (or, and) и оба элемента являются "заглушками" из пустой строки. Интерпретируется это как ошибка проведения логического контроля.
    • Исправил неправильный результат проверок если в формуле есть логический оператор "or".

[0.5.1] - 2020-09-15

  • Исправил суммирование элементов.
  • Коды раздела/строк/графов схемы теперь тоже проходят трансформацию строка -> число -> строка, так как и в схемах замечены коды вида "01".
  • Исправил добавление в список ошибок сообщения о непредвиденной ошибке проверки формата ячейки.
  • Исправил установку погрешности для условий (condition).

[0.5.0] - 2020-09-11

  • Вновь переработал инициализацию элементов из за проблем возникающих в редких случаях когда в формуле есть проверки между элементами, значения осей которых равно "*".
  • Добавил в класс Schema параметр с размерностью (dimension), заполняющийся при парсинге схемы. Имеет формат {"1": ["1", "2"]}, где ключ - код раздела, значение - список возможных кодов колонок.
    • Параметр передаётся в ControlChecker и учитывается при проверке в случаях когда значение по оси колонок равно - "*".
  • В классе Section методу items добавил параметр codes и specs, что позволило полностью убрать итерацию по списку кодов внутрь самого класса. В классе Row аналогичные изменения.
  • Переработал проверку формул в PeriodClause. В некоторых схемамх есть формулы по формату отличающиеся от описанного в документации (прим. (&NP=3 or &NP=6 or &NP=9)). Теперь для всех формул кроме проверки на вхождение в список единый механизм. Нормализация строки, разбиение на отдельные части, сборка с подстановкой проверяемого значения и выполнение.
  • Добавил класс ControlParams собравший в себя все параметры передаваемые между элементами при проверке.
  • В классе Report атрибут _period_type теперь по умолчанию None.
    • Убрана проверка периода если он не был определен.
  • Добавил параметр для пропуска предупреждении о нереализованной проверке контролей со значениями за прошлый период.
  • Исправил ошибку при которой могло происходить деление на None.

[0.4.5] - 2020-09-01

  • Поправил ошибку при которой контроль, который не должен был пройти, проходил из-за положительной проверки погрешности. Теперь погрешность по умолчанию равна -1.
  • Исправил получение idp из корня шаблона. По аналогии с ошибкой #2.
  • Переделал проверку полей блока title и добавил проверку значений и наличия обязательного поля.
  • Сделал проверку дубликатов строк.

[0.4.4] - 2020-08-31

  • Исправил получение периода из отчета если передан отчёт типа lxml.etree._Element (Issue #2).
  • Исправил проверку периода контроля для формулы вида (&NP in(6)) с 1 элементом в списке (Issue #3).
  • Исправил вызов метода _apply_funcs у элемента ElemSelector. Забыл передать параметры fault и precision (Issue #4).
  • Добавил проверку использования в формуле контролей элементов со значениями за прошлый период. Возвращаю сообщение об ошибке, так как такой функционал не реализован и неизвестно когда это удастся сделать.

[0.4.3] - 2020-08-31

  • Исправил парсинг отчета в тайтле которого есть ноды без атрибута value (Issue #1).
  • Исключил парсинг "пустых" контролей, выполняя strip у формулы перед проверкой (Issue #5).
  • Исправил выполнение контролей с элементами со спецификой равной "0", добавив её к игнорируемым.
  • Исправил выполнение контролей с функцией ABS, повысив её приоритет над математическими операциями.

[0.4.2] - 2020-08-28

  • Добавил указание обязательности в сообщение о непройденном контроле.
  • Добавил проверку погрешности при проверке выполнения логического условия.

[0.4.1] - 2020-08-27

  • Добавил исключений и переработал места возбуждения и отлова их.
  • Рефакторинг.
    • Написал док-стринги к методам чекеров и методам парсера-лексера у которых их не было.
    • Разделил чекеры и перенес в отдельную директорию.
    • Рефакторинг класса Schema.
    • Рефакторинг класса ControlChecker.
  • В методах проверки логических условий класса PeriodClause исправил ошибку при проверке оператора равенста "=" для замены его на "==".

[0.4.0] - 2020-08-26

  • Реализовал проверку формата заполнения полей отчета всех типов кроме 5-ого. Пока не ясно как она должна проводится.
  • Исправил проверку полей которые обязательны для заполнения (inputType="1"). Исключение составляют мультистроки. Для них похоже должна быть своя логика проверки.

[0.3.0] - 2020-08-24

  • Реализовал проверку периодов:
    • Шаблона и отчета.
    • Условия выполнения контроля.
  • Исправил ошибку неполного заполнения строки "заглушками" если её нет в отчёте.
  • Иcправил парсинг формул контролей вида SUM{[][][]}+SUM{[][][]}. Приоритет функции SUM должен быть выше чем у математических операций.

[0.2.1] - 2020-08-21

  • Проверка условий для проведения контроля теперь не добавляется в список ошибок. Метод возвращает булево значение.
  • Добавил в элемент атрибуты определяющие его тип как "заглушку" или скаляра. Если оба атрибута False, то это реальное значение из отчёта.
  • Поправил создание элементов. Отталкиваюсь не от размерности, а от необходимых для контроля значений. Отсутствующие в отчете значения, как и планировалось, замещаются элементом со значением ноль и признаком, что он "заглушка".
  • Перед проверкой выполнения логических условий теперь проверяются "типы" элементов. Логический контроль не выполняется если оба элемента "заглушки", либо один элемент "заглушка", а другой скаляр.
  • Поправил выполнение операций round и isnull. Забыл про возможность наличия аргумента для обрезки значения.
  • Поправил лексер-парсер для формул где метод isnull вложен в любой другой.

2020-08-20

  • Переработал парсинг отчета с учетом мультилайнов.
    • Реализовал вспомогательные дата-классы для раздела и строки.
    • Индексы разделов/строк/графов теперь трансформируются сначала в число (если это возможно), затем обратно в строку. Так как есть ключи вида "01", однако в формуле "1".
  • Изменил формат и тип сообщения о непройденном контроле.
  • Доработал инициализацию элементов языка контролей.
    • Координаты и специфики теперь в множестве типа set.
    • Создание элементов проиходит отталкиваясь от отчета. Отсутствующие элементы НЕ замещаются элементом со значением None. Это временное решение так как надо отталкиваться от размерности указанной в схеме и замещать отсутствующие элементами со значением 0. В ближайшее время будет переделано.
  • Поправил/оптимизировал лексер-парсер так как допускается использование функции SUM без круглых скобок.
  • Прочие мелкие исправления.

2020-08-18

  • Исправил ошибку при работе с элементами значение которых None. Причина возникновения, отсутствие метода isnull в формуле для незаполненной или полностью отсутствующей ячейки. В таком случае её значение так и будет оставаться None при проведении всех операций, а при сравнении будет интерпритироваться как ошибка.
  • Исправил округление по умолчанию. Исходя из документации оно должно применяться к значениям элементов только при сравнениях их друг с другом.
  • Исправил парсинг контролей в которых есть числа с запятой.
  • Добавил setup.py

Прошлое

  • Готов лексер и парсер для разбора формул контролей.
  • Готовы парсеры для разбора отчета и шаблона с проверками.
  • Сделал классы болванки для проверки формата заполнения ячеек и прогона контролей.