done
This commit is contained in:
		
							
								
								
									
										437
									
								
								lib/python3.11/site-packages/pandas/tests/config/test_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										437
									
								
								lib/python3.11/site-packages/pandas/tests/config/test_config.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,437 @@ | ||||
| import pytest | ||||
|  | ||||
| from pandas._config import config as cf | ||||
| from pandas._config.config import OptionError | ||||
|  | ||||
| import pandas as pd | ||||
| import pandas._testing as tm | ||||
|  | ||||
|  | ||||
| class TestConfig: | ||||
|     @pytest.fixture(autouse=True) | ||||
|     def clean_config(self, monkeypatch): | ||||
|         with monkeypatch.context() as m: | ||||
|             m.setattr(cf, "_global_config", {}) | ||||
|             m.setattr(cf, "options", cf.DictWrapper(cf._global_config)) | ||||
|             m.setattr(cf, "_deprecated_options", {}) | ||||
|             m.setattr(cf, "_registered_options", {}) | ||||
|  | ||||
|             # Our test fixture in conftest.py sets "chained_assignment" | ||||
|             # to "raise" only after all test methods have been setup. | ||||
|             # However, after this setup, there is no longer any | ||||
|             # "chained_assignment" option, so re-register it. | ||||
|             cf.register_option("chained_assignment", "raise") | ||||
|             yield | ||||
|  | ||||
|     def test_api(self): | ||||
|         # the pandas object exposes the user API | ||||
|         assert hasattr(pd, "get_option") | ||||
|         assert hasattr(pd, "set_option") | ||||
|         assert hasattr(pd, "reset_option") | ||||
|         assert hasattr(pd, "describe_option") | ||||
|  | ||||
|     def test_is_one_of_factory(self): | ||||
|         v = cf.is_one_of_factory([None, 12]) | ||||
|  | ||||
|         v(12) | ||||
|         v(None) | ||||
|         msg = r"Value must be one of None\|12" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             v(1.1) | ||||
|  | ||||
|     def test_register_option(self): | ||||
|         cf.register_option("a", 1, "doc") | ||||
|  | ||||
|         # can't register an already registered option | ||||
|         msg = "Option 'a' has already been registered" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.register_option("a", 1, "doc") | ||||
|  | ||||
|         # can't register an already registered option | ||||
|         msg = "Path prefix to option 'a' is already an option" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.register_option("a.b.c.d1", 1, "doc") | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.register_option("a.b.c.d2", 1, "doc") | ||||
|  | ||||
|         # no python keywords | ||||
|         msg = "for is a python keyword" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.register_option("for", 0) | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.register_option("a.for.b", 0) | ||||
|         # must be valid identifier (ensure attribute access works) | ||||
|         msg = "oh my goddess! is not a valid identifier" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.register_option("Oh my Goddess!", 0) | ||||
|  | ||||
|         # we can register options several levels deep | ||||
|         # without predefining the intermediate steps | ||||
|         # and we can define differently named options | ||||
|         # in the same namespace | ||||
|         cf.register_option("k.b.c.d1", 1, "doc") | ||||
|         cf.register_option("k.b.c.d2", 1, "doc") | ||||
|  | ||||
|     def test_describe_option(self): | ||||
|         cf.register_option("a", 1, "doc") | ||||
|         cf.register_option("b", 1, "doc2") | ||||
|         cf.deprecate_option("b") | ||||
|  | ||||
|         cf.register_option("c.d.e1", 1, "doc3") | ||||
|         cf.register_option("c.d.e2", 1, "doc4") | ||||
|         cf.register_option("f", 1) | ||||
|         cf.register_option("g.h", 1) | ||||
|         cf.register_option("k", 2) | ||||
|         cf.deprecate_option("g.h", rkey="k") | ||||
|         cf.register_option("l", "foo") | ||||
|  | ||||
|         # non-existent keys raise KeyError | ||||
|         msg = r"No such keys\(s\)" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.describe_option("no.such.key") | ||||
|  | ||||
|         # we can get the description for any key we registered | ||||
|         assert "doc" in cf.describe_option("a", _print_desc=False) | ||||
|         assert "doc2" in cf.describe_option("b", _print_desc=False) | ||||
|         assert "precated" in cf.describe_option("b", _print_desc=False) | ||||
|         assert "doc3" in cf.describe_option("c.d.e1", _print_desc=False) | ||||
|         assert "doc4" in cf.describe_option("c.d.e2", _print_desc=False) | ||||
|  | ||||
|         # if no doc is specified we get a default message | ||||
|         # saying "description not available" | ||||
|         assert "available" in cf.describe_option("f", _print_desc=False) | ||||
|         assert "available" in cf.describe_option("g.h", _print_desc=False) | ||||
|         assert "precated" in cf.describe_option("g.h", _print_desc=False) | ||||
|         assert "k" in cf.describe_option("g.h", _print_desc=False) | ||||
|  | ||||
|         # default is reported | ||||
|         assert "foo" in cf.describe_option("l", _print_desc=False) | ||||
|         # current value is reported | ||||
|         assert "bar" not in cf.describe_option("l", _print_desc=False) | ||||
|         cf.set_option("l", "bar") | ||||
|         assert "bar" in cf.describe_option("l", _print_desc=False) | ||||
|  | ||||
|     def test_case_insensitive(self): | ||||
|         cf.register_option("KanBAN", 1, "doc") | ||||
|  | ||||
|         assert "doc" in cf.describe_option("kanbaN", _print_desc=False) | ||||
|         assert cf.get_option("kanBaN") == 1 | ||||
|         cf.set_option("KanBan", 2) | ||||
|         assert cf.get_option("kAnBaN") == 2 | ||||
|  | ||||
|         # gets of non-existent keys fail | ||||
|         msg = r"No such keys\(s\): 'no_such_option'" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.get_option("no_such_option") | ||||
|         cf.deprecate_option("KanBan") | ||||
|  | ||||
|         assert cf._is_deprecated("kAnBaN") | ||||
|  | ||||
|     def test_get_option(self): | ||||
|         cf.register_option("a", 1, "doc") | ||||
|         cf.register_option("b.c", "hullo", "doc2") | ||||
|         cf.register_option("b.b", None, "doc2") | ||||
|  | ||||
|         # gets of existing keys succeed | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|         assert cf.get_option("b.b") is None | ||||
|  | ||||
|         # gets of non-existent keys fail | ||||
|         msg = r"No such keys\(s\): 'no_such_option'" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.get_option("no_such_option") | ||||
|  | ||||
|     def test_set_option(self): | ||||
|         cf.register_option("a", 1, "doc") | ||||
|         cf.register_option("b.c", "hullo", "doc2") | ||||
|         cf.register_option("b.b", None, "doc2") | ||||
|  | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|         assert cf.get_option("b.b") is None | ||||
|  | ||||
|         cf.set_option("a", 2) | ||||
|         cf.set_option("b.c", "wurld") | ||||
|         cf.set_option("b.b", 1.1) | ||||
|  | ||||
|         assert cf.get_option("a") == 2 | ||||
|         assert cf.get_option("b.c") == "wurld" | ||||
|         assert cf.get_option("b.b") == 1.1 | ||||
|  | ||||
|         msg = r"No such keys\(s\): 'no.such.key'" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             cf.set_option("no.such.key", None) | ||||
|  | ||||
|     def test_set_option_empty_args(self): | ||||
|         msg = "Must provide an even number of non-keyword arguments" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.set_option() | ||||
|  | ||||
|     def test_set_option_uneven_args(self): | ||||
|         msg = "Must provide an even number of non-keyword arguments" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.set_option("a.b", 2, "b.c") | ||||
|  | ||||
|     def test_set_option_invalid_single_argument_type(self): | ||||
|         msg = "Must provide an even number of non-keyword arguments" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.set_option(2) | ||||
|  | ||||
|     def test_set_option_multiple(self): | ||||
|         cf.register_option("a", 1, "doc") | ||||
|         cf.register_option("b.c", "hullo", "doc2") | ||||
|         cf.register_option("b.b", None, "doc2") | ||||
|  | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|         assert cf.get_option("b.b") is None | ||||
|  | ||||
|         cf.set_option("a", "2", "b.c", None, "b.b", 10.0) | ||||
|  | ||||
|         assert cf.get_option("a") == "2" | ||||
|         assert cf.get_option("b.c") is None | ||||
|         assert cf.get_option("b.b") == 10.0 | ||||
|  | ||||
|     def test_validation(self): | ||||
|         cf.register_option("a", 1, "doc", validator=cf.is_int) | ||||
|         cf.register_option("d", 1, "doc", validator=cf.is_nonnegative_int) | ||||
|         cf.register_option("b.c", "hullo", "doc2", validator=cf.is_text) | ||||
|  | ||||
|         msg = "Value must have type '<class 'int'>'" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.register_option("a.b.c.d2", "NO", "doc", validator=cf.is_int) | ||||
|  | ||||
|         cf.set_option("a", 2)  # int is_int | ||||
|         cf.set_option("b.c", "wurld")  # str is_str | ||||
|         cf.set_option("d", 2) | ||||
|         cf.set_option("d", None)  # non-negative int can be None | ||||
|  | ||||
|         # None not is_int | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.set_option("a", None) | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.set_option("a", "ab") | ||||
|  | ||||
|         msg = "Value must be a nonnegative integer or None" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.register_option("a.b.c.d3", "NO", "doc", validator=cf.is_nonnegative_int) | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.register_option("a.b.c.d3", -2, "doc", validator=cf.is_nonnegative_int) | ||||
|  | ||||
|         msg = r"Value must be an instance of <class 'str'>\|<class 'bytes'>" | ||||
|         with pytest.raises(ValueError, match=msg): | ||||
|             cf.set_option("b.c", 1) | ||||
|  | ||||
|         validator = cf.is_one_of_factory([None, cf.is_callable]) | ||||
|         cf.register_option("b", lambda: None, "doc", validator=validator) | ||||
|         # pylint: disable-next=consider-using-f-string | ||||
|         cf.set_option("b", "%.1f".format)  # Formatter is callable | ||||
|         cf.set_option("b", None)  # Formatter is none (default) | ||||
|         with pytest.raises(ValueError, match="Value must be a callable"): | ||||
|             cf.set_option("b", "%.1f") | ||||
|  | ||||
|     def test_reset_option(self): | ||||
|         cf.register_option("a", 1, "doc", validator=cf.is_int) | ||||
|         cf.register_option("b.c", "hullo", "doc2", validator=cf.is_str) | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|  | ||||
|         cf.set_option("a", 2) | ||||
|         cf.set_option("b.c", "wurld") | ||||
|         assert cf.get_option("a") == 2 | ||||
|         assert cf.get_option("b.c") == "wurld" | ||||
|  | ||||
|         cf.reset_option("a") | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "wurld" | ||||
|         cf.reset_option("b.c") | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|  | ||||
|     def test_reset_option_all(self): | ||||
|         cf.register_option("a", 1, "doc", validator=cf.is_int) | ||||
|         cf.register_option("b.c", "hullo", "doc2", validator=cf.is_str) | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|  | ||||
|         cf.set_option("a", 2) | ||||
|         cf.set_option("b.c", "wurld") | ||||
|         assert cf.get_option("a") == 2 | ||||
|         assert cf.get_option("b.c") == "wurld" | ||||
|  | ||||
|         cf.reset_option("all") | ||||
|         assert cf.get_option("a") == 1 | ||||
|         assert cf.get_option("b.c") == "hullo" | ||||
|  | ||||
|     def test_deprecate_option(self): | ||||
|         # we can deprecate non-existent options | ||||
|         cf.deprecate_option("foo") | ||||
|  | ||||
|         assert cf._is_deprecated("foo") | ||||
|         with tm.assert_produces_warning(FutureWarning, match="deprecated"): | ||||
|             with pytest.raises(KeyError, match="No such keys.s.: 'foo'"): | ||||
|                 cf.get_option("foo") | ||||
|  | ||||
|         cf.register_option("a", 1, "doc", validator=cf.is_int) | ||||
|         cf.register_option("b.c", "hullo", "doc2") | ||||
|         cf.register_option("foo", "hullo", "doc2") | ||||
|  | ||||
|         cf.deprecate_option("a", removal_ver="nifty_ver") | ||||
|         with tm.assert_produces_warning(FutureWarning, match="eprecated.*nifty_ver"): | ||||
|             cf.get_option("a") | ||||
|  | ||||
|             msg = "Option 'a' has already been defined as deprecated" | ||||
|             with pytest.raises(OptionError, match=msg): | ||||
|                 cf.deprecate_option("a") | ||||
|  | ||||
|         cf.deprecate_option("b.c", "zounds!") | ||||
|         with tm.assert_produces_warning(FutureWarning, match="zounds!"): | ||||
|             cf.get_option("b.c") | ||||
|  | ||||
|         # test rerouting keys | ||||
|         cf.register_option("d.a", "foo", "doc2") | ||||
|         cf.register_option("d.dep", "bar", "doc2") | ||||
|         assert cf.get_option("d.a") == "foo" | ||||
|         assert cf.get_option("d.dep") == "bar" | ||||
|  | ||||
|         cf.deprecate_option("d.dep", rkey="d.a")  # reroute d.dep to d.a | ||||
|         with tm.assert_produces_warning(FutureWarning, match="eprecated"): | ||||
|             assert cf.get_option("d.dep") == "foo" | ||||
|  | ||||
|         with tm.assert_produces_warning(FutureWarning, match="eprecated"): | ||||
|             cf.set_option("d.dep", "baz")  # should overwrite "d.a" | ||||
|  | ||||
|         with tm.assert_produces_warning(FutureWarning, match="eprecated"): | ||||
|             assert cf.get_option("d.dep") == "baz" | ||||
|  | ||||
|     def test_config_prefix(self): | ||||
|         with cf.config_prefix("base"): | ||||
|             cf.register_option("a", 1, "doc1") | ||||
|             cf.register_option("b", 2, "doc2") | ||||
|             assert cf.get_option("a") == 1 | ||||
|             assert cf.get_option("b") == 2 | ||||
|  | ||||
|             cf.set_option("a", 3) | ||||
|             cf.set_option("b", 4) | ||||
|             assert cf.get_option("a") == 3 | ||||
|             assert cf.get_option("b") == 4 | ||||
|  | ||||
|         assert cf.get_option("base.a") == 3 | ||||
|         assert cf.get_option("base.b") == 4 | ||||
|         assert "doc1" in cf.describe_option("base.a", _print_desc=False) | ||||
|         assert "doc2" in cf.describe_option("base.b", _print_desc=False) | ||||
|  | ||||
|         cf.reset_option("base.a") | ||||
|         cf.reset_option("base.b") | ||||
|  | ||||
|         with cf.config_prefix("base"): | ||||
|             assert cf.get_option("a") == 1 | ||||
|             assert cf.get_option("b") == 2 | ||||
|  | ||||
|     def test_callback(self): | ||||
|         k = [None] | ||||
|         v = [None] | ||||
|  | ||||
|         def callback(key): | ||||
|             k.append(key) | ||||
|             v.append(cf.get_option(key)) | ||||
|  | ||||
|         cf.register_option("d.a", "foo", cb=callback) | ||||
|         cf.register_option("d.b", "foo", cb=callback) | ||||
|  | ||||
|         del k[-1], v[-1] | ||||
|         cf.set_option("d.a", "fooz") | ||||
|         assert k[-1] == "d.a" | ||||
|         assert v[-1] == "fooz" | ||||
|  | ||||
|         del k[-1], v[-1] | ||||
|         cf.set_option("d.b", "boo") | ||||
|         assert k[-1] == "d.b" | ||||
|         assert v[-1] == "boo" | ||||
|  | ||||
|         del k[-1], v[-1] | ||||
|         cf.reset_option("d.b") | ||||
|         assert k[-1] == "d.b" | ||||
|  | ||||
|     def test_set_ContextManager(self): | ||||
|         def eq(val): | ||||
|             assert cf.get_option("a") == val | ||||
|  | ||||
|         cf.register_option("a", 0) | ||||
|         eq(0) | ||||
|         with cf.option_context("a", 15): | ||||
|             eq(15) | ||||
|             with cf.option_context("a", 25): | ||||
|                 eq(25) | ||||
|             eq(15) | ||||
|         eq(0) | ||||
|  | ||||
|         cf.set_option("a", 17) | ||||
|         eq(17) | ||||
|  | ||||
|         # Test that option_context can be used as a decorator too (#34253). | ||||
|         @cf.option_context("a", 123) | ||||
|         def f(): | ||||
|             eq(123) | ||||
|  | ||||
|         f() | ||||
|  | ||||
|     def test_attribute_access(self): | ||||
|         holder = [] | ||||
|  | ||||
|         def f3(key): | ||||
|             holder.append(True) | ||||
|  | ||||
|         cf.register_option("a", 0) | ||||
|         cf.register_option("c", 0, cb=f3) | ||||
|         options = cf.options | ||||
|  | ||||
|         assert options.a == 0 | ||||
|         with cf.option_context("a", 15): | ||||
|             assert options.a == 15 | ||||
|  | ||||
|         options.a = 500 | ||||
|         assert cf.get_option("a") == 500 | ||||
|  | ||||
|         cf.reset_option("a") | ||||
|         assert options.a == cf.get_option("a", 0) | ||||
|  | ||||
|         msg = "You can only set the value of existing options" | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             options.b = 1 | ||||
|         with pytest.raises(OptionError, match=msg): | ||||
|             options.display = 1 | ||||
|  | ||||
|         # make sure callback kicks when using this form of setting | ||||
|         options.c = 1 | ||||
|         assert len(holder) == 1 | ||||
|  | ||||
|     def test_option_context_scope(self): | ||||
|         # Ensure that creating a context does not affect the existing | ||||
|         # environment as it is supposed to be used with the `with` statement. | ||||
|         # See https://github.com/pandas-dev/pandas/issues/8514 | ||||
|  | ||||
|         original_value = 60 | ||||
|         context_value = 10 | ||||
|         option_name = "a" | ||||
|  | ||||
|         cf.register_option(option_name, original_value) | ||||
|  | ||||
|         # Ensure creating contexts didn't affect the current context. | ||||
|         ctx = cf.option_context(option_name, context_value) | ||||
|         assert cf.get_option(option_name) == original_value | ||||
|  | ||||
|         # Ensure the correct value is available inside the context. | ||||
|         with ctx: | ||||
|             assert cf.get_option(option_name) == context_value | ||||
|  | ||||
|         # Ensure the current context is reset | ||||
|         assert cf.get_option(option_name) == original_value | ||||
|  | ||||
|     def test_dictwrapper_getattr(self): | ||||
|         options = cf.options | ||||
|         # GH 19789 | ||||
|         with pytest.raises(OptionError, match="No such option"): | ||||
|             options.bananas | ||||
|         assert not hasattr(options, "bananas") | ||||
| @ -0,0 +1,156 @@ | ||||
| import codecs | ||||
| import locale | ||||
| import os | ||||
|  | ||||
| import pytest | ||||
|  | ||||
| from pandas._config.localization import ( | ||||
|     can_set_locale, | ||||
|     get_locales, | ||||
|     set_locale, | ||||
| ) | ||||
|  | ||||
| from pandas.compat import ISMUSL | ||||
|  | ||||
| import pandas as pd | ||||
|  | ||||
| _all_locales = get_locales() | ||||
| _current_locale = locale.setlocale(locale.LC_ALL)  # getlocale() is wrong, see GH#46595 | ||||
|  | ||||
| # Don't run any of these tests if we have no locales. | ||||
| pytestmark = pytest.mark.skipif(not _all_locales, reason="Need locales") | ||||
|  | ||||
| _skip_if_only_one_locale = pytest.mark.skipif( | ||||
|     len(_all_locales) <= 1, reason="Need multiple locales for meaningful test" | ||||
| ) | ||||
|  | ||||
|  | ||||
| def _get_current_locale(lc_var: int = locale.LC_ALL) -> str: | ||||
|     # getlocale is not always compliant with setlocale, use setlocale. GH#46595 | ||||
|     return locale.setlocale(lc_var) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize("lc_var", (locale.LC_ALL, locale.LC_CTYPE, locale.LC_TIME)) | ||||
| def test_can_set_current_locale(lc_var): | ||||
|     # Can set the current locale | ||||
|     before_locale = _get_current_locale(lc_var) | ||||
|     assert can_set_locale(before_locale, lc_var=lc_var) | ||||
|     after_locale = _get_current_locale(lc_var) | ||||
|     assert before_locale == after_locale | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize("lc_var", (locale.LC_ALL, locale.LC_CTYPE, locale.LC_TIME)) | ||||
| def test_can_set_locale_valid_set(lc_var): | ||||
|     # Can set the default locale. | ||||
|     before_locale = _get_current_locale(lc_var) | ||||
|     assert can_set_locale("", lc_var=lc_var) | ||||
|     after_locale = _get_current_locale(lc_var) | ||||
|     assert before_locale == after_locale | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize( | ||||
|     "lc_var", | ||||
|     ( | ||||
|         locale.LC_ALL, | ||||
|         locale.LC_CTYPE, | ||||
|         pytest.param( | ||||
|             locale.LC_TIME, | ||||
|             marks=pytest.mark.skipif( | ||||
|                 ISMUSL, reason="MUSL allows setting invalid LC_TIME." | ||||
|             ), | ||||
|         ), | ||||
|     ), | ||||
| ) | ||||
| def test_can_set_locale_invalid_set(lc_var): | ||||
|     # Cannot set an invalid locale. | ||||
|     before_locale = _get_current_locale(lc_var) | ||||
|     assert not can_set_locale("non-existent_locale", lc_var=lc_var) | ||||
|     after_locale = _get_current_locale(lc_var) | ||||
|     assert before_locale == after_locale | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize( | ||||
|     "lang,enc", | ||||
|     [ | ||||
|         ("it_CH", "UTF-8"), | ||||
|         ("en_US", "ascii"), | ||||
|         ("zh_CN", "GB2312"), | ||||
|         ("it_IT", "ISO-8859-1"), | ||||
|     ], | ||||
| ) | ||||
| @pytest.mark.parametrize("lc_var", (locale.LC_ALL, locale.LC_CTYPE, locale.LC_TIME)) | ||||
| def test_can_set_locale_no_leak(lang, enc, lc_var): | ||||
|     # Test that can_set_locale does not leak even when returning False. See GH#46595 | ||||
|     before_locale = _get_current_locale(lc_var) | ||||
|     can_set_locale((lang, enc), locale.LC_ALL) | ||||
|     after_locale = _get_current_locale(lc_var) | ||||
|     assert before_locale == after_locale | ||||
|  | ||||
|  | ||||
| def test_can_set_locale_invalid_get(monkeypatch): | ||||
|     # see GH#22129 | ||||
|     # In some cases, an invalid locale can be set, | ||||
|     #  but a subsequent getlocale() raises a ValueError. | ||||
|  | ||||
|     def mock_get_locale(): | ||||
|         raise ValueError() | ||||
|  | ||||
|     with monkeypatch.context() as m: | ||||
|         m.setattr(locale, "getlocale", mock_get_locale) | ||||
|         assert not can_set_locale("") | ||||
|  | ||||
|  | ||||
| def test_get_locales_at_least_one(): | ||||
|     # see GH#9744 | ||||
|     assert len(_all_locales) > 0 | ||||
|  | ||||
|  | ||||
| @_skip_if_only_one_locale | ||||
| def test_get_locales_prefix(): | ||||
|     first_locale = _all_locales[0] | ||||
|     assert len(get_locales(prefix=first_locale[:2])) > 0 | ||||
|  | ||||
|  | ||||
| @_skip_if_only_one_locale | ||||
| @pytest.mark.parametrize( | ||||
|     "lang,enc", | ||||
|     [ | ||||
|         ("it_CH", "UTF-8"), | ||||
|         ("en_US", "ascii"), | ||||
|         ("zh_CN", "GB2312"), | ||||
|         ("it_IT", "ISO-8859-1"), | ||||
|     ], | ||||
| ) | ||||
| def test_set_locale(lang, enc): | ||||
|     before_locale = _get_current_locale() | ||||
|  | ||||
|     enc = codecs.lookup(enc).name | ||||
|     new_locale = lang, enc | ||||
|  | ||||
|     if not can_set_locale(new_locale): | ||||
|         msg = "unsupported locale setting" | ||||
|  | ||||
|         with pytest.raises(locale.Error, match=msg): | ||||
|             with set_locale(new_locale): | ||||
|                 pass | ||||
|     else: | ||||
|         with set_locale(new_locale) as normalized_locale: | ||||
|             new_lang, new_enc = normalized_locale.split(".") | ||||
|             new_enc = codecs.lookup(enc).name | ||||
|  | ||||
|             normalized_locale = new_lang, new_enc | ||||
|             assert normalized_locale == new_locale | ||||
|  | ||||
|     # Once we exit the "with" statement, locale should be back to what it was. | ||||
|     after_locale = _get_current_locale() | ||||
|     assert before_locale == after_locale | ||||
|  | ||||
|  | ||||
| def test_encoding_detected(): | ||||
|     system_locale = os.environ.get("LC_ALL") | ||||
|     system_encoding = system_locale.split(".")[-1] if system_locale else "utf-8" | ||||
|  | ||||
|     assert ( | ||||
|         codecs.lookup(pd.options.display.encoding).name | ||||
|         == codecs.lookup(system_encoding).name | ||||
|     ) | ||||
		Reference in New Issue
	
	Block a user