From c9ca4fc11b18157c87eccdcb6eec0465ee434c3f Mon Sep 17 00:00:00 2001 From: Seth Morton Date: Tue, 28 Feb 2023 21:47:50 -0800 Subject: Add FreeBSD CI job --- .github/workflows/tests.yml | 21 +++++++++++++++++++++ tox.ini | 1 - 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 34fa9d2..64065ce 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -59,3 +59,24 @@ jobs: - name: Upload to CodeCov uses: codecov/codecov-action@v3 + + test-bsd: + name: Test on FreeBSD + runs-on: macos-12 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install and Run Tests + uses: vmactions/freebsd-vm@v0 + with: + prepare: | + pkg install -y python3 + + run: | + python3 -m venv .venv + source .venv/bin/activate.csh + pip install --upgrade pip + pip install pytest pytest-mock hypothesis + python -m pytest --hypothesis-profile=slow-tests diff --git a/tox.ini b/tox.ini index 833d005..3fa2378 100644 --- a/tox.ini +++ b/tox.ini @@ -25,7 +25,6 @@ deps = pytest-cov pytest-mock hypothesis - semver extras = {env:WITH_EXTRAS:} commands = -- cgit v1.2.1 From 0f993d00d6c5120e0773452977ae3ce6a36dccb9 Mon Sep 17 00:00:00 2001 From: Seth Morton Date: Tue, 28 Feb 2023 23:05:59 -0800 Subject: Add FreeBSD failing test example --- tests/test_string_component_transform_factory.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_string_component_transform_factory.py b/tests/test_string_component_transform_factory.py index 4c8ed87..bc48d5b 100644 --- a/tests/test_string_component_transform_factory.py +++ b/tests/test_string_component_transform_factory.py @@ -65,6 +65,7 @@ def no_null(x: str) -> bool: ], ) @example(x=float("nan")) +@example(x="Å") @given( x=integers() | floats() -- cgit v1.2.1 From def59286fc678e366f13c1184fa3548bf4680144 Mon Sep 17 00:00:00 2001 From: Seth Morton Date: Wed, 1 Mar 2023 20:11:19 -0800 Subject: Add FreeBSD fix for locale failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FreeBSD seems to throw an OSError when locale.strxfrm is given 'Å', which is surprising behavior. Well, maybe not, considering how many bugs I have found with FreeBSD's implementation of locale over the course of natsort development. Anyway, we just ignore any input that causes locale.strxfrm to barf in our tests. --- natsort/compat/fake_fastnumbers.py | 2 +- tests/test_string_component_transform_factory.py | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/natsort/compat/fake_fastnumbers.py b/natsort/compat/fake_fastnumbers.py index cb1c900..430345a 100644 --- a/natsort/compat/fake_fastnumbers.py +++ b/natsort/compat/fake_fastnumbers.py @@ -55,7 +55,7 @@ def fast_float( String to attempt to convert to a float. key : callable Single-argument function to apply to *x* if conversion fails. - nan : object + nan : float Value to return instead of NaN if NaN would be returned. Returns diff --git a/tests/test_string_component_transform_factory.py b/tests/test_string_component_transform_factory.py index bc48d5b..40b4d34 100644 --- a/tests/test_string_component_transform_factory.py +++ b/tests/test_string_component_transform_factory.py @@ -5,7 +5,7 @@ from functools import partial from typing import Any, Callable, FrozenSet, Union import pytest -from hypothesis import example, given +from hypothesis import assume, example, given from hypothesis.strategies import floats, integers, text from natsort.compat.fastnumbers import try_float, try_int from natsort.compat.locale import get_strxfrm @@ -32,6 +32,20 @@ def no_null(x: str) -> bool: return "\0" not in x +def input_is_ok_with_locale(x: str) -> bool: + """Ensure this input won't cause locale.strxfrm to barf""" + # On FreeBSD, locale.strxfrm raises an OSError on input like 'Å'. + # You read that right - an *OSError* for invalid input. + # We cannot really fix that, so we just filter out any value + # that could cause locale.strxfrm to barf with this function. + try: + get_strxfrm()(x) + except OSError: + return False + else: + return True + + @pytest.mark.parametrize( "alg, example_func", [ @@ -77,6 +91,7 @@ def test_string_component_transform_factory( ) -> None: string_component_transform_func = string_component_transform_factory(alg) x = str(x) + assume(input_is_ok_with_locale(x)) # handle broken locale lib on BSD. try: assert list(string_component_transform_func(x)) == list(example_func(x)) except ValueError as e: # handle broken locale lib on BSD. -- cgit v1.2.1 From f2ea0d6f134c414bb9d98b271cab76e11f160f1b Mon Sep 17 00:00:00 2001 From: Seth Morton Date: Wed, 1 Mar 2023 21:24:59 -0800 Subject: Update changelog This closes #161. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3560a5b..e445b3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Unreleased --- +### Fixed +- Broken test on FreeBSD due to a broken `locale.strxfrm`. + **This change has no effect outside fixing tests** + (Issue [#161](https://github.com/SethMMorton/natsort/issues/161)) + [8.3.0] - 2023-02-27 --- -- cgit v1.2.1