Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-easydict for openSUSE:Factory 
checked in at 2026-11-10 14:40:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-easydict (Old)
 and      /work/SRC/openSUSE:Factory/.python-easydict.new.3759290 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-easydict"

Tue Nov 10 14:40:16 2026 rev:2 rq:1396397 version:1.14

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-easydict/python-easydict.changes  
2026-08-24 15:43:35.721659820 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-easydict.new.3759290/python-easydict.changes 
    2026-11-10 14:41:29.253248103 +0100
@@ -1,0 +2,14 @@
+Mon Nov  9 18:13:10 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 1.14:
+  * Fix update() mutating its positional argument
+  * setdefault() now keeps attributes in sync, including nested
+    mappings
+  * Subclasses of list, tuple and dict are no longer
+    auto-converted
+- Drop CHANGES from %doc: no longer shipped in the sdist
+- Switch to the setuptools_scm-based build (upstream dropped
+  setup.py); pin the tagged version via
+  SETUPTOOLS_SCM_PRETEND_VERSION
+
+-------------------------------------------------------------------

Old:
----
  easydict-1.13.tar.gz

New:
----
  easydict-1.14.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-easydict.spec ++++++
--- /var/tmp/diff_new_pack.UIr8nN/_old  2026-11-10 14:41:31.228330843 +0100
+++ /var/tmp/diff_new_pack.UIr8nN/_new  2026-11-10 14:41:31.230330927 +0100
@@ -18,14 +18,15 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-easydict
-Version:        1.13
+Version:        1.14
 Release:        0
 Summary:        Access dict values as attributes (works recursively)
 License:        LGPL-3.0-only
 URL:            https://github.com/makinacorpus/easydict
 Source:         
https://files.pythonhosted.org/packages/source/e/easydict/easydict-%{version}.tar.gz
 BuildRequires:  %{python_module pip}
-BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module setuptools >= 77}
+BuildRequires:  %{python_module setuptools_scm >= 8}
 BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
@@ -41,6 +42,8 @@
 %autosetup -p1 -n easydict-%{version}
 
 %build
+# sdist ships no .git; pin the tagged version for setuptools-scm.
+export SETUPTOOLS_SCM_PRETEND_VERSION=%{version}
 %pyproject_wheel
 
 %install
@@ -51,9 +54,9 @@
 # Upstream ships no pytest suite; CI runs doctest on the module.
 %python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} $python -B -c "import 
doctest, easydict; r = doctest.testmod(easydict); raise SystemExit(r.failed)"
 
-%files %{python_files}
+%files %python_files
 %license LICENSE
-%doc README.rst CHANGES
+%doc README.rst
 %{python_sitelib}/easydict
 %{python_sitelib}/easydict-%{version}.dist-info
 

