Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-pydash for openSUSE:Factory checked in at 2026-01-22 15:19:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pydash (Old) and /work/SRC/openSUSE:Factory/.python-pydash.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pydash" Thu Jan 22 15:19:07 2026 rev:10 rq:1328661 version:8.0.6 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pydash/python-pydash.changes 2025-08-04 15:25:11.394918978 +0200 +++ /work/SRC/openSUSE:Factory/.python-pydash.new.1928/python-pydash.changes 2026-01-22 15:20:11.269251009 +0100 @@ -1,0 +2,7 @@ +Thu Jan 22 10:09:11 UTC 2026 - Marius Grossu <[email protected]> + +- Update to 8.0.6: + * Prevent access to object paths containing __globals__ or __builtins__ in invoke(). Attempting to access these keys will raise a ``KeyError +- Updated patch support-new-mypy.patch + +------------------------------------------------------------------- Old: ---- pydash-8.0.5.tar.gz New: ---- pydash-8.0.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pydash.spec ++++++ --- /var/tmp/diff_new_pack.45UIcN/_old 2026-01-22 15:20:13.425340695 +0100 +++ /var/tmp/diff_new_pack.45UIcN/_new 2026-01-22 15:20:13.441341361 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-pydash # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-pydash -Version: 8.0.5 +Version: 8.0.6 Release: 0 Summary: The kitchen sink of Python functional utility libraries License: MIT ++++++ pydash-8.0.5.tar.gz -> pydash-8.0.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/CHANGELOG.rst new/pydash-8.0.6/CHANGELOG.rst --- old/pydash-8.0.5/CHANGELOG.rst 2025-01-17 17:01:56.000000000 +0100 +++ new/pydash-8.0.6/CHANGELOG.rst 2026-01-17 17:28:33.000000000 +0100 @@ -3,6 +3,12 @@ Changelog ========= +v8.0.6 (2026-01-17) +------------------- + +- Prevent access to object paths containing ``__globals__`` or ``__builtins__`` in ``invoke(). Attempting to access these keys will raise a ``KeyError``. + + v8.0.5 (2025-01-17) ------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/PKG-INFO new/pydash-8.0.6/PKG-INFO --- old/pydash-8.0.5/PKG-INFO 2025-01-17 17:08:45.657986400 +0100 +++ new/pydash-8.0.6/PKG-INFO 2026-01-17 17:42:53.363113000 +0100 @@ -1,18 +1,9 @@ -Metadata-Version: 2.2 +Metadata-Version: 2.4 Name: pydash -Version: 8.0.5 +Version: 8.0.6 Summary: The kitchen sink of Python utility libraries for doing "stuff" in a functional way. Based on the Lo-Dash Javascript library. Author-email: Derrick Gilland <[email protected]> -License: MIT License - - Copyright (c) 2020 Derrick Gilland - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - +License-Expression: MIT Project-URL: Homepage, https://github.com/dgilland/pydash Project-URL: Documentation, https://pydash.readthedocs.org Project-URL: Repository, https://github.com/dgilland/pydash @@ -20,20 +11,20 @@ Project-URL: Changelog, https://github.com/dgilland/pydash/blob/develop/CHANGELOG.rst Keywords: pydash,utility,functional,lodash,underscore Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Utilities -Requires-Python: >=3.8 +Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENSE.rst License-File: AUTHORS.rst @@ -53,6 +44,7 @@ Requires-Dist: twine; extra == "dev" Requires-Dist: wheel; extra == "dev" Requires-Dist: sphinx-autodoc-typehints; extra == "dev" +Dynamic: license-file pydash ****** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/docs/api.rst new/pydash-8.0.6/docs/api.rst --- old/pydash-8.0.5/docs/api.rst 2019-02-04 02:30:20.000000000 +0100 +++ new/pydash-8.0.6/docs/api.rst 2026-01-07 05:32:59.000000000 +0100 @@ -30,14 +30,14 @@ # OK (importing main module) import pydash - pydash.where({}) + pydash.filter_({}) # OK (import from main module) - from pydash import where - where({}) + from pydash import filter_ + filter_({}) # NOT RECOMMENDED (importing from submodule) - from pydash.collections import where + from pydash.collections import filter_ Only the main pydash module API is guaranteed to adhere to semver. It's possible that backwards incompatibility outside the main module API could be broken between minor releases. @@ -70,7 +70,6 @@ A full listing of aliased ``py_`` methods: -- ``_.object`` is :func:`pydash.arrays.object_` - ``_.slice`` is :func:`pydash.arrays.slice_` - ``_.zip`` is :func:`pydash.arrays.zip_` - ``_.all`` is :func:`pydash.collections.all_` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/pyproject.toml new/pydash-8.0.6/pyproject.toml --- old/pydash-8.0.5/pyproject.toml 2024-07-22 14:25:37.000000000 +0200 +++ new/pydash-8.0.6/pyproject.toml 2025-10-26 18:40:51.000000000 +0100 @@ -8,25 +8,25 @@ authors = [{ name = "Derrick Gilland", email = "[email protected]" }] description = 'The kitchen sink of Python utility libraries for doing "stuff" in a functional way. Based on the Lo-Dash Javascript library.' readme = "README.rst" -license = { file = "LICENSE.rst" } +license = "MIT" keywords = ["pydash", "utility", "functional", "lodash", "underscore"] classifiers = [ "Development Status :: 5 - Production/Stable", - "License :: OSI Approved :: MIT License", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities", ] -requires-python = ">=3.8" +requires-python = ">=3.9" dependencies = ["typing-extensions>3.10,!=4.6.0"] [project.urls] @@ -66,7 +66,7 @@ extend-include = ["*.pyi"] line-length = 100 # target the lowest supported version to avoid introducing unsupported syntax -target-version = "py38" +target-version = "py39" [tool.ruff.lint] select = [ @@ -106,7 +106,7 @@ [tool.mypy] mypy_path = ["src"] -python_version = "3.8" +python_version = "3.9" exclude = [ "tests/pytest_mypy_testing", ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/src/pydash/__init__.py new/pydash-8.0.6/src/pydash/__init__.py --- old/pydash-8.0.5/src/pydash/__init__.py 2025-01-17 16:59:54.000000000 +0100 +++ new/pydash-8.0.6/src/pydash/__init__.py 2026-01-17 17:31:26.000000000 +0100 @@ -1,6 +1,6 @@ """Python port of Lo-Dash.""" -__version__ = "8.0.5" +__version__ = "8.0.6" from .arrays import ( chunk, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/src/pydash/helpers.py new/pydash-8.0.6/src/pydash/helpers.py --- old/pydash-8.0.5/src/pydash/helpers.py 2025-01-17 16:41:02.000000000 +0100 +++ new/pydash-8.0.6/src/pydash/helpers.py 2026-01-17 17:20:19.000000000 +0100 @@ -96,7 +96,7 @@ # instance objects are incorrectly reported as accepting varargs when they only accept a # single argument. if isinstance(iteratee, (operator.itemgetter, operator.attrgetter, operator.methodcaller)): - argcount = 1 + argcount = 1 # pragma: no cover else: argspec = inspect.getfullargspec(iteratee) if argspec and not argspec.varargs: # pragma: no cover @@ -133,7 +133,7 @@ if isinstance(obj, Mapping): return obj.items() elif hasattr(obj, "iteritems"): - return obj.iteritems() # noqa: B301 + return obj.iteritems() elif hasattr(obj, "items"): return iter(obj.items()) elif isinstance(obj, Iterable): @@ -215,10 +215,11 @@ return value -def _raise_if_restricted_key(key): +def _raise_if_restricted_key(*keys): # Prevent access to restricted keys for security reasons. - if key in RESTRICTED_KEYS: - raise KeyError(f"access to restricted key {key!r} is not allowed") + for key in keys: + if key in RESTRICTED_KEYS: + raise KeyError(f"access to restricted key {key!r} is not allowed") def base_set(obj, key, value, allow_override=True): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/src/pydash/objects.py new/pydash-8.0.6/src/pydash/objects.py --- old/pydash-8.0.5/src/pydash/objects.py 2024-07-22 14:25:37.000000000 +0200 +++ new/pydash-8.0.6/src/pydash/objects.py 2026-01-17 17:26:27.000000000 +0100 @@ -14,7 +14,17 @@ import pydash as pyd -from .helpers import UNSET, Unset, base_get, base_set, callit, getargcount, iterator, iteriteratee +from .helpers import ( + UNSET, + Unset, + _raise_if_restricted_key, + base_get, + base_set, + callit, + getargcount, + iterator, + iteriteratee, +) from .types import IterateeObjT, PathT from .utilities import PathToken, to_path, to_path_tokens @@ -1046,6 +1056,8 @@ .. versionadded:: 1.0.0 """ paths = to_path(path) + _raise_if_restricted_key(*paths) + target_path = pyd.initial(paths) method_name = pyd.last(paths) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/src/pydash/predicates.py new/pydash-8.0.6/src/pydash/predicates.py --- old/pydash-8.0.5/src/pydash/predicates.py 2024-07-22 14:25:37.000000000 +0200 +++ new/pydash-8.0.6/src/pydash/predicates.py 2025-10-26 18:32:34.000000000 +0100 @@ -173,7 +173,7 @@ .. versionadded:: 3.3.0 """ - return value > other + return bool(value > other) def gt_cmp(other: T) -> t.Callable[["SupportsDunderGT[T]"], bool]: @@ -222,7 +222,7 @@ .. versionadded:: 3.3.0 """ - return value >= other + return bool(value >= other) def gte_cmp(other: T) -> t.Callable[["SupportsDunderGE[T]"], bool]: @@ -271,7 +271,7 @@ .. versionadded:: 3.3.0 """ - return value < other + return bool(value < other) def lt_cmp(other: T) -> t.Callable[["SupportsDunderLT[T]"], bool]: @@ -320,7 +320,7 @@ .. versionadded:: 3.3.0 """ - return value <= other + return bool(value <= other) def lte_cmp(other: T) -> t.Callable[["SupportsDunderLE[T]"], bool]: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/src/pydash.egg-info/PKG-INFO new/pydash-8.0.6/src/pydash.egg-info/PKG-INFO --- old/pydash-8.0.5/src/pydash.egg-info/PKG-INFO 2025-01-17 17:08:44.000000000 +0100 +++ new/pydash-8.0.6/src/pydash.egg-info/PKG-INFO 2026-01-17 17:42:51.000000000 +0100 @@ -1,18 +1,9 @@ -Metadata-Version: 2.2 +Metadata-Version: 2.4 Name: pydash -Version: 8.0.5 +Version: 8.0.6 Summary: The kitchen sink of Python utility libraries for doing "stuff" in a functional way. Based on the Lo-Dash Javascript library. Author-email: Derrick Gilland <[email protected]> -License: MIT License - - Copyright (c) 2020 Derrick Gilland - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - +License-Expression: MIT Project-URL: Homepage, https://github.com/dgilland/pydash Project-URL: Documentation, https://pydash.readthedocs.org Project-URL: Repository, https://github.com/dgilland/pydash @@ -20,20 +11,20 @@ Project-URL: Changelog, https://github.com/dgilland/pydash/blob/develop/CHANGELOG.rst Keywords: pydash,utility,functional,lodash,underscore Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Utilities -Requires-Python: >=3.8 +Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENSE.rst License-File: AUTHORS.rst @@ -53,6 +44,7 @@ Requires-Dist: twine; extra == "dev" Requires-Dist: wheel; extra == "dev" Requires-Dist: sphinx-autodoc-typehints; extra == "dev" +Dynamic: license-file pydash ****** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/tests/test_objects.py new/pydash-8.0.6/tests/test_objects.py --- old/pydash-8.0.5/tests/test_objects.py 2024-07-01 06:17:27.000000000 +0200 +++ new/pydash-8.0.6/tests/test_objects.py 2026-01-17 17:24:11.000000000 +0100 @@ -219,6 +219,24 @@ @parametrize( + "case", + [ + ({}, "__globals__"), + ({}, "__builtins__"), + ({}, "a.__globals__.b"), + ({}, "a.__builtins__.b"), + ([], "__globals__"), + ([], "__builtins__"), + ([], "a.__globals__.b"), + ([], "a.__builtins__.b"), + ], +) +def test_invoke__raises_for_objects_when_path_restricted(case): + with pytest.raises(KeyError, match="access to restricted key"): + _.invoke(*case) + + +@parametrize( "case,expected", [ # NOTE: The expected is a list of values but find_key returns only a single diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pydash-8.0.5/tox.ini new/pydash-8.0.6/tox.ini --- old/pydash-8.0.5/tox.ini 2024-07-21 04:29:07.000000000 +0200 +++ new/pydash-8.0.6/tox.ini 2025-10-26 18:37:08.000000000 +0100 @@ -1,14 +1,15 @@ [tox] -envlist = py38, py39, py310, py311, py312 +envlist = py39, py310, py311, py312, py313, py314 isolated_build = true [gh-actions] python = - 3.8: py38 3.9: py39 3.10: py310 3.11: py311 3.12: py312 + 3.13: py313 + 3.14: py314 [testenv] passenv = * ++++++ support-new-mypy.patch ++++++ --- /var/tmp/diff_new_pack.45UIcN/_old 2026-01-22 15:20:14.209373308 +0100 +++ /var/tmp/diff_new_pack.45UIcN/_new 2026-01-22 15:20:14.245374806 +0100 @@ -1,21 +1,115 @@ -Index: pydash-8.0.5/pyproject.toml +Index: pydash-8.0.6/pyproject.toml =================================================================== ---- pydash-8.0.5.orig/pyproject.toml -+++ pydash-8.0.5/pyproject.toml +--- pydash-8.0.6.orig/pyproject.toml ++++ pydash-8.0.6/pyproject.toml @@ -106,7 +106,7 @@ docstring-code-format = true [tool.mypy] mypy_path = ["src"] --python_version = "3.8" -+python_version = "3.9" +-python_version = "3.9" ++python_version = "3.13" exclude = [ "tests/pytest_mypy_testing", ] -Index: pydash-8.0.5/tests/pytest_mypy_testing/test_arrays.py +Index: pydash-8.0.6/tests/pytest_mypy_testing/test_arrays.py =================================================================== ---- pydash-8.0.5.orig/tests/pytest_mypy_testing/test_arrays.py -+++ pydash-8.0.5/tests/pytest_mypy_testing/test_arrays.py -@@ -408,7 +408,7 @@ def test_mypy_unshift() -> None: +--- pydash-8.0.6.orig/tests/pytest_mypy_testing/test_arrays.py ++++ pydash-8.0.6/tests/pytest_mypy_testing/test_arrays.py +@@ -93,8 +93,8 @@ def test_mypy_find_last_index() -> None: + + @pytest.mark.mypy_testing + def test_mypy_flatten() -> None: +- my_list: t.List[t.List[t.Union[int, t.List[int]]]] = [[1], [2, [3]], [[4]]] +- reveal_type(_.flatten(my_list)) # R: builtins.list[Union[builtins.int, builtins.list[builtins.int]]] ++ my_list: t.List[t.List[int | t.List[int]]] = [[1], [2, [3]], [[4]]] ++ reveal_type(_.flatten(my_list)) # R: builtins.list[builtins.int | builtins.list[builtins.int]] + + + @pytest.mark.mypy_testing +@@ -109,8 +109,8 @@ def test_mypy_flatten_depth() -> None: + + @pytest.mark.mypy_testing + def test_mypy_from_pairs() -> None: +- my_list: t.List[t.List[t.Union[str, int]]] = [['a', 1], ['b', 2]] +- reveal_type(_.from_pairs(my_list)) # R: builtins.dict[Union[builtins.str, builtins.int], Union[builtins.str, builtins.int]] ++ my_list: t.List[t.List[str | int]] = [['a', 1], ['b', 2]] ++ reveal_type(_.from_pairs(my_list)) # R: builtins.dict[builtins.str | builtins.int, builtins.str | builtins.int] + + my_list2: t.List[t.Tuple[str, int]] = [('a', 1), ('b', 2)] + reveal_type(_.from_pairs(my_list2)) # R: builtins.dict[builtins.str, builtins.int] +@@ -118,7 +118,7 @@ def test_mypy_from_pairs() -> None: + # + @pytest.mark.mypy_testing + def test_mypy_head() -> None: +- reveal_type(_.head([1, 2, 3, 4])) # R: Union[builtins.int, None] ++ reveal_type(_.head([1, 2, 3, 4])) # R: builtins.int | None + + + @pytest.mark.mypy_testing +@@ -135,7 +135,8 @@ def test_mypy_initial() -> None: + @pytest.mark.mypy_testing + def test_mypy_intercalate() -> None: + my_list: t.List[t.List[int]] = [[2], [3]] +- reveal_type(_.intercalate(my_list, 'x')) # R: builtins.list[Union[builtins.int, builtins.str]] ++ reveal_type(_.intercalate(my_list, 'x')) # R: builtins.list[builtins.int | builtins.str] ++ + + + @pytest.mark.mypy_testing +@@ -168,13 +169,13 @@ def test_mypy_intersection_with() -> Non + + @pytest.mark.mypy_testing + def test_mypy_intersperse() -> None: +- my_list: t.List[t.Union[int, t.List[int]]] = [1, [2], [3], 4] +- reveal_type(_.intersperse(my_list, 'x')) # R: builtins.list[Union[builtins.int, builtins.list[builtins.int], builtins.str]] ++ my_list: t.List[int | t.List[int]] = [1, [2], [3], 4] ++ reveal_type(_.intersperse(my_list, 'x')) # R: builtins.list[builtins.int | builtins.list[builtins.int] | builtins.str] + + + @pytest.mark.mypy_testing + def test_mypy_last() -> None: +- reveal_type(_.last([1, 2, 3, 4])) # R: Union[builtins.int, None] ++ reveal_type(_.last([1, 2, 3, 4])) # R: builtins.int | None + + + @pytest.mark.mypy_testing +@@ -193,8 +194,8 @@ def test_mypy_mapcat() -> None: + + @pytest.mark.mypy_testing + def test_mypy_nth() -> None: +- reveal_type(_.nth([1, 2, 3], 0)) # R: Union[builtins.int, None] +- reveal_type(_.nth([11, 22, 33])) # R: Union[builtins.int, None] ++ reveal_type(_.nth([1, 2, 3], 0)) # R: builtins.int | None ++ reveal_type(_.nth([11, 22, 33])) # R: builtins.int | None + + + @pytest.mark.mypy_testing +@@ -235,8 +236,7 @@ def test_mypy_pull_at() -> None: + @pytest.mark.mypy_testing + def test_mypy_push() -> None: + array = [1, 2, 3] +- reveal_type(_.push(array, [4], [6])) # R: builtins.list[Union[builtins.int, builtins.list[builtins.int]]] +- ++ reveal_type(_.push(array, [4], [6])) # R: builtins.list[builtins.int | builtins.list[builtins.int]] + + @pytest.mark.mypy_testing + def test_mypy_remove() -> None: +@@ -366,7 +366,7 @@ def test_mypy_take_while() -> None: + @pytest.mark.mypy_testing + def test_mypy_union() -> None: + reveal_type(_.union([1, 2, 3], [2, 3, 4], [3, 4, 5])) # R: builtins.list[builtins.int] +- reveal_type(_.union([1, 2, 3], ["hello"])) # R: builtins.list[Union[builtins.int, builtins.str]] ++ reveal_type(_.union([1, 2, 3], ["hello"])) # R: builtins.list[builtins.int | builtins.str] + + + @pytest.mark.mypy_testing +@@ -403,12 +403,12 @@ def test_mypy_uniq_with() -> None: + def test_mypy_unshift() -> None: + array = [1, 2, 3, 4] + reveal_type(_.unshift(array, -1, -2)) # R: builtins.list[builtins.int] +- reveal_type(_.unshift(array, "hello")) # R: builtins.list[Union[builtins.int, builtins.str]] ++ reveal_type(_.unshift(array, "hello")) # R: builtins.list[builtins.int | builtins.str] + @pytest.mark.mypy_testing def test_mypy_unzip() -> None: @@ -35,10 +129,19 @@ @pytest.mark.mypy_testing -Index: pydash-8.0.5/tests/pytest_mypy_testing/test_functions.py +Index: pydash-8.0.6/tests/pytest_mypy_testing/test_functions.py =================================================================== ---- pydash-8.0.5.orig/tests/pytest_mypy_testing/test_functions.py -+++ pydash-8.0.5/tests/pytest_mypy_testing/test_functions.py +--- pydash-8.0.6.orig/tests/pytest_mypy_testing/test_functions.py ++++ pydash-8.0.6/tests/pytest_mypy_testing/test_functions.py +@@ -12,7 +12,7 @@ def test_mypy_after() -> None: + + after_func = _.after(func, 1) + reveal_type(after_func) # R: pydash.functions.After[[a: builtins.int, b: builtins.dict[builtins.str, builtins.int], c: builtins.bytes], builtins.str] +- reveal_type(after_func(1, {}, b"")) # R: Union[builtins.str, None] ++ reveal_type(after_func(1, {}, b"")) # R: builtins.str | None + + + @pytest.mark.mypy_testing @@ -21,8 +21,8 @@ def test_mypy_ary() -> None: return (a, b, c, d) @@ -55,7 +158,7 @@ before_func = _.before(func, 3) - reveal_type(before_func(1, 2, 3)) # R: Union[Tuple[builtins.int, builtins.int, builtins.int], None] -+ reveal_type(before_func(1, 2, 3)) # R: Union[tuple[builtins.int, builtins.int, builtins.int], None] ++ reveal_type(before_func(1, 2, 3)) # R: tuple[builtins.int, builtins.int, builtins.int] | None @pytest.mark.mypy_testing @@ -151,11 +254,72 @@ - reveal_type(wrapper(1)) # R: Tuple[builtins.str, builtins.int] + reveal_type(wrapper) # R: pydash.functions.Partial[tuple[builtins.str, builtins.int]] + reveal_type(wrapper(1)) # R: tuple[builtins.str, builtins.int] -Index: pydash-8.0.5/tests/pytest_mypy_testing/test_objects.py +Index: pydash-8.0.6/tests/pytest_mypy_testing/test_objects.py =================================================================== ---- pydash-8.0.5.orig/tests/pytest_mypy_testing/test_objects.py -+++ pydash-8.0.5/tests/pytest_mypy_testing/test_objects.py -@@ -299,8 +299,8 @@ def test_mypy_to_number() -> None: +--- pydash-8.0.6.orig/tests/pytest_mypy_testing/test_objects.py ++++ pydash-8.0.6/tests/pytest_mypy_testing/test_objects.py +@@ -81,8 +81,8 @@ def test_mypy_find_key() -> None: + def is_one(x: int) -> bool: + return x == 1 + +- reveal_type(_.find_key({"a": 1, "b": 2, "c": 3}, is_one)) # R: Union[builtins.str, None] +- reveal_type(_.find_key([1, 2, 3, 4], is_one)) # R: Union[builtins.int, None] ++ reveal_type(_.find_key({"a": 1, "b": 2, "c": 3}, is_one)) # R: builtins.str | None ++ reveal_type(_.find_key([1, 2, 3, 4], is_one)) # R: builtins.int | None + + + @pytest.mark.mypy_testing +@@ -90,8 +90,8 @@ def test_mypy_find_last_key() -> None: + def is_one(x: int) -> bool: + return x == 1 + +- reveal_type(_.find_last_key({"a": 1, "b": 2, "c": 3}, is_one)) # R: Union[builtins.str, None] +- reveal_type(_.find_last_key([1, 2, 3, 1], is_one)) # R: Union[builtins.int, None] ++ reveal_type(_.find_last_key({"a": 1, "b": 2, "c": 3}, is_one)) # R: builtins.str | None ++ reveal_type(_.find_last_key([1, 2, 3, 1], is_one)) # R: builtins.int | None + + + @pytest.mark.mypy_testing +@@ -115,7 +115,7 @@ def test_mypy_get() -> None: + reveal_type(_.get({}, "a.b.c")) # R: Any + reveal_type(_.get({"a": {"b": {"c": [1, 2, 3, 4]}}}, "a.b.c[1]")) # R: Any + reveal_type(_.get({"a": {"b": [0, {"c": [1, 2]}]}}, "a.b.1.c.2")) # R: Any +- reveal_type(_.get(["a", "b"], 0)) # R: Union[builtins.str, None] ++ reveal_type(_.get(["a", "b"], 0)) # R: builtins.str | None + reveal_type(_.get(["a", "b"], 0, "c")) # R: builtins.str + reveal_type(_.get(MyClass(), "x")) # R: Any + +@@ -220,8 +220,8 @@ def test_mypy_omit_by() -> None: + + @pytest.mark.mypy_testing + def test_mypy_parse_int() -> None: +- reveal_type(_.parse_int("5")) # R: Union[builtins.int, None] +- reveal_type(_.parse_int("12", 8)) # R: Union[builtins.int, None] ++ reveal_type(_.parse_int("5")) # R: builtins.int | None ++ reveal_type(_.parse_int("12", 8)) # R: builtins.int | None + + + @pytest.mark.mypy_testing +@@ -260,7 +260,7 @@ def test_mypy_set_with() -> None: + + @pytest.mark.mypy_testing + def test_mypy_to_boolean() -> None: +- reveal_type(_.to_boolean("true")) # R: Union[builtins.bool, None] ++ reveal_type(_.to_boolean("true")) # R: builtins.bool | None + + + @pytest.mark.mypy_testing +@@ -292,15 +292,15 @@ def test_mypy_to_list() -> None: + + @pytest.mark.mypy_testing + def test_mypy_to_number() -> None: +- reveal_type(_.to_number("1234.5678")) # R: Union[builtins.float, None] +- reveal_type(_.to_number("1234.5678", 4)) # R: Union[builtins.float, None] +- reveal_type(_.to_number(1, 2)) # R: Union[builtins.float, None] ++ reveal_type(_.to_number("1234.5678")) # R: builtins.float | None ++ reveal_type(_.to_number("1234.5678", 4)) # R: builtins.float | None ++ reveal_type(_.to_number(1, 2)) # R: builtins.float | None + @pytest.mark.mypy_testing def test_mypy_to_pairs() -> None: @@ -166,4 +330,84 @@ reveal_type(_.to_pairs(MyClass())) # R: builtins.list[Any] +Index: pydash-8.0.6/tests/pytest_mypy_testing/test_collections.py +=================================================================== +--- pydash-8.0.6.orig/tests/pytest_mypy_testing/test_collections.py ++++ pydash-8.0.6/tests/pytest_mypy_testing/test_collections.py +@@ -7,8 +7,8 @@ import pydash as _ + + @pytest.mark.mypy_testing + def test_mypy_at() -> None: +- reveal_type(_.at([1, 2, 3, 4], 0, 2)) # R: builtins.list[Union[builtins.int, None]] +- reveal_type(_.at({"a": 1, "b": 2, "c": 3, "d": 4}, "a", "c")) # R: builtins.list[Union[builtins.int, None]] ++ reveal_type(_.at([1, 2, 3, 4], 0, 2)) # R: builtins.list[builtins.int | None] ++ reveal_type(_.at({"a": 1, "b": 2, "c": 3, "d": 4}, "a", "c")) # R: builtins.list[builtins.int | None] + reveal_type(_.at({"a": 1, "b": 2, "c": {"d": {"e": 3}}}, "a", ["c", "d", "e"])) # R: builtins.list[Any] + + +@@ -38,14 +38,14 @@ def test_mypy_filter_() -> None: + + @pytest.mark.mypy_testing + def test_mypy_find() -> None: +- reveal_type(_.find([1, 2, 3, 4], lambda x: x >= 3)) # R: Union[builtins.int, None] +- reveal_type(_.find([{"a": 1}, {"b": 2}, {"a": 1, "b": 2}], {"a": 1})) # R: Union[builtins.dict[builtins.str, builtins.int], None] ++ reveal_type(_.find([1, 2, 3, 4], lambda x: x >= 3)) # R: builtins.int | None ++ reveal_type(_.find([{"a": 1}, {"b": 2}, {"a": 1, "b": 2}], {"a": 1})) # R: builtins.dict[builtins.str, builtins.int] | None + + + @pytest.mark.mypy_testing + def test_mypy_find_last() -> None: +- reveal_type(_.find_last([1, 2, 3, 4], lambda x: x >= 3)) # R: Union[builtins.int, None] +- reveal_type(_.find_last([{"a": 1}, {"b": 2}, {"a": 1, "b": 2}], {"a": 1})) # R: Union[builtins.dict[builtins.str, builtins.int], None] ++ reveal_type(_.find_last([1, 2, 3, 4], lambda x: x >= 3)) # R: builtins.int | None ++ reveal_type(_.find_last([{"a": 1}, {"b": 2}, {"a": 1, "b": 2}], {"a": 1})) # R: builtins.dict[builtins.str, builtins.int] | None + + + @pytest.mark.mypy_testing +Index: pydash-8.0.6/tests/pytest_mypy_testing/test_numerical.py +=================================================================== +--- pydash-8.0.6.orig/tests/pytest_mypy_testing/test_numerical.py ++++ pydash-8.0.6/tests/pytest_mypy_testing/test_numerical.py +@@ -87,8 +87,8 @@ def test_mypy_max_by() -> None: + + @pytest.mark.mypy_testing + def test_mypy_median() -> None: +- reveal_type(_.median([1, 2, 3, 4, 5])) # R: Union[builtins.float, builtins.int] +- reveal_type(_.median([1, 2, 3, 4])) # R: Union[builtins.float, builtins.int] ++ reveal_type(_.median([1, 2, 3, 4, 5])) # R: builtins.float | builtins.int ++ reveal_type(_.median([1, 2, 3, 4])) # R: builtins.float | builtins.int + + + @pytest.mark.mypy_testing +@@ -130,7 +130,7 @@ def test_mypy_multiply() -> None: + + @pytest.mark.mypy_testing + def test_mypy_power() -> None: +- reveal_type(_.power(5, 2)) # R: Union[builtins.int, builtins.float] ++ reveal_type(_.power(5, 2)) # R: builtins.int | builtins.float + reveal_type(_.power(12.5, 3)) # R: builtins.float + + +Index: pydash-8.0.6/tests/pytest_mypy_testing/test_utilities.py +=================================================================== +--- pydash-8.0.6.orig/tests/pytest_mypy_testing/test_utilities.py ++++ pydash-8.0.6/tests/pytest_mypy_testing/test_utilities.py +@@ -10,7 +10,7 @@ def test_mypy_attempt() -> None: + def divide_by_zero(n: int) -> float: + return n/0 + +- reveal_type(_.attempt(divide_by_zero, 1)) # R: Union[builtins.float, builtins.Exception] ++ reveal_type(_.attempt(divide_by_zero, 1)) # R: builtins.float | builtins.Exception + + + @pytest.mark.mypy_testing +@@ -182,7 +182,7 @@ def test_mypy_properties() -> None: + + @pytest.mark.mypy_testing + def test_mypy_property_of() -> None: +- reveal_type(_.property_of({'a': 1, 'b': 2, 'c': 3})) # R: def (Union[typing.Hashable, builtins.list[typing.Hashable]]) -> Any ++ reveal_type(_.property_of({'a': 1, 'b': 2, 'c': 3})) # R: def (typing.Hashable | builtins.list[typing.Hashable]) -> Any + + + @pytest.mark.mypy_testing
