cfinterface 1.10.2__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.
- {cfinterface-1.10.2 → cfinterface-1.10.4}/CHANGELOG.md +12 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/PKG-INFO +1 -1
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/__init__.py +1 -1
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/components/line/repository.py +4 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/reading/blockreading.py +1 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/reading/sectionreading.py +1 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/guides/architecture.rst +2 -1
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_linerepository.py +8 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_tabular.py +9 -0
- cfinterface-1.10.4/tests/files/test_encoding_fallback.py +49 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/.github/workflows/benchmark.yml +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/.github/workflows/docs.yml +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/.github/workflows/main.yml +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/.github/workflows/publish.yml +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/.gitignore +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/.pre-commit-config.yaml +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/CONTRIBUTING.md +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/LICENSE +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/README.md +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/benchmarks/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/benchmarks/bench_floatfield_write.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/_utils/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/components/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/components/line/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/components/repository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/reading/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/reading/repository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/writing/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/writing/repository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/block.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/datetimefield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/defaultblock.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/defaultregister.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/defaultsection.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/field.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/floatfield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/integerfield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/line.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/literalfield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/register.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/section.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/components/tabular.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/data/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/data/blockdata.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/data/registerdata.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/data/sectiondata.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/files/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/files/blockfile.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/files/registerfile.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/files/sectionfile.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/py.typed +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/reading/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/reading/registerreading.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/storage.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/versioning.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/writing/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/writing/blockwriting.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/writing/registerwriting.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/writing/sectionwriting.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/_static/logo_cfinterface.svg +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/conf.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/getting_started/contributing.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/getting_started/tutorial.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/guides/faq.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/guides/migration-v1.9.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/guides/performance.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/install/install.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/adapters/files/components.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/adapters/files/line.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/adapters/files/reading.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/adapters/files/writing.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/adapters/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/blocks/files/block.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/blocks/files/blockdata.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/blocks/files/blockfile.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/blocks/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/datetimefield.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/field.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/floatfield.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/integerfield.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/literalfield.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/line/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/files/register.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/files/registerdata.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/files/registerfile.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/sections/files/section.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/sections/files/sectiondata.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/sections/files/sectionfile.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/sections/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/storage/files/storagetype.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/storage/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/tabular/files/tabularparser.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/tabular/files/tabularsection.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/tabular/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/versioning/files/versioning.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/versioning/index.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/README.rst +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/plot_block_file.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/plot_register_file.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/plot_section_file.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/plot_tabular_parsing.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/examples/plot_versioned_file.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/pyproject.toml +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/_utils/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/_utils/test_is_null.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_blockrepository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_factory.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_pattern_cache.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_registerrepository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_sectionrepository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/reading/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/reading/test_readingrepository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/writing/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/writing/test_writingrepository.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/conftest.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_block.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_datetimefield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_defaultblock.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_defaultregister.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_defaultsection.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_field.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_field_hypothesis.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_floatfield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_floatfield_benchmark.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_integerfield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_line.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_literalfield.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_register.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_section.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_storage_integration.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/components/test_tabular_hypothesis.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/conftest.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/data/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/data/test_blockdata.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/data/test_registerdata.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/data/test_sectiondata.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/files/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/files/test_blockfile.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/files/test_read_typing.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/files/test_registerfile.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/files/test_sectionfile.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/mocks/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/mocks/mock_open.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/reading/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/reading/test_blockreading.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/reading/test_registerreading.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/reading/test_sectionreading.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/test_storage.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/test_storage_deprecation.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/test_versioning.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/writing/__init__.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/writing/test_blockwriting.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/writing/test_registerwriting.py +0 -0
- {cfinterface-1.10.2 → cfinterface-1.10.4}/tests/writing/test_sectionwriting.py +0 -0
|
@@ -7,6 +7,18 @@ 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
|
+
|
|
16
|
+
## [1.10.3] - 2026-10-30
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- A delimited line with fewer values than its fields reads the missing fields as `None`; it used to keep the values the previous line of the same register or table left in them
|
|
21
|
+
|
|
10
22
|
## [1.10.2] - 2026-10-14
|
|
11
23
|
|
|
12
24
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cfinterface
|
|
3
|
-
Version: 1.10.
|
|
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/
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/cfinterface/adapters/components/line/repository.py
RENAMED
|
@@ -56,6 +56,10 @@ class TextualRepository(Repository):
|
|
|
56
56
|
values = [v.strip() for v in line.split(delimiter)]
|
|
57
57
|
for field, value in zip(fields, values, strict=False):
|
|
58
58
|
field.read(value)
|
|
59
|
+
# A field past the end of a short line must be reset, or it keeps the
|
|
60
|
+
# value the previous line left in the shared field.
|
|
61
|
+
for field in fields[len(values) :]:
|
|
62
|
+
field.value = None
|
|
59
63
|
return self.values
|
|
60
64
|
|
|
61
65
|
def read(
|
|
@@ -88,7 +88,8 @@ configured ``StorageType``. That repository is what executes reading and writing
|
|
|
88
88
|
to the storage backend (textual or binary).
|
|
89
89
|
|
|
90
90
|
``Line`` accepts an optional ``delimiter``: when provided, fields are separated by that
|
|
91
|
-
character instead of occupying fixed positions.
|
|
91
|
+
character instead of occupying fixed positions. A line with fewer values than fields reads
|
|
92
|
+
each missing field as ``None``.
|
|
92
93
|
|
|
93
94
|
.. code-block:: python
|
|
94
95
|
|
|
@@ -2,6 +2,7 @@ from cfinterface.adapters.components.line.repository import (
|
|
|
2
2
|
BinaryRepository,
|
|
3
3
|
TextualRepository,
|
|
4
4
|
)
|
|
5
|
+
from cfinterface.components.integerfield import IntegerField
|
|
5
6
|
from cfinterface.components.literalfield import LiteralField
|
|
6
7
|
|
|
7
8
|
|
|
@@ -49,6 +50,13 @@ def test_delimitedrepository_read_with_fields():
|
|
|
49
50
|
assert values[1] == "world!"
|
|
50
51
|
|
|
51
52
|
|
|
53
|
+
def test_delimitedrepository_read_short_line_does_not_keep_previous_values():
|
|
54
|
+
fields = [LiteralField(6, 0), LiteralField(6, 7), IntegerField(4, 14)]
|
|
55
|
+
repo = TextualRepository(fields)
|
|
56
|
+
repo.read("a;b;7", delimiter=";")
|
|
57
|
+
assert repo.read("c", delimiter=";") == ["c", None, None]
|
|
58
|
+
|
|
59
|
+
|
|
52
60
|
def test_delimitedrepository_write_no_fields():
|
|
53
61
|
repo = TextualRepository([])
|
|
54
62
|
assert len(repo.write([], delimiter=";")) == 1
|
|
@@ -643,6 +643,15 @@ def test_parse_lines_delimited_missing_tokens_filled_with_none() -> None:
|
|
|
643
643
|
assert result["label"] == [None]
|
|
644
644
|
|
|
645
645
|
|
|
646
|
+
def test_parse_lines_delimited_short_line_after_full_line() -> None:
|
|
647
|
+
"""A short line after a full one does not keep the full line's values."""
|
|
648
|
+
parser = _make_semicolon_parser()
|
|
649
|
+
lines = ["1;1.25;alpha\n", "10;5.00\n"]
|
|
650
|
+
result = parser.parse_lines(lines)
|
|
651
|
+
assert result["id"] == [1, 10]
|
|
652
|
+
assert result["label"] == ["alpha", None]
|
|
653
|
+
|
|
654
|
+
|
|
646
655
|
def test_format_rows_semicolon_delimited() -> None:
|
|
647
656
|
"""format_rows with ';' delimiter joins fields with semicolons."""
|
|
648
657
|
parser = _make_semicolon_parser()
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/adapters/files/components.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/datetimefield.rst
RENAMED
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/floatfield.rst
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/integerfield.rst
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/fields/components/literalfield.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/files/register.rst
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/files/registerdata.rst
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/registers/files/registerfile.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/sections/files/sectiondata.rst
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/sections/files/sectionfile.rst
RENAMED
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/storage/files/storagetype.rst
RENAMED
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/tabular/files/tabularparser.rst
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/tabular/files/tabularsection.rst
RENAMED
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/docs/source/reference/versioning/files/versioning.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_registerrepository.py
RENAMED
|
File without changes
|
{cfinterface-1.10.2 → cfinterface-1.10.4}/tests/adapters/components/test_sectionrepository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|