++++++ easydict-1.13.tar.gz -> easydict-1.14.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/.github/workflows/publish.yml 
new/easydict-1.14/.github/workflows/publish.yml
--- old/easydict-1.13/.github/workflows/publish.yml     1970-01-01 
01:00:00.000000000 +0100
+++ new/easydict-1.14/.github/workflows/publish.yml     2026-11-09 
13:44:40.939068800 +0100
@@ -0,0 +1,55 @@
+name: Publish Python 🐍 distribution 📦 to PyPI
+
+on:
+  push:
+    tags:
+      - '*'
+
+jobs:
+  build:
+    name: Build distribution 📦
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v6
+
+      - name: Set up Python
+        uses: actions/setup-python@v6
+        with:
+          python-version: "3.x"
+
+      - name: Print environment
+        run: |
+          python --version
+
+      - name: Install pypa/build
+        run: python3 -m pip install build
+
+      - name: Build a binary wheel and a source tarball
+        run: python3 -m build
+
+      - name: Store the distribution packages
+        uses: actions/upload-artifact@v5
+        with:
+          name: python-package-distributions
+          path: dist/
+
+  publish-to-pypi:
+    name: Publish Python 🐍 distribution 📦 to PyPI
+    if: startsWith(github.ref, 'refs/tags/')  # only publish to PyPI on tag 
pushes
+    needs:
+      - build
+    runs-on: ubuntu-latest
+    environment:
+      name: release
+      url: https://pypi.org/p/easydict
+    permissions:
+      id-token: write
+    steps:
+      - name: Download all the dists
+        uses: actions/download-artifact@v6
+        with:
+          name: python-package-distributions
+          path: dist/
+      - name: Publish distribution 📦 to PyPI
+        uses: pypa/gh-action-pypi-publish@release/v1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/.github/workflows/test.yml 
new/easydict-1.14/.github/workflows/test.yml
--- old/easydict-1.13/.github/workflows/test.yml        1970-01-01 
01:00:00.000000000 +0100
+++ new/easydict-1.14/.github/workflows/test.yml        2026-11-09 
13:44:40.939377000 +0100
@@ -0,0 +1,40 @@
+on:
+  pull_request:
+  push:
+    branches:
+      - master
+      - main
+
+name: Tests
+jobs:
+  lint:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+
+      - uses: actions/setup-python@v4
+
+      - name: Install dependencies
+        run: pip install ruff
+
+      - name: Run linting and formatting checks
+        run: ruff check
+
+  unit-tests:
+    name: Unit Tests
+    needs: lint
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: ["3.11", "3.12", "3.14", "3.15"]
+
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Set up Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v5
+        with:
+          python-version: ${{ matrix.python-version }}
+
+      - name: Run doctests
+        run: python easydict/__init__.py -v
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/.gitignore new/easydict-1.14/.gitignore
--- old/easydict-1.13/.gitignore        1970-01-01 01:00:00.000000000 +0100
+++ new/easydict-1.14/.gitignore        2026-11-09 13:44:40.939377000 +0100
@@ -0,0 +1,6 @@
+*.pyc
+/build/
+/dist/
+easydict.egg-info/
+.ruff_cache
+__pycache__
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/CHANGES new/easydict-1.14/CHANGES
--- old/easydict-1.13/CHANGES   2024-03-04 13:02:43.000000000 +0100
+++ new/easydict-1.14/CHANGES   1970-01-01 01:00:00.000000000 +0100
@@ -1,78 +0,0 @@
-=========
-CHANGELOG
-=========
-
-1.12 (2024-03-04)
-=================
-
-- Fix #46: Fix handling of optional default value for .pop() (#47)
-
-1.12 (2024-02-13)
-=================
-
-- Fix #22: Do not convert tuple attributes to list (#44)
-
-1.11 (2023-10-24)
-=================
-
-- Fix #39: RecursionError when dict in class member (#41)
-- Minor changes in README
-
-1.10 (2022-09-28)
-=================
-
-* Make tests compatible with python2 and python3 (thanks @JackLangerman)
-* Dictify input
-* Fix license metadata 
-
-1.9 (2018-10-18)
-================
-
-* Fix issue #3 that update and pop now work correctly on EasyDicts.
-
-
-1.8 (2018-08-17)
-================
-
-* Update package classifiers.
-
-
-1.7 (2017-04-27)
-================
-
-* Prevent copying sub-EasyDicts on assignment to fix unpickling (#7, thanks 
@Chronos-Sk)
-
-1.6 (2015-01-27)
-================
-
-* Allow setting attributes via setting items (thanks phivos)
-
-1.5 (2014-08-07)
-================
-
-* Allow subclassing using self instead of class name (thanks Steve Engledow)
-
-1.4 (2011-03-13)
-================
-
-* Access class attributes like instance attributes
-
-1.3 (2012-02-08)
-================
-
-* Better documentation and tests
-
-1.2 (2011-06-08)
-================
-
-* Fix inclusion of README
-
-1.1 (2012-04-21)
-================
-
-* Switch to distutils2
-
-1.0 (2011-04-18)
-================
-
-* Initial working version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/MANIFEST.in 
new/easydict-1.14/MANIFEST.in
--- old/easydict-1.13/MANIFEST.in       2022-09-28 13:16:54.000000000 +0200
+++ new/easydict-1.14/MANIFEST.in       1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-include README.rst CHANGES LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/PKG-INFO new/easydict-1.14/PKG-INFO
--- old/easydict-1.13/PKG-INFO  2024-03-04 13:03:23.822693000 +0100
+++ new/easydict-1.14/PKG-INFO  2026-11-09 13:44:46.543886700 +0100
@@ -1,22 +1,22 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: easydict
-Version: 1.13
+Version: 1.14
 Summary: Access dict values as attributes (works recursively).
