From 5ba97dc72467adc89caabbca7a3a445b45f4627e Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Sat, 5 Feb 2022 22:47:36 -0500 Subject: [PATCH 01/16] Bump to next micro-dev version --- src/sphobjinv/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sphobjinv/version.py b/src/sphobjinv/version.py index 01ad4f5b..a84a309f 100644 --- a/src/sphobjinv/version.py +++ b/src/sphobjinv/version.py @@ -25,4 +25,4 @@ """ -__version__ = "2.2.1" +__version__ = "2.2.2b1.dev0" From 9fcfdc76e5529b4c420d10be6f7e0168a5292db1 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 15 Mar 2022 12:45:18 -0400 Subject: [PATCH 02/16] Add fonttools objects.inv to test resources Will probably break CI. --- tests/resource/objects_fonttools.inv | Bin 0 -> 37452 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/resource/objects_fonttools.inv diff --git a/tests/resource/objects_fonttools.inv b/tests/resource/objects_fonttools.inv new file mode 100644 index 0000000000000000000000000000000000000000..dca56d2beaca607746aa66e8d09001d4861415b7 GIT binary patch literal 37452 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 Date: Tue, 15 Mar 2022 12:50:33 -0400 Subject: [PATCH 03/16] Add special test case for fonttools --- tests/test_api_good.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index 0bfa29a3..c7da192e 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -555,6 +555,12 @@ def test_api_inventory_matches_sphinx_ifile( else: assert inv.count == sphinx_ifile_data_count(original_ifile_data), fname + elif "fonttools" in fname: # pragma: no cover + # One object appears to have a misbehaving character that Sphinx + # rejects on an attempted import + # TODO: Figure out which Sphinx versions this is broken on and refine test + assert inv.count == 1 + sphinx_ifile_data_count(original_ifile_data), fname + else: assert inv.count == sphinx_ifile_data_count(original_ifile_data), fname From d3f557c7563e89fad9cce9bcdae7030cfb5f174a Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 15 Mar 2022 12:58:56 -0400 Subject: [PATCH 04/16] Add suggest test for all resource/objects.inv's Simple check that suggest works for all of the smoke test inventories --- tests/test_api_good.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index c7da192e..11dd49ea 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -448,7 +448,7 @@ def test_api_inventory_toosmallflatdict_importbutignore(self, res_dec): assert inv2.count == 55 def test_api_inventory_namesuggest(self, res_cmp, check): - """Confirm object name suggestion is nominally working.""" + """Confirm object name suggestion is nominally working on a specific object.""" rst = ":py:function:`attr.evolve`" idx = 6 @@ -469,6 +469,18 @@ def test_api_inventory_namesuggest(self, res_cmp, check): check.is_instance(rec[0][1], Number) check.equal(rec[0][2], idx) + + @pytest.mark.testall + def test_api_inventory_suggest_operation(self, testall_inv_path): + """Confirm that a suggest operation works on all smoke-test inventories.""" + inv = soi.Inventory(testall_inv_path) + + if "fonttools" in inv.project.lower(): + pytest.xfail("Known bad character in decode operation") + + inv.suggest("class") + + @pytest.mark.testall def test_api_inventory_datafile_gen_and_reimport( self, From 1a13691af2a98f7f51f06be204e0268a1c99594b Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 15 Mar 2022 13:22:22 -0400 Subject: [PATCH 05/16] Blacken --- tests/test_api_good.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index 11dd49ea..9c3232fb 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -469,7 +469,6 @@ def test_api_inventory_namesuggest(self, res_cmp, check): check.is_instance(rec[0][1], Number) check.equal(rec[0][2], idx) - @pytest.mark.testall def test_api_inventory_suggest_operation(self, testall_inv_path): """Confirm that a suggest operation works on all smoke-test inventories.""" @@ -480,7 +479,6 @@ def test_api_inventory_suggest_operation(self, testall_inv_path): inv.suggest("class") - @pytest.mark.testall def test_api_inventory_datafile_gen_and_reimport( self, From e74f48b4cf80907fa430e8ec536738a33adccca9 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 15 Mar 2022 13:50:11 -0400 Subject: [PATCH 06/16] Fix fonttools suggest test xfail Now it will actually give correct XPASS behavior when the fix is applied..... --- tests/test_api_good.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index 9c3232fb..43c6ec5e 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -475,7 +475,12 @@ def test_api_inventory_suggest_operation(self, testall_inv_path): inv = soi.Inventory(testall_inv_path) if "fonttools" in inv.project.lower(): - pytest.xfail("Known bad character in decode operation") + try: + inv.suggest("class") + except UnicodeDecodeError: + pytest.xfail("Known unhandled bad character in decode operation") + else: + pytest.fail("'fonttools' was expected to fail, but didn't") inv.suggest("class") From bf1211f1e9c7ab6611079e2bfe3158efbd71934e Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 15 Mar 2022 14:20:36 -0400 Subject: [PATCH 07/16] Add coverage pragma to XPASS fonttools case *sigh*. --- tests/test_api_good.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index 43c6ec5e..f2bac48f 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -479,7 +479,7 @@ def test_api_inventory_suggest_operation(self, testall_inv_path): inv.suggest("class") except UnicodeDecodeError: pytest.xfail("Known unhandled bad character in decode operation") - else: + else: # pragma: no cov pytest.fail("'fonttools' was expected to fail, but didn't") inv.suggest("class") From a35742667319c3f0bda51000cb211e85d9ab8e10 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 15 Mar 2022 14:39:11 -0400 Subject: [PATCH 08/16] Revise to *correct* no cover pragma --- tests/test_api_good.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index f2bac48f..8bb89108 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -479,7 +479,7 @@ def test_api_inventory_suggest_operation(self, testall_inv_path): inv.suggest("class") except UnicodeDecodeError: pytest.xfail("Known unhandled bad character in decode operation") - else: # pragma: no cov + else: # pragma: no cover pytest.fail("'fonttools' was expected to fail, but didn't") inv.suggest("class") From 359a645eaea71ae7bb03d9ca623ea0811c9b36c4 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Tue, 15 Mar 2022 16:35:51 +0100 Subject: [PATCH 09/16] Fix(Ignore) UnicodeDecodeError --- CHANGELOG.md | 1 + src/sphobjinv/_vendored/fuzzywuzzy/utils.py | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c092f6e5..f4349e4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project strives to adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + * UnicodeDecodeErrors are ignored when converting inventories to ASCII. ### [2.2.1] - 2022-02-05 diff --git a/src/sphobjinv/_vendored/fuzzywuzzy/utils.py b/src/sphobjinv/_vendored/fuzzywuzzy/utils.py index ab756b42..28ce02f5 100644 --- a/src/sphobjinv/_vendored/fuzzywuzzy/utils.py +++ b/src/sphobjinv/_vendored/fuzzywuzzy/utils.py @@ -9,7 +9,7 @@ def asciionly(s): - return s.encode().translate(None, bad_chars).decode() # B Skinn 2021-12-11 + return s.encode().translate(None, bad_chars).decode(errors='replace') # B Skinn 2021-12-11 # remove non-ASCII characters from strings def asciidammit(s): @@ -32,8 +32,4 @@ def validate_string(s): def full_process(s): s = asciidammit(s) # B Skinn 2021-12-11 - return s.encode().translate(trans_table, bad_chars).decode().strip() - - - - + return s.encode().translate(trans_table, bad_chars).decode(errors='replace').strip() From e3b7938542c79531f35b62889066e1fbf1ab4bdf Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Thu, 17 Mar 2022 10:35:26 +0100 Subject: [PATCH 10/16] Remove fonttools special handling --- tests/test_api_good.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index 8bb89108..c05e3b11 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -474,14 +474,6 @@ def test_api_inventory_suggest_operation(self, testall_inv_path): """Confirm that a suggest operation works on all smoke-test inventories.""" inv = soi.Inventory(testall_inv_path) - if "fonttools" in inv.project.lower(): - try: - inv.suggest("class") - except UnicodeDecodeError: - pytest.xfail("Known unhandled bad character in decode operation") - else: # pragma: no cover - pytest.fail("'fonttools' was expected to fail, but didn't") - inv.suggest("class") @pytest.mark.testall From e9d51c094b50e40aa6e3d9c67061c701382e8189 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 22 Mar 2022 10:29:42 -0400 Subject: [PATCH 11/16] Add flake8-raise --- requirements-flake8.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-flake8.txt b/requirements-flake8.txt index 35896dde..83d8350e 100644 --- a/requirements-flake8.txt +++ b/requirements-flake8.txt @@ -12,5 +12,6 @@ flake8-eradicate flake8-implicit-str-concat flake8-import-order flake8-pie +flake8-raise flake8-rst-docstrings pep8-naming From 0c629c69c2f069a93ca4f6962ac4f95c030916fa Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 22 Mar 2022 10:29:50 -0400 Subject: [PATCH 12/16] Fix scratch-path fixture test Definitely better to explicitly use {Enum}.value to get the string value out. This 3.11 change will probably have a similar knock-on effect on pent... may or may not be able to use the shortcut I've been using there for folding enum values into the minilanguage. But, if I switch to an OO model anyways, it's ~moot. --- tests/test_fixture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fixture.py b/tests/test_fixture.py index 83616aa8..d93d906f 100644 --- a/tests/test_fixture.py +++ b/tests/test_fixture.py @@ -38,7 +38,7 @@ def test_info_fixture(misc_info): def test_populate_scratch(misc_info, scratch_path, check): """Ensure the scratch_path fixture populates the scratch dir correctly.""" - scr_base = misc_info.FNames.INIT + scr_base = misc_info.FNames.INIT.value for ext in [_.value for _ in misc_info.Extensions]: with check.check(msg=ext): From 6bd32810e6241f894234213d6548d827092f43e3 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 22 Mar 2022 12:24:53 -0400 Subject: [PATCH 13/16] Fix object check for objects_fonttools.inv Something changed in Sphinx 3.3.0, perhaps a tightening of validation/intake of object lines? --- tests/test_api_good.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_api_good.py b/tests/test_api_good.py index c05e3b11..50099637 100644 --- a/tests/test_api_good.py +++ b/tests/test_api_good.py @@ -564,9 +564,13 @@ def test_api_inventory_matches_sphinx_ifile( elif "fonttools" in fname: # pragma: no cover # One object appears to have a misbehaving character that Sphinx - # rejects on an attempted import - # TODO: Figure out which Sphinx versions this is broken on and refine test - assert inv.count == 1 + sphinx_ifile_data_count(original_ifile_data), fname + # rejects on an attempted import in ~recent versions + if sphinx_version < (3, 3, 0): + assert inv.count == sphinx_ifile_data_count(original_ifile_data), fname + else: + assert inv.count == 1 + sphinx_ifile_data_count( + original_ifile_data + ), fname else: assert inv.count == sphinx_ifile_data_count(original_ifile_data), fname From 351f96990a4c314f7208b7a19174874d9f88732c Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 22 Mar 2022 13:01:32 -0400 Subject: [PATCH 14/16] Bump version to 2.2.2, remove Python 3.5 from tox.ini No need for 3.5 any more, compat is dropped. --- src/sphobjinv/version.py | 2 +- tox.ini | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sphobjinv/version.py b/src/sphobjinv/version.py index a84a309f..1c7257a6 100644 --- a/src/sphobjinv/version.py +++ b/src/sphobjinv/version.py @@ -25,4 +25,4 @@ """ -__version__ = "2.2.2b1.dev0" +__version__ = "2.2.2" diff --git a/tox.ini b/tox.ini index c9448bd0..707cb204 100644 --- a/tox.ini +++ b/tox.ini @@ -70,7 +70,6 @@ basepython= py38: python3.8 py37: python3.7 py36: python3.6 - py35: python3.5 [testenv:flake8] skip_install=True From ca036659952e81bfe25dddd5638418097a0d8105 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 22 Mar 2022 14:51:06 -0400 Subject: [PATCH 15/16] Add pyproject-fmt to pre-commit Also apply formatting changes. --- .pre-commit-config.yaml | 4 ++++ pyproject.toml | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 99376a77..ff92ceda 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,3 +12,7 @@ repos: rev: '22.1.0' hooks: - id: black +- repo: https://github.com/tox-dev/pyproject-fmt + rev: '0.3.2' + hooks: + - id: pyproject-fmt diff --git a/pyproject.toml b/pyproject.toml index ac84776a..37801040 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,9 @@ [build-system] -requires = ["wheel", "setuptools"] build-backend = "setuptools.build_meta" +requires = [ + "setuptools", + "wheel", +] [tool.black] line-length = 88 From 0ad98609fed4007f8658ee02579669094ad75089 Mon Sep 17 00:00:00 2001 From: Brian Skinn Date: Tue, 22 Mar 2022 15:31:14 -0400 Subject: [PATCH 16/16] Update CHANGELOG --- CHANGELOG.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4349e4c..5752032d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,34 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project strives to adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). - * UnicodeDecodeErrors are ignored when converting inventories to ASCII. + +### [2.2.2] - 2022-03-22 + +#### Fixed + + * UnicodeDecodeErrors are ignored within the vendored `fuzzywuzzy` package + during `suggest` operations, using the `errors=replace` mode within + bytes.decode(). + + * This misbehavior emerged after vendoring `fuzzywuzzy`, suggesting that + it was a bug fixed later on in that project's development, after the + point from which it was vendored. + + * This change may alter `suggest` behavior for those inventory objects with + pathological characters. But, given their rarity, user experience is not + expected to be noticeably affected. + +#### Internal + + * The `pyproject-fmt` formatted was added as a pre-commit hook. + + * The `flake8-raise` plugin was added to the linting suite. + +#### Testing + + * A smoke test for error-free `suggest` execution was added for all of the + inventory files in `tests/resource`. + ### [2.2.1] - 2022-02-05