Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-aiofiles for openSUSE:Factory 
checked in at 2022-01-09 22:50:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-aiofiles (Old)
 and      /work/SRC/openSUSE:Factory/.python-aiofiles.new.1892 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-aiofiles"

Sun Jan  9 22:50:21 2022 rev:4 rq:945151 version:0.8.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-aiofiles/python-aiofiles.changes  
2021-06-23 17:38:56.764530446 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-aiofiles.new.1892/python-aiofiles.changes    
    2022-01-09 22:50:40.387310758 +0100
@@ -1,0 +2,10 @@
+Sun Jan  9 15:24:11 UTC 2022 - Torsten Gruner <[email protected]>
+
+- Update to 0.8.0
+  * Added aiofiles.os.replace. #107
+  * Added aiofiles.os.{makedirs, removedirs}.
+  * Added aiofiles.os.path.{exists, isfile, isdir, getsize, getatime,
+    getctime, samefile, sameopenfile}. #63
+  * Added suffix, prefix, dir args to aiofiles.tempfile.TemporaryDirectory. 
#116
+
+-------------------------------------------------------------------

Old:
----
  aiofiles-0.7.0.tar.gz

New:
----
  aiofiles-0.8.0.tar.gz

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

Other differences:
------------------
++++++ python-aiofiles.spec ++++++
--- /var/tmp/diff_new_pack.mVeKIC/_old  2022-01-09 22:50:41.031311332 +0100
+++ /var/tmp/diff_new_pack.mVeKIC/_new  2022-01-09 22:50:41.035311336 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-aiofiles
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define skip_python2 1
 Name:           python-aiofiles
-Version:        0.7.0
+Version:        0.8.0
 Release:        0
 Summary:        File support for asyncio
 License:        Apache-2.0

++++++ aiofiles-0.7.0.tar.gz -> aiofiles-0.8.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/.github/workflows/main.yml 
new/aiofiles-0.8.0/.github/workflows/main.yml
--- old/aiofiles-0.7.0/.github/workflows/main.yml       2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/.github/workflows/main.yml       2021-11-27 
16:05:37.000000000 +0100
@@ -13,11 +13,11 @@
     name: "Python ${{ matrix.python-version }}"
     runs-on: "ubuntu-latest"
     env:
-      USING_COVERAGE: "3.6,3.7,3.8,3.9"
+      USING_COVERAGE: "3.6,3.7,3.8,3.9,3.10"
 
     strategy:
       matrix:
-        python-version: ["3.6", "3.7", "3.8", "3.9", "pypy-3.7"]
+        python-version: ["3.6", "3.7", "3.8", "3.9", "3.10.0-rc.2", "pypy-3.7"]
 
     steps:
       - uses: "actions/checkout@v2"
@@ -29,7 +29,7 @@
           set -xe
           python -VV
           python -m site
-          python -m pip install --upgrade pip wheel poetry
+          python -m pip install --upgrade pip wheel poetry==1.2.0a2
           python -m pip install --upgrade coverage[toml] virtualenv tox 
tox-gh-actions
       - name: "Run tox targets for ${{ matrix.python-version }}"
         run: "python -m tox"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/Makefile new/aiofiles-0.8.0/Makefile
--- old/aiofiles-0.7.0/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ new/aiofiles-0.8.0/Makefile 2021-11-27 16:05:37.000000000 +0100
@@ -0,0 +1,4 @@
+.PHONY: test
+
+test:
+       poetry run pytest -x --ff tests
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/README.rst 
new/aiofiles-0.8.0/README.rst
--- old/aiofiles-0.7.0/README.rst       2021-05-17 01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/README.rst       2021-11-27 16:05:37.000000000 +0100
@@ -102,9 +102,20 @@
 * ``stat``
 * ``sendfile``
 * ``rename``
+* ``replace``
 * ``remove``
 * ``mkdir``
+* ``makedirs``
 * ``rmdir``
+* ``removedirs``
+* ``path.exists``
+* ``path.isfile``
+* ``path.isdir``
+* ``path.getsize``
+* ``path.getatime``
+* ``path.getctime``
+* ``path.samefile``
+* ``path.sameopenfile``
 
 Tempfile
 ~~~~~~~~
@@ -154,6 +165,16 @@
 
 History
 ~~~~~~~
+0.8.0 (2021-11-27)
+``````````````````
+* aiofiles is now tested on Python 3.10.
+* Added ``aiofiles.os.replace``.
+  `#107 <https://github.com/Tinche/aiofiles/pull/107>`_
+* Added ``aiofiles.os.{makedirs, removedirs}``.
+* Added ``aiofiles.os.path.{exists, isfile, isdir, getsize, getatime, 
getctime, samefile, sameopenfile}``.
+  `#63 <https://github.com/Tinche/aiofiles/pull/63>`_
+* Added `suffix`, `prefix`, `dir` args to 
``aiofiles.tempfile.TemporaryDirectory``.
+  `#116 <https://github.com/Tinche/aiofiles/pull/116>`_
 
 0.7.0 (2021-05-17)
 ``````````````````
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/poetry.lock 
new/aiofiles-0.8.0/poetry.lock
--- old/aiofiles-0.7.0/poetry.lock      2021-05-17 01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/poetry.lock      2021-11-27 16:05:37.000000000 +0100
@@ -1,12 +1,4 @@
 [[package]]
-name = "appdirs"
-version = "1.4.4"
-description = "A small Python module for determining appropriate 
platform-specific dirs, e.g. a \"user data dir\"."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
 name = "atomicwrites"
 version = "1.4.0"
 description = "Atomic file writes."
@@ -16,17 +8,32 @@
 
 [[package]]
 name = "attrs"
-version = "20.3.0"
+version = "21.2.0"
 description = "Classes Without Boilerplate"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [package.extras]
-dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"]
-docs = ["furo", "sphinx", "zope.interface"]
-tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "zope.interface"]
-tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six"]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", 
"sphinx", "sphinx-notfound-page", "pre-commit"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
+
+[[package]]
+name = "backports.entry-points-selectable"
+version = "1.1.0"
+description = "Compatibility shim providing selectable entry points for older 
implementations"
+category = "dev"
+optional = false
+python-versions = ">=2.7"
+
+[package.dependencies]
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black 
(>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler 
(>=1.0.1)"]
 
 [[package]]
 name = "colorama"
@@ -49,7 +56,7 @@
 
 [[package]]
 name = "distlib"
-version = "0.3.1"
+version = "0.3.2"
 description = "Distribution utilities"
 category = "dev"
 optional = false
@@ -65,7 +72,7 @@
 
 [[package]]
 name = "importlib-metadata"
-version = "3.10.0"
+version = "4.8.1"
 description = "Read metadata from Python packages"
 category = "dev"
 optional = false
@@ -77,22 +84,23 @@
 
 [package.extras]
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", 
"flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources 
(>=1.3)"]
+perf = ["ipython"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", 
"flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", 
"pytest-mypy", "importlib-resources (>=1.3)"]
 
 [[package]]
 name = "importlib-resources"
-version = "5.1.2"
+version = "5.2.2"
 description = "Read resources from Python packages"
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-zipp = {version = ">=0.4", markers = "python_version < \"3.8\""}
+zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
 
 [package.extras]
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", 
"pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", 
"pytest-mypy"]
 
 [[package]]
 name = "iniconfig"