-Home-page: https://github.com/makinacorpus/easydict
-Download-URL: http://pypi.python.org/pypi/easydict/
-Author: Mathieu Leplatre
-Author-email: [email protected]
-License: LGPL-3.0
+Author-email: Mathieu Leplatre <[email protected]>
+License-Expression: LGPL-3.0-only
+Project-URL: Homepage, https://github.com/makinacorpus/easydict
+Project-URL: Download, https://pypi.org/project/easydict/
+Project-URL: Changelog, https://github.com/makinacorpus/easydict/releases/
 Keywords: Tools
 Classifier: Topic :: Utilities
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
 Classifier: Intended Audience :: Developers
 Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 
(LGPLv3)
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3
+Description-Content-Type: text/x-rst
 License-File: LICENSE
+Dynamic: license-file
 
 .. image:: https://img.shields.io/pypi/v/easydict.svg
         :target: https://pypi.python.org/pypi/easydict
@@ -128,83 +128,3 @@
 
 * `TreeDict <http://pypi.python.org/pypi/treedict>`_, a fast and full-featured 
dict-like tree container.
 * `addict <https://github.com/mewwts/addict>`_
-
-
-=========
-CHANGELOG
-=========
-
-1.12 (2024-03-04)
-=================
-
-- Fix #46: Fix handling of optional default value for .pop() (#47)
-
-1.12 (2024-02-13)
-=================
-
-- Fix #22: Do not convert tuple attributes to list (#44)
-
-1.11 (2023-10-24)
-=================
-
-- Fix #39: RecursionError when dict in class member (#41)
-- Minor changes in README
-
-1.10 (2022-09-28)
-=================
-
-* Make tests compatible with python2 and python3 (thanks @JackLangerman)
-* Dictify input
-* Fix license metadata 
-
-1.9 (2018-10-18)
-================
-
-* Fix issue #3 that update and pop now work correctly on EasyDicts.
-
-
-1.8 (2018-08-17)
-================
-
-* Update package classifiers.
-
-
-1.7 (2017-04-27)
-================
-
-* Prevent copying sub-EasyDicts on assignment to fix unpickling (#7, thanks 
@Chronos-Sk)
-
-1.6 (2015-01-27)
-================
-
-* Allow setting attributes via setting items (thanks phivos)
-
-1.5 (2014-08-07)
-================
-
-* Allow subclassing using self instead of class name (thanks Steve Engledow)
-
-1.4 (2011-03-13)
-================
-
-* Access class attributes like instance attributes
-
-1.3 (2012-02-08)
-================
-
-* Better documentation and tests
-
-1.2 (2011-06-08)
-================
-
-* Fix inclusion of README
-
-1.1 (2012-04-21)
-================
-
-* Switch to distutils2
-
-1.0 (2011-04-18)
-================
-
-* Initial working version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/easydict/__init__.py 
new/easydict-1.14/easydict/__init__.py
--- old/easydict-1.13/easydict/__init__.py      2024-03-04 12:15:50.000000000 
+0100
+++ new/easydict-1.14/easydict/__init__.py      2026-11-09 13:44:40.939377000 
+0100
@@ -54,7 +54,30 @@
     >>> d.tpl = (1, 2, 3)
     >>> d.tpl
     (1, 2, 3)
-
+    >>> d.lst = [{'a': 1}, {'b': 2}]
+    >>> type(d.lst).__name__, type(d.lst[0]).__name__, d.lst[0].a, d.lst[1].b
+    ('list', 'EasyDict', 1, 2)
+    >>> d.tpl = ({'a': 1}, {'b': 2})
+    >>> type(d.tpl).__name__, type(d.tpl[0]).__name__, d.tpl[0].a, d.tpl[1].b
+    ('tuple', 'EasyDict', 1, 2)
+
+    Subclasses of list, tuple and dict are left untouched
+
+    >>> class CustomList(list): pass
+    >>> class CustomTuple(tuple): pass
+    >>> class CustomDict(dict): pass
+    >>> d = EasyDict()
+    >>> d.lst = CustomList([{'a': 1}])
+    >>> type(d.lst).__name__, type(d.lst[0]).__name__
+    ('CustomList', 'dict')
+    >>> d.tpl = CustomTuple(({'a': 1},))
+    >>> type(d.tpl).__name__, type(d.tpl[0]).__name__
+    ('CustomTuple', 'dict')
+    >>> d.dct = CustomDict({'key': 'value'})
+    >>> type(d.dct).__name__
+    'CustomDict'
+    >>> d.dct == {'key': 'value'}
+    True
 
     Values extraction
 
