Repository: PlasmaPy/PlasmaPy

Issue:
Rename plasmapy.classes to plasmapy.plasma [PLEP7]
As part of the changes associated with the forthcoming PLEP 7 (PlasmaPy/PlasmaPy-PLEPs#26), we decided to rename ``plasmapy.classes`` to ``plasmapy.plasma``.  This is in an attempt to make the top-level namespace more structured and explicit.

This issue will breaking existing API.

Discussion:
codecov[bot]: # [Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=h1) Report
> Merging [#842](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=desc) into [master](https://codecov.io/gh/PlasmaPy/PlasmaPy/commit/256413aa816375eaf259b89bf5c62853c35ff672&el=desc) will **decrease** coverage by `0.00%`.
> The diff coverage is `80.95%`.

[![Impacted file tree graph](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/graphs/tree.svg?width=650&height=150&src=pr&token=LzZ5mnXVad)](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #842      +/-   ##
==========================================
- Coverage   95.88%   95.88%   -0.01%     
==========================================
  Files          56       56              
  Lines        5127     5123       -4     
==========================================
- Hits         4916     4912       -4     
  Misses        211      211              
```


| [Impacted Files](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [plasmapy/plasma/exceptions.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL2V4Y2VwdGlvbnMucHk=) | `100.00% <ø> (ø)` | |
| [plasmapy/plasma/plasma\_base.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3BsYXNtYV9iYXNlLnB5) | `72.22% <ø> (ø)` | |
| [plasmapy/\_\_init\_\_.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvX19pbml0X18ucHk=) | `32.14% <33.33%> (-2.34%)` | :arrow_down: |
| [plasmapy/plasma/\_\_init\_\_.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL19faW5pdF9fLnB5) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/plasma\_factory.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3BsYXNtYV9mYWN0b3J5LnB5) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/\_\_init\_\_.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvX19pbml0X18ucHk=) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/openpmd\_hdf5.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvb3BlbnBtZF9oZGY1LnB5) | `79.56% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/plasma3d.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvcGxhc21hM2QucHk=) | `100.00% <100.00%> (ø)` | |
| [plasmapy/plasma/sources/plasmablob.py](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842/diff?src=pr&el=tree#diff-cGxhc21hcHkvcGxhc21hL3NvdXJjZXMvcGxhc21hYmxvYi5weQ==) | `100.00% <100.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=footer). Last update [256413a...17d1c5f](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/842?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

StanczakDominik: I think coveragepy just gave up on the rename, thus the coverage failure.
StanczakDominik: I forgot to skip `black` checks, darn...
StanczakDominik: The changes from master I've just merged in should address most of the formatting issues, and the stability matrix :)
StanczakDominik: Thanks for the reviews @namurphy @rocco8773 !

Patch:
diff --git a/changelog/842.breaking.rst b/changelog/842.breaking.rst
new file mode 100644
index 00000000..393be14e
--- /dev/null
+++ b/changelog/842.breaking.rst
@@ -0,0 +1,1 @@
+Renamed the `plasmapy.classes` subpackage to `plasmapy.plasma`.
diff --git a/docs/about/stability.rst b/docs/about/stability.rst
index 169f024c..6c810306 100644
--- a/docs/about/stability.rst
+++ b/docs/about/stability.rst
@@ -103,7 +103,7 @@ PlasmaPy's planned and existing subpackages are:
         </tr>
         <tr>
             <td>
-                plasmapy.classes
+                plasmapy.plasma
             </td>
             <td align='center'>
                 <span class="dev"></span>
diff --git a/docs/notebooks/magnetic_statics.ipynb b/docs/notebooks/magnetic_statics.ipynb
index 43b04020..0e863454 100644
--- a/docs/notebooks/magnetic_statics.ipynb
+++ b/docs/notebooks/magnetic_statics.ipynb
@@ -37,7 +37,7 @@
    "outputs": [],
    "source": [
     "from plasmapy.formulary import magnetostatics\n",
-    "from plasmapy.classes.sources import Plasma3D\n",
+    "from plasmapy.plasma.sources import Plasma3D\n",
     "import numpy as np\n",
     "import astropy.units as u\n",
     "import matplotlib.pyplot as plt"
diff --git a/docs/notebooks/particle_stepper.ipynb b/docs/notebooks/particle_stepper.ipynb
index 7b07bdc9..3a8bd0d5 100644
--- a/docs/notebooks/particle_stepper.ipynb
+++ b/docs/notebooks/particle_stepper.ipynb
@@ -39,7 +39,7 @@
    "source": [
     "import numpy as np\n",
     "from astropy import units as u\n",
-    "from plasmapy.classes import Plasma\n",
+    "from plasmapy.plasma import Plasma\n",
     "from plasmapy.simulation import ParticleTracker\n",
     "from plasmapy.formulary import gyrofrequency"
    ]
diff --git a/docs/plasma/index.rst b/docs/plasma/index.rst
index bacde152..7f2b00b5 100644
--- a/docs/plasma/index.rst
+++ b/docs/plasma/index.rst
@@ -1,21 +1,21 @@
-.. _classes:
+.. _plasma:
 
 ===============
 PlasmaPy Plasma
 ===============
 
-.. module:: plasmapy.classes
-.. currentmodule:: plasmapy.classes
+.. module:: plasmapy.plasma
+.. currentmodule:: plasmapy.plasma
 
 Overview
 --------
-One of the core classes in PlasmaPy is `~plasmapy.classes.Plasma`. In order
+One of the core classes in PlasmaPy is `~plasmapy.plasma.Plasma`. In order
 to make it easy to work with different plasma data in PlasmaPy, the
-`~plasmapy.classes.Plasma` object provides a number of methods for
+`~plasmapy.plasma.Plasma` object provides a number of methods for
 commonly existing plasmas in nature.
 
 All Plasma objects are created using the Plasma factory
-`~plasmapy.classes.Plasma`.
+`~plasmapy.plasma.Plasma`.
 
 A number of plasma data structures are supported by subclassing this
 base object. See :ref:`plasma-sources` to see a list of all of them.
@@ -23,43 +23,43 @@ base object. See :ref:`plasma-sources` to see a list of all of them.
 Creating Plasma Objects
 -----------------------
 Plasma objects are constructed using the special factory class
-`~plasmapy.classes.Plasma`: ::
-
-    >>> x = plasmapy.classes.Plasma(T_e=T_e,
-    ...                             n_e=n_e,
-    ...                             Z=Z,
-    ...                             particle=particle)  # doctest: +SKIP
-
-The result of a call to `~plasmapy.classes.Plasma` will be either a
-`~plasmapy.classes.GenericPlasma` object, or a subclass of
-`~plasmapy.classes.GenericPlasma` which deals with a specific type of
-data, e.g. `~plasmapy.classes.sources.PlasmaBlob` or
-`~plasmapy.classes.sources.Plasma3D` (see :ref:`plasma-sources` to see
+`~plasmapy.plasma.Plasma`: ::
+
+    >>> x = plasmapy.plasma.Plasma(T_e=T_e,
+    ...                            n_e=n_e,
+    ...                            Z=Z,
+    ...                            particle=particle)  # doctest: +SKIP
+
+The result of a call to `~plasmapy.plasma.Plasma` will be either a
+`~plasmapy.plasma.GenericPlasma` object, or a subclass of
+`~plasmapy.plasma.GenericPlasma` which deals with a specific type of
+data, e.g. `~plasmapy.plasma.sources.PlasmaBlob` or
+`~plasmapy.plasma.sources.Plasma3D` (see :ref:`plasma-sources` to see
 a list of all of them).
 
-.. autoclass:: plasmapy.classes.plasma_factory.PlasmaFactory
+.. autoclass:: plasmapy.plasma.plasma_factory.PlasmaFactory
 
 Using Plasma Objects
 --------------------
 
-Once a Plasma object has been created using `~plasmapy.classes.Plasma`
+Once a Plasma object has been created using `~plasmapy.plasma.Plasma`
 it will be a instance or a subclass of the
-`~plasmapy.classes.GenericPlasma` class. The documentation of
-`~plasmapy.classes.GenericPlasma` lists the attributes and methods that
+`~plasmapy.plasma.GenericPlasma` class. The documentation of
+`~plasmapy.plasma.GenericPlasma` lists the attributes and methods that
 are available on all Plasma objects.
 
-.. _plasma-classes:
+.. _plasma-plasma:
 
 Plasma Classes
 --------------
-Defined in `plasmapy.classes.sources` are a set of
-`~plasmapy.classes.GenericPlasma` subclassesmwhich convert the keyword
-arguments data to the standard `~plasmapy.classes.GenericPlasma`
+Defined in `plasmapy.plasma.sources` are a set of
+`~plasmapy.plasma.GenericPlasma` subclasses which convert the keyword
+arguments data to the standard `~plasmapy.plasma.GenericPlasma`
 interface. These subclasses also provide a method, which describes to
-the `Plasma <plasmapy.classes.plasma_factory.PlasmaFactory>` factory
+the `Plasma <plasmapy.plasma.plasma_factory.PlasmaFactory>` factory
 which the data match its plasma data structure.
 
-.. automodapi:: plasmapy.classes
+.. automodapi:: plasmapy.plasma
     :no-main-docstr:
     :no-heading:
 
@@ -68,30 +68,48 @@ which the data match its plasma data structure.
 Plasma Subclasses
 -----------------
 
-.. toctree::
-    sources
+The :class:`Plasma3D` class is a basic structure to contain spatial
+information about a plasma.  To initialize a Plasma3D system, first
+create an instance of the :class:`Plasma3D` class and then set the
+:attr:`Plasma3D.density`, :attr:`Plasma3D.momentum`,
+:attr:`Plasma3D.pressure` and the :attr:`Plasma3D.magnetic_field`.
+
+This feature is currently under development.
+
+The :class:`PlasmaBlob` class is a basic structure to contain just
+plasma parameter information about a plasma with no associated
+spatial or temporal scales.  To initialize a PlasmaBlob system, call
+it with arguments: electron temperature :attr:`PlasmaBlob.T_e`,
+and electron density :attr:`PlasmaBlob.n_e`. You may also optionally
+define the ionization, :attr:`PlasmaBlob.Z`, and relevant plasma
+particle, :attr:`PlasmaBlob.particle`.
+
+This feature is currently under development.
+
+.. automodapi:: plasmapy.plasma.sources
+   :no-heading:
 
 Writing a new Plasma subclass
 --------------------------------
 
-Any subclass of `~plasmapy.classes.GenericPlasma` which defines a method
-named `~plasmapy.classes.GenericPlasma.is_datasource_for` will
+Any subclass of `~plasmapy.plasma.GenericPlasma` which defines a method
+named `~plasmapy.plasma.GenericPlasma.is_datasource_for` will
 automatically be registered with the
-`Plasma <plasmapy.classes.plasma_factory.PlasmaFactory>` factory. The
+`Plasma <plasmapy.plasma.plasma_factory.PlasmaFactory>` factory. The
 ``is_datasource_for`` method describes the form of the data for which
-the `~plasmapy.classes.GenericPlasma` subclass is valid. For example,
+the `~plasmapy.plasma.GenericPlasma` subclass is valid. For example,
 it might check the number and types of keyword arguments. This makes it
-straightforward to define your own `~plasmapy.classes.GenericPlasma`
+straightforward to define your own `~plasmapy.plasma.GenericPlasma`
 subclass for a new data structure or a custom data source like simulated
 data. These classes only have to be imported for this to work, as
 demonstrated by the following example.
 
 .. code-block:: python
 
-    import plasmapy.classes
+    import plasmapy.plasma
     import astropy.units as u
 
-    class FuturePlasma(plasmapy.classes.GenericPlasma):
+    class FuturePlasma(plasmapy.plasma.GenericPlasma):
         def __init__(self, **kwargs):
 
             super(FuturePlasma, self).__init__(**kwargs)
@@ -114,7 +132,7 @@ demonstrated by the following example.
 
 
 This class will now be available through the
-`Plasma <plasmapy.classes.plasma_factory.PlasmaFactory>` factory as long
+`Plasma <plasmapy.plasma.plasma_factory.PlasmaFactory>` factory as long
 as this class has been defined, i.e. imported into the current session.
 
 If you do not want to create a method named ``is_datasource_for`` you
@@ -123,6 +141,6 @@ method.
 
 .. code-block:: python
 
-    import plasmapy.classes
+    import plasmapy.plasma
 
-    plasmapy.classes.Plasma.register(FuturePlasma, FuturePlasma.some_matching_method)
+    plasmapy.plasma.Plasma.register(FuturePlasma, FuturePlasma.some_matching_method)
diff --git a/docs/plasma/sources.rst b/docs/plasma/sources.rst
deleted file mode 100644
index 1630ac53..00000000
--- a/docs/plasma/sources.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-.. _plasma:
-
-**********************************************
-Plasma Subclasses (`plasmapy.classes.sources`)
-**********************************************
-
-Introduction
-============
-
-The :class:`Plasma3D` class is a basic structure to contain spatial
-information about a plasma.  To initialize a Plasma3D system, first
-create an instance of the :class:`Plasma3D` class and then set the
-:attr:`Plasma3D.density`, :attr:`Plasma3D.momentum`,
-:attr:`Plasma3D.pressure` and the :attr:`Plasma3D.magnetic_field`.
-
-This feature is currently under development.
-
-The :class:`PlasmaBlob` class is a basic structure to contain just
-plasma parameter information about a plasma with no associated
-spatial or temporal scales.  To initialize a PlasmaBlob system, call
-it with arguments: electron temperature :attr:`PlasmaBlob.T_e`,
-and electron density :attr:`PlasmaBlob.n_e`. You may also optionally
-define the ionization, :attr:`PlasmaBlob.Z`, and relevant plasma
-particle, :attr:`PlasmaBlob.particle`.
-
-This feature is currently under development.
-
-Reference/API
-=============
-
-.. automodapi:: plasmapy.classes.sources
-   :no-heading:
diff --git a/plasmapy/__init__.py b/plasmapy/__init__.py
index 842a50f4..1224328f 100644
--- a/plasmapy/__init__.py
+++ b/plasmapy/__init__.py
@@ -18,7 +18,7 @@
 ::
 
  particles                         --- Database for atoms, isotopes, ions...
- classes                           --- (WIP) classes used in multiple places
+ plasma                            --- (WIP) `Plasma` class
  data                              --- Data used for testing and examples
  diagnostics                       --- Experimental research data analysis
  formulary                         --- Plasma theory analysis formulae
diff --git a/plasmapy/classes/__init__.py b/plasmapy/plasma/__init__.py
similarity index 100%
rename from plasmapy/classes/__init__.py
rename to plasmapy/plasma/__init__.py
diff --git a/plasmapy/classes/exceptions.py b/plasmapy/plasma/exceptions.py
similarity index 100%
rename from plasmapy/classes/exceptions.py
rename to plasmapy/plasma/exceptions.py
diff --git a/plasmapy/classes/plasma_base.py b/plasmapy/plasma/plasma_base.py
similarity index 93%
rename from plasmapy/classes/plasma_base.py
rename to plasmapy/plasma/plasma_base.py
index 44fb26c7..06113679 100644
--- a/plasmapy/classes/plasma_base.py
+++ b/plasmapy/plasma/plasma_base.py
@@ -5,7 +5,7 @@
 
 class BasePlasma(ABC):
     """
-    Registration class for `~plasmapy.classes.GenericPlasma` and declares
+    Registration class for `~plasmapy.plasma.GenericPlasma` and declares
     some abstract methods for data common in different kinds of plasmas.
 
     This class checks for the existance of a method named ``is_datasource_for``
@@ -55,7 +55,7 @@ def average_ionization(self):
 class GenericPlasma(BasePlasma):
     """
     A Generic Plasma class. This class contains definitions for abstract
-    methods declared in the `~plasmapy.classes.plasma_base.BaseClass`.
+    methods declared in the `~plasmapy.plasma.plasma_base.BaseClass`.
     """
 
     def __init__(self, **kwargs):
diff --git a/plasmapy/classes/plasma_factory.py b/plasmapy/plasma/plasma_factory.py
similarity index 91%
rename from plasmapy/classes/plasma_factory.py
rename to plasmapy/plasma/plasma_factory.py
index fcdf7b4b..05b3b00c 100644
--- a/plasmapy/classes/plasma_factory.py
+++ b/plasmapy/plasma/plasma_factory.py
@@ -1,4 +1,4 @@
-from plasmapy.classes.plasma_base import GenericPlasma
+from plasmapy.plasma.plasma_base import GenericPlasma
 from plasmapy.utils.datatype_factory_base import (
     BasicRegistrationFactory,
     MultipleMatchError,
diff --git a/plasmapy/classes/sources/__init__.py b/plasmapy/plasma/sources/__init__.py
similarity index 100%
rename from plasmapy/classes/sources/__init__.py
rename to plasmapy/plasma/sources/__init__.py
diff --git a/plasmapy/classes/sources/openpmd_hdf5.py b/plasmapy/plasma/sources/openpmd_hdf5.py
similarity index 97%
rename from plasmapy/classes/sources/openpmd_hdf5.py
rename to plasmapy/plasma/sources/openpmd_hdf5.py
index 0bc28fd2..34262398 100644
--- a/plasmapy/classes/sources/openpmd_hdf5.py
+++ b/plasmapy/plasma/sources/openpmd_hdf5.py
@@ -4,8 +4,8 @@
 import astropy.units as u
 import numpy as np
 
-from plasmapy.classes.exceptions import DataStandardError
-from plasmapy.classes.plasma_base import GenericPlasma
+from plasmapy.plasma.exceptions import DataStandardError
+from plasmapy.plasma.plasma_base import GenericPlasma
 
 _OUTDATED_VERSION = "1.1.0"
 _NEWER_VERSION = "2.0.0"
diff --git a/plasmapy/classes/sources/plasma3d.py b/plasmapy/plasma/sources/plasma3d.py
similarity index 98%
rename from plasmapy/classes/sources/plasma3d.py
rename to plasmapy/plasma/sources/plasma3d.py
index 2e67f77f..3c15ea39 100644
--- a/plasmapy/classes/sources/plasma3d.py
+++ b/plasmapy/plasma/sources/plasma3d.py
@@ -7,9 +7,8 @@
 import astropy.units as u
 import numpy as np
 from astropy.constants import mu0
-
-from plasmapy.classes.plasma_base import GenericPlasma
 from plasmapy.formulary.magnetostatics import MagnetoStatics
+from plasmapy.plasma.plasma_base import GenericPlasma
 
 __all__ = ["Plasma3D"]
 
diff --git a/plasmapy/classes/sources/plasmablob.py b/plasmapy/plasma/sources/plasmablob.py
similarity index 98%
rename from plasmapy/classes/sources/plasmablob.py
rename to plasmapy/plasma/sources/plasmablob.py
index 8160ab2a..d4df9a52 100644
--- a/plasmapy/classes/sources/plasmablob.py
+++ b/plasmapy/plasma/sources/plasmablob.py
@@ -4,12 +4,11 @@
 import warnings
 
 import astropy.units as u
-
-from plasmapy.classes.plasma_base import GenericPlasma
 from plasmapy.formulary.collisions import coupling_parameter
 from plasmapy.formulary.dimensionless import quantum_theta
 from plasmapy.formulary.parameters import _grab_charge
 from plasmapy.particles import particle_mass
+from plasmapy.plasma.plasma_base import GenericPlasma
 from plasmapy.utils import CouplingWarning, call_string
 
 __all__ = ["PlasmaBlob"]


Test patch:
diff --git a/plasmapy/classes/sources/tests/__init__.py b/plasmapy/plasma/sources/tests/__init__.py
similarity index 100%
rename from plasmapy/classes/sources/tests/__init__.py
rename to plasmapy/plasma/sources/tests/__init__.py
diff --git a/plasmapy/classes/sources/tests/test_openpmd_hdf5.py b/plasmapy/plasma/sources/tests/test_openpmd_hdf5.py
similarity index 94%
rename from plasmapy/classes/sources/tests/test_openpmd_hdf5.py
rename to plasmapy/plasma/sources/tests/test_openpmd_hdf5.py
index ca645763..7f28ae1a 100644
--- a/plasmapy/classes/sources/tests/test_openpmd_hdf5.py
+++ b/plasmapy/plasma/sources/tests/test_openpmd_hdf5.py
@@ -1,13 +1,13 @@
+from astropy import units as u
+from typing import Union, Tuple, List
 import os
 from typing import List, Tuple, Union
-
 import pytest
-from astropy import units as u
 
-import plasmapy.classes
-from plasmapy.classes.exceptions import DataStandardError
-from plasmapy.classes.sources import openpmd_hdf5
+from plasmapy.plasma.sources import openpmd_hdf5
+from plasmapy.plasma.exceptions import DataStandardError
 from plasmapy.particles.data.test import data_dir
+import plasmapy.plasma
 
 
 @pytest.fixture(scope="module")
@@ -147,5 +147,5 @@ def test_non_openpmd_hdf5():
 
 
 def test_HDF5Reader(h5_2d):
-    assert isinstance(h5_2d, plasmapy.classes.sources.HDF5Reader)
-    assert isinstance(h5_2d, plasmapy.classes.BasePlasma)
+    assert isinstance(h5_2d, plasmapy.plasma.sources.HDF5Reader)
+    assert isinstance(h5_2d, plasmapy.plasma.BasePlasma)
diff --git a/plasmapy/classes/sources/tests/test_plasma3d.py b/plasmapy/plasma/sources/tests/test_plasma3d.py
similarity index 98%
rename from plasmapy/classes/sources/tests/test_plasma3d.py
rename to plasmapy/plasma/sources/tests/test_plasma3d.py
index bc020c8c..fe55d885 100644
--- a/plasmapy/classes/sources/tests/test_plasma3d.py
+++ b/plasmapy/plasma/sources/tests/test_plasma3d.py
@@ -2,8 +2,8 @@
 import numpy as np
 import pytest
 
-from plasmapy.classes.sources import plasma3d
 from plasmapy.particles.exceptions import InvalidParticleError
+from plasmapy.plasma.sources import plasma3d
 
 
 @pytest.mark.parametrize(
diff --git a/plasmapy/classes/sources/tests/test_plasmablob.py b/plasmapy/plasma/sources/tests/test_plasmablob.py
similarity index 99%
rename from plasmapy/classes/sources/tests/test_plasmablob.py
rename to plasmapy/plasma/sources/tests/test_plasmablob.py
index 85053d0d..03e98d1a 100644
--- a/plasmapy/classes/sources/tests/test_plasmablob.py
+++ b/plasmapy/plasma/sources/tests/test_plasmablob.py
@@ -2,9 +2,9 @@
 import numpy as np
 import pytest
 
-from plasmapy.classes.sources import plasma3d, plasmablob
 from plasmapy.formulary import magnetostatics
 from plasmapy.particles.exceptions import InvalidParticleError
+from plasmapy.plasma.sources import plasma3d, plasmablob
 from plasmapy.utils.exceptions import CouplingWarning
 
 
diff --git a/plasmapy/classes/tests/__init__.py b/plasmapy/plasma/tests/__init__.py
similarity index 100%
rename from plasmapy/classes/tests/__init__.py
rename to plasmapy/plasma/tests/__init__.py
diff --git a/plasmapy/classes/tests/test_plasma_base.py b/plasmapy/plasma/tests/test_plasma_base.py
similarity index 96%
rename from plasmapy/classes/tests/test_plasma_base.py
rename to plasmapy/plasma/tests/test_plasma_base.py
index a45a50de..d05afe4a 100644
--- a/plasmapy/classes/tests/test_plasma_base.py
+++ b/plasmapy/plasma/tests/test_plasma_base.py
@@ -1,4 +1,4 @@
-from plasmapy.classes import BasePlasma, GenericPlasma
+from plasmapy.plasma import BasePlasma, GenericPlasma
 
 # Get rid of any previously registered classes.
 BasePlasma._registry = {}
diff --git a/plasmapy/classes/tests/test_plasma_factory.py b/plasmapy/plasma/tests/test_plasma_factory.py
similarity index 51%
rename from plasmapy/classes/tests/test_plasma_factory.py
rename to plasmapy/plasma/tests/test_plasma_factory.py
index f8564ced..02a4ad25 100644
--- a/plasmapy/classes/tests/test_plasma_factory.py
+++ b/plasmapy/plasma/tests/test_plasma_factory.py
@@ -2,15 +2,14 @@
 
 import astropy.units as u
 import numpy as np
+import plasmapy.plasma
 import pytest
-
-import plasmapy.classes
 from plasmapy.particles.data.test import data_dir
 
 
 @pytest.fixture(scope="module")
 def h5(request):
-    h5 = plasmapy.classes.Plasma(hdf5=os.path.join(data_dir, "data00000255.h5"))
+    h5 = plasmapy.plasma.Plasma(hdf5=os.path.join(data_dir, "data00000255.h5"))
     yield h5
     h5.close()
 
@@ -18,18 +17,18 @@ def h5(request):
 class TestPlasma(object):
     def test_patters(self):
         # Input data whose specific subclass cannot be known
-        generic = plasmapy.classes.Plasma(blablobleh="spam")
-        assert isinstance(generic, plasmapy.classes.GenericPlasma)
+        generic = plasmapy.plasma.Plasma(blablobleh="spam")
+        assert isinstance(generic, plasmapy.plasma.GenericPlasma)
 
     def test_Plasma3D(self):
         # Input data for Plasma3D
-        three_dimensional = plasmapy.classes.Plasma(
+        three_dimensional = plasmapy.plasma.Plasma(
             domain_x=np.linspace(0, 1, 3) * u.m,
             domain_y=np.linspace(0, 1, 3) * u.m,
             domain_z=np.linspace(0, 1, 3) * u.m,
         )
-        assert isinstance(three_dimensional, plasmapy.classes.sources.Plasma3D)
-        assert isinstance(three_dimensional, plasmapy.classes.BasePlasma)
+        assert isinstance(three_dimensional, plasmapy.plasma.sources.Plasma3D)
+        assert isinstance(three_dimensional, plasmapy.plasma.BasePlasma)
 
     def test_PlasmaBlob(self):
         # Input data for PlasmaBlob
@@ -37,6 +36,6 @@ def test_PlasmaBlob(self):
         n_e = 1e26 * u.cm ** -3
         Z = 2.0
         particle = "p"
-        blob = plasmapy.classes.Plasma(T_e=T_e, n_e=n_e, Z=Z, particle=particle)
-        assert isinstance(blob, plasmapy.classes.sources.PlasmaBlob)
-        assert isinstance(blob, plasmapy.classes.BasePlasma)
+        blob = plasmapy.plasma.Plasma(T_e=T_e, n_e=n_e, Z=Z, particle=particle)
+        assert isinstance(blob, plasmapy.plasma.sources.PlasmaBlob)
+        assert isinstance(blob, plasmapy.plasma.BasePlasma)
diff --git a/plasmapy/simulation/tests/test_particletracker.py b/plasmapy/simulation/tests/test_particletracker.py
index 05b0ba55..f80c6359 100644
--- a/plasmapy/simulation/tests/test_particletracker.py
+++ b/plasmapy/simulation/tests/test_particletracker.py
@@ -1,10 +1,11 @@
+import astropy.units as u
 import numpy as np
 import pytest
 from astropy import units as u
-from astropy.modeling import fitting, models
+from astropy.modeling import models, fitting
 from scipy.optimize import curve_fit
 
-from plasmapy.classes.sources import Plasma3D
+from plasmapy.plasma.sources import Plasma3D
 from plasmapy.simulation.particletracker import ParticleTracker