@@ -104,28 +112,41 @@
 
 [[package]]
 name = "packaging"
-version = "20.9"
+version = "21.0"
 description = "Core utilities for Python packages"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.6"
 
 [package.dependencies]
 pyparsing = ">=2.0.2"
 
 [[package]]
+name = "platformdirs"
+version = "2.3.0"
+description = "A small Python module for determining appropriate 
platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", 
"sphinx-autodoc-typehints (>=1.12)"]
+test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", 
"pytest-mock (>=3.6)"]
+
+[[package]]
 name = "pluggy"
-version = "0.13.1"
+version = "1.0.0"
 description = "plugin and hook calling mechanisms for python"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.6"
 
 [package.dependencies]
 importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 
 [package.extras]
 dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
 
 [[package]]
 name = "py"
@@ -145,7 +166,7 @@
 
 [[package]]
 name = "pytest"
-version = "6.2.2"
+version = "6.2.5"
 description = "pytest: simple powerful testing with Python"
 category = "dev"
 optional = false
@@ -158,7 +179,7 @@
 importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 iniconfig = "*"
 packaging = "*"
-pluggy = ">=0.12,<1.0.0a1"
+pluggy = ">=0.12,<2.0"
 py = ">=1.8.2"
 toml = "*"
 
@@ -167,21 +188,21 @@
 
 [[package]]
 name = "pytest-asyncio"
-version = "0.14.0"
+version = "0.15.1"
 description = "Pytest support for asyncio."
 category = "dev"
 optional = false
-python-versions = ">= 3.5"
+python-versions = ">= 3.6"
 
 [package.dependencies]
 pytest = ">=5.4.0"
 
 [package.extras]
-testing = ["async-generator (>=1.3)", "coverage", "hypothesis (>=5.7.1)"]
+testing = ["coverage", "hypothesis (>=5.7.1)"]
 
 [[package]]
 name = "six"
-version = "1.15.0"
+version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
 category = "dev"
 optional = false
@@ -197,7 +218,7 @@
 
 [[package]]
 name = "tox"
-version = "3.23.0"
+version = "3.24.4"
 description = "tox is a generic virtualenv management and test command line 
tool"
 category = "dev"
 optional = false
@@ -220,7 +241,7 @@
 
 [[package]]
 name = "typing-extensions"
-version = "3.7.4.3"
+version = "3.10.0.2"
 description = "Backported and Experimental Type Hints for Python 3.5+"
 category = "dev"
 optional = false
@@ -228,27 +249,28 @@
 
 [[package]]
 name = "virtualenv"
-version = "20.4.3"
+version = "20.8.0"
 description = "Virtual Python Environment builder"
 category = "dev"
 optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
 [package.dependencies]
-appdirs = ">=1.4.3,<2"
+"backports.entry-points-selectable" = ">=1.0.4"
 distlib = ">=0.3.1,<1"
 filelock = ">=3.0.0,<4"
 importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""}
+platformdirs = ">=2,<3"
 six = ">=1.9.0,<2"
 
 [package.extras]
 docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", 
"sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"]
-testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky 
(>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", 
"pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", 
"packaging (>=20.0)", "xonsh (>=0.9.16)"]
+testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky 
(>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", 
"pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", 
"packaging (>=20.0)"]
 
 [[package]]
 name = "zipp"
-version = "3.4.1"
+version = "3.5.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
 category = "dev"
 optional = false
@@ -256,25 +278,25 @@
 
 [package.extras]
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", 
"pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", 
"pytest-black (>=0.3.7)", "pytest-mypy"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", 
"pytest-black (>=0.3.7)", "pytest-mypy"]
 
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.6"
-content-hash = 
"d7334b44aa8d26f02c3ae74b66e668f0c9cb889143c4ff19e062a60172759978"
+content-hash = 
"50939ecdc645332d6d6d2daa4ab974cf6816d17793584110983d5abf51fe527b"
 
 [metadata.files]
-appdirs = [
-    {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = 
"sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
-    {file = "appdirs-1.4.4.tar.gz", hash = 
"sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
-]
 atomicwrites = [
     {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = 
"sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
     {file = "atomicwrites-1.4.0.tar.gz", hash = 
"sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
 ]
 attrs = [
-    {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = 
"sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"},
-    {file = "attrs-20.3.0.tar.gz", hash = 
"sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"},
+    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = 
"sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
+    {file = "attrs-21.2.0.tar.gz", hash = 
"sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
+]
+"backports.entry-points-selectable" = [
+    {file = "backports.entry_points_selectable-1.1.0-py2.py3-none-any.whl", 
hash = 
"sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc"},
+    {file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = 
"sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"},
 ]
 colorama = [
     {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = 
"sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
@@ -335,32 +357,36 @@
     {file = "coverage-5.5.tar.gz", hash = 
"sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
 ]
 distlib = [
-    {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = 
"sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"},
-    {file = "distlib-0.3.1.zip", hash = 
"sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"},
+    {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = 
"sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"},
+    {file = "distlib-0.3.2.zip", hash = 
"sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"},
 ]
 filelock = [
     {file = "filelock-3.0.12-py3-none-any.whl", hash = 
"sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"},
     {file = "filelock-3.0.12.tar.gz", hash = 
"sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"},
 ]
 importlib-metadata = [
-    {file = "importlib_metadata-3.10.0-py3-none-any.whl", hash = 
"sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe"},
-    {file = "importlib_metadata-3.10.0.tar.gz", hash = 
"sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a"},
+    {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = 
"sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"},
+    {file = "importlib_metadata-4.8.1.tar.gz", hash = 
"sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"},
 ]
 importlib-resources = [
-    {file = "importlib_resources-5.1.2-py3-none-any.whl", hash = 
"sha256:ebab3efe74d83b04d6bf5cd9a17f0c5c93e60fb60f30c90f56265fce4682a469"},
-    {file = "importlib_resources-5.1.2.tar.gz", hash = 
"sha256:642586fc4740bd1cad7690f836b3321309402b20b332529f25617ff18e8e1370"},
+    {file = "importlib_resources-5.2.2-py3-none-any.whl", hash = 
"sha256:2480d8e07d1890056cb53c96e3de44fead9c62f2ba949b0f2e4c4345f4afa977"},
+    {file = "importlib_resources-5.2.2.tar.gz", hash = 
"sha256:a65882a4d0fe5fbf702273456ba2ce74fe44892c25e42e057aca526b702a6d4b"},
 ]
 iniconfig = [
     {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = 
"sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
     {file = "iniconfig-1.1.1.tar.gz", hash = 
"sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
 ]
 packaging = [
-    {file = "packaging-20.9-py2.py3-none-any.whl", hash = 
"sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
-    {file = "packaging-20.9.tar.gz", hash = 
"sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
+    {file = "packaging-21.0-py3-none-any.whl", hash = 
"sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
+    {file = "packaging-21.0.tar.gz", hash = 
"sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
+]
+platformdirs = [
+    {file = "platformdirs-2.3.0-py3-none-any.whl", hash = 
"sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"},
+    {file = "platformdirs-2.3.0.tar.gz", hash = 
"sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"},
 ]
 pluggy = [
-    {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = 
"sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
-    {file = "pluggy-0.13.1.tar.gz", hash = 
"sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
+    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = 
"sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
+    {file = "pluggy-1.0.0.tar.gz", hash = 
"sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
 ]
 py = [
     {file = "py-1.10.0-py2.py3-none-any.whl", hash = 
"sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
@@ -371,35 +397,35 @@
     {file = "pyparsing-2.4.7.tar.gz", hash = 
"sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
 ]
 pytest = [
-    {file = "pytest-6.2.2-py3-none-any.whl", hash = 
"sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"},
-    {file = "pytest-6.2.2.tar.gz", hash = 
"sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"},
+    {file = "pytest-6.2.5-py3-none-any.whl", hash = 
"sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
+    {file = "pytest-6.2.5.tar.gz", hash = 
"sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
 ]
 pytest-asyncio = [
-    {file = "pytest-asyncio-0.14.0.tar.gz", hash = 
"sha256:9882c0c6b24429449f5f969a5158b528f39bde47dc32e85b9f0403965017e700"},
-    {file = "pytest_asyncio-0.14.0-py3-none-any.whl", hash = 
"sha256:2eae1e34f6c68fc0a9dc12d4bea190483843ff4708d24277c41568d6b6044f1d"},
+    {file = "pytest-asyncio-0.15.1.tar.gz", hash = 
"sha256:2564ceb9612bbd560d19ca4b41347b54e7835c2f792c504f698e05395ed63f6f"},
+    {file = "pytest_asyncio-0.15.1-py3-none-any.whl", hash = 
"sha256:3042bcdf1c5d978f6b74d96a151c4cfb9dcece65006198389ccd7e6c60eb1eea"},
 ]
 six = [
-    {file = "six-1.15.0-py2.py3-none-any.whl", hash = 
"sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
-    {file = "six-1.15.0.tar.gz", hash = 
"sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = 
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = 
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
 ]
 toml = [
     {file = "toml-0.10.2-py2.py3-none-any.whl", hash = 
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
     {file = "toml-0.10.2.tar.gz", hash = 
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
 ]
 tox = [
-    {file = "tox-3.23.0-py2.py3-none-any.whl", hash = 
"sha256:e007673f3595cede9b17a7c4962389e4305d4a3682a6c5a4159a1453b4f326aa"},
-    {file = "tox-3.23.0.tar.gz", hash = 
"sha256:05a4dbd5e4d3d8269b72b55600f0b0303e2eb47ad5c6fe76d3576f4c58d93661"},
+    {file = "tox-3.24.4-py2.py3-none-any.whl", hash = 
"sha256:5e274227a53dc9ef856767c21867377ba395992549f02ce55eb549f9fb9a8d10"},
+    {file = "tox-3.24.4.tar.gz", hash = 
"sha256:c30b57fa2477f1fb7c36aa1d83292d5c2336cd0018119e1b1c17340e2c2708ca"},
 ]
 typing-extensions = [
-    {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = 
"sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"},
-    {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = 
"sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"},
-    {file = "typing_extensions-3.7.4.3.tar.gz", hash = 
"sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"},
+    {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = 
"sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
+    {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = 
"sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
+    {file = "typing_extensions-3.10.0.2.tar.gz", hash = 
"sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
 ]
 virtualenv = [
-    {file = "virtualenv-20.4.3-py2.py3-none-any.whl", hash = 
"sha256:83f95875d382c7abafe06bd2a4cdd1b363e1bb77e02f155ebe8ac082a916b37c"},
-    {file = "virtualenv-20.4.3.tar.gz", hash = 
"sha256:49ec4eb4c224c6f7dd81bb6d0a28a09ecae5894f4e593c89b0db0885f565a107"},
+    {file = "virtualenv-20.8.0-py2.py3-none-any.whl", hash = 
"sha256:a4b987ec31c3c9996cf1bc865332f967fe4a0512c41b39652d6224f696e69da5"},
+    {file = "virtualenv-20.8.0.tar.gz", hash = 
"sha256:4da4ac43888e97de9cf4fdd870f48ed864bbfd133d2c46cbdec941fed4a25aef"},
 ]
 zipp = [
-    {file = "zipp-3.4.1-py3-none-any.whl", hash = 
"sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
-    {file = "zipp-3.4.1.tar.gz", hash = 
"sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
+    {file = "zipp-3.5.0-py3-none-any.whl", hash = 
"sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"},
+    {file = "zipp-3.5.0.tar.gz", hash = 
"sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"},
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/pyproject.toml 
new/aiofiles-0.8.0/pyproject.toml
--- old/aiofiles-0.7.0/pyproject.toml   2021-05-17 01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/pyproject.toml   2021-11-27 16:05:37.000000000 +0100
@@ -1,9 +1,9 @@
 [tool.poetry]
 name = "aiofiles"
-version = "0.7.0"
+version = "0.8.0"
 description = "File support for asyncio."
 authors = ["Tin Tvrtkovic <[email protected]>"]
-license = "Apache 2.0"
+license = "Apache-2.0"
 readme = "README.rst"
 
 [tool.poetry.dependencies]
@@ -11,7 +11,7 @@
 
 [tool.poetry.dev-dependencies]
 pytest = "^6.2.2"
-pytest-asyncio = "^0.14.0"
+pytest-asyncio = "^0.15.1"
 coverage = "^5.5"
 tox = "^3.23.0"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/base.py 
new/aiofiles-0.8.0/src/aiofiles/base.py
--- old/aiofiles-0.7.0/src/aiofiles/base.py     2021-05-17 01:15:45.000000000 
+0200
+++ new/aiofiles-0.8.0/src/aiofiles/base.py     2021-11-27 16:05:37.000000000 
+0100
@@ -13,6 +13,9 @@
         """We are our own iterator."""
         return self
 
+    def __repr__(self):
+        return super().__repr__() + " wrapping " + repr(self._file)
+
     async def __anext__(self):
         """Simulate normal file iteration."""
         line = await self.readline()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/os.py 
new/aiofiles-0.8.0/src/aiofiles/os.py
--- old/aiofiles-0.7.0/src/aiofiles/os.py       2021-05-17 01:15:45.000000000 
+0200
+++ new/aiofiles-0.8.0/src/aiofiles/os.py       2021-11-27 16:05:37.000000000 
+0100
@@ -15,11 +15,17 @@
     return run
 
 
+from . import ospath as path
+
+
 stat = wrap(os.stat)
 rename = wrap(os.rename)
+replace = wrap(os.replace)
 remove = wrap(os.remove)
 mkdir = wrap(os.mkdir)
+makedirs = wrap(os.makedirs)
 rmdir = wrap(os.rmdir)
+removedirs = wrap(os.removedirs)
 
 if hasattr(os, "sendfile"):
     sendfile = wrap(os.sendfile)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/ospath.py 
new/aiofiles-0.8.0/src/aiofiles/ospath.py
--- old/aiofiles-0.7.0/src/aiofiles/ospath.py   1970-01-01 01:00:00.000000000 
+0100
+++ new/aiofiles-0.8.0/src/aiofiles/ospath.py   2021-11-27 16:05:37.000000000 
+0100
@@ -0,0 +1,14 @@
+"""Async executor versions of file functions from the os.path module."""
+
+from .os import wrap
+from os import path
+
+exists = wrap(path.exists)
+isfile = wrap(path.isfile)
+isdir = wrap(path.isdir)
+getsize = wrap(path.getsize)
+getmtime = wrap(path.getmtime)
+getatime = wrap(path.getatime)
+getctime = wrap(path.getctime)
+samefile = wrap(path.samefile)
+sameopenfile = wrap(path.sameopenfile)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/tempfile/__init__.py 
new/aiofiles-0.8.0/src/aiofiles/tempfile/__init__.py
--- old/aiofiles-0.7.0/src/aiofiles/tempfile/__init__.py        2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/src/aiofiles/tempfile/__init__.py        2021-11-27 
16:05:37.000000000 +0100
@@ -1,84 +1,171 @@
 # Imports
 import asyncio
-from tempfile import (TemporaryFile as syncTemporaryFile,
-                      NamedTemporaryFile as syncNamedTemporaryFile,
-                      SpooledTemporaryFile as syncSpooledTemporaryFile,
-                      TemporaryDirectory as syncTemporaryDirectory,
-                      _TemporaryFileWrapper as syncTemporaryFileWrapper)
-from io import (FileIO, TextIOBase, BufferedReader, BufferedWriter,
-                BufferedRandom)
+from tempfile import (
+    TemporaryFile as syncTemporaryFile,
+    NamedTemporaryFile as syncNamedTemporaryFile,
+    SpooledTemporaryFile as syncSpooledTemporaryFile,
+    TemporaryDirectory as syncTemporaryDirectory,
+    _TemporaryFileWrapper as syncTemporaryFileWrapper,
+)
+from io import FileIO, TextIOBase, BufferedReader, BufferedWriter, 
BufferedRandom
 from functools import partial, singledispatch
 from ..base import AiofilesContextManager
 from ..threadpool.text import AsyncTextIOWrapper
-from ..threadpool.binary import (AsyncBufferedIOBase, AsyncBufferedReader,
-                                 AsyncFileIO)
-from .temptypes import (AsyncSpooledTemporaryFile, AsyncTemporaryDirectory)
+from ..threadpool.binary import AsyncBufferedIOBase, AsyncBufferedReader, 
AsyncFileIO
+from .temptypes import AsyncSpooledTemporaryFile, AsyncTemporaryDirectory
 
-__all__ = ['NamedTemporaryFile', 'TemporaryFile', 'SpooledTemporaryFile',
-           'TemporaryDirectory']
+__all__ = [
+    "NamedTemporaryFile",
+    "TemporaryFile",
+    "SpooledTemporaryFile",
+    "TemporaryDirectory",
+]
 
 
 # ================================================================
 # Public methods for async open and return of temp file/directory
 # objects with async interface
 # ================================================================
-def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None,
-                       suffix=None, prefix=None, dir=None, delete=True,
-                       loop=None, executor=None):
+def NamedTemporaryFile(
+    mode="w+b",
+    buffering=-1,
+    encoding=None,
+    newline=None,
+    suffix=None,
+    prefix=None,
+    dir=None,
+    delete=True,
+    loop=None,
+    executor=None,
+):
     """Async open a named temporary file"""
     return AiofilesContextManager(
-        _temporary_file(named=True, mode=mode, buffering=buffering,
-                        encoding=encoding, newline=newline, suffix=suffix,
-                        prefix=prefix, dir=dir, delete=delete, loop=loop,
-                        executor=executor))
-
-
-def TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None,
-                  suffix=None, prefix=None, dir=None, loop=None,
-                  executor=None):
+        _temporary_file(
+            named=True,
+            mode=mode,
+            buffering=buffering,
+            encoding=encoding,
+            newline=newline,
+            suffix=suffix,
+            prefix=prefix,
+            dir=dir,
+            delete=delete,
+            loop=loop,
+            executor=executor,
+        )
+    )
+
+
+def TemporaryFile(
+    mode="w+b",
+    buffering=-1,
+    encoding=None,
+    newline=None,
+    suffix=None,
+    prefix=None,
+    dir=None,
+    loop=None,
+    executor=None,
+):
     """Async open an unnamed temporary file"""
     return AiofilesContextManager(
-        _temporary_file(named=False, mode=mode, buffering=buffering,
-                        encoding=encoding, newline=newline, suffix=suffix,
-                        prefix=prefix, dir=dir, loop=loop, executor=executor))
-
-
-def SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None,
-                         newline=None, suffix=None, prefix=None, dir=None,
-                         loop=None, executor=None):
+        _temporary_file(
+            named=False,
+            mode=mode,
+            buffering=buffering,
+            encoding=encoding,
+            newline=newline,
+            suffix=suffix,
+            prefix=prefix,
+            dir=dir,
+            loop=loop,
+            executor=executor,
+        )
+    )
+
+
+def SpooledTemporaryFile(
+    max_size=0,
+    mode="w+b",
+    buffering=-1,
+    encoding=None,
+    newline=None,
+    suffix=None,
+    prefix=None,
+    dir=None,
+    loop=None,
+    executor=None,
+):
     """Async open a spooled temporary file"""
     return AiofilesContextManager(
-        _spooled_temporary_file(max_size=max_size, mode=mode,
-                                buffering=buffering, encoding=encoding,
-                                newline=newline, suffix=suffix, prefix=prefix,
-                                dir=dir, loop=loop, executor=executor))
+        _spooled_temporary_file(
+            max_size=max_size,
+            mode=mode,
+            buffering=buffering,
+            encoding=encoding,
+            newline=newline,
+            suffix=suffix,
+            prefix=prefix,
+            dir=dir,
+            loop=loop,
+            executor=executor,
+        )
+    )
 
 
-def TemporaryDirectory(loop=None, executor=None):
+def TemporaryDirectory(suffix=None, prefix=None, dir=None, loop=None, 
executor=None):
     """Async open a temporary directory"""
-    return AiofilesContextManagerTempDir(_temporary_directory(loop=loop,
-                                                       executor=executor))
+    return AiofilesContextManagerTempDir(
+        _temporary_directory(
+            suffix=suffix, prefix=prefix, dir=dir, loop=loop, executor=executor
+        )
+    )
 
 
 # =========================================================
 # Internal coroutines to open new temp files/directories
 # =========================================================
-async def _temporary_file(named=True, mode='w+b', buffering=-1,
-                    encoding=None, newline=None, suffix=None, prefix=None,
-                    dir=None, delete=True, loop=None, executor=None,
-                    max_size=0):
+async def _temporary_file(
+    named=True,
+    mode="w+b",
+    buffering=-1,
+    encoding=None,
+    newline=None,
+    suffix=None,
+    prefix=None,
+    dir=None,
+    delete=True,
+    loop=None,
+    executor=None,
+    max_size=0,
+):
     """Async method to open a temporary file with async interface"""
     if loop is None:
         loop = asyncio.get_event_loop()
 
     if named:
-        cb = partial(syncNamedTemporaryFile, mode=mode, buffering=buffering,
-                     encoding=encoding, newline=newline, suffix=suffix,
-                     prefix=prefix, dir=dir, delete=delete)
+        cb = partial(
+            syncNamedTemporaryFile,
+            mode=mode,
+            buffering=buffering,
+            encoding=encoding,
+            newline=newline,
+            suffix=suffix,
+            prefix=prefix,
+            dir=dir,
+            delete=delete,
+        )
     else:
-        cb = partial(syncTemporaryFile, mode=mode, buffering=buffering,
-                     encoding=encoding, newline=newline, suffix=suffix,
-                     prefix=prefix, dir=dir)
+        cb = partial(
+            syncTemporaryFile,
+            mode=mode,
+            buffering=buffering,
+            encoding=encoding,
+            newline=newline,
+            suffix=suffix,
+            prefix=prefix,
+            dir=dir,
+        )
 
     f = await loop.run_in_executor(executor, cb)
 
@@ -94,17 +181,33 @@
         return wrap(f, f, loop=loop, executor=executor)
 
 
-async def _spooled_temporary_file(max_size=0, mode='w+b', buffering=-1,
-                            encoding=None, newline=None, suffix=None,
-                            prefix=None, dir=None, loop=None, executor=None):
+async def _spooled_temporary_file(
+    max_size=0,
+    mode="w+b",
+    buffering=-1,
+    encoding=None,
+    newline=None,
+    suffix=None,
+    prefix=None,
+    dir=None,
+    loop=None,
+    executor=None,
+):
     """Open a spooled temporary file with async interface"""
     if loop is None:
         loop = asyncio.get_event_loop()
 
-    cb = partial(syncSpooledTemporaryFile, max_size=max_size, mode=mode,
-                 buffering=buffering, encoding=encoding,
-                 newline=newline, suffix=suffix,
-                 prefix=prefix, dir=dir)
+    cb = partial(
+        syncSpooledTemporaryFile,
+        max_size=max_size,
+        mode=mode,
+        buffering=buffering,
+        encoding=encoding,
+        newline=newline,
+        suffix=suffix,
+        prefix=prefix,
+        dir=dir,
+    )
 
     f = await loop.run_in_executor(executor, cb)
 
@@ -112,18 +215,22 @@
     return AsyncSpooledTemporaryFile(f, loop=loop, executor=executor)
 
 
-async def _temporary_directory(loop=None, executor=None):
+async def _temporary_directory(
+    suffix=None, prefix=None, dir=None, loop=None, executor=None
+):
     """Async method to open a temporary directory with async interface"""
     if loop is None:
         loop = asyncio.get_event_loop()
 
-    f = await loop.run_in_executor(executor, syncTemporaryDirectory)
+    cb = partial(syncTemporaryDirectory, suffix, prefix, dir)
+    f = await loop.run_in_executor(executor, cb)
 
     return AsyncTemporaryDirectory(f, loop=loop, executor=executor)
 
 
 class AiofilesContextManagerTempDir(AiofilesContextManager):
     """With returns the directory location, not the object (matching sync 
lib)"""
+
     async def __aenter__(self):
         self._obj = await self._coro
         return self._obj.name
@@ -132,7 +239,7 @@
 @singledispatch
 def wrap(base_io_obj, file, *, loop=None, executor=None):
     """Wrap the object with interface based on type of underlying IO"""
-    raise TypeError('Unsupported IO type: {}'.format(base_io_obj))
+    raise TypeError("Unsupported IO type: {}".format(base_io_obj))
 
 
 @wrap.register(TextIOBase)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/tempfile/temptypes.py 
new/aiofiles-0.8.0/src/aiofiles/tempfile/temptypes.py
--- old/aiofiles-0.7.0/src/aiofiles/tempfile/temptypes.py       2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/src/aiofiles/tempfile/temptypes.py       2021-11-27 
16:05:37.000000000 +0100
@@ -5,21 +5,34 @@
 from types import coroutine
 
 from ..base import AsyncBase
-from ..threadpool.utils import (delegate_to_executor, proxy_property_directly,
-                                cond_delegate_to_executor)
+from ..threadpool.utils import (
+    delegate_to_executor,
+    proxy_property_directly,
+    cond_delegate_to_executor,
+)
 from functools import partial
 
 
-@delegate_to_executor('fileno', 'rollover')
-@cond_delegate_to_executor('close', 'flush', 'isatty', 'newlines', 'read',
-                           'readline', 'readlines', 'seek', 'tell',
-                           'truncate')
-@proxy_property_directly('closed', 'encoding', 'mode', 'name', 'softspace')
+@delegate_to_executor("fileno", "rollover")
+@cond_delegate_to_executor(
+    "close",
+    "flush",
+    "isatty",
+    "newlines",
+    "read",
+    "readline",
+    "readlines",
+    "seek",
+    "tell",
+    "truncate",
+)
+@proxy_property_directly("closed", "encoding", "mode", "name", "softspace")
 class AsyncSpooledTemporaryFile(AsyncBase):
     """Async wrapper for SpooledTemporaryFile class"""
 
     async def _check(self):
-        if self._file._rolled: return
+        if self._file._rolled:
+            return
         max_size = self._file._max_size
         if max_size and self._file.tell() > max_size:
             await self.rollover()
@@ -28,9 +41,9 @@
         """Implementation to anticipate rollover"""
         if self._file._rolled:
             cb = partial(self._file.write, s)
-            return (await self._loop.run_in_executor(self._executor, cb))
+            return await self._loop.run_in_executor(self._executor, cb)
         else:
-            file = self._file._file #reference underlying base IO object
+            file = self._file._file  # reference underlying base IO object
             rv = file.write(s)
             await self._check()
             return rv
@@ -39,16 +52,16 @@
         """Implementation to anticipate rollover"""
         if self._file._rolled:
             cb = partial(self._file.writelines, iterable)
-            return (await self._loop.run_in_executor(self._executor, cb))
+            return await self._loop.run_in_executor(self._executor, cb)
         else:
-            file = self._file._file #reference underlying base IO object
+            file = self._file._file  # reference underlying base IO object
             rv = file.writelines(iterable)
             await self._check()
             return rv
 
 
-@delegate_to_executor('cleanup')
-@proxy_property_directly('name')
+@delegate_to_executor("cleanup")
+@proxy_property_directly("name")
 class AsyncTemporaryDirectory:
     """Async wrapper for TemporaryDirectory class"""
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/threadpool/text.py 
new/aiofiles-0.8.0/src/aiofiles/threadpool/text.py
--- old/aiofiles-0.7.0/src/aiofiles/threadpool/text.py  2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/src/aiofiles/threadpool/text.py  2021-11-27 
16:05:37.000000000 +0100
@@ -24,7 +24,14 @@
 )
 @proxy_method_directly("detach", "fileno", "readable")
 @proxy_property_directly(
-    "buffer", "closed", "encoding", "errors", "line_buffering", "newlines", 
"name", "mode"
+    "buffer",
+    "closed",
+    "encoding",
+    "errors",
+    "line_buffering",
+    "newlines",
+    "name",
+    "mode",
 )
 class AsyncTextIOWrapper(AsyncBase):
     """The asyncio executor version of io.TextIOWrapper."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/src/aiofiles/threadpool/utils.py 
new/aiofiles-0.8.0/src/aiofiles/threadpool/utils.py
--- old/aiofiles-0.7.0/src/aiofiles/threadpool/utils.py 2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/src/aiofiles/threadpool/utils.py 2021-11-27 
16:05:37.000000000 +0100
@@ -34,6 +34,7 @@
         for attr_name in attrs:
             setattr(cls, attr_name, _make_cond_delegate_method(attr_name))
         return cls
+
     return cls_builder
 
 
@@ -62,11 +63,12 @@
 
 def _make_cond_delegate_method(attr_name):
     """For spooled temp files, delegate only if rolled to file object"""
+
     async def method(self, *args, **kwargs):
         if self._file._rolled:
-            cb = functools.partial(getattr(self._file, attr_name),
-                                   *args, **kwargs)
-            return (await self._loop.run_in_executor(self._executor, cb))
+            cb = functools.partial(getattr(self._file, attr_name), *args, 
**kwargs)
+            return await self._loop.run_in_executor(self._executor, cb)
         else:
             return getattr(self._file, attr_name)(*args, **kwargs)
+
     return method
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/tests/test_os.py 
new/aiofiles-0.8.0/tests/test_os.py
--- old/aiofiles-0.7.0/tests/test_os.py 2021-05-17 01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/tests/test_os.py 2021-11-27 16:05:37.000000000 +0100
@@ -49,10 +49,35 @@
     assert exists(old_filename) and exists(new_filename) is False
 
 
[email protected]
+async def test_replace():
+    """Test the replace call."""
+    old_filename = join(dirname(__file__), "resources", "test_file1.txt")
+    new_filename = join(dirname(__file__), "resources", "test_file2.txt")
+
+    await aiofiles.os.replace(old_filename, new_filename)
+    assert exists(old_filename) is False and exists(new_filename)
+    await aiofiles.os.replace(new_filename, old_filename)
+    assert exists(old_filename) and exists(new_filename) is False
+
+    with open(new_filename, "w") as f:
+        f.write("Test file")
+    assert exists(old_filename) and exists(new_filename)
+
+    await aiofiles.os.replace(old_filename, new_filename)
+    assert exists(old_filename) is False and exists(new_filename)
+    await aiofiles.os.replace(new_filename, old_filename)
+    assert exists(old_filename) and exists(new_filename) is False
+
+
 @pytest.mark.skipif(
     "2.4" < platform.release() < "2.6.33",
     reason="sendfile() syscall doesn't allow file->file",
 )
[email protected](
+    platform.system() == "Darwin",
+    reason="sendfile() doesn't work on mac",
+)
 @pytest.mark.asyncio
 async def test_sendfile_file(tmpdir):
     """Test the sendfile functionality, file-to-file."""
@@ -103,9 +128,7 @@
 
     server = await asyncio.start_server(serve_file, port=unused_tcp_port)
 
-    reader, writer = await asyncio.open_connection(
-        "127.0.0.1", unused_tcp_port
-    )
+    reader, writer = await asyncio.open_connection("127.0.0.1", 
unused_tcp_port)
     actual_contents = await reader.read()
     writer.close()
 
@@ -113,3 +136,75 @@
     server.close()
 
     await server.wait_closed()
+
+
[email protected]
+async def test_exists():
+    """Test path.exists call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.exists(filename)
+    assert result
+
+
[email protected]
+async def test_isfile():
+    """Test path.isfile call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.isfile(filename)
+    assert result
+
+
[email protected]
+async def test_isdir():
+    """Test path.isdir call."""
+    filename = join(dirname(__file__), "resources")
+    result = await aiofiles.os.path.isdir(filename)
+    assert result
+
+
[email protected]
+async def test_getsize():
+    """Test path.getsize call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.getsize(filename)
+    assert result == 10
+
+
[email protected]
+async def test_samefile():
+    """Test path.samefile call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.samefile(filename, filename)
+    assert result
+
+
[email protected]
+async def test_sameopenfile():
+    """Test path.samefile call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.samefile(filename, filename)
+    assert result
+
+
[email protected]
+async def test_getmtime():
+    """Test path.getmtime call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.getmtime(filename)
+    assert result
+
+
[email protected]
+async def test_getatime():
+    """Test path.getatime call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.getatime(filename)
+    assert result
+
+
[email protected]
+async def test_getctime():
+    """Test path. call."""
+    filename = join(dirname(__file__), "resources", "test_file1.txt")
+    result = await aiofiles.os.path.getctime(filename)
+    assert result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/tests/test_tempfile.py 
new/aiofiles-0.8.0/tests/test_tempfile.py
--- old/aiofiles-0.7.0/tests/test_tempfile.py   2021-05-17 01:15:45.000000000 
+0200
+++ new/aiofiles-0.8.0/tests/test_tempfile.py   2021-11-27 16:05:37.000000000 
+0100
@@ -9,24 +9,24 @@
 @pytest.mark.parametrize("mode", ["r+", "w+", "rb+", "wb+"])
 async def test_temporary_file(mode):
     """Test temporary file."""
-    data = b'Hello World!\n' if 'b' in mode else 'Hello World!\n' 
+    data = b"Hello World!\n" if "b" in mode else "Hello World!\n"
 
     async with tempfile.TemporaryFile(mode=mode) as f:
         for i in range(3):
-            await f.write(data) 
+            await f.write(data)
 
         await f.flush()
         await f.seek(0)
 
         async for line in f:
             assert line == data
-        
+
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("mode", ["r+", "w+", "rb+", "wb+"])
 async def test_named_temporary_file(mode):
     """Test named temporary file."""
-    data = b'Hello World!' if 'b' in mode else 'Hello World!' 
+    data = b"Hello World!" if "b" in mode else "Hello World!"
     filename = None
 
     async with tempfile.NamedTemporaryFile(mode=mode) as f:
@@ -42,22 +42,22 @@
 
     assert not os.path.exists(filename)
 
-        
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize("mode", ["r+", "w+", "rb+", "wb+"])
 async def test_spooled_temporary_file(mode):
     """Test spooled temporary file."""
-    data = b'Hello World!' if 'b' in mode else 'Hello World!' 
+    data = b"Hello World!" if "b" in mode else "Hello World!"
 
-    async with tempfile.SpooledTemporaryFile(max_size=len(data)+1, mode=mode) 
as f:
+    async with tempfile.SpooledTemporaryFile(max_size=len(data) + 1, 
mode=mode) as f:
         await f.write(data)
         await f.flush()
-        if 'b' in mode:
+        if "b" in mode:
             assert type(f._file._file) is io.BytesIO
 
         await f.write(data)
         await f.flush()
-        if 'b' in mode:
+        if "b" in mode:
             assert type(f._file._file) is not io.BytesIO
 
         await f.seek(0)
@@ -65,13 +65,17 @@
 
 
 @pytest.mark.asyncio
-async def test_temporary_directory():
[email protected]("prefix, suffix", [("a", "b"), ("c", "d"), ("e", 
"f")])
+async def test_temporary_directory(prefix, suffix, tmp_path):
     """Test temporary directory."""
     dir_path = None
 
-    async with tempfile.TemporaryDirectory() as d:
+    async with tempfile.TemporaryDirectory(
+        suffix=suffix, prefix=prefix, dir=tmp_path
+    ) as d:
         dir_path = d
         assert os.path.exists(dir_path)
         assert os.path.isdir(dir_path)
-
+        assert d[-1] == suffix
+        assert d.split(os.sep)[-1][0] == prefix
     assert not os.path.exists(dir_path)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/tests/threadpool/test_concurrency.py 
new/aiofiles-0.8.0/tests/threadpool/test_concurrency.py
--- old/aiofiles-0.7.0/tests/threadpool/test_concurrency.py     2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/tests/threadpool/test_concurrency.py     2021-11-27 
16:05:37.000000000 +0100
@@ -57,9 +57,7 @@
 
     spam_task = asyncio.ensure_future(spam_client())
 
-    reader, writer = await asyncio.open_connection(
-        "127.0.0.1", port=unused_tcp_port
-    )
+    reader, writer = await asyncio.open_connection("127.0.0.1", 
port=unused_tcp_port)
 
     actual_contents = await reader.read()
     writer.close()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/tests/threadpool/test_text.py 
new/aiofiles-0.8.0/tests/threadpool/test_text.py
--- old/aiofiles-0.7.0/tests/threadpool/test_text.py    2021-05-17 
01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/tests/threadpool/test_text.py    2021-11-27 
16:05:37.000000000 +0100
@@ -6,10 +6,10 @@
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_simple_iteration(mode):
     """Test iterating over lines from a file."""
-    filename = join(dirname(__file__), '..', 'resources', 'multiline_file.txt')
+    filename = join(dirname(__file__), "..", "resources", "multiline_file.txt")
 
     async with aioopen(filename, mode=mode) as file:
         # Append mode needs us to seek.
@@ -22,7 +22,7 @@
             line = await file.readline()
             if not line:
                 break
-            assert line.strip() == 'line ' + str(counter)
+            assert line.strip() == "line " + str(counter)
             counter += 1
 
         await file.seek(0)
@@ -30,19 +30,19 @@
 
         # The new iteration pattern:
         async for line in file:
-            assert line.strip() == 'line ' + str(counter)
+            assert line.strip() == "line " + str(counter)
             counter += 1
 
     assert file.closed
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_simple_readlines(mode):
     """Test the readlines functionality."""
-    filename = join(dirname(__file__), '..', 'resources', 'multiline_file.txt')
+    filename = join(dirname(__file__), "..", "resources", "multiline_file.txt")
 
-    with open(filename, mode='r') as f:
+    with open(filename, mode="r") as f:
         expected = f.readlines()
 
     async with aioopen(filename, mode=mode) as file:
@@ -57,50 +57,50 @@
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r+', 'w', 'a'])
[email protected]("mode", ["r+", "w", "a"])
 async def test_simple_flush(mode, tmpdir):
     """Test flushing to a file."""
-    filename = 'file.bin'
+    filename = "file.bin"
 
     full_file = tmpdir.join(filename)
 
-    if 'r' in mode:
+    if "r" in mode:
         full_file.ensure()  # Read modes want it to already exist.
 
     async with aioopen(str(full_file), mode=mode) as file:
-        await file.write('0')  # Shouldn't flush.
+        await file.write("0")  # Shouldn't flush.
 
-        assert '' == full_file.read_text(encoding='utf8')
+        assert "" == full_file.read_text(encoding="utf8")
 
         await file.flush()
 
-        assert '0' == full_file.read_text(encoding='utf8')
+        assert "0" == full_file.read_text(encoding="utf8")
 
     assert file.closed
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_simple_read(mode):
     """Just read some bytes from a test file."""
-    filename = join(dirname(__file__), '..', 'resources', 'test_file1.txt')
+    filename = join(dirname(__file__), "..", "resources", "test_file1.txt")
     async with aioopen(filename, mode=mode) as file:
         await file.seek(0)  # Needed for the append mode.
 
         actual = await file.read()
 
-        assert '' == (await file.read())
-    assert actual == open(filename, mode='r').read()
+        assert "" == (await file.read())
+    assert actual == open(filename, mode="r").read()
 
     assert file.closed
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['w', 'a'])
[email protected]("mode", ["w", "a"])
 async def test_simple_read_fail(mode, tmpdir):
     """Try reading some bytes and fail."""
-    filename = 'bigfile.bin'
-    content = '0123456789' * 4 * io.DEFAULT_BUFFER_SIZE
+    filename = "bigfile.bin"
+    content = "0123456789" * 4 * io.DEFAULT_BUFFER_SIZE
 
     full_file = tmpdir.join(filename)
     full_file.write(content)
@@ -114,10 +114,10 @@
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_staggered_read(mode):
     """Read bytes repeatedly."""
-    filename = join(dirname(__file__), '..', 'resources', 'test_file1.txt')
+    filename = join(dirname(__file__), "..", "resources", "test_file1.txt")
     async with aioopen(filename, mode=mode) as file:
         await file.seek(0)  # Needed for the append mode.
 
@@ -129,10 +129,10 @@
             else:
                 break
 
-        assert '' == (await file.read())
+        assert "" == (await file.read())
 
     expected = []
-    with open(filename, mode='r') as f:
+    with open(filename, mode="r") as f:
         while True:
             char = f.read(1)
             if char:
@@ -146,28 +146,28 @@
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_simple_seek(mode, tmpdir):
     """Test seeking and then reading."""
-    filename = 'bigfile.bin'
-    content = '0123456789' * 4 * io.DEFAULT_BUFFER_SIZE
+    filename = "bigfile.bin"
+    content = "0123456789" * 4 * io.DEFAULT_BUFFER_SIZE
 
     full_file = tmpdir.join(filename)
     full_file.write(content)
 
     async with aioopen(str(full_file), mode=mode) as file:
         await file.seek(4)
-        assert '4' == (await file.read(1))
+        assert "4" == (await file.read(1))
 
     assert file.closed
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['w', 'r', 'r+', 'w+', 'a', 'a+'])
[email protected]("mode", ["w", "r", "r+", "w+", "a", "a+"])
 async def test_simple_close(mode, tmpdir):
     """Open a file, read a byte, and close it."""
-    filename = 'bigfile.bin'
-    content = '0' * 4 * io.DEFAULT_BUFFER_SIZE
+    filename = "bigfile.bin"
+    content = "0" * 4 * io.DEFAULT_BUFFER_SIZE
 
     full_file = tmpdir.join(filename)
     full_file.write(content)
@@ -181,11 +181,11 @@
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r+', 'w', 'a+'])
[email protected]("mode", ["r+", "w", "a+"])
 async def test_simple_truncate(mode, tmpdir):
     """Test truncating files."""
-    filename = 'bigfile.bin'
-    content = '0123456789' * 4 * io.DEFAULT_BUFFER_SIZE
+    filename = "bigfile.bin"
+    content = "0123456789" * 4 * io.DEFAULT_BUFFER_SIZE
 
     full_file = tmpdir.join(filename)
     full_file.write(content)
@@ -194,7 +194,7 @@
         # The append modes want us to seek first.
         await file.seek(0)
 
-        if 'w' in mode:
+        if "w" in mode:
             # We've just erased the entire file.
             await file.write(content)
             await file.flush()
@@ -202,19 +202,19 @@
 
         await file.truncate()
 
-    assert '' == full_file.read()
+    assert "" == full_file.read()
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['w', 'r+', 'w+', 'a', 'a+'])
[email protected]("mode", ["w", "r+", "w+", "a", "a+"])
 async def test_simple_write(mode, tmpdir):
     """Test writing into a file."""
-    filename = 'bigfile.bin'
-    content = '0' * 4 * io.DEFAULT_BUFFER_SIZE
+    filename = "bigfile.bin"
+    content = "0" * 4 * io.DEFAULT_BUFFER_SIZE
 
     full_file = tmpdir.join(filename)
 
-    if 'r' in mode:
+    if "r" in mode:
         full_file.ensure()  # Read modes want it to already exist.
 
     async with aioopen(str(full_file), mode=mode) as file:
@@ -228,13 +228,13 @@
 @pytest.mark.asyncio
 async def test_simple_detach(tmpdir):
     """Test detaching for buffered streams."""
-    filename = 'file.bin'
+    filename = "file.bin"
 
     full_file = tmpdir.join(filename)
-    full_file.write('0123456789')
+    full_file.write("0123456789")
 
     with pytest.raises(ValueError):  # Close will error out.
-        async with aioopen(str(full_file), mode='r') as file:
+        async with aioopen(str(full_file), mode="r") as file:
             raw_file = file.detach()
 
             assert raw_file
@@ -242,14 +242,14 @@
             with pytest.raises(ValueError):
                 await file.read()
 
-            assert b'0123456789' == raw_file.read(10)
+            assert b"0123456789" == raw_file.read(10)
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_simple_iteration_ctx_mgr(mode):
     """Test iterating over lines from a file."""
-    filename = join(dirname(__file__), '..', 'resources', 'multiline_file.txt')
+    filename = join(dirname(__file__), "..", "resources", "multiline_file.txt")
 
     async with aioopen(filename, mode=mode) as file:
         assert not file.closed
@@ -258,17 +258,17 @@
         counter = 1
 
         async for line in file:
-            assert line.strip() == 'line ' + str(counter)
+            assert line.strip() == "line " + str(counter)
             counter += 1
 
     assert file.closed
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_name_property(mode):
     """Test iterating over lines from a file."""
-    filename = join(dirname(__file__), '..', 'resources', 'multiline_file.txt')
+    filename = join(dirname(__file__), "..", "resources", "multiline_file.txt")
 
     async with aioopen(filename, mode=mode) as file:
         assert file.name == filename
@@ -277,10 +277,10 @@
 
 
 @pytest.mark.asyncio
[email protected]('mode', ['r', 'r+', 'a+'])
[email protected]("mode", ["r", "r+", "a+"])
 async def test_mode_property(mode):
     """Test iterating over lines from a file."""
-    filename = join(dirname(__file__), '..', 'resources', 'multiline_file.txt')
+    filename = join(dirname(__file__), "..", "resources", "multiline_file.txt")
 
     async with aioopen(filename, mode=mode) as file:
         assert file.mode == mode
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiofiles-0.7.0/tox.ini new/aiofiles-0.8.0/tox.ini
--- old/aiofiles-0.7.0/tox.ini  2021-05-17 01:15:45.000000000 +0200
+++ new/aiofiles-0.8.0/tox.ini  2021-11-27 16:05:37.000000000 +0100
@@ -4,10 +4,11 @@
     3.7: py37
     3.8: py38
     3.9: py39
+    3.10: py310
     pypy-3.7: pypy3
 
 [tox]
-envlist = py36, py37, py38, py39, pypy3
+envlist = py36, py37, py38, py39, py310, pypy3
 isolated_build = True
 
 [testenv:lint]

Reply via email to