@@ -129,6 +152,48 @@
     4
     >>> d
     {'c': 3.0}
+
+    Set defaults through attributes, including nested mappings
+
+    >>> d = EasyDict()
+    >>> d.setdefault('count', 2)
+    2
+    >>> d.count
+    2
+    >>> settings = d.setdefault('settings', {'enabled': True})
+    >>> settings is d.settings
+    True
+    >>> settings.enabled
+    True
+    >>> d.setdefault('count', 9)
+    2
+    >>> d.count
+    2
+    >>> d.setdefault('optional') is None
+    True
+    >>> d.optional is None
+    True
+    >>> sorted(d)
+    ['count', 'optional', 'settings']
+
+    Keys that cannot be ordinary attributes remain dictionary entries
+
+    >>> for key in (1, None, ('item',), '__class__', '__dict__', 
'__weakref__'):
+    ...     d = EasyDict()
+    ...     value = {'enabled': True}
+    ...     assert d.setdefault(key, value) is value
+    ...     assert d[key] is value
+    ...     assert d.setdefault(key, 'replacement') is value
+    ...     assert type(d) is EasyDict
+    ...     assert vars(d) == {}
+
+    update does not mutate its argument
+
+    >>> src = {'a': 1}
+    >>> d = EasyDict()
+    >>> d.update(src, b=2)
+    >>> src == {'a': 1}
+    True
     """
     def __init__(self, d=None, **kwargs):
         if d is None:
@@ -140,31 +205,38 @@
         for k, v in d.items():
             setattr(self, k, v)
         # Class attributes
-        for k in self.__class__.__dict__.keys():
-            if not (k.startswith('__') and k.endswith('__')) and k not in 
('update', 'pop'):
+        for k in self.__class__.__dict__:
+            if not (k.startswith('__') and k.endswith('__')) and k not in 
('update', 'pop', 'setdefault'):
                 setattr(self, k, getattr(self, k))
 
     def __setattr__(self, name, value):
-        if isinstance(value, (list, tuple)):
+        if type(value) in (list, tuple):
             value = type(value)(self.__class__(x)
                      if isinstance(x, dict) else x for x in value)
-        elif isinstance(value, dict) and not isinstance(value, EasyDict):
+        elif type(value) == dict and not isinstance(value, EasyDict):
             value = EasyDict(value)
-        super(EasyDict, self).__setattr__(name, value)
-        super(EasyDict, self).__setitem__(name, value)
+        super().__setattr__(name, value)
+        super().__setitem__(name, value)
 
     __setitem__ = __setattr__
 
     def update(self, e=None, **f):
-        d = e or dict()
+        d = dict(e) if e else {}
         d.update(f)
         for k in d:
             setattr(self, k, d[k])
 
+    def setdefault(self, key, default=None):
+        if not isinstance(key, str) or (key.startswith('__') and 
key.endswith('__')):
+            return dict.setdefault(self, key, default)
+        if key not in self:
+            self[key] = default
+        return self[key]
+
     def pop(self, k, *args):
         if hasattr(self, k):
             delattr(self, k)
-        return super(EasyDict, self).pop(k, *args)
+        return super().pop(k, *args)
 
 
 if __name__ == "__main__":
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/easydict.egg-info/PKG-INFO 
new/easydict-1.14/easydict.egg-info/PKG-INFO
--- old/easydict-1.13/easydict.egg-info/PKG-INFO        2024-03-04 
13:03:23.000000000 +0100
+++ new/easydict-1.14/easydict.egg-info/PKG-INFO        2026-11-09 
13:44:46.528137200 +0100
@@ -1,22 +1,22 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: easydict
-Version: 1.13
+Version: 1.14
 Summary: Access dict values as attributes (works recursively).
-Home-page: https://github.com/makinacorpus/easydict
-Download-URL: http://pypi.python.org/pypi/easydict/
-Author: Mathieu Leplatre
-Author-email: [email protected]
-License: LGPL-3.0
+Author-email: Mathieu Leplatre <[email protected]>
+License-Expression: LGPL-3.0-only
+Project-URL: Homepage, https://github.com/makinacorpus/easydict
+Project-URL: Download, https://pypi.org/project/easydict/
+Project-URL: Changelog, https://github.com/makinacorpus/easydict/releases/
 Keywords: Tools
 Classifier: Topic :: Utilities
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
 Classifier: Intended Audience :: Developers
 Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 
(LGPLv3)
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3
+Description-Content-Type: text/x-rst
 License-File: LICENSE
+Dynamic: license-file
 
 .. image:: https://img.shields.io/pypi/v/easydict.svg
         :target: https://pypi.python.org/pypi/easydict
@@ -128,83 +128,3 @@
 
 * `TreeDict <http://pypi.python.org/pypi/treedict>`_, a fast and full-featured 
dict-like tree container.
 * `addict <https://github.com/mewwts/addict>`_
-
-
-=========
-CHANGELOG
-=========
-
-1.12 (2024-03-04)
-=================
-
-- Fix #46: Fix handling of optional default value for .pop() (#47)
-
-1.12 (2024-02-13)
-=================
-
-- Fix #22: Do not convert tuple attributes to list (#44)
-
-1.11 (2023-10-24)
-=================
-
-- Fix #39: RecursionError when dict in class member (#41)
-- Minor changes in README
-
-1.10 (2022-09-28)
-=================
-
-* Make tests compatible with python2 and python3 (thanks @JackLangerman)
-* Dictify input
-* Fix license metadata 
-
-1.9 (2018-10-18)
-================
-
-* Fix issue #3 that update and pop now work correctly on EasyDicts.
-
-
-1.8 (2018-08-17)
-================
-
-* Update package classifiers.
-
-
-1.7 (2017-04-27)
-================
-
-* Prevent copying sub-EasyDicts on assignment to fix unpickling (#7, thanks 
@Chronos-Sk)
-
-1.6 (2015-01-27)
-================
-
-* Allow setting attributes via setting items (thanks phivos)
-
-1.5 (2014-08-07)
-================
-
-* Allow subclassing using self instead of class name (thanks Steve Engledow)
-
-1.4 (2011-03-13)
-================
-
-* Access class attributes like instance attributes
-
-1.3 (2012-02-08)
-================
-
-* Better documentation and tests
-
-1.2 (2011-06-08)
-================
-
-* Fix inclusion of README
-
-1.1 (2012-04-21)
-================
-
-* Switch to distutils2
-
-1.0 (2011-04-18)
-================
-
-* Initial working version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/easydict.egg-info/SOURCES.txt 
new/easydict-1.14/easydict.egg-info/SOURCES.txt
--- old/easydict-1.13/easydict.egg-info/SOURCES.txt     2024-03-04 
13:03:23.000000000 +0100
+++ new/easydict-1.14/easydict.egg-info/SOURCES.txt     2026-11-09 
13:44:46.537371000 +0100
@@ -1,11 +1,13 @@
-CHANGES
+.gitignore
 LICENSE
-MANIFEST.in
 README.rst
-setup.py
+pyproject.toml
+.github/workflows/publish.yml
+.github/workflows/test.yml
 easydict/__init__.py
 easydict.egg-info/PKG-INFO
 easydict.egg-info/SOURCES.txt
 easydict.egg-info/dependency_links.txt
-easydict.egg-info/not-zip-safe
+easydict.egg-info/scm_file_list.json
+easydict.egg-info/scm_version.json
 easydict.egg-info/top_level.txt
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/easydict.egg-info/not-zip-safe 
new/easydict-1.14/easydict.egg-info/not-zip-safe
--- old/easydict-1.13/easydict.egg-info/not-zip-safe    2022-09-28 
13:21:01.000000000 +0200
+++ new/easydict-1.14/easydict.egg-info/not-zip-safe    1970-01-01 
01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/easydict.egg-info/scm_file_list.json 
new/easydict-1.14/easydict.egg-info/scm_file_list.json
--- old/easydict-1.13/easydict.egg-info/scm_file_list.json      1970-01-01 
01:00:00.000000000 +0100
+++ new/easydict-1.14/easydict.egg-info/scm_file_list.json      2026-11-09 
13:44:46.526790900 +0100
@@ -0,0 +1,11 @@
+{
+  "files": [
+    ".github/workflows/publish.yml",
+    ".github/workflows/test.yml",
+    ".gitignore",
+    "LICENSE",
+    "README.rst",
+    "easydict/__init__.py",
+    "pyproject.toml"
+  ]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/easydict.egg-info/scm_version.json 
new/easydict-1.14/easydict.egg-info/scm_version.json
--- old/easydict-1.13/easydict.egg-info/scm_version.json        1970-01-01 
01:00:00.000000000 +0100
+++ new/easydict-1.14/easydict.egg-info/scm_version.json        2026-11-09 
13:44:46.521070000 +0100
@@ -0,0 +1,8 @@
+{
+  "tag": "1.14",
+  "distance": 0,
+  "node": "gfae493a1380d9b77af0cc9e607571f836bdd2a2c",
+  "dirty": false,
+  "branch": "HEAD",
+  "node_date": "2026-11-09"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/pyproject.toml 
new/easydict-1.14/pyproject.toml
--- old/easydict-1.13/pyproject.toml    1970-01-01 01:00:00.000000000 +0100
+++ new/easydict-1.14/pyproject.toml    2026-11-09 13:44:40.939377000 +0100
@@ -0,0 +1,35 @@
+[project]
+name = "easydict"
+dynamic = ["version"]
+readme = "README.rst"
+description = "Access dict values as attributes (works recursively)."
+license = "LGPL-3.0-only"
+license-files = ["LICENSE"]
+authors = [
+    { name = "Mathieu Leplatre", email = "[email protected]" 
},
+]
+keywords = ["Tools"]
+classifiers = [
+    "Topic :: Utilities",
+    "Natural Language :: English",
+    "Operating System :: OS Independent",
+    "Intended Audience :: Developers",
+    "Development Status :: 5 - Production/Stable",
+    "Programming Language :: Python :: 3",
+]
+dependencies = []
+
+[project.urls]
+Homepage = "https://github.com/makinacorpus/easydict";
+Download = "https://pypi.org/project/easydict/";
+Changelog = "https://github.com/makinacorpus/easydict/releases/";
+
+[tool.setuptools]
+packages = ["easydict"]
+
+[tool.setuptools_scm]
+# presence enables setuptools_scm (version from git tags)
+
+[build-system]
+requires = ["setuptools>=77", "setuptools_scm>=8"]
+build-backend = "setuptools.build_meta"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/easydict-1.13/setup.py new/easydict-1.14/setup.py
--- old/easydict-1.13/setup.py  2024-03-04 13:01:32.000000000 +0100
+++ new/easydict-1.14/setup.py  1970-01-01 01:00:00.000000000 +0100
@@ -1,32 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf8 -*-
-import os
-from setuptools import setup, find_packages
-
-here = os.path.abspath(os.path.dirname(__file__))
-
-setup(
-    name='easydict',
-    version='1.13',
-    author='Mathieu Leplatre',
-    author_email='[email protected]',
-    url='https://github.com/makinacorpus/easydict',
-    download_url="http://pypi.python.org/pypi/easydict/";,
-    description="Access dict values as attributes (works recursively).",
-    long_description=open(os.path.join(here, 'README.rst')).read() + '\n\n' +
-                     open(os.path.join(here, 'CHANGES')).read(),
-    license='LGPL-3.0',
-    install_requires=[],
-    packages=find_packages(),
-    include_package_data=True,
-    zip_safe=False,
-    keywords=['Tools'],
-    classifiers=['Topic :: Utilities', 
-                 'Natural Language :: English',
-                 'Operating System :: OS Independent',
-                 'Intended Audience :: Developers',
-                 'Development Status :: 5 - Production/Stable',
-                 'License :: OSI Approved :: GNU Lesser General Public License 
v3 (LGPLv3)',
-                 'Programming Language :: Python :: 2.5',
-                 'Programming Language :: Python :: 3.6'],
-)

Reply via email to