cfinterface 1.8.3__tar.gz → 1.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cfinterface-1.9.0/.github/workflows/benchmark.yml +34 -0
- cfinterface-1.9.0/.github/workflows/docs.yml +45 -0
- cfinterface-1.9.0/.github/workflows/main.yml +77 -0
- cfinterface-1.9.0/.github/workflows/publish.yml +33 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/.gitignore +4 -0
- cfinterface-1.9.0/.pre-commit-config.yaml +16 -0
- cfinterface-1.9.0/CHANGELOG.md +71 -0
- cfinterface-1.9.0/CONTRIBUTING.md +37 -0
- cfinterface-1.9.0/PKG-INFO +153 -0
- cfinterface-1.9.0/README.md +91 -0
- cfinterface-1.9.0/benchmarks/bench_floatfield_write.py +82 -0
- cfinterface-1.9.0/cfinterface/__init__.py +20 -0
- cfinterface-1.9.0/cfinterface/_utils/__init__.py +23 -0
- cfinterface-1.9.0/cfinterface/adapters/components/line/repository.py +132 -0
- cfinterface-1.9.0/cfinterface/adapters/components/repository.py +129 -0
- cfinterface-1.9.0/cfinterface/adapters/reading/repository.py +123 -0
- cfinterface-1.9.0/cfinterface/adapters/writing/repository.py +116 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/__init__.py +1 -0
- cfinterface-1.9.0/cfinterface/components/block.py +124 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/datetimefield.py +9 -18
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/defaultblock.py +5 -4
- cfinterface-1.9.0/cfinterface/components/defaultregister.py +50 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/defaultsection.py +5 -4
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/field.py +25 -41
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/floatfield.py +36 -22
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/integerfield.py +7 -13
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/line.py +26 -36
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/literalfield.py +6 -11
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/register.py +87 -68
- cfinterface-1.9.0/cfinterface/components/section.py +97 -0
- cfinterface-1.9.0/cfinterface/components/tabular.py +181 -0
- cfinterface-1.9.0/cfinterface/data/blockdata.py +197 -0
- cfinterface-1.9.0/cfinterface/data/registerdata.py +197 -0
- cfinterface-1.9.0/cfinterface/data/sectiondata.py +197 -0
- cfinterface-1.9.0/cfinterface/files/blockfile.py +153 -0
- cfinterface-1.9.0/cfinterface/files/registerfile.py +170 -0
- cfinterface-1.9.0/cfinterface/files/sectionfile.py +153 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/blockreading.py +14 -40
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/registerreading.py +16 -42
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/sectionreading.py +14 -30
- cfinterface-1.9.0/cfinterface/storage.py +39 -0
- cfinterface-1.9.0/cfinterface/versioning.py +87 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/blockwriting.py +15 -10
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/registerwriting.py +14 -10
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/sectionwriting.py +14 -9
- cfinterface-1.9.0/docs/source/_static/logo_cfinterface.svg +3 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/conf.py +10 -17
- cfinterface-1.9.0/docs/source/getting_started/contributing.rst +104 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/getting_started/tutorial.rst +178 -58
- cfinterface-1.9.0/docs/source/guides/architecture.rst +455 -0
- cfinterface-1.9.0/docs/source/guides/faq.rst +278 -0
- cfinterface-1.9.0/docs/source/guides/migration-v1.9.rst +283 -0
- cfinterface-1.9.0/docs/source/guides/performance.rst +217 -0
- cfinterface-1.9.0/docs/source/index.rst +56 -0
- cfinterface-1.9.0/docs/source/reference/adapters/files/components.rst +17 -0
- cfinterface-1.9.0/docs/source/reference/adapters/files/line.rst +17 -0
- cfinterface-1.9.0/docs/source/reference/adapters/files/reading.rst +17 -0
- cfinterface-1.9.0/docs/source/reference/adapters/files/writing.rst +17 -0
- cfinterface-1.9.0/docs/source/reference/adapters/index.rst +12 -0
- cfinterface-1.9.0/docs/source/reference/storage/files/storagetype.rst +9 -0
- cfinterface-1.9.0/docs/source/reference/storage/index.rst +9 -0
- cfinterface-1.9.0/docs/source/reference/tabular/files/tabularparser.rst +20 -0
- cfinterface-1.9.0/docs/source/reference/tabular/files/tabularsection.rst +9 -0
- cfinterface-1.9.0/docs/source/reference/tabular/index.rst +10 -0
- cfinterface-1.9.0/docs/source/reference/versioning/files/versioning.rst +40 -0
- cfinterface-1.9.0/docs/source/reference/versioning/index.rst +9 -0
- cfinterface-1.9.0/examples/plot_block_file.py +201 -0
- cfinterface-1.9.0/examples/plot_register_file.py +137 -0
- cfinterface-1.9.0/examples/plot_section_file.py +201 -0
- cfinterface-1.9.0/examples/plot_tabular_parsing.py +93 -0
- cfinterface-1.9.0/examples/plot_versioned_file.py +184 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/.implementation-state.json +172 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/00-master-plan.md +143 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/README.md +55 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/00-epic-overview.md +49 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/learnings.md +91 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-001-create-null-checking-utility.md +176 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-002-replace-pd-isnull-in-fields.md +177 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-003-lazy-pandas-import-in-registerfile.md +143 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-004-move-pandas-to-optional-dependency.md +153 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/00-epic-overview.md +60 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/learnings.md +76 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-005-compile-regex-patterns.md +183 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-006-create-storagetype-enum.md +180 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-007-update-factory-functions.md +194 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-008-migrate-internal-storage-usage.md +243 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-009-add-deprecation-warnings.md +193 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/00-epic-overview.md +25 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/learnings.md +69 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/ticket-010-optimize-floatfield-write.md +242 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/ticket-011-add-floatfield-benchmarks.md +224 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/00-epic-overview.md +33 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/learnings.md +96 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-012-list-backed-registerdata.md +160 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-013-list-backed-blockdata.md +158 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-014-list-backed-sectiondata.md +156 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-015-computed-prev-next-properties.md +266 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-016-type-indexed-lookup.md +199 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/00-epic-overview.md +29 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/learnings.md +209 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-017-typed-field-protocol.md +175 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-018-typed-repository-signatures.md +210 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-019-typed-line-dispatch.md +159 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-020-typed-component-io.md +249 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/00-epic-overview.md +27 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-021-tabular-parser-engine.md +198 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-022-tabular-section-base.md +220 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-023-delimited-tabular-parsing.md +198 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/00-epic-overview.md +32 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/learnings.md +62 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-024-schema-version-descriptor.md +133 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-025-instance-level-version-binding.md +162 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-026-batch-read-api.md +164 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-027-version-validation.md +214 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-01-summary.md +41 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-02-summary.md +64 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-03-summary.md +80 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-04-summary.md +79 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-05-summary.md +96 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-06-summary.md +130 -0
- cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-07-summary.md +125 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/.implementation-state.json +449 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/00-master-plan.md +119 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/README.md +69 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/00-epic-overview.md +44 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-001-update-classifiers-and-metadata.md +117 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-002-add-pytest-configuration.md +118 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-003-add-mypy-configuration.md +157 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-004-fix-mypy-strict-errors.md +141 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-005-add-coverage-and-ruff-config.md +131 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-006-add-py-typed-and-dev-deps.md +138 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/00-epic-overview.md +41 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-007-expand-test-matrix.md +166 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-008-extract-lint-job.md +138 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-009-create-benchmark-workflow.md +135 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-010-update-docs-and-publish-workflows.md +189 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/00-epic-overview.md +40 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-011-create-conftest-and-fixtures.md +195 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-012-add-hypothesis-field-tests.md +205 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-013-add-hypothesis-tabular-tests.md +238 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-014-migrate-to-pytest-benchmark.md +179 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/00-epic-overview.md +41 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-015-add-tabular-reference-pages.md +155 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-016-add-versioning-reference-page.md +151 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-017-add-storage-and-adapter-pages.md +181 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-018-fix-docstrings-and-index.md +157 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/00-epic-overview.md +33 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/ticket-019-create-changelog.md +169 -0
- cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/ticket-020-release-prep-review.md +124 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/.implementation-state.json +337 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/00-master-plan.md +107 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/README.md +81 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/00-epic-overview.md +26 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-001-add-pre-commit-configuration.md +124 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-002-upgrade-github-actions-versions.md +103 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-003-migrate-docs-deployment.md +149 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/00-epic-overview.md +27 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-004-migrate-sphinx-theme-to-furo.md +119 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-005-add-sphinx-gallery-examples.md +119 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-006-update-conf-language-intersphinx.md +113 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/00-epic-overview.md +30 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-007-create-architecture-overview.md +132 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-008-create-faq-page.md +129 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-009-create-migration-guide.md +138 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-010-create-performance-tips-page.md +131 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-011-update-contributing-rst.md +130 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-04-repository-polish/00-epic-overview.md +23 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-04-repository-polish/ticket-012-create-root-contributing-md.md +106 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/epic-04-repository-polish/ticket-013-restructure-index-rst.md +142 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/learnings/epic-01-summary.md +29 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/learnings/epic-02-summary.md +31 -0
- cfinterface-1.9.0/plans/infra-docs-overhaul/learnings/epic-03-summary.md +28 -0
- cfinterface-1.9.0/pyproject.toml +122 -0
- cfinterface-1.9.0/tests/_utils/test_is_null.py +63 -0
- cfinterface-1.9.0/tests/adapters/components/test_factory.py +67 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/components/test_linerepository.py +26 -0
- cfinterface-1.9.0/tests/adapters/components/test_pattern_cache.py +25 -0
- cfinterface-1.9.0/tests/adapters/components/test_registerrepository.py +28 -0
- cfinterface-1.9.0/tests/components/conftest.py +73 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_block.py +25 -8
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_defaultblock.py +3 -3
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_defaultregister.py +3 -3
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_defaultsection.py +3 -3
- cfinterface-1.9.0/tests/components/test_field.py +69 -0
- cfinterface-1.9.0/tests/components/test_field_hypothesis.py +259 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_floatfield.py +88 -6
- cfinterface-1.9.0/tests/components/test_floatfield_benchmark.py +56 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_integerfield.py +15 -1
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_register.py +27 -7
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_section.py +5 -6
- cfinterface-1.9.0/tests/components/test_storage_integration.py +19 -0
- cfinterface-1.9.0/tests/components/test_tabular.py +747 -0
- cfinterface-1.9.0/tests/components/test_tabular_hypothesis.py +186 -0
- cfinterface-1.9.0/tests/conftest.py +31 -0
- cfinterface-1.9.0/tests/data/test_blockdata.py +293 -0
- cfinterface-1.9.0/tests/data/test_registerdata.py +302 -0
- cfinterface-1.9.0/tests/data/test_sectiondata.py +285 -0
- cfinterface-1.9.0/tests/files/test_blockfile.py +306 -0
- cfinterface-1.9.0/tests/files/test_registerfile.py +261 -0
- cfinterface-1.9.0/tests/files/test_sectionfile.py +246 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/mocks/mock_open.py +1 -1
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/reading/test_blockreading.py +3 -5
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/reading/test_registerreading.py +2 -3
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/reading/test_sectionreading.py +3 -5
- cfinterface-1.9.0/tests/test_storage.py +28 -0
- cfinterface-1.9.0/tests/test_storage_deprecation.py +64 -0
- cfinterface-1.9.0/tests/test_versioning.py +158 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/writing/test_blockwriting.py +4 -5
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/writing/test_sectionwriting.py +4 -5
- cfinterface-1.8.3/.github/workflows/docs.yml +0 -33
- cfinterface-1.8.3/.github/workflows/main.yml +0 -46
- cfinterface-1.8.3/.github/workflows/publish.yml +0 -39
- cfinterface-1.8.3/PKG-INFO +0 -98
- cfinterface-1.8.3/README.md +0 -48
- cfinterface-1.8.3/cfinterface/__init__.py +0 -15
- cfinterface-1.8.3/cfinterface/adapters/components/line/repository.py +0 -189
- cfinterface-1.8.3/cfinterface/adapters/components/repository.py +0 -255
- cfinterface-1.8.3/cfinterface/adapters/reading/repository.py +0 -129
- cfinterface-1.8.3/cfinterface/adapters/writing/repository.py +0 -109
- cfinterface-1.8.3/cfinterface/components/block.py +0 -128
- cfinterface-1.8.3/cfinterface/components/defaultregister.py +0 -49
- cfinterface-1.8.3/cfinterface/components/section.py +0 -103
- cfinterface-1.8.3/cfinterface/data/blockdata.py +0 -175
- cfinterface-1.8.3/cfinterface/data/registerdata.py +0 -176
- cfinterface-1.8.3/cfinterface/data/sectiondata.py +0 -177
- cfinterface-1.8.3/cfinterface/files/blockfile.py +0 -118
- cfinterface-1.8.3/cfinterface/files/registerfile.py +0 -139
- cfinterface-1.8.3/cfinterface/files/sectionfile.py +0 -118
- cfinterface-1.8.3/docs/source/getting_started/contributing.rst +0 -50
- cfinterface-1.8.3/docs/source/index.rst +0 -38
- cfinterface-1.8.3/pyproject.toml +0 -55
- cfinterface-1.8.3/tests/components/test_field.py +0 -20
- cfinterface-1.8.3/tests/data/test_blockdata.py +0 -136
- cfinterface-1.8.3/tests/data/test_registerdata.py +0 -133
- cfinterface-1.8.3/tests/data/test_sectiondata.py +0 -133
- cfinterface-1.8.3/tests/files/test_blockfile.py +0 -153
- cfinterface-1.8.3/tests/files/test_registerfile.py +0 -125
- cfinterface-1.8.3/tests/files/test_sectionfile.py +0 -133
- {cfinterface-1.8.3 → cfinterface-1.9.0}/LICENSE +0 -0
- {cfinterface-1.8.3/cfinterface/_utils → cfinterface-1.9.0/benchmarks}/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/components/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/components/line/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/reading/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/writing/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/data/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/files/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/py.typed +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/install/install.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/files/block.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/files/blockdata.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/files/blockfile.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/index.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/datetimefield.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/field.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/floatfield.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/integerfield.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/literalfield.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/index.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/line/index.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/files/register.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/files/registerdata.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/files/registerfile.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/index.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/files/section.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/files/sectiondata.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/files/sectionfile.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/index.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/examples/README.rst +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/examples/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/__init__.py +0 -0
- {cfinterface-1.8.3/tests/adapters → cfinterface-1.9.0/tests/_utils}/__init__.py +0 -0
- {cfinterface-1.8.3/tests/adapters/components → cfinterface-1.9.0/tests/adapters}/__init__.py +0 -0
- {cfinterface-1.8.3/tests/adapters/reading → cfinterface-1.9.0/tests/adapters/components}/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/components/test_blockrepository.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/components/test_sectionrepository.py +0 -0
- {cfinterface-1.8.3/tests/adapters/writing → cfinterface-1.9.0/tests/adapters/reading}/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/reading/test_readingrepository.py +0 -0
- {cfinterface-1.8.3/tests/components → cfinterface-1.9.0/tests/adapters/writing}/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/writing/test_writingrepository.py +0 -0
- {cfinterface-1.8.3/tests/data → cfinterface-1.9.0/tests/components}/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_datetimefield.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_line.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_literalfield.py +0 -0
- {cfinterface-1.8.3/tests/files → cfinterface-1.9.0/tests/data}/__init__.py +0 -0
- {cfinterface-1.8.3/tests/mocks → cfinterface-1.9.0/tests/files}/__init__.py +0 -0
- {cfinterface-1.8.3/tests/reading → cfinterface-1.9.0/tests/mocks}/__init__.py +0 -0
- {cfinterface-1.8.3/tests/writing → cfinterface-1.9.0/tests/reading}/__init__.py +0 -0
- cfinterface-1.8.3/tests/adapters/components/test_registerrepository.py → cfinterface-1.9.0/tests/writing/__init__.py +0 -0
- {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/writing/test_registerwriting.py +3 -3
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: benchmarks
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
benchmark-min-rounds:
|
|
7
|
+
description: "Minimum rounds per benchmark"
|
|
8
|
+
required: false
|
|
9
|
+
default: "5"
|
|
10
|
+
type: string
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
benchmark:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v6
|
|
19
|
+
- name: Set up Python 3.12
|
|
20
|
+
run: uv python install 3.12
|
|
21
|
+
- name: Install the project
|
|
22
|
+
run: |
|
|
23
|
+
uv sync --all-extras --dev
|
|
24
|
+
- name: Run benchmarks
|
|
25
|
+
run: |
|
|
26
|
+
uv run pytest -m benchmark --benchmark-only \
|
|
27
|
+
--benchmark-min-rounds=${{ inputs.benchmark-min-rounds }} \
|
|
28
|
+
--benchmark-json=benchmark-results.json
|
|
29
|
+
- name: Upload benchmark results
|
|
30
|
+
uses: actions/upload-artifact@v4
|
|
31
|
+
with:
|
|
32
|
+
name: benchmark-results
|
|
33
|
+
path: benchmark-results.json
|
|
34
|
+
retention-days: 30
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
pages: write
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: "pages"
|
|
15
|
+
cancel-in-progress: false
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v6
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
run: uv python install 3.12
|
|
26
|
+
- name: Install the project
|
|
27
|
+
run: uv sync --all-extras --dev
|
|
28
|
+
- name: Sphinx build
|
|
29
|
+
run: uv run python -m sphinx -M html docs/source docs/build -W
|
|
30
|
+
- name: Upload artifact
|
|
31
|
+
uses: actions/upload-pages-artifact@v3
|
|
32
|
+
with:
|
|
33
|
+
path: docs/build/html
|
|
34
|
+
|
|
35
|
+
deploy:
|
|
36
|
+
environment:
|
|
37
|
+
name: github-pages
|
|
38
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
needs: build
|
|
41
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
42
|
+
steps:
|
|
43
|
+
- name: Deploy to GitHub Pages
|
|
44
|
+
id: deployment
|
|
45
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ${{ matrix.os }}
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
include:
|
|
18
|
+
- os: ubuntu-latest
|
|
19
|
+
python-version: "3.10"
|
|
20
|
+
- os: ubuntu-latest
|
|
21
|
+
python-version: "3.11"
|
|
22
|
+
- os: ubuntu-latest
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
- os: ubuntu-latest
|
|
25
|
+
python-version: "3.13"
|
|
26
|
+
- os: ubuntu-latest
|
|
27
|
+
python-version: "3.14"
|
|
28
|
+
- os: windows-latest
|
|
29
|
+
python-version: "3.12"
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
- name: Install uv
|
|
33
|
+
uses: astral-sh/setup-uv@v6
|
|
34
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
35
|
+
run: uv python install ${{ matrix.python-version }}
|
|
36
|
+
- name: Install the project
|
|
37
|
+
run: |
|
|
38
|
+
uv sync --all-extras --dev
|
|
39
|
+
- name: Run tests
|
|
40
|
+
run: |
|
|
41
|
+
uv run pytest -m "not benchmark" --cov-report=xml --cov=cfinterface ./tests
|
|
42
|
+
- name: Upload coverage
|
|
43
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
44
|
+
uses: codecov/codecov-action@v5
|
|
45
|
+
with:
|
|
46
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
47
|
+
files: ./coverage.xml
|
|
48
|
+
flags: unittests
|
|
49
|
+
env_vars: OS,PYTHON
|
|
50
|
+
name: codecov-cfinterface
|
|
51
|
+
fail_ci_if_error: true
|
|
52
|
+
verbose: true
|
|
53
|
+
|
|
54
|
+
lint:
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v4
|
|
58
|
+
- name: Install uv
|
|
59
|
+
uses: astral-sh/setup-uv@v6
|
|
60
|
+
- name: Set up Python 3.12
|
|
61
|
+
run: uv python install 3.12
|
|
62
|
+
- name: Install the project
|
|
63
|
+
run: |
|
|
64
|
+
uv sync --all-extras --dev
|
|
65
|
+
- name: Mypy
|
|
66
|
+
run: |
|
|
67
|
+
uv run mypy ./cfinterface
|
|
68
|
+
- name: Ruff
|
|
69
|
+
run: |
|
|
70
|
+
uv run ruff check ./cfinterface
|
|
71
|
+
- name: Ty (informational)
|
|
72
|
+
continue-on-error: true
|
|
73
|
+
run: |
|
|
74
|
+
uvx ty check ./cfinterface
|
|
75
|
+
- name: Sphinx
|
|
76
|
+
run: |
|
|
77
|
+
uv run python -m sphinx -M html docs/source docs/build -W
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: deploy
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [created]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build-and-publish:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
environment:
|
|
11
|
+
name: pypi
|
|
12
|
+
url: https://pypi.org/p/cfinterface/
|
|
13
|
+
permissions:
|
|
14
|
+
id-token: write
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v6
|
|
19
|
+
- name: Set up Python
|
|
20
|
+
run: uv python install 3.12
|
|
21
|
+
- name: Install the project
|
|
22
|
+
run: |
|
|
23
|
+
uv sync --all-extras --dev
|
|
24
|
+
- name: Run tests
|
|
25
|
+
run: |
|
|
26
|
+
uv run pytest -m "not benchmark" ./tests
|
|
27
|
+
- name: Build package
|
|
28
|
+
if: startsWith(github.ref, 'refs/tags')
|
|
29
|
+
run: |
|
|
30
|
+
uv build
|
|
31
|
+
- name: PyPI publish
|
|
32
|
+
if: startsWith(github.ref, 'refs/tags')
|
|
33
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.9.10
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
9
|
+
rev: v1.19.1
|
|
10
|
+
hooks:
|
|
11
|
+
- id: mypy
|
|
12
|
+
files: ^cfinterface/
|
|
13
|
+
args: [--config-file=pyproject.toml]
|
|
14
|
+
additional_dependencies:
|
|
15
|
+
- numpy>=2.0.0
|
|
16
|
+
- types-setuptools
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [1.9.0] - 2026-03-08
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `StorageType` enum (`cfinterface/storage.py`) for type-safe `TEXT`/`BINARY` dispatch, replacing bare string literals
|
|
15
|
+
- `TabularParser` class (`cfinterface/components/tabular.py`) for generic, schema-driven tabular file parsing
|
|
16
|
+
- `TabularSection` convenience base class for sections backed by a tabular data block
|
|
17
|
+
- `ColumnDef` named tuple for declaring column schemas (name, width, dtype, default) in `TabularParser`
|
|
18
|
+
- Delimited tabular parsing support (CSV-style, semicolon-separated, and custom delimiters) in `TabularParser`
|
|
19
|
+
- `SchemaVersion` descriptor (`cfinterface/versioning.py`) for declarative version binding on file classes
|
|
20
|
+
- `resolve_version()` utility function for resolving the active schema version at read/write time
|
|
21
|
+
- `VersionMatchResult` named tuple for structured version comparison results
|
|
22
|
+
- `validate_version()` function for detecting version mismatches between file schema and actual content
|
|
23
|
+
- `read_many()` batch read API on `RegisterFile`, `BlockFile`, and `SectionFile` for reading multiple files in one call
|
|
24
|
+
- `validate()` method on file classes for programmatic version mismatch detection
|
|
25
|
+
- `py.typed` marker file for PEP 561 compliance, enabling downstream type checking of cfinterface
|
|
26
|
+
- Hypothesis property-based tests for `Field` round-trip correctness (`tests/components/test_field_hypothesis.py`)
|
|
27
|
+
- Hypothesis property-based tests for `TabularParser` parsing invariants (`tests/components/test_tabular_hypothesis.py`)
|
|
28
|
+
- pytest-benchmark integration for performance regression testing (`tests/components/test_floatfield_benchmark.py`)
|
|
29
|
+
- Sphinx reference documentation for `TabularParser`, versioning module, `StorageType`, and adapter classes
|
|
30
|
+
- CI test matrix covering Python 3.10, 3.11, 3.12, 3.13, and 3.14 on Linux, plus Python 3.12 on Windows
|
|
31
|
+
- Separated lint/quality CI job running mypy, ruff, ty (informational), and `sphinx-build -W`
|
|
32
|
+
- Manual-dispatch benchmark CI workflow (`.github/workflows/benchmark.yml`) for on-demand performance profiling
|
|
33
|
+
- Pre-commit configuration with ruff (lint + format) and mypy hooks (`.pre-commit-config.yaml`)
|
|
34
|
+
- Sphinx gallery examples for `BlockFile` and `SectionFile` usage (`examples/plot_block_file.py`, `examples/plot_section_file.py`)
|
|
35
|
+
- Documentation pages in pt-BR: architecture overview, FAQ, migration guide (v1.8→v1.9), and performance tips
|
|
36
|
+
- Root-level `CONTRIBUTING.md` in pt-BR with links to full Sphinx contributing page
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- pandas moved from required to optional dependency; install via `pip install cfinterface[pandas]`
|
|
41
|
+
- Only `numpy>=2.0.0` remains as a hard runtime dependency
|
|
42
|
+
- Regex patterns in the adapter layer are now compiled and cached at first use via `_pattern_cache`, eliminating per-call recompilation
|
|
43
|
+
- `FloatField._textual_write()` optimized from an O(decimal_digits) trial loop to at most 3 format attempts
|
|
44
|
+
- `RegisterData`, `BlockData`, and `SectionData` migrated from linked-list structures to array-backed (`list`) containers with O(1) `len()` and type-indexed lookups
|
|
45
|
+
- `Register.previous`/`next`, `Block.previous`/`next`, and `Section.previous`/`next` are now computed properties derived from container position instead of stored linked-list pointers
|
|
46
|
+
- `Field.read()` and `Field.write()` use `@overload` signatures for type-safe `str`/`bytes` dispatch
|
|
47
|
+
- All four adapter `factory()` functions accept `StorageType` enum values in addition to legacy string values
|
|
48
|
+
- `RegisterFile`, `BlockFile`, and `SectionFile` `STORAGE` class attribute defaults changed to `StorageType.TEXT`
|
|
49
|
+
- pyproject.toml expanded with `[tool.mypy]`, `[tool.pytest.ini_options]`, `[tool.coverage]`, and an expanded `[tool.ruff.lint]` section
|
|
50
|
+
- Python classifiers updated to include 3.10, 3.11, 3.12, 3.13, and 3.14
|
|
51
|
+
- `docs.yml` and `publish.yml` GitHub Actions workflows modernized to use `uv` and consistent job patterns
|
|
52
|
+
- All GitHub Actions upgraded to latest versions (`setup-uv@v6`, `codecov-action@v5`)
|
|
53
|
+
- Docs deployment migrated from `peaceiris/actions-gh-pages` to official `actions/deploy-pages`
|
|
54
|
+
- Sphinx theme migrated from `sphinx-rtd-theme` to Furo (dark mode, mobile-responsive)
|
|
55
|
+
- Sphinx language setting changed from `en_US` to `pt_BR`
|
|
56
|
+
- Intersphinx pandas URL updated from HTTP to HTTPS
|
|
57
|
+
- `docs/source/getting_started/contributing.rst` rewritten in pt-BR with correct repository URL and uv-based workflow
|
|
58
|
+
- `docs/source/index.rst` restructured with Guias and Recursos toctree sections
|
|
59
|
+
|
|
60
|
+
### Deprecated
|
|
61
|
+
|
|
62
|
+
- Passing `"TEXT"` or `"BINARY"` as plain strings to the file class `STORAGE` attribute; use `StorageType.TEXT` or `StorageType.BINARY` instead (a deprecation warning is emitted at file class instantiation time)
|
|
63
|
+
- `set_version()` method on file classes; pass the `version=` keyword argument to `read()` instead
|
|
64
|
+
|
|
65
|
+
### Fixed
|
|
66
|
+
|
|
67
|
+
- Null value detection in `Field` write methods now uses `math.isnan()` instead of `pd.isnull()`, eliminating the unnecessary pandas import at module level
|
|
68
|
+
- `RegisterFile._as_df()` now performs a lazy pandas import, only importing the library when the method is actually called
|
|
69
|
+
|
|
70
|
+
[Unreleased]: https://github.com/rjmalves/cfinterface/compare/v1.9.0...HEAD
|
|
71
|
+
[1.9.0]: https://github.com/rjmalves/cfinterface/compare/v1.8.3...v1.9.0
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Contribuindo
|
|
2
|
+
|
|
3
|
+
Obrigado pelo interesse em contribuir com o **cfinterface**! Esta página
|
|
4
|
+
resume os passos essenciais. Para instruções detalhadas, consulte a
|
|
5
|
+
[documentação completa de contribuição](https://rjmalves.github.io/cfinterface/getting_started/contributing.html).
|
|
6
|
+
|
|
7
|
+
## Reportando Bugs
|
|
8
|
+
|
|
9
|
+
Encontrou um comportamento inesperado? Abra uma
|
|
10
|
+
[issue no GitHub](https://github.com/rjmalves/cfinterface/issues) descrevendo
|
|
11
|
+
o problema. Inclua a versão do Python, o sistema operacional e um trecho de
|
|
12
|
+
código que permita reproduzir o erro.
|
|
13
|
+
|
|
14
|
+
## Enviando Pull Requests
|
|
15
|
+
|
|
16
|
+
Correções e melhorias são bem-vindas via
|
|
17
|
+
[pull request](https://github.com/rjmalves/cfinterface/pulls). Antes de
|
|
18
|
+
enviar, leia a documentação completa para garantir que o código segue as
|
|
19
|
+
convenções do projeto e que todos os testes e verificações de qualidade
|
|
20
|
+
passam.
|
|
21
|
+
|
|
22
|
+
## Configuracao Rapida
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git clone https://github.com/rjmalves/cfinterface.git
|
|
26
|
+
cd cfinterface
|
|
27
|
+
uv sync --extra dev
|
|
28
|
+
uv run pre-commit install
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Documentacao Completa
|
|
32
|
+
|
|
33
|
+
Consulte a página de contribuição na documentação do projeto para detalhes
|
|
34
|
+
sobre hooks de pre-commit, convenções de código, execução de testes e build
|
|
35
|
+
da documentação:
|
|
36
|
+
|
|
37
|
+
<https://rjmalves.github.io/cfinterface/getting_started/contributing.html>
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cfinterface
|
|
3
|
+
Version: 1.9.0
|
|
4
|
+
Summary: Interface for handling custom formatted files
|
|
5
|
+
Project-URL: Documentation, https://rjmalves.github.io/cfinterface/
|
|
6
|
+
Project-URL: Repository, https://github.com/rjmalves/cfinterface/
|
|
7
|
+
Author-email: Rogerio Alves <rogerioalves.ee@gmail.com>
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2022 Rogerio Alves
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
License-File: LICENSE
|
|
30
|
+
Classifier: Development Status :: 4 - Beta
|
|
31
|
+
Classifier: Intended Audience :: Developers
|
|
32
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
33
|
+
Classifier: Operating System :: OS Independent
|
|
34
|
+
Classifier: Programming Language :: Python :: 3
|
|
35
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
40
|
+
Classifier: Typing :: Typed
|
|
41
|
+
Requires-Python: >=3.10
|
|
42
|
+
Requires-Dist: numpy>=2.0.0
|
|
43
|
+
Provides-Extra: dev
|
|
44
|
+
Requires-Dist: furo; extra == 'dev'
|
|
45
|
+
Requires-Dist: hypothesis; extra == 'dev'
|
|
46
|
+
Requires-Dist: matplotlib; extra == 'dev'
|
|
47
|
+
Requires-Dist: mypy; extra == 'dev'
|
|
48
|
+
Requires-Dist: numpydoc; extra == 'dev'
|
|
49
|
+
Requires-Dist: pandas-stubs; extra == 'dev'
|
|
50
|
+
Requires-Dist: pandas>=2.2.3; extra == 'dev'
|
|
51
|
+
Requires-Dist: plotly; extra == 'dev'
|
|
52
|
+
Requires-Dist: pre-commit; extra == 'dev'
|
|
53
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
54
|
+
Requires-Dist: pytest-benchmark; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
56
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
57
|
+
Requires-Dist: sphinx; extra == 'dev'
|
|
58
|
+
Requires-Dist: sphinx-gallery; extra == 'dev'
|
|
59
|
+
Provides-Extra: pandas
|
|
60
|
+
Requires-Dist: pandas>=2.2.3; extra == 'pandas'
|
|
61
|
+
Description-Content-Type: text/markdown
|
|
62
|
+
|
|
63
|
+
# cfinterface
|
|
64
|
+
|
|
65
|
+
[](https://github.com/rjmalves/cfinterface/actions)
|
|
66
|
+
[](https://codecov.io/gh/rjmalves/cfinterface)
|
|
67
|
+
[](https://pypi.org/project/cfinterface/)
|
|
68
|
+
[](https://pypi.org/project/cfinterface/)
|
|
69
|
+
|
|
70
|
+
Python framework for modeling custom file formats with declarative reading, formatting, and writing.
|
|
71
|
+
|
|
72
|
+
## Key Features
|
|
73
|
+
|
|
74
|
+
- **Fields** — typed value containers (`LiteralField`, `IntegerField`, `FloatField`, `DatetimeField`) with positional formatting for both text and binary files
|
|
75
|
+
- **Line** — ordered collection of fields that models a single line or record
|
|
76
|
+
- **Register / RegisterFile** — single-line blocks identified by a beginning pattern, ideal for files with many line types
|
|
77
|
+
- **Block / BlockFile** — multi-line blocks with beginning/ending patterns, for complex structured files
|
|
78
|
+
- **Section / SectionFile** — ordered, non-overlapping divisions of file content
|
|
79
|
+
- **TabularParser** — schema-driven tabular parsing with fixed-width or delimiter-separated layouts
|
|
80
|
+
- **Versioning** — `VERSIONS` dict with `resolve_version()` and `validate_version()` for files that evolve over time
|
|
81
|
+
- **Binary support** — `StorageType.TEXT` / `StorageType.BINARY` for seamless text or binary I/O
|
|
82
|
+
- **Batch reading** — `read_many()` for reading multiple files in one call
|
|
83
|
+
|
|
84
|
+
## Install
|
|
85
|
+
|
|
86
|
+
`cfinterface` requires Python >= 3.10:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
pip install cfinterface
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Optional Dependencies
|
|
93
|
+
|
|
94
|
+
For pandas DataFrame integration (`TabularParser.to_dataframe()`):
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
pip install cfinterface[pandas]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Quick Start
|
|
101
|
+
|
|
102
|
+
Model a line-based file with `Register` and `RegisterFile`:
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from datetime import datetime
|
|
106
|
+
from cfinterface import (
|
|
107
|
+
DatetimeField, FloatField, LiteralField, Line, Register, RegisterFile,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
class DataHigh(Register):
|
|
111
|
+
IDENTIFIER = "DATA_HIGH"
|
|
112
|
+
IDENTIFIER_DIGITS = 9
|
|
113
|
+
LINE = Line(
|
|
114
|
+
[
|
|
115
|
+
LiteralField(size=6, starting_position=11),
|
|
116
|
+
LiteralField(size=9, starting_position=19),
|
|
117
|
+
DatetimeField(size=10, starting_position=30, format="%m/%d/%Y"),
|
|
118
|
+
FloatField(size=6, starting_position=42, decimal_digits=2),
|
|
119
|
+
]
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
class MyFile(RegisterFile):
|
|
123
|
+
REGISTERS = [DataHigh]
|
|
124
|
+
|
|
125
|
+
file = MyFile.read("data.txt")
|
|
126
|
+
for reg in file.data.get_registers_of_type(DataHigh):
|
|
127
|
+
print(reg.data)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Parse tabular data with `TabularParser`:
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
from cfinterface import IntegerField, FloatField, LiteralField
|
|
134
|
+
from cfinterface.components.tabular import ColumnDef, TabularParser
|
|
135
|
+
|
|
136
|
+
columns = [
|
|
137
|
+
ColumnDef(name="City", field=LiteralField(size=12, starting_position=0)),
|
|
138
|
+
ColumnDef(name="Pop", field=IntegerField(size=10, starting_position=12)),
|
|
139
|
+
ColumnDef(name="Area", field=FloatField(size=8, starting_position=22, decimal_digits=1)),
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
parser = TabularParser(columns)
|
|
143
|
+
data = parser.parse_lines(["Springfield 1200000 115.4\n"])
|
|
144
|
+
# {"City": ["Springfield"], "Pop": [1200000], "Area": [115.4]}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Documentation
|
|
148
|
+
|
|
149
|
+
Guides, tutorials, and API reference: https://rjmalves.github.io/cfinterface
|
|
150
|
+
|
|
151
|
+
## Changelog
|
|
152
|
+
|
|
153
|
+
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# cfinterface
|
|
2
|
+
|
|
3
|
+
[](https://github.com/rjmalves/cfinterface/actions)
|
|
4
|
+
[](https://codecov.io/gh/rjmalves/cfinterface)
|
|
5
|
+
[](https://pypi.org/project/cfinterface/)
|
|
6
|
+
[](https://pypi.org/project/cfinterface/)
|
|
7
|
+
|
|
8
|
+
Python framework for modeling custom file formats with declarative reading, formatting, and writing.
|
|
9
|
+
|
|
10
|
+
## Key Features
|
|
11
|
+
|
|
12
|
+
- **Fields** — typed value containers (`LiteralField`, `IntegerField`, `FloatField`, `DatetimeField`) with positional formatting for both text and binary files
|
|
13
|
+
- **Line** — ordered collection of fields that models a single line or record
|
|
14
|
+
- **Register / RegisterFile** — single-line blocks identified by a beginning pattern, ideal for files with many line types
|
|
15
|
+
- **Block / BlockFile** — multi-line blocks with beginning/ending patterns, for complex structured files
|
|
16
|
+
- **Section / SectionFile** — ordered, non-overlapping divisions of file content
|
|
17
|
+
- **TabularParser** — schema-driven tabular parsing with fixed-width or delimiter-separated layouts
|
|
18
|
+
- **Versioning** — `VERSIONS` dict with `resolve_version()` and `validate_version()` for files that evolve over time
|
|
19
|
+
- **Binary support** — `StorageType.TEXT` / `StorageType.BINARY` for seamless text or binary I/O
|
|
20
|
+
- **Batch reading** — `read_many()` for reading multiple files in one call
|
|
21
|
+
|
|
22
|
+
## Install
|
|
23
|
+
|
|
24
|
+
`cfinterface` requires Python >= 3.10:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
pip install cfinterface
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Optional Dependencies
|
|
31
|
+
|
|
32
|
+
For pandas DataFrame integration (`TabularParser.to_dataframe()`):
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
pip install cfinterface[pandas]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Quick Start
|
|
39
|
+
|
|
40
|
+
Model a line-based file with `Register` and `RegisterFile`:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
from datetime import datetime
|
|
44
|
+
from cfinterface import (
|
|
45
|
+
DatetimeField, FloatField, LiteralField, Line, Register, RegisterFile,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
class DataHigh(Register):
|
|
49
|
+
IDENTIFIER = "DATA_HIGH"
|
|
50
|
+
IDENTIFIER_DIGITS = 9
|
|
51
|
+
LINE = Line(
|
|
52
|
+
[
|
|
53
|
+
LiteralField(size=6, starting_position=11),
|
|
54
|
+
LiteralField(size=9, starting_position=19),
|
|
55
|
+
DatetimeField(size=10, starting_position=30, format="%m/%d/%Y"),
|
|
56
|
+
FloatField(size=6, starting_position=42, decimal_digits=2),
|
|
57
|
+
]
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
class MyFile(RegisterFile):
|
|
61
|
+
REGISTERS = [DataHigh]
|
|
62
|
+
|
|
63
|
+
file = MyFile.read("data.txt")
|
|
64
|
+
for reg in file.data.get_registers_of_type(DataHigh):
|
|
65
|
+
print(reg.data)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Parse tabular data with `TabularParser`:
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from cfinterface import IntegerField, FloatField, LiteralField
|
|
72
|
+
from cfinterface.components.tabular import ColumnDef, TabularParser
|
|
73
|
+
|
|
74
|
+
columns = [
|
|
75
|
+
ColumnDef(name="City", field=LiteralField(size=12, starting_position=0)),
|
|
76
|
+
ColumnDef(name="Pop", field=IntegerField(size=10, starting_position=12)),
|
|
77
|
+
ColumnDef(name="Area", field=FloatField(size=8, starting_position=22, decimal_digits=1)),
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
parser = TabularParser(columns)
|
|
81
|
+
data = parser.parse_lines(["Springfield 1200000 115.4\n"])
|
|
82
|
+
# {"City": ["Springfield"], "Pop": [1200000], "Area": [115.4]}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Documentation
|
|
86
|
+
|
|
87
|
+
Guides, tutorials, and API reference: https://rjmalves.github.io/cfinterface
|
|
88
|
+
|
|
89
|
+
## Changelog
|
|
90
|
+
|
|
91
|
+
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Benchmark FloatField._textual_write() across format types and scenarios."""
|
|
2
|
+
|
|
3
|
+
import timeit
|
|
4
|
+
|
|
5
|
+
from cfinterface.components.floatfield import FloatField
|
|
6
|
+
|
|
7
|
+
N_WRITES = 100_000
|
|
8
|
+
N_REPEATS = 5
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _make_fields(size, dec, fmt, values):
|
|
12
|
+
return [FloatField(size, 0, dec, format=fmt, value=v) for v in values]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _bench_scenario(name, fields, n_writes, n_repeats):
|
|
16
|
+
n_fields = len(fields)
|
|
17
|
+
loops = n_writes // n_fields
|
|
18
|
+
|
|
19
|
+
def run():
|
|
20
|
+
for _ in range(loops):
|
|
21
|
+
for f in fields:
|
|
22
|
+
f._textual_write()
|
|
23
|
+
|
|
24
|
+
times = timeit.repeat(run, number=1, repeat=n_repeats)
|
|
25
|
+
per_write = [t / n_writes * 1e6 for t in times]
|
|
26
|
+
return (
|
|
27
|
+
name,
|
|
28
|
+
n_writes,
|
|
29
|
+
min(per_write),
|
|
30
|
+
sum(per_write) / len(per_write),
|
|
31
|
+
max(per_write),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def run_benchmarks():
|
|
36
|
+
scenarios = [
|
|
37
|
+
(
|
|
38
|
+
"F fits at full precision",
|
|
39
|
+
_make_fields(12, 4, "F", [float(i) + 0.1234 for i in range(100)]),
|
|
40
|
+
),
|
|
41
|
+
(
|
|
42
|
+
"F requires precision reduction",
|
|
43
|
+
_make_fields(8, 4, "F", [12345.6789 + i for i in range(100)]),
|
|
44
|
+
),
|
|
45
|
+
(
|
|
46
|
+
"F rounding carry",
|
|
47
|
+
_make_fields(5, 2, "F", [999.99 + i * 1000 for i in range(100)]),
|
|
48
|
+
),
|
|
49
|
+
(
|
|
50
|
+
"E non-zero",
|
|
51
|
+
_make_fields(
|
|
52
|
+
12, 4, "E", [float(i) + 0.1234 for i in range(1, 101)]
|
|
53
|
+
),
|
|
54
|
+
),
|
|
55
|
+
(
|
|
56
|
+
"D non-zero",
|
|
57
|
+
_make_fields(
|
|
58
|
+
12, 4, "D", [float(i) + 0.1234 for i in range(1, 101)]
|
|
59
|
+
),
|
|
60
|
+
),
|
|
61
|
+
(
|
|
62
|
+
"E/D zero",
|
|
63
|
+
_make_fields(12, 4, "E", [0.0] * 50)
|
|
64
|
+
+ _make_fields(12, 4, "D", [0.0] * 50),
|
|
65
|
+
),
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
header = f"{'Scenario':<35} | {'N writes':>8} | {'min (us)':>9} | {'mean (us)':>10} | {'max (us)':>9}"
|
|
69
|
+
print("FloatField._textual_write() Benchmark")
|
|
70
|
+
print("=" * len(header))
|
|
71
|
+
print(header)
|
|
72
|
+
print("-" * len(header))
|
|
73
|
+
|
|
74
|
+
for name, fields in scenarios:
|
|
75
|
+
result = _bench_scenario(name, fields, N_WRITES, N_REPEATS)
|
|
76
|
+
print(
|
|
77
|
+
f"{result[0]:<35} | {result[1]:>8} | {result[2]:>9.2f} | {result[3]:>10.2f} | {result[4]:>9.2f}"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if __name__ == "__main__":
|
|
82
|
+
run_benchmarks()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
cfi
|
|
3
|
+
====
|
|
4
|
+
|
|
5
|
+
cfi is a Python module for handling custom formatted files
|
|
6
|
+
and provide reading, storing and writing utilities.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__version__ = "1.9.0"
|
|
10
|
+
|
|
11
|
+
from . import components # noqa
|
|
12
|
+
from . import data # noqa
|
|
13
|
+
from . import reading # noqa
|
|
14
|
+
from . import writing # noqa
|
|
15
|
+
from . import files # noqa
|
|
16
|
+
from .storage import StorageType # noqa
|
|
17
|
+
from .versioning import SchemaVersion as SchemaVersion # noqa
|
|
18
|
+
from .versioning import VersionMatchResult as VersionMatchResult # noqa
|
|
19
|
+
from .versioning import resolve_version as resolve_version # noqa
|
|
20
|
+
from .versioning import validate_version as validate_version # noqa
|