Repository: joblib/joblib
Pull request #1248 (2022-01-13 11:42:57)

Fix typos

codecov[bot]: # [Codecov](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib) Report
> Merging [#1248](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib) (25be9d6) into [master](https://codecov.io/gh/joblib/joblib/commit/7742f5882273889f7aaf1d483a8a1c72a97d57e3?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib) (7742f58) will **decrease** coverage by `17.10%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/joblib/joblib/pull/1248/graphs/tree.svg?width=650&height=150&src=pr&token=gA6LF5DGTW&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib)](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib)

```diff
@@             Coverage Diff             @@
##           master    #1248       +/-   ##
===========================================
- Coverage   88.43%   71.33%   -17.11%     
===========================================
  Files          47       47               
  Lines        7082     6903      -179     
===========================================
- Hits         6263     4924     -1339     
- Misses        819     1979     +1160     
```


| [Impacted Files](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib) | Coverage Δ | |
|---|---|---|
| [joblib/\_store\_backends.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL19zdG9yZV9iYWNrZW5kcy5weQ==) | `90.47% <ø> (-0.30%)` | :arrow_down: |
| [joblib/compressor.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL2NvbXByZXNzb3IucHk=) | `87.12% <ø> (-2.02%)` | :arrow_down: |
| [joblib/disk.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL2Rpc2sucHk=) | `80.95% <ø> (-11.12%)` | :arrow_down: |
| [joblib/hashing.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL2hhc2hpbmcucHk=) | `88.59% <ø> (-2.64%)` | :arrow_down: |
| [joblib/memory.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL21lbW9yeS5weQ==) | `94.55% <ø> (-0.82%)` | :arrow_down: |
| [joblib/numpy\_pickle.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL251bXB5X3BpY2tsZS5weQ==) | `93.06% <ø> (-4.96%)` | :arrow_down: |
| [joblib/numpy\_pickle\_compat.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL251bXB5X3BpY2tsZV9jb21wYXQucHk=) | `91.08% <ø> (ø)` | |
| [joblib/numpy\_pickle\_utils.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL251bXB5X3BpY2tsZV91dGlscy5weQ==) | `91.01% <ø> (-2.25%)` | :arrow_down: |
| [joblib/test/test\_dask.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL3Rlc3QvdGVzdF9kYXNrLnB5) | `3.59% <ø> (+0.05%)` | :arrow_up: |
| [joblib/test/test\_memmapping.py](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib#diff-am9ibGliL3Rlc3QvdGVzdF9tZW1tYXBwaW5nLnB5) | `37.07% <ø> (-62.17%)` | :arrow_down: |
| ... and [36 more](https://codecov.io/gh/joblib/joblib/pull/1248/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib). Last update [7742f58...25be9d6](https://codecov.io/gh/joblib/joblib/pull/1248?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=joblib).


Patch:
diff --git a/CHANGES.rst b/CHANGES.rst
index 0f8b938..bff605c 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -272,7 +272,7 @@ Maxime Weyl
 Maxime Weyl
 
     Loading a corrupted cached file with mmap mode enabled would
-    recompute the results and return them without memmory mapping.
+    recompute the results and return them without memory mapping.
 
 
 Release 0.12.3
@@ -883,7 +883,7 @@ Release 0.6.5
 2012-09-15
 Yannick Schwartz
 
-    BUG: make sure that sets and dictionnaries give reproducible hashes
+    BUG: make sure that sets and dictionaries give reproducible hashes
 
 
 2012-07-18
@@ -914,7 +914,7 @@ GaelVaroquaux
 
     BUG: non-reproducible hashing: order of kwargs
 
-    The ordering of a dictionnary is random. As a result the function hashing
+    The ordering of a dictionary is random. As a result the function hashing
     was not reproducible. Pretty hard to test
 
 Release 0.6.3
@@ -1224,7 +1224,7 @@ Gael varoquaux
 Gael varoquaux
 2010-07-29
 
-    MISC: Silence tests (and hopefuly Yaroslav :P)
+    MISC: Silence tests (and hopefully Yaroslav :P)
 
 Release 0.4.3
 ----------------
diff --git a/README.rst b/README.rst
index a17427f..1746fb8 100644
--- a/README.rst
+++ b/README.rst
@@ -48,7 +48,7 @@ Dependencies
 ============
 
 - Joblib has no mandatory dependencies besides Python (supported versions are
-  3.6+).
+  3.7+).
 - Joblib has an optional dependency on Numpy (at least version 1.6.1) for array
   manipulation.
 - Joblib includes its own vendored copy of
diff --git a/TODO.rst b/TODO.rst
index 8357163..0028cc3 100644
--- a/TODO.rst
+++ b/TODO.rst
@@ -40,7 +40,7 @@ Tasks at hand on joblib, in increasing order of difficulty.
 
 * add a 'argument_hash' keyword argument to Memory.cache, to be able to
   replace the hashing logic of memory for the input arguments. It should
-  accept as an input the dictionnary of arguments, as returned in
+  accept as an input the dictionary of arguments, as returned in
   func_inspect, and return a string.
 
 * add a sqlite db for provenance tracking. Store computation time and usage 
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index ccc9f7f..61ce5a9 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -54,33 +54,33 @@ jobs:
         imageName: 'ubuntu-latest'
         PYTHON_VERSION: "3.7"
         EXTRA_CONDA_PACKAGES: "numpy=1.15 distributed=2.13"
-      linux_py36_cython:
+      linux_py37_cython:
         imageName: 'ubuntu-latest'
-        PYTHON_VERSION: "3.6"
-        EXTRA_CONDA_PACKAGES: "numpy=1.14"
+        PYTHON_VERSION: "3.7"
+        EXTRA_CONDA_PACKAGES: "numpy=1.15"
         CYTHON: "true"
-      linux_py36_no_multiprocessing_no_lzma:
+      linux_py37_no_multiprocessing_no_lzma:
         imageName: 'ubuntu-latest'
-        PYTHON_VERSION: "3.6"
-        EXTRA_CONDA_PACKAGES: "numpy=1.14"
+        PYTHON_VERSION: "3.7"
+        EXTRA_CONDA_PACKAGES: "numpy=1.15"
         JOBLIB_MULTIPROCESSING: "0"
         NO_LZMA: "1"
-      linux_py36_no_numpy:
+      linux_py37_no_numpy:
         imageName: 'ubuntu-latest'
-        PYTHON_VERSION: "3.6"
+        PYTHON_VERSION: "3.7"
 
       windows_py38:
-        imageName: "vs2017-win2016"
+        imageName: "windows-latest"
         PYTHON_VERSION: "3.8"
         EXTRA_CONDA_PACKAGES: "numpy=1.18"
 
       macos_py38:
-        imageName: "macos-10.14"
+        imageName: "macos-latest"
         PYTHON_VERSION: "3.8"
         EXTRA_CONDA_PACKAGES: "numpy=1.18"
-      macos_py36_no_numpy:
-        imageName: "macos-10.14"
-        PYTHON_VERSION: "3.6"
+      macos_py37_no_numpy:
+        imageName: "macos-latest"
+        PYTHON_VERSION: "3.7"
 
   variables:
     JUNITXML: 'test-data.xml'
diff --git a/benchmarks/bench_pickle.py b/benchmarks/bench_pickle.py
index 98f0bff..7de096e 100755
--- a/benchmarks/bench_pickle.py
+++ b/benchmarks/bench_pickle.py
@@ -1,7 +1,7 @@
 """
 Benching joblib pickle I/O.
 
-Warning: this is slow, and the benchs are easily offset by other disk
+Warning: this is slow, and the benches are easily offset by other disk
 activity.
 """
 import os
diff --git a/continuous_integration/install.sh b/continuous_integration/install.sh
index d191e14..9f01f51 100755
--- a/continuous_integration/install.sh
+++ b/continuous_integration/install.sh
@@ -18,7 +18,7 @@ create_new_conda_env() {
 }
 
 create_new_pypy3_env() {
-    PYPY_FOLDER="pypy3.6-v7.3.1-linux64"
+    PYPY_FOLDER="pypy3.7-v7.3.7-linux64"
     wget https://downloads.python.org/pypy/$PYPY_FOLDER.tar.bz2
     tar xvf $PYPY_FOLDER.tar.bz2
     $PYPY_FOLDER/bin/pypy3 -m venv pypy3
diff --git a/doc/memory.rst b/doc/memory.rst
index 021d620..d539f5f 100644
--- a/doc/memory.rst
+++ b/doc/memory.rst
@@ -391,8 +391,8 @@ Gotchas
   ``joblib.Memory`` cache can get invalidated when upgrading ``joblib``.
   Invalidation can also happen when upgrading a third party library (such as
   ``numpy``): in such a case, only the cached function calls with parameters
-  that are constructs (or contain references to contructs) defined in the
-  upgraded library should potentially be invalidated after the uprade.
+  that are constructs (or contain references to constructs) defined in the
+  upgraded library should potentially be invalidated after the upgrade.
 
 
 Ignoring some arguments
diff --git a/examples/compressors_comparison.py b/examples/compressors_comparison.py
index 64ebcf5..3b20b10 100644
--- a/examples/compressors_comparison.py
+++ b/examples/compressors_comparison.py
@@ -8,7 +8,7 @@ Zlib, LZMA and LZ4 compression only are used but Joblib also supports BZ2 and
 GZip compression methods.
 For each compared compression method, this example dumps and reloads a
 dataset fetched from an online machine-learning database. This gives 3
-informations: the size on disk of the compressed data, the time spent to dump
+information: the size on disk of the compressed data, the time spent to dump
 and the time spent to reload the data from disk.
 """
 
diff --git a/examples/serialization_and_wrappers.py b/examples/serialization_and_wrappers.py
index 4e9967d..d03f012 100644
--- a/examples/serialization_and_wrappers.py
+++ b/examples/serialization_and_wrappers.py
@@ -36,7 +36,7 @@ print(Parallel(n_jobs=2)(delayed(func_async)(21) for _ in range(1))[0])
 
 
 ###############################################################################
-# For most use-cases, using ``cloudpickle``` is efficient enough. However, this
+# For most use-cases, using ``cloudpickle`` is efficient enough. However, this
 # solution can be very slow to serialize large python objects, such as dict or
 # list, compared to the standard ``pickle`` serialization.
 #
diff --git a/joblib/_store_backends.py b/joblib/_store_backends.py
index d4389ed..e96f306 100644
--- a/joblib/_store_backends.py
+++ b/joblib/_store_backends.py
@@ -130,7 +130,7 @@ class StoreBackendBase(metaclass=ABCMeta):
         verbose: int
             The level of verbosity of the store
         backend_options: dict
-            Contains a dictionnary of named paremeters used to configure the
+            Contains a dictionary of named parameters used to configure the
             store backend.
         """
 
diff --git a/joblib/compressor.py b/joblib/compressor.py
index 0dbd3dc..840fabe 100644
--- a/joblib/compressor.py
+++ b/joblib/compressor.py
@@ -89,7 +89,7 @@ class CompressorWrapper():
     prefix: bytestring
         A bytestring corresponding to the magic number that identifies the
         file format associated to the compressor.
-    extention: str
+    extension: str
         The file extension used to automatically select this compressor during
         a dump to a file.
     """
diff --git a/joblib/disk.py b/joblib/disk.py
index 3b2735d..1bf0756 100644
--- a/joblib/disk.py
+++ b/joblib/disk.py
@@ -66,7 +66,7 @@ def mkdirp(d):
 
 # if a rmtree operation fails in rm_subdirs, wait for this much time (in secs),
 # then retry up to RM_SUBDIRS_N_RETRY times. If it still fails, raise the
-# exception. this mecanism ensures that the sub-process gc have the time to
+# exception. this mechanism ensures that the sub-process gc have the time to
 # collect and close the memmaps before we fail.
 RM_SUBDIRS_RETRY_TIME = 0.1
 RM_SUBDIRS_N_RETRY = 5
@@ -119,7 +119,7 @@ def delete_folder(folder_path, onerror=None, allow_non_empty=True):
                             folder_path, ignore_errors=False, onerror=None
                         )
                         util.debug(
-                            "Sucessfully deleted {}".format(folder_path))
+                            "Successfully deleted {}".format(folder_path))
                         break
                     else:
                         raise OSError(
diff --git a/joblib/externals/cloudpickle/cloudpickle.py b/joblib/externals/cloudpickle/cloudpickle.py
index 347b386..310622a 100644
--- a/joblib/externals/cloudpickle/cloudpickle.py
+++ b/joblib/externals/cloudpickle/cloudpickle.py
@@ -594,7 +594,7 @@ else:
 
 
 def parametrized_type_hint_getinitargs(obj):
-    # The distorted type check sematic for typing construct becomes:
+    # The distorted type check semantic for typing construct becomes:
     # ``type(obj) is type(TypeHint)``, which means "obj is a
     # parametrized TypeHint"
     if type(obj) is type(Literal):  # pragma: no branch
diff --git a/joblib/externals/loky/backend/queues.py b/joblib/externals/loky/backend/queues.py
index 62735db..5671464 100644
--- a/joblib/externals/loky/backend/queues.py
+++ b/joblib/externals/loky/backend/queues.py
@@ -209,7 +209,7 @@ class SimpleQueue(mp_SimpleQueue):
             else:
                 self._wlock = ctx.Lock()
 
-        # Add possiblity to use custom reducers
+        # Add possibility to use custom reducers
         self._reducers = reducers
 
     def close(self):
diff --git a/joblib/externals/loky/backend/resource_tracker.py b/joblib/externals/loky/backend/resource_tracker.py
index 95dff35..151df40 100644
--- a/joblib/externals/loky/backend/resource_tracker.py
+++ b/joblib/externals/loky/backend/resource_tracker.py
@@ -36,7 +36,7 @@
 # Note that this behavior differs from CPython's resource_tracker, which only
 # implements list of shared resources, and not a proper refcounting scheme.
 # Also, CPython's resource tracker will only attempt to cleanup those shared
-# resources once all procsses connected to the resouce tracker have exited.
+# resources once all procsses connected to the resource tracker have exited.
 
 
 import os
@@ -118,7 +118,7 @@ class ResourceTracker(object):
                 self._pid = None
 
                 warnings.warn('resource_tracker: process died unexpectedly, '
-                              'relaunching.  Some folders/sempahores might '
+                              'relaunching.  Some folders/semaphores might '
                               'leak.')
 
             fds_to_pass = []
diff --git a/joblib/externals/loky/backend/spawn.py b/joblib/externals/loky/backend/spawn.py
index 2a16c84..d4a6a8c 100644
--- a/joblib/externals/loky/backend/spawn.py
+++ b/joblib/externals/loky/backend/spawn.py
@@ -105,7 +105,7 @@ def get_preparation_data(name, init_main_module=True):
             _resource_tracker as mp_resource_tracker
         )
         # multiprocessing's resource_tracker must be running before loky
-        # process is created (othewise the child won't be able to use it if it
+        # process is created (otherwise the child won't be able to use it if it
         # is created later on)
         mp_resource_tracker.ensure_running()
         d["mp_tracker_args"] = {
diff --git a/joblib/externals/loky/backend/utils.py b/joblib/externals/loky/backend/utils.py
index dc1b82a..5342204 100644
--- a/joblib/externals/loky/backend/utils.py
+++ b/joblib/externals/loky/backend/utils.py
@@ -117,7 +117,7 @@ def _recursive_terminate(pid):
 
 
 def get_exitcodes_terminated_worker(processes):
-    """Return a formated string with the exitcodes of terminated workers.
+    """Return a formatted string with the exitcodes of terminated workers.
 
     If necessary, wait (up to .25s) for the system to correctly set the
     exitcode of one terminated worker.
diff --git a/joblib/externals/loky/cloudpickle_wrapper.py b/joblib/externals/loky/cloudpickle_wrapper.py
index 1bf41a3..7d2cd35 100644
--- a/joblib/externals/loky/cloudpickle_wrapper.py
+++ b/joblib/externals/loky/cloudpickle_wrapper.py
@@ -24,7 +24,7 @@ class CloudpickledObjectWrapper(object):
         return _reconstruct_wrapper, (_pickled_object, self._keep_wrapper)
 
     def __getattr__(self, attr):
-        # Ensure that the wrapped object can be used seemlessly as the
+        # Ensure that the wrapped object can be used seamlessly as the
         # previous object.
         if attr not in ['_obj', '_keep_wrapper']:
             return getattr(self._obj, attr)
diff --git a/joblib/externals/loky/process_executor.py b/joblib/externals/loky/process_executor.py
index 3737ecf..ffa0204 100644
--- a/joblib/externals/loky/process_executor.py
+++ b/joblib/externals/loky/process_executor.py
@@ -1048,7 +1048,7 @@ class ProcessPoolExecutor(_base.Executor):
         if self._executor_manager_thread is None:
             mp.util.debug('_start_executor_manager_thread called')
 
-            # When the executor gets garbarge collected, the weakref callback
+            # When the executor gets garbage collected, the weakref callback
             # will wake up the queue management thread so that it can terminate
             # if there is no pending work item.
             def weakref_cb(
diff --git a/joblib/hashing.py b/joblib/hashing.py
index 24aeb55..b983e84 100644
--- a/joblib/hashing.py
+++ b/joblib/hashing.py
@@ -193,7 +193,7 @@ class NumpyHasher(Hasher):
                 obj_c_contiguous = obj.T
             else:
                 # Cater for non-single-segment arrays: this creates a
-                # copy, and thus aleviates this issue.
+                # copy, and thus alleviates this issue.
                 # XXX: There might be a more efficient way of doing this
                 obj_c_contiguous = obj.flatten()
 
diff --git a/joblib/memory.py b/joblib/memory.py
index b660f14..b761345 100644
--- a/joblib/memory.py
+++ b/joblib/memory.py
@@ -130,7 +130,7 @@ def _store_backend_factory(backend, location, verbose=0, backend_options=None):
         return obj
     elif location is not None:
         warnings.warn(
-            "Instanciating a backend using a {} as a location is not "
+            "Instantiating a backend using a {} as a location is not "
             "supported by joblib. Returning None instead.".format(
                 location.__class__.__name__), UserWarning)
 
@@ -196,7 +196,7 @@ class MemorizedResult(Logger):
 
     func: function or str
         function whose output is cached. The string case is intended only for
-        instanciation based on the output of repr() on another instance.
+        instantiation based on the output of repr() on another instance.
         (namely eval(repr(memorized_instance)) works).
 
     argument_hash: str
@@ -487,7 +487,7 @@ class MemorizedFunc(Logger):
         metadata = None
         msg = None
 
-        # Wether or not the memorized function must be called
+        # Whether or not the memorized function must be called
         must_call = False
 
         # FIXME: The statements below should be try/excepted
@@ -563,8 +563,8 @@ class MemorizedFunc(Logger):
             # (which should be called once on self) gets called in the process
             # in which self.func was defined, this caching mechanism prevents
             # undesired cache clearing when the cached function is called in
-            # an environement where the introspection utilities get_func_code
-            # relies on do not work (typicially, in joblib child processes).
+            # an environment where the introspection utilities get_func_code
+            # relies on do not work (typically, in joblib child processes).
             # See #1035 for  more info
             # TODO (pierreglaser): do the same with get_func_name?
             self._func_code_info = get_func_code(self.func)
@@ -876,12 +876,6 @@ class Memory(Logger):
             The 'local' backend is using regular filesystem operations to
             manipulate data (open, mv, etc) in the backend.
 
-        cachedir: str or None, optional
-
-            .. deprecated: 0.12
-                'cachedir' has been deprecated in 0.12 and will be
-                removed in 0.14. Use the 'location' parameter instead.
-
         mmap_mode: {None, 'r+', 'r', 'w+', 'c'}, optional
             The memmapping mode used when loading from cache
             numpy arrays. See numpy.load for the meaning of the
@@ -906,17 +900,16 @@ class Memory(Logger):
             actually reduce the cache size to be less than ``bytes_limit``.
 
         backend_options: dict, optional
-            Contains a dictionnary of named parameters used to configure
+            Contains a dictionary of named parameters used to configure
             the store backend.
     """
     # ------------------------------------------------------------------------
     # Public interface
     # ------------------------------------------------------------------------
 
-    def __init__(self, location=None, backend='local', cachedir=None,
+    def __init__(self, location=None, backend='local',
                  mmap_mode=None, compress=False, verbose=1, bytes_limit=None,
                  backend_options=None):
-        # XXX: Bad explanation of the None value of cachedir
         Logger.__init__(self)
         self._verbose = verbose
         self.mmap_mode = mmap_mode
@@ -931,22 +924,6 @@ class Memory(Logger):
         if compress and mmap_mode is not None:
             warnings.warn('Compressed results cannot be memmapped',
                           stacklevel=2)
-        if cachedir is not None:
-            if location is not None:
-                raise ValueError(
-                    'You set both "location={0!r} and "cachedir={1!r}". '
-                    "'cachedir' has been deprecated in version "
-                    "0.12 and will be removed in version 0.14.\n"
-                    'Please only set "location={0!r}"'.format(
-                        location, cachedir))
-
-            warnings.warn(
-                "The 'cachedir' parameter has been deprecated in version "
-                "0.12 and will be removed in version 0.14.\n"
-                'You provided "cachedir={0!r}", '
-                'use "location={0!r}" instead.'.format(cachedir),
-                DeprecationWarning, stacklevel=2)
-            location = cachedir
 
         self.location = location
         if isinstance(location, str):
@@ -957,17 +934,6 @@ class Memory(Logger):
             backend_options=dict(compress=compress, mmap_mode=mmap_mode,
                                  **backend_options))
 
-    @property
-    def cachedir(self):
-        warnings.warn(
-            "The 'cachedir' attribute has been deprecated in version 0.12 "
-            "and will be removed in version 0.14.\n"
-            "Use os.path.join(memory.location, 'joblib') attribute instead.",
-            DeprecationWarning, stacklevel=2)
-        if self.location is None:
-            return None
-        return os.path.join(self.location, 'joblib')
-
     def cache(self, func=None, ignore=None, verbose=None, mmap_mode=False):
         """ Decorates the given function func to only compute its return
             value for input arguments not cached on disk.
diff --git a/joblib/numpy_pickle.py b/joblib/numpy_pickle.py
index cc593af..881d1f0 100644
--- a/joblib/numpy_pickle.py
+++ b/joblib/numpy_pickle.py
@@ -7,10 +7,7 @@
 import pickle
 import os
 import warnings
-try:
-    from pathlib import Path
-except ImportError:
-    Path = None
+from pathlib import Path
 
 from .compressor import lz4, LZ4_NOT_INSTALLED_ERROR
 from .compressor import _COMPRESSORS, register_compressor, BinaryZlibFile
@@ -148,7 +145,7 @@ class NumpyArrayWrapper(object):
             else:
                 array.shape = self.shape
 
-        # Detect byte order mis-match and swap as needed.
+        # Detect byte order mismatch and swap as needed.
         return _ensure_native_byte_order(array)
 
     def read_mmap(self, unpickler):
diff --git a/joblib/numpy_pickle_compat.py b/joblib/numpy_pickle_compat.py
index 096acbc..5316c02 100644
--- a/joblib/numpy_pickle_compat.py
+++ b/joblib/numpy_pickle_compat.py
@@ -63,7 +63,7 @@ def write_zfile(file_handle, data, compress=1):
     """Write the data in the given file as a Z-file.
 
     Z-files are raw data compressed with zlib used internally by joblib
-    for persistence. Backward compatibility is not guarantied. Do not
+    for persistence. Backward compatibility is not guaranteed. Do not
     use for external purposes.
     """
     file_handle.write(_ZFILE_PREFIX)
@@ -105,7 +105,7 @@ class NDArrayWrapper(object):
             kwargs["allow_pickle"] = True
         array = unpickler.np.load(filename, **kwargs)
 
-        # Detect byte order mis-match and swap as needed.
+        # Detect byte order mismatch and swap as needed.
         array = _ensure_native_byte_order(array)
 
         # Reconstruct subclasses. This does not work with old
diff --git a/joblib/numpy_pickle_utils.py b/joblib/numpy_pickle_utils.py
index 02a88ff..71f2c7c 100644
--- a/joblib/numpy_pickle_utils.py
+++ b/joblib/numpy_pickle_utils.py
@@ -50,7 +50,7 @@ def _get_prefixes_max_len():
 
 
 def _is_numpy_array_byte_order_mismatch(array):
-    """Check if numpy array is having byte order mis-match"""
+    """Check if numpy array is having byte order mismatch"""
     return ((sys.byteorder == 'big' and
              (array.dtype.byteorder == '<' or
               (array.dtype.byteorder == '|' and array.dtype.fields and
diff --git a/setup.py b/setup.py
index d2794c2..8686eaa 100755
--- a/setup.py
+++ b/setup.py
@@ -28,10 +28,10 @@ setup(
         'License :: OSI Approved :: BSD License',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: 3.9',
+        'Programming Language :: Python :: 3.10',
         'Topic :: Scientific/Engineering',
         'Topic :: Utilities',
         'Topic :: Software Development :: Libraries',
@@ -54,5 +54,5 @@ setup(
         'joblib.externals', 'joblib.externals.cloudpickle',
         'joblib.externals.loky', 'joblib.externals.loky.backend',
     ],
-    python_requires='>=3.6',
+    python_requires='>=3.7',
 )


Test patch:
diff --git a/continuous_integration/run_tests.sh b/continuous_integration/run_tests.sh
index 91ebd08..7c82ec3 100755
--- a/continuous_integration/run_tests.sh
+++ b/continuous_integration/run_tests.sh
@@ -28,14 +28,20 @@ if [[ "$SKLEARN_TESTS" == "true" ]]; then
     # Install scikit-learn from conda and test against the installed
     # development version of joblib.
     conda remove -y numpy
-    conda install -y -c conda-forge cython pillow scikit-learn
+    conda install -y -c conda-forge cython pillow pip numpy scipy
+    pip install --pre --extra-index https://pypi.anaconda.org/scipy-wheels-nightly/simple scikit-learn
     python -c "import sklearn; print('Testing scikit-learn', sklearn.__version__)"
 
     # Move to a dedicated folder to avoid being polluted by joblib specific conftest.py
     # and disable the doctest plugin to avoid issues with doctests in scikit-learn
     # docstrings that require setting print_changed_only=True temporarily.
     cd "/tmp"
-    pytest -vl --maxfail=5 -p no:doctest -k "not test_import_is_deprecated" --pyargs sklearn
+    pytest -vl --maxfail=5 -p no:doctest \
+        # Don't worry about deprecated imports: this is tested for real
+        # in upstream scikit-learn and this is not joblib's responsibility.
+        # Let's skip this test to avoid false positives in joblib's CI.
+        -k "not test_import_is_deprecated" \
+        --pyargs sklearn
 fi
 
 if [[ "$SKIP_TESTS" != "true" && "$COVERAGE" == "true" ]]; then
diff --git a/joblib/test/data/create_numpy_pickle.py b/joblib/test/data/create_numpy_pickle.py
index 0128f91..3a3a311 100644
--- a/joblib/test/data/create_numpy_pickle.py
+++ b/joblib/test/data/create_numpy_pickle.py
@@ -64,7 +64,7 @@ def write_test_pickle(to_pickle, args):
         print("Error: cannot generate file '{}' with arguments '{}'. "
               "Error was: {}".format(pickle_filename, kwargs, e))
     else:
-        print("File '{}' generated successfuly.".format(pickle_filename))
+        print("File '{}' generated successfully.".format(pickle_filename))
 
 if __name__ == '__main__':
     import argparse
diff --git a/joblib/test/test_dask.py b/joblib/test/test_dask.py
index 01206cc..6c5aa04 100644
--- a/joblib/test/test_dask.py
+++ b/joblib/test/test_dask.py
@@ -114,7 +114,7 @@ def test_dask_funcname(loop, mixed):
 
 def test_no_undesired_distributed_cache_hit(loop):
     # Dask has a pickle cache for callables that are called many times. Because
-    # the dask backends used to wrapp both the functions and the arguments
+    # the dask backends used to wrap both the functions and the arguments
     # under instances of the Batch callable class this caching mechanism could
     # lead to bugs as described in: https://github.com/joblib/joblib/pull/1055
     # The joblib-dask backend has been refactored to avoid bundling the
diff --git a/joblib/test/test_deprecated_objects.py b/joblib/test/test_deprecated_objects.py
index d561483..9ca6b08 100644
--- a/joblib/test/test_deprecated_objects.py
+++ b/joblib/test/test_deprecated_objects.py
@@ -2,15 +2,12 @@
 Tests making sure that deprecated objects properly raise a deprecation warning
 when imported/created.
 """
-import sys
-
 import pytest
 
 from joblib.my_exceptions import _deprecated_names as _deprecated_exceptions
 from joblib.format_stack import _deprecated_names as _deprecated_format_utils
 
 
-@pytest.mark.xfail(sys.version_info < (3, 7), reason="no module-level getattr")
 def test_deprecated_joblib_exceptions():
     assert 'JoblibException' in _deprecated_exceptions
     for name in _deprecated_exceptions:
@@ -20,7 +17,6 @@ def test_deprecated_joblib_exceptions():
             exec('from joblib.my_exceptions import {}'.format(name))
 
 
-@pytest.mark.xfail(sys.version_info < (3, 7), reason="no module-level getattr")
 def test_deprecated_formatting_utilities(capsys):
     assert 'safe_repr' in _deprecated_format_utils
     assert 'eq_repr' in _deprecated_format_utils
diff --git a/joblib/test/test_hashing.py b/joblib/test/test_hashing.py
index 5682d8f..3a3d631 100644
--- a/joblib/test/test_hashing.py
+++ b/joblib/test/test_hashing.py
@@ -64,7 +64,7 @@ class Klass(object):
 class KlassWithCachedMethod(object):
 
     def __init__(self, cachedir):
-        mem = Memory(cachedir=cachedir)
+        mem = Memory(location=cachedir)
         self.f = mem.cache(self.f)
 
     def f(self, x):
diff --git a/joblib/test/test_memmapping.py b/joblib/test/test_memmapping.py
index dc40d23..f110751 100644
--- a/joblib/test/test_memmapping.py
+++ b/joblib/test/test_memmapping.py
@@ -83,7 +83,7 @@ def test_memmap_based_array_reducing(tmpdir):
     buffer[:] = - 1.0 * np.arange(buffer.shape[0], dtype=buffer.dtype)
     buffer.flush()
 
-    # Memmap a 2D fortran array on a offseted subsection of the previous
+    # Memmap a 2D fortran array on a offsetted subsection of the previous
     # buffer
     a = np.memmap(filename, dtype=np.float64, shape=(3, 5, 4),
                   mode='r+', order='F', offset=4)
@@ -728,7 +728,7 @@ def test_memmapping_pool_for_large_arrays(factory, tmpdir):
     # Check that the tempfolder is empty
     assert os.listdir(tmpdir.strpath) == []
 
-    # Build an array reducers that automaticaly dump large array content
+    # Build an array reducers that automatically dump large array content
     # to filesystem backed memmap instances to avoid memory explosion
     p = factory(3, max_nbytes=40, temp_folder=tmpdir.strpath, verbose=2)
     try:
@@ -815,10 +815,13 @@ def test_child_raises_parent_exits_cleanly(backend):
                     temp_folder = get_temp_folder(p, "{b}")
                     p(delayed(print_filename_and_raise)(data)
                               for i in range(1))
-            except ValueError:
+            except ValueError as e:
                 # the temporary folder should be deleted by the end of this
                 # call
-                assert not os.path.exists(temp_folder)
+                if os.path.exists(temp_folder):
+                    raise AssertionError(
+                        temp_folder + " was not deleted"
+                    ) from e
     """.format(b=backend)
     env = os.environ.copy()
     env['PYTHONPATH'] = os.path.dirname(__file__)
@@ -828,7 +831,7 @@ def test_child_raises_parent_exits_cleanly(backend):
     out, err = p.communicate()
     out, err = out.decode(), err.decode()
     filename = out.split('\n')[0]
-    assert p.returncode == 0, out
+    assert p.returncode == 0, err or out
     assert err == ''  # no resource_tracker warnings.
     assert not os.path.exists(filename)
 
@@ -951,7 +954,7 @@ def test_memmapping_pool_for_large_arrays_in_return(factory, tmpdir):
     """Check that large arrays are not copied in memory in return"""
     assert_array_equal = np.testing.assert_array_equal
 
-    # Build an array reducers that automaticaly dump large array content
+    # Build an array reducers that automatically dump large array content
     # but check that the returned datastructure are regular arrays to avoid
     # passing a memmap array pointing to a pool controlled temp folder that
     # might be confusing to the user
diff --git a/joblib/test/test_memory.py b/joblib/test/test_memory.py
index 6f74966..687f036 100644
--- a/joblib/test/test_memory.py
+++ b/joblib/test/test_memory.py
@@ -188,7 +188,7 @@ def test_parallel_call_cached_function_defined_in_jupyter(
             if call_before_reducing:
                 cached_f(3)
                 # Two files were just created, func_code.py, and a folder
-                # containing the informations (inputs hash/ouptput) of
+                # containing the information (inputs hash/ouptput) of
                 # cached_f(3)
                 assert len(os.listdir(f_cache_directory / 'f')) == 2
 
@@ -564,10 +564,6 @@ def test_func_dir(tmpdir):
     assert location == path
     assert os.path.exists(path)
     assert memory.location == os.path.dirname(g.store_backend.location)
-    with warns(DeprecationWarning) as w:
-        assert memory.cachedir == g.store_backend.location
-    assert len(w) == 1
-    assert "The 'cachedir' attribute has been deprecated" in str(w[-1].message)
 
     # Test that the code is stored.
     # For the following test to be robust to previous execution, we clear
@@ -1089,31 +1085,8 @@ def test_memory_recomputes_after_an_error_while_loading_results(
         assert message in str(e.args)
 
 
-def test_deprecated_cachedir_behaviour(tmpdir):
-    # verify the right deprecation warnings are raised when using cachedir
-    # option instead of new location parameter.
-    with warns(None) as w:
-        memory = Memory(cachedir=tmpdir.strpath, verbose=0)
-        assert memory.store_backend.location.startswith(tmpdir.strpath)
-
-    assert len(w) == 1
-    assert "The 'cachedir' parameter has been deprecated" in str(w[-1].message)
-
-    with warns(None) as w:
-        memory = Memory()
-        assert memory.cachedir is None
-
-    assert len(w) == 1
-    assert "The 'cachedir' attribute has been deprecated" in str(w[-1].message)
-
-    error_regex = """You set both "location='.+ and "cachedir='.+"""
-    with raises(ValueError, match=error_regex):
-        memory = Memory(location=tmpdir.strpath, cachedir=tmpdir.strpath,
-                        verbose=0)
-
-
 class IncompleteStoreBackend(StoreBackendBase):
-    """This backend cannot be instanciated and should raise a TypeError."""
+    """This backend cannot be instantiated and should raise a TypeError."""
     pass
 
 
@@ -1184,7 +1157,7 @@ def test_warning_on_unknown_location_type():
     with warns(UserWarning) as warninfo:
         _store_backend_factory("local", location=unsupported_location)
 
-    expected_mesage = ("Instanciating a backend using a "
+    expected_mesage = ("Instantiating a backend using a "
                        "NonSupportedLocationClass as a location is not "
                        "supported by joblib")
     assert expected_mesage in str(warninfo[0].message)
@@ -1192,7 +1165,7 @@ def test_warning_on_unknown_location_type():
 
 def test_instanciate_incomplete_store_backend():
     # Verify that registering an external incomplete store backend raises an
-    # exception when one tries to instanciate it.
+    # exception when one tries to instantiate it.
     backend_name = "isb"
     register_store_backend(backend_name, IncompleteStoreBackend)
     assert (backend_name, IncompleteStoreBackend) in _STORE_BACKENDS.items()
@@ -1214,7 +1187,7 @@ def test_dummy_store_backend():
 
 
 def test_instanciate_store_backend_with_pathlib_path():
-    # Instanciate a FileSystemStoreBackend using a pathlib.Path object
+    # Instantiate a FileSystemStoreBackend using a pathlib.Path object
     path = pathlib.Path("some_folder")
     backend_obj = _store_backend_factory("local", path)
     assert backend_obj.location == "some_folder"
@@ -1231,7 +1204,7 @@ def test_filesystem_store_backend_repr(tmpdir):
 
     assert str(backend) == repr_pattern.format(location=None)
 
-    # backend location is passed explicitely via the configure method (called
+    # backend location is passed explicitly via the configure method (called
     # by the internal _store_backend_factory function)
     backend.configure(tmpdir.strpath)
 
diff --git a/joblib/test/test_numpy_pickle.py b/joblib/test/test_numpy_pickle.py
index 34a9e23..2135e8f 100644
--- a/joblib/test/test_numpy_pickle.py
+++ b/joblib/test/test_numpy_pickle.py
@@ -14,15 +14,18 @@ import pickle
 import socket
 from contextlib import closing
 import mmap
+from pathlib import Path
+
 try:
     import lzma
 except ImportError:
     lzma = None
+
 import pytest
 
 from joblib.test.common import np, with_numpy, with_lz4, without_lz4
 from joblib.test.common import with_memory_profiler, memory_used
-from joblib.testing import parametrize, raises, SkipTest, warns
+from joblib.testing import parametrize, raises, warns
 
 # numpy_pickle is not a drop-in replacement of pickle, as it takes
 # filenames instead of open files as arguments.
@@ -851,17 +854,12 @@ def test_numpy_subclass(tmpdir):
 
 
 def test_pathlib(tmpdir):
-    try:
-        from pathlib import Path
-    except ImportError:
-        pass
-    else:
-        filename = tmpdir.join('test.pkl').strpath
-        value = 123
-        numpy_pickle.dump(value, Path(filename))
-        assert numpy_pickle.load(filename) == value
-        numpy_pickle.dump(value, filename)
-        assert numpy_pickle.load(Path(filename)) == value
+    filename = tmpdir.join('test.pkl').strpath
+    value = 123
+    numpy_pickle.dump(value, Path(filename))
+    assert numpy_pickle.load(filename) == value
+    numpy_pickle.dump(value, filename)
+    assert numpy_pickle.load(Path(filename)) == value
 
 
 @with_numpy