- Небольшая доработка лексера и парсера контролей.
- При генерации правил больше не возникают конфликты, которые до этого решались автоматически ply'ем.
- Исправил ошибку при проверке котроля в формуле которого указан раздел отсутствующий в отчёте и не описанный в самом шаблоне.
- Поправил лицензию, дополнил README и setup.py.
- Исправлена ошибка из-за которой при проверках контролей со спецификами стали учитываться строки без специфик.
- Оказалось, что более нет необходимости в проверках на "игнорируемые" специфики при итерации по строкам.
- Небольшой рефакториг методов класса
ElemLogic
. - Выполненные доработки снизили кол-во ложных результатов проверок по сравнению с версией 1.2.6.
- Парсер отчёта.
- Выполнен полный рефакторинг модуля.
- Все классы обзавелись методом 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).
- Исправил ошибку проверки значения на вхождение в диапазон когда границы диапазона являются числами с точкой.
- Исправил метод применения функций к элементу (Elem). Из-за передачи самого элемента в функцию, к нему применялись все действия подряд, давая на выходе неверный результат. Теперь для каждого действия передаётся копия самого элемента.
- Исправил разбор формулы, где логическому элементу добавляется функция.
- Так же реализовал применение этих функции к левому операнду.
- Исправил ошибку из-за которой не удавалось получить набор параметров для определения специфик строки.
- Исправил ошибку проверки формата ячейки если значения в ней нет. Теперь для проверки берётся дефолтное значение из схемы если оно там есть.
- Правки не влияющие на работоспособность и нацеленные на облегчение отладки.
- Поправил передачу параметров при инициализации элемента
Elem
. Конвертация вset
строки, приводила к разбиению кодов длиной более одного символа. - Добавил
__repr__
дляNullablefloat
, который явно вызывается при принте элемента и возвращает значение 'null' если объект инициализирован без передачи значения.
- Поправил передачу параметров при инициализации элемента
- Исправил ошибку при проверке контроля с формулой вида
SUM{}|=|1|=|SUM{}
. - Исправил ошибку из-за которой при фильтрации строк по спецификам не возвращалась ни одна строка.
- Причина была в том, что не учитывалась возможность дефолтного значения специфик для строк отчёта где они явно не указаны.
- Исправил разбор формулы контроля/условия. В них так же есть коды вида "01", тогда как в отчёте в коде нет нуля.
- Исправил проверку дубликатов строк. Ошибкой было считать дубли по всему отчёту. Теперь они считаются в рамках каждого раздела.
- Исправил ошибку из-за которой значение, которое должно было быть NULL и заменяться методом isnull, не заменялось.
- Причиной было то, что строки заполнялись колонками со значением 0, которое, очевидно, не NULL. Значение не мешало подсчётам, кроме случаев когда в формуле контроля есть метод isnull. Решением стало создание своего класса обёртки над типом float, который хранит признак NULL и передаёт его при математичеких операциях результату вычислений.
- В сообщениях об ошибках проверки полей заголовка теперь возвращаются названия полей, где это возможно, и их идентификатор.
- Исправил ошибку проверки периода контроля в формуле которого есть оператор "<>".
- Исправил проверку отчёта в графе которого есть значение, которое нельзя привести к числу. Значение будет выставлено в None.
- Изменение логики итерации по строкам раздела и обработке пустых строк.
- Методы
items
иget_rows
классаSection
больше не принимают словарь специфик. Фильтрация будет происходить снаружи. - Метод
get_rows
возвращает список с одной пустой строкой "заглушкой" если эта строка отсутствует в отчёте. - Метод проверки строки на соответствие спицификам перенес из
Section
вRow
и переименовал вfilter
. - Из класса
ElemList
удалены методы заполнения строки элементами заглушками если вернулся пустой список, так какget_rows
теперь всегда вернёт хотя бы одну строку. Колонками её заполнит метод, который обрабатывает не пустой список.
- Методы
- Исправил ошибку проверки формата отчёта по схемам в которых отсутствуют параметры, определяющие формат проверок для специфики указанного раздела и строки.
- Сделал хэлпер ограниченно имитирующий
MultiDict
из одноименной библиотеки. Помогает в работе с мультистроками. - Отрефакторил метод
_zip
. Вынес каждый шаг в отдельный метод для читабельности. - Перед логической проверкой теперь происходит проверка, что ни один элемент не пустой. Иначе будет возбуждено исключение
NoElemToCompareError
. - Методы проверки контролей условий и правил обёрнуты декораторами для отлова исключения
NoElemToCompareError
. Декоратор возвращает пустой список если поймает его. - Поправил проверку специфики на вхождение в пересечение справочников. Ранее проверялось лишь вхождение в справочинк приложение.
- Исправил ошибку разбора контролей с пробелами в операторах сравнения.
- Исправил ошибку разбора контролей с символами переноса строк в кодах/спецификах.
- Исправил ошибку разбора формулы проверки периода. Появились формулы со значениями вида "01". Требуется приводить к числу, избавляясь от нуля.
- Исправил ошибку сравнения элементов. Теперь после сравнения, левый элемент, кроме списка контролей, получает и значение правого элемента.
- Исправил проверку ОКПО. 10-значные номера не будут выдавать ошибку.
- Доработал класс Elem. Теперь он как и ElemList умеет принимать и применять к значению функцию (только одну и только математическую).
- Доработал проверку множества логических условий OR. Теперь в результатах не будет возвращаться множество дублей ложных ошибок.
- Исправил ошибку при проверке контроля с формулой вида
SUM{[5][*][*]}
, где раздел отчёта, указанный в арументе формулы, пуст. - Исправил ошибку в методе isnull. Вместо конструкции
val or replace
, теперь явное сравнение с None. - Исправил обработку исключения PrevPeriodNotImpl при проверке контролей. Теперь оно корректно добавляется в список ошибок если проверка выполняется с флагом skip_warns=False.
- Исключения связанные с ошибками разбора условия и правила контроля теперь не вкладываются в список, а райзятся наружу с идентификатором контроля. Для пользователя ошибка будет выглядеть как и прежде ("Непредвиденная ошибка"). Для разработчика понятный трэйсбэк, вместо совершенно другого исключения, возникающего на более позднем этапе проверки.
- В сообщении ошибки дублирования строк, поправил форматирование параметров дублирующейся строки.
- Ещё раз (скорее всего окончательно) изменил формат ответа. Поле message переименовал в description, поле tip в level. В поле level возвращается число (integer). 1 - бывшее True, 0 - бывшее False.
- Метод проверки возможности проведения логического контроля, добавленный в версии 0.6.0, удалён. Проверка оказалась не только бесполезной, но и приводящей к неверному результату для некоторых схем. Теперь логический контроль происходит всегда.
- Удалил из элементов устаревшие, более не используемые поля-признаки: stub (заглушка), scalar (скаляр), blank_row (пустая строка).
- В сообщениях ошибок проверки контролей поменял местами значения левого и правого элементов. Были перепутаны.
- Вынес признак обязательности из сообщения в отдельное поле - tip.
- Для непредвиденной ошибки (0.0) значение равно False.
- Для ошибок проверки атрибутов, полей заголовка и формата True.
- Для контролей зависит от значения из схемы.
- Исправил ошибку при проверке контроля в котором есть диапазон специфик вида
хх.хх.хх-хх.хх.хх
.- Диапазон такого вида пропускается при парсинге схемы. Он "разворачивается" непосредственно перед проверкой на основании справочника и параметров каждой специфики.
- При парсинге схемы, кроме справочника-словарая создаю список одних только идентификаторв. Призван помочь в "разворачивании" диапазонов специфик.
- Сделал пару хэлперов.
- Словарь параметров проверки форматов с методом определения набора параметров специфики по её индексу.
- Словарь, создающий и возвращающий
defaultdict(default_factory)
при попытке получить значение по отсутствующему ключу. Иначе говоря, чуть более прозрачная версияdefaultdict(lambda: defaultdict(default_factory))
.
- Рефакторинг.
- Вместо нод с правилами проверки форматов беру непосредственно словарь атрибутов этой ноды.
- Все методы и переменные, связанные со справочником "dic", переименовал в "catalog".
- Все методы и переменные, связанные с графами "entry" в классах модуля elements, переименовал в "columns" и производные. Для унификации с именованием этих сущностей в отчёте.
- Написал doc-string'и методам всех классов отвечающих за парсинг отчёта и работу с ним.
- Добавил классу строки отчёта метод получения значения специфики по её индесу.
- Заменил метод нахождения НОД на нативный из модуля math.
- Теперь на вход передаются строго ElementTree, Element, bytes, file name/path, или file-like объекты.
- Добавил сортировку по возрастанию при итерациям по строкам раздела отчёта. Ранее порядок не гарантировался, из-за чего при определенном сочетаний ошибок, результат проверки мог отличаться от запуска к запуску.
- Переработал обработку ошибок в "блоке" проверок формата.
- Все ошибки перенесены в отдельный модуль и выполнены в виде Exception'ов.
- Некоторые ошбики общего вида, разделились на несколько самостоятельных. Следовательно, появились новые коды ошибок, а у некоторых старых они изменились.
- При возбуждении какой либо ошибки, проверка прекращается. Другими словами, проверки стали "ленивыми".
- Добавил исключения для ситуаций, когда для проверяемого раздела или значения не указаны правила в шаблоне.
- Выписал все возможные на данный момент коды ошибок в docs.md
- Исправил ошибку в сообщениях ошибок проверки специфик.
- Изменил формат ответа.
- Теперь это не список строк, а список словарей вида {'code': '1.1', 'name': 'Проверка атрибутов', 'message': 'Указан недопустимый год'}
- code - код ошибки в формате <номер группы проверок>.<номер проверки>. Для проверки контролей, "номер проверки" является номером контроля в схеме.
- name - название группы проверок.
- message - сообщение об ошибке.
- Рефакторинг.
- Сгруппировал проверки и вынес их из парсера схемы в собственные классы.
- Комплексные проверки, такие как, проверка специфик, значений, формул периодов и контролей также выделил в отдельные классы "инспекторы".
- Мелкие оптимизации и доработки.
- Доработка проверки периодов. Если формат периода отчета отличается от описанного формата в документации. Происходит попытка конвертации его допустимый. Механизм конвертации должен полностью повторять аналогичный в оффициальной программе от РосСтата.
- Вернул на место проверку формата значений ячеек. Удалил по невнимательности.
- Доработка проверок формата строк и значений в графах:
- Реализовал пропущенную проверку строки с типом 5. Выяснил, что проверки с типом 4 и 5 выполняются над спецификами строк, а не над значениями в графах.
- В классе
FormatChecker
выделил обработку строки и значения в графе с выбором метода проверки в отдельные методы. Выполнил небольшой рефакторинг. - В классе
Schema
добавил парсинг специфик в отдельный словарь и переработал парсинг справочников, так как нужно учитывать все атрибуты в нодах term.
- Добавил лицензию.
- Реализовал следующие проверки:
- Наличия в отчёте раздела в соответствии со схемой.
- Формат ОКПО указанного в отчете в блоке title.
- Формат года указанного в отчете.
- Добавил отчету и строкам свойства blank. Положительное значение у строки говорит о том, что в строке нет граф. У отчёта, о том, что во всём отчете нет ни одной графы, соответственно.
- Пустой отчет теперь не проверяется, вернётся пустой список ошибок.
- Специфика вида "XX" у строки отчёта, теперь считается как удовлетворяющая любому значению специфики в контроле.
- При проверке контроля, создаваемые элементы принимают параметр-признак пустой строки.
- Переработал механизм логических проверок в классе
ElemLogic
.- Признаки скаляра и "заглушки" устратили свою силу, но веременно остануться в коде, пока не будет уверенности в их полной бесполезности.
- Метод проверки возможности проведения логического контроля теперь возвращает отрицательный результат только в одном случае. Если проверяемая формула является условием (condition), оператор проверки не относиться к логическим (or, and) и оба элемента являются "заглушками" из пустой строки. Интерпретируется это как ошибка проведения логического контроля.
- Исправил неправильный результат проверок если в формуле есть логический оператор "or".
- Исправил суммирование элементов.
- Коды раздела/строк/графов схемы теперь тоже проходят трансформацию
строка -> число -> строка
, так как и в схемах замечены коды вида "01". - Исправил добавление в список ошибок сообщения о непредвиденной ошибке проверки формата ячейки.
- Исправил установку погрешности для условий (condition).
- Вновь переработал инициализацию элементов из за проблем возникающих в редких случаях когда в формуле есть проверки между элементами, значения осей которых равно "*".
- Добавил в класс
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.
- Поправил ошибку при которой контроль, который не должен был пройти, проходил из-за положительной проверки погрешности. Теперь погрешность по умолчанию равна -1.
- Исправил получение idp из корня шаблона. По аналогии с ошибкой #2.
- Переделал проверку полей блока title и добавил проверку значений и наличия обязательного поля.
- Сделал проверку дубликатов строк.
- Исправил получение периода из отчета если передан отчёт типа
lxml.etree._Element
(Issue #2). - Исправил проверку периода контроля для формулы вида
(&NP in(6))
с 1 элементом в списке (Issue #3). - Исправил вызов метода
_apply_funcs
у элементаElemSelector
. Забыл передать параметры fault и precision (Issue #4). - Добавил проверку использования в формуле контролей элементов со значениями за прошлый период. Возвращаю сообщение об ошибке, так как такой функционал не реализован и неизвестно когда это удастся сделать.
- Исправил парсинг отчета в тайтле которого есть ноды без атрибута value (Issue #1).
- Исключил парсинг "пустых" контролей, выполняя strip у формулы перед проверкой (Issue #5).
- Исправил выполнение контролей с элементами со спецификой равной "0", добавив её к игнорируемым.
- Исправил выполнение контролей с функцией ABS, повысив её приоритет над математическими операциями.
- Добавил указание обязательности в сообщение о непройденном контроле.
- Добавил проверку погрешности при проверке выполнения логического условия.
- Добавил исключений и переработал места возбуждения и отлова их.
- Рефакторинг.
- Написал док-стринги к методам чекеров и методам парсера-лексера у которых их не было.
- Разделил чекеры и перенес в отдельную директорию.
- Рефакторинг класса Schema.
- Рефакторинг класса ControlChecker.
- В методах проверки логических условий класса PeriodClause исправил ошибку при проверке оператора равенста "=" для замены его на "==".
- Реализовал проверку формата заполнения полей отчета всех типов кроме 5-ого. Пока не ясно как она должна проводится.
- Исправил проверку полей которые обязательны для заполнения (inputType="1"). Исключение составляют мультистроки. Для них похоже должна быть своя логика проверки.
- Реализовал проверку периодов:
- Шаблона и отчета.
- Условия выполнения контроля.
- Исправил ошибку неполного заполнения строки "заглушками" если её нет в отчёте.
- Иcправил парсинг формул контролей вида SUM{[][][]}+SUM{[][][]}. Приоритет функции SUM должен быть выше чем у математических операций.
- Проверка условий для проведения контроля теперь не добавляется в список ошибок. Метод возвращает булево значение.
- Добавил в элемент атрибуты определяющие его тип как "заглушку" или скаляра. Если оба атрибута False, то это реальное значение из отчёта.
- Поправил создание элементов. Отталкиваюсь не от размерности, а от необходимых для контроля значений. Отсутствующие в отчете значения, как и планировалось, замещаются элементом со значением ноль и признаком, что он "заглушка".
- Перед проверкой выполнения логических условий теперь проверяются "типы" элементов. Логический контроль не выполняется если оба элемента "заглушки", либо один элемент "заглушка", а другой скаляр.
- Поправил выполнение операций round и isnull. Забыл про возможность наличия аргумента для обрезки значения.
- Поправил лексер-парсер для формул где метод isnull вложен в любой другой.
- Переработал парсинг отчета с учетом мультилайнов.
- Реализовал вспомогательные дата-классы для раздела и строки.
- Индексы разделов/строк/графов теперь трансформируются сначала в число (если это возможно), затем обратно в строку. Так как есть ключи вида "01", однако в формуле "1".
- Изменил формат и тип сообщения о непройденном контроле.
- Доработал инициализацию элементов языка контролей.
- Координаты и специфики теперь в множестве типа set.
- Создание элементов проиходит отталкиваясь от отчета. Отсутствующие элементы НЕ замещаются элементом со значением None. Это временное решение так как надо отталкиваться от размерности указанной в схеме и замещать отсутствующие элементами со значением 0. В ближайшее время будет переделано.
- Поправил/оптимизировал лексер-парсер так как допускается использование функции SUM без круглых скобок.
- Прочие мелкие исправления.
- Исправил ошибку при работе с элементами значение которых None. Причина возникновения, отсутствие метода isnull в формуле для незаполненной или полностью отсутствующей ячейки. В таком случае её значение так и будет оставаться None при проведении всех операций, а при сравнении будет интерпритироваться как ошибка.
- Исправил округление по умолчанию. Исходя из документации оно должно применяться к значениям элементов только при сравнениях их друг с другом.
- Исправил парсинг контролей в которых есть числа с запятой.
- Добавил setup.py
- Готов лексер и парсер для разбора формул контролей.
- Готовы парсеры для разбора отчета и шаблона с проверками.
- Сделал классы болванки для проверки формата заполнения ячеек и прогона контролей.