cfinterface 1.8.3__tar.gz → 1.9.1__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.
Files changed (292) hide show
  1. cfinterface-1.9.1/.github/workflows/benchmark.yml +34 -0
  2. cfinterface-1.9.1/.github/workflows/docs.yml +45 -0
  3. cfinterface-1.9.1/.github/workflows/main.yml +77 -0
  4. cfinterface-1.9.1/.github/workflows/publish.yml +33 -0
  5. {cfinterface-1.8.3 → cfinterface-1.9.1}/.gitignore +4 -0
  6. cfinterface-1.9.1/.pre-commit-config.yaml +16 -0
  7. cfinterface-1.9.1/CHANGELOG.md +79 -0
  8. cfinterface-1.9.1/CONTRIBUTING.md +36 -0
  9. cfinterface-1.9.1/PKG-INFO +153 -0
  10. cfinterface-1.9.1/README.md +91 -0
  11. cfinterface-1.9.1/benchmarks/bench_floatfield_write.py +82 -0
  12. cfinterface-1.9.1/cfinterface/__init__.py +20 -0
  13. cfinterface-1.9.1/cfinterface/_utils/__init__.py +23 -0
  14. cfinterface-1.9.1/cfinterface/adapters/components/line/repository.py +132 -0
  15. cfinterface-1.9.1/cfinterface/adapters/components/repository.py +129 -0
  16. cfinterface-1.9.1/cfinterface/adapters/reading/repository.py +123 -0
  17. cfinterface-1.9.1/cfinterface/adapters/writing/repository.py +116 -0
  18. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/__init__.py +1 -0
  19. cfinterface-1.9.1/cfinterface/components/block.py +124 -0
  20. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/datetimefield.py +9 -18
  21. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/defaultblock.py +5 -4
  22. cfinterface-1.9.1/cfinterface/components/defaultregister.py +50 -0
  23. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/defaultsection.py +5 -4
  24. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/field.py +25 -41
  25. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/floatfield.py +36 -22
  26. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/integerfield.py +7 -13
  27. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/line.py +26 -36
  28. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/literalfield.py +6 -11
  29. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/components/register.py +87 -68
  30. cfinterface-1.9.1/cfinterface/components/section.py +97 -0
  31. cfinterface-1.9.1/cfinterface/components/tabular.py +181 -0
  32. cfinterface-1.9.1/cfinterface/data/blockdata.py +197 -0
  33. cfinterface-1.9.1/cfinterface/data/registerdata.py +197 -0
  34. cfinterface-1.9.1/cfinterface/data/sectiondata.py +197 -0
  35. cfinterface-1.9.1/cfinterface/files/blockfile.py +153 -0
  36. cfinterface-1.9.1/cfinterface/files/registerfile.py +170 -0
  37. cfinterface-1.9.1/cfinterface/files/sectionfile.py +153 -0
  38. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/reading/blockreading.py +14 -40
  39. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/reading/registerreading.py +16 -42
  40. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/reading/sectionreading.py +14 -30
  41. cfinterface-1.9.1/cfinterface/storage.py +39 -0
  42. cfinterface-1.9.1/cfinterface/versioning.py +87 -0
  43. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/writing/blockwriting.py +15 -10
  44. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/writing/registerwriting.py +14 -10
  45. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/writing/sectionwriting.py +14 -9
  46. cfinterface-1.9.1/docs/source/_static/logo_cfinterface.svg +3 -0
  47. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/conf.py +10 -17
  48. cfinterface-1.9.1/docs/source/getting_started/contributing.rst +103 -0
  49. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/getting_started/tutorial.rst +178 -58
  50. cfinterface-1.9.1/docs/source/guides/architecture.rst +454 -0
  51. cfinterface-1.9.1/docs/source/guides/faq.rst +274 -0
  52. cfinterface-1.9.1/docs/source/guides/migration-v1.9.rst +281 -0
  53. cfinterface-1.9.1/docs/source/guides/performance.rst +212 -0
  54. cfinterface-1.9.1/docs/source/index.rst +56 -0
  55. cfinterface-1.9.1/docs/source/reference/adapters/files/components.rst +17 -0
  56. cfinterface-1.9.1/docs/source/reference/adapters/files/line.rst +17 -0
  57. cfinterface-1.9.1/docs/source/reference/adapters/files/reading.rst +17 -0
  58. cfinterface-1.9.1/docs/source/reference/adapters/files/writing.rst +17 -0
  59. cfinterface-1.9.1/docs/source/reference/adapters/index.rst +12 -0
  60. cfinterface-1.9.1/docs/source/reference/storage/files/storagetype.rst +9 -0
  61. cfinterface-1.9.1/docs/source/reference/storage/index.rst +9 -0
  62. cfinterface-1.9.1/docs/source/reference/tabular/files/tabularparser.rst +20 -0
  63. cfinterface-1.9.1/docs/source/reference/tabular/files/tabularsection.rst +9 -0
  64. cfinterface-1.9.1/docs/source/reference/tabular/index.rst +10 -0
  65. cfinterface-1.9.1/docs/source/reference/versioning/files/versioning.rst +40 -0
  66. cfinterface-1.9.1/docs/source/reference/versioning/index.rst +9 -0
  67. cfinterface-1.9.1/examples/plot_block_file.py +201 -0
  68. cfinterface-1.9.1/examples/plot_register_file.py +137 -0
  69. cfinterface-1.9.1/examples/plot_section_file.py +201 -0
  70. cfinterface-1.9.1/examples/plot_tabular_parsing.py +93 -0
  71. cfinterface-1.9.1/examples/plot_versioned_file.py +184 -0
  72. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/.implementation-state.json +172 -0
  73. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/00-master-plan.md +143 -0
  74. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/README.md +55 -0
  75. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/00-epic-overview.md +49 -0
  76. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/learnings.md +91 -0
  77. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-001-create-null-checking-utility.md +176 -0
  78. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-002-replace-pd-isnull-in-fields.md +177 -0
  79. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-003-lazy-pandas-import-in-registerfile.md +143 -0
  80. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-004-move-pandas-to-optional-dependency.md +153 -0
  81. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/00-epic-overview.md +60 -0
  82. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/learnings.md +76 -0
  83. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-005-compile-regex-patterns.md +183 -0
  84. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-006-create-storagetype-enum.md +180 -0
  85. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-007-update-factory-functions.md +194 -0
  86. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-008-migrate-internal-storage-usage.md +243 -0
  87. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-009-add-deprecation-warnings.md +193 -0
  88. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/00-epic-overview.md +25 -0
  89. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/learnings.md +69 -0
  90. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/ticket-010-optimize-floatfield-write.md +242 -0
  91. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/ticket-011-add-floatfield-benchmarks.md +224 -0
  92. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/00-epic-overview.md +33 -0
  93. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/learnings.md +96 -0
  94. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-012-list-backed-registerdata.md +160 -0
  95. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-013-list-backed-blockdata.md +158 -0
  96. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-014-list-backed-sectiondata.md +156 -0
  97. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-015-computed-prev-next-properties.md +266 -0
  98. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-016-type-indexed-lookup.md +199 -0
  99. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/00-epic-overview.md +29 -0
  100. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/learnings.md +209 -0
  101. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-017-typed-field-protocol.md +175 -0
  102. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-018-typed-repository-signatures.md +210 -0
  103. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-019-typed-line-dispatch.md +159 -0
  104. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-020-typed-component-io.md +249 -0
  105. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/00-epic-overview.md +27 -0
  106. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-021-tabular-parser-engine.md +198 -0
  107. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-022-tabular-section-base.md +220 -0
  108. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-023-delimited-tabular-parsing.md +198 -0
  109. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/00-epic-overview.md +32 -0
  110. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/learnings.md +62 -0
  111. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-024-schema-version-descriptor.md +133 -0
  112. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-025-instance-level-version-binding.md +162 -0
  113. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-026-batch-read-api.md +164 -0
  114. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-027-version-validation.md +214 -0
  115. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-01-summary.md +41 -0
  116. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-02-summary.md +64 -0
  117. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-03-summary.md +80 -0
  118. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-04-summary.md +79 -0
  119. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-05-summary.md +96 -0
  120. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-06-summary.md +130 -0
  121. cfinterface-1.9.1/plans/cfinterface-architecture-improvement/learnings/epic-07-summary.md +125 -0
  122. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/.implementation-state.json +449 -0
  123. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/00-master-plan.md +119 -0
  124. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/README.md +69 -0
  125. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/00-epic-overview.md +44 -0
  126. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-001-update-classifiers-and-metadata.md +117 -0
  127. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-002-add-pytest-configuration.md +118 -0
  128. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-003-add-mypy-configuration.md +157 -0
  129. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-004-fix-mypy-strict-errors.md +141 -0
  130. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-005-add-coverage-and-ruff-config.md +131 -0
  131. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-006-add-py-typed-and-dev-deps.md +138 -0
  132. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/00-epic-overview.md +41 -0
  133. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-007-expand-test-matrix.md +166 -0
  134. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-008-extract-lint-job.md +138 -0
  135. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-009-create-benchmark-workflow.md +135 -0
  136. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-010-update-docs-and-publish-workflows.md +189 -0
  137. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/00-epic-overview.md +40 -0
  138. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-011-create-conftest-and-fixtures.md +195 -0
  139. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-012-add-hypothesis-field-tests.md +205 -0
  140. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-013-add-hypothesis-tabular-tests.md +238 -0
  141. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-014-migrate-to-pytest-benchmark.md +179 -0
  142. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/00-epic-overview.md +41 -0
  143. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-015-add-tabular-reference-pages.md +155 -0
  144. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-016-add-versioning-reference-page.md +151 -0
  145. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-017-add-storage-and-adapter-pages.md +181 -0
  146. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-018-fix-docstrings-and-index.md +157 -0
  147. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/00-epic-overview.md +33 -0
  148. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/ticket-019-create-changelog.md +169 -0
  149. cfinterface-1.9.1/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/ticket-020-release-prep-review.md +124 -0
  150. cfinterface-1.9.1/plans/infra-docs-overhaul/.implementation-state.json +337 -0
  151. cfinterface-1.9.1/plans/infra-docs-overhaul/00-master-plan.md +107 -0
  152. cfinterface-1.9.1/plans/infra-docs-overhaul/README.md +81 -0
  153. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/00-epic-overview.md +26 -0
  154. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-001-add-pre-commit-configuration.md +124 -0
  155. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-002-upgrade-github-actions-versions.md +103 -0
  156. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-003-migrate-docs-deployment.md +149 -0
  157. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-02-sphinx-modernization/00-epic-overview.md +27 -0
  158. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-004-migrate-sphinx-theme-to-furo.md +119 -0
  159. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-005-add-sphinx-gallery-examples.md +119 -0
  160. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-006-update-conf-language-intersphinx.md +113 -0
  161. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-03-documentation-content/00-epic-overview.md +30 -0
  162. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-007-create-architecture-overview.md +132 -0
  163. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-008-create-faq-page.md +129 -0
  164. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-009-create-migration-guide.md +138 -0
  165. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-010-create-performance-tips-page.md +131 -0
  166. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-011-update-contributing-rst.md +130 -0
  167. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-04-repository-polish/00-epic-overview.md +23 -0
  168. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-04-repository-polish/ticket-012-create-root-contributing-md.md +106 -0
  169. cfinterface-1.9.1/plans/infra-docs-overhaul/epic-04-repository-polish/ticket-013-restructure-index-rst.md +142 -0
  170. cfinterface-1.9.1/plans/infra-docs-overhaul/learnings/epic-01-summary.md +29 -0
  171. cfinterface-1.9.1/plans/infra-docs-overhaul/learnings/epic-02-summary.md +31 -0
  172. cfinterface-1.9.1/plans/infra-docs-overhaul/learnings/epic-03-summary.md +28 -0
  173. cfinterface-1.9.1/pyproject.toml +122 -0
  174. cfinterface-1.9.1/tests/_utils/test_is_null.py +63 -0
  175. cfinterface-1.9.1/tests/adapters/components/test_factory.py +67 -0
  176. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/adapters/components/test_linerepository.py +26 -0
  177. cfinterface-1.9.1/tests/adapters/components/test_pattern_cache.py +25 -0
  178. cfinterface-1.9.1/tests/adapters/components/test_registerrepository.py +28 -0
  179. cfinterface-1.9.1/tests/components/conftest.py +73 -0
  180. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_block.py +25 -8
  181. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_defaultblock.py +3 -3
  182. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_defaultregister.py +3 -3
  183. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_defaultsection.py +3 -3
  184. cfinterface-1.9.1/tests/components/test_field.py +69 -0
  185. cfinterface-1.9.1/tests/components/test_field_hypothesis.py +259 -0
  186. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_floatfield.py +88 -6
  187. cfinterface-1.9.1/tests/components/test_floatfield_benchmark.py +56 -0
  188. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_integerfield.py +15 -1
  189. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_register.py +27 -7
  190. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_section.py +5 -6
  191. cfinterface-1.9.1/tests/components/test_storage_integration.py +19 -0
  192. cfinterface-1.9.1/tests/components/test_tabular.py +747 -0
  193. cfinterface-1.9.1/tests/components/test_tabular_hypothesis.py +186 -0
  194. cfinterface-1.9.1/tests/conftest.py +31 -0
  195. cfinterface-1.9.1/tests/data/test_blockdata.py +293 -0
  196. cfinterface-1.9.1/tests/data/test_registerdata.py +302 -0
  197. cfinterface-1.9.1/tests/data/test_sectiondata.py +285 -0
  198. cfinterface-1.9.1/tests/files/test_blockfile.py +306 -0
  199. cfinterface-1.9.1/tests/files/test_registerfile.py +261 -0
  200. cfinterface-1.9.1/tests/files/test_sectionfile.py +246 -0
  201. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/mocks/mock_open.py +1 -1
  202. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/reading/test_blockreading.py +3 -5
  203. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/reading/test_registerreading.py +2 -3
  204. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/reading/test_sectionreading.py +3 -5
  205. cfinterface-1.9.1/tests/test_storage.py +28 -0
  206. cfinterface-1.9.1/tests/test_storage_deprecation.py +64 -0
  207. cfinterface-1.9.1/tests/test_versioning.py +158 -0
  208. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/writing/test_blockwriting.py +4 -5
  209. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/writing/test_sectionwriting.py +4 -5
  210. cfinterface-1.8.3/.github/workflows/docs.yml +0 -33
  211. cfinterface-1.8.3/.github/workflows/main.yml +0 -46
  212. cfinterface-1.8.3/.github/workflows/publish.yml +0 -39
  213. cfinterface-1.8.3/PKG-INFO +0 -98
  214. cfinterface-1.8.3/README.md +0 -48
  215. cfinterface-1.8.3/cfinterface/__init__.py +0 -15
  216. cfinterface-1.8.3/cfinterface/adapters/components/line/repository.py +0 -189
  217. cfinterface-1.8.3/cfinterface/adapters/components/repository.py +0 -255
  218. cfinterface-1.8.3/cfinterface/adapters/reading/repository.py +0 -129
  219. cfinterface-1.8.3/cfinterface/adapters/writing/repository.py +0 -109
  220. cfinterface-1.8.3/cfinterface/components/block.py +0 -128
  221. cfinterface-1.8.3/cfinterface/components/defaultregister.py +0 -49
  222. cfinterface-1.8.3/cfinterface/components/section.py +0 -103
  223. cfinterface-1.8.3/cfinterface/data/blockdata.py +0 -175
  224. cfinterface-1.8.3/cfinterface/data/registerdata.py +0 -176
  225. cfinterface-1.8.3/cfinterface/data/sectiondata.py +0 -177
  226. cfinterface-1.8.3/cfinterface/files/blockfile.py +0 -118
  227. cfinterface-1.8.3/cfinterface/files/registerfile.py +0 -139
  228. cfinterface-1.8.3/cfinterface/files/sectionfile.py +0 -118
  229. cfinterface-1.8.3/docs/source/getting_started/contributing.rst +0 -50
  230. cfinterface-1.8.3/docs/source/index.rst +0 -38
  231. cfinterface-1.8.3/pyproject.toml +0 -55
  232. cfinterface-1.8.3/tests/components/test_field.py +0 -20
  233. cfinterface-1.8.3/tests/data/test_blockdata.py +0 -136
  234. cfinterface-1.8.3/tests/data/test_registerdata.py +0 -133
  235. cfinterface-1.8.3/tests/data/test_sectiondata.py +0 -133
  236. cfinterface-1.8.3/tests/files/test_blockfile.py +0 -153
  237. cfinterface-1.8.3/tests/files/test_registerfile.py +0 -125
  238. cfinterface-1.8.3/tests/files/test_sectionfile.py +0 -133
  239. {cfinterface-1.8.3 → cfinterface-1.9.1}/LICENSE +0 -0
  240. {cfinterface-1.8.3/cfinterface/_utils → cfinterface-1.9.1/benchmarks}/__init__.py +0 -0
  241. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/adapters/__init__.py +0 -0
  242. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/adapters/components/__init__.py +0 -0
  243. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/adapters/components/line/__init__.py +0 -0
  244. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/adapters/reading/__init__.py +0 -0
  245. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/adapters/writing/__init__.py +0 -0
  246. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/data/__init__.py +0 -0
  247. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/files/__init__.py +0 -0
  248. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/py.typed +0 -0
  249. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/reading/__init__.py +0 -0
  250. {cfinterface-1.8.3 → cfinterface-1.9.1}/cfinterface/writing/__init__.py +0 -0
  251. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/install/install.rst +0 -0
  252. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/blocks/files/block.rst +0 -0
  253. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/blocks/files/blockdata.rst +0 -0
  254. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/blocks/files/blockfile.rst +0 -0
  255. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/blocks/index.rst +0 -0
  256. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/fields/components/datetimefield.rst +0 -0
  257. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/fields/components/field.rst +0 -0
  258. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/fields/components/floatfield.rst +0 -0
  259. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/fields/components/integerfield.rst +0 -0
  260. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/fields/components/literalfield.rst +0 -0
  261. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/fields/index.rst +0 -0
  262. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/line/index.rst +0 -0
  263. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/registers/files/register.rst +0 -0
  264. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/registers/files/registerdata.rst +0 -0
  265. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/registers/files/registerfile.rst +0 -0
  266. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/registers/index.rst +0 -0
  267. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/sections/files/section.rst +0 -0
  268. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/sections/files/sectiondata.rst +0 -0
  269. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/sections/files/sectionfile.rst +0 -0
  270. {cfinterface-1.8.3 → cfinterface-1.9.1}/docs/source/reference/sections/index.rst +0 -0
  271. {cfinterface-1.8.3 → cfinterface-1.9.1}/examples/README.rst +0 -0
  272. {cfinterface-1.8.3 → cfinterface-1.9.1}/examples/__init__.py +0 -0
  273. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/__init__.py +0 -0
  274. {cfinterface-1.8.3/tests/adapters → cfinterface-1.9.1/tests/_utils}/__init__.py +0 -0
  275. {cfinterface-1.8.3/tests/adapters/components → cfinterface-1.9.1/tests/adapters}/__init__.py +0 -0
  276. {cfinterface-1.8.3/tests/adapters/reading → cfinterface-1.9.1/tests/adapters/components}/__init__.py +0 -0
  277. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/adapters/components/test_blockrepository.py +0 -0
  278. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/adapters/components/test_sectionrepository.py +0 -0
  279. {cfinterface-1.8.3/tests/adapters/writing → cfinterface-1.9.1/tests/adapters/reading}/__init__.py +0 -0
  280. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/adapters/reading/test_readingrepository.py +0 -0
  281. {cfinterface-1.8.3/tests/components → cfinterface-1.9.1/tests/adapters/writing}/__init__.py +0 -0
  282. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/adapters/writing/test_writingrepository.py +0 -0
  283. {cfinterface-1.8.3/tests/data → cfinterface-1.9.1/tests/components}/__init__.py +0 -0
  284. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_datetimefield.py +0 -0
  285. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_line.py +0 -0
  286. {cfinterface-1.8.3 → cfinterface-1.9.1}/tests/components/test_literalfield.py +0 -0
  287. {cfinterface-1.8.3/tests/files → cfinterface-1.9.1/tests/data}/__init__.py +0 -0
  288. {cfinterface-1.8.3/tests/mocks → cfinterface-1.9.1/tests/files}/__init__.py +0 -0
  289. {cfinterface-1.8.3/tests/reading → cfinterface-1.9.1/tests/mocks}/__init__.py +0 -0
  290. {cfinterface-1.8.3/tests/writing → cfinterface-1.9.1/tests/reading}/__init__.py +0 -0
  291. cfinterface-1.8.3/tests/adapters/components/test_registerrepository.py → cfinterface-1.9.1/tests/writing/__init__.py +0 -0
  292. {cfinterface-1.8.3 → cfinterface-1.9.1}/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
@@ -70,6 +70,10 @@ instance/
70
70
 
71
71
  # Sphinx documentation
72
72
  docs/_build/
73
+ docs/build/
74
+ docs/source/examples/
75
+ docs/source/gen_modules/
76
+ docs/source/sg_execution_times.rst
73
77
 
74
78
  # PyBuilder
75
79
  target/
@@ -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,79 @@
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.1] - 2026-03-08
11
+
12
+ ### Fixed
13
+
14
+ - Translate all documentation and examples from pt-BR to English, matching the project's established language
15
+ - Change Sphinx language setting from `pt_BR` to `en`
16
+
17
+ ## [1.9.0] - 2026-03-08
18
+
19
+ ### Added
20
+
21
+ - `StorageType` enum (`cfinterface/storage.py`) for type-safe `TEXT`/`BINARY` dispatch, replacing bare string literals
22
+ - `TabularParser` class (`cfinterface/components/tabular.py`) for generic, schema-driven tabular file parsing
23
+ - `TabularSection` convenience base class for sections backed by a tabular data block
24
+ - `ColumnDef` named tuple for declaring column schemas (name, width, dtype, default) in `TabularParser`
25
+ - Delimited tabular parsing support (CSV-style, semicolon-separated, and custom delimiters) in `TabularParser`
26
+ - `SchemaVersion` descriptor (`cfinterface/versioning.py`) for declarative version binding on file classes
27
+ - `resolve_version()` utility function for resolving the active schema version at read/write time
28
+ - `VersionMatchResult` named tuple for structured version comparison results
29
+ - `validate_version()` function for detecting version mismatches between file schema and actual content
30
+ - `read_many()` batch read API on `RegisterFile`, `BlockFile`, and `SectionFile` for reading multiple files in one call
31
+ - `validate()` method on file classes for programmatic version mismatch detection
32
+ - `py.typed` marker file for PEP 561 compliance, enabling downstream type checking of cfinterface
33
+ - Hypothesis property-based tests for `Field` round-trip correctness (`tests/components/test_field_hypothesis.py`)
34
+ - Hypothesis property-based tests for `TabularParser` parsing invariants (`tests/components/test_tabular_hypothesis.py`)
35
+ - pytest-benchmark integration for performance regression testing (`tests/components/test_floatfield_benchmark.py`)
36
+ - Sphinx reference documentation for `TabularParser`, versioning module, `StorageType`, and adapter classes
37
+ - CI test matrix covering Python 3.10, 3.11, 3.12, 3.13, and 3.14 on Linux, plus Python 3.12 on Windows
38
+ - Separated lint/quality CI job running mypy, ruff, ty (informational), and `sphinx-build -W`
39
+ - Manual-dispatch benchmark CI workflow (`.github/workflows/benchmark.yml`) for on-demand performance profiling
40
+ - Pre-commit configuration with ruff (lint + format) and mypy hooks (`.pre-commit-config.yaml`)
41
+ - Sphinx gallery examples for `BlockFile` and `SectionFile` usage (`examples/plot_block_file.py`, `examples/plot_section_file.py`)
42
+ - Documentation pages in pt-BR: architecture overview, FAQ, migration guide (v1.8→v1.9), and performance tips
43
+ - Root-level `CONTRIBUTING.md` in pt-BR with links to full Sphinx contributing page
44
+
45
+ ### Changed
46
+
47
+ - pandas moved from required to optional dependency; install via `pip install cfinterface[pandas]`
48
+ - Only `numpy>=2.0.0` remains as a hard runtime dependency
49
+ - Regex patterns in the adapter layer are now compiled and cached at first use via `_pattern_cache`, eliminating per-call recompilation
50
+ - `FloatField._textual_write()` optimized from an O(decimal_digits) trial loop to at most 3 format attempts
51
+ - `RegisterData`, `BlockData`, and `SectionData` migrated from linked-list structures to array-backed (`list`) containers with O(1) `len()` and type-indexed lookups
52
+ - `Register.previous`/`next`, `Block.previous`/`next`, and `Section.previous`/`next` are now computed properties derived from container position instead of stored linked-list pointers
53
+ - `Field.read()` and `Field.write()` use `@overload` signatures for type-safe `str`/`bytes` dispatch
54
+ - All four adapter `factory()` functions accept `StorageType` enum values in addition to legacy string values
55
+ - `RegisterFile`, `BlockFile`, and `SectionFile` `STORAGE` class attribute defaults changed to `StorageType.TEXT`
56
+ - pyproject.toml expanded with `[tool.mypy]`, `[tool.pytest.ini_options]`, `[tool.coverage]`, and an expanded `[tool.ruff.lint]` section
57
+ - Python classifiers updated to include 3.10, 3.11, 3.12, 3.13, and 3.14
58
+ - `docs.yml` and `publish.yml` GitHub Actions workflows modernized to use `uv` and consistent job patterns
59
+ - All GitHub Actions upgraded to latest versions (`setup-uv@v6`, `codecov-action@v5`)
60
+ - Docs deployment migrated from `peaceiris/actions-gh-pages` to official `actions/deploy-pages`
61
+ - Sphinx theme migrated from `sphinx-rtd-theme` to Furo (dark mode, mobile-responsive)
62
+ - Sphinx language setting changed from `en_US` to `pt_BR`
63
+ - Intersphinx pandas URL updated from HTTP to HTTPS
64
+ - `docs/source/getting_started/contributing.rst` rewritten in pt-BR with correct repository URL and uv-based workflow
65
+ - `docs/source/index.rst` restructured with Guias and Recursos toctree sections
66
+
67
+ ### Deprecated
68
+
69
+ - 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)
70
+ - `set_version()` method on file classes; pass the `version=` keyword argument to `read()` instead
71
+
72
+ ### Fixed
73
+
74
+ - Null value detection in `Field` write methods now uses `math.isnan()` instead of `pd.isnull()`, eliminating the unnecessary pandas import at module level
75
+ - `RegisterFile._as_df()` now performs a lazy pandas import, only importing the library when the method is actually called
76
+
77
+ [Unreleased]: https://github.com/rjmalves/cfinterface/compare/v1.9.1...HEAD
78
+ [1.9.1]: https://github.com/rjmalves/cfinterface/compare/v1.9.0...v1.9.1
79
+ [1.9.0]: https://github.com/rjmalves/cfinterface/compare/v1.8.3...v1.9.0
@@ -0,0 +1,36 @@
1
+ # Contributing
2
+
3
+ Thank you for your interest in contributing to **cfinterface**! This page
4
+ summarises the essential steps. For detailed instructions, see the
5
+ [full contribution documentation](https://rjmalves.github.io/cfinterface/getting_started/contributing.html).
6
+
7
+ ## Reporting Bugs
8
+
9
+ Found unexpected behavior? Open an
10
+ [issue on GitHub](https://github.com/rjmalves/cfinterface/issues) describing
11
+ the problem. Include the Python version, the operating system, and a code
12
+ snippet that allows the error to be reproduced.
13
+
14
+ ## Submitting Pull Requests
15
+
16
+ Fixes and improvements are welcome via
17
+ [pull request](https://github.com/rjmalves/cfinterface/pulls). Before
18
+ submitting, read the full documentation to ensure that the code follows the
19
+ project conventions and that all tests and quality checks pass.
20
+
21
+ ## Quick Setup
22
+
23
+ ```bash
24
+ git clone https://github.com/rjmalves/cfinterface.git
25
+ cd cfinterface
26
+ uv sync --extra dev
27
+ uv run pre-commit install
28
+ ```
29
+
30
+ ## Full Documentation
31
+
32
+ See the contribution page in the project documentation for details on
33
+ pre-commit hooks, code conventions, running tests, and building the
34
+ documentation:
35
+
36
+ <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.1
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
+ [![tests](https://github.com/rjmalves/cfinterface/workflows/tests/badge.svg)](https://github.com/rjmalves/cfinterface/actions)
66
+ [![codecov](https://codecov.io/gh/rjmalves/cfinterface/branch/main/graph/badge.svg?token=86ZXJGB854)](https://codecov.io/gh/rjmalves/cfinterface)
67
+ [![PyPI version](https://img.shields.io/pypi/v/cfinterface.svg)](https://pypi.org/project/cfinterface/)
68
+ [![Python versions](https://img.shields.io/pypi/pyversions/cfinterface.svg)](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
+ [![tests](https://github.com/rjmalves/cfinterface/workflows/tests/badge.svg)](https://github.com/rjmalves/cfinterface/actions)
4
+ [![codecov](https://codecov.io/gh/rjmalves/cfinterface/branch/main/graph/badge.svg?token=86ZXJGB854)](https://codecov.io/gh/rjmalves/cfinterface)
5
+ [![PyPI version](https://img.shields.io/pypi/v/cfinterface.svg)](https://pypi.org/project/cfinterface/)
6
+ [![Python versions](https://img.shields.io/pypi/pyversions/cfinterface.svg)](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.1"
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