{"id":16495651,"url":"https://github.com/bitranox/pathlib3x","last_synced_at":"2025-06-30T09:36:29.959Z","repository":{"id":38444807,"uuid":"275859990","full_name":"bitranox/pathlib3x","owner":"bitranox","description":"backport of latest pathlib (3.10.a0) to python 3.6 and newer with a few extensions","archived":false,"fork":false,"pushed_at":"2025-01-24T23:22:37.000Z","size":161,"stargazers_count":12,"open_issues_count":7,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-12T22:38:04.677Z","etag":null,"topics":["backport","pathlib","python","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bitranox.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.rst","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-29T15:47:38.000Z","updated_at":"2025-01-24T23:22:40.000Z","dependencies_parsed_at":"2024-03-17T23:29:00.258Z","dependency_job_id":"7d2607dc-9926-41f7-bd35-fa5696b21924","html_url":"https://github.com/bitranox/pathlib3x","commit_stats":{"total_commits":107,"total_committers":2,"mean_commits":53.5,"dds":0.009345794392523366,"last_synced_commit":"80f0fc48f64ba5aa822f32375e547194c6b632bb"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitranox%2Fpathlib3x","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitranox%2Fpathlib3x/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitranox%2Fpathlib3x/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitranox%2Fpathlib3x/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bitranox","download_url":"https://codeload.github.com/bitranox/pathlib3x/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243826783,"owners_count":20354220,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backport","pathlib","python","python3"],"created_at":"2024-10-11T14:31:55.672Z","updated_at":"2025-03-16T18:32:05.050Z","avatar_url":"https://github.com/bitranox.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"pathlib3x\n=========\n\n\nVersion v2.0.3 as of 2023-07-20 see `Changelog`_\n\n|build_badge| |codeql| |license| |pypi|\n|pypi-downloads| |black| |codecov| |cc_maintain| |cc_issues| |cc_coverage| |snyk|\n\n\n\n.. |build_badge| image:: https://github.com/bitranox/pathlib3x/actions/workflows/python-package.yml/badge.svg\n   :target: https://github.com/bitranox/pathlib3x/actions/workflows/python-package.yml\n\n\n.. |codeql| image:: https://github.com/bitranox/pathlib3x/actions/workflows/codeql-analysis.yml/badge.svg?event=push\n   :target: https://github.com//bitranox/pathlib3x/actions/workflows/codeql-analysis.yml\n\n.. |license| image:: https://img.shields.io/github/license/webcomics/pywine.svg\n   :target: http://en.wikipedia.org/wiki/MIT_License\n\n.. |jupyter| image:: https://mybinder.org/badge_logo.svg\n   :target: https://mybinder.org/v2/gh/bitranox/pathlib3x/master?filepath=pathlib3x.ipynb\n\n.. for the pypi status link note the dashes, not the underscore !\n.. |pypi| image:: https://img.shields.io/pypi/status/pathlib3x?label=PyPI%20Package\n   :target: https://badge.fury.io/py/pathlib3x\n\n.. |codecov| image:: https://img.shields.io/codecov/c/github/bitranox/pathlib3x\n   :target: https://codecov.io/gh/bitranox/pathlib3x\n\n.. |cc_maintain| image:: https://img.shields.io/codeclimate/maintainability-percentage/bitranox/pathlib3x?label=CC%20maintainability\n   :target: https://codeclimate.com/github/bitranox/pathlib3x/maintainability\n   :alt: Maintainability\n\n.. |cc_issues| image:: https://img.shields.io/codeclimate/issues/bitranox/pathlib3x?label=CC%20issues\n   :target: https://codeclimate.com/github/bitranox/pathlib3x/maintainability\n   :alt: Maintainability\n\n.. |cc_coverage| image:: https://img.shields.io/codeclimate/coverage/bitranox/pathlib3x?label=CC%20coverage\n   :target: https://codeclimate.com/github/bitranox/pathlib3x/test_coverage\n   :alt: Code Coverage\n\n.. |snyk| image:: https://snyk.io/test/github/bitranox/pathlib3x/badge.svg\n   :target: https://snyk.io/test/github/bitranox/pathlib3x\n\n.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n   :target: https://github.com/psf/black\n\n.. |pypi-downloads| image:: https://img.shields.io/pypi/dm/pathlib3x\n   :target: https://pypi.org/project/pathlib3x/\n   :alt: PyPI - Downloads\n\nBackport of Python 3.11.0a0 pathlib for Python 3.6, 3.7, 3.8, 3.9, 3.10 with a few tweaks to make it compatible.\n\nadded wrappers to shutil copy, copy2, rmtree, copytree and other useful functions.\n\nfully typed PEP561 package\n\nthis will be updated periodically to have the latest version of pathlib available on 3.6, 3.7, 3.8, 3.9, 3.10 and probably others.\n\nWHY pathlib3x ?\n===============\n\nThere are a number of small, but very handy features added in pathlib over the last python versions,\nso I want to be able to use those also on older python versions.\n\n\nif You are used to :\n\n.. code-block::\n\n    import pathlib\n\n    pathlib.Path('some_file').unlink(missing_ok=True)\n\nYou will have no luck on python 3.7 - because the \"missing_ok\" parameter was added in python3.8\n\nOf course You can do :\n\n.. code-block::\n\n    import pathlib\n\n    try:\n        pathlib.Path('some_file').unlink()\n    except FileNotFoundError:\n        pass\n\n\n\nbut that clutters the code unnecessarily. So just use :\n\n.. code-block::\n\n    import pathlib3x as pathlib\n\n\nand You can enjoy the latest pathlib features even on older python versions.\n\nSome own extensions to that pathlib will be added probably over time. At the moment we added some wrappers to shutil like \"copy\", \"rmtree\", \"copytree\", so\nYou can do :\n\n.. code-block::\n\n    import pathlib3x as pathlib\n    my_file = pathlib.Path('/etc/hosts')\n    to_file = pathlib.Path('/tmp/foo')\n    my_file.copy(to_file)\n\n\nIf You have some nice features for pathlib, let me know - I will consider to integrate them.\n\n----\n\nautomated tests, Github Actions, Documentation, Badges, etc. are managed with `PizzaCutter \u003chttps://github\n.com/bitranox/PizzaCutter\u003e`_ (cookiecutter on steroids)\n\nPython version required: 3.8.0 or newer\n\ntested on recent linux with python 3.8, 3.9, 3.10, 3.11, 3.12-dev, pypy-3.9, pypy-3.10 - architectures: amd64\n\n`100% (for my added functions) code coverage \u003chttps://codeclimate.com/github/bitranox/pathlib3x/test_coverage\u003e`_, flake8 style checking ,mypy static type checking ,tested under `Linux, macOS, Windows \u003chttps://github.com/bitranox/pathlib3x/actions/workflows/python-package.yml\u003e`_, automatic daily builds and monitoring\n\n----\n\n- `Usage`_\n- `Usage from Commandline`_\n- `Installation and Upgrade`_\n- `Requirements`_\n- `Acknowledgements`_\n- `Contribute`_\n- `Report Issues \u003chttps://github.com/bitranox/pathlib3x/blob/master/ISSUE_TEMPLATE.md\u003e`_\n- `Pull Request \u003chttps://github.com/bitranox/pathlib3x/blob/master/PULL_REQUEST_TEMPLATE.md\u003e`_\n- `Code of Conduct \u003chttps://github.com/bitranox/pathlib3x/blob/master/CODE_OF_CONDUCT.md\u003e`_\n- `License`_\n- `Changelog`_\n\n----\n\n\n\nUsage\n-----------\n\njust check out the latest python documentation :  https://docs.python.org/3/library/pathlib.html and select 3.10 Branch\n\nAdditional Features are documented here :\n\nPurePath.append_suffix(suffix)\n    Return a new path with the *suffix* appended. If the original path doesn’t have a suffix, the new suffix is appended.\n    If the original path have a suffix, the new suffix will be appended at the end.\n    If *suffix* is an empty string the original Path will be returned.\n\n.. code-block:: python\n\n    \u003e\u003e\u003e p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e p.append_suffix('.bz2')\n    PureWindowsPath('c:/Downloads/pathlib.tar.gz.bz2')\n    \u003e\u003e\u003e p = PureWindowsPath('README')\n    \u003e\u003e\u003e p.append_suffix('.txt')\n    PureWindowsPath('README.txt')\n    \u003e\u003e\u003e p = PureWindowsPath('README.txt')\n    \u003e\u003e\u003e p.append_suffix('')\n    PureWindowsPath('README.txt')\n\n\nPurePath.is_path_instance(__obj)\n    Return True if *__obj* is instance of the original pathlib.Path or pathlib3x.Path.\n    Useful if You need to check for Path type, in an environment were You mix pathlib and pathlib3x\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x\n    \u003e\u003e\u003e import pathlib\n\n    \u003e\u003e\u003e pathlib3x_path = pathlib3x.Path('some_path')  # this might happen in another module !\n    \u003e\u003e\u003e pathlib_path = pathlib.Path('some_path')\n    \u003e\u003e\u003e isinstance(pathlib3x_path, pathlib.Path)\n    False\n    \u003e\u003e\u003e isinstance(pathlib_path, pathlib3x.Path)\n    False\n\n    # in such cases were You need to mix pathlib and pathlib3x in different modules, use:\n    \u003e\u003e\u003e pathlib3x_path.Path.is_path_instance(pathlib3x_path)\n    True\n    \u003e\u003e\u003e pathlib3x_path.Path.is_path_instance(pathlib_path)\n    True\n\n\nPurePath.replace_parts(old, new, count=-1)\n    Return a new Path with parts replaced. If the Original Path or *old* has no parts, the Original Path will be returned.\n    On Windows, the replacement operation is not case sensitive, because of case folding on drives, directory and filenames.\n    You can also replace absolute paths with relative paths what is quite handy - just be aware that the results might\n    look unexpected, especially on Windows.\n\n    *old, new* can be pathlib.Path or Path-like objects\n\n    if the Original Path is resolved, You should probably also resolve *old* and *new* - because if symlinks are involved,\n    the results might be unexpected.\n\n    be aware of case folding in windows, the file \"c:/Test/test.txt\" is the same as \"c:/test/Test.TXT\"\n\n.. code-block:: python\n\n    \u003e\u003e\u003e p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e p.replace_parts(PureWindowsPath('C:/downloads'), PureWindowsPath('D:/uploads'))\n    PureWindowsPath('D:/uploads/pathlib.tar.gz')\n\n    \u003e\u003e\u003e p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e p.replace_parts('C:/downloads','D:/uploads')\n    PureWindowsPath('D:/uploads/pathlib.tar.gz')\n\n    # handy to replace source directories with target directories on copy or move operations :\n    \u003e\u003e\u003e source_dir = pathlib.Path('c:/source_dir')\n    \u003e\u003e\u003e target_dir = pathlib.Path('c:/target_dir')\n    \u003e\u003e\u003e source_files = source_dir.glob('**/*.txt')\n    \u003e\u003e\u003e for source in source_files:\n            target = source.replace_parts(source_dir, target_dir)\n    ...     source.copy(target)\n\n    # this will always return PureWindowsPath(), because PureWindowsPath('.') has no parts to replace\n    \u003e\u003e\u003e p = PureWindowsPath('.')\n    \u003e\u003e\u003e p.replace_parts('.', 'test')\n    PureWindowsPath()\n\n    # looks unexpected but is correct, since PureWindowsPath('/uploads') is a relative path in Windows\n    \u003e\u003e\u003e p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e p.replace_parts('C:/downloads', '/uploads')\n    PureWindowsPath('uploads/pathlib.tar.gz')\n\n    # take care when replace, it might match on parts You are not aware of\n    \u003e\u003e\u003e p = PureWindowsPath('c:/downloads/Downloads.tar.gz')\n    \u003e\u003e\u003e p.replace_parts('downloads', 'uploads')\n    PureWindowsPath('c:/uploads/uploads.tar.gz')    # that was not intended !\n\n    # better\n    \u003e\u003e\u003e p = PureWindowsPath('c:/downloads/Downloads.tar.gz')\n    \u003e\u003e\u003e p.replace_parts('downloads', 'uploads', 1)\n    PureWindowsPath('c:/uploads/Downloads.tar.gz')\n\n    # much better\n    \u003e\u003e\u003e p = PureWindowsPath('c:/downloads/Downloads.tar.gz')\n    \u003e\u003e\u003e p.replace_parts('c:/downloads', 'c:/uploads')\n    PureWindowsPath('c:/uploads/Downloads.tar.gz')\n\n\nshutil wrappers\n===============\n\nPath.copy(target, follow_symlinks)\n    wraps shutil.copy, see: https://docs.python.org/3/library/shutil.html\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e s = pathlib.Path('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e t = pathlib.Path('c:/Downloads/pathlib.tar.gz.backup')\n    \u003e\u003e\u003e s.copy(t)\n\nPath.copy2(target, follow_symlinks=True)\n    wraps shutil.copy2, see: https://docs.python.org/3/library/shutil.html\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e s = pathlib.Path('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e t = pathlib.Path('c:/Downloads/pathlib.tar.gz.backup')\n    \u003e\u003e\u003e s.copy2(t)\n\nPath.copyfile(target, follow_symlinks)\n    wraps shutil.copyfile, see: https://docs.python.org/3/library/shutil.html\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e s = pathlib.Path('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e t = pathlib.Path('c:/Downloads/pathlib.tar.gz.backup')\n    \u003e\u003e\u003e s.copyfile(t)\n\nPath.copymode(target, follow_symlinks=True)\n    wraps shutil.copymode, see: https://docs.python.org/3/library/shutil.html\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e s = pathlib.Path('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e t = pathlib.Path('c:/Downloads/pathlib.tar.gz.backup')\n    \u003e\u003e\u003e s.copymode(t)\n\nPath.copystat(target, follow_symlinks=True)\n    wraps shutil.copystat, see: https://docs.python.org/3/library/shutil.html\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e s = pathlib.Path('c:/Downloads/pathlib.tar.gz')\n    \u003e\u003e\u003e t = pathlib.Path('c:/Downloads/pathlib.tar.gz.backup')\n    \u003e\u003e\u003e s.copystat(t)\n\nPath.copytree(target, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=True, dirs_exists_ok=False)\n    wraps shutil.copytree, see: https://docs.python.org/3/library/shutil.html\n\n    dirs_exists_ok=True will raise a TypeError on Python Versions \u003c 3.8\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e s = pathlib.Path('c:/Downloads')\n    \u003e\u003e\u003e t = pathlib.Path('c:/temp/Backups')\n    \u003e\u003e\u003e s.copytree(t)\n\nPath.rmtree(ignore_errors=False, onerror=None)\n    wraps shutil.rmtree, see: https://docs.python.org/3/library/shutil.html\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x as pathlib\n    \u003e\u003e\u003e p = pathlib.Path('c:/Downloads/old')\n    \u003e\u003e\u003e p.rmtree()\n\n\nCaveats of pathlib3x\n====================\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import pathlib3x\n    \u003e\u003e\u003e import pathlib\n\n    \u003e\u003e\u003e pathlib3x_path = pathlib3x.Path('some_path')  # this might happen in another module !\n    \u003e\u003e\u003e pathlib_path = pathlib.Path('some_path')\n    \u003e\u003e\u003e isinstance(pathlib3x_path, pathlib.Path)\n    False\n    \u003e\u003e\u003e isinstance(pathlib_path, pathlib3x.Path)\n    False\n\n    # in such cases were You need to mix pathlib and pathlib3x in different modules, use:\n    \u003e\u003e\u003e pathlib3x_path.Path.is_path_instance(pathlib3x_path)\n    True\n    \u003e\u003e\u003e pathlib3x_path.Path.is_path_instance(pathlib_path)\n    True\n\n\nSo dont mix pathlib with pathlib3x and expect that objects are an instance of Pathlib and vice versa.\nThis can happen easily if You have many Modules. Just keep it in mind !\n\nUsage from Commandline\n------------------------\n\n.. code-block::\n\n   Usage: pathlib3x [OPTIONS] COMMAND [ARGS]...\n\n     backport of pathlib 3.10 to python 3.6, 3.7, 3.8, 3.9 with a few extensions\n\n   Options:\n     --version                     Show the version and exit.\n     --traceback / --no-traceback  return traceback information on cli\n     -h, --help                    Show this message and exit.\n\n   Commands:\n     info  get program informations\n\nInstallation and Upgrade\n------------------------\n\n- Before You start, its highly recommended to update pip and setup tools:\n\n\n.. code-block::\n\n    python -m pip --upgrade pip\n    python -m pip --upgrade setuptools\n\n- to install the latest release from PyPi via pip (recommended):\n\n.. code-block::\n\n    python -m pip install --upgrade pathlib3x\n\n\n- to install the latest release from PyPi via pip, including test dependencies:\n\n.. code-block::\n\n    python -m pip install --upgrade pathlib3x[test]\n\n- to install the latest version from github via pip:\n\n\n.. code-block::\n\n    python -m pip install --upgrade git+https://github.com/bitranox/pathlib3x.git\n\n\n- include it into Your requirements.txt:\n\n.. code-block::\n\n    # Insert following line in Your requirements.txt:\n    # for the latest Release on pypi:\n    pathlib3x\n\n    # for the latest development version :\n    pathlib3x @ git+https://github.com/bitranox/pathlib3x.git\n\n    # to install and upgrade all modules mentioned in requirements.txt:\n    python -m pip install --upgrade -r /\u003cpath\u003e/requirements.txt\n\n\n- to install the latest development version, including test dependencies from source code:\n\n.. code-block::\n\n    # cd ~\n    $ git clone https://github.com/bitranox/pathlib3x.git\n    $ cd pathlib3x\n    python -m pip install -e .[test]\n\n- via makefile:\n  makefiles are a very convenient way to install. Here we can do much more,\n  like installing virtual environments, clean caches and so on.\n\n.. code-block:: shell\n\n    # from Your shell's homedirectory:\n    $ git clone https://github.com/bitranox/pathlib3x.git\n    $ cd pathlib3x\n\n    # to run the tests:\n    $ make test\n\n    # to install the package\n    $ make install\n\n    # to clean the package\n    $ make clean\n\n    # uninstall the package\n    $ make uninstall\n\nRequirements\n------------\nfollowing modules will be automatically installed :\n\n.. code-block:: bash\n\n    ## Project Requirements\n    click\n    cli_exit_tools\n\nAcknowledgements\n----------------\n\n- special thanks to \"uncle bob\" Robert C. Martin, especially for his books on \"clean code\" and \"clean architecture\"\n\nContribute\n----------\n\nI would love for you to fork and send me pull request for this project.\n- `please Contribute \u003chttps://github.com/bitranox/pathlib3x/blob/master/CONTRIBUTING.md\u003e`_\n\nLicense\n-------\n\nThis software is licensed under the `MIT license \u003chttp://en.wikipedia.org/wiki/MIT_License\u003e`_\n\n---\n\nChangelog\n=========\n\n- new MAJOR version for incompatible API changes,\n- new MINOR version for added functionality in a backwards compatible manner\n- new PATCH version for backwards compatible bug fixes\n\nv2.0.3\n---------\n2023-07-13:\n    - require minimum python 3.8\n    - remove python 3.7 tests\n    - introduce PEP517 packaging standard\n    - introduce pyproject.toml build-system\n    - remove mypy.ini\n    - remove pytest.ini\n    - remove setup.cfg\n    - remove setup.py\n    - remove .bettercodehub.yml\n    - remove .travis.yml\n    - update black config\n    - clean ./tests/test_cli.py\n    - add codeql badge\n    - move 3rd_party_stubs outside the src directory to ``./.3rd_party_stubs``\n    - add pypy 3.10 tests\n    - add python 3.12-dev tests\n\n\nv2.0.2.1\n--------\n2022-06-03: use io.encoding only on 3.10 upwards\n\nv2.0.2\n--------\n2022-06-03: define __fspath__ only on python \u003e= 3.10\n\nv2.0.1\n--------\n2022-06-03: use io.encoding only on 3.10 upwards\n\nv2.0.0\n--------\n2022-06-03:\n    - upgrade to pathlib python 3.11a0 version\n    - upgrade to github actions @v3\n\nv1.3.9\n--------\n2020-10-09: service release\n    - update travis build matrix for linux 3.9-dev\n    - update travis build matrix (paths) for windows 3.9 / 3.10\n\nv1.3.8\n--------\n2020-08-08: service release\n    - fix documentation\n    - fix travis\n    - deprecate pycodestyle\n    - implement flake8\n\nv1.3.7\n---------\n2020-08-01: fix pypi deploy\n\nv1.3.6\n--------\n2020-07-31: fix travis build\n\nv0.3.5\n--------\n2020-07-29: feature release\n    - use the new pizzacutter template\n    - use cli_exit_tools\n\nv0.3.4\n--------\n2020-07-15 : patch release\n    - fix cli test\n    - enable traceback option on cli errors\n\nv0.3.3\n--------\n2020-07-15 : patch release\n    - fix minor typos\n\nv0.3.2\n--------\n2020-07-05 : patch release\n    - fix typo in setup.py setup parameter zip_safe\n\nv0.3.1\n--------\n2020-07-05 : patch release\n    - fix version issues in the stub files\n\nv0.3.0\n--------\n2020-07-05 : added functions, include stub files for typing, setup python_requires\n    - added python_requires in setup.py\n    - include type stub files, its fully type hinted package now (PEP 561)\n    - pep8 fix the standard library code\n    - added PurePath.replace_parts\n    - added PurePath.is_path_instance\n    - added Path.copy\n    - added Path.copy2\n    - added Path.copyfile\n    - added Path.copymode\n    - added Path.copystat\n    - added Path.copytree\n    - added Path.rmtree\n\nv0.2.0\n--------\n2020-07-02 : added function: PurePath.append_suffix(suffix)\n    - added function: PurePath.append_suffix(suffix)\n\nv0.1.1\n--------\n2020-07-01: patch release\n    - guarded the sys.audit calls with try-except clauses, because sys.event is only avail in python 3.8\n\n\nv0.1.0\n--------\n2020-06-29: initial release\n    - initial release\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitranox%2Fpathlib3x","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbitranox%2Fpathlib3x","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitranox%2Fpathlib3x/lists"}