cfinterface 1.10.3__tar.gz → 1.10.4__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 (164) hide show
  1. {cfinterface-1.10.3 → cfinterface-1.10.4}/CHANGELOG.md +6 -0
  2. {cfinterface-1.10.3 → cfinterface-1.10.4}/PKG-INFO +1 -1
  3. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/__init__.py +1 -1
  4. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/reading/blockreading.py +1 -0
  5. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/reading/sectionreading.py +1 -0
  6. cfinterface-1.10.4/tests/files/test_encoding_fallback.py +49 -0
  7. {cfinterface-1.10.3 → cfinterface-1.10.4}/.github/workflows/benchmark.yml +0 -0
  8. {cfinterface-1.10.3 → cfinterface-1.10.4}/.github/workflows/docs.yml +0 -0
  9. {cfinterface-1.10.3 → cfinterface-1.10.4}/.github/workflows/main.yml +0 -0
  10. {cfinterface-1.10.3 → cfinterface-1.10.4}/.github/workflows/publish.yml +0 -0
  11. {cfinterface-1.10.3 → cfinterface-1.10.4}/.gitignore +0 -0
  12. {cfinterface-1.10.3 → cfinterface-1.10.4}/.pre-commit-config.yaml +0 -0
  13. {cfinterface-1.10.3 → cfinterface-1.10.4}/CONTRIBUTING.md +0 -0
  14. {cfinterface-1.10.3 → cfinterface-1.10.4}/LICENSE +0 -0
  15. {cfinterface-1.10.3 → cfinterface-1.10.4}/README.md +0 -0
  16. {cfinterface-1.10.3 → cfinterface-1.10.4}/benchmarks/__init__.py +0 -0
  17. {cfinterface-1.10.3 → cfinterface-1.10.4}/benchmarks/bench_floatfield_write.py +0 -0
  18. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/_utils/__init__.py +0 -0
  19. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/__init__.py +0 -0
  20. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/components/__init__.py +0 -0
  21. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/components/line/__init__.py +0 -0
  22. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/components/line/repository.py +0 -0
  23. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/components/repository.py +0 -0
  24. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/reading/__init__.py +0 -0
  25. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/reading/repository.py +0 -0
  26. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/writing/__init__.py +0 -0
  27. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/adapters/writing/repository.py +0 -0
  28. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/__init__.py +0 -0
  29. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/block.py +0 -0
  30. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/datetimefield.py +0 -0
  31. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/defaultblock.py +0 -0
  32. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/defaultregister.py +0 -0
  33. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/defaultsection.py +0 -0
  34. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/field.py +0 -0
  35. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/floatfield.py +0 -0
  36. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/integerfield.py +0 -0
  37. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/line.py +0 -0
  38. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/literalfield.py +0 -0
  39. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/register.py +0 -0
  40. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/section.py +0 -0
  41. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/components/tabular.py +0 -0
  42. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/data/__init__.py +0 -0
  43. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/data/blockdata.py +0 -0
  44. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/data/registerdata.py +0 -0
  45. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/data/sectiondata.py +0 -0
  46. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/files/__init__.py +0 -0
  47. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/files/blockfile.py +0 -0
  48. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/files/registerfile.py +0 -0
  49. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/files/sectionfile.py +0 -0
  50. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/py.typed +0 -0
  51. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/reading/__init__.py +0 -0
  52. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/reading/registerreading.py +0 -0
  53. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/storage.py +0 -0
  54. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/versioning.py +0 -0
  55. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/writing/__init__.py +0 -0
  56. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/writing/blockwriting.py +0 -0
  57. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/writing/registerwriting.py +0 -0
  58. {cfinterface-1.10.3 → cfinterface-1.10.4}/cfinterface/writing/sectionwriting.py +0 -0
  59. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/_static/logo_cfinterface.svg +0 -0
  60. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/conf.py +0 -0
  61. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/getting_started/contributing.rst +0 -0
  62. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/getting_started/tutorial.rst +0 -0
  63. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/guides/architecture.rst +0 -0
  64. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/guides/faq.rst +0 -0
  65. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/guides/migration-v1.9.rst +0 -0
  66. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/guides/performance.rst +0 -0
  67. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/index.rst +0 -0
  68. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/install/install.rst +0 -0
  69. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/adapters/files/components.rst +0 -0
  70. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/adapters/files/line.rst +0 -0
  71. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/adapters/files/reading.rst +0 -0
  72. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/adapters/files/writing.rst +0 -0
  73. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/adapters/index.rst +0 -0
  74. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/blocks/files/block.rst +0 -0
  75. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/blocks/files/blockdata.rst +0 -0
  76. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/blocks/files/blockfile.rst +0 -0
  77. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/blocks/index.rst +0 -0
  78. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/fields/components/datetimefield.rst +0 -0
  79. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/fields/components/field.rst +0 -0
  80. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/fields/components/floatfield.rst +0 -0
  81. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/fields/components/integerfield.rst +0 -0
  82. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/fields/components/literalfield.rst +0 -0
  83. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/fields/index.rst +0 -0
  84. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/line/index.rst +0 -0
  85. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/registers/files/register.rst +0 -0
  86. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/registers/files/registerdata.rst +0 -0
  87. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/registers/files/registerfile.rst +0 -0
  88. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/registers/index.rst +0 -0
  89. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/sections/files/section.rst +0 -0
  90. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/sections/files/sectiondata.rst +0 -0
  91. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/sections/files/sectionfile.rst +0 -0
  92. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/sections/index.rst +0 -0
  93. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/storage/files/storagetype.rst +0 -0
  94. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/storage/index.rst +0 -0
  95. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/tabular/files/tabularparser.rst +0 -0
  96. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/tabular/files/tabularsection.rst +0 -0
  97. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/tabular/index.rst +0 -0
  98. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/versioning/files/versioning.rst +0 -0
  99. {cfinterface-1.10.3 → cfinterface-1.10.4}/docs/source/reference/versioning/index.rst +0 -0
  100. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/README.rst +0 -0
  101. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/__init__.py +0 -0
  102. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/plot_block_file.py +0 -0
  103. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/plot_register_file.py +0 -0
  104. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/plot_section_file.py +0 -0
  105. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/plot_tabular_parsing.py +0 -0
  106. {cfinterface-1.10.3 → cfinterface-1.10.4}/examples/plot_versioned_file.py +0 -0
  107. {cfinterface-1.10.3 → cfinterface-1.10.4}/pyproject.toml +0 -0
  108. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/__init__.py +0 -0
  109. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/_utils/__init__.py +0 -0
  110. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/_utils/test_is_null.py +0 -0
  111. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/__init__.py +0 -0
  112. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/__init__.py +0 -0
  113. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/test_blockrepository.py +0 -0
  114. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/test_factory.py +0 -0
  115. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/test_linerepository.py +0 -0
  116. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/test_pattern_cache.py +0 -0
  117. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/test_registerrepository.py +0 -0
  118. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/components/test_sectionrepository.py +0 -0
  119. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/reading/__init__.py +0 -0
  120. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/reading/test_readingrepository.py +0 -0
  121. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/writing/__init__.py +0 -0
  122. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/adapters/writing/test_writingrepository.py +0 -0
  123. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/__init__.py +0 -0
  124. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/conftest.py +0 -0
  125. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_block.py +0 -0
  126. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_datetimefield.py +0 -0
  127. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_defaultblock.py +0 -0
  128. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_defaultregister.py +0 -0
  129. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_defaultsection.py +0 -0
  130. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_field.py +0 -0
  131. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_field_hypothesis.py +0 -0
  132. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_floatfield.py +0 -0
  133. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_floatfield_benchmark.py +0 -0
  134. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_integerfield.py +0 -0
  135. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_line.py +0 -0
  136. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_literalfield.py +0 -0
  137. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_register.py +0 -0
  138. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_section.py +0 -0
  139. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_storage_integration.py +0 -0
  140. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_tabular.py +0 -0
  141. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/components/test_tabular_hypothesis.py +0 -0
  142. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/conftest.py +0 -0
  143. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/data/__init__.py +0 -0
  144. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/data/test_blockdata.py +0 -0
  145. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/data/test_registerdata.py +0 -0
  146. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/data/test_sectiondata.py +0 -0
  147. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/files/__init__.py +0 -0
  148. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/files/test_blockfile.py +0 -0
  149. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/files/test_read_typing.py +0 -0
  150. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/files/test_registerfile.py +0 -0
  151. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/files/test_sectionfile.py +0 -0
  152. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/mocks/__init__.py +0 -0
  153. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/mocks/mock_open.py +0 -0
  154. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/reading/__init__.py +0 -0
  155. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/reading/test_blockreading.py +0 -0
  156. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/reading/test_registerreading.py +0 -0
  157. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/reading/test_sectionreading.py +0 -0
  158. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/test_storage.py +0 -0
  159. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/test_storage_deprecation.py +0 -0
  160. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/test_versioning.py +0 -0
  161. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/writing/__init__.py +0 -0
  162. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/writing/test_blockwriting.py +0 -0
  163. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/writing/test_registerwriting.py +0 -0
  164. {cfinterface-1.10.3 → cfinterface-1.10.4}/tests/writing/test_sectionwriting.py +0 -0
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.10.4] - 2026-11-14
11
+
12
+ ### Fixed
13
+
14
+ - `SectionReading.read()` and `BlockReading.read()` now reset their internal data before each call, as `RegisterReading.read()` does since 1.10.0; a Latin-1 file whose first non-ASCII byte comes after the first 8 KiB used to return the sections or blocks read before the `UnicodeDecodeError` twice
15
+
10
16
  ## [1.10.3] - 2026-10-30
11
17
 
12
18
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cfinterface
3
- Version: 1.10.3
3
+ Version: 1.10.4
4
4
  Summary: Interface for handling custom formatted files
5
5
  Project-URL: Documentation, https://rjmalves.github.io/cfinterface/
6
6
  Project-URL: Repository, https://github.com/rjmalves/cfinterface/
@@ -6,7 +6,7 @@ cfi is a Python module for handling custom formatted files
6
6
  and provide reading, storing and writing utilities.
7
7
  """
8
8
 
9
- __version__ = "1.10.3"
9
+ __version__ = "1.10.4"
10
10
 
11
11
  from . import components # noqa
12
12
  from . import data # noqa
@@ -78,6 +78,7 @@ class BlockReading:
78
78
  :return: The data from the blocks found in the file
79
79
  :rtype: BlockData
80
80
  """
81
+ self.__data = BlockData(DefaultBlock(data=""))
81
82
  self.__repository = factory(self.__storage)(
82
83
  content, not isfile(content), encoding
83
84
  )
@@ -75,6 +75,7 @@ class SectionReading:
75
75
  :return: The data from the sections found in the file
76
76
  :rtype: SectionData
77
77
  """
78
+ self.__data = SectionData(DefaultSection(data=""))
78
79
  self.__repository = factory(self.__storage)(
79
80
  content, not isfile(content), encoding
80
81
  )
@@ -0,0 +1,49 @@
1
+ """The fallback encoding retry must not keep what the failed attempt read."""
2
+
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+
7
+ from cfinterface.files.blockfile import BlockFile
8
+ from cfinterface.files.registerfile import RegisterFile
9
+ from cfinterface.files.sectionfile import SectionFile
10
+
11
+ NUM_LINES = 100
12
+
13
+
14
+ class _Blocks(BlockFile):
15
+ BLOCKS = []
16
+ ENCODING = ["utf-8", "latin-1", "ascii"]
17
+
18
+
19
+ class _Registers(RegisterFile):
20
+ REGISTERS = []
21
+ ENCODING = ["utf-8", "latin-1", "ascii"]
22
+
23
+
24
+ class _Sections(SectionFile):
25
+ SECTIONS = []
26
+ ENCODING = ["utf-8", "latin-1", "ascii"]
27
+
28
+
29
+ def _latin1_file(tmp_path: Path) -> Path:
30
+ lines = [f"{f'LINE {i}':<500}\n" for i in range(NUM_LINES - 1)]
31
+ lines.append("1º FCF / 2º SF\n")
32
+ content = "".join(lines).encode("latin-1")
33
+ # Past the text decoder's first chunk, so UTF-8 fails mid-file.
34
+ assert content.index("º".encode("latin-1")) > 8192
35
+ path = tmp_path / "file.dat"
36
+ path.write_bytes(content)
37
+ return path
38
+
39
+
40
+ @pytest.mark.parametrize("file_type", [_Blocks, _Registers, _Sections])
41
+ def test_latin1_file_is_read_once(tmp_path: Path, file_type: type) -> None:
42
+ path = _latin1_file(tmp_path)
43
+
44
+ data = file_type.read(str(path)).data
45
+
46
+ lines = [str(component.data) for component in data][1:]
47
+ assert len(lines) == NUM_LINES
48
+ assert lines[0].startswith("LINE 0")
49
+ assert lines[-1].startswith("1º FCF")
File without changes
File without changes
File without changes