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.
Files changed (292) hide show
  1. cfinterface-1.9.0/.github/workflows/benchmark.yml +34 -0
  2. cfinterface-1.9.0/.github/workflows/docs.yml +45 -0
  3. cfinterface-1.9.0/.github/workflows/main.yml +77 -0
  4. cfinterface-1.9.0/.github/workflows/publish.yml +33 -0
  5. {cfinterface-1.8.3 → cfinterface-1.9.0}/.gitignore +4 -0
  6. cfinterface-1.9.0/.pre-commit-config.yaml +16 -0
  7. cfinterface-1.9.0/CHANGELOG.md +71 -0
  8. cfinterface-1.9.0/CONTRIBUTING.md +37 -0
  9. cfinterface-1.9.0/PKG-INFO +153 -0
  10. cfinterface-1.9.0/README.md +91 -0
  11. cfinterface-1.9.0/benchmarks/bench_floatfield_write.py +82 -0
  12. cfinterface-1.9.0/cfinterface/__init__.py +20 -0
  13. cfinterface-1.9.0/cfinterface/_utils/__init__.py +23 -0
  14. cfinterface-1.9.0/cfinterface/adapters/components/line/repository.py +132 -0
  15. cfinterface-1.9.0/cfinterface/adapters/components/repository.py +129 -0
  16. cfinterface-1.9.0/cfinterface/adapters/reading/repository.py +123 -0
  17. cfinterface-1.9.0/cfinterface/adapters/writing/repository.py +116 -0
  18. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/__init__.py +1 -0
  19. cfinterface-1.9.0/cfinterface/components/block.py +124 -0
  20. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/datetimefield.py +9 -18
  21. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/defaultblock.py +5 -4
  22. cfinterface-1.9.0/cfinterface/components/defaultregister.py +50 -0
  23. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/defaultsection.py +5 -4
  24. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/field.py +25 -41
  25. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/floatfield.py +36 -22
  26. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/integerfield.py +7 -13
  27. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/line.py +26 -36
  28. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/literalfield.py +6 -11
  29. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/components/register.py +87 -68
  30. cfinterface-1.9.0/cfinterface/components/section.py +97 -0
  31. cfinterface-1.9.0/cfinterface/components/tabular.py +181 -0
  32. cfinterface-1.9.0/cfinterface/data/blockdata.py +197 -0
  33. cfinterface-1.9.0/cfinterface/data/registerdata.py +197 -0
  34. cfinterface-1.9.0/cfinterface/data/sectiondata.py +197 -0
  35. cfinterface-1.9.0/cfinterface/files/blockfile.py +153 -0
  36. cfinterface-1.9.0/cfinterface/files/registerfile.py +170 -0
  37. cfinterface-1.9.0/cfinterface/files/sectionfile.py +153 -0
  38. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/blockreading.py +14 -40
  39. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/registerreading.py +16 -42
  40. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/sectionreading.py +14 -30
  41. cfinterface-1.9.0/cfinterface/storage.py +39 -0
  42. cfinterface-1.9.0/cfinterface/versioning.py +87 -0
  43. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/blockwriting.py +15 -10
  44. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/registerwriting.py +14 -10
  45. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/sectionwriting.py +14 -9
  46. cfinterface-1.9.0/docs/source/_static/logo_cfinterface.svg +3 -0
  47. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/conf.py +10 -17
  48. cfinterface-1.9.0/docs/source/getting_started/contributing.rst +104 -0
  49. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/getting_started/tutorial.rst +178 -58
  50. cfinterface-1.9.0/docs/source/guides/architecture.rst +455 -0
  51. cfinterface-1.9.0/docs/source/guides/faq.rst +278 -0
  52. cfinterface-1.9.0/docs/source/guides/migration-v1.9.rst +283 -0
  53. cfinterface-1.9.0/docs/source/guides/performance.rst +217 -0
  54. cfinterface-1.9.0/docs/source/index.rst +56 -0
  55. cfinterface-1.9.0/docs/source/reference/adapters/files/components.rst +17 -0
  56. cfinterface-1.9.0/docs/source/reference/adapters/files/line.rst +17 -0
  57. cfinterface-1.9.0/docs/source/reference/adapters/files/reading.rst +17 -0
  58. cfinterface-1.9.0/docs/source/reference/adapters/files/writing.rst +17 -0
  59. cfinterface-1.9.0/docs/source/reference/adapters/index.rst +12 -0
  60. cfinterface-1.9.0/docs/source/reference/storage/files/storagetype.rst +9 -0
  61. cfinterface-1.9.0/docs/source/reference/storage/index.rst +9 -0
  62. cfinterface-1.9.0/docs/source/reference/tabular/files/tabularparser.rst +20 -0
  63. cfinterface-1.9.0/docs/source/reference/tabular/files/tabularsection.rst +9 -0
  64. cfinterface-1.9.0/docs/source/reference/tabular/index.rst +10 -0
  65. cfinterface-1.9.0/docs/source/reference/versioning/files/versioning.rst +40 -0
  66. cfinterface-1.9.0/docs/source/reference/versioning/index.rst +9 -0
  67. cfinterface-1.9.0/examples/plot_block_file.py +201 -0
  68. cfinterface-1.9.0/examples/plot_register_file.py +137 -0
  69. cfinterface-1.9.0/examples/plot_section_file.py +201 -0
  70. cfinterface-1.9.0/examples/plot_tabular_parsing.py +93 -0
  71. cfinterface-1.9.0/examples/plot_versioned_file.py +184 -0
  72. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/.implementation-state.json +172 -0
  73. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/00-master-plan.md +143 -0
  74. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/README.md +55 -0
  75. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/00-epic-overview.md +49 -0
  76. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/learnings.md +91 -0
  77. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-001-create-null-checking-utility.md +176 -0
  78. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-002-replace-pd-isnull-in-fields.md +177 -0
  79. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-003-lazy-pandas-import-in-registerfile.md +143 -0
  80. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-01-remove-pandas-dependency/ticket-004-move-pandas-to-optional-dependency.md +153 -0
  81. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/00-epic-overview.md +60 -0
  82. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/learnings.md +76 -0
  83. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-005-compile-regex-patterns.md +183 -0
  84. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-006-create-storagetype-enum.md +180 -0
  85. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-007-update-factory-functions.md +194 -0
  86. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-008-migrate-internal-storage-usage.md +243 -0
  87. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-02-compile-regex-and-storage-enum/ticket-009-add-deprecation-warnings.md +193 -0
  88. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/00-epic-overview.md +25 -0
  89. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/learnings.md +69 -0
  90. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/ticket-010-optimize-floatfield-write.md +242 -0
  91. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-03-optimize-float-field-write/ticket-011-add-floatfield-benchmarks.md +224 -0
  92. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/00-epic-overview.md +33 -0
  93. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/learnings.md +96 -0
  94. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-012-list-backed-registerdata.md +160 -0
  95. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-013-list-backed-blockdata.md +158 -0
  96. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-014-list-backed-sectiondata.md +156 -0
  97. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-015-computed-prev-next-properties.md +266 -0
  98. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-04-array-backed-data-containers/ticket-016-type-indexed-lookup.md +199 -0
  99. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/00-epic-overview.md +29 -0
  100. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/learnings.md +209 -0
  101. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-017-typed-field-protocol.md +175 -0
  102. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-018-typed-repository-signatures.md +210 -0
  103. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-019-typed-line-dispatch.md +159 -0
  104. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-05-type-safe-text-binary-dispatch/ticket-020-typed-component-io.md +249 -0
  105. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/00-epic-overview.md +27 -0
  106. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-021-tabular-parser-engine.md +198 -0
  107. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-022-tabular-section-base.md +220 -0
  108. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-06-generic-tabular-parser/ticket-023-delimited-tabular-parsing.md +198 -0
  109. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/00-epic-overview.md +32 -0
  110. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/learnings.md +62 -0
  111. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-024-schema-version-descriptor.md +133 -0
  112. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-025-instance-level-version-binding.md +162 -0
  113. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-026-batch-read-api.md +164 -0
  114. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/epic-07-schema-versioning-and-batch-ops/ticket-027-version-validation.md +214 -0
  115. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-01-summary.md +41 -0
  116. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-02-summary.md +64 -0
  117. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-03-summary.md +80 -0
  118. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-04-summary.md +79 -0
  119. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-05-summary.md +96 -0
  120. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-06-summary.md +130 -0
  121. cfinterface-1.9.0/plans/cfinterface-architecture-improvement/learnings/epic-07-summary.md +125 -0
  122. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/.implementation-state.json +449 -0
  123. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/00-master-plan.md +119 -0
  124. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/README.md +69 -0
  125. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/00-epic-overview.md +44 -0
  126. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-001-update-classifiers-and-metadata.md +117 -0
  127. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-002-add-pytest-configuration.md +118 -0
  128. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-003-add-mypy-configuration.md +157 -0
  129. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-01-pyproject-and-tool-config/ticket-004-fix-mypy-strict-errors.md +141 -0
  130. 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
  131. 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
  132. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/00-epic-overview.md +41 -0
  133. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-007-expand-test-matrix.md +166 -0
  134. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-008-extract-lint-job.md +138 -0
  135. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-009-create-benchmark-workflow.md +135 -0
  136. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-02-ci-overhaul/ticket-010-update-docs-and-publish-workflows.md +189 -0
  137. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/00-epic-overview.md +40 -0
  138. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-011-create-conftest-and-fixtures.md +195 -0
  139. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-012-add-hypothesis-field-tests.md +205 -0
  140. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-013-add-hypothesis-tabular-tests.md +238 -0
  141. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-03-test-infrastructure/ticket-014-migrate-to-pytest-benchmark.md +179 -0
  142. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/00-epic-overview.md +41 -0
  143. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-015-add-tabular-reference-pages.md +155 -0
  144. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-016-add-versioning-reference-page.md +151 -0
  145. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-017-add-storage-and-adapter-pages.md +181 -0
  146. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-04-sphinx-docs/ticket-018-fix-docstrings-and-index.md +157 -0
  147. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/00-epic-overview.md +33 -0
  148. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/ticket-019-create-changelog.md +169 -0
  149. cfinterface-1.9.0/plans/cfinterface-quality-and-ci/epic-05-changelog-and-release-prep/ticket-020-release-prep-review.md +124 -0
  150. cfinterface-1.9.0/plans/infra-docs-overhaul/.implementation-state.json +337 -0
  151. cfinterface-1.9.0/plans/infra-docs-overhaul/00-master-plan.md +107 -0
  152. cfinterface-1.9.0/plans/infra-docs-overhaul/README.md +81 -0
  153. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/00-epic-overview.md +26 -0
  154. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-001-add-pre-commit-configuration.md +124 -0
  155. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-002-upgrade-github-actions-versions.md +103 -0
  156. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-01-ci-and-developer-tooling/ticket-003-migrate-docs-deployment.md +149 -0
  157. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/00-epic-overview.md +27 -0
  158. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-004-migrate-sphinx-theme-to-furo.md +119 -0
  159. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-005-add-sphinx-gallery-examples.md +119 -0
  160. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-02-sphinx-modernization/ticket-006-update-conf-language-intersphinx.md +113 -0
  161. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/00-epic-overview.md +30 -0
  162. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-007-create-architecture-overview.md +132 -0
  163. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-008-create-faq-page.md +129 -0
  164. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-009-create-migration-guide.md +138 -0
  165. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-010-create-performance-tips-page.md +131 -0
  166. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-03-documentation-content/ticket-011-update-contributing-rst.md +130 -0
  167. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-04-repository-polish/00-epic-overview.md +23 -0
  168. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-04-repository-polish/ticket-012-create-root-contributing-md.md +106 -0
  169. cfinterface-1.9.0/plans/infra-docs-overhaul/epic-04-repository-polish/ticket-013-restructure-index-rst.md +142 -0
  170. cfinterface-1.9.0/plans/infra-docs-overhaul/learnings/epic-01-summary.md +29 -0
  171. cfinterface-1.9.0/plans/infra-docs-overhaul/learnings/epic-02-summary.md +31 -0
  172. cfinterface-1.9.0/plans/infra-docs-overhaul/learnings/epic-03-summary.md +28 -0
  173. cfinterface-1.9.0/pyproject.toml +122 -0
  174. cfinterface-1.9.0/tests/_utils/test_is_null.py +63 -0
  175. cfinterface-1.9.0/tests/adapters/components/test_factory.py +67 -0
  176. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/components/test_linerepository.py +26 -0
  177. cfinterface-1.9.0/tests/adapters/components/test_pattern_cache.py +25 -0
  178. cfinterface-1.9.0/tests/adapters/components/test_registerrepository.py +28 -0
  179. cfinterface-1.9.0/tests/components/conftest.py +73 -0
  180. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_block.py +25 -8
  181. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_defaultblock.py +3 -3
  182. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_defaultregister.py +3 -3
  183. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_defaultsection.py +3 -3
  184. cfinterface-1.9.0/tests/components/test_field.py +69 -0
  185. cfinterface-1.9.0/tests/components/test_field_hypothesis.py +259 -0
  186. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_floatfield.py +88 -6
  187. cfinterface-1.9.0/tests/components/test_floatfield_benchmark.py +56 -0
  188. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_integerfield.py +15 -1
  189. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_register.py +27 -7
  190. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_section.py +5 -6
  191. cfinterface-1.9.0/tests/components/test_storage_integration.py +19 -0
  192. cfinterface-1.9.0/tests/components/test_tabular.py +747 -0
  193. cfinterface-1.9.0/tests/components/test_tabular_hypothesis.py +186 -0
  194. cfinterface-1.9.0/tests/conftest.py +31 -0
  195. cfinterface-1.9.0/tests/data/test_blockdata.py +293 -0
  196. cfinterface-1.9.0/tests/data/test_registerdata.py +302 -0
  197. cfinterface-1.9.0/tests/data/test_sectiondata.py +285 -0
  198. cfinterface-1.9.0/tests/files/test_blockfile.py +306 -0
  199. cfinterface-1.9.0/tests/files/test_registerfile.py +261 -0
  200. cfinterface-1.9.0/tests/files/test_sectionfile.py +246 -0
  201. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/mocks/mock_open.py +1 -1
  202. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/reading/test_blockreading.py +3 -5
  203. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/reading/test_registerreading.py +2 -3
  204. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/reading/test_sectionreading.py +3 -5
  205. cfinterface-1.9.0/tests/test_storage.py +28 -0
  206. cfinterface-1.9.0/tests/test_storage_deprecation.py +64 -0
  207. cfinterface-1.9.0/tests/test_versioning.py +158 -0
  208. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/writing/test_blockwriting.py +4 -5
  209. {cfinterface-1.8.3 → cfinterface-1.9.0}/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.0}/LICENSE +0 -0
  240. {cfinterface-1.8.3/cfinterface/_utils → cfinterface-1.9.0/benchmarks}/__init__.py +0 -0
  241. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/__init__.py +0 -0
  242. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/components/__init__.py +0 -0
  243. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/components/line/__init__.py +0 -0
  244. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/reading/__init__.py +0 -0
  245. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/adapters/writing/__init__.py +0 -0
  246. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/data/__init__.py +0 -0
  247. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/files/__init__.py +0 -0
  248. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/py.typed +0 -0
  249. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/reading/__init__.py +0 -0
  250. {cfinterface-1.8.3 → cfinterface-1.9.0}/cfinterface/writing/__init__.py +0 -0
  251. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/install/install.rst +0 -0
  252. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/files/block.rst +0 -0
  253. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/files/blockdata.rst +0 -0
  254. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/files/blockfile.rst +0 -0
  255. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/blocks/index.rst +0 -0
  256. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/datetimefield.rst +0 -0
  257. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/field.rst +0 -0
  258. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/floatfield.rst +0 -0
  259. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/integerfield.rst +0 -0
  260. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/components/literalfield.rst +0 -0
  261. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/fields/index.rst +0 -0
  262. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/line/index.rst +0 -0
  263. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/files/register.rst +0 -0
  264. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/files/registerdata.rst +0 -0
  265. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/files/registerfile.rst +0 -0
  266. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/registers/index.rst +0 -0
  267. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/files/section.rst +0 -0
  268. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/files/sectiondata.rst +0 -0
  269. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/files/sectionfile.rst +0 -0
  270. {cfinterface-1.8.3 → cfinterface-1.9.0}/docs/source/reference/sections/index.rst +0 -0
  271. {cfinterface-1.8.3 → cfinterface-1.9.0}/examples/README.rst +0 -0
  272. {cfinterface-1.8.3 → cfinterface-1.9.0}/examples/__init__.py +0 -0
  273. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/__init__.py +0 -0
  274. {cfinterface-1.8.3/tests/adapters → cfinterface-1.9.0/tests/_utils}/__init__.py +0 -0
  275. {cfinterface-1.8.3/tests/adapters/components → cfinterface-1.9.0/tests/adapters}/__init__.py +0 -0
  276. {cfinterface-1.8.3/tests/adapters/reading → cfinterface-1.9.0/tests/adapters/components}/__init__.py +0 -0
  277. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/components/test_blockrepository.py +0 -0
  278. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/components/test_sectionrepository.py +0 -0
  279. {cfinterface-1.8.3/tests/adapters/writing → cfinterface-1.9.0/tests/adapters/reading}/__init__.py +0 -0
  280. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/reading/test_readingrepository.py +0 -0
  281. {cfinterface-1.8.3/tests/components → cfinterface-1.9.0/tests/adapters/writing}/__init__.py +0 -0
  282. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/adapters/writing/test_writingrepository.py +0 -0
  283. {cfinterface-1.8.3/tests/data → cfinterface-1.9.0/tests/components}/__init__.py +0 -0
  284. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_datetimefield.py +0 -0
  285. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_line.py +0 -0
  286. {cfinterface-1.8.3 → cfinterface-1.9.0}/tests/components/test_literalfield.py +0 -0
  287. {cfinterface-1.8.3/tests/files → cfinterface-1.9.0/tests/data}/__init__.py +0 -0
  288. {cfinterface-1.8.3/tests/mocks → cfinterface-1.9.0/tests/files}/__init__.py +0 -0
  289. {cfinterface-1.8.3/tests/reading → cfinterface-1.9.0/tests/mocks}/__init__.py +0 -0
  290. {cfinterface-1.8.3/tests/writing → cfinterface-1.9.0/tests/reading}/__init__.py +0 -0
  291. cfinterface-1.8.3/tests/adapters/components/test_registerrepository.py → cfinterface-1.9.0/tests/writing/__init__.py +0 -0
  292. {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
@@ -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,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
+ [![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.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