Repository: mikeqfu/pyrcs (language: python)

Issue:
Documentation build on Read the Docs failed
Error message:

> Configuration error:
> There is a programmable error in your configuration file:
> 
> Traceback (most recent call last):
>   File "/home/docs/checkouts/readthedocs.org/user_builds/pyrcs/envs/latest/lib/python3.9/site-packages/sphinx/config.py", line 529, in eval_config_file
>     exec(code, namespace)  # NoQA: S102
>   File "/home/docs/checkouts/readthedocs.org/user_builds/pyrcs/checkouts/latest/docs/source/conf.py", line 195, in <module>
>     affil_dept, affil_sch, affil_univ = __affiliation__.split(', ')
> ValueError: not enough values to unpack (expected 3, got 2)



Discussion / hints:

Fix patch:
diff --git a/.readthedocs.yml b/.readthedocs.yml
index e56f6ad..229bc60 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -9,7 +9,7 @@ version: 2
 build:
   os: ubuntu-22.04
   tools:
-    python: "3.9"
+    python: "3.10"
 
 # Build documentation in the docs/ directory with Sphinx (this is the default documentation type)
 sphinx:
diff --git a/README.md b/README.md
index 623aeae..9a5d77f 100644
--- a/README.md
+++ b/README.md
@@ -15,35 +15,27 @@ With PyRCS, users can leverage Python's power to streamline workflows and enhanc
 
 ## Installation
 
-To install the latest release of pyrcs from [PyPI](https://pypi.org/project/pyrcs/) via [pip](https://pip.pypa.io/en/stable/cli/pip/):
+To install the latest version of pyrcs from [PyPI](https://pypi.org/project/pyrcs/) via [pip](https://pip.pypa.io/en/stable/cli/pip/):
 
 ```bash
-pip install --upgrade pyrcs
+$ pip install --upgrade pyrcs
 ```
 
-Please also refer to [Installation](https://pyrcs.readthedocs.io/en/latest/installation.html) for more information. 
+For more information, see the [Installation](https://pyrcs.readthedocs.io/en/latest/installation.html). 
 
 ## Quick start
 
-For a concise guide on how to utilise PyRCS, we recommend checking out the [quick-start tutorial](https://pyrcs.readthedocs.io/en/latest/quick-start.html), which features multiple illustrative examples for three frequently used code categories in the UK railway system: 
+For a concise guide on how to use PyRCS, check out the [Quick Start](https://pyrcs.readthedocs.io/en/latest/quick-start.html) tutorial, which includes illustrative examples for three frequently-used code categories in the UK railway system: 
 
 * [Location identifiers](http://www.railwaycodes.org.uk/crs/CRS0.shtm) (CRS, NLC, TIPLOC and STANOX codes)
 * [Engineer’s Line References](http://www.railwaycodes.org.uk/elrs/elr0.shtm) (ELRs) and their associated mileage files
-* [Railway station data](http://www.railwaycodes.org.uk/stations/station1.shtm) (mileages, operators and grid coordinates) 
+* [Railway station data](http://www.railwaycodes.org.uk/stations/station1.shtm) (mileages, operators and grid coordinates)
 
 ## Documentation
 
-The complete PyRCS documentation: [[HTML](https://pyrcs.readthedocs.io/en/latest/)\] \[[PDF](https://pyrcs.readthedocs.io/_/downloads/en/latest/pdf/)].
+The complete PyRCS Documentation is available in [HTML](https://pyrcs.readthedocs.io/en/latest/) and [PDF](https://pyrcs.readthedocs.io/_/downloads/en/latest/pdf/) formats.
 
-It is hosted on [ReadTheDocs](https://readthedocs.org/projects/pyrcs/) and provides a wealth of detailed examples.
-
-## License
-
-PyRCS is licensed under [GNU General Public License v3](https://github.com/mikeqfu/pyrcs/blob/master/LICENSE) or later (GPLv3+).
-
-## Acknowledgement
-
-PyRCS uses data available from the [Railway Codes](http://www.railwaycodes.org.uk/index.shtml) website. The time and effort that the website's editor and [all contributors](http://www.railwaycodes.org.uk/misc/acknowledgements.shtm) put in making the site and data available are fully credited.
+It is hosted on [ReadTheDocs](https://readthedocs.org/projects/pyrcs/) and includes detailed usage examples.
 
 ## Cite as
 
@@ -51,34 +43,21 @@ Fu, Q. (2020). PyRCS: an open-source tool for collecting railway codes used in d
 
 ```bibtex
 @software{qian_fu_pyrcs_4026744,
-  author       = {Qian Fu},
-  title        = {{PyRCS: an open-source tool for collecting railway
-                   codes used in different UK rail industry systems}},
-  year         = 2020,
-  publisher    = {Zenodo},
-  doi          = {10.5281/zenodo.4026744},
-  url          = {https://doi.org/10.5281/zenodo.4026744}
+    author = {Qian Fu},
+    title = {{PyRCS: An open-source tool for collecting railway codes used in different UK rail industry systems}},
+    year = 2020,
+    publisher = {Zenodo},
+    doi = {10.5281/zenodo.4026744},
+    url = {https://doi.org/10.5281/zenodo.4026744}
 }
 ```
 
-(Please also refer to the export options from [Zenodo](https://zenodo.org/search?page=1&size=20&q=conceptrecid:%224026744%22&sort=-version&all_versions=True) to reference the specific version of PyRCS as appropriate.)
-
-## Contributors
-
-<!--suppress HtmlDeprecatedAttribute -->
-<table>
-  <tbody>
-    <tr>
-      <td align="center">
-        <a href="https://github.com/mikeqfu" target="_blank"><img src="https://avatars.githubusercontent.com/u/1729711?v=4?s=100" width="100px;" alt="Qian Fu"/><br><sub><b>Qian Fu</b></sub></a><br>
-        <a href="https://github.com/mikeqfu/pyrcs" target="_blank" title="Seeding">🌱</a>
-        <a href="https://github.com/mikeqfu/pyrcs/commits?author=mikeqfu" target="_blank" title="Code">💻</a>
-        <a href="https://github.com/mikeqfu/pyrcs/tree/master/tests" target="_blank" title="Tests">🧪</a>
-        <a href="https://pyrcs.readthedocs.io/en/latest/" target="_blank" title="Documentation">📖</a>
-      </td>
-      <td align="center">
-        <a href="https://github.com/Firtun" target="_blank"><img src="https://avatars.githubusercontent.com/u/75030535?v=4?s=100" width="100px;" alt="Firtun"/><br><sub><b>Firtun</b></sub></a><br>
-        <a href="https://github.com/mikeqfu/pyrcs/commits?author=Firtun" target="_blank" title="Documentation">📖</a>
-      </td>
-  </tbody>
-</table>
+For specific version references of PyRCS, please refer to [Zenodo](https://zenodo.org/search?q=conceptrecid%3A%224026744%22&f=allversions%3Atrue&l=list&p=1&s=10&sort=version).
+
+## License
+
+PyRCS (since v1.0.0) is licensed under the [MIT License](https://github.com/mikeqfu/pyrcs/blob/master/LICENSE).
+
+## Acknowledgement
+
+PyRCS uses data available from the [Railway Codes](http://www.railwaycodes.org.uk/index.shtml) website. The time and effort that the website's editor and [all contributors](http://www.railwaycodes.org.uk/misc/acknowledgements.shtm) put in making the site and data available are fully credited.
diff --git a/docs/source/_static/copy_button.css b/docs/source/_static/copy_button.css
deleted file mode 100644
index 20b7d1b..0000000
--- a/docs/source/_static/copy_button.css
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Copy buttons */
-button.copybtn {
-    position: absolute;
-    display: flex;
-    top: auto;
-    bottom: .5em;  /* 1.5em; */
-    right: .2em;  /* 2.0em; */
-    width: 1.7em;
-    height: 1.7em;
-	opacity: 0;
-    transition: opacity 0.3s, border .3s, background-color .3s;
-    user-select: none;
-    padding: 0;
-    border: none;  /* #e1e1e1 1px solid; */
-    outline: none;
-    border-radius: 0.4em;
-    background-color: rgb(245, 245, 245);
-}
-
-button.copybtn.success {
-    border-color: #22863a;
-}
-
-button.copybtn img {
-    width: 100%;
-    padding: .2em;
-}
-
-div.highlight  {
-    position: relative;
-}
-
-.highlight:hover button.copybtn {
-	opacity: 1;
-}
-
-.highlight button.copybtn:hover {
-    background-color: rgb(235, 235, 235);
-}
-
-.highlight button.copybtn:active {
-    background-color: rgb(187, 187, 187);
-}
-
-/**
- * A minimal CSS-only tooltip copied from:
- *   https://codepen.io/mildrenben/pen/rVBrpK
- *
- * To use, write HTML like the following:
- *
- * <p class="o-tooltip--left" data-tooltip="Hey">Short</p>
- */
- .o-tooltip--left {
-  position: relative;
- }
-
- .o-tooltip--left:after {
-    opacity: 0;
-    visibility: hidden;
-    position: absolute;
-    content: attr(data-tooltip);
-    padding: .2em;
-    font-size: .8em;
-    left: -.2em;
-    background: grey;
-    color: white;
-    white-space: nowrap;
-    z-index: 2;
-    border-radius: 2px;
-    transform: translateX(-102%) translateY(0);
-    transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1);
-}
-
-.o-tooltip--left:hover:after {
-    display: block;
-    opacity: 1;
-    visibility: visible;
-    transform: translateX(-100%) translateY(0);
-    transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1);
-    transition-delay: .5s;
-}
diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css
new file mode 100644
index 0000000..fa45c08
--- /dev/null
+++ b/docs/source/_static/custom.css
@@ -0,0 +1,260 @@
+@media screen and (min-width: 767px) {
+    body {
+        --color-code-background: ivory !important;
+        --color-api-name: firebrick;
+        --color-api-pre-name: firebrick;
+        --color-sidebar-link-text--top-level: var(--color-foreground-secondary);
+        --color-toc-item-text--active: steelblue;
+        /*--code-font-size: var(--font-size--small--3);*/
+    }
+
+    h1 {
+        font-size: 1.65em;
+        color: var(--color-toc-item-text--active);
+    }
+
+    .content-icon-container {
+        align-items: center;
+    }
+
+    .content-icon-container .edit-this-page svg,
+    .content-icon-container .view-this-page svg {
+        display: none;
+    }
+
+    h2 {
+        font-size: 1.35em;
+        margin-bottom: 0.75em;
+        margin-top: 1.65em;
+        color: var(--color-toc-item-text--active);
+    }
+
+    h2+p {
+        margin-top: -0.5em;
+        margin-bottom: 1.5em;
+    }
+
+    ul.simple {
+        line-height: 1.2rem;
+    }
+
+    h3 {
+        font-size: 1.05em;
+    }
+
+    .content {
+        width: 47em;
+    }
+
+    footer {
+        font-size: var(--font-size--normal) !important;
+        margin-right: -0.8em;
+    }
+
+    .related-pages a.prev-page {
+        margin-left: -0.7em;
+    }
+
+    .related-pages a.next-page {
+        margin-right: -0.8em;
+    }
+
+    .bottom-of-page .icons {
+        font-size: 1.3rem;
+        gap: 0.5rem;
+    }
+
+    .toc-title {
+        font-size: large;
+    }
+
+    .toc-tree a.reference {
+        font-size: medium;
+        color: #405D72;
+    }
+
+    .toctree-wrapper.compound .caption,
+    .toctree-wrapper.compound :not(.caption)>.caption-text {
+        margin-top: 1em;
+        margin-bottom: 0.5em;
+        text-transform: none;
+        font-size: larger;
+        font-weight: 700;
+        color: var(--color-toc-item-text--active);
+    }
+
+    .sidebar-brand-text {
+        color: cadetblue;
+        font-size: 1.3rem;
+        font-weight: bold;
+    }
+
+    .sidebar-tree li {
+        font-size: initial;
+    }
+
+    .sidebar-tree li.toctree-l3 {
+        font-size: var(--font-size--small) !important;
+    }
+
+    .sidebar-tree li.toctree-l4 {
+        font-size: var(--font-size--small) !important;
+    }
+
+    .sidebar-tree .caption, .sidebar-tree :not(.caption)>.caption-text {
+        font-size: medium;
+        color: cadetblue;
+    }
+
+    .sidebar-tree .reference {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        word-break: normal;
+    }
+
+    p .sig-inline,
+    p code.literal {
+        font-size: var(--font-size--small);
+        color: chocolate;
+        font-weight: 550;
+    }
+
+    .sig-inline, code.literal {
+        font-size: var(--font-size--small);
+    }
+
+    .sig-param {
+        font-style: italic;
+        color: darkgoldenrod;
+    }
+
+    dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt {
+        font-size: medium;
+    }
+
+    dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child {
+        margin-top: 0.5rem;
+        margin-bottom: 1.5rem;
+    }
+
+    div.highlight {
+        background-color: ivory;
+        font-size: 1.1em;
+        width: 42em;
+    }
+
+    p.rubric {
+        font-size: 0.95em;
+        margin-top: 2.0em;
+        margin-bottom: -0.75em;
+        color: steelblue;
+    }
+
+    .autosummary table {
+        text-align: left;
+        vertical-align: top;
+        margin-left: 0;
+        width: auto;
+    }
+
+    .autosummary td, .autosummary th {
+        vertical-align: top;
+    }
+
+    figcaption {
+        padding-bottom: 1.75em;
+    }
+
+    dl dd p.rubric {
+        font-weight: 700;
+        margin-top: 0;
+        margin-bottom: -1.0em;
+        font-size: var(--font-size--normal);
+    }
+
+    dd p.rubric {
+        line-height: 2.0;
+    }
+
+    dl dd p strong {
+        text-transform: uppercase;
+        font-size: var(--font-size--normal);
+        font-weight: 700;
+    }
+
+    .field-list dt,
+    .option-list dt,
+    dl.footnote dt,
+    dl.glossary dt,
+    dl.simple dt,
+    dl:not([class]) dt {
+        font-weight: 700;
+        font-size: var(--font-size--normal) !important;
+        margin-top: 2.0em;
+    }
+
+    ul.simple li p strong,
+    dd dl.field-list.simple dd p strong {
+        text-transform: none;
+        font-size: unset;
+        font-weight: 500;
+        font-style: italic;
+        color: darkgoldenrod;
+    }
+
+    span.examples-colon {
+        /*color: navy;*/
+        font-weight: 700;
+    }
+
+    .admonition p.admonition-title, p.topic-title {
+        font-size: 0.95em;
+    }
+
+    .admonition p.admonition-title:before, p.topic-title:before {
+        height: 1.05rem;
+        width: 1.05rem;
+    }
+
+    div.admonition {
+        font-size: 0.95em;
+        width: 46em;
+    }
+
+    span.caption-number:after {
+       content: ": ";
+       margin-left: -0.25em;
+    }
+
+    .wy-table-responsive table td,
+    .wy-table-responsive table th {
+        white-space: normal !important;
+    }
+
+    table colgroup col {
+        width: auto !important;
+    }
+
+    .wy-table-responsive {
+        overflow: visible !important;
+    }
+
+    .wy-nav-content {
+        max-width: 110% !important;
+    }
+
+    pre.literal-block {
+        margin-top: -0.8rem;
+        width: 44.5rem;
+    }
+
+    .highlight button.copybtn {
+        height: 0.45em;
+        right: 0.15em;
+    }
+
+    sub {
+        vertical-align: super;
+    }
+}
diff --git a/docs/source/_static/custom.js b/docs/source/_static/custom.js
new file mode 100644
index 0000000..21f69d0
--- /dev/null
+++ b/docs/source/_static/custom.js
@@ -0,0 +1,31 @@
+document.addEventListener("DOMContentLoaded", function() {
+
+    // Function to add a styled colon after specific headers
+    function addStyledColonAfterHeaders(headers, headerTexts) {
+        headers.forEach(function(header) {
+            if (header && header.nextSibling && header.nextSibling.nodeType === Node.TEXT_NODE &&
+                    header.nextSibling.textContent.trim() === ":") {
+                header.parentNode.removeChild(header.nextSibling);
+            }
+            if (headerTexts.includes(header.textContent.trim())) {
+                var colonSpan = document.createElement("span");
+                colonSpan.textContent = ":";
+                colonSpan.classList.add("examples-colon"); // Optional: Add a class for styling
+                header.parentNode.insertBefore(colonSpan, header.nextSibling);
+            }
+        });
+    }
+
+    // Apply the function to the examples headers
+    var examplesHeaders = document.querySelectorAll("p > strong");
+    addStyledColonAfterHeaders(examplesHeaders, ["Examples", "Illustration", "Define a proxy object that inherits from this class"]);
+
+    // Add a colon to rubric paragraphs
+    var rubricParagraphs = document.querySelectorAll("p.rubric");
+    rubricParagraphs.forEach(function(paragraph) {
+        if (!paragraph.textContent.trim().endsWith(":")) {
+            paragraph.textContent = paragraph.textContent.trim() + ":";
+        }
+    });
+
+});
diff --git a/docs/source/_static/prompt_button.js b/docs/source/_static/prompt_button.js
deleted file mode 100644
index 3806b53..0000000
--- a/docs/source/_static/prompt_button.js
+++ /dev/null
@@ -1,64 +0,0 @@
-$(document).ready(function() {
-    /* Add a [>>>] button on the top-right corner of code samples to hide
-     * the >>> and ... prompts and the output and thus make the code
-     * copyable.
-     * Resource: https://docs.python.org/3/_static/copybutton.js */
-    let div = $('.highlight-python .highlight,' +
-                '.highlight-python3 .highlight,' +
-                '.highlight-pycon .highlight,' +
-                '.highlight-default .highlight');
-    let pre = div.find('pre');
-
-    // get the styles from the current theme
-    pre.parent().parent().css('position', 'relative');
-    let hide_text = 'Hide the prompts and output';
-    let show_text = 'Show the prompts and output';
-    let border_width = pre.css('border-top-width');
-    let border_style = pre.css('border-top-style');
-    let border_color = pre.css('border-top-color');
-    let button_styles = {
-        'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0',
-        'border-color': border_color, 'border-style': border_style,
-        'border-width': border_width, 'color': border_color, 'text-size': '75%',
-        'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em',
-        'border-radius': '0 3px 0 0'
-    }
-
-    // create and add the button to all the code blocks that contain >>>
-    div.each(function() {
-        let jthis = $(this);
-        if (jthis.find('.gp').length > 0) {
-            let button = $('<span class="prompt_button">&gt;&gt;&gt;</span>');
-            button.css(button_styles)
-            button.attr('title', hide_text);
-            button.data('hidden', 'false');
-            jthis.prepend(button);
-        }
-        // tracebacks (.gt) contain bare text elements that need to be
-        // wrapped in a span to work with .nextUntil() (see later)
-        jthis.find('pre:has(.gt)').contents().filter(function() {
-            return ((this.nodeType === 3) && (this.data.trim().length > 0));
-        }).wrap('<span>');
-    });
-
-    // define the behavior of the button when it's clicked
-    $('.prompt_button').click(function(e){
-        e.preventDefault();
-        let button = $(this);
-        if (button.data('hidden') === 'false') {
-            // hide the code output
-            button.parent().find('.go, .gp, .gt').hide();
-            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
-            button.css('text-decoration', 'line-through');
-            button.attr('title', show_text);
-            button.data('hidden', 'true');
-        } else {
-            // show the code output
-            button.parent().find('.go, .gp, .gt').show();
-            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
-            button.css('text-decoration', 'none');
-            button.attr('title', hide_text);
-            button.data('hidden', 'false');
-        }
-    });
-});
diff --git a/docs/source/_static/rtd_overrides.css b/docs/source/_static/rtd_overrides.css
deleted file mode 100644
index f0f7149..0000000
--- a/docs/source/_static/rtd_overrides.css
+++ /dev/null
@@ -1,22 +0,0 @@
-@media screen and (min-width: 767px) {
-
-   .wy-table-responsive table td,
-   .wy-table-responsive table th {
-      /* !important prevents the common CSS stylesheets from overriding
-         this as on RTD they are loaded after this stylesheet */
-      white-space: normal !important;
-   }
-
-   .wy-table-responsive {
-      overflow: visible !important;
-   }
-
-   .wy-nav-content {
-      max-width: 72% !important;
-   }
-
-   code.literal {
-    color: #404040 !important;
-    background-color: #fbfbfb !important;
-   }
-}
\ No newline at end of file
diff --git a/docs/source/_templates/breadcrumbs.html b/docs/source/_templates/breadcrumbs.html
deleted file mode 100644
index 339f008..0000000
--- a/docs/source/_templates/breadcrumbs.html
+++ /dev/null
@@ -1,4 +0,0 @@
-{%- extends "sphinx_rtd_theme/breadcrumbs.html" %}
-
-{% block breadcrumbs_aside %}
-{% endblock %}
\ No newline at end of file
diff --git a/docs/source/_templates/latex.tex_t b/docs/source/_templates/latex.tex_t
deleted file mode 100644
index 21c328d..0000000
--- a/docs/source/_templates/latex.tex_t
+++ /dev/null
@@ -1,92 +0,0 @@
-%% Generated by Sphinx.
-\def\sphinxdocclass{<%= docclass %>}
-<% if latex_engine == 'lualatex' -%>
-\IfFileExists{luatex85.sty}
- {\RequirePackage{luatex85}}
- {\ifdefined\luatexversion\ifnum\luatexversion>84\relax
-  \PackageError{sphinx}
-  {** With this LuaTeX (\the\luatexversion),Sphinx requires luatex85.sty **}
-  {** Add the LaTeX package luatex85 to your TeX installation, and try again **}
-  \endinput\fi\fi}
-<% endif -%>
-\documentclass[<%= papersize %>,<%= pointsize %><%= classoptions %>]{<%= wrapperclass %>}
-\usepackage[table]{xcolor}
-\definecolor{anti-flashwhite}{rgb}{0.95, 0.95, 0.96}
-\ifdefined\pdfpxdimen
-   \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
-\fi \sphinxpxdimen=<%= pxunit %>\relax
-<% if use_xindy -%>
-%% turn off hyperref patch of \index as sphinx.xdy xindy module takes care of
-%% suitable \hyperpage mark-up, working around hyperref-xindy incompatibility
-\PassOptionsToPackage{hyperindex=false}{hyperref}
-<% endif -%>
-<%= passoptionstopackages %>
-\PassOptionsToPackage{warn}{textcomp}
-<%= inputenc %>
-<%= utf8extra %>
-<%= cmappkg %>
-<%= fontenc %>
-<%= amsmath %>
-<%= multilingual %>
-<%= substitutefont %>
-<%= textcyrillic %>
-<%= fontpkg %>
-<%= textgreek %>
-<%= fncychap %>
-\usepackage<%= sphinxpkgoptions %>{sphinx}
-<%= sphinxsetup %>
-<%= fvset %>
-<%= geometry %>
-<%= extrapackages %>
-
-<%- for name, option in packages %>
-<%- if option %>
-\usepackage[<%= option %>]{<%= name %>}
-<%- else %>
-\usepackage{<%= name %>}
-<%- endif %>
-<%- endfor %>
-
-<%= hyperref %>
-<%- for name, option in packages_after_hyperref %>
-<%- if option %>
-\usepackage[<%= option %>]{<%= name %>}
-<%- else %>
-\usepackage{<%= name %>}
-<%- endif %>
-<%- endfor %>
-
-<%= contentsname %>
-\usepackage{sphinxmessages}
-<%= tocdepth %>
-<%= secnumdepth %>
-<%= preamble %>
-
-\title{<%= title %>}
-\date{<%= date %>}
-\release{<%= release %>}
-\author{<%= author %>}
-<%- if logofilename %>
-\newcommand{\sphinxlogo}{\sphinxincludegraphics{<%= logofilename %>}\par}
-<%- else %>
-\newcommand{\sphinxlogo}{\vbox{}}
-<%- endif %>
-<%- if releasename or release %>
-\renewcommand{\releasename}{<%= releasename or _('Release') | e %>}
-<%- else %>
-\renewcommand{\releasename}{}
-<%- endif %>
-<%= makeindex %>
-\begin{document}
-<%= shorthandoff %>
-\pagestyle{empty}
-<%= maketitle %>
-\pagestyle{plain}
-<%= tableofcontents %>
-\pagestyle{normal}
-<%= body %>
-<%= atendofbody %>
-<%= indices %>
-\renewcommand{\indexname}{<%= _('Index') | e %>}
-<%= printindex %>
-\end{document}
diff --git a/docs/source/_templates/longtable.tex_t b/docs/source/_templates/longtable.tex_t
deleted file mode 100644
index d2b8531..0000000
--- a/docs/source/_templates/longtable.tex_t
+++ /dev/null
@@ -1,34 +0,0 @@
-\begin{savenotes}\sphinxatlongtablestart\begin{longtable}
-<%- if table.align in ('center', 'default') -%>
-  [c]
-<%- elif table.align == 'left' -%>
-  [l]
-<%- elif table.align == 'right' -%>
-  [r]
-<%- endif -%>
-{\X{5}{10}\X{5}{10}}  % <%= table.get_colspec() %>
-<%- if table.caption -%>
-\sphinxthelongtablecaptionisattop
-\caption{<%= ''.join(table.caption) %>\strut}<%= labels %>\\*[\sphinxlongtablecapskipadjust]
-\hline
-<% elif labels -%>
-\hline\noalign{\phantomsection<%= labels %>}%
-<% else -%>
-\hline
-<% endif -%>
-<%= ''.join(table.header) %>
-\endfirsthead
-
-\multicolumn{<%= table.colcount %>}{c}%
-{\makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} <%= _('continued from previous page') %>}}}\\
-\hline
-<%= ''.join(table.header) %>
-\endhead
-
-\hline
-\multicolumn{<%= table.colcount %>}{r}{\makebox[0pt][r]{\sphinxtablecontinued{<%= _('continues on next page') %>}}}\\
-\endfoot
-
-\endlastfoot
-<%= ''.join(table.body) %>
-\end{longtable}\sphinxatlongtableend\end{savenotes}
diff --git a/docs/source/_templates/module.rst b/docs/source/_templates/module.rst
new file mode 100644
index 0000000..a6011fb
--- /dev/null
+++ b/docs/source/_templates/module.rst
@@ -0,0 +1,25 @@
+{{ module | escape | underline }}
+
+.. currentmodule:: {{ fullname }}
+
+.. automodule:: {{ fullname }}
+
+{% if functions %}
+.. rubric:: Functions
+.. autosummary::
+    :template: function.rst
+    :toctree: .
+    {% for function in functions %}
+    {{ function }}
+    {% endfor %}
+{% endif %}
+{% if classes %}
+.. rubric:: Classes
+.. autosummary::
+    :template: class.rst
+    :toctree: .
+    {% for class in classes %}
+    {{ class }}
+    {% endfor %}
+{% endif %}
+
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 9e4be1b..62cbe4c 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -11,8 +11,8 @@
 sys.path.insert(0, os.path.abspath('../../pyrcs/other_assets'))
 
 # == Project information ===========================================================================
-from pyrcs import __affiliation__, __author__, __copyright__, __description__, __first_release_date__, \
-    __pkgname__, __project__, __version__
+from pyrcs import (__affil__, __author__, __copyright__, __desc__, __first_release__,
+                   __pkgname__, __project__, __version__)
 
 # General information about the project:
 project = __project__
@@ -23,21 +23,37 @@
 release = version  # The full version, including alpha/beta/rc tags
 
 # == General configuration =========================================================================
+import inspect
+import requests
+import warnings
+import pyrcs
+
 extensions = [  # Sphinx extension module names, which can be named 'sphinx.ext.*' or custom ones:
     'sphinx.ext.autodoc',
     'sphinx.ext.autosummary',
     'sphinx.ext.autosectionlabel',
     'sphinx.ext.extlinks',
+    'sphinx.ext.githubpages',
     'sphinx.ext.intersphinx',
     'sphinx.ext.inheritance_diagram',
-    'sphinx.ext.githubpages',
-    'sphinx.ext.todo',
     'sphinx.ext.linkcode',
-    'sphinx.ext.doctest',
-    'sphinx_rtd_theme',
+    'sphinx.ext.napoleon',
+    # 'sphinx.ext.doctest',
+    'sphinx.ext.todo',
     'sphinx_copybutton',
+    'sphinx_new_tab_link',
+    'sphinx_toggleprompt',
+    # "IPython.sphinxext.ipython_console_highlighting",
+    # "IPython.sphinxext.ipython_directive",
 ]
 
+# Validate URL for 'linkcode'
+main_url_ = f'https://github.com/mikeqfu/{__pkgname__}/blob'
+main_url = f'{main_url_}/{pyrcs.__version__}/{__pkgname__}'
+response = requests.get(main_url)
+if response.status_code == 404:
+    main_url = f"{main_url_}/master"
+
 
 def linkcode_resolve(domain, info):
     """
@@ -46,11 +62,6 @@ def linkcode_resolve(domain, info):
     (Adapted from https://github.com/pandas-dev/pandas/blob/main/doc/source/conf.py)
     """
 
-    import inspect
-    import warnings
-
-    import pyrcs
-
     if domain != 'py' or not info['module']:
         return None
 
@@ -99,8 +110,7 @@ def linkcode_resolve(domain, info):
     # fn = os.path.relpath(fn, start=os.path.abspath(".."))
     fn = os.path.relpath(fn, start=os.path.dirname(pyrcs.__file__))
 
-    # f"https://github.com/mikeqfu/pyrcs/blob/{pyrcs.__version__}/pyrcs/{fn}{line_spec}"
-    url = f"https://github.com/mikeqfu/pyrcs/blob/master/pyrcs/{fn}{line_spec}"
+    url = f"{main_url}/{fn}{line_spec}"
 
     return url
 
@@ -108,8 +118,8 @@ def linkcode_resolve(domain, info):
 # Enable to reference numbered figures:
 numfig = True
 numfig_secnum_depth = 0
-numfig_format = {'figure': 'Fig. %s', 'table': 'Table %s', 'code-block': 'Code Block %s'}
-numfig_format_caption = {'figure': 'Fig. %s: '}
+numfig_format = {'figure': 'Figure %s', 'table': 'Table %s'}
+numfig_format_caption = {'figure': 'Figure %s:', 'table': 'Table %s:'}
 
 # The language for content autogenerated by Sphinx:
 language = 'en'
@@ -136,12 +146,8 @@ def linkcode_resolve(domain, info):
 autodoc_member_order = 'bysource'
 
 # == Options for HTML and HTMLHelp output ==========================================================
-html_theme = 'sphinx_rtd_theme'  # The theme to use for HTML & HTML Help pages
-
-html_theme_options = {
-    'collapse_navigation': False,
-    'navigation_depth': 4,
-}
+html_theme = 'furo'  # The theme to use for HTML & HTML Help pages  # 'sphinx_rtd_theme'
+html_title = __project__
 
 # Hide/show source link:
 html_copy_source = False
@@ -154,14 +160,68 @@ def linkcode_resolve(domain, info):
 html_static_path = ['_static']
 
 # Add custom CSS:
-html_css_files = ['rtd_overrides.css', 'copy_button.css']
+html_css_files = [
+    'custom.css',
+    "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/fontawesome.min.css",
+    "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/solid.min.css",
+    "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/brands.min.css",
+]
+
+html_theme_options = {
+    "navigation_with_keys": True,
+    "footer_icons": [
+        {
+            "name": "GitHub",
+            "url": f"https://github.com/mikeqfu/{__pkgname__}",
+            "class": "fa-brands fa-github",
+        },
+        {
+            "name": "PyPI",
+            "url": f"https://pypi.org/project/{__pkgname__}/",
+            "class": "fa-brands fa-python",
+        },
+        {
+            "name": "LinkedIn",
+            "url": "https://www.linkedin.com/in/qianfu",
+            "class": "fa-brands fa-linkedin-in",
+        },
+        {
+            "name": "Email",
+            "url": "mailto:q.fu@bham.ac.uk",
+            "class": "fa-regular fa-envelope",
+        },
+        # {
+        #     "name": "Cite",
+        #     "url": "https://zenodo.org/doi/10.5281/zenodo.4026744",
+        #     "class": "fa-solid fa-quote-right",
+        # },
+        # {
+        #     "name": "X",
+        #     "url": "https://x.com/mikeqfu",
+        #     "class": "fa-brands fa-x-twitter fa-solid",
+        # },
+    ],
+}
 
 # Add custom JavaScript:
-html_js_files = ['prompt_button.js']
+html_js_files = ['custom.js']
+
+# Configuration for sphinx-toggleprompt
+toggleprompt_offset_right = -30
 
 # Output file base name for HTML help builder:
 htmlhelp_basename = __project__ + 'doc'  # Default is 'pydoc'.
 
+# Do not execute cells
+jupyter_execute_notebooks = "off"
+
+# Allow myst admonition style
+myst_admonition_enable = True
+
+# Copy code only:
+copybutton_prompt_text = r">>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: "
+copybutton_prompt_is_regexp = True
+
 # == Options for LaTeX output ======================================================================
 from pygments.formatters.latex import LatexFormatter
 from sphinx.highlighting import PygmentsBridge
@@ -178,21 +238,18 @@ def __init__(self, **options):
 # The LaTeX engine to build the docs:
 latex_engine = 'pdflatex'
 
-# The theme that the LaTeX output should use:
-latex_theme = 'manual'
-
 # Grouping the document tree into LaTeX files:
 latex_documents = [
     ('latexindex',  # source start file
      __pkgname__ + '.tex',  # target name
      __project__ + ' Documentation',  # title
      __author__,  # author
-     latex_theme,  # document class ['howto', 'manual', or own class]
+     'manual',  # document class ['howto', 'manual', or own class]
      1  # toctree only
      ),
 ]
 
-affil_dept, affil_sch, affil_univ = __affiliation__.split(', ')
+affil_dept, affil_univ = __affil__.split(', ')
 
 # Custom title page:
 latex_maketitle = r'''
@@ -215,13 +272,12 @@ def __init__(self, **options):
         \LARGE \textbf{{%s}} \par
         \Large \textit{{%s}} \par
         \Large \textit{{%s}} \par
-        \Large \textit{{%s}} \par
 
         \vspace{50mm}
         \Large {{First release:}} \large \textbf{{%s}} \par
         \Large {{Last updated:}} \large \textbf{{\MonthYearFormat\today}} \par
     
-        \vspace{15mm}
+        \vspace{20mm}
         \large \textcopyright \space Copyright %s \par
 
     \end{titlepage}
@@ -241,21 +297,19 @@ def __init__(self, **options):
 
     \clearpage
     \pagenumbering{arabic}
-    ''' % (
-    __project__,
-    __description__.rstrip('.').replace('different UK', 'different \\newline UK'),
-    release,
-    __author__,
-    affil_dept,
-    affil_sch,
-    affil_univ,
-    __first_release_date__,
-    __copyright__)
+    ''' % (__project__,
+           __desc__.replace('different UK', 'different \\newline UK'),
+           __version__,
+           __author__,
+           affil_dept,
+           affil_univ,
+           __first_release__,
+           __copyright__)
 
 latex_preamble = r'''
     \setlength{\headheight}{14pt}
     \DeclareUnicodeCharacter{229E}{\ensuremath{\boxplus}}
-    \setcounter{tocdepth}{3}
+    \setcounter{tocdepth}{2}
     \setcounter{secnumdepth}{2}
     \usepackage{float,textcomp,textgreek,graphicx,blindtext,color,svg,booktabs,newunicodechar}
     \usepackage{datetime}
@@ -278,7 +332,7 @@ def __init__(self, **options):
     \renewenvironment{longtable}
                      {\rowcolors{1}{anti-flashwhite}{white}\oldlongtable}
                      {\endoldlongtable}
-    \usepackage[open]{bookmark}
+    \usepackage[open,openlevel=1]{bookmark}
     \bookmarksetup{numbered}
 
     \addto\captionsenglish{\renewcommand{\contentsname}{Table of Contents}}
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 89b5c60..f4c8d35 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -36,21 +36,28 @@ With PyRCS, users can leverage Python's power to streamline workflows and enhanc
 .. toctree::
     :maxdepth: 1
     :includehidden:
-    :caption: Documentation
+    :caption: Getting Started
 
     installation
-    sub-pkg-and-mod
-    license
-    use-of-data
-    acknowledgement
-    contributors
+    quick-start
 
 .. toctree::
     :maxdepth: 1
     :includehidden:
-    :caption: Tutorial
+    :caption: Usage & Reference
 
-    quick-start
+    subpackages
+    modules
+
+.. toctree::
+    :maxdepth: 1
+    :includehidden:
+    :caption: Additional Info
+
+    license
+    use-of-data
+    acknowledgement
+    contributors
 
 
 Indices
diff --git a/docs/source/latexindex.rst b/docs/source/latexindex.rst
index 05dec23..0f03e16 100644
--- a/docs/source/latexindex.rst
+++ b/docs/source/latexindex.rst
@@ -7,19 +7,26 @@ PyRCS Documentation
 .. toctree::
     :maxdepth: 1
     :includehidden:
-    :caption: Documentation
+    :caption: Getting Started
 
     introduction
     installation
-    sub-pkg-and-mod
-    license
-    use-of-data
-    acknowledgement
-    contributors
+    quick-start
 
 .. toctree::
     :maxdepth: 1
     :includehidden:
-    :caption: Tutorial
+    :caption: Usage & Reference
 
-    quick-start
+    subpackages
+    modules
+
+.. toctree::
+    :maxdepth: 1
+    :includehidden:
+    :caption: Additional Info
+
+    license
+    use-of-data
+    acknowledgement
+    contributors
diff --git a/docs/source/license.rst b/docs/source/license.rst
index f2482cc..fe3f873 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -2,4 +2,5 @@
 License
 =======
 
-PyRCS is licensed under `GNU General Public License v3 <https://github.com/mikeqfu/pyrcs/blob/master/LICENSE>`_ or later (GPLv3+).
+- PyRCS (since v1.0.0) is licensed under the `MIT License <https://github.com/mikeqfu/pyrcs/blob/master/LICENSE>`_.
+- Versions 0.3.7 and earlier are licensed under the `GPLv3+ <https://github.com/mikeqfu/pyrcs/blob/0.3.7/LICENSE>`_ License).
diff --git a/docs/source/modules.rst b/docs/source/modules.rst
new file mode 100644
index 0000000..decc40f
--- /dev/null
+++ b/docs/source/modules.rst
@@ -0,0 +1,26 @@
+.. _pyrcs-modules:
+
+=======
+Modules
+=======
+
+The following modules provide supporting functions and utilities for the subpackages :doc:`line-data` and :doc:`other-assets`.
+
+.. py:module:: pyrcs
+    :no-index:
+
+.. autosummary::
+
+    parser
+    converter
+    collector
+    utils
+
+.. toctree::
+    :maxdepth: 2
+    :hidden:
+
+    parser
+    converter
+    collector
+    utils
diff --git a/docs/source/quick-start.rst b/docs/source/quick-start.rst
index 0fa7615..fce2085 100644
--- a/docs/source/quick-start.rst
+++ b/docs/source/quick-start.rst
@@ -1,73 +1,68 @@
 ===========
-Quick start
+Quick Start
 ===========
 
-To showcase the functionality of PyRCS, this concise tutorial offers a quick guide with examples on how to work with three frequently-used code categories in the UK railway system:
+This brief tutorial provides a step-by-step guide to using PyRCS, highlighting its key functionalities. It demonstrates how to retrieve three key categories of codes used in the UK railway system, which are commonly applied in both practical and research contexts:
 
-- `Location identifiers <http://www.railwaycodes.org.uk/crs/CRS0.shtm>`_ (CRS, NLC, TIPLOC and STANOX codes);
-- `Engineer's Line References (ELRs) <http://www.railwaycodes.org.uk/elrs/elr0.shtm>`_ and their associated mileage files;
-- `Railway station data <http://www.railwaycodes.org.uk/stations/station1.shtm>`_ (mileages, operators and grid coordinates).
+- `Location identifiers`_ (CRS, NLC, TIPLOC and STANOX codes);
+- `Engineer's Line References (ELRs)`_ and their associated mileage files;
+- `Railway station data`_ (mileages, operators and grid coordinates).
 
-The tutorial aims to demonstrate how PyRCS operates by providing practical illustrations and guidance.
+Through practical examples, this tutorial will guide you in understanding how PyRCS works and how to use it effectively.
 
 .. _quickstart-location-identifiers:
 
-Location identifiers
+Location Identifiers
 ====================
 
-The location identifiers, including CRS, NLC, TIPLOC and STANOX codes, are categorised as `line data`_ on the `Railway Codes`_ website. To get these codes via PyRCS, we can use the class :class:`~pyrcs.line_data.LocationIdentifiers`, which is contained in the sub-package :mod:`~pyrcs.line_data`. Let's firstly import the class and create an instance:
+:doc:`< Back to Top <quick-start>` | :ref:`Next > <quickstart-elrs-and-mileages>`
 
-.. _`line data`: http://www.railwaycodes.org.uk/linedatamenu.shtm
-.. _`Railway Codes`: http://www.railwaycodes.org.uk/index.shtml
+The location identifiers, including CRS, NLC, TIPLOC and STANOX codes, are classified as `line data`_ on the `Railway Codes`_ website. To retrieve these codes using PyRCS, we can use the :class:`~pyrcs.line_data.LocationIdentifiers` class, contained in the :mod:`~pyrcs.line_data` subpackage.
 
-.. code-block:: python
+First, let's import the class and create an instance:
 
-    >>> from pyrcs.line_data import LocationIdentifiers  # from pyrcs import LocationIdentifiers
+.. code-block:: python
 
+    >>> from pyrcs.line_data import LocationIdentifiers
+    >>> # Alternatively, from pyrcs import LocationIdentifiers
     >>> lid = LocationIdentifiers()
-
     >>> lid.NAME
     'CRS, NLC, TIPLOC and STANOX codes'
     >>> lid.URL
     'http://www.railwaycodes.org.uk/crs/crs0.shtm'
 
-.. note::
-
-    An alternative way of creating the instance is through the class :class:`~pyrcs.collector.LineData` (see below).
+Alternatively, we can create the instance using the :class:`~pyrcs.collector.LineData` class:
 
 .. code-block:: python
 
-    >>> from pyrcs.collector import LineData  # from pyrcs import LineData
-
+    >>> from pyrcs.collector import LineData
+    >>> # Alternatively, from pyrcs import LineData
     >>> ld = LineData()
     >>> lid_ = ld.LocationIdentifiers
-
     >>> lid.NAME == lid_.NAME
     True
 
 .. note::
 
-    - The instance ``ld`` refers to all classes under the category of `line data`_.
-    - Here ``lid_`` is equivalent to ``lid``.
+    - The instance ``ld`` encompasses all classes within the `line data`_ category.
+    - ``lid_`` is equivalent to ``lid``.
 
 .. _quickstart-location-identifiers-given-initial:
 
-Location identifiers given a specific initial letter
-----------------------------------------------------
+Location identifiers for a specific initial letter
+--------------------------------------------------
 
-Now we can get the codes (in a `pandas.DataFrame`_ type) for all locations beginning with a given letter, by using the method :meth:`LocationIdentifiers.collect_codes_by_initial()<pyrcs.line_data.LocationIdentifiers.collect_codes_by_initial>`. For example, to get the codes for locations whose names begin with ``'A'`` (or ``'a'``):
-
-.. _`pandas.DataFrame`: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
+We can retrieve codes (in `pandas.DataFrame`_ format) for all locations starting with a specific letter using the :meth:`LocationIdentifiers.collect_codes_by_initial()<pyrcs.line_data.LocationIdentifiers.collect_codes_by_initial>` method. This method is case-insensitive. For example, to get the codes for locations whose names begin with the letter ``'A'`` (or ``'a'``):
 
 .. code-block:: python
 
-    >>> loc_a_codes = lid.collect_codes_by_initial(initial='a')  # The input is case-insensitive
+    >>> loc_a_codes = lid.collect_codes_by_initial(initial='a')
     >>> type(loc_a_codes)
     dict
     >>> list(loc_a_codes.keys())
     ['A', 'Additional notes', 'Last updated date']
 
-As demonstrated above, ``loc_a_codes`` is a `dictionary`_ (in `dict`_ type), which has the following *keys*:
+As shown above, ``loc_a_codes`` is a `dictionary`_ (i.e. in `dict`_ format) with the following *keys*:
 
 -  ``'A'``
 -  ``'Additional notes'``
@@ -75,13 +70,9 @@ As demonstrated above, ``loc_a_codes`` is a `dictionary`_ (in `dict`_ type), whi
 
 The corresponding *values* are:
 
--  ``loc_a_codes['A']`` - CRS, NLC, TIPLOC and STANOX codes for the locations whose names begin with ``'A'`` (referring to the table presented on the web page `Locations beginning A`_);
--  ``loc_a_codes['Additional notes']`` - Additional information on the web page (if available);
--  ``loc_a_codes['Last updated date']`` - The date when the web page `Locations beginning A`_ was last updated.
-
-.. _`dictionary`: https://docs.python.org/3/tutorial/datastructures.html#dictionaries
-.. _`dict`: https://docs.python.org/3/library/stdtypes.html#dict
-.. _`Locations beginning A`: http://www.railwaycodes.org.uk/crs/CRSa.shtm
+-  ``loc_a_codes['A']`` - CRS, NLC, TIPLOC and STANOX codes for the locations whose names begin with ``'A'``, referring to the table on the `Locations beginning A`_ web page.
+-  ``loc_a_codes['Additional notes']`` - Any additional information provided on the web page (if available).
+-  ``loc_a_codes['Last updated date']`` - The date when the `Locations beginning A`_ web page was last updated.
 
 A snapshot of the data contained in ``loc_a_codes`` is demonstrated below:
 
@@ -98,16 +89,15 @@ A snapshot of the data contained in ``loc_a_codes`` is demonstrated below:
     3  A483 Road Scheme Supervisors Closed      ...
     4                               Aachen      ...
     [5 rows x 12 columns]
-
     >>> print("Last updated date: {}".format(loc_a_codes['Last updated date']))
-
+    Last updated date: 2024-08-24
 
 .. _quickstart-all-location-identifiers:
 
 All available location identifiers
 ----------------------------------
 
-In addition to the ``'A'`` group of locations, we can use the method :meth:`LocationIdentifiers.fetch_codes()<pyrcs.line_data.LocationIdentifiers.fetch_codes>` to get the codes of all locations (with the initial letters ranging from ``'A'`` to ``'Z'``) available in this category:
+Beyond retrieving location codes for a specific letter, we can use the :meth:`LocationIdentifiers.fetch_codes()<pyrcs.line_data.LocationIdentifiers.fetch_codes>` method to obtain codes for all locations with names starting from ``'A'`` to ``'Z'``:
 
 .. code-block:: python
 
@@ -117,7 +107,7 @@ In addition to the ``'A'`` group of locations, we can use the method :meth:`Loca
     >>> list(loc_codes.keys())
     ['LocationID', 'Other systems', 'Additional notes', 'Last updated date']
 
-``loc_codes`` is also in a `dictionary`_, of which the *keys* are as follows:
+The ``loc_codes`` object is a dictionary with the following *keys*:
 
 -  ``'LocationID'``
 -  ``'Other systems'``
@@ -126,33 +116,40 @@ In addition to the ``'A'`` group of locations, we can use the method :meth:`Loca
 
 The corresponding *values* are:
 
--  ``loc_codes['LocationID']`` - CRS, NLC, TIPLOC and STANOX codes for all locations available on the relevant web pages ranging from ``'A'`` to ``'Z'``;
--  ``loc_codes['Other systems']`` - Relevant codes of the `Other systems`_;
--  ``loc_codes['Additional notes']`` - Additional notes and information (if available);
--  ``loc_codes['Latest update date']`` - The latest ``'Last updated date'`` among all initial-specific codes.
-
-.. _`Other systems`: http://www.railwaycodes.org.uk/crs/CRS1.shtm
+-  ``loc_codes['LocationID']`` - CRS, NLC, TIPLOC, and STANOX codes for all locations listed across the relevant web pages.
+-  ``loc_codes['Other systems']`` - Codes related to the `other systems`_.
+-  ``loc_codes['Additional notes']`` - Any additional notes and information (if available).
+-  ``loc_codes['Latest update date']`` - The latest ``'Last updated date'`` across all initial-specific data.
 
-A snapshot of the data contained in ``loc_codes`` is demonstrated below:
+Here is a snapshot of the data contained in ``loc_codes``:
 
 .. code-block:: python
 
     >>> lid.KEY
     'LocationID'
-
     >>> loc_codes_dat = loc_codes[lid.KEY]  # loc_codes['LocationID']
     >>> type(loc_codes_dat)
     pandas.core.frame.DataFrame
-    >>> loc_codes_dat.head()
-                                  Location CRS  ... STANME_Note STANOX_Note
-    0                 1999 Reorganisations      ...
-    1                                   A1      ...
-    2                       A463 Traded In      ...
-    3  A483 Road Scheme Supervisors Closed      ...
-    4                               Aachen      ...
+    >>> loc_codes_dat.tail()
+                    Location CRS     NLC  ... TIPLOC_Note STANME_Note STANOX_Note
+    59783  Zone U3456 London      083900  ...
+    59784     Zone U4 London      084100  ...
+    59785    Zone U56 London      084700  ...
+    59786            ZNGHTYK              ...
+    59787            ZZWMNST              ...
     [5 rows x 12 columns]
+    >>> loc_codes_dat[['Location', 'Location_Note']].tail()
+                    Location    Location_Note
+    59783  Zone U3456 London
+    59784     Zone U4 London
+    59785    Zone U56 London
+    59786            ZNGHTYK  see Naughty Kid
+    59787            ZZWMNST  see Westminster
+
+To access codes from other systems, such as Crossrail or the Tyne & Wear Metro:
+
+.. code-block:: python
 
-    >>> # Relevant codes of the 'Other systems'
     >>> lid.KEY_TO_OTHER_SYSTEMS
     'Other systems'
     >>> os_codes_dat = loc_codes[lid.KEY_TO_OTHER_SYSTEMS]
@@ -167,7 +164,10 @@ A snapshot of the data contained in ``loc_codes`` is demonstrated below:
      'Translink (Northern Ireland)',
      'Tyne & Wear Metro']
 
-    >>> # Take 'Crossrail' as an example
+For example, to view the data for Crossrail:
+
+.. code-block:: python
+
     >>> crossrail_codes_dat = os_codes_dat['Crossrail']
     >>> type(crossrail_codes_dat)
     pandas.core.frame.DataFrame
@@ -186,14 +186,15 @@ A snapshot of the data contained in ``loc_codes`` is demonstrated below:
 ELRs and mileages
 =================
 
-`Engineer's Line References (ELRs)`_ are also frequently seen among various data in Britain's railway system. To get the codes of ELRs (and their associated mileage files), we can use the class :class:`~pyrcs.line_data.ELRMileages`:
+:ref:`< Previous <quickstart-location-identifiers>` | :doc:`Back to Top <quick-start>` | :ref:`Next > <quickstart-railway-station-data>`
 
-.. code-block:: python
+`Engineer's Line References (ELRs)`_ are also commonly encountered in various data sets within the UK's railway system. To retrieve the codes for ELRs along with their associated mileage files, we can use the :class:`~pyrcs.line_data.ELRMileages` class:
 
-    >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
+.. code-block:: python
 
+    >>> from pyrcs.line_data import ELRMileages
+    >>> # Alternatively, from pyrcs import ELRMileages
     >>> em = ELRMileages()
-
     >>> em.NAME
     "Engineer's Line References (ELRs)"
     >>> em.URL
@@ -204,29 +205,27 @@ ELRs and mileages
 Engineer's Line References (ELRs)
 ---------------------------------
 
-Similar to the location identifiers, the codes of ELRs on the `Railway Codes`_ website are also alphabetically arranged given their initial letters. We can use the method :meth:`ELRMileages.collect_elr_by_initial()<pyrcs.line_data.ELRMileages.collect_elr_by_initial>` to get the data of ELRs which begin with a specific initial letter. Let's take ``'A'`` as an example:
+Similar to location identifiers, the ELR codes on the `Railway Codes`_ website are arranged alphabetically based on their initial letters. We can use the :meth:`ELRMileages.collect_elr_by_initial()<pyrcs.line_data.ELRMileages.collect_elr_by_initial>` method to obtain ELRs starting with a specific letter. For example, to get the data for ELRs beginning with the letter ``'A'``:
 
 .. code-block:: python
 
-    >>> elrs_a_codes = em.collect_elr_by_initial(initial='a')  # Data of ELRs beginning with 'A'
+    >>> elrs_a_codes = em.collect_elr_by_initial(initial='a')
     >>> type(elrs_a_codes)
     dict
     >>> list(elrs_a_codes.keys())
     ['A', 'Last updated date']
 
-``elrs_a_codes`` is a `dictionary`_ and has the following *keys*:
+The ``elrs_a_codes`` object is a dictionary with the following *keys*:
 
 -  ``'A'``
 -  ``'Last updated date'``
 
 The corresponding *values* are:
 
--  ``elrs_a_codes['A']`` - Data of ELRs that begin with ``'A'`` (referring to the table presented on the web page `ELRs beginning with A`_);
--  ``elrs_a_codes['Last updated date']`` - The date when the web page `ELRs beginning with A`_ was last updated.
+-  ``elrs_a_codes['A']`` - Data for ELRs that begin with ``'A'`` (referring to the table presented on the web page `ELRs beginning with A`_).
+-  ``elrs_a_codes['Last updated date']`` - The date when the `ELRs beginning with A`_ web page was last updated.
 
-.. _`ELRs beginning with A`: http://www.railwaycodes.org.uk/elrs/elra.shtm
-
-A snapshot of the data contained in ``elrs_a_codes`` is demonstrated below:
+Here is a snapshot of the data contained in ``elrs_a_codes``:
 
 .. code-block:: python
 
@@ -241,11 +240,10 @@ A snapshot of the data contained in ``elrs_a_codes`` is demonstrated below:
     3  ABB  ...       Now AHB
     4  ABB  ...
     [5 rows x 5 columns]
-
     >>> print("Last updated date: {}".format(elrs_a_codes['Last updated date']))
+    Last updated date: 2024-08-04
 
-
-To get the data of all ELRs (with the initial letters ranging from ``'A'`` to ``'Z'``) available in this category, we can use the method :meth:`ELRMileages.fetch_elr()<pyrcs.line_data.ELRMileages.fetch_elr>`:
+To retrieve data for all ELRs (from ``'A'`` to ``'Z'``), we can use the :meth:`ELRMileages.fetch_elr()<pyrcs.line_data.ELRMileages.fetch_elr>` method:
 
 .. code-block:: python
 
@@ -255,30 +253,30 @@ To get the data of all ELRs (with the initial letters ranging from ``'A'`` to ``
     >>> list(elrs_codes.keys())
     ['ELRs and mileages', 'Last updated date']
 
-In like manner, ``elrs_codes`` is also a `dictionary`_, of which the *keys* are:
+Similarly, ``elrs_codes`` is a dictionary with the following *keys*:
 
 -  ``'ELRs and mileages'``
 -  ``'Latest update date'``
 
 The corresponding *values* are:
 
--  ``elrs_codes['ELRs and mileages']`` - Codes of all available ELRs (with the initial letters ranging from ``'A'`` to ``'Z'``);
--  ``elrs_codes['Latest update date']`` - The latest ``'Last updated date'`` among all the initial-specific codes.
+-  ``elrs_codes['ELRs and mileages']`` - Codes for all available ELRs (with the initial letters ranging from ``'A'`` to ``'Z'``);
+-  ``elrs_codes['Latest update date']`` - The most recent update date among all the ELR data.
 
-A snapshot of the data contained in ``elrs_codes`` is demonstrated below:
+Here is a snapshot of the data contained in ``elrs_codes``:
 
 .. code-block:: python
 
     >>> elrs_codes_dat = elrs_codes[em.KEY]
     >>> type(elrs_codes_dat)
     pandas.core.frame.DataFrame
-    >>> elrs_codes_dat.head()
-       ELR  ...         Notes
-    0  AAL  ...      Now NAJ3
-    1  AAM  ...  Formerly AML
-    2  AAV  ...
-    3  ABB  ...       Now AHB
-    4  ABB  ...
+    >>> elrs_codes_dat.tail()
+           ELR                                 Line name  ... Datum Notes
+    4575  ZGW1                     Records to be deleted  ...   n/a
+    4576  ZGW2        Records for comparison if required  ...   n/a
+    4577   ZZY                            Deleted record  ...   n/a
+    4578   ZZZ                      Record to be deleted  ...   n/a
+    4579  ZZZ9  Dummy ELR for demonstrations and testing  ...   n/a
     [5 rows x 5 columns]
 
 .. _quickstart-mileage-files-given-elr:
@@ -286,11 +284,9 @@ A snapshot of the data contained in ``elrs_codes`` is demonstrated below:
 Mileage file of a given ELR
 ---------------------------
 
-Further to the codes of ELRs, each ELR is associated with a mileage file, which specifies the major mileages for the ELR. To get the mileage data, we can use the method :meth:`ELRMileages.fetch_mileage_file()<pyrcs.line_data.ELRMileages.fetch_mileage_file>`.
+In addition to the codes of ELRs, each ELR is associated with a mileage file that specifies the major mileages along the line. To retrieve this data, we can use the :meth:`ELRMileages.fetch_mileage_file()<pyrcs.line_data.ELRMileages.fetch_mileage_file>` method.
 
-For example, let's try to get the `mileage file for 'AAM'`_:
-
-.. _`mileage file for 'AAM'`: http://www.railwaycodes.org.uk/elrs/_mileages/a/aam.shtm
+For example, to get the `mileage file for 'AAM'`_:
 
 .. code-block:: python
 
@@ -300,7 +296,7 @@ For example, let's try to get the `mileage file for 'AAM'`_:
     >>> list(amm_mileage_file.keys())
     ['ELR', 'Line', 'Sub-Line', 'Mileage', 'Notes']
 
-As demonstrated above, ``amm_mileage_file`` is a `dictionary`_ and has the following *keys*:
+The ``amm_mileage_file`` is also a dictionary and has the following *keys*:
 
 -  ``'ELR'``
 -  ``'Line'``
@@ -310,19 +306,18 @@ As demonstrated above, ``amm_mileage_file`` is a `dictionary`_ and has the follo
 
 The corresponding *values* are:
 
--  ``amm_mileage_file['ELR']`` - The given ELR, which, in this example, is ``'AAM'``;
--  ``amm_mileage_file['Line']`` - Name of the line associated with the given ELR;
--  ``amm_mileage_file['Sub-Line']`` - Name of the sub line (if any) associated with the given ELR;
--  ``amm_mileage_file['Mileage']`` - Major mileages for the given ELR;
--  ``amm_mileage_file['Notes']`` - Additional information/notes (if any).
+-  ``amm_mileage_file['ELR']`` - The given ELR (in this example, ``'AAM'``).
+-  ``amm_mileage_file['Line']`` - The name of the line associated with the ELR.
+-  ``amm_mileage_file['Sub-Line']`` - The sub-line name (if applicable).
+-  ``amm_mileage_file['Mileage']`` - The major mileages along the line.
+-  ``amm_mileage_file['Notes']`` - Additional notes or information (if available).
 
-A snapshot of the data contained in ``amm_mileage_file`` is demonstrated below:
+Here is a snapshot of the data contained in ``amm_mileage_file``:
 
 .. code-block:: python
 
     >>> amm_mileage_file['Line']
     'Ashchurch and Malvern Line'
-
     >>> amm_mileage_file['Mileage'].head()
       Mileage Mileage_Note  ... Link_2_ELR Link_2_Mile_Chain
     0  0.0000               ...
@@ -338,47 +333,43 @@ A snapshot of the data contained in ``amm_mileage_file`` is demonstrated below:
 Railway station data
 ====================
 
-The `railway station data`_ (including the station name, ELR, mileage, status, owner, operator, degrees of longitude and latitude, and grid reference) is categorised as one of the `other assets`_ on the `Railway Codes`_ website. To deal with data in this category, PyRCS offers a sub-package :mod:`~pyrcs.other_assets`, from which we can use the contained class :class:`~pyrcs.other_assets.Stations` to get the `railway station data`_:
+:ref:`< Previous <quickstart-elrs-and-mileages>` | :doc:`Back to Top <quick-start>` | :ref:`Next > <quickstart-the-end>`
 
-.. _`other assets`: http://www.railwaycodes.org.uk/otherassetsmenu.shtm
+The `railway station data`_ includes information such as the station name, ELR, mileage, status, owner, operator, coordinates and grid reference. This data is available in the `other assets`_ section of the `Railway Codes`_ website and can be retrieved using the :class:`~pyrcs.other_assets.Stations` class contained in the :mod:`~pyrcs.other_assets` subpackage.
 
-Now let's import the class and create an instance of it:
+To get the data, let's import the :class:`~pyrcs.other_assets.Stations` class and create an instance:
 
 .. code-block:: python
 
-    >>> from pyrcs.other_assets import Stations  # from pyrcs import Stations
-
+    >>> from pyrcs.other_assets import Stations
+    >>> # Alternatively, from pyrcs import Stations
     >>> stn = Stations()
-
     >>> stn.NAME
     'Railway station data'
     >>> stn.URL
     'http://www.railwaycodes.org.uk/stations/station0.shtm'
 
-.. note::
-
-    - Alternatively, the instance ``stn`` can also be defined through the class :class:`~pyrcs.collector.OtherAssets`, which contains all classes under the category of `other assets`_ (see below).
+Alternatively, we can also create the instance by using the :class:`~pyrcs.collector.OtherAssets` class:.
 
 .. code-block:: python
 
     >>> from pyrcs.collector import OtherAssets  # from pyrcs import OtherAssets
-
     >>> oa = OtherAssets()
     >>> stn_ = oa.Stations
-
     >>> stn.NAME == stn_.NAME
     True
 
 .. note::
 
-    - The instances ``stn_`` and ``stn`` are of the same class :class:`~pyrcs.other_assets.Stations`.
+    - The instance ``stn`` encompasses all classes within the `other assets`_ category.
+    - ``stn_`` is equivalent to ``stn``.
 
 .. _quickstart-railway-station-locations-given-initial:
 
 Railway station locations given a specific initial letter
 ---------------------------------------------------------
 
-To get the location data of railway stations whose names start with a given letter, say ``'A'``, we can use the method :meth:`Stations.collect_locations_by_initial()<pyrcs.other_assets.Stations.collect_locations_by_initial>`:
+We can obtain railway station data based on the first letter (e.g. ``'A'`` or ``'Z'``) of the station's name using the :meth:`Stations.collect_locations_by_initial()<pyrcs.other_assets.Stations.collect_locations_by_initial>` method. For example, to get data for stations starting with ``'A'``:
 
 .. code-block:: python
 
@@ -388,19 +379,17 @@ To get the location data of railway stations whose names start with a given lett
     >>> list(stn_loc_a_codes.keys())
     ['A', 'Last updated date']
 
-As demonstrated above, the dictionary ``stn_loc_a_codes`` include the following *keys*:
+The dictionary ``stn_loc_a_codes`` includes the following *keys*:
 
 -  ``'A'``
 -  ``'Last updated date'``
 
 The corresponding *values* are:
 
--  ``stn_loc_a_codes['A']`` - Mileages, operators and grid coordinates of railway stations whose names begin with ``'A'`` (referring to the table presented on the web page of `Stations beginning with A`_);
--  ``stn_loc_a_codes['Last updated date']`` - The date when the web page `Stations beginning with A`_ was last updated.
-
-.. _`Stations beginning with A`: http://www.railwaycodes.org.uk/stations/stationa.shtm
+-  ``stn_loc_a_codes['A']`` - Data for railway stations whose names begin with ``'A'``, including mileages, operators and grid coordinates, referring to the table on the `Stations beginning with A`_ web page.
+-  ``stn_loc_a_codes['Last updated date']`` - The date when the `Stations beginning with A`_ web page was last updated.
 
-A snapshot of the data contained in ``stn_loc_a`` is demonstrated below:
+Here is a snapshot of the data contained in ``stn_loc_a``:
 
 .. code-block:: python
 
@@ -408,14 +397,13 @@ A snapshot of the data contained in ``stn_loc_a`` is demonstrated below:
     >>> type(stn_loc_a_codes_dat)
     pandas.core.frame.DataFrame
     >>> stn_loc_a_codes_dat.head()
-          Station  ...                                    Former Operator
-    0  Abbey Wood  ...  London & South Eastern Railway from 1 April 20...
-    1  Abbey Wood  ...  London & South Eastern Railway from 1 April 20...
-    2        Aber  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
-    3   Abercynon  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
-    4   Abercynon  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
+                                  Station  ...                              Former Operator
+    0  Abbey Wood Abbey Wood / ABBEY WOOD  ...  London & South Eastern Railway from 1 Ap...
+    1  Abbey Wood Abbey Wood / ABBEY WOOD  ...  London & South Eastern Railway from 1 Ap...
+    2                                Aber  ...  Keolis Amey Operations/Gweithrediadau Ke...
+    3                           Abercynon  ...  Keolis Amey Operations/Gweithrediadau Ke...
+    4                           Abercynon  ...  Keolis Amey Operations/Gweithrediadau Ke...
     [5 rows x 14 columns]
-
     >>> stn_loc_a_codes_dat.columns.to_list()
     ['Station',
      'Station Note',
@@ -432,22 +420,21 @@ A snapshot of the data contained in ``stn_loc_a`` is demonstrated below:
      'Operator',
      'Former Operator']
     >>> stn_loc_a_codes_dat[['Station', 'ELR', 'Mileage']].head()
-          Station  ELR   Mileage
-    0  Abbey Wood  NKL  11m 43ch
-    1  Abbey Wood  XRS  24.458km
-    2        Aber  CAR   8m 69ch
-    3   Abercynon  CAM  16m 28ch
-    4   Abercynon  ABD  16m 28ch
-
+                                  Station  ELR   Mileage
+    0  Abbey Wood Abbey Wood / ABBEY WOOD  NKL  11m 43ch
+    1  Abbey Wood Abbey Wood / ABBEY WOOD  XRS  24.458km
+    2                                Aber  CAR   8m 69ch
+    3                           Abercynon  CAM  16m 28ch
+    4                           Abercynon  ABD  16m 28ch
     >>> print("Last updated date: {}".format(stn_loc_a_codes['Last updated date']))
-
+    Last updated date: 2024-09-23
 
 .. _quickstart-all-railway-station-locations:
 
 All available railway station locations
 ---------------------------------------
 
-To get the location data of all railway stations (with the initial letters ranging from ``'A'`` to ``'Z'``) available in this category, we can use the method :meth:`Stations.fetch_locations()<pyrcs.other_assets.Stations.fetch_locations>`:
+To retrieve data for all railway stations available in the `other assets`_ category, we can use the :meth:`Stations.fetch_locations()<pyrcs.other_assets.Stations.fetch_locations>` method:
 
 .. code-block:: python
 
@@ -457,69 +444,69 @@ To get the location data of all railway stations (with the initial letters rangi
     >>> list(stn_loc_codes.keys())
     ['Mileages, operators and grid coordinates', 'Last updated date']
 
-The dictionary ``stn_loc_codes`` include the following *keys*:
+The dictionary ``stn_loc_codes`` includes the following *keys*:
 
 -  ``'Mileages, operators and grid coordinates'``
 -  ``'Latest update date'``
 
 The corresponding *values* are:
 
--  ``stn_loc_codes['Mileages, operators and grid coordinates']`` - Location data of all railway stations available on the relevant web pages ranging from ``'A'`` to ``'Z'``;
--  ``stn_loc_codes['Latest update date']`` - The latest ``'Last updated date'`` among all initial-specific codes.
+-  ``stn_loc_codes['Mileages, operators and grid coordinates']`` - Data for all railway stations, with the initial letters ranging from ``'A'`` to ``'Z'``;
+-  ``stn_loc_codes['Latest update date']`` - The most recent update date among all the station data.
 
-A snapshot of the data contained in ``stn_loc_codes`` is demonstrated below:
+Here is a snapshot of the data contained in ``stn_loc_codes``:
 
 .. code-block:: python
 
     >>> stn.KEY_TO_STN
     'Mileages, operators and grid coordinates'
-
     >>> stn_loc_codes_dat = stn_loc_codes[stn.KEY_TO_STN]
     >>> type(stn_loc_codes_dat)
     pandas.core.frame.DataFrame
-    >>> stn_loc_codes_dat.head()
-          Station  ...                                    Former Operator
-    0  Abbey Wood  ...  London & South Eastern Railway from 1 April 20...
-    1  Abbey Wood  ...  London & South Eastern Railway from 1 April 20...
-    2        Aber  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
-    3   Abercynon  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
-    4   Abercynon  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
+    >>> stn_loc_codes_dat.tail()
+                 Station  ...                                    Former Operator
+    2898            York  ...  East Coast Main Line Company 14 November 2009 ...
+    2899            York  ...  East Coast Main Line Company 14 November 2009 ...
+    2900          Yorton  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
+    2901   Ystrad Mynach  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
+    2902  Ystrad Rhondda  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
     [5 rows x 14 columns]
-
     >>> stn_loc_codes_dat.columns.to_list()
-    ['Station',
-     'Station Note',
-     'ELR',
-     'Mileage',
-     'Status',
-     'Degrees Longitude',
-     'Degrees Latitude',
-     'Grid Reference',
-     'CRS',
-     'CRS Note',
-     'Owner',
-     'Former Owner',
-     'Operator',
-     'Former Operator']
-    >>> stn_loc_codes_dat[['Station', 'ELR', 'Mileage']].head()
-          Station  ELR   Mileage
-    0  Abbey Wood  NKL  11m 43ch
-    1  Abbey Wood  XRS  24.458km
-    2        Aber  CAR   8m 69ch
-    3   Abercynon  CAM  16m 28ch
-    4   Abercynon  ABD  16m 28ch
-
+    >>> sel_cols = ['Station', 'ELR', 'Mileage', 'Degrees Longitude', 'Degrees Latitude']
+    >>> stn_loc_codes_dat[sel_cols].tail()
+                 Station   ELR    Mileage  Degrees Longitude  Degrees Latitude
+    2898            York  ECM5    0m 00ch            -1.0920           53.9584
+    2899            York  ECM4  188m 40ch            -1.0920           53.9584
+    2900          Yorton   SYC   25m 14ch            -2.7360           52.8083
+    2901   Ystrad Mynach   CAR   13m 60ch            -3.2414           51.6414
+    2902  Ystrad Rhondda   THT   20m 05ch            -3.4666           51.6436
     >>> print("Last updated date: {}".format(stn_loc_codes['Last updated date']))
+    Last updated date: 2024-10-07
 
 
 .. _quickstart-the-end:
 
-**This is the end of the** :doc:`quick-start`.
+:ref:`< Previous <quickstart-railway-station-data>` | :doc:`Back to Top <quick-start>`
 
 -----------------------------------------------------------
 
-Any issues regarding the use of the package are all welcome and should be logged/reported onto the `Issue Tracker`_.
+Any issues regarding the use of pyrcs are welcome and can be logged/reported onto the `Issue Tracker`_.
+
+For more details and examples, check :doc:`subpackages` and :doc:`modules`.
 
-.. _`Issue Tracker`: https://github.com/mikeqfu/pyrcs/issues
 
-For more details and examples, check :doc:`sub-pkg-and-mod`.
+.. _`Location identifiers`: http://www.railwaycodes.org.uk/crs/CRS0.shtm
+.. _`Engineer's Line References (ELRs)`: http://www.railwaycodes.org.uk/elrs/elr0.shtm
+.. _`Railway station data`: http://www.railwaycodes.org.uk/stations/station1.shtm
+.. _`line data`: http://www.railwaycodes.org.uk/linedatamenu.shtm
+.. _`Railway Codes`: http://www.railwaycodes.org.uk/index.shtml
+.. _`pandas.DataFrame`: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
+.. _`dictionary`: https://docs.python.org/3/tutorial/datastructures.html#dictionaries
+.. _`dict`: https://docs.python.org/3/library/stdtypes.html#dict
+.. _`Locations beginning A`: http://www.railwaycodes.org.uk/crs/CRSa.shtm
+.. _`other systems`: http://www.railwaycodes.org.uk/crs/CRS1.shtm
+.. _`ELRs beginning with A`: http://www.railwaycodes.org.uk/elrs/elra.shtm
+.. _`mileage file for 'AAM'`: http://www.railwaycodes.org.uk/elrs/_mileages/a/aam.shtm
+.. _`other assets`: http://www.railwaycodes.org.uk/otherassetsmenu.shtm
+.. _`Stations beginning with A`: http://www.railwaycodes.org.uk/stations/stationa.shtm
+.. _`Issue Tracker`: https://github.com/mikeqfu/pyrcs/issues
diff --git a/docs/source/rtd-req.txt b/docs/source/rtd-req.txt
index 8d8af2e..4a1cd2d 100644
--- a/docs/source/rtd-req.txt
+++ b/docs/source/rtd-req.txt
@@ -1,5 +1,7 @@
 beautifulsoup4
-pyhelpers>=1.5.2
+pyhelpers>=2.0.0
 Sphinx==7.4.7
+furo==2024.8.6
 sphinx-copybutton==0.5.2
-sphinx-rtd-theme==2.0.0
+sphinx-new-tab-link==0.6.1
+sphinx-toggleprompt==0.5.2
diff --git a/docs/source/sub-pkg-and-mod.rst b/docs/source/sub-pkg-and-mod.rst
deleted file mode 100644
index 5d3190a..0000000
--- a/docs/source/sub-pkg-and-mod.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-.. _pyrcs-sub-pkg-and-mod:
-
-========================
-Sub-packages and modules
-========================
-
-.. py:module:: pyrcs
-
-Sub-packages
-============
-
-.. autosummary::
-
-    line_data
-    other_assets
-
-.. toctree::
-    :maxdepth: 2
-    :hidden:
-
-    line-data
-    other-assets
-
-Modules
-=======
-
-.. autosummary::
-
-    parser
-    converter
-    collector
-    utils
-
-.. toctree::
-    :maxdepth: 2
-    :hidden:
-
-    parser
-    converter
-    collector
-    utils
diff --git a/docs/source/subpackages.rst b/docs/source/subpackages.rst
new file mode 100644
index 0000000..37170cc
--- /dev/null
+++ b/docs/source/subpackages.rst
@@ -0,0 +1,19 @@
+.. _pyrcs-subpackages:
+
+===========
+Subpackages
+===========
+
+.. py:module:: pyrcs
+
+.. autosummary::
+
+    line_data
+    other_assets
+
+.. toctree::
+    :maxdepth: 2
+    :hidden:
+
+    line-data
+    other-assets
diff --git a/pyrcs/__init__.py b/pyrcs/__init__.py
index fba1cde..e12b16a 100644
--- a/pyrcs/__init__.py
+++ b/pyrcs/__init__.py
@@ -1,5 +1,5 @@
 """
-Package initialization.
+Package initialisation.
 """
 
 import datetime
@@ -12,17 +12,17 @@
 
 __project__ = metadata['Project']
 __pkgname__ = metadata['Package']
-__description__ = metadata['Description']
+__desc__ = metadata['Description']
 
 __author__ = metadata['Author']
-__affiliation__ = metadata['Affiliation']
-__author_email__ = metadata['Email']
+__affil__ = metadata['Affiliation']
+__email__ = metadata['Email']
 
 __version__ = metadata['Version']
 __license__ = metadata['License']
 __copyright__ = f'2019-{datetime.datetime.now().year}, {__author__}'
 
-__first_release_date__ = metadata['First release']
+__first_release__ = metadata['First release']
 
 __all__ = [
     'LineData',
diff --git a/pyrcs/_updater.py b/pyrcs/_updater.py
index 5d8971c..829812a 100644
--- a/pyrcs/_updater.py
+++ b/pyrcs/_updater.py
@@ -13,15 +13,14 @@ def _update_prepacked_data(verbose=False, interval=5, **kwargs):
     """
     Update pre-packed data.
 
-    :param verbose: whether to print relevant information in console, defaults to ``False``
-    :type verbose: bool
-    :param interval: time gap (in seconds) between updating different classes, defaults to ``5``
+    :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+    :type verbose: bool | int
+    :param interval: A time gap (in seconds) between updating different classes; defaults to ``5``.
     :type interval: int or float
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs._updater import _update_prepacked_data
-
         >>> _update_prepacked_data(verbose=True)
     """
 
diff --git a/pyrcs/collector.py b/pyrcs/collector.py
index 3a55ec9..3dc214e 100644
--- a/pyrcs/collector.py
+++ b/pyrcs/collector.py
@@ -1,8 +1,11 @@
 """
-Collect data of railway codes.
+Collects data of railway codes.
 
-The current release only includes `line data <http://www.railwaycodes.org.uk/linedatamenu.shtm>`_ \
-and `other assets <http://www.railwaycodes.org.uk/otherassetsmenu.shtm>`_.
+.. note::
+
+    The current release only includes
+    `line data <http://www.railwaycodes.org.uk/linedatamenu.shtm>`_ and
+    `other assets <http://www.railwaycodes.org.uk/otherassetsmenu.shtm>`_.
 """
 
 import time
@@ -10,54 +13,58 @@
 
 from pyhelpers.ops import confirmed
 
-from .line_data import *
-from .other_assets import *
+from .line_data import (Bridges, ELRMileages, Electrification, LOR, LineNames, LocationIdentifiers,
+                        TrackDiagrams)
+from .other_assets import Depots, Features, SignalBoxes, Stations, Tunnels, Viaducts
 from .parser import get_category_menu
 from .utils import home_page_url, is_home_connectable, print_conn_err, print_inst_conn_err
 
 
 class LineData:
-    """A class representation of all modules of the subpackage \
-    :mod:`~pyrcs.line_data` for collecting `line data`_.
+    """
+    A class representation of all modules of the subpackage :py:mod:`~pyrcs.line_data`
+    for collecting the codes of `line data`_.
 
     .. _`line data`: http://www.railwaycodes.org.uk/linedatamenu.shtm
     """
 
-    #: Name of data
-    NAME = 'Line data'
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '{}menu.shtm'.format(NAME.lower().replace(' ', '')))
+    #: The name of the data.
+    NAME: str = 'Line data'
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(
+        home_page_url(), '{}menu.shtm'.format(NAME.lower().replace(' ', '')))
 
     def __init__(self, update=False, verbose=True):
         """
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
-
-        :ivar bool connected: whether the Internet / the website can be connected
-        :ivar dict catalogue: catalogue of the data
-        :ivar object ELRMileages: instance of the class :py:class:`~elr_mileage.ELRMileages`
-        :ivar object Electrification: instance of the class :py:class:`~elec.Electrification`
-        :ivar object LocationIdentifiers: instance of the class :py:class:`~loc_id.LocationIdentifiers`
-        :ivar object LOR: instance of the class :py:class:`~lor_code.LOR`
-        :ivar object LineNames: instance of the class :py:class:`~line_name.LineNames`
-        :ivar object TrackDiagrams: instance of the class :py:class:`~trk_diagr.TrackDiagrams`
-        :ivar object Bridges: instance of the class :py:class:`~bridge.Bridges`
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
+
+        :ivar bool connected: Whether the Internet / the Railway Codes website is connected.
+        :ivar dict catalogue: The catalogue of the line data.
+        :ivar ELRMileages ELRMileages: An instance of the :class:`~elr_mileage.ELRMileages` class.
+        :ivar Electrification Electrification:
+            An instance of the :class:`~elec.Electrification` class.
+        :ivar LocationIdentifiers LocationIdentifiers:
+            An instance of the :class:`~loc_id.LocationIdentifiers` class.
+        :ivar LOR LOR: An instance of the :class:`~lor_code.LOR` class.
+        :ivar LineNames LineNames: An instance of the :class:`~line_name.LineNames` class.
+        :ivar TrackDiagrams TrackDiagrams:
+            An instance of the :class:`~trk_diagr.TrackDiagrams` class.
+        :ivar Bridges Bridges: An instance of the :py:class:`~bridge.Bridges` class.
 
         **Examples**::
 
             >>> from pyrcs import LineData
-
             >>> ld = LineData()
-
             >>> # To get data of location codes
             >>> location_codes = ld.LocationIdentifiers.fetch_codes()
             >>> type(location_codes)
             dict
             >>> list(location_codes.keys())
             ['LocationID', 'Other systems', 'Additional notes', 'Last updated date']
-
             >>> location_codes_dat = location_codes[ld.LocationIdentifiers.KEY]
             >>> type(location_codes_dat)
             pandas.core.frame.DataFrame
@@ -68,16 +75,13 @@ def __init__(self, update=False, verbose=True):
             2                 Abbeyhill Signal E811      ...
             3            Abbeyhill Turnback Sidings      ...
             4  Abbey Level Crossing (Staffordshire)      ...
-
             [5 rows x 12 columns]
-
             >>> # To get data of line names
             >>> line_names_codes = ld.LineNames.fetch_codes()
             >>> type(line_names_codes)
             dict
             >>> list(line_names_codes.keys())
             ['Line names', 'Last updated date']
-
             >>> line_names_codes_dat = line_names_codes[ld.LineNames.KEY]
             >>> type(line_names_codes_dat)
             pandas.core.frame.DataFrame
@@ -88,7 +92,6 @@ def __init__(self, update=False, verbose=True):
             2          Argyle Line  ...       None
             3     Arun Valley Line  ...       None
             4  Atlantic Coast Line  ...       None
-
             [5 rows x 3 columns]
         """
 
@@ -101,37 +104,36 @@ def __init__(self, update=False, verbose=True):
         self.catalogue = get_category_menu(url=self.URL, update=update, confirmation_required=False)
 
         # Relevant classes
-        self.ELRMileages = elr_mileage.ELRMileages(update=update, verbose=False)
-        self.Electrification = elec.Electrification(update=update, verbose=False)
-        self.LocationIdentifiers = loc_id.LocationIdentifiers(update=update, verbose=False)
-        self.LOR = lor_code.LOR(update=update, verbose=False)
-        self.LineNames = line_name.LineNames(update=update, verbose=False)
-        self.TrackDiagrams = trk_diagr.TrackDiagrams(update=update, verbose=False)
-        self.Bridges = bridge.Bridges(verbose=False)
+        self.ELRMileages = ELRMileages(update=update, verbose=False)
+        self.Electrification = Electrification(update=update, verbose=False)
+        self.LocationIdentifiers = LocationIdentifiers(update=update, verbose=False)
+        self.LOR = LOR(update=update, verbose=False)
+        self.LineNames = LineNames(update=update, verbose=False)
+        self.TrackDiagrams = TrackDiagrams(update=update, verbose=False)
+        self.Bridges = Bridges(verbose=False)
 
     def update(self, confirmation_required=True, verbose=False, interval=5, init_update=False):
         """
-        Update pre-packed of the `line data`_.
+        Updates the pre-packed `line data`_.
 
         .. _`line data`: http://www.railwaycodes.org.uk/linedatamenu.shtm
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :param interval: time gap (in seconds) between the updating of different classes,
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :param interval: A time gap (in seconds) between the updating of different classes,
             defaults to ``5``
         :type interval: int or float
-        :param init_update: whether to update the data for instantiation of each subclass,
+        :param init_update: Whether to update the data for each subclass when being instantiated,
             defaults to ``False``
         :type init_update: bool
 
-        **Example**::
+        **Examples**::
 
             >>> from pyrcs.collector import LineData
-
             >>> ld = LineData()
-
             >>> ld.update(verbose=True)
         """
 
@@ -193,47 +195,46 @@ def update(self, confirmation_required=True, verbose=False, interval=5, init_upd
 
 
 class OtherAssets:
-    """A class representation of all modules of the subpackage \
-    :py:mod:`~pyrcs.other_assets` for collecting `other assets`_.
+    """
+    A class representation of all modules of the subpackage :py:mod:`~pyrcs.other_assets`
+    for collecting the codes of `other assets`_.
 
     .. _`other assets`: http://www.railwaycodes.org.uk/otherassetsmenu.shtm
     """
 
-    #: Name of data
-    NAME = 'Other assets'
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '{}menu.shtm'.format(NAME.lower().replace(' ', '')))
+    #: The name of the data.
+    NAME: str = 'Other assets'
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(
+        home_page_url(), '{}menu.shtm'.format(NAME.lower().replace(' ', '')))
 
     def __init__(self, update=False, verbose=True):
         """
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
-
-        :ivar bool connected: whether the Internet / the website can be connected
-        :ivar dict catalogue: catalogue of the data
-        :ivar object SignalBoxes: instance of the class :py:class:`~sig_box.SignalBoxes`
-        :ivar object Tunnels: instance of the class :py:class:`~tunnel.Tunnels`
-        :ivar object Viaducts: instance of the class :py:class:`~viaduct.Viaducts`
-        :ivar object Stations: instance of the class :py:class:`~station.Stations`
-        :ivar object Depots: instance of the class :py:class:`~depot.Depots`
-        :ivar object Features: instance of the class :py:class:`~feature.Features`
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
+
+        :ivar bool connected: Whether the Internet / the Railway Codes website is connected.
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar SignalBoxes SignalBoxes: An instance of the :class:`~sig_box.SignalBoxes` class.
+        :ivar Tunnels Tunnels: An instance of the :class:`~tunnel.Tunnels` class.
+        :ivar Viaducts Viaducts: An instance of the :class:`~viaduct.Viaducts` class.
+        :ivar Stations Stations: An instance of the :class:`~station.Stations` class.
+        :ivar Depots Depots: An instance of the :class:`~depot.Depots` class.
+        :ivar Features Features: An instance of the :class:`~feature.Features` class.
 
         **Examples**::
 
             >>> from pyrcs import OtherAssets
-
             >>> oa = OtherAssets()
-
             >>> # To get data of railway stations
             >>> rail_stn_locations = oa.Stations.fetch_locations()
-
             >>> type(rail_stn_locations)
             dict
             >>> list(rail_stn_locations.keys())
             ['Mileages, operators and grid coordinates', 'Last updated date']
-
             >>> rail_stn_locations_dat = rail_stn_locations[oa.Stations.KEY_TO_STN]
             >>> type(rail_stn_locations_dat)
             pandas.core.frame.DataFrame
@@ -244,17 +245,13 @@ def __init__(self, update=False, verbose=True):
             2             Aber  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
             3        Abercynon  ...  Keolis Amey Operations/Gweithrediadau Keolis A...
             4  Abercynon North  ...  [Cardiff Railway Company from 13 October 1996 ...
-
             [5 rows x 13 columns]
-
             >>> # To get data of signal boxes
             >>> signal_boxes_codes = oa.SignalBoxes.fetch_prefix_codes()
-
             >>> type(signal_boxes_codes)
             dict
             >>> list(signal_boxes_codes.keys())
             ['Signal boxes', 'Last updated date']
-
             >>> signal_boxes_codes_dat = signal_boxes_codes[oa.SignalBoxes.KEY]
             >>> type(signal_boxes_codes_dat)
             pandas.core.frame.DataFrame
@@ -265,7 +262,6 @@ def __init__(self, update=False, verbose=True):
             2    R           Abbey Junction  ...  16 February 1992     Nuneaton (NN)
             3   AW               Abbey Wood  ...      13 July 1975      Dartford (D)
             4   AE         Abbey Works East  ...   1 November 1987  Port Talbot (PT)
-
             [5 rows x 8 columns]
         """
 
@@ -278,35 +274,35 @@ def __init__(self, update=False, verbose=True):
         self.catalogue = get_category_menu(url=self.URL, update=update, confirmation_required=False)
 
         # Relevant classes
-        self.SignalBoxes = sig_box.SignalBoxes(update=update, verbose=False)
-        self.Tunnels = tunnel.Tunnels(update=update, verbose=False)
-        self.Viaducts = viaduct.Viaducts(update=update, verbose=False)
-        self.Stations = station.Stations(verbose=False)
-        self.Depots = depot.Depots(update=update, verbose=False)
-        self.Features = feature.Features(update=update, verbose=False)
+        self.SignalBoxes = SignalBoxes(update=update, verbose=False)
+        self.Tunnels = Tunnels(update=update, verbose=False)
+        self.Viaducts = Viaducts(update=update, verbose=False)
+        self.Stations = Stations(verbose=False)
+        self.Depots = Depots(update=update, verbose=False)
+        self.Features = Features(update=update, verbose=False)
 
     def update(self, confirmation_required=True, verbose=False, interval=5, init_update=False):
-        """Update pre-packed data of the `other assets`_.
+        """
+        Updates the pre-packed data of the `other assets`_.
 
         .. _`other assets`: http://www.railwaycodes.org.uk/otherassetsmenu.shtm
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :param interval: time gap (in seconds) between the updating of different classes,
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :param interval: A time gap (in seconds) between the updating of different classes,
             defaults to ``5``
-        :type interval: int
-        :param init_update: whether to update the data for instantiation of each subclass,
+        :type interval: int or float
+        :param init_update: Whether to update the data for each subclass when being instantiated,
             defaults to ``False``
         :type init_update: bool
 
-        **Example**::
+        **Examples**::
 
             >>> from pyrcs.collector import OtherAssets
-
             >>> oa = OtherAssets()
-
             >>> oa.update(verbose=True)
         """
 
diff --git a/pyrcs/converter.py b/pyrcs/converter.py
index 89495c8..cb29113 100644
--- a/pyrcs/converter.py
+++ b/pyrcs/converter.py
@@ -1,4 +1,6 @@
-"""Change data into a desired form."""
+"""
+Converts data to a certain format.
+"""
 
 import copy
 import numbers
@@ -12,25 +14,22 @@
 
 def fix_mileage(mileage):
     """
-    Fix mileage data (associated with an ELR).
+    Fixes mileage data (associated with an ELR).
 
-    :param mileage: Network Rail mileage
-    :type mileage: str or float or None
-    :return: fixed mileage data in the conventional format used by Network Rail
+    :param mileage: The mileage data.
+    :type mileage: str | float | None
+    :return: The fixed mileage data in the form of *<miles>.<yards>*.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.converter import fix_mileage
-
         >>> fixed_mileage = fix_mileage(mileage=29.011)
         >>> fixed_mileage
         '29.0110'
-
         >>> fixed_mileage = fix_mileage(mileage='.1100')
         >>> fixed_mileage
         '0.1100'
-
         >>> fixed_mileage = fix_mileage(mileage=29)
         >>> fixed_mileage
         '29.0000'
@@ -58,35 +57,30 @@ def fix_mileage(mileage):
 
 def yard_to_mileage(yard, as_str=True):
     """
-    Convert yards to Network Rail mileages.
+    Converts yards to mileages.
 
-    :param yard: yard data
-    :type yard: int or float or None
-    :param as_str: whether to return as a string value, defaults to ``True``
+    :param yard: The yard data.
+    :type yard: int | float | None
+    :param as_str: Whether to return as a string value; defaults to ``True``.
     :type as_str: bool
-    :return: Network Rail mileage in the form '<miles>.<yards>' or <miles>.<yards>
-    :rtype: str or float
+    :return: The mileage in the form of *<miles>.<yards>* or *<miles>.<yards>*.
+    :rtype: str | float
 
     **Examples**::
 
         >>> from pyrcs.converter import yard_to_mileage
-
         >>> mileage_dat = yard_to_mileage(yard=396)
         >>> mileage_dat
         '0.0396'
-
         >>> mileage_dat = yard_to_mileage(yard=396, as_str=False)
         >>> mileage_dat
         0.0396
-
         >>> mileage_dat = yard_to_mileage(yard=None)
         >>> mileage_dat
         ''
-
         >>> mileage_dat = yard_to_mileage(yard=1760)
         >>> mileage_dat
         '1.0000'
-
         >>> mileage_dat = yard_to_mileage(yard=12330)
         >>> mileage_dat
         '7.0010'
@@ -115,25 +109,22 @@ def yard_to_mileage(yard, as_str=True):
 
 def mileage_to_yard(mileage):
     """
-    Convert Network Rail mileages to yards.
+    Converts mileages to yards.
 
-    :param mileage: Network Rail mileage
-    :type mileage: float or int or str
-    :return: yards
+    :param mileage: The mileage (used by Network Rail).
+    :type mileage: float | int | str
+    :return: The corresponding yards.
     :rtype: int
 
     **Examples**::
 
         >>> from pyrcs.converter import mileage_to_yard
-
         >>> yards_dat = mileage_to_yard(mileage='0.0396')
         >>> yards_dat
         396
-
         >>> yards_dat = mileage_to_yard(mileage=0.0396)
         >>> yards_dat
         396
-
         >>> yards_dat = mileage_to_yard(mileage=1.0396)
         >>> yards_dat
         2156
@@ -151,22 +142,20 @@ def mileage_to_yard(mileage):
 
 def mile_chain_to_mileage(mile_chain):
     """
-    Convert mileage data in the form '<miles>.<chains>' to Network Rail mileage.
+    Converts *<miles>.<chains>* to *<miles>.<yards>*.
 
-    :param mile_chain: mileage data presented in the form '<miles>.<chains>'
-    :type mile_chain: str or numpy.nan or None
-    :return: Network Rail mileage in the form '<miles>.<yards>'
+    :param mile_chain: Mileage data presented in the form of *<miles>.<chains>*.
+    :type mile_chain: str | numpy.nan | None
+    :return: The corresponding mileage in the form of '<miles>.<yards>'.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.converter import mile_chain_to_mileage
-
         >>> # AAM 0.18 Tewkesbury Junction with ANZ (84.62)
         >>> mileage_data = mile_chain_to_mileage(mile_chain='0.18')
         >>> mileage_data
         '0.0396'
-
         >>> # None, nan or ''
         >>> mileage_data = mile_chain_to_mileage(mile_chain=None)
         >>> mileage_data
@@ -185,25 +174,22 @@ def mile_chain_to_mileage(mile_chain):
 
 def mileage_to_mile_chain(mileage):
     """
-    Convert Network Rail mileage to the form '<miles>.<chains>'.
+    Converts *<miles>.<yards>* to *<miles>.<chains>*.
 
-    :param mileage: Network Rail mileage data presented in the form '<miles>.<yards>'
-    :type mileage: str or numpy.nan or None
-    :return: data presented in the form '<miles>.<chains>'
+    :param mileage: The mileage data presented in the form of *<miles>.<yards>*.
+    :type mileage: str | numpy.nan | None
+    :return: The corresponding mileage presented in the form of *<miles>.<chains>*.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.converter import mileage_to_mile_chain
-
         >>> mile_chain_data = mileage_to_mile_chain(mileage='0.0396')
         >>> mile_chain_data
         '0.18'
-
         >>> mile_chain_data = mileage_to_mile_chain(mileage=1.0396)
         >>> mile_chain_data
         '1.18'
-
         >>> # None, nan or ''
         >>> miles_chains_dat = mileage_to_mile_chain(mileage=None)
         >>> miles_chains_dat
@@ -222,33 +208,28 @@ def mileage_to_mile_chain(mileage):
 
 def mile_yard_to_mileage(mile, yard, as_numeric=True):
     """
-    Convert mile and yard to Network Rail mileage.
+    Converts mile and yard to mileage.
 
-    :param mile: mile
-    :type mile: float or int
-    :param yard: yard
-    :type yard: float or int
-    :param as_numeric: whether to return a numeric value, defaults to ``True``
+    :param mile: The mile data.
+    :type mile: float | int
+    :param yard: The yard data.
+    :type yard: float | int
+    :param as_numeric: Whether to return a numeric value; defaults to ``True``.
     :type as_numeric: bool
-    :return: Network Rail mileage
-    :rtype: str or float
+    :return: The corresponding mileage data in the form of *<miles>.<yards>*.
+    :rtype: str | float
 
     **Examples**::
 
         >>> from pyrcs.converter import mile_yard_to_mileage
-
         >>> m, y = 10, 1500
-
         >>> mileage_data = mile_yard_to_mileage(mile=m, yard=y)
         >>> mileage_data
         10.15
-
         >>> mileage_data = mile_yard_to_mileage(mile=m, yard=y, as_numeric=False)
         >>> mileage_data
         '10.1500'
-
         >>> m, y = 10, 500
-
         >>> mileage_data = mile_yard_to_mileage(mile=m, yard=y, as_numeric=False)
         >>> mileage_data
         '10.0500'
@@ -268,21 +249,19 @@ def mile_yard_to_mileage(mile, yard, as_numeric=True):
 
 def mileage_str_to_num(mileage):
     """
-    Convert string-type Network Rail mileage to numerical-type one.
+    Converts string-type mileage to its corresponding numerical value.
 
-    :param mileage: string-type Network Rail mileage in the form '<miles>.<yards>'
+    :param mileage: The string-type mileage data in the form of *<miles>.<yards>*.
     :type mileage: str
-    :return: numerical-type Network Rail mileage
+    :return: The corresponding numerical-type mileage.
     :rtype: float
 
     **Examples**::
 
         >>> from pyrcs.converter import mileage_str_to_num
-
         >>> mileage_num = mileage_str_to_num(mileage='0.0396')
         >>> mileage_num
         0.0396
-
         >>> mileage_num = mileage_str_to_num(mileage='')
         >>> mileage_num
         nan
@@ -295,21 +274,19 @@ def mileage_str_to_num(mileage):
 
 def mileage_num_to_str(mileage):
     """
-    Convert numerical-type Network Rail mileage to string-type one.
+    Converts numerical-type Network Rail mileage to string-type one.
 
-    :param mileage: numerical-type Network Rail mileage
-    :type mileage: float or None
-    :return: string-type Network Rail mileage in the form '<miles>.<yards>'
+    :param mileage: The numerical-type mileage data.
+    :type mileage: float | None
+    :return: The corresponding string-type mileage in the form of *<miles>.<yards>*.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.converter import mileage_num_to_str
-
         >>> mileage_str = mileage_num_to_str(mileage=0.0396)
         >>> mileage_str
         '0.0396'
-
         >>> mileage_str = mileage_num_to_str(mileage=None)
         >>> mileage_str
         ''
@@ -325,29 +302,26 @@ def mileage_num_to_str(mileage):
 
 def shift_mileage_by_yard(mileage, shift_yards, as_numeric=True):
     """
-    Shift Network Rail mileage by given yards.
+    Shifts the given mileage by a specified number of yards.
 
-    :param mileage: mileage (associated with an ELR) used by Network Rail
-    :type mileage: float or int or str
-    :param shift_yards: yards by which the given ``mileage`` is shifted
-    :type shift_yards: int or float
-    :param as_numeric: whether to return a numeric type result, defaults to ``True``
+    :param mileage: The initial mileage (associated with an ELR).
+    :type mileage: float | int | str
+    :param shift_yards: The number of yards by which to shift the given mileage.
+    :type shift_yards: int | float
+    :param as_numeric: If ``True``, returns the result as a numeric type; defaults to ``True``.
     :type as_numeric: bool
-    :return: shifted mileage
-    :rtype: float or str
+    :return: The mileage shifted by the specified number of yards.
+    :rtype: float | str
 
     **Examples**::
 
         >>> from pyrcs.converter import shift_mileage_by_yard
-
         >>> n_mileage = shift_mileage_by_yard(mileage='0.0396', shift_yards=220)
         >>> n_mileage
         0.0616
-
         >>> n_mileage = shift_mileage_by_yard(mileage='0.0396', shift_yards=221)
         >>> n_mileage
         0.0617
-
         >>> n_mileage = shift_mileage_by_yard(mileage=10, shift_yards=220)
         >>> n_mileage
         10.022
@@ -367,26 +341,23 @@ def shift_mileage_by_yard(mileage, shift_yards, as_numeric=True):
 
 def fix_stanox(stanox):
     """
-    Fix the format of a given
-    `STANOX (station number) <https://wiki.openraildata.com/index.php?title=STANOX_Areas>`_ code.
+    Standardises the format of a given
+    `STANOX (station number) <https://wiki.openraildata.com/index.php?title=STANOX_Areas>`_.
 
-    :param stanox: STANOX code
-    :type stanox: str or int or None
-    :return: standard STANOX code
+    :param stanox: The STANOX code to be standardised.
+    :type stanox: str | int | None
+    :return: The standardised STANOX as a string.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.converter import fix_stanox
-
         >>> fixed_stanox = fix_stanox(stanox=65630)
         >>> fixed_stanox
         '65630'
-
         >>> fixed_stanox = fix_stanox(stanox='2071')
         >>> fixed_stanox
         '02071'
-
         >>> fixed_stanox = fix_stanox(stanox=2071)
         >>> fixed_stanox
         '02071'
@@ -405,17 +376,16 @@ def fix_stanox(stanox):
 
 def kilometer_to_yard(km):
     """
-    Make kilometer-to-yard conversion.
+    Converts a distance from kilometres to yards.
 
-    :param km: kilometer
-    :type km: int or float or None
-    :return: yard
+    :param km: The distance in kilometres to convert.
+    :type km: int | float | None
+    :return: The equivalent distance in yards.
     :rtype: float
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.converter import kilometer_to_yard
-
         >>> kilometer_to_yard(1)
         1093.6132983377079
     """
diff --git a/pyrcs/data/metadata b/pyrcs/data/metadata
index 5661e98..f103464 100644
--- a/pyrcs/data/metadata
+++ b/pyrcs/data/metadata
@@ -1,10 +1,10 @@
 {
     "Project": "PyRCS",
+    "Description": "An open-source tool for collecting railway codes used in different UK rail industry systems",
     "Package": "pyrcs",
     "Author": "Qian Fu",
     "Affiliation": "School of Engineering, University of Birmingham",
     "Email": "q.fu@bham.ac.uk",
-    "Description": "An open-source tool for collecting railway codes used in different UK rail industry systems.",
     "Version": "1.0.0dev1",
     "License": "GPLv3+",
     "First release": "August 2019"
diff --git a/pyrcs/line_data/__init__.py b/pyrcs/line_data/__init__.py
index 1d46a3e..d5352ae 100644
--- a/pyrcs/line_data/__init__.py
+++ b/pyrcs/line_data/__init__.py
@@ -1,7 +1,7 @@
 """
-A sub-package for collecting codes of `line data <http://www.railwaycodes.org.uk/linedatamenu.shtm>`_.
+A subpackage for collecting codes of `line data <http://www.railwaycodes.org.uk/linedatamenu.shtm>`_.
 
-(See also :py:class:`~pyrcs.collector.LineData`.)
+(See also the :py:class:`~pyrcs.collector.LineData` class.)
 """
 
 from .bridge import Bridges
diff --git a/pyrcs/line_data/bridge.py b/pyrcs/line_data/bridge.py
index de317fa..bb35273 100644
--- a/pyrcs/line_data/bridge.py
+++ b/pyrcs/line_data/bridge.py
@@ -1,5 +1,5 @@
 """
-Collect data of British `railway bridges <http://www.railwaycodes.org.uk/bridges/bridges0.shtm>`_.
+Collects data of British `railway bridges <http://www.railwaycodes.org.uk/bridges/bridges0.shtm>`_.
 """
 
 import os
@@ -11,8 +11,8 @@
 from pyhelpers.dirs import cd
 from pyhelpers.ops import confirmed, fake_requests_headers, split_list_by_size
 
-from pyrcs.parser import get_introduction, get_last_updated_date
-from pyrcs.utils import fetch_data_from_file, format_err_msg, home_page_url, init_data_dir, \
+from ..parser import get_introduction, get_last_updated_date
+from ..utils import fetch_data_from_file, format_err_msg, home_page_url, init_data_dir, \
     print_collect_msg, print_conn_err, print_inst_conn_err, save_data_to_file
 
 
@@ -22,32 +22,30 @@ class Bridges:
     `railway bridges <http://www.railwaycodes.org.uk/bridges/bridges0.shtm>`_.
     """
 
-    #: Name of the data
+    #: The name of the data.
     NAME: str = 'Railway bridges'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
+    #: The key for accessing the data.
     KEY: str = 'Bridges'
-
-    #: URL of the main web page of the data
+    #: The URL of the main web page for the data.
     URL: str = urllib.parse.urljoin(home_page_url(), '/bridges/bridges0.shtm')
-
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param data_dir: Directory where the data is stored; defaults to ``None``.
+        :type data_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last update date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
-            >>> from pyrcs.line_data import Bridges  # from pyrcs import Bridges
+            >>> from pyrcs.line_data import Bridges  # alternatively, from pyrcs import Bridges
             >>> bdg = Bridges()
             >>> bdg.NAME
             'Railway bridges'
@@ -63,26 +61,31 @@ def __init__(self, data_dir=None, verbose=True):
 
         self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="line-data")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\line-data\\bridges"``.
+        The default data directory for this class is: ``"data\\line-data\\bridges"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: pathname of the backup data directory for the class
-            :py:class:`~pyrcs.line_data.bridges.Bridges`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        pathname = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
-        return pathname
+        return path
 
     def _parse_h4_ul_li(self, h4_ul_li):
         h4_ul_li_contents = h4_ul_li.contents
@@ -112,23 +115,23 @@ def _parse_h4_ul_li(self, h4_ul_li):
 
     def collect_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect codes of `railway bridges`_ from source web page.
+        Collects the codes of `railway bridges`_ from the source webpage.
 
         .. _`railway bridges`: http://www.railwaycodes.org.uk/bridges/bridges0.shtm
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether to prompt for confirmation before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of railway bridges and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information in the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing railway bridge data and the date of the last update,
+            or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Bridges  # from pyrcs import Bridges
-
             >>> bdg = Bridges()
-
             >>> bdg_codes = bdg.collect_codes()
             To collect data of railway bridges
             ? [No]|Yes: yes
@@ -144,7 +147,6 @@ def collect_codes(self, confirmation_required=True, verbose=False):
              'London Underground',
              'Addendum',
              'Key to text presentation conventions']
-
             >>> bdg_codes['Key to text presentation conventions']
             {'Bold': 'Existing bridges',
              'Bold italic': 'Existing locations',
@@ -235,27 +237,26 @@ def collect_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch codes of `railway bridges`_.
+        Fetches the codes of `railway bridges`_.
 
         .. _`railway bridges`: http://www.railwaycodes.org.uk/bridges/bridges0.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of railway bridges and date of when the data was last updated
-        :rtype: dict or None
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing railway bridge data and the date of the last update,
+            or ``None`` if no data is retrieved.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Bridges  # from pyrcs import Bridges
-
             >>> bdg = Bridges()
-
             >>> bdg_codes = bdg.fetch_codes()
-
             >>> type(bdg_codes)
             dict
             >>> list(bdg_codes.keys())
@@ -268,7 +269,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
              'London Underground',
              'Addendum',
              'Key to text presentation conventions']
-
             >>> bdg_codes['Key to text presentation conventions']
             {'Bold': 'Existing bridges',
              'Bold italic': 'Existing locations',
@@ -284,7 +284,7 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         bridges_data = fetch_data_from_file(
-            cls=self, method='collect_codes', data_name=self.KEY, ext=".json",
+            self, method='collect_codes', data_name=self.KEY, ext=".json",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return bridges_data
diff --git a/pyrcs/line_data/elec.py b/pyrcs/line_data/elec.py
index cd0438a..ea6b821 100644
--- a/pyrcs/line_data/elec.py
+++ b/pyrcs/line_data/elec.py
@@ -1,5 +1,5 @@
 """
-Collect `section codes for overhead line electrification (OLE) installations
+Collects data of `section codes for overhead line electrification (OLE) installations
 <http://www.railwaycodes.org.uk/electrification/mast_prefix0.shtm>`_.
 """
 
@@ -15,9 +15,9 @@
 from pyhelpers.ops import confirmed, fake_requests_headers
 from pyhelpers.store import load_data
 
-from pyrcs.parser import get_catalogue, get_heading_text, get_hypertext, get_last_updated_date, \
+from ..parser import get_catalogue, get_heading_text, get_hypertext, get_last_updated_date, \
     get_page_catalogue, parse_tr
-from pyrcs.utils import cd_data, fetch_all_verbose, fetch_data_from_file, format_err_msg, \
+from ..utils import cd_data, fetch_all_verbose, fetch_data_from_file, format_err_msg, \
     home_page_url, init_data_dir, print_collect_msg, print_conn_err, print_inst_conn_err, \
     save_data_to_file
 
@@ -28,39 +28,40 @@ class Electrification:
     <http://www.railwaycodes.org.uk/electrification/mast_prefix0.shtm>`_.
     """
 
-    #: Name of the data
+    #: The name of the data.
     NAME: str = 'Section codes for overhead line electrification (OLE) installations'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
+    #: The key for accessing the data.
     KEY: str = 'Electrification'
 
-    #: Key of the dict-type data of the '*national network*'
+    #: The key used to reference the data of the '*national network*'.
     KEY_TO_NATIONAL_NETWORK: str = 'National network'
-    #: Key of the dict-type data of the '*independent lines*'
+    #: The key used to reference the data of the '*independent lines*'.
     KEY_TO_INDEPENDENT_LINES: str = 'Independent lines'
-    #: Key of the dict-type data of the '*overhead line electrification neutral sections (OHNS)*'
+    #: The key used to reference the data of the
+    #: '*overhead line electrification neutral sections (OHNS)*'.
     KEY_TO_OHNS: str = 'National network neutral sections'
-    #: Key of the dict-type data of the '*UK railway electrification tariff zones*'
+    #: The key used to reference the data of the '*UK railway electrification tariff zones*'.
     KEY_TO_ENERGY_TARIFF_ZONES: str = 'National network energy tariff zones'
 
-    #: URL of the main web page of the data
+    #: The URL of the main web page for the data.
     URL: str = urllib.parse.urljoin(home_page_url(), '/electrification/mast_prefix0.shtm')
 
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: Name of the data directory; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the data catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last update date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
@@ -80,30 +81,35 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="line-data")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\line-data\\electrification"``.
+        The default data directory for this class is: ``"data\\line-data\\electrification"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.line_data.elec.Electrification`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     @staticmethod
     def _cfm_msg(key):
-        cfm_msg = "To collect section codes for OLE installations: {}\n?".format(key.lower())
+        cfm_msg = f"To collect section codes for OLE installations: {key.lower()}\n?"
 
         return cfm_msg
 
@@ -271,23 +277,23 @@ def _collect_data(self, source):
 
     def collect_national_network_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect OLE section codes for
+        Collects the section codes for Overhead Line Electrification (OLE) installations for the
         `national network <http://www.railwaycodes.org.uk/electrification/mast_prefix1.shtm>`_
-        from source web page.
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OLE section codes for National network
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OLE section codes for the national network,
+            or ``None`` if not applicable.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> nn_codes = elec.collect_national_network_codes()
             To collect section codes for OLE installations: national network
             ? [No]|Yes: yes
@@ -295,10 +301,8 @@ def collect_national_network_codes(self, confirmation_required=True, verbose=Fal
             dict
             >>> list(nn_codes.keys())
             ['National network', 'Last updated date']
-
             >>> elec.KEY_TO_NATIONAL_NETWORK
             'National network'
-
             >>> nn_codes_dat = nn_codes[elec.KEY_TO_NATIONAL_NETWORK]
             >>> type(nn_codes_dat)
             dict
@@ -310,7 +314,6 @@ def collect_national_network_codes(self, confirmation_required=True, verbose=Fal
              'An odd one to complete the record',
              'LBSC/Southern Railway overhead system',
              'Codes not known']
-
             >>> tns_codes = nn_codes_dat['Traditional numbering system [distance and sequence]']
             >>> type(tns_codes)
             dict
@@ -372,34 +375,33 @@ def collect_national_network_codes(self, confirmation_required=True, verbose=Fal
 
     def fetch_national_network_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch OLE section codes for `national network`_.
+        Fetches section codes for Overhead Line Electrification (OLE) installations on the
+        `national network`_.
 
         .. _`national network`: http://www.railwaycodes.org.uk/electrification/mast_prefix1.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OLE section codes for National network
-        :rtype: dict or None
+        :param dump_dir: Path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OLE section codes for the national network,
+            or ``None`` if not applicable.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> nn_codes = elec.fetch_national_network_codes()
             >>> type(nn_codes)
             dict
             >>> list(nn_codes.keys())
             ['National network', 'Last updated date']
-
             >>> elec.KEY_TO_NATIONAL_NETWORK
             'National network'
-
             >>> nn_codes_dat = nn_codes[elec.KEY_TO_NATIONAL_NETWORK]
             >>> type(nn_codes_dat)
             dict
@@ -411,7 +413,6 @@ def fetch_national_network_codes(self, update=False, dump_dir=None, verbose=Fals
              'An odd one to complete the record',
              'LBSC/Southern Railway overhead system',
              'Codes not known']
-
             >>> tns_codes = nn_codes_dat['Traditional numbering system [distance and sequence]']
             >>> type(tns_codes)
             dict
@@ -429,7 +430,7 @@ def fetch_national_network_codes(self, update=False, dump_dir=None, verbose=Fals
         """
 
         national_network_ole = fetch_data_from_file(
-            cls=self, method='collect_national_network_codes',
+            self, method='collect_national_network_codes',
             data_name=self.KEY_TO_NATIONAL_NETWORK, ext=".pkl", update=update, dump_dir=dump_dir,
             verbose=verbose)
 
@@ -437,25 +438,22 @@ def fetch_national_network_codes(self, update=False, dump_dir=None, verbose=Fals
 
     def get_indep_line_catalogue(self, update=False, verbose=False):
         """
-        Get a catalogue for
+        Gets a catalogue for the
         `independent lines <http://www.railwaycodes.org.uk/electrification/mast_prefix2.shtm>`_.
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: a list of independent line names
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A pandas DataFrame containing the names of independent lines.
         :rtype: pandas.DataFrame
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
             >>> from pyhelpers.settings import pd_preferences
-
             >>> pd_preferences(max_columns=1)
-
             >>> elec = Electrification()
-
             >>> indep_line_cat = elec.get_indep_line_catalogue()
             >>> indep_line_cat.head()
                                                          Feature  ...
@@ -490,23 +488,23 @@ def get_indep_line_catalogue(self, update=False, verbose=False):
 
     def collect_indep_lines_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect OLE section codes for `independent lines`_ from source web page.
+        Collects OLE section codes for `independent lines`_ from the source web page.
 
         .. _`independent lines`: http://www.railwaycodes.org.uk/electrification/mast_prefix2.shtm
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OLE section codes for independent lines
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OLE section codes for independent lines,
+            or ``None`` if not applicable.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> indep_lines_codes = elec.collect_indep_lines_codes()
             To collect section codes for OLE installations: independent lines
             ? [No]|Yes: yes
@@ -514,10 +512,8 @@ def collect_indep_lines_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(indep_lines_codes.keys())
             ['Independent lines', 'Last updated date']
-
             >>> elec.KEY_TO_INDEPENDENT_LINES
             'Independent lines'
-
             >>> indep_lines_codes_dat = indep_lines_codes[elec.KEY_TO_INDEPENDENT_LINES]
             >>> type(indep_lines_codes_dat)
             dict
@@ -546,7 +542,6 @@ def collect_indep_lines_codes(self, confirmation_required=True, verbose=False):
              'Summerlee, Museum of Scottish Industrial Life Tramway',
              'Tyne & Wear Metro',
              'West Midlands Metro [West Midlands]']
-
             >>> indep_lines_codes_dat['Beamish Tramway']
             {'Codes': None, 'Notes': 'Masts do not appear labelled.'}
         """
@@ -594,34 +589,31 @@ def collect_indep_lines_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_indep_lines_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch OLE section codes for `independent lines`_.
+        Fetches OLE section codes for `independent lines`_.
 
         .. _`independent lines`: http://www.railwaycodes.org.uk/electrification/mast_prefix2.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OLE section codes for independent lines
+        :param dump_dir: Path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OLE section codes for independent lines.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> indep_lines_codes = elec.fetch_indep_lines_codes()
             >>> type(indep_lines_codes)
             dict
             >>> list(indep_lines_codes.keys())
             ['Independent lines', 'Last updated date']
-
             >>> elec.KEY_TO_INDEPENDENT_LINES
             'Independent lines'
-
             >>> indep_lines_codes_dat = indep_lines_codes[elec.KEY_TO_INDEPENDENT_LINES]
             >>> type(indep_lines_codes_dat)
             dict
@@ -650,37 +642,35 @@ def fetch_indep_lines_codes(self, update=False, dump_dir=None, verbose=False):
              'Summerlee, Museum of Scottish Industrial Life Tramway',
              'Tyne & Wear Metro',
              'West Midlands Metro [West Midlands]']
-
             >>> indep_lines_codes_dat['Beamish Tramway']
             {'Codes': None, 'Notes': 'Masts do not appear labelled.'}
         """
 
         independent_lines_ole = fetch_data_from_file(
-            cls=self, method='collect_indep_lines_codes', data_name=self.KEY_TO_INDEPENDENT_LINES,
+            self, method='collect_indep_lines_codes', data_name=self.KEY_TO_INDEPENDENT_LINES,
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return independent_lines_ole
 
     def collect_ohns_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect codes for
+        Collects codes for
         `overhead line electrification neutral sections
         <http://www.railwaycodes.org.uk/electrification/neutral.shtm>`_ (OHNS)
-        from source web page.
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OHNS codes
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OHNS codes, or ``None`` if not applicable.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> ohl_ns_codes = elec.collect_ohns_codes()
             To collect section codes for OLE installations: national network neutral sections
             ? [No]|Yes: yes
@@ -688,10 +678,8 @@ def collect_ohns_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(ohl_ns_codes.keys())
             ['National network neutral sections', 'Last updated date']
-
             >>> elec.KEY_TO_OHNS
             'National network neutral sections'
-
             >>> ohl_ns_codes_dat = ohl_ns_codes[elec.KEY_TO_OHNS]
             >>> type(ohl_ns_codes_dat)
             dict
@@ -780,35 +768,32 @@ def collect_ohns_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_ohns_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch codes for `overhead line electrification neutral sections`_ (OHNS).
+        Fetches the `overhead line electrification neutral sections`_ (OHNS) codes.
 
         .. _`overhead line electrification neutral sections`:
             http://www.railwaycodes.org.uk/electrification/neutral.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OHNS codes
+        :param dump_dir: Path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OHNS codes.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> ohl_ns_codes = elec.fetch_ohns_codes()
             >>> type(ohl_ns_codes)
             dict
             >>> list(ohl_ns_codes.keys())
             ['National network neutral sections', 'Last updated date']
-
             >>> elec.KEY_TO_OHNS
             'National network neutral sections'
-
             >>> ohl_ns_codes_dat = ohl_ns_codes[elec.KEY_TO_OHNS]
             >>> type(ohl_ns_codes_dat)
             dict
@@ -824,30 +809,29 @@ def fetch_ohns_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         ohns_codes = fetch_data_from_file(
-            cls=self, method='collect_ohns_codes', data_name=self.KEY_TO_OHNS, ext=".pkl",
+            self, method='collect_ohns_codes', data_name=self.KEY_TO_OHNS, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return ohns_codes
 
     def collect_etz_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect OLE section codes for `national network energy tariff zones
+        Collects OLE section codes for `national network energy tariff zones
         <http://www.railwaycodes.org.uk/electrification/tariff.shtm>`_
-        from source web page.
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OLE section codes for national network energy tariff zones
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OLE section codes for national network energy tariff zones.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> rail_etz_codes = elec.collect_etz_codes()
             To collect section codes for OLE installations: national network energy tariff zones
             ? [No]|Yes: yes
@@ -855,16 +839,13 @@ def collect_etz_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(rail_etz_codes.keys())
             ['National network energy tariff zones', 'Last updated date']
-
             >>> elec.KEY_TO_ENERGY_TARIFF_ZONES
             'National network energy tariff zones'
-
             >>> rail_etz_codes_dat = rail_etz_codes[elec.KEY_TO_ENERGY_TARIFF_ZONES]
             >>> type(rail_etz_codes_dat)
             dict
             >>> list(rail_etz_codes_dat.keys())
             ['Railtrack', 'Network Rail']
-
             >>> rail_etz_codes_dat['Railtrack']['Codes']
                Code                   Energy tariff zone
             0    EA                          East Anglia
@@ -927,41 +908,37 @@ def collect_etz_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_etz_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch OLE section codes for `national network energy tariff zones`_.
+        Fetches OLE section codes for `national network energy tariff zones`_.
 
         .. _`national network energy tariff zones`:
             http://www.railwaycodes.org.uk/electrification/tariff.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: OLE section codes for national network energy tariff zones
+        :param dump_dir: Path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of OLE section codes for national network energy tariff zones.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> rail_etz_codes = elec.fetch_etz_codes()
             >>> type(rail_etz_codes)
             dict
             >>> list(rail_etz_codes.keys())
             ['National network energy tariff zones', 'Last updated date']
-
             >>> elec.KEY_TO_ENERGY_TARIFF_ZONES
             'National network energy tariff zones'
-
             >>> rail_etz_codes_dat = rail_etz_codes[elec.KEY_TO_ENERGY_TARIFF_ZONES]
             >>> type(rail_etz_codes_dat)
             dict
             >>> list(rail_etz_codes_dat.keys())
             ['Railtrack', 'Network Rail']
-
             >>> rail_etz_codes_dat['Railtrack']['Codes']
                Code                   Energy tariff zone
             0    EA                          East Anglia
@@ -981,41 +958,40 @@ def fetch_etz_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         etz_ole = fetch_data_from_file(
-            cls=self, method='collect_etz_codes', data_name=self.KEY_TO_ENERGY_TARIFF_ZONES,
+            self, method='collect_etz_codes', data_name=self.KEY_TO_ENERGY_TARIFF_ZONES,
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return etz_ole
 
+    # -- All codes ---------------------------------------------------------------------------------
+
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch OLE section codes listed in the `Electrification`_ catalogue.
+        Fetches OLE section codes listed in the `Electrification`_ catalogue.
 
         .. _`Electrification`: http://www.railwaycodes.org.uk/electrification/mast_prefix0.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: section codes for overhead line electrification (OLE) installations
+        :param dump_dir: Path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary of the section codes for OLE installations.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import Electrification  # from pyrcs import Electrification
-
             >>> elec = Electrification()
-
             >>> elec_codes = elec.fetch_codes()
             >>> type(elec_codes)
             dict
             >>> list(elec_codes.keys())
             ['Electrification', 'Last updated date']
-
             >>> elec.KEY
             'Electrification'
-
             >>> elec_codes_dat = elec_codes[elec.KEY]
             >>> type(elec_codes_dat)
             dict
diff --git a/pyrcs/line_data/elr_mileage.py b/pyrcs/line_data/elr_mileage.py
index 68155dc..cac77a9 100644
--- a/pyrcs/line_data/elr_mileage.py
+++ b/pyrcs/line_data/elr_mileage.py
@@ -1,5 +1,6 @@
 """
-Collect `Engineer's Line References (ELRs) <http://www.railwaycodes.org.uk/elrs/elr0.shtm>`_.
+Collects data of
+`Engineer's Line References (ELRs) <http://www.railwaycodes.org.uk/elrs/elr0.shtm>`_.
 """
 
 import copy
@@ -19,10 +20,10 @@
 from pyhelpers.store import load_data, save_data
 from pyhelpers.text import remove_punctuation
 
-from pyrcs.converter import kilometer_to_yard, mile_chain_to_mileage, mileage_to_mile_chain, \
+from ..converter import kilometer_to_yard, mile_chain_to_mileage, mileage_to_mile_chain, \
     yard_to_mileage
-from pyrcs.parser import get_catalogue, get_last_updated_date, parse_table
-from pyrcs.utils import collect_in_fetch_verbose, format_err_msg, home_page_url, init_data_dir, \
+from ..parser import get_catalogue, get_last_updated_date, parse_table
+from ..utils import collect_in_fetch_verbose, format_err_msg, home_page_url, init_data_dir, \
     is_home_connectable, is_str_float, print_conn_err, print_inst_conn_err, print_void_msg, \
     save_data_to_file, validate_initial
 
@@ -31,33 +32,36 @@ class ELRMileages:
     """
     A class for collecting data of
     `Engineer's Line References (ELRs) <http://www.railwaycodes.org.uk/elrs/elr0.shtm>`_.
+
+    This class provides methods to access and manage ELR data, including their mileages
+    and last updated information.
     """
 
-    #: Name of the data.
+    #: The name of the data.
     NAME: str = "Engineer's Line References (ELRs)"
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data.
+    #: The key for accessing the data.
     KEY: str = 'ELRs and mileages'
 
-    #: URL of the main web page of the data.
+    #: The URL of the main web page for the data.
     URL: str = urllib.parse.urljoin(home_page_url(), '/elrs/elr0.shtm')
 
-    #: Key of the data of the last updated date.
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: The name of a folder for the data directory, defaults to ``None``.
-        :type data_dir: str or None
-        :param update: Whether to do an update check (for the package data), defaults to ``False``.
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the data catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: Whether to print relevant information in console, defaults to ``True``.
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
         :ivar dict catalogue: The catalogue of the data.
-        :ivar str last_updated_date: The last updated date.
-        :ivar str data_dir: An absolute path to the data directory.
-        :ivar str current_data_dir: An absolute path to the current data directory.
-        :ivar list measure_headers: A list of possible headers for different measures.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
+        :ivar list measure_headers: A list of potential headers for various measures in the data.
 
         **Examples**::
 
@@ -85,20 +89,22 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
     def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\line-data\\elrs-and-mileages"``.
+        The default data directory for this class is: ``"data\\line-data\\elrs-and-mileages"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param mkdir: whether to create the specified directory, defaults to ``True``
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
         :type mkdir: bool
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.line_data.elr_mileage.ELRMileages`
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
@@ -456,30 +462,28 @@ def _parse_mileage_data(self, mileage_data):
 
     def collect_elr_by_initial(self, initial, update=False, verbose=False):
         """
-        Collect Engineer's Line References (ELRs) for a given initial letter from source web page.
+        Collects Engineer's Line References (ELRs) that begin with a specified initial letter
+        from the source web page.
 
-        :param initial: initial letter of an ELR, e.g. ``'a'``, ``'z'``
+        :param initial: The initial letter (e.g. ``'a'``, ``'z'``) of an ELR.
         :type initial: str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
-        :return: data of ELRs whose names start with the given initial letter and
-            date of when the data was last updated
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
+        :return: A dictionary containing ELR data whose names start with the given initial letter,
+            along with the date of the last update.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> elrs_a_codes = em.collect_elr_by_initial(initial='a')
             >>> type(elrs_a_codes)
             dict
             >>> list(elrs_a_codes.keys())
             ['A', 'Last updated date']
-
             >>> elrs_a_codes_dat = elrs_a_codes['A']
             >>> type(elrs_a_codes_dat)
             pandas.core.frame.DataFrame
@@ -491,7 +495,6 @@ def collect_elr_by_initial(self, initial, update=False, verbose=False):
             3  ABB  ...       Now AHB
             4  ABB  ...
             [5 rows x 5 columns]
-
             >>> elrs_q_codes = em.collect_elr_by_initial(initial='Q')
             >>> elrs_q_codes_dat = elrs_q_codes['Q']
             >>> elrs_q_codes_dat.head()
@@ -558,30 +561,28 @@ def fetch_elr(self, update=False, dump_dir=None, verbose=False):
         """
         Fetch data of ELRs and their associated mileages.
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of all available ELRs and date of when the data was last updated
+        :param dump_dir: Path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing data for all available ELRs,
+            along with the date of the last update.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> elrs_codes = em.fetch_elr()
             >>> type(elrs_codes)
             dict
             >>> list(elrs_codes.keys())
             ['ELRs and mileages', 'Last updated date']
-
             >>> em.KEY
             'ELRs and mileages'
-
             >>> elrs_codes_dat = elrs_codes[em.KEY]
             >>> type(elrs_codes_dat)
             pandas.core.frame.DataFrame
@@ -704,35 +705,35 @@ def _get_parsed_contents(elr_dat, notes):
     def collect_mileage_file(self, elr, parsed=True, confirmation_required=True, dump_it=False,
                              verbose=False):
         """
-        Collect mileage file for the given ELR from source web page.
+        Collects the mileage file for the specified ELR from the source web page.
 
-        :param elr: ELR, e.g. ``'CJD'``, ``'MLA'``, ``'FED'``
+        :param elr: The ELR for which the mileage file is requested
+            (e.g. ``'CJD'``, ``'MLA'``, ``'FED'``).
         :type elr: str
-        :param parsed: whether to parse the scraped mileage data
+        :param parsed: Whether to parse the scraped mileage data; defaults to ``True``.
         :type parsed: bool
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param dump_it: whether to save the collected data as a pickle file, defaults to ``False``
+        :param dump_it: Whether to save the collected data as a pickle file; defaults to ``False``.
         :type dump_it: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: mileage file for the given ``elr``
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the mileage file for the specified ELR.
         :rtype: dict
 
         .. note::
 
-            - In some cases, mileages are unknown hence left blank,
-              e.g. ANI2, Orton Junction with ROB (~3.05)
-            - Mileages in parentheses are not on that ELR, but are included for reference,
-              e.g. ANL, (8.67) NORTHOLT [London Underground]
+            - In some cases, mileages may be unknown and thus left blank
+              (e.g. ``'ANI2, Orton Junction with ROB (~3.05)'``).
+            - Mileages in parentheses are not on that ELR but are included for reference
+              (e.g., ``'ANL, (8.67) NORTHOLT [London Underground]'``).
             - As with the main ELR list, mileages preceded by a tilde (~) are approximate.
 
         **Examples**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> gam_mileage_file = em.collect_mileage_file(elr='GAM')
             To collect mileage file of "GAM"
             ? [No]|Yes: yes
@@ -745,7 +746,6 @@ def collect_mileage_file(self, elr, parsed=True, confirmation_required=True, dum
             0   8.1518                      8.69  ...   None
             1  10.0264                     10.12  ...   None
             [2 rows x 8 columns]
-
             >>> xrc2_mileage_file = em.collect_mileage_file(elr='XRC2')
             To collect mileage file of "XRC2"
             ? [No]|Yes: yes
@@ -755,7 +755,6 @@ def collect_mileage_file(self, elr, parsed=True, confirmation_required=True, dum
             1  9.0447     14.893km  ...
             2  9.0557     14.994km  ...
             [3 rows x 8 columns]
-
             >>> xre_mileage_file = em.collect_mileage_file(elr='XRE')
             To collect mileage file of "XRE"
             ? [No]|Yes: yes
@@ -769,7 +768,6 @@ def collect_mileage_file(self, elr, parsed=True, confirmation_required=True, dum
             5  9.0439   (14.886)km  ...
             6  9.0540   (14.978)km  ...
             [7 rows x 11 columns]
-
             >>> mor_mileage_file = em.collect_mileage_file(elr='MOR')
             To collect mileage file of "MOR"
             ? [No]|Yes: yes
@@ -800,7 +798,6 @@ def collect_mileage_file(self, elr, parsed=True, confirmation_required=True, dum
             7                                    ...          None
             8  3.0638                      3.29  ...   SDI2 (2.79)       SDI2              2.79
             [9 rows x 8 columns]
-
             >>> fed_mileage_file = em.collect_mileage_file(elr='FED')
             To collect mileage file of "FED"
             ? [No]|Yes: yes
@@ -997,25 +994,26 @@ def collect_mileage_file(self, elr, parsed=True, confirmation_required=True, dum
 
     def fetch_mileage_file(self, elr, update=False, dump_dir=None, verbose=False):
         """
-        Fetch the mileage file for a given ELR.
+        Fetches the mileage file for the specified ELR.
 
-        :param elr: elr: ELR, e.g. ``'CJD'``, ``'MLA'``, ``'FED'``
+        :param elr: The ELR for which the mileage file is requested
+            (e.g. ``'CJD'``, ``'MLA'``, ``'FED'``).
         :type elr: str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: mileage file (codes), line name and, if any, additional information/notes
+        :param dump_dir: Path to the directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the mileage file (codes), line name and
+            any additional information or notes.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> # Get the mileage file of 'AAL' (Now 'NAJ3')
             >>> aal_mileage_file = em.fetch_mileage_file(elr='AAL')
             >>> type(aal_mileage_file)
@@ -1042,7 +1040,6 @@ def fetch_mileage_file(self, elr, update=False, dump_dir=None, verbose=False):
             11  18.0572               ...        DCL             81.10
             12  18.0638               ...        DCL             81.12
             [13 rows x 8 columns]
-
             >>> # Get the mileage file of 'MLA'
             >>> mla_mileage_file = em.fetch_mileage_file(elr='MLA')
             >>> type(mla_mileage_file)
@@ -1067,10 +1064,8 @@ def fetch_mileage_file(self, elr, update=False, dump_dir=None, verbose=False):
             2  0.1540                      0.70  ...         None
             3  0.1606                      0.73  ...         None
             [4 rows x 8 columns]
-
             >>> # Get the mileage file of 'LCG'
             >>> mla_mileage_file = em.fetch_mileage_file(elr='LCG')
-
         """
 
         try:
@@ -1090,7 +1085,7 @@ def fetch_mileage_file(self, elr, update=False, dump_dir=None, verbose=False):
 
             if dump_dir is not None:
                 save_data_to_file(
-                    cls=self, data=mileage_file, data_name=data_name, ext=ext, dump_dir=dump_dir,
+                    self, data=mileage_file, data_name=data_name, ext=ext, dump_dir=dump_dir,
                     verbose=verbose)
 
         except Exception as e:
@@ -1103,25 +1098,24 @@ def fetch_mileage_file(self, elr, update=False, dump_dir=None, verbose=False):
     @staticmethod
     def search_conn(start_elr, start_em, end_elr, end_em):
         """
-        Search for connection between two ELR-and-mileage pairs.
+        Searches for connections between two pairs of ELRs and their associated mileages.
 
-        :param start_elr: start ELR
+        :param start_elr: The starting ELR.
         :type start_elr: str
-        :param start_em: mileage file of the start ELR
+        :param start_em: The mileage file associated with the starting ELR.
         :type start_em: pandas.DataFrame
-        :param end_elr: end ELR
+        :param end_elr: The ending ELR.
         :type end_elr: str
-        :param end_em: mileage file of the end ELR
+        :param end_em: The mileage file associated with the ending ELR.
         :type end_em: pandas.DataFrame
-        :return: connection (<end mileage of the start ELR>, <start mileage of the end ELR>)
+        :return: A tuple containing the end mileage of the starting ELR and
+            the start mileage of the ending ELR.
         :rtype: tuple
 
         **Examples**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> elr_1 = 'AAM'
             >>> mileage_file_1 = em.collect_mileage_file(elr_1, confirmation_required=False)
             >>> mf_1_mileages = mileage_file_1['Mileage']
@@ -1133,7 +1127,6 @@ def search_conn(start_elr, start_em, end_elr, end_em):
             3  1.1012               ...
             4  1.1408               ...
             [5 rows x 11 columns]
-
             >>> elr_2 = 'ANZ'
             >>> mileage_file_2 = em.collect_mileage_file(elr_2, confirmation_required=False)
             >>> mf_2_mileages = mileage_file_2['Mileage']
@@ -1142,7 +1135,6 @@ def search_conn(start_elr, start_em, end_elr, end_em):
             0  84.0924                     84.42  ...         BEA        BEA
             1  84.1364                     84.62  ...  AAM (0.18)        AAM              0.18
             [2 rows x 8 columns]
-
             >>> elr_1_dest, elr_2_orig = em.search_conn(elr_1, mf_1_mileages, elr_2, mf_2_mileages)
             >>> elr_1_dest
             '0.0396'
@@ -1196,36 +1188,34 @@ def _select_measure(em_dat, key_pat):
 
     def get_conn_mileages(self, start_elr, end_elr, update=False, **kwargs):
         """
-        Get a connection point between two ELR-and-mileage pairs.
+        Retrieves the connection point between two pairs of ELRs and their associated mileages.
 
-        Namely, find the end and start mileages for the start and end ELRs, respectively.
+        Specifically, it finds the end mileage for the starting ELR and
+        the start mileage for the ending ELR.
 
         .. note::
 
-            This function may not be able to find the connection for every pair of ELRs.
-            See :ref:`Example 2<get_conn_mileages-example-2>` below.
+            This function may not be able to find a connection for every pair of ELRs.
+            Please refer to :ref:`Example 2<get_conn_mileages-example-2>` for more information.
 
-        :param start_elr: start ELR
+        :param start_elr: The starting ELR.
         :type start_elr: str
-        :param end_elr: end ELR
+        :param end_elr: The ending ELR.
         :type end_elr: str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param kwargs: [optional] parameters of the method
-            :py:meth:`ELRMileages.fetch_mileage_file()
-            <pyrcs.line_data.elr_mileage.ELRMileages.fetch_mileage_file>`
-        :return: connection ELR and mileages between the given ``start_elr`` and ``end_elr``
+        :param kwargs: [Optional] Additional parameters for the method
+            :py:meth:`~pyrcs.line_data.elr_mileage.ELRMileages.fetch_mileage_file`.
+        :return: A tuple containing the connection ELR(s) and mileage(s) between the specified 
+            ``start_elr`` and ``end_elr``.
         :rtype: tuple
 
         **Example 1**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> conn = em.get_conn_mileages(start_elr='NAY', end_elr='LTN2')
             >>> (s_dest_mlg, c_elr, c_orig_mlg, c_dest_mlg, e_orig_mlg) = conn
-
             >>> s_dest_mlg
             '5.1606'
             >>> c_elr
@@ -1242,9 +1232,7 @@ def get_conn_mileages(self, start_elr, end_elr, update=False, **kwargs):
         **Example 2**::
 
             >>> from pyrcs.line_data import ELRMileages  # from pyrcs import ELRMileages
-
             >>> em = ELRMileages()
-
             >>> conn = em.get_conn_mileages(start_elr='MAC3', end_elr='DBP1', dump_dir="tests")
             >>> conn
             ('', '', '', '', '')
diff --git a/pyrcs/line_data/line_name.py b/pyrcs/line_data/line_name.py
index 3949458..9811451 100644
--- a/pyrcs/line_data/line_name.py
+++ b/pyrcs/line_data/line_name.py
@@ -1,5 +1,5 @@
 """
-Collect `railway line names <http://www.railwaycodes.org.uk/misc/line_names.shtm>`_.
+Collects data of `railway line names <http://www.railwaycodes.org.uk/misc/line_names.shtm>`_.
 """
 
 import re
@@ -21,39 +21,37 @@ class LineNames:
     `railway line names <http://www.railwaycodes.org.uk/misc/line_names.shtm>`_.
     """
 
-    #: Name of the data
-    NAME = 'Railway line names'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Line names'
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '/line/line_names.shtm')
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The name of the data.
+    NAME: str = 'Railway line names'
+    #: The key for accessing the data.
+    KEY: str = 'Line names'
 
-    def __init__(self, data_dir=None, update=False, verbose=True):
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/line/line_names.shtm')
+
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
+    def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the data catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last update date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.line_data import LineNames  # from pyrcs import LineNames
-
             >>> ln = LineNames()
-
             >>> ln.NAME
             'Railway line names'
-
             >>> ln.URL
             'http://www.railwaycodes.org.uk/misc/line_names.shtm'
         """
@@ -62,28 +60,33 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = get_catalogue(url=self.URL, update=update, confirmation_required=False)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
         self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="line-data")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\line-data\\line-names"``.
+        The default data directory for this class is: ``"data\\line-data\\line-names"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.line_data.line_name.LineNames`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _pyhelpers.dir.cd:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
@@ -115,23 +118,23 @@ def _parse_route(x):
 
     def collect_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect data of `railway line names`_ from source web page.
+        Collects data of `railway line names`_ and associated route data from the source web page.
 
         .. _`railway line names`: http://www.railwaycodes.org.uk/misc/line_names.shtm
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: railway line names and routes data and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing railway line names, route data and the last update date,
+            or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import LineNames  # from pyrcs import LineNames
-
             >>> ln = LineNames()
-
             >>> line_names_codes = ln.collect_codes()
             To collect British railway line names
             ? [No]|Yes: yes
@@ -139,10 +142,8 @@ def collect_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(line_names_codes.keys())
             ['Line names', 'Last updated date']
-
             >>> ln.KEY
             'Line names'
-
             >>> line_names_codes_dat = line_names_codes[ln.KEY]
             >>> type(line_names_codes_dat)
             pandas.core.frame.DataFrame
@@ -158,7 +159,8 @@ def collect_codes(self, confirmation_required=True, verbose=False):
 
         data_name = self.NAME.lower()
 
-        if confirmed(f"To collect British {data_name}\n?", confirmation_required=confirmation_required):
+        if confirmed(
+                f"To collect British {data_name}\n?", confirmation_required=confirmation_required):
 
             print_collect_msg(
                 data_name=data_name, verbose=verbose, confirmation_required=confirmation_required)
@@ -184,11 +186,9 @@ def collect_codes(self, confirmation_required=True, verbose=False):
                     temp = line_names['Route'].map(self._parse_route)
                     line_names[rte_col] = pd.DataFrame(zip(*temp)).T
 
-                    last_updated_date = get_last_updated_date(self.URL)
-
                     line_names_data = {
                         self.KEY: line_names,
-                        self.KEY_TO_LAST_UPDATED_DATE: last_updated_date
+                        self.KEY_TO_LAST_UPDATED_DATE: get_last_updated_date(self.URL)
                     }
 
                     if verbose == 2:
@@ -204,34 +204,31 @@ def collect_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `railway line names`_.
+        Fetches data of `railway line names`_ and associated route data.
 
         .. _`railway line names`: http://www.railwaycodes.org.uk/misc/line_names.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: railway line names and routes data and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing railway line names, route data and the last update date.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import LineNames  # from pyrcs import LineNames
-
             >>> ln = LineNames()
-
             >>> line_names_codes = ln.fetch_codes()
             >>> type(line_names_codes)
             dict
             >>> list(line_names_codes.keys())
             ['Line names', 'Last updated date']
-
             >>> ln.KEY
             'Line names'
-
             >>> line_names_codes_dat = line_names_codes[ln.KEY]
             >>> type(line_names_codes_dat)
             pandas.core.frame.DataFrame
@@ -246,7 +243,7 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         line_names_data = fetch_data_from_file(
-            cls=self, method='collect_codes', data_name=self.KEY, ext=".pkl",
+            self, method='collect_codes', data_name=self.KEY, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return line_names_data
diff --git a/pyrcs/line_data/loc_id.py b/pyrcs/line_data/loc_id.py
index ed7d204..58acd6e 100644
--- a/pyrcs/line_data/loc_id.py
+++ b/pyrcs/line_data/loc_id.py
@@ -1,5 +1,6 @@
 """
-Collect `CRS, NLC, TIPLOC and STANOX codes <http://www.railwaycodes.org.uk/crs/crs0.shtm>`_.
+Collects data of
+`CRS, NLC, TIPLOC and STANOX codes <http://www.railwaycodes.org.uk/crs/crs0.shtm>`_.
 """
 
 import collections
@@ -25,45 +26,45 @@
 
 class LocationIdentifiers:
     """
-    A class for collecting data of
-    `location identifiers <http://www.railwaycodes.org.uk/crs/crs0.shtm>`_
-    (including `other systems' station codes <http://www.railwaycodes.org.uk/crs/crs1.shtm>`_).
+    A class for collecting data of location identifiers
+    (including `CRS, NLC, TIPLOC and STANOX codes <http://www.railwaycodes.org.uk/crs/crs0.shtm>`_
+    and `other systems' station codes <http://www.railwaycodes.org.uk/crs/crs1.shtm>`_).
 
-    The class helps retrieve and organise identifiers including CRS, NLC, TIPLOC and STANOX codes
-    for various railway stations and other related systems.
+    The class retrieves and organises location identifiers for various railway stations and
+    other related systems.
     """
 
-    #: Name of the data.
+    #: The name of the data.
     NAME: str = 'CRS, NLC, TIPLOC and STANOX codes'
-    #: Main key of the data.
+    #: The key for accessing the data.
     KEY: str = 'LocationID'
 
-    #: URL of the main web page of the data.
+    #: The URL of the main web page for the data.
     URL: str = urllib.parse.urljoin(home_page_url(), '/crs/crs0.shtm')
 
-    #: Key of the dict-type data of the '*other systems*'.
+    #: The key for accessing the data of *other systems*.
     KEY_TO_OTHER_SYSTEMS: str = 'Other systems'
-    #: Key of the dict-type data of the '*multiple station codes explanatory note*'.
+    #: The key for accessing the data of *multiple station codes explanatory note*.
     KEY_TO_MSCEN: str = 'Multiple station codes explanatory note'
-    #: Key of the dict-type data of *additional notes*.
+    #: The key for accessing the data of *additional notes*.
     KEY_TO_ADDITIONAL_NOTES: str = 'Additional notes'
 
-    #: Key of the data of the last updated date.
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: Name of data directory; defaults to ``None``.
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
         :type data_dir: str | None
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the data catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``True``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
         :type verbose: bool | int
 
-        :ivar dict catalogue: A dictionary containing the catalogue of location data.
+        :ivar dict catalogue: The catalogue of the data.
         :ivar str last_updated_date: The date when the data was last updated.
-        :ivar str data_dir: The directory path where the data is stored.
-        :ivar str current_data_dir: The current directory path for the data.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
@@ -99,24 +100,23 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
     def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change the working directory to the package's data directory or
-        a specified subdirectory (and/or file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The base directory for this module is: ``"data/line-data/crs-nlc-tiploc-stanox"``.
+        The default data directory for this class is: ``"data/line-data/crs-nlc-tiploc-stanox"``.
 
-        :param sub_dir: One or more subdirectories (and/or a file) within the base directory.
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param mkdir: If ``True``, the specified directory will be created if it does not exist;
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
             defaults to ``True``.
         :type mkdir: bool
-        :param kwargs: [Optional] Additional parameters passed to `pyhelpers.dirs.cd`_ function.
-        :type kwargs: dict
-        :return: The path to the directory (or file) within the backup data directory for the class
-            :py:class:`~pyrcs.line_data.loc_id.LocationIdentifiers`.
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _pyhelpers.dirs.cd:
-            https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dirs.cd.html
+        .. _`pyhelpers.dir.cd()`:
+            https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
         kwargs.update({'mkdir': mkdir})
@@ -126,16 +126,19 @@ def _cdd(self, *sub_dir, mkdir=True, **kwargs):
 
     def _get_introduction(self, verbose=False):
         """
-        Get the introductory text from the main web page of the location data.
-        (Incomplete.)
+        Gets the introductory text from the main web page for the location data cluster.
 
         This method fetches an incomplete introductory text describing the data for the current
         cluster (e.g., CRS, NLC, TIPLOC, and STANOX codes).
 
-        :param verbose: Whether to print relevant information in console; defaults to ``True``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: The introductory text from the main web page related to this data cluster.
+        :return: The introductory text for the current data cluster.
         :rtype: str
+
+        Todo:
+            Completes the fetching of the full introductory text, as the current version
+            only retrieves partial information.
         """
 
         introduction = None
@@ -184,14 +187,14 @@ def _collect_list(p, list_head_tag):
     @staticmethod
     def _parse_note_page(note_url, parser='html.parser', verbose=False):
         """
-        Parse the additional note page at the specified URL and extract its contents.
+        Parses the additional note page at the specified URL and extract its contents.
 
         :param note_url: The URL of the target web page to be parsed.
         :type note_url: str
         :param parser: The `parser`_ to use with `bs4.BeautifulSoup`_
-            (e.g. ``'html.parser'``, ``'lxml'``).; defaults to ``'html.parser'``.
+            (e.g. ``'html.parser'``, ``'lxml'``); defaults to ``'html.parser'``.
         :type parser: str
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
         :return: A list of parsed text elements from the web page.
         :rtype: list
@@ -257,12 +260,12 @@ def _parse_note_page(note_url, parser='html.parser', verbose=False):
 
     def collect_explanatory_note(self, confirmation_required=True, verbose=False):
         """
-        Collect the explanatory note related to multiple station codes (CRS codes)
+        Collects the explanatory note related to multiple station codes (CRS codes)
         from the source web page.
 
-        :param confirmation_required: Whether to confirm before proceeding; defaults to ``True``.
-        :type confirmation_required: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
         :return: A dictionary containing the data of the multiple station codes explanatory note,
             or ``None`` if the note is not found or the collection is not performed.
@@ -349,14 +352,14 @@ def collect_explanatory_note(self, confirmation_required=True, verbose=False):
 
     def fetch_explanatory_note(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch the explanatory note for multiple station codes (CRS codes) from the package data.
+        Fetches the explanatory note for multiple station codes (CRS codes).
 
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: The path to the directory where the data file will be saved;
+        :param dump_dir: The path to a directory where the data file will be saved;
             defaults to ``None``.
         :type dump_dir: str | None
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
         :return: A dictionary containing the data of the multiple station codes explanatory note.
         :rtype: dict
@@ -365,18 +368,14 @@ def fetch_explanatory_note(self, update=False, dump_dir=None, verbose=False):
 
             >>> from pyrcs.line_data import LocationIdentifiers
             >>> # from pyrcs import LocationIdentifiers
-
             >>> lid = LocationIdentifiers()
-
             >>> exp_note = lid.fetch_explanatory_note()
             >>> type(exp_note)
             dict
             >>> list(exp_note.keys())
             ['Multiple station codes explanatory note', 'Notes', 'Last updated date']
-
             >>> lid.KEY_TO_MSCEN
             'Multiple station codes explanatory note'
-
             >>> exp_note_dat = exp_note[lid.KEY_TO_MSCEN]
             >>> type(exp_note_dat)
             pandas.core.frame.DataFrame
@@ -390,7 +389,7 @@ def fetch_explanatory_note(self, update=False, dump_dir=None, verbose=False):
         """
 
         explanatory_note = fetch_data_from_file(
-            cls=self, method='collect_explanatory_note', data_name=self.KEY_TO_MSCEN,
+            self, method='collect_explanatory_note', data_name=self.KEY_TO_MSCEN,
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return explanatory_note
@@ -400,11 +399,11 @@ def fetch_explanatory_note(self, update=False, dump_dir=None, verbose=False):
     @staticmethod
     def _parse_raw_location_name(x):
         """
-        Parse the location name and extract any associated note from the raw data.
+        Parses the location name and extract any associated note from the raw data.
 
-        :param x: location name (in raw data)
+        :param x: Location name (in raw data).
         :type x: str | None
-        :return: location name and note (if any)
+        :return: Location name and note (if any).
         :rtype: tuple
 
         **Examples**::
@@ -494,7 +493,7 @@ def _parse_raw_location_name(x):
     @staticmethod
     def _amendment_to_location_names():
         """
-        Create a dictionary of amendments to adjust location names using regular expressions.
+        Creates a dictionary of amendments to adjust location names using regular expressions.
 
         This method generates a dictionary where the keys are regular expression patterns, and the
         values are the corresponding amendments to be applied to location names.
@@ -532,7 +531,7 @@ def _amendment_to_location_names():
 
     def _parse_location_name(self, data):
         """
-        Parse location names from the preprocessed data of location codes.
+        Parses location names from the preprocessed data of location codes.
 
         :param data: A dataframe containing preprocessed data with location codes.
         :type data: pandas.DataFrame
@@ -655,7 +654,7 @@ def _fix_special_cases(data):
 
     def _cleanse_mult_alt_codes(self, data):
         """
-        Cleanse multiple alternatives for every code column.
+        Cleanses multiple alternatives for every code column.
 
         :param data: The preprocessed data of the location codes.
         :type data: pandas.DataFrame
@@ -718,7 +717,7 @@ def _cleanse_mult_alt_codes(self, data):
     @staticmethod
     def _get_code_note(x):
         """
-        Get note for every code column.
+        Gets note for every code column.
 
         :param x: The raw data of a given code.
         :type x: str | None
@@ -759,7 +758,7 @@ def _get_code_note(x):
 
     def _get_code_notes(self, data):
         """
-        Get notes for every code column.
+        Gets notes for every code column.
 
         :param data: The preprocessed data of the location codes.
         :type data: pandas.DataFrame
@@ -782,7 +781,7 @@ def _get_code_notes(self, data):
     @staticmethod
     def _stanox_note(x):  # Parse STANOX note
         """
-        Parse STANOX note.
+        Parses STANOX note.
 
         :param x: STANOX note.
         :type x: str | None
@@ -822,7 +821,7 @@ def _stanox_note(x):  # Parse STANOX note
 
     def _parse_stanox_note(self, data):
         """
-        Parse the note for STANOX.
+        Parses the note for STANOX.
 
         :param data: The preprocessed data of the location codes.
         :type data: pandas.DataFrame
@@ -859,18 +858,17 @@ def _get_additional_notes(self, data, beginning_with, soup):
 
     def collect_codes_by_initial(self, initial, update=False, verbose=False):
         """
-        Collect `CRS, NLC, TIPLOC, STANME and STANOX codes
+        Collects `CRS, NLC, TIPLOC, STANME and STANOX codes
         <http://www.railwaycodes.org.uk/crs/crs0.shtm>`_ for a given initial letter.
 
-        :param initial: An initial letter of station/junction name or certain word
-            for specifying URL.
+        :param initial: The initial letter (e.g. ``'a'``, ``'z'``) of a location name.
         :type initial: str
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
         :type verbose: bool | int
-        :return: Data of locations beginning with the given initial letter and
-            date of when the data was last updated.
+        :return: A dictionary containing data of locations whose names start with the given
+            initial letter, along with the date of the last update.
         :rtype: dict
 
         **Examples**::
@@ -1004,15 +1002,17 @@ def _parse_tbl_dat(self, h3_or_h4):
 
     def collect_other_systems_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect data of `other systems' station codes`_ from source web page.
+        Collects data of `other systems' station codes`_ from the source web page.
 
         .. _`other systems' station codes`: http://www.railwaycodes.org.uk/crs/crs1.shtm
 
-        :param confirmation_required: Whether to confirm before proceeding; defaults to ``True``.
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: Codes of other systems.
+        :return: A dictionary containing station codes for other systems,
+            or ``None`` if no data is collected.
         :rtype: dict | None
 
         **Examples**::
@@ -1103,18 +1103,18 @@ def collect_other_systems_codes(self, confirmation_required=True, verbose=False)
 
     def fetch_other_systems_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `other systems' station codes`_.
+        Fetches data of `other systems' station codes`_.
 
         .. _`other systems' station codes`: http://www.railwaycodes.org.uk/crs/crs1.shtm
 
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped;
+        :param dump_dir: The path to a directory where the data file will be saved;
             defaults to ``None``.
         :type dump_dir: str | None
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: Codes of other systems.
+        :return: A dictionary containing station codes for other systems.
         :rtype: dict
 
         **Examples**::
@@ -1143,30 +1143,33 @@ def fetch_other_systems_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         other_systems_codes = fetch_data_from_file(
-            cls=self, method='collect_other_systems_codes', data_name=self.KEY_TO_OTHER_SYSTEMS,
+            self, method='collect_other_systems_codes', data_name=self.KEY_TO_OTHER_SYSTEMS,
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return other_systems_codes
 
+    # -- All codes ---------------------------------------------------------------------------------
+
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch `CRS, NLC, TIPLOC, STANME and STANOX codes`_ and `other systems' station codes`_.
+        Fetches location codes listed in the `CRS, NLC, TIPLOC and STANOX codes`_ catalogue
+        (including `other systems' station codes`_).
 
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        .. _`CRS, NLC, TIPLOC and STANOX codes`:
+            http://www.railwaycodes.org.uk/crs/crs0.shtm
+        .. _`other systems' station codes`:
+            http://www.railwaycodes.org.uk/crs/crs1.shtm
+
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped;
+        :param dump_dir: The path to a directory where the data file will be saved;
             defaults to ``None``.
         :type dump_dir: str | None
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: Data of location codes and date of when the data was last updated.
+        :return: A dictionary containing location codes and date of when the data was last updated.
         :rtype: dict
 
-        .. _`CRS, NLC, TIPLOC, STANME and STANOX codes`:
-            http://www.railwaycodes.org.uk/crs/crs0.shtm
-        .. _`other systems' station codes`:
-            http://www.railwaycodes.org.uk/crs/crs1.shtm
-
         **Examples**::
 
             >>> from pyrcs.line_data import LocationIdentifiers
@@ -1255,28 +1258,32 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
     def make_xref_dict(self, keys, initials=None, main_key=None, as_dict=False,
                        drop_duplicates=False, dump_it=False, dump_dir=None, verbose=False):
         """
-        Make a dict/dataframe for location code data for the given ``keys``.
+        Creates a dictionary or dataframe containing location code data for the specified ``keys``.
 
-        :param keys: One or a sublist of ``['CRS', 'NLC', 'TIPLOC', 'STANOX', 'STANME']``.
+        :param keys: A string or list of keys from ``['CRS', 'NLC', 'TIPLOC', 'STANOX', 'STANME']``
+            representing the location codes.
         :type keys: str | list
-        :param initials: One or multiple initials for which the codes are used;
+        :param initials: A string or list of initials for which the codes are filtered;
             defaults to ``None``.
         :type initials: str | list | None
-        :param main_key: Key of the returned dictionary (when ``as_dict=True``);
+        :param main_key: The key used for the returned dictionary when ``as_dict=True``;
             defaults to ``None``.
         :type main_key: str | None
-        :param as_dict: Whether to return a dictionary; defaults to ``False``.
+        :param as_dict: If ``True``, returns the result as a dictionary;
+            otherwise, returns a dataframe; defaults to ``False``.
         :type as_dict: bool
-        :param drop_duplicates: Whether to drop duplicates; defaults to ``False``.
+        :param drop_duplicates: If ``True``, removes duplicate entries from the result;
+            defaults to ``False``.
         :type drop_duplicates: bool
-        :param dump_it: Whether to save the location codes dictionary; defaults to ``False``.
+        :param dump_it: If ``True``, saves the result to a file; defaults to ``False``.
         :type dump_it: bool
-        :param dump_dir: Pathname of a directory where the data file is dumped;
+        :param dump_dir: The directory path where the file can be saved, if ``dump_it=True``;
             defaults to ``None``.
         :type dump_dir: str | None
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: A dictionary or a dataframe for location code data for the given ``keys``.
+        :return: A dictionary or dataframe containing cross-reference location data
+            for the specified ``keys``, or ``None`` if no data is available.
         :rtype: dict | pandas.DataFrame | None
 
         **Examples**::
diff --git a/pyrcs/line_data/lor_code.py b/pyrcs/line_data/lor_code.py
index fe789e1..b28fe30 100644
--- a/pyrcs/line_data/lor_code.py
+++ b/pyrcs/line_data/lor_code.py
@@ -1,5 +1,5 @@
 """
-Collect `Line of Route (LOR/PRIDE) <http://www.railwaycodes.org.uk/pride/pride0.shtm>`_ codes.
+Collects `Line of Route (LOR/PRIDE) <http://www.railwaycodes.org.uk/pride/pride0.shtm>`_ codes.
 """
 
 import itertools
@@ -30,47 +30,44 @@ class LOR:
         respectively.
     """
 
-    #: Name of the data
-    NAME = 'Possession Resource Information Database (PRIDE)/Line Of Route (LOR) codes'
-    #: Short name of the data
-    SHORT_NAME = 'Line of Route (LOR/PRIDE) codes'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'LOR'
-    #: Key of the dict-type data of prefixes
-    KEY_P = 'Key to prefixes'
-    #: Key of the dict-type data of *ELR/LOR converter*
-    KEY_ELC = 'ELR/LOR converter'
-
-    #: URL of the main web page of the data
+    #: The name of the data.
+    NAME: str = 'Possession Resource Information Database (PRIDE)/Line Of Route (LOR) codes'
+    #: A short name of the data
+    SHORT_NAME: str = 'Line of Route (LOR/PRIDE) codes'
+    #: The key for accessing the data.
+    KEY: str = 'LOR'
+    #: The key for accessing the data of *prefixes*.
+    KEY_P: str = 'Key to prefixes'
+    #: The key for accessing the data of *ELR/LOR converter*.
+    KEY_ELC: str = 'ELR/LOR converter'
+
+    #: The URL of the main web page for the data.
     URL = urllib.parse.urljoin(home_page_url(), '/pride/pride0.shtm')
 
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the data catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
-        :ivar list valid_prefixes: valid prefixes
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
+        :ivar list valid_prefixes: A list of valid prefixes.
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> lor.NAME
             'Possession Resource Information Database (PRIDE)/Line Of Route (LOR) codes'
-
             >>> lor.URL
             'http://www.railwaycodes.org.uk/pride/pride0.shtm'
         """
@@ -79,62 +76,66 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = get_catalogue(url=self.URL, update=update, confirmation_required=False)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
         self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="line-data")
 
         self.valid_prefixes = self.get_keys_to_prefixes(prefixes_only=True)
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\line-data\\lor"``.
+        The default data directory for this class is: ``"data\\line-data\\lor"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.line_data.lor_code.LOR`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _pyhelpers.dir.cd:
+        .. _pyhelpers.dir.cd():
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     def get_keys_to_prefixes(self, prefixes_only=True, update=False, verbose=False):
         """
-        Get the keys to PRIDE/LOR code prefixes.
+        Gets the keys to PRIDE/LOR code prefixes.
 
-        :param prefixes_only: whether to get only prefixes, defaults to ``True``
+        :param prefixes_only: If ``True`` (default), returns only the prefixes;
+            otherwise, additional information, including the last updated date.
         :type prefixes_only: bool
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
-        :return: keys to LOR code prefixes
-        :rtype: list or dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A list of the keys to LOR code prefixes if ``prefixes_only=True``,
+            otherwise a dictionary containing code prefixes and the last updated date,
+            or ``None`` if no data is available.
+        :rtype: list | dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> keys_to_pfx = lor.get_keys_to_prefixes()
             >>> keys_to_pfx
             ['CY', 'EA', 'GW', 'LN', 'MD', 'NW', 'NZ', 'SC', 'SO', 'SW', 'XR']
-
             >>> keys_to_pfx = lor.get_keys_to_prefixes(prefixes_only=False)
             >>> type(keys_to_pfx)
             dict
             >>> list(keys_to_pfx.keys())
             ['Key to prefixes', 'Last updated date']
-
             >>> keys_to_pfx_codes = keys_to_pfx['Key to prefixes']
             >>> type(keys_to_pfx_codes)
             pandas.core.frame.DataFrame
@@ -149,10 +150,10 @@ def get_keys_to_prefixes(self, prefixes_only=True, update=False, verbose=False):
 
         data_name = "{}prefixes".format("" if prefixes_only else "keys-to-")
         ext = ".pkl"
-        path_to_pickle = self._cdd(data_name + ext)
+        path_to_pkl = self._cdd(data_name + ext)
 
-        if os.path.isfile(path_to_pickle) and not update:
-            keys_to_prefixes = load_data(path_to_pickle)
+        if os.path.isfile(path_to_pkl) and not update:
+            keys_to_prefixes = load_data(path_to_pkl)
 
         else:
             keys_to_prefixes = None
@@ -163,12 +164,13 @@ def get_keys_to_prefixes(self, prefixes_only=True, update=False, verbose=False):
                 soup = bs4.BeautifulSoup(markup=source.content, features='html.parser')
                 span_tags = soup.find_all(name='span', attrs={'class': 'tab2'})
 
-                data = [(x.text, x.next_sibling.strip().replace('=  ', '')) for x in span_tags]
+                data = [(x.text, str(x.next_sibling).strip().replace('=  ', '')) for x in span_tags]
 
                 lor_pref = pd.DataFrame(data=data, columns=['Prefixes', 'Name'])
 
             except Exception as e:
-                verbose_ = True if (update and verbose != 2) else (False if verbose == 2 else verbose)
+                verbose_ = True if (update and verbose != 2) \
+                    else (False if verbose == 2 else verbose)
                 if verbose_:
                     print("Failed. ", end="")
                 print_inst_conn_err(update=update, verbose=verbose_, e=e)
@@ -200,23 +202,21 @@ def get_keys_to_prefixes(self, prefixes_only=True, update=False, verbose=False):
 
     def get_page_urls(self, update=False, verbose=False):
         """
-        Get URLs to `PRIDE/LOR codes`_ with different prefixes.
+        Gets URLs to `PRIDE/LOR codes`_ with different prefixes.
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
-        :return: a list of URLs of web pages hosting LOR codes for each prefix
-        :rtype: list or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A list of URLs of the web pages hosting LOR codes for each prefix.
+        :rtype: list | None
 
         .. _`PRIDE/LOR codes`: http://www.railwaycodes.org.uk/pride/pride0.shtm
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> lor_urls = lor.get_page_urls()
             >>> type(lor_urls)
             list
@@ -267,19 +267,18 @@ def get_page_urls(self, update=False, verbose=False):
 
     def _update_catalogue(self, confirmation_required=True, verbose=False):
         """
-        Update catalogue data including keys to prefixes and LOR page URLs.
+        Updates catalogue data including keys to prefixes and LOR page URLs.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> lor._update_catalogue()
             To update catalogue
             ? [No]|Yes: yes
@@ -295,9 +294,9 @@ def _update_catalogue(self, confirmation_required=True, verbose=False):
     @staticmethod
     def _parse_line_name(x):
         """
-        Parse the column of 'Line Name'.
+        Parses the column of 'Line Name'.
 
-        :return: line name and its corresponding note
+        :return: The line name and its corresponding note.
         :rtype: tuple
         """
         # re.search('\w+.*(?= \(\[\')', x).group()
@@ -408,23 +407,23 @@ def _collect_codes_by_prefix(self, prefix_, data_name, verbose):
 
     def collect_codes_by_prefix(self, prefix, update=False, verbose=False):
         """
-        Collect `PRIDE/LOR codes <http://www.railwaycodes.org.uk/pride/pride0.shtm>`_ by a given prefix.
+        Collects the data of `PRIDE/LOR codes <http://www.railwaycodes.org.uk/pride/pride0.shtm>`_
+        based on the given prefix.
 
-        :param prefix: prefix of LOR codes
+        :param prefix: The prefix of LOR codes to collect.
         :type prefix: str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: LOR codes for the given ``prefix``
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the LOR codes for the given ``prefix``,
+            or ``None`` if no data is available.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> lor_codes_cy = lor.collect_codes_by_prefix(prefix='CY')
             >>> type(lor_codes_cy)
             dict
@@ -438,7 +437,6 @@ def collect_codes_by_prefix(self, prefix, update=False, verbose=False):
             0   CY240  ...           Caerwent branch RA4
             1  CY1540  ...  Pembroke - Pembroke Dock RA6
             [2 rows x 5 columns]
-
             >>> lor_codes_nw = lor.collect_codes_by_prefix(prefix='NW')
             >>> type(lor_codes_nw)
             dict
@@ -453,7 +451,6 @@ def collect_codes_by_prefix(self, prefix, update=False, verbose=False):
             3  NW1004  ...
             4  NW1005  ...
             [5 rows x 5 columns]
-
             >>> lor_codes_xr = lor.collect_codes_by_prefix(prefix='XR')
             >>> type(lor_codes_xr)
             dict
@@ -494,25 +491,24 @@ def collect_codes_by_prefix(self, prefix, update=False, verbose=False):
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `PRIDE/LOR codes`_.
+        Fetches the data of `PRIDE/LOR codes`_.
 
         .. _`PRIDE/LOR codes`: http://www.railwaycodes.org.uk/pride/pride0.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: LOR codes
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the LOR codes.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> lor_codes_dat = lor.fetch_codes()
             >>> type(lor_codes_dat)
             dict
@@ -523,7 +519,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             dict
             >>> list(l_codes.keys())
             ['CY', 'EA', 'GW', 'LN', 'MD', 'NW/NZ', 'SC', 'SO', 'SW', 'XR']
-
             >>> cy_codes = l_codes['CY']
             >>> type(cy_codes)
             dict
@@ -534,7 +529,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             0   CY240  ...           Caerwent branch RA4
             1  CY1540  ...  Pembroke - Pembroke Dock RA6
             [2 rows x 5 columns]
-
             >>> xr_codes = l_codes['XR']
             >>> type(xr_codes)
             dict
@@ -594,22 +588,23 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
 
     def collect_elr_lor_converter(self, confirmation_required=True, verbose=False):
         """
-        Collect `ELR/LOR converter <http://www.railwaycodes.org.uk/pride/elrmapping.shtm>`_
-        from source web page.
+        Collects the data of
+        `ELR/LOR converter <http://www.railwaycodes.org.uk/pride/elrmapping.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of ELR/LOR converter
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of ELR/LOR converter,
+            or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> elr_lor_conv = lor.collect_elr_lor_converter()
             To collect data of ELR/LOR converter
             ? [No]|Yes: yes
@@ -617,7 +612,6 @@ def collect_elr_lor_converter(self, confirmation_required=True, verbose=False):
             dict
             >>> list(elr_lor_conv.keys())
             ['ELR/LOR converter', 'Last updated date']
-
             >>> elr_loc_conv_data = elr_lor_conv['ELR/LOR converter']
             >>> type(elr_loc_conv_data)
             pandas.core.frame.DataFrame
@@ -701,31 +695,29 @@ def collect_elr_lor_converter(self, confirmation_required=True, verbose=False):
 
     def fetch_elr_lor_converter(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `ELR/LOR converter`_.
+        Fetches the data of `ELR/LOR converter`_.
 
         .. _`ELR/LOR converter`: http://www.railwaycodes.org.uk/pride/elrmapping.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of ELR/LOR converter
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of ELR/LOR converter.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import LOR  # from pyrcs import LOR
-
             >>> lor = LOR()
-
             >>> elr_lor_conv = lor.fetch_elr_lor_converter()
             >>> type(elr_lor_conv)
             dict
             >>> list(elr_lor_conv.keys())
             ['ELR/LOR converter', 'Last updated date']
-
             >>> elr_loc_conv_data = elr_lor_conv['ELR/LOR converter']
             >>> type(elr_loc_conv_data)
             pandas.core.frame.DataFrame
@@ -740,7 +732,7 @@ def fetch_elr_lor_converter(self, update=False, dump_dir=None, verbose=False):
         """
 
         elr_lor_converter = fetch_data_from_file(
-            cls=self, method='collect_elr_lor_converter', data_name=re.sub(r"[/ ]", "-", self.KEY_ELC),
+            self, method='collect_elr_lor_converter', data_name=re.sub(r"[/ ]", "-", self.KEY_ELC),
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return elr_lor_converter
diff --git a/pyrcs/line_data/trk_diagr.py b/pyrcs/line_data/trk_diagr.py
index 33fcade..127070c 100644
--- a/pyrcs/line_data/trk_diagr.py
+++ b/pyrcs/line_data/trk_diagr.py
@@ -1,5 +1,5 @@
 """
-Collect British `railway track diagrams <http://www.railwaycodes.org.uk/track/diagrams0.shtm>`_.
+Collects British `railway track diagrams <http://www.railwaycodes.org.uk/track/diagrams0.shtm>`_.
 """
 
 import os
@@ -23,90 +23,92 @@ class TrackDiagrams:
     `railway track diagrams <http://www.railwaycodes.org.uk/track/diagrams0.shtm>`_.
     """
 
-    #: Name of the data
-    NAME = 'Railway track diagrams'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Track diagrams'
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '/line/diagrams0.shtm')
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The name of the data.
+    NAME: str = 'Railway track diagrams'
+    #: The key for accessing the data.
+    KEY: str = 'Track diagrams'
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/line/diagrams0.shtm')
+
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the data catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.line_data import TrackDiagrams  # from pyrcs import TrackDiagrams
-
             >>> td = TrackDiagrams()
-
             >>> td.NAME
             'Railway track diagrams'
-
             >>> td.URL
             'http://www.railwaycodes.org.uk/line/diagrams0.shtm'
         """
 
         print_conn_err(verbose=verbose)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
-        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="line-data")
+        self.catalogue = self.fetch_catalogue(
+            update=update, verbose=True if verbose == 2 else False)
 
-        self.catalogue = self.fetch_catalogue(update=update, verbose=True if verbose == 2 else False)
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="line-data")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\line-data\\track-diagrams"``.
+        The default data directory for this class is: ``"data\\line-data\\track-diagrams"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.line_data.trk_diagr.TrackDiagrams`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _pyhelpers.dir.cd:
+        .. _pyhelpers.dir.cd():
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     def _get_items(self, update=False, verbose=False):
         """
-        Get catalogue of track diagrams.
+        Gets the catalogue of track diagrams.
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
-        :return: catalogue of railway station data
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: The catalogue of railway station data.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import TrackDiagrams  # from pyrcs import TrackDiagrams
-
             >>> td = TrackDiagrams()
-
             >>> trk_diagr_items = td._get_items()
-
             >>> trk_diagr_items
             {'Track diagrams': {'London Underground',
               'Main line diagrams',
@@ -212,21 +214,21 @@ def _collect_catalogue(self, source, data_name, verbose):
 
     def collect_catalogue(self, confirmation_required=True, verbose=False):
         """
-        Collect catalogue of sample railway track diagrams from source web page.
+        Collects the catalogue of sample railway track diagrams from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: catalogue of railway track diagrams and date of when the catalogue was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the railway track diagram catalogue and
+            the date it was last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.line_data import TrackDiagrams  # from pyrcs import TrackDiagrams
-
             >>> td = TrackDiagrams()
-
             >>> track_diagrams_catalog = td.collect_catalogue()
             To collect the catalogue of track diagrams
             ? [No]|Yes: yes
@@ -234,13 +236,11 @@ def collect_catalogue(self, confirmation_required=True, verbose=False):
             dict
             >>> list(track_diagrams_catalog.keys())
             ['Track diagrams', 'Last updated date']
-
             >>> td_dat = track_diagrams_catalog['Track diagrams']
             >>> type(td_dat)
             dict
             >>> list(td_dat.keys())
             ['Main line diagrams', 'Tram systems', 'London Underground', 'Miscellaneous']
-
             >>> main_line_diagrams = td_dat['Main line diagrams']
             >>> type(main_line_diagrams)
             tuple
@@ -254,8 +254,8 @@ def collect_catalogue(self, confirmation_required=True, verbose=False):
 
         data_name = self.KEY.lower()
 
-        if confirmed("To collect the catalogue of {}\n?".format(data_name), confirmation_required):
-            print_collect_msg(data_name, verbose=verbose, confirmation_required=confirmation_required)
+        if confirmed(f"To collect the catalogue of {data_name}\n?", confirmation_required):
+            print_collect_msg(data_name, verbose, confirmation_required)
 
             try:
                 source = requests.get(url=self.URL, headers=fake_requests_headers())
@@ -272,36 +272,33 @@ def collect_catalogue(self, confirmation_required=True, verbose=False):
 
     def fetch_catalogue(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch the catalogue of railway track diagrams.
+        Fetches the catalogue of railway track diagrams.
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: catalogue of sample railway track diagrams and
-            date of when the catalogue was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the catalogue of railway track diagrams and
+            the date it was last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.line_data import TrackDiagrams  # from pyrcs import TrackDiagrams
-
             >>> td = TrackDiagrams()
-
             >>> trk_diagr_cat = td.fetch_catalogue()
             >>> type(trk_diagr_cat)
             dict
             >>> list(trk_diagr_cat.keys())
             ['Track diagrams', 'Last updated date']
-
             >>> td_dat = trk_diagr_cat['Track diagrams']
             >>> type(td_dat)
             dict
             >>> list(td_dat.keys())
             ['Main line diagrams', 'Tram systems', 'London Underground', 'Miscellaneous']
-
             >>> main_line_diagrams = td_dat['Main line diagrams']
             >>> type(main_line_diagrams)
             tuple
@@ -314,7 +311,7 @@ def fetch_catalogue(self, update=False, dump_dir=None, verbose=False):
         """
 
         track_diagrams_catalogue = fetch_data_from_file(
-            cls=self, method='collect_catalogue', data_name=self.KEY, ext=".pkl",
-            update=update, dump_dir=dump_dir, verbose=verbose, data_dir=cd_data("catalogue"))
+            self, method='collect_catalogue', data_name=self.KEY, ext=".pkl", update=update,
+            dump_dir=dump_dir, verbose=verbose, data_dir=cd_data("catalogue"))
 
         return track_diagrams_catalogue
diff --git a/pyrcs/other_assets/__init__.py b/pyrcs/other_assets/__init__.py
index 8e466ec..520ab47 100644
--- a/pyrcs/other_assets/__init__.py
+++ b/pyrcs/other_assets/__init__.py
@@ -1,8 +1,8 @@
 """
-A sub-package of modules for collecting codes of `other assets
-<http://www.railwaycodes.org.uk/otherassetsmenu.shtm>`_.
+A subpackage for collecting codes of
+`other assets <http://www.railwaycodes.org.uk/otherassetsmenu.shtm>`_.
 
-(See also :py:class:`~pyrcs.collector.OtherAssets`.)
+(See also the :py:class:`~pyrcs.collector.OtherAssets` class.)
 """
 
 from .depot import Depots
diff --git a/pyrcs/other_assets/depot.py b/pyrcs/other_assets/depot.py
index 4dc25d9..fedf299 100644
--- a/pyrcs/other_assets/depot.py
+++ b/pyrcs/other_assets/depot.py
@@ -1,5 +1,5 @@
 """
-Collect data of `depot codes <http://www.railwaycodes.org.uk/depots/depots0.shtm>`_.
+Collects data of `depot codes <http://www.railwaycodes.org.uk/depots/depots0.shtm>`_.
 """
 
 import re
@@ -12,8 +12,9 @@
 from pyhelpers.ops import confirmed, fake_requests_headers
 
 from ..parser import get_catalogue, get_last_updated_date, parse_tr
-from ..utils import confirm_msg, fetch_data_from_file, format_err_msg, home_page_url, init_data_dir, \
-    is_home_connectable, print_collect_msg, print_conn_err, print_inst_conn_err, save_data_to_file
+from ..utils import confirm_msg, fetch_data_from_file, format_err_msg, home_page_url, \
+    init_data_dir, is_home_connectable, print_collect_msg, print_conn_err, print_inst_conn_err, \
+    save_data_to_file
 
 
 class Depots:
@@ -22,49 +23,46 @@ class Depots:
     `depot codes <http://www.railwaycodes.org.uk/depots/depots0.shtm>`_.
     """
 
-    #: Name of the data
-    NAME = 'Depot codes'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Depots'
+    #: The name of the data.
+    NAME: str = 'Depot codes'
+    #: The key for accessing the data.
+    KEY: str = 'Depots'
 
-    #: Key of the dict-type data of two character TOPS codes
-    KEY_TO_TOPS = 'Two character TOPS codes'
-    #: Key of the dict-type data of four digit pre-TOPS codes
-    KEY_TO_PRE_TOPS = 'Four digit pre-TOPS codes'
-    #: Key of the dict-type data of 1950 system (pre-TOPS) codes
-    KEY_TO_1950_SYSTEM = '1950 system (pre-TOPS) codes'
-    #: Key of the dict-type data of GWR codes
-    KEY_TO_GWR = 'GWR codes'
+    #: The key for accessing the data of two character TOPS codes
+    KEY_TO_TOPS: str = 'Two character TOPS codes'
+    #: The key for accessing the data of four digit pre-TOPS codes
+    KEY_TO_PRE_TOPS: str = 'Four digit pre-TOPS codes'
+    #: The key for accessing the data of 1950 system (pre-TOPS) codes
+    KEY_TO_1950_SYSTEM: str = '1950 system (pre-TOPS) codes'
+    #: The key for accessing the data of GWR codes
+    KEY_TO_GWR: str = 'GWR codes'
 
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '/depots/depots0.shtm')
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/depots/depots0.shtm')
 
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the catagloue data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> depots.NAME
             'Depot codes'
-
             >>> depots.URL
             'http://www.railwaycodes.org.uk/depots/depots0.shtm'
         """
@@ -73,49 +71,54 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = get_catalogue(url=self.URL, update=update, confirmation_required=False)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
-        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="other-assets")
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, "other-assets")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\other-assets\\depots"``.
+        The default data directory for this class is: ``"data\\other-assets\\depots"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.other_assets.depot.Depots`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     def collect_tops_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect `two-character TOPS codes <http://www.railwaycodes.org.uk/depots/depots1.shtm>`_
-        from source web page.
+        Collects `two-character TOPS codes <http://www.railwaycodes.org.uk/depots/depots1.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of two-character TOPS codes and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the two-character TOPS codes and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> tct_codes = depots.collect_tops_codes()
             To collect data of two character TOPS codes
             ? [No]|Yes: yes
@@ -123,10 +126,8 @@ def collect_tops_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(tct_codes.keys())
             ['Two character TOPS codes', 'Last updated date']
-
             >>> depots.KEY_TO_TOPS
             'Two character TOPS codes'
-
             >>> tct_codes_dat = tct_codes[depots.KEY_TO_TOPS]
             >>> type(tct_codes_dat)
             pandas.core.frame.DataFrame
@@ -143,9 +144,7 @@ def collect_tops_codes(self, confirmation_required=True, verbose=False):
         cfm_msg = confirm_msg(self.KEY_TO_TOPS)
 
         if confirmed(cfm_msg, confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                self.KEY_TO_TOPS, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(self.KEY_TO_TOPS, verbose, confirmation_required)
 
             two_char_tops_codes_data = None
 
@@ -186,34 +185,32 @@ def collect_tops_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_tops_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `two-character TOPS codes`_.
+        Fetches the data of `two-character TOPS codes`_.
 
         .. _`two-character TOPS codes`: http://www.railwaycodes.org.uk/depots/depots1.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of two-character TOPS codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of two-character TOPS codes and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> tct_codes = depots.fetch_tops_codes()
             >>> type(tct_codes)
             dict
             >>> list(tct_codes.keys())
             ['Two character TOPS codes', 'Last updated date']
-
             >>> depots.KEY_TO_TOPS
             'Two character TOPS codes'
-
             >>> tct_codes_dat = tct_codes[depots.KEY_TO_TOPS]
             >>> type(tct_codes_dat)
             pandas.core.frame.DataFrame
@@ -228,29 +225,29 @@ def fetch_tops_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         two_char_tops_codes_data = fetch_data_from_file(
-            cls=self, method='collect_tops_codes', data_name=self.KEY_TO_TOPS, ext=".pkl",
+            self, method='collect_tops_codes', data_name=self.KEY_TO_TOPS, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return two_char_tops_codes_data
 
     def collect_pre_tops_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect `four-digit pre-TOPS codes <http://www.railwaycodes.org.uk/depots/depots2.shtm>`_
-        from source web page.
+        Collects `four-digit pre-TOPS codes <http://www.railwaycodes.org.uk/depots/depots2.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of four-digit pre-TOPS codes and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the four-digit pre-TOPS codes and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> fdpt_codes = depots.collect_pre_tops_codes()
             To collect data of four digit pre-TOPS codes
             ? [No]|Yes: yes
@@ -258,10 +255,8 @@ def collect_pre_tops_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(fdpt_codes.keys())
             ['Four digit pre-TOPS codes', 'Last updated date']
-
             >>> depots.KEY_TO_PRE_TOPS
             'Four digit pre-TOPS codes'
-
             >>> fdpt_codes_dat = fdpt_codes[depots.KEY_TO_PRE_TOPS]
             >>> type(fdpt_codes_dat)
             pandas.core.frame.DataFrame
@@ -277,8 +272,7 @@ def collect_pre_tops_codes(self, confirmation_required=True, verbose=False):
         data_name = self.KEY_TO_PRE_TOPS[:1].lower() + self.KEY_TO_PRE_TOPS[1:]
         cfm_msg = confirm_msg(data_name)
         if confirmed(cfm_msg, confirmation_required=confirmation_required):
-
-            print_collect_msg(data_name, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(data_name, verbose, confirmation_required)
 
             four_digit_pre_tops_codes_data = None
 
@@ -346,34 +340,32 @@ def _identify_region(x):
 
     def fetch_pre_tops_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `four-digit pre-TOPS codes`_.
+        Fetches the data of `four-digit pre-TOPS codes`_.
 
         .. _`four-digit pre-TOPS codes`: http://www.railwaycodes.org.uk/depots/depots2.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of four-digit pre-TOPS codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the four-digit pre-TOPS codes and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> fdpt_codes = depots.fetch_pre_tops_codes()
             >>> type(fdpt_codes)
             dict
             >>> list(fdpt_codes.keys())
             ['Four digit pre-TOPS codes', 'Last updated date']
-
             >>> depots.KEY_TO_PRE_TOPS
             'Four digit pre-TOPS codes'
-
             >>> fdpt_codes_dat = fdpt_codes[depots.KEY_TO_PRE_TOPS]
             >>> type(fdpt_codes_dat)
             pandas.core.frame.DataFrame
@@ -389,29 +381,30 @@ def fetch_pre_tops_codes(self, update=False, dump_dir=None, verbose=False):
         data_name = re.sub(r'[ -]', '-', self.KEY_TO_PRE_TOPS)
 
         four_digit_pre_tops_codes_data = fetch_data_from_file(
-            cls=self, method='collect_pre_tops_codes', data_name=data_name, ext=".pkl",
-            update=update, dump_dir=dump_dir, verbose=verbose)
+            self, method='collect_pre_tops_codes', data_name=data_name, ext=".pkl", update=update,
+            dump_dir=dump_dir, verbose=verbose)
 
         return four_digit_pre_tops_codes_data
 
     def collect_1950_system_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect `1950 system (pre-TOPS) codes <http://www.railwaycodes.org.uk/depots/depots3.shtm>`_
-        from source web page.
+        Collects
+        `1950 system (pre-TOPS) codes <http://www.railwaycodes.org.uk/depots/depots3.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of 1950 system (pre-TOPS) codes and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the 1950 system (pre-TOPS) codes and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> s1950_codes = depots.collect_1950_system_codes()
             To collect data of 1950 system (pre-TOPS) codes
             ? [No]|Yes: yes
@@ -419,12 +412,9 @@ def collect_1950_system_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(s1950_codes.keys())
             ['1950 system (pre-TOPS) codes', 'Last updated date']
-
             >>> depots.KEY_TO_1950_SYSTEM
             '1950 system (pre-TOPS) codes'
-
             >>> s1950_codes_dat = s1950_codes[depots.KEY_TO_1950_SYSTEM]
-
             >>> type(s1950_codes_dat)
             pandas.core.frame.DataFrame
             >>> s1950_codes_dat.head()
@@ -436,10 +426,8 @@ def collect_1950_system_codes(self, confirmation_required=True, verbose=False):
             4   1D        Marylebone  Previously 14F to 31 August 1963.  Became ME f...
         """
 
-        if confirmed(confirm_msg(self.KEY_TO_1950_SYSTEM), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                self.KEY_TO_1950_SYSTEM, verbose=verbose, confirmation_required=confirmation_required)
+        if confirmed(confirm_msg(self.KEY_TO_1950_SYSTEM), confirmation_required):
+            print_collect_msg(self.KEY_TO_1950_SYSTEM, verbose, confirmation_required)
 
             system_1950_codes_data = None
 
@@ -485,34 +473,32 @@ def collect_1950_system_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_1950_system_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `1950 system (pre-TOPS) codes`_.
+        Fetches the data of `1950 system (pre-TOPS) codes`_.
 
         .. _`1950 system (pre-TOPS) codes`: http://www.railwaycodes.org.uk/depots/depots3.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of 1950 system (pre-TOPS) codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the 1950 system (pre-TOPS) codes and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> s1950_codes = depots.fetch_1950_system_codes()
             >>> type(s1950_codes)
             dict
             >>> list(s1950_codes.keys())
             ['1950 system (pre-TOPS) codes', 'Last updated date']
-
             >>> depots.KEY_TO_1950_SYSTEM
             '1950 system (pre-TOPS) codes'
-
             >>> s1950_codes_dat = s1950_codes[depots.KEY_TO_1950_SYSTEM]
             >>> type(s1950_codes_dat)
             pandas.core.frame.DataFrame
@@ -526,7 +512,7 @@ def fetch_1950_system_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         system_1950_data = fetch_data_from_file(
-            cls=self, method='collect_1950_system_codes',
+            self, method='collect_1950_system_codes',
             data_name=re.sub(r' \(|\) | ', '-', self.KEY_TO_1950_SYSTEM).lower(), ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
@@ -534,23 +520,23 @@ def fetch_1950_system_codes(self, update=False, dump_dir=None, verbose=False):
 
     def collect_gwr_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect `Great Western Railway (GWR) depot codes
+        Collects `Great Western Railway (GWR) depot codes
         <http://www.railwaycodes.org.uk/depots/depots4.shtm>`_
-        from source web page.
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of GWR depot codes and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the GWR depot codes and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> gwr_codes = depots.collect_gwr_codes()
             To collect data of GWR codes
             ? [No]|Yes: yes
@@ -558,16 +544,13 @@ def collect_gwr_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(gwr_codes.keys())
             ['GWR codes', 'Last updated date']
-
             >>> depots.KEY_TO_GWR
             'GWR codes'
-
             >>> gwr_codes_dat = gwr_codes[depots.KEY_TO_GWR]
             >>> type(gwr_codes_dat)
             dict
             >>> list(gwr_codes_dat.keys())
             ['Alphabetical codes', 'Numerical codes']
-
             >>> gwr_alpha_codes = gwr_codes_dat['Alphabetical codes']
             >>> type(gwr_alpha_codes)
             pandas.core.frame.DataFrame
@@ -581,9 +564,7 @@ def collect_gwr_codes(self, confirmation_required=True, verbose=False):
         """
 
         if confirmed(confirm_msg(self.KEY_TO_GWR), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                data_name=self.KEY_TO_GWR, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(self.KEY_TO_GWR, verbose, confirmation_required)
 
             gwr_depot_codes = None
 
@@ -619,7 +600,7 @@ def collect_gwr_codes(self, confirmation_required=True, verbose=False):
 
                     span_tags = soup.find_all(name='span', attrs={'class': 'tab2'})
                     num_codes_dict = dict([
-                        (int(span_tag.text), span_tag.next_sibling.replace(' = ', '').strip())
+                        (int(span_tag.text), str(span_tag.next_sibling).replace(' = ', '').strip())
                         for span_tag in span_tags])
 
                     numerical_codes.rename(columns={'sort by division': 'Division'}, inplace=True)
@@ -650,41 +631,38 @@ def collect_gwr_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_gwr_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `Great Western Railway (GWR) depot codes`_.
+        Fetches the data of `Great Western Railway (GWR) depot codes`_.
 
         .. _`Great Western Railway (GWR) depot codes`:
             http://www.railwaycodes.org.uk/depots/depots4.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of GWR depot codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the GWR depot codes and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> gwr_codes = depots.fetch_gwr_codes()
             >>> type(gwr_codes)
             dict
             >>> list(gwr_codes.keys())
             ['GWR codes', 'Last updated date']
-
             >>> depots.KEY_TO_GWR
             'GWR codes'
-
             >>> gwr_codes_dat = gwr_codes[depots.KEY_TO_GWR]
             >>> type(gwr_codes_dat)
             dict
             >>> list(gwr_codes_dat.keys())
             ['Alphabetical codes', 'Numerical codes']
-
             >>> gwr_alpha_codes = gwr_codes_dat['Alphabetical codes']
             >>> type(gwr_alpha_codes)
             pandas.core.frame.DataFrame
@@ -698,42 +676,38 @@ def fetch_gwr_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         gwr_depot_codes = fetch_data_from_file(
-            cls=self, method='collect_gwr_codes', data_name=self.KEY_TO_GWR, ext=".pkl",
-            update=update, dump_dir=dump_dir, verbose=verbose)
+            self, method='collect_gwr_codes', data_name=self.KEY_TO_GWR, ext=".pkl", update=update,
+            dump_dir=dump_dir, verbose=verbose)
 
         return gwr_depot_codes
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `depot codes`_.
+        Fetches the data of `depot codes`_.
 
         .. _`depot codes`: http://www.railwaycodes.org.uk/depots/depots0.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: pathname of a directory where the data file is dumped, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of depot codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the depot codes and the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Depots  # from pyrcs import Depots
-
             >>> depots = Depots()
-
             >>> depots_codes = depots.fetch_codes()
-
             >>> type(depots_codes)
             dict
             >>> list(depots_codes.keys())
             ['Depots', 'Last updated date']
-
             >>> depots.KEY
             'Depots'
-
             >>> depots_codes_dat = depots_codes[depots.KEY]
             >>> type(depots_codes_dat)
             dict
@@ -742,7 +716,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
              'Four digit pre-TOPS codes',
              'GWR codes',
              'Two character TOPS codes']
-
             >>> depots.KEY_TO_PRE_TOPS
             'Four digit pre-TOPS codes'
             >>> depots_codes_dat[depots.KEY_TO_PRE_TOPS].head()
@@ -752,7 +725,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             2  2003              Blackburn  London Midland            False
             3  2004  Bolton Trinity Street  London Midland            False
             4  2006                Burnley  London Midland            False
-
             >>> depots.KEY_TO_TOPS
             'Two character TOPS codes'
             >>> depots_codes_dat[depots.KEY_TO_TOPS].head()
diff --git a/pyrcs/other_assets/feature.py b/pyrcs/other_assets/feature.py
index b681844..d8cc019 100644
--- a/pyrcs/other_assets/feature.py
+++ b/pyrcs/other_assets/feature.py
@@ -1,5 +1,5 @@
 """
-Collect codes of infrastructure features.
+Collects codes of infrastructure features.
 
 This category includes:
 
@@ -21,8 +21,9 @@
 from pyhelpers.ops import confirmed, fake_requests_headers
 
 from ..parser import get_catalogue, get_last_updated_date, parse_table, parse_tr
-from ..utils import confirm_msg, fetch_data_from_file, format_err_msg, home_page_url, init_data_dir, \
-    is_home_connectable, print_collect_msg, print_conn_err, print_inst_conn_err, save_data_to_file
+from ..utils import confirm_msg, fetch_data_from_file, format_err_msg, home_page_url, \
+    init_data_dir, is_home_connectable, print_collect_msg, print_conn_err, print_inst_conn_err, \
+    save_data_to_file
 
 
 class _HABDWILD:
@@ -35,13 +36,13 @@ class _HABDWILD:
         - WILD: Wheel impact load detector
     """
 
-    #: Name of the data
+    #: The name of the data.
     NAME = 'Hot axle box detectors (HABDs) and wheel impact load detectors (WILDs)'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
+    #: The key for accessing the data.
     KEY = 'HABD and WILD'
-    #: URL of the main web page of the data
+    #: The URL of the main web page for the data.
     URL = urllib.parse.urljoin(home_page_url(), '/features/habdwild.shtm')
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
 
 
@@ -50,13 +51,13 @@ class _WaterTroughs:
     A class for `water troughs locations <http://www.railwaycodes.org.uk/features/troughs.shtm>`_.
     """
 
-    #: Name of the data
+    #: The name of the data.
     NAME = 'Water trough locations'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
+    #: The key for accessing the data.
     KEY = 'Water troughs'
-    #: URL of the main web page of the data
+    #: The URL of the main web page for the data.
     URL = urllib.parse.urljoin(home_page_url(), '/features/troughs.shtm')
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
 
 
@@ -65,13 +66,13 @@ class _Telegraph:
     A class for `telegraph code words <http://www.railwaycodes.org.uk/features/telegraph.shtm>`_.
     """
 
-    #: Name of the data
+    #: The name of the data.
     NAME = 'Telegraph code words'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
+    #: The key for accessing the data.
     KEY = 'Telegraphic codes'
-    #: URL of the main web page of the data
+    #: The URL of the main web page for the data.
     URL = urllib.parse.urljoin(home_page_url(), '/features/telegraph.shtm')
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
 
 
@@ -80,13 +81,13 @@ class _Buzzer:
     A class for `buzzer codes <http://www.railwaycodes.org.uk/features/buzzer.shtm>`_.
     """
 
-    #: Name of the data
+    #: The name of the data.
     NAME = 'Buzzer codes'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
+    #: The key for accessing the data.
     KEY = 'Buzzer codes'
-    #: URL of the main web page of the data
+    #: The URL of the main web page for the data.
     URL = urllib.parse.urljoin(home_page_url(), '/features/buzzer.shtm')
-    #: Key of the data of the last updated date
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
 
 
@@ -106,7 +107,7 @@ def _decode_vulgar_fraction(x):
 
 def _parse_vulgar_fraction_in_length(x):
     """
-    Parse 'VULGAR FRACTION' for 'Length' of water trough locations.
+    Parses 'VULGAR FRACTION' for 'Length' of water trough locations.
     """
 
     if x == '':
@@ -138,100 +139,104 @@ def _parse_telegraph_in_use_term(x):
 
 class Features:
     """
-    A class for collecting codes of several infrastructure features.
+    A class for collecting codes of several infrastructure features, including
+    *HABDs and WILDs*, *water troughs locations*, *telegraph code words* and *buzzer codes*.
     """
 
-    #: Name of the data
-    NAME = 'Infrastructure features'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Features'
-
-    #: Key of the dict-type data of '*HABD*' and '*WILD*'
-    KEY_TO_HABD_WILD = _HABDWILD.KEY
-    #: Key of the dict-type data of '*water troughs*'
-    KEY_TO_TROUGH = _WaterTroughs.KEY
-    #: Key of the dict-type data of '*telegraph codes*'
-    KEY_TO_TELEGRAPH = _Telegraph.KEY
-    #: Key of the dict-type data of '*buzzer codes*'
-    KEY_TO_BUZZER = _Buzzer.KEY
-
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The name of the data.
+    NAME: str = 'Infrastructure features'
+    #: The key for accessing the data.
+    KEY: str = 'Features'
+
+    #: The key for accessing the data of *HABD* and *WILD*.
+    KEY_TO_HABD_WILD: str = _HABDWILD.KEY
+    #: The key for accessing the data of *water troughs*.
+    KEY_TO_TROUGH: str = _WaterTroughs.KEY
+    #: The key for accessing the data of *telegraph codes*.
+    KEY_TO_TELEGRAPH: str = _Telegraph.KEY
+    #: The key for accessing the data of *buzzer codes*.
+    KEY_TO_BUZZER: str = _Buzzer.KEY
+
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> feats.NAME
             'Infrastructure features'
         """
 
         print_conn_err(verbose=verbose)
 
-        self.catalogue = get_catalogue(url=_HABDWILD.URL, update=update, confirmation_required=False)
+        self.catalogue = get_catalogue(_HABDWILD.URL, update=update, confirmation_required=False)
 
-        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="other-assets")
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, "other-assets")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\other-assets\\features"``.
+        The default data directory for this class is: ``"data\\other-assets\\features"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.other_assets.feature.Features`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     def collect_habds_and_wilds(self, confirmation_required=True, verbose=False):
         """
-        Collect codes of `HABDs and WILDs <http://www.railwaycodes.org.uk/misc/habdwild.shtm>`_
-        from source web page.
+        Collects codes of `HABDs and WILDs <http://www.railwaycodes.org.uk/misc/habdwild.shtm>`_
+        from the source web page.
 
         .. note::
 
             - HABDs: Hot axle box detectors
             - WILDs: Wheel impact load detectors
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of HABDs and WILDs, and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the codes of HABDs and WILDs and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> hw_codes = feats.collect_habds_and_wilds()
             To collect data of HABD and WILD
             ? [No]|Yes: yes
@@ -239,16 +244,13 @@ def collect_habds_and_wilds(self, confirmation_required=True, verbose=False):
             dict
             >>> list(hw_codes.keys())
             ['HABD and WILD', 'Last updated date']
-
             >>> feats.KEY_TO_HABD_WILD
             'HABD and WILD'
-
             >>> hw_codes_dat = hw_codes[feats.KEY_TO_HABD_WILD]
             >>> type(hw_codes_dat)
             dict
             >>> list(hw_codes_dat.keys())
             ['HABD', 'WILD']
-
             >>> habd_dat = hw_codes_dat['HABD']
             >>> type(habd_dat)
             pandas.core.frame.DataFrame
@@ -331,42 +333,37 @@ def collect_habds_and_wilds(self, confirmation_required=True, verbose=False):
 
     def fetch_habds_and_wilds(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch codes of `HABDs and WILDs`_.
+        Fetches the codes of `HABDs and WILDs`_.
 
         .. _`HABDs and WILDs`: http://www.railwaycodes.org.uk/misc/habdwild.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of hot axle box detectors (HABDs) and wheel impact load detectors (WILDs),
-            and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the codes of HABDs and WILDs and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> hw_codes = feats.fetch_habds_and_wilds()
-
             >>> type(hw_codes)
             dict
             >>> list(hw_codes.keys())
             ['HABD and WILD', 'Last updated date']
-
             >>> feats.KEY_TO_HABD_WILD
             'HABD and WILD'
-
             >>> hw_codes_dat = hw_codes[feats.KEY_TO_HABD_WILD]
             >>> type(hw_codes_dat)
             dict
             >>> list(hw_codes_dat.keys())
             ['HABD', 'WILD']
-
             >>> habd_dat = hw_codes_dat['HABD']
             >>> type(habd_dat)
             pandas.core.frame.DataFrame
@@ -392,29 +389,30 @@ def fetch_habds_and_wilds(self, update=False, dump_dir=None, verbose=False):
         """
 
         habds_and_wilds_codes = fetch_data_from_file(
-            cls=self, method='collect_habds_and_wilds', data_name=self.KEY_TO_HABD_WILD, ext=".pkl",
+            self, method='collect_habds_and_wilds', data_name=self.KEY_TO_HABD_WILD, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return habds_and_wilds_codes
 
     def collect_water_troughs(self, confirmation_required=True, verbose=False):
         """
-        Collect codes of `water troughs locations <http://www.railwaycodes.org.uk/misc/troughs.shtm>`_
-        from source web page.
+        Collects codes of
+        `water troughs locations <http://www.railwaycodes.org.uk/misc/troughs.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of water trough locations, and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the codes of water trough locations and
+            the date they were last updated.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> wt_codes = feats.collect_water_troughs()
             To collect data of Water troughs
             ? [No]|Yes: yes
@@ -422,10 +420,8 @@ def collect_water_troughs(self, confirmation_required=True, verbose=False):
             dict
             >>> list(wt_codes.keys())
             ['Water troughs', 'Last updated date']
-
             >>> feats.KEY_TO_TROUGH
             'Water troughs'
-
             >>> wt_codes_dat = wt_codes[feats.KEY_TO_TROUGH]
             >>> type(wt_codes_dat)
             pandas.core.frame.DataFrame
@@ -440,9 +436,7 @@ def collect_water_troughs(self, confirmation_required=True, verbose=False):
         """
 
         if confirmed(confirm_msg(self.KEY_TO_TROUGH), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                self.KEY_TO_TROUGH, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(self.KEY_TO_TROUGH, verbose, confirmation_required)
 
             water_troughs_codes = {self.KEY_TO_TROUGH: None, self.KEY_TO_LAST_UPDATED_DATE: None}
 
@@ -489,34 +483,32 @@ def collect_water_troughs(self, confirmation_required=True, verbose=False):
 
     def fetch_water_troughs(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch codes of `water troughs locations`_.
+        Fetches the codes of `water troughs locations`_.
 
         .. _`water troughs locations`: http://www.railwaycodes.org.uk/misc/troughs.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of water trough locations, and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the codes of water trough locations and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> wt_codes = feats.fetch_water_troughs()
             >>> type(wt_codes)
             dict
             >>> list(wt_codes.keys())
             ['Water troughs', 'Last updated date']
-
             >>> feats.KEY_TO_TROUGH
             'Water troughs'
-
             >>> wt_codes_dat = wt_codes[feats.KEY_TO_TROUGH]
             >>> type(wt_codes_dat)
             pandas.core.frame.DataFrame
@@ -531,29 +523,30 @@ def fetch_water_troughs(self, update=False, dump_dir=None, verbose=False):
         """
 
         troughs_locations_codes = fetch_data_from_file(
-            cls=self, method='collect_water_troughs', data_name=self.KEY_TO_TROUGH, ext=".pkl",
+            self, method='collect_water_troughs', data_name=self.KEY_TO_TROUGH, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return troughs_locations_codes
 
     def collect_telegraph_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect data of `telegraph code words <http://www.railwaycodes.org.uk/misc/telegraph.shtm>`_
-        from source web page.
+        Collects data of
+        `telegraph code words <http://www.railwaycodes.org.uk/misc/telegraph.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of telegraph code words, and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of telegraph code words and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> tel_codes = feats.collect_telegraph_codes()
             To collect data of Telegraphic codes
             ? [No]|Yes: yes
@@ -561,16 +554,13 @@ def collect_telegraph_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(tel_codes.keys())
             ['Telegraphic codes', 'Last updated date']
-
             >>> feats.KEY_TO_TELEGRAPH
             'Telegraphic codes'
-
             >>> tel_codes_dat = tel_codes[feats.KEY_TO_TELEGRAPH]
             >>> type(tel_codes_dat)
             dict
             >>> list(tel_codes_dat.keys())
             ['Official codes', 'Unofficial codes']
-
             >>> tel_official_codes = tel_codes_dat['Official codes']
             >>> type(tel_official_codes)
             pandas.core.frame.DataFrame
@@ -594,12 +584,11 @@ def collect_telegraph_codes(self, confirmation_required=True, verbose=False):
             4   MYSTEX  Special excursion going somewhere no one reall...
         """
 
-        if confirmed(confirm_msg(self.KEY_TO_TELEGRAPH), confirmation_required=confirmation_required):
+        if confirmed(confirm_msg(self.KEY_TO_TELEGRAPH), confirmation_required):
+            print_collect_msg(self.KEY_TO_TELEGRAPH, verbose, confirmation_required)
 
-            print_collect_msg(
-                self.KEY_TO_TELEGRAPH, verbose=verbose, confirmation_required=confirmation_required)
-
-            telegraph_code_words = {self.KEY_TO_TELEGRAPH: None, self.KEY_TO_LAST_UPDATED_DATE: None}
+            telegraph_code_words = {
+                self.KEY_TO_TELEGRAPH: None, self.KEY_TO_LAST_UPDATED_DATE: None}
 
             try:
                 url = self.catalogue[self.KEY_TO_TELEGRAPH]
@@ -654,34 +643,32 @@ def collect_telegraph_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_telegraph_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `telegraph code words`_.
+        Fetches the data of `telegraph code words`_.
 
         .. _`telegraph code words`: http://www.railwaycodes.org.uk/misc/telegraph.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of telegraph code words, and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of telegraph code words and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> tel_codes = feats.fetch_telegraph_codes()
             >>> type(tel_codes)
             dict
             >>> list(tel_codes.keys())
             ['Telegraphic codes', 'Last updated date']
-
             >>> feats.KEY_TO_TELEGRAPH
             'Telegraphic codes'
-
             >>> tel_codes_dat = tel_codes[feats.KEY_TO_TELEGRAPH]
             >>> type(tel_codes_dat)
             dict
@@ -711,29 +698,29 @@ def fetch_telegraph_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         telegraph_code_words = fetch_data_from_file(
-            cls=self, method='collect_telegraph_codes', data_name=self.KEY_TO_TELEGRAPH, ext=".pkl",
+            self, method='collect_telegraph_codes', data_name=self.KEY_TO_TELEGRAPH, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return telegraph_code_words
 
     def collect_buzzer_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect data of `buzzer codes <http://www.railwaycodes.org.uk/misc/buzzer.shtm>`_
-        from source web page.
+        Collects data of `buzzer codes <http://www.railwaycodes.org.uk/misc/buzzer.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of buzzer codes, and date of when the data was last updated
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of buzzer codes and
+            the date they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> buz_codes = feats.collect_buzzer_codes()
             To collect data of Buzzer codes
             ? [No]|Yes: yes
@@ -741,10 +728,8 @@ def collect_buzzer_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(buz_codes.keys())
             ['Buzzer codes', 'Last updated date']
-
             >>> feats.KEY_TO_BUZZER
             'Buzzer codes'
-
             >>> buz_codes_dat = buz_codes[feats.KEY_TO_BUZZER]
             >>> type(buz_codes_dat)
             pandas.core.frame.DataFrame
@@ -758,9 +743,7 @@ def collect_buzzer_codes(self, confirmation_required=True, verbose=False):
         """
 
         if confirmed(confirm_msg(self.KEY_TO_BUZZER), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                self.KEY_TO_BUZZER, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(self.KEY_TO_BUZZER, verbose, confirmation_required)
 
             buzzer_codes = {self.KEY_TO_BUZZER: None, self.KEY_TO_LAST_UPDATED_DATE: None}
 
@@ -809,34 +792,32 @@ def collect_buzzer_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_buzzer_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `buzzer codes`_.
+        Fetches the data of `buzzer codes`_.
 
         .. _`buzzer codes`: http://www.railwaycodes.org.uk/misc/buzzer.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of buzzer codes, and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of buzzer codes and
+            the date they were last updated
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> buz_codes = feats.fetch_buzzer_codes()
             >>> type(buz_codes)
             dict
             >>> list(buz_codes.keys())
             ['Buzzer codes', 'Last updated date']
-
             >>> feats.KEY_TO_BUZZER
             'Buzzer codes'
-
             >>> buz_codes_dat = buz_codes[feats.KEY_TO_BUZZER]
             >>> type(buz_codes_dat)
             pandas.core.frame.DataFrame
@@ -850,14 +831,14 @@ def fetch_buzzer_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         buzzer_codes = fetch_data_from_file(
-            cls=self, method='collect_buzzer_codes', data_name=self.KEY_TO_BUZZER, ext=".pkl",
+            self, method='collect_buzzer_codes', data_name=self.KEY_TO_BUZZER, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return buzzer_codes
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch codes of infrastructure features.
+        Fetches the codes of infrastructure features.
 
         Including:
 
@@ -866,36 +847,33 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             - `Telegraph codes <http://www.railwaycodes.org.uk/misc/telegraph.shtm>`_
             - `Driver/guard buzzer codes <http://www.railwaycodes.org.uk/misc/buzzer.shtm>`_
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of features codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of features codes and
+            the date they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Features  # from pyrcs import Features
-
             >>> feats = Features()
-
             >>> feats_codes = feats.fetch_codes()
             >>> type(feats_codes)
             dict
             >>> list(feats_codes.keys())
             ['Features', 'Last updated date']
-
             >>> feats.KEY
             'Features'
-
             >>> feats_codes_dat = feats_codes[feats.KEY]
             >>> type(feats_codes_dat)
             dict
             >>> list(feats_codes_dat.keys())
             ['Buzzer codes', 'HABD and WILD', 'Telegraphic codes', 'Water troughs']
-
             >>> water_troughs_locations = feats_codes_dat[feats.KEY_TO_TROUGH]
             >>> type(water_troughs_locations)
             pandas.core.frame.DataFrame
@@ -907,7 +885,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             3  CGJ6  ...    561.000000
             4  CGJ6  ...    560.000000
             [5 rows x 6 columns]
-
             >>> hw_codes_dat = feats_codes_dat[feats.KEY_TO_HABD_WILD]
             >>> type(hw_codes_dat)
             dict
diff --git a/pyrcs/other_assets/sig_box.py b/pyrcs/other_assets/sig_box.py
index 8b83bcb..4c68add 100644
--- a/pyrcs/other_assets/sig_box.py
+++ b/pyrcs/other_assets/sig_box.py
@@ -26,49 +26,47 @@ class SignalBoxes:
     `signal box prefix codes <http://www.railwaycodes.org.uk/signal/signal_boxes0.shtm>`_.
     """
 
-    #: Name of the data
-    NAME = 'Signal box prefix codes'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Signal boxes'
-
-    #: Key of the dict-type data of '*non-national rail*'
-    KEY_TO_NON_NATIONAL_RAIL = 'Non-National Rail'
-    #: Key of the dict-type data of '*Ireland*'
-    KEY_TO_IRELAND = 'Ireland'
-    #: Key of the dict-type data of '*WR (Western region) MAS (multiple aspect signalling) dates*'
-    KEY_TO_WRMASD = 'WR MAS dates'
-    #: Key of the dict-type data of '*bell codes*'
-    KEY_TO_BELL_CODES = 'Bell codes'
-
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '/signal/signal_boxes0.shtm')
-
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The name of the data.
+    NAME: str = 'Signal box prefix codes'
+    #: The key for accessing the data.
+    KEY: str = 'Signal boxes'
+
+    #: The key for accessing the data of *non-national rail*.
+    KEY_TO_NON_NATIONAL_RAIL: str = 'Non-National Rail'
+    #: The key for accessing the data of *Ireland*.
+    KEY_TO_IRELAND: str = 'Ireland'
+    #: The key for accessing the data of
+    #: *WR (Western region) MAS (multiple aspect signalling) dates*.
+    KEY_TO_WRMASD: str = 'WR MAS dates'
+    #: The key for accessing the data of *bell codes*.
+    KEY_TO_BELL_CODES: str = 'Bell codes'
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/signal/signal_boxes0.shtm')
+
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb.NAME
             'Signal box prefix codes'
-
             >>> sb.URL
             'http://www.railwaycodes.org.uk/signal/signal_boxes0.shtm'
         """
@@ -77,57 +75,62 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = get_catalogue(url=self.URL, update=update, confirmation_required=False)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
-        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="other-assets")
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, "other-assets")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\other-assets\\signal-boxes"``.
+        The default data directory for this class is: ``"data\\other-assets\\signal-boxes"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.other_assets.sig_box.SignalBoxes`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     def collect_prefix_codes(self, initial, update=False, verbose=False):
         """
-        Collect signal box prefix codes beginning with a given initial letter from source web page.
+        Collects `signal box prefix codes`_ starting with a given initial letter
+        from the source web page.
+
+        .. _`signal box prefix codes`: http://www.railwaycodes.org.uk/signal/signal_boxes0.shtm
 
-        :param initial: initial letter of signal box name (for specifying a target URL)
+        :param initial: The initial letter (e.g. ``'a'``, ``'z'``) of signal box prefix code.
         :type initial: str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of signal box prefix codes beginning with the given initial letter and
-            date of when the data was last updated
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
+        :return: A dictionary containing data of signal box prefix codes whose initial letters are
+            the specified ``initial`` and the date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb_a_codes = sb.collect_prefix_codes(initial='a')
             >>> type(sb_a_codes)
             dict
             >>> list(sb_a_codes.keys())
             ['A', 'Last updated date']
-
             >>> sb_a_codes_dat = sb_a_codes['A']
             >>> type(sb_a_codes_dat)
             pandas.core.frame.DataFrame
@@ -173,7 +176,8 @@ def collect_prefix_codes(self, initial, update=False, verbose=False):
 
                     if any(x is None for x in {thead, tbody}):
                         if verbose == 2:
-                            print(f"No data is available for 'Boxes beginning with '{beginning_with}'.")
+                            print(f"No data is available for "
+                                  f"'prefix codes whose initial letters are '{beginning_with}'.")
 
                     else:
                         ths = [th.get_text(strip=True) for th in thead.find_all('th')]
@@ -202,32 +206,32 @@ def collect_prefix_codes(self, initial, update=False, verbose=False):
 
     def fetch_prefix_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of signal box prefix codes.
+        Fetches the data of `signal box prefix codes`_.
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        .. _`signal box prefix codes`: http://www.railwaycodes.org.uk/signal/signal_boxes0.shtm
+
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of package data folder, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of location codes and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of signal box prefix codes and
+            the date whey they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb_prefix_codes = sb.fetch_prefix_codes()
             >>> type(sb_prefix_codes)
             dict
             >>> list(sb_prefix_codes.keys())
             ['Signal boxes', 'Last updated date']
-
             >>> sb.KEY
             'Signal boxes'
-
             >>> sb_prefix_codes_dat = sb_prefix_codes[sb.KEY]
             >>> type(sb_prefix_codes_dat)
             pandas.core.frame.DataFrame
@@ -280,22 +284,22 @@ def fetch_prefix_codes(self, update=False, dump_dir=None, verbose=False):
 
     def collect_non_national_rail_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect signal box prefix codes of `non-national rail
-        <http://www.railwaycodes.org.uk/signal/signal_boxesX.shtm>`_ from source web page.
+        Collects the signal box prefix codes for `non-national rail
+        <http://www.railwaycodes.org.uk/signal/signal_boxesX.shtm>`_ from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: signal box prefix codes of non-national rail
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the signal box prefix codes for non-national rail and
+            the date when they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> nnr_codes = sb.collect_non_national_rail_codes()
             To collect data of non-national rail signal box prefix codes
             ? [No]|Yes: yes
@@ -303,10 +307,8 @@ def collect_non_national_rail_codes(self, confirmation_required=True, verbose=Fa
             dict
             >>> list(nnr_codes.keys())
             ['Non-National Rail', 'Last updated date']
-
             >>> sb.KEY_TO_NON_NATIONAL_RAIL
             'Non-National Rail'
-
             >>> nnr_codes_dat = nnr_codes[sb.KEY_TO_NON_NATIONAL_RAIL]
             >>> type(nnr_codes_dat)
             dict
@@ -323,7 +325,6 @@ def collect_non_national_rail_codes(self, confirmation_required=True, verbose=Fa
              'Sheffield Supertram signals',
              'Tyne & Wear Metro signals',
              "Heritage, minor and miniature railways and other 'special' signals"]
-
             >>> lu_signals_codes = nnr_codes_dat['London Underground signals']
             >>> type(lu_signals_codes)
             dict
@@ -344,9 +345,7 @@ def collect_non_national_rail_codes(self, confirmation_required=True, verbose=Fa
         data_name = self.KEY_TO_NON_NATIONAL_RAIL.lower() + " signal box prefix codes"
 
         if confirmed(prompt=confirm_msg(data_name), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                data_name=data_name, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(data_name, verbose, confirmation_required)
 
             non_national_rail_codes_data = None
 
@@ -407,8 +406,8 @@ def collect_non_national_rail_codes(self, confirmation_required=True, verbose=Fa
                         print("Done.")
 
                     save_data_to_file(
-                        self, data=non_national_rail_codes_data, data_name=self.KEY_TO_NON_NATIONAL_RAIL,
-                        ext=".pkl", verbose=verbose)
+                        self, data=non_national_rail_codes_data,
+                        data_name=self.KEY_TO_NON_NATIONAL_RAIL, ext=".pkl", verbose=verbose)
 
                 except Exception as e:
                     print(f"Failed. {format_err_msg(e)}")
@@ -417,34 +416,32 @@ def collect_non_national_rail_codes(self, confirmation_required=True, verbose=Fa
 
     def fetch_non_national_rail_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch signal box prefix codes of `non-national rail`_.
+        Fetches the signal box prefix codes for `non-national rail`_.
 
         .. _`non-national rail`: http://www.railwaycodes.org.uk/signal/signal_boxesX.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of package data folder, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: signal box prefix codes of non-national rail
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the signal box prefix codes for non-national rail and
+            the date when they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> nnr_codes = sb.fetch_non_national_rail_codes()
             >>> type(nnr_codes)
             dict
             >>> list(nnr_codes.keys())
             ['Non-National Rail', 'Last updated date']
-
             >>> sb.KEY_TO_NON_NATIONAL_RAIL
             'Non-National Rail'
-
             >>> nnr_codes_dat = nnr_codes[sb.KEY_TO_NON_NATIONAL_RAIL]
             >>> type(nnr_codes_dat)
             dict
@@ -461,7 +458,6 @@ def fetch_non_national_rail_codes(self, update=False, dump_dir=None, verbose=Fal
              'Sheffield Supertram signals',
              'Tyne & Wear Metro signals',
              "Heritage, minor and miniature railways and other 'special' signals"]
-
             >>> lu_signals_codes = nnr_codes_dat['London Underground signals']
             >>> type(lu_signals_codes)
             dict
@@ -480,30 +476,29 @@ def fetch_non_national_rail_codes(self, update=False, dump_dir=None, verbose=Fal
         """
 
         non_national_rail_codes_data = fetch_data_from_file(
-            cls=self, method='collect_non_national_rail_codes', data_name=self.KEY_TO_NON_NATIONAL_RAIL,
+            self, method='collect_non_national_rail_codes', data_name=self.KEY_TO_NON_NATIONAL_RAIL,
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return non_national_rail_codes_data
 
     def collect_ireland_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect data of
-        `Irish signal cabin prefix codes <http://www.railwaycodes.org.uk/signal/signal_boxes1.shtm>`_
-        from source web page.
+        Collects data of `Irish signal cabin prefix codes
+        <http://www.railwaycodes.org.uk/signal/signal_boxes1.shtm>`_ from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: signal box prefix codes of Ireland
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of Irish signal cabin prefix codes and
+            the date when they were last updated, or ``None`` if no data is collectd.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> ireland_sb_codes = sb.collect_ireland_codes()
             To collect data of signal box prefix codes of Ireland
             ? [No]|Yes: yes
@@ -511,10 +506,8 @@ def collect_ireland_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(ireland_sb_codes.keys())
             ['Ireland', 'Notes', 'Last updated date']
-
             >>> sb.KEY_TO_IRELAND
             'Ireland'
-
             >>> ireland_sb_codes_dat = ireland_sb_codes[sb.KEY_TO_IRELAND]
             >>> type(ireland_sb_codes_dat)
             pandas.core.frame.DataFrame
@@ -530,9 +523,7 @@ def collect_ireland_codes(self, confirmation_required=True, verbose=False):
         data_name = "signal box prefix codes of " + self.KEY_TO_IRELAND
 
         if confirmed(prompt=confirm_msg(data_name), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                data_name=data_name, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(data_name, verbose, confirmation_required)
 
             ireland_codes_data = None
 
@@ -580,34 +571,33 @@ def collect_ireland_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_ireland_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `Irish signal cabin prefix codes`_.
+        Fetches the data of `Irish signal cabin prefix codes`_.
 
-        .. _`Irish signal cabin prefix codes`: http://www.railwaycodes.org.uk/signal/signal_boxes1.shtm
+        .. _`Irish signal cabin prefix codes`:
+            http://www.railwaycodes.org.uk/signal/signal_boxes1.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of package data folder, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: signal box prefix codes of Ireland
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of Irish signal cabin prefix codes and
+            the date when they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> ireland_sb_codes = sb.fetch_ireland_codes()
             >>> type(ireland_sb_codes)
             dict
             >>> list(ireland_sb_codes.keys())
             ['Ireland', 'Notes', 'Last updated date']
-
             >>> sb.KEY_TO_IRELAND
             'Ireland'
-
             >>> ireland_sb_codes_dat = ireland_sb_codes[sb.KEY_TO_IRELAND]
             >>> type(ireland_sb_codes_dat)
             pandas.core.frame.DataFrame
@@ -621,7 +611,7 @@ def fetch_ireland_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         ireland_codes_data = fetch_data_from_file(
-            cls=self, method='collect_ireland_codes', data_name=self.KEY_TO_IRELAND,
+            self, method='collect_ireland_codes', data_name=self.KEY_TO_IRELAND,
             ext=".pkl", update=update, dump_dir=dump_dir, verbose=verbose)
 
         return ireland_codes_data
@@ -643,23 +633,23 @@ def _parse_tbl_dat(h3_or_h4, ths):
 
     def collect_wr_mas_dates(self, confirmation_required=True, verbose=False):
         """
-        Collect data of `WR (western region) MAS (multiple aspect signalling) dates
+        Collects data of `WR (western region) MAS (multiple aspect signalling) dates
         <http://www.railwaycodes.org.uk/signal/dates.shtm>`_
-        from source web page.
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of WR (western region) MAS (multiple aspect signalling) dates
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of WR MAS dates and
+            the date when they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb_wr_mas_dates = sb.collect_wr_mas_dates()
             To collect data of WR MAS dates
             ? [No]|Yes: yes
@@ -667,10 +657,8 @@ def collect_wr_mas_dates(self, confirmation_required=True, verbose=False):
             dict
             >>> list(sb_wr_mas_dates.keys())
             ['WR MAS dates', 'Last updated date']
-
             >>> sb.KEY_TO_WRMASD
             'WR MAS dates'
-
             >>> sb_wr_mas_dates_dat = sb_wr_mas_dates[sb.KEY_TO_WRMASD]
             >>> type(sb_wr_mas_dates_dat)
             collections.defaultdict
@@ -707,7 +695,6 @@ def collect_wr_mas_dates(self, confirmation_required=True, verbose=False):
              'Didcot/Swindon/Bristol reversible working',
              'Reading West extension',
              'Carmarthen-Whitland']
-
             >>> sb_wr_mas_dates_dat['Paddington-Hayes']
               Stage             Date                        Area
             0    1A    12 April 1953               Hayes-Hanwell
@@ -716,9 +703,7 @@ def collect_wr_mas_dates(self, confirmation_required=True, verbose=False):
         """
 
         if confirmed(confirm_msg(self.KEY_TO_WRMASD), confirmation_required=confirmation_required):
-
-            print_collect_msg(
-                self.KEY_TO_WRMASD, verbose=verbose, confirmation_required=confirmation_required)
+            print_collect_msg(self.KEY_TO_WRMASD, verbose, confirmation_required)
 
             wr_mas_dates_data = None
 
@@ -747,7 +732,8 @@ def collect_wr_mas_dates(self, confirmation_required=True, verbose=False):
                             while h4:
                                 prev_h3 = h4.find_previous('h3')
                                 if prev_h3.text == h3.text:
-                                    wr_mas_dates[h3.text].update({h4.text: self._parse_tbl_dat(h4, ths)})
+                                    wr_mas_dates[h3.text].update(
+                                        {h4.text: self._parse_tbl_dat(h4, ths)})
                                     h4 = h4.find_next('h4')
                                 elif h3.text not in wr_mas_dates.keys():
                                     wr_mas_dates.update({h3.text: self._parse_tbl_dat(h3, ths)})
@@ -779,35 +765,33 @@ def collect_wr_mas_dates(self, confirmation_required=True, verbose=False):
 
     def fetch_wr_mas_dates(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `WR (western region) MAS (multiple aspect signalling) dates`_.
+        Fetches the data of `WR (western region) MAS (multiple aspect signalling) dates`_.
 
         .. _`WR (western region) MAS (multiple aspect signalling) dates`:
             http://www.railwaycodes.org.uk/signal/dates.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of package data folder, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of WR (western region) MAS (multiple aspect signalling) dates
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of WR MAS dates and
+            the date when they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb_wr_mas_dates = sb.fetch_wr_mas_dates()
             >>> type(sb_wr_mas_dates)
             dict
             >>> list(sb_wr_mas_dates.keys())
             ['WR MAS dates', 'Last updated date']
-
             >>> sb.KEY_TO_WRMASD
             'WR MAS dates'
-
             >>> sb_wr_mas_dates_dat = sb_wr_mas_dates[sb.KEY_TO_WRMASD]
             >>> type(sb_wr_mas_dates_dat)
             collections.defaultdict
@@ -844,7 +828,6 @@ def fetch_wr_mas_dates(self, update=False, dump_dir=None, verbose=False):
              'Didcot/Swindon/Bristol reversible working',
              'Reading West extension',
              'Carmarthen-Whitland']
-
             >>> sb_wr_mas_dates_dat['Paddington-Hayes']
               Stage             Date                        Area
             0    1A    12 April 1953               Hayes-Hanwell
@@ -853,29 +836,29 @@ def fetch_wr_mas_dates(self, update=False, dump_dir=None, verbose=False):
         """
 
         wr_mas_dates_data = fetch_data_from_file(
-            cls=self, method='collect_wr_mas_dates', data_name=self.KEY_TO_WRMASD, ext=".pkl",
+            self, method='collect_wr_mas_dates', data_name=self.KEY_TO_WRMASD, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return wr_mas_dates_data
 
     def collect_bell_codes(self, confirmation_required=True, verbose=False):
         """
-        Collect data of `bell codes <http://www.railwaycodes.org.uk/signal/bellcodes.shtm>`_
-        from source web page.
+        Collects data of `bell codes <http://www.railwaycodes.org.uk/signal/bellcodes.shtm>`_
+        from the source web page.
 
-        :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+        :param confirmation_required: Whether user confirmation is required before proceeding;
+            defaults to ``True``.
         :type confirmation_required: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: bell codes for the signal box prefix codes
-        :rtype: dict or None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of bell codes and
+            the date when they were last updated, or ``None`` if no data is collected.
+        :rtype: dict | None
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb_bell_codes = sb.collect_bell_codes()
             To collect data of Bell codes
             ? [No]|Yes: yes
@@ -883,10 +866,8 @@ def collect_bell_codes(self, confirmation_required=True, verbose=False):
             dict
             >>> list(sb_bell_codes.keys())
             ['Bell codes', 'Last updated date']
-
             >>> sb.KEY_TO_BELL_CODES
             'Bell codes'
-
             >>> sb_bell_codes_dat = sb_bell_codes[sb.KEY_TO_BELL_CODES]
             >>> type(sb_bell_codes_dat)
             collections.OrderedDict
@@ -894,7 +875,6 @@ def collect_bell_codes(self, confirmation_required=True, verbose=False):
             ['Network Rail codes',
              'Southern Railway codes',
              'Lancashire & Yorkshire Railway codes']
-
             >>> sb_nr_bell_codes = sb_bell_codes_dat['Network Rail codes']
             >>> type(sb_nr_bell_codes)
             dict
@@ -912,9 +892,8 @@ def collect_bell_codes(self, confirmation_required=True, verbose=False):
             4  1-2-1                             Train approaching
         """
 
-        if confirmed(confirm_msg(self.KEY_TO_BELL_CODES), confirmation_required=confirmation_required):
-            print_collect_msg(
-                self.KEY_TO_BELL_CODES, verbose=verbose, confirmation_required=confirmation_required)
+        if confirmed(confirm_msg(self.KEY_TO_BELL_CODES), confirmation_required):
+            print_collect_msg(self.KEY_TO_BELL_CODES, verbose, confirmation_required)
 
             bell_codes_ = None
 
@@ -965,34 +944,32 @@ def collect_bell_codes(self, confirmation_required=True, verbose=False):
 
     def fetch_bell_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `bell codes`_.
+        Fetches the data of `bell codes`_.
 
         .. _`bell codes`: http://www.railwaycodes.org.uk/signal/bellcodes.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of package data folder, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of bell codes
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of bell codes and
+            the date when they were last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import SignalBoxes  # from pyrcs import SignalBoxes
-
             >>> sb = SignalBoxes()
-
             >>> sb_bell_codes = sb.fetch_bell_codes()
             >>> type(sb_bell_codes)
             dict
             >>> list(sb_bell_codes.keys())
             ['Bell codes', 'Last updated date']
-
             >>> sb.KEY_TO_BELL_CODES
             'Bell codes'
-
             >>> sb_bell_codes_dat = sb_bell_codes[sb.KEY_TO_BELL_CODES]
             >>> type(sb_bell_codes_dat)
             collections.OrderedDict
@@ -1000,7 +977,6 @@ def fetch_bell_codes(self, update=False, dump_dir=None, verbose=False):
             ['Network Rail codes',
              'Southern Railway codes',
              'Lancashire & Yorkshire Railway codes']
-
             >>> sb_nr_bell_codes = sb_bell_codes_dat['Network Rail codes']
             >>> type(sb_nr_bell_codes)
             dict
@@ -1019,7 +995,7 @@ def fetch_bell_codes(self, update=False, dump_dir=None, verbose=False):
         """
 
         bell_codes_ = fetch_data_from_file(
-            cls=self, method='collect_bell_codes', data_name=self.KEY_TO_BELL_CODES, ext=".pkl",
+            self, method='collect_bell_codes', data_name=self.KEY_TO_BELL_CODES, ext=".pkl",
             update=update, dump_dir=dump_dir, verbose=verbose)
 
         return bell_codes_
diff --git a/pyrcs/other_assets/station.py b/pyrcs/other_assets/station.py
index 17aaadb..31d6692 100644
--- a/pyrcs/other_assets/station.py
+++ b/pyrcs/other_assets/station.py
@@ -1,5 +1,5 @@
 """
-Collect `railway station data <http://www.railwaycodes.org.uk/stations/station0.shtm>`_.
+Collects `railway station data <http://www.railwaycodes.org.uk/stations/station0.shtm>`_.
 """
 
 import os
@@ -27,30 +27,32 @@ class Stations:
     `railway station data <http://www.railwaycodes.org.uk/stations/station0.shtm>`_.
     """
 
-    #: Name of the data.
+    #: The name of the data.
     NAME: str = 'Railway station data'
-    #: Main key of the dict-type station data.
+    #: The key for accessing the data.
     KEY: str = 'Stations'
-    #: URL of the main web page of the data.
-    URL: str = urllib.parse.urljoin(home_page_url(), '/stations/station0.shtm')
-    #: Key of the dict-type data of '*Mileages, operators and grid coordinates*'.
+    #: The key for accessing the data of *Mileages, operators and grid coordinates*.
     KEY_TO_STN: str = 'Mileages, operators and grid coordinates'
-    #: Key of the data of the last updated date.
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/stations/station0.shtm')
+
+    #: The key used to reference the last updated date in the data.
     KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: Name of the data directory; defaults to ``None``.
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
         :type data_dir: str | None
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``True``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
         :type verbose: bool | int
 
-        :ivar dict catalogue: Catalogue of the data.
-        :ivar str last_updated_date: Last updated date.
-        :ivar str data_dir: Path to the data directory.
-        :ivar str current_data_dir: Path to the current data directory.
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
@@ -66,22 +68,47 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = self.get_catalogue(update=update, verbose=False)
 
-        self.last_updated_date = get_last_updated_date(
-            url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
+
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, "other-assets")
+
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
+        """
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
+
+        The default data directory for this class is: ``"data\\other-assets\\stations"``.
 
-        self.data_dir, self.current_data_dir = init_data_dir(
-            self, data_dir, category="other-assets")
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
+        :type sub_dir: str
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
+        :rtype: str
+
+        .. _`pyhelpers.dir.cd()`:
+            https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
+        """
+
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
+
+        return path
 
     def get_catalogue(self, update=False, verbose=False):
         """
-        Get catalogue of railway station data.
+        Gets the catalogue of railway station data.
 
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: Catalogue of railway station data.
-        :rtype: dict
+        :return: A dictionary containing the catalogue of railway station data,
+            or ``None`` if no data catalogue is collected.
+        :rtype: dict | None
 
         **Examples**::
 
@@ -165,27 +192,6 @@ def get_catalogue(self, update=False, verbose=False):
 
         return catalogue
 
-    def _cdd(self, *sub_dir, **kwargs):
-        """
-        Change directory to package data directory and subdirectories (and/or a file).
-
-        The directory for this module: ``"data\\other-assets\\stations"``.
-
-        :param sub_dir: Subdirectory or subdirectories (and/or a file)
-        :type sub_dir: str
-        :param kwargs: [Optional] parameters of the function `pyhelpers.dirs.cd`_
-        :return: Path to the backup data directory for the class
-            :py:class:`~pyrcs.other_assets.station.Stations`.
-        :rtype: str
-
-        .. _`pyhelpers.dirs.cd`:
-            https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dirs.cd.html
-        """
-
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
-
-        return path
-
     @staticmethod
     def _split_elr_mileage_column(dat):
         if 'ELRMileage' in dat.columns:
@@ -221,7 +227,7 @@ def _to_repl(x, repl=' &&& '):
     @staticmethod
     def _check_row_spans(dat):
         """
-        Check data where there are row spans.
+        Checks data in which there are row spans.
 
         :param dat: Preprocessed data of the station locations.
         :type dat: pandas.DataFrame
@@ -262,7 +268,7 @@ def _check_row_spans(dat):
     @staticmethod
     def _parse_coordinates_columns(dat):
         """
-        Parse ``'Degrees Longitude'`` and ``'Degrees Latitude'`` of the station locations data.
+        Parses ``'Degrees Longitude'`` and ``'Degrees Latitude'`` of the station locations data.
 
         :param dat: Preprocessed data of the station locations.
         :type dat: pandas.DataFrame
@@ -280,7 +286,7 @@ def _parse_coordinates_columns(dat):
     @staticmethod
     def _parse_station_column(dat):
         """
-        Parse ``'Station'`` of the station locations data.
+        Parses ``'Station'`` of the station locations data.
 
         :param dat: Preprocessed data of the station locations.
         :type dat: pandas.DataFrame
@@ -362,7 +368,7 @@ def _parse_owner_and_operator(x):
 
     def _parse_owner_and_operator_columns(self, dat):
         """
-        Parse ``'Owner'`` and ``'Operator'`` of the station locations data.
+        Parses ``'Owner'`` and ``'Operator'`` of the station locations data.
 
         :param dat: Preprocessed data of the station locations.
         :type dat: pandas.DataFrame
@@ -384,18 +390,18 @@ def _parse_owner_and_operator_columns(self, dat):
 
     def collect_locations_by_initial(self, initial, update=False, verbose=False):
         """
-        Collect data of `railway station locations
+        Collects data of `railway station locations
         <http://www.railwaycodes.org.uk/stations/station0.shtm>`_
         (mileages, operators and grid coordinates) for a given initial letter.
 
-        :param initial: Initial letter of locations of the railway station data.
+        :param initial: The initial letter (e.g. ``'a'``, ``'z'``) of railway station names.
         :type initial: str
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
         :type verbose: bool | int
-        :return: Data of railway station locations beginning with the given ``initial`` letter and
-            date of when the data was last updated.
+        :return: A dictionary containing the data of railway station locations whose initial letters
+            are the given ``initial`` and date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
@@ -542,19 +548,20 @@ def collect_locations_by_initial(self, initial, update=False, verbose=False):
 
     def fetch_locations(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `railway station locations`_ (mileages, operators and grid coordinates).
+        Fetches the data of `railway station locations`_ (mileages, operators and grid coordinates).
 
         .. _`railway station locations`:
             http://www.railwaycodes.org.uk/stations/station0.shtm
 
-        :param update: Whether to do an update check (for the package data); defaults to ``False``.
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: Name of a directory where pickle files of the data is saved;
+        :param dump_dir: The path to a directory where the data file will be saved;
             defaults to ``None``.
         :type dump_dir: str | None
-        :param verbose: Whether to print relevant information in console; defaults to ``False``.
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
         :type verbose: bool | int
-        :return: Data of railway station locations and date of when the data was last updated.
+        :return: A dictionary containing the data of railway station locations and
+            the date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
diff --git a/pyrcs/other_assets/tunnel.py b/pyrcs/other_assets/tunnel.py
index 52de917..4f7e10c 100644
--- a/pyrcs/other_assets/tunnel.py
+++ b/pyrcs/other_assets/tunnel.py
@@ -1,4 +1,6 @@
-"""Collect data of `railway tunnel lengths <http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm>`_."""
+"""
+Collects data of `railway tunnel lengths <http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm>`_.
+"""
 
 import itertools
 import os
@@ -24,38 +26,37 @@ class Tunnels:
     `railway tunnel lengths <http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm>`_.
     """
 
-    #: Name of the data
-    NAME = 'Railway tunnel lengths'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Tunnels'
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '/tunnels/tunnels0.shtm')
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The name of the data.
+    NAME: str = 'Railway tunnel lengths'
+    #: The key for accessing the data.
+    KEY: str = 'Tunnels'
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/tunnels/tunnels0.shtm')
+
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Tunnels  # from pyrcs import Tunnels
-
             >>> tunl = Tunnels()
-
             >>> tunl.NAME
             'Railway tunnel lengths'
-
             >>> tunl.URL
             'http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm'
         """
@@ -64,59 +65,58 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = get_catalogue(url=self.URL, update=update, confirmation_required=False)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
-        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="other-assets")
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, "other-assets")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\other-assets\\tunnels"``.
+        The default data directory for this class is: ``"data\\other-assets\\tunnels"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.other_assets.tunnel.Tunnels`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     @staticmethod
     def _parse_length(x):
         """
-        Parse data in ``'Length'`` column, i.e. convert miles/yards to metres.
+        Parses data in ``'Length'`` column, i.e. convert miles/yards to metres.
 
-        :param x: raw length data
-        :type x: str or None
-        :return: parsed length data and, if any, additional information associated with it
+        :param x: Raw length data.
+        :type x: str | None
+        :return: The parsed length data and, if any, additional information associated with it.
         :rtype: tuple
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Tunnels  # from pyrcs import Tunnels
-
             >>> tunl = Tunnels()
-
             >>> tunl._parse_length('')
             (nan, 'Unavailable')
-
             >>> tunl._parse_length('1m 182y')
             (1775.7648, None)
-
             >>> tunl._parse_length('formerly 0m236y')
             (215.7984, 'Formerly')
-
             >>> tunl._parse_length('0.325km (0m 356y)')
             (325.5264, '0.325km')
-
             >>> tunl._parse_length("0m 48yd- (['0m 58yd'])")
             (48.4632, '43.89-53.04 metres')
         """
@@ -177,26 +177,26 @@ def _parse_length(x):
 
     def collect_codes_by_page(self, page_no, update=False, verbose=False):
         """
-        Collect data of `railway tunnel lengths`_ for a page number from source web page.
+        Collects data of `railway tunnel lengths`_ for a specified page number
+        from the source web page.
 
         .. _`railway tunnel lengths`: http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm
 
-        :param page_no: page number; valid values include ``1``, ``2``, ``3`` and ``4``
-        :type page_no: int or str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param page_no: The page number to collect data from;
+            valid values are ``1``, ``2``, ``3`` and ``4``.
+        :type page_no: int | str
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of tunnel lengths on page ``page_no`` and
-            date of when the data was last updated
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of tunnel lengths for the specified ``page_no``
+            and the date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Tunnels  # from pyrcs import Tunnels
-
             >>> tunl = Tunnels()
-
             >>> page_1 = tunl.collect_codes_by_page(page_no=1)
             >>> type(page_1)
             dict
@@ -213,7 +213,6 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
             3  Aberdovey No 1  also called Frongoch  ...        182.8800
             4  Aberdovey No 2    also called Morfor  ...        200.2536
             [5 rows x 10 columns]
-
             >>> page_4 = tunl.collect_codes_by_page(page_no=4)
             >>> type(page_4)
             dict
@@ -225,7 +224,6 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
             >>> list(page_4_codes.keys())
             ['Tunnels on industrial and other minor lines',
              'Large bridges that are not officially tunnels but could appear to be so']
-
             >>> key1 = 'Tunnels on industrial and other minor lines'
             >>> page_4_dat = page_4_codes[key1]
             >>> type(page_4_dat)
@@ -238,7 +236,6 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
             3  Baileycroft Quarry No 2                       ...         21.0312
             4            Basfords Hill                       ...         46.6344
             [5 rows x 6 columns]
-
             >>> key2 = 'Large bridges that are not officially tunnels but could appear to be so'
             >>> page_4_dat_ = page_4_codes[key2]
             >>> type(page_4_dat_)
@@ -264,7 +261,7 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
 
         else:
             if verbose == 2:
-                print("Collecting {} data ({})".format(self.KEY.lower(), page_name), end=" ... ")
+                print(f"Collecting {self.KEY.lower()} data ({page_name})", end=" ... ")
 
             codes_on_page = None
 
@@ -330,42 +327,38 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `railway tunnel lengths`_.
+        Fetches the data of `railway tunnel lengths`_.
 
         .. _`railway tunnel lengths`: http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of railway tunnel lengths
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of tunnel lengths
             (including the name, length, owner and relative location) and
-            date of when the data was last updated
+            the date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Tunnels  # from pyrcs import Tunnels
-
             >>> tunl = Tunnels()
-
             >>> tunl_len_codes = tunl.fetch_codes()
             >>> type(tunl_len_codes)
             dict
             >>> list(tunl_len_codes.keys())
             ['Tunnels', 'Last updated date']
-
             >>> tunl.KEY
             'Tunnels'
-
             >>> tunl_len_codes_dat = tunl_len_codes[tunl.KEY]
             >>> type(tunl_len_codes_dat)
             dict
             >>> list(tunl_len_codes_dat.keys())
             ['Page 1 (A-F)', 'Page 2 (G-P)', 'Page 3 (Q-Z)', 'Page 4 (others)']
-
             >>> page_1_codes = tunl_len_codes_dat['Page 1 (A-F)']
             >>> type(page_1_codes)
             pandas.core.frame.DataFrame
@@ -377,14 +370,12 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             3  Aberdovey No 1  also called Frongoch  ...        182.8800
             4  Aberdovey No 2    also called Morfor  ...        200.2536
             [5 rows x 10 columns]
-
             >>> page_4_codes = tunl_len_codes_dat['Page 4 (others)']
             >>> type(page_4_codes)
             dict
             >>> list(page_4_codes.keys())
             ['Tunnels on industrial and other minor lines',
              'Large bridges that are not officially tunnels but could appear to be so']
-
             >>> key1 = 'Tunnels on industrial and other minor lines'
             >>> page_4_dat = page_4_codes[key1]
             >>> type(page_4_dat)
@@ -397,7 +388,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
             3  Baileycroft Quarry No 2                       ...         21.0312
             4            Basfords Hill                       ...         46.6344
             [5 rows x 6 columns]
-
             >>> key2 = 'Large bridges that are not officially tunnels but could appear to be so'
             >>> page_4_dat_ = page_4_codes[key2]
             >>> type(page_4_dat_)
diff --git a/pyrcs/other_assets/viaduct.py b/pyrcs/other_assets/viaduct.py
index fbb9e20..d28831c 100644
--- a/pyrcs/other_assets/viaduct.py
+++ b/pyrcs/other_assets/viaduct.py
@@ -1,4 +1,6 @@
-"""Collect codes of `railway viaducts <http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm>`_."""
+"""
+Collects codes of `railway viaducts <http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm>`_.
+"""
 
 import itertools
 import os
@@ -21,38 +23,37 @@ class Viaducts:
     `railway viaducts <http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm>`_.
     """
 
-    #: Name of the data
-    NAME = 'Railway viaducts'
-    #: Key of the `dict <https://docs.python.org/3/library/stdtypes.html#dict>`_-type data
-    KEY = 'Viaducts'
-    #: URL of the main web page of the data
-    URL = urllib.parse.urljoin(home_page_url(), '/viaducts/viaducts0.shtm')
-    #: Key of the data of the last updated date
-    KEY_TO_LAST_UPDATED_DATE = 'Last updated date'
+    #: The name of the data.
+    NAME: str = 'Railway viaducts'
+    #: The key for accessing the data.
+    KEY: str = 'Viaducts'
+
+    #: The URL of the main web page for the data.
+    URL: str = urllib.parse.urljoin(home_page_url(), '/viaducts/viaducts0.shtm')
+
+    #: The key used to reference the last updated date in the data.
+    KEY_TO_LAST_UPDATED_DATE: str = 'Last updated date'
 
     def __init__(self, data_dir=None, update=False, verbose=True):
         """
-        :param data_dir: name of data directory, defaults to ``None``
-        :type data_dir: str or None
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param data_dir: The name of the directory for storing the data; defaults to ``None``.
+        :type data_dir: str | None
+        :param update: Whether to check for updates to the catalogue; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``True``
-        :type verbose: bool or int
+        :param verbose: Whether to print relevant information to the console; defaults to ``True``.
+        :type verbose: bool | int
 
-        :ivar dict catalogue: catalogue of the data
-        :ivar str last_updated_date: last updated date
-        :ivar str data_dir: path to the data directory
-        :ivar str current_data_dir: path to the current data directory
+        :ivar dict catalogue: The catalogue of the data.
+        :ivar str last_updated_date: The date when the data was last updated.
+        :ivar str data_dir: The path to the directory containing the data.
+        :ivar str current_data_dir: The path to the current data directory.
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Viaducts  # from pyrcs import Viaducts
-
             >>> vdct = Viaducts()
-
             >>> vdct.NAME
             'Railway viaducts'
-
             >>> vdct.URL
             'http://www.railwaycodes.org.uk/viaducts/viaducts0.shtm'
         """
@@ -61,60 +62,63 @@ def __init__(self, data_dir=None, update=False, verbose=True):
 
         self.catalogue = get_catalogue(url=self.URL, update=update, confirmation_required=False)
 
-        self.last_updated_date = get_last_updated_date(url=self.URL, parsed=True, as_date_type=False)
+        self.last_updated_date = get_last_updated_date(url=self.URL)
 
-        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, category="other-assets")
+        self.data_dir, self.current_data_dir = init_data_dir(self, data_dir, "other-assets")
 
-    def _cdd(self, *sub_dir, **kwargs):
+    def _cdd(self, *sub_dir, mkdir=True, **kwargs):
         """
-        Change directory to package data directory and subdirectories (and/or a file).
+        Changes the current directory to the package's data directory,
+        or its specified subdirectories (or file).
 
-        The directory for this module: ``"data\\other-assets\\viaducts"``.
+        The default data directory for this class is: ``"data\\other-assets\\viaducts"``.
 
-        :param sub_dir: subdirectory or subdirectories (and/or a file)
+        :param sub_dir: One or more subdirectories and/or a file to navigate to
+            within the data directory.
         :type sub_dir: str
-        :param kwargs: [optional] parameters of the function `pyhelpers.dir.cd`_
-        :return: path to the backup data directory for the class
-            :py:class:`~pyrcs.other_assets.viaduct.Viaducts`
+        :param mkdir: Whether to create the specified directory if it doesn't exist;
+            defaults to ``True``.
+        :type mkdir: bool
+        :param kwargs: [Optional] Additional parameters for the `pyhelpers.dir.cd()`_ function.
+        :return: The path to the backup data directory or its specified subdirectories (or file).
         :rtype: str
 
-        .. _`pyhelpers.dir.cd`:
+        .. _`pyhelpers.dir.cd()`:
             https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.dir.cd.html
         """
 
-        path = cd(self.data_dir, *sub_dir, mkdir=True, **kwargs)
+        kwargs.update({'mkdir': mkdir})
+        path = cd(self.data_dir, *sub_dir, **kwargs)
 
         return path
 
     def collect_codes_by_page(self, page_no, update=False, verbose=False):
         """
-        Collect data of `railway viaducts`_ for a given page number from source web page.
+        Collects data of `railway viaducts`_ for a specified page number
+        from the source web page.
 
         .. _`railway viaducts`: http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm
 
-        :param page_no: page number;
-            valid values include ``1``, ``2``, ``3``, ``4``, ``5``, and ``6``
-        :type page_no: int or str
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param page_no: The page number to collect data from;
+            valid values include ``1``, ``2``, ``3``, ``4``, ``5`` and ``6``
+        :type page_no: int | str
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of railway viaducts on page ``page_no`` and
-            date of when the data was last updated
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of railway viaducts for the specified ``page_no``
+            and the date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Viaducts  # from pyrcs import Viaducts
-
             >>> vdct = Viaducts()
-
             >>> page_1_codes = vdct.collect_codes_by_page(page_no=1)
             >>> type(page_1_codes)
             dict
             >>> list(page_1_codes.keys())
             ['Page 1 (A-C)', 'Last updated date']
-
             >>> page_1_dat = page_1_codes['Page 1 (A-C)']
             >>> type(page_1_dat)
             pandas.core.frame.DataFrame
@@ -140,7 +144,7 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
 
         else:
             if verbose == 2:
-                print("Collecting data of {} on {}".format(self.KEY.lower(), page_name), end=" ... ")
+                print(f"Collecting data of {self.KEY.lower()} on {page_name}", end=" ... ")
 
             codes_on_page = None
 
@@ -178,34 +182,32 @@ def collect_codes_by_page(self, page_no, update=False, verbose=False):
 
     def fetch_codes(self, update=False, dump_dir=None, verbose=False):
         """
-        Fetch data of `railway viaducts`_.
+        Fetches the data of `railway viaducts`_.
 
         .. _`railway viaducts`: http://www.railwaycodes.org.uk/tunnels/tunnels0.shtm
 
-        :param update: whether to do an update check (for the package data), defaults to ``False``
+        :param update: Whether to check for updates to the package data; defaults to ``False``.
         :type update: bool
-        :param dump_dir: name of a folder where the pickle file is to be saved, defaults to ``None``
-        :type dump_dir: str or None
-        :param verbose: whether to print relevant information in console, defaults to ``False``
-        :type verbose: bool or int
-        :return: data of railway viaducts and date of when the data was last updated
+        :param dump_dir: The path to a directory where the data file will be saved;
+            defaults to ``None``.
+        :type dump_dir: str | None
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+        :return: A dictionary containing the data of railway viaducts and
+            the date of when the data was last updated.
         :rtype: dict
 
         **Examples**::
 
             >>> from pyrcs.other_assets import Viaducts  # from pyrcs import Viaducts
-
             >>> vdct = Viaducts()
-
             >>> vdct_codes = vdct.fetch_codes()
             >>> type(vdct_codes)
             dict
             >>> list(vdct_codes.keys())
             ['Viaducts', 'Last updated date']
-
             >>> vdct.KEY
             'Viaducts'
-
             >>> vdct_codes_dat = vdct_codes[vdct.KEY]
             >>> type(vdct_codes_dat)
             dict
@@ -216,7 +218,6 @@ def fetch_codes(self, update=False, dump_dir=None, verbose=False):
              'Page 4 (L-P)',
              'Page 5 (Q-S)',
              'Page 6 (T-Z)']
-
             >>> page_6_codes = vdct_codes_dat['Page 6 (T-Z)']
             >>> type(page_6_codes)
             pandas.core.frame.DataFrame
diff --git a/pyrcs/parser.py b/pyrcs/parser.py
index 713bcef..ea6d5ef 100644
--- a/pyrcs/parser.py
+++ b/pyrcs/parser.py
@@ -1,4 +1,6 @@
-"""Parse web-page contents."""
+"""
+Parses web-page contents.
+"""
 
 import calendar
 import collections
@@ -11,11 +13,12 @@
 import dateutil.parser
 import pandas as pd
 import requests
+from pyhelpers._cache import _print_failure_msg
 from pyhelpers.ops import confirmed, fake_requests_headers
 from pyhelpers.store import load_data, save_data
 from pyhelpers.text import find_similar_str
 
-from pyrcs.utils import cd_data, format_err_msg, home_page_url, print_conn_err, print_inst_conn_err
+from .utils import cd_data, format_err_msg, home_page_url, print_conn_err, print_inst_conn_err
 
 
 # == Preprocess contents ===========================================================================
@@ -129,36 +132,40 @@ def _check_row_spanned(records, row_spanned):
 
 
 def parse_tr(trs, ths, sep=' / ', as_dataframe=False):
+    # noinspection PyUnresolvedReferences
     """
-    Parse a list of parsed HTML <tr> elements.
+    Parses a list of HTML ``<tr>`` elements and extracts data from a table.
+
+    This function processes the rows from a table (``<tr>`` tags) and assigns them to corresponding
+    column headers (``<th>`` tags). It can return the data either as a list of lists or as a
+    dataframe.
 
     See also [`PT-1 <https://stackoverflow.com/questions/28763891/>`_].
 
-    :param trs: contents under ``<tr>`` tags of a web page.
+    :param trs: The content of ``<tr>`` tags from a web page table.
     :type trs: bs4.ResultSet | list
-    :param ths: list of column names (usually under a ``<th>`` tag) of a requested table.
+    :param ths: A list of column names (typically from ``<th>`` tags) for the table.
     :type ths: list | bs4.element.Tag
-    :param sep: separator that replaces the one in the raw data.
+    :param sep: The separator to replace any separators found in the raw data;
+        defaults to ``' / '``.
     :type sep: str | None
-    :param as_dataframe: whether to return the parsed data in tabular form
+    :param as_dataframe: If ``True``, returns the data as a Pandas DataFrame; defaults to ``False``.
     :type as_dataframe: bool
-    :return: a list of lists that each comprises a row of the requested table
-    :rtype: pandas.DataFrame | typing.List[list]
+    :return: A list of lists representing rows of the table,
+        or a dataframe if ``as_dataframe`` is ``True``.
+    :rtype: pandas.DataFrame | list[list]
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.parser import parse_tr
         >>> import requests
         >>> import bs4
-
         >>> example_url = 'http://www.railwaycodes.org.uk/elrs/elra.shtm'
         >>> source = requests.get(example_url)
-        >>> parsed_text = bs4.BeautifulSoup(markup=source.content, features='html.parser')
+        >>> parsed_text = bs4.BeautifulSoup(source.content, 'html.parser')
         >>> ths_dat = [th.text for th in parsed_text.find_all('th')]
         >>> trs_dat = parsed_text.find_all(name='tr')
-
         >>> tables_list = parse_tr(trs=trs_dat, ths=ths_dat)  # returns a list of lists
-
         >>> type(tables_list)
         list
         >>> len(tables_list) // 100
@@ -206,27 +213,29 @@ def parse_tr(trs, ths, sep=' / ', as_dataframe=False):
 
 def parse_table(source, parser='html.parser', as_dataframe=False):
     """
-    Parse HTML <tr> elements for creating a data frame.
+    Parses HTML ``<tr>`` elements to create a table from the given source.
+
+    This function extracts data from the ``<thead>`` and ``<tbody>`` elements of an HTML table
+    and processes it into a list of lists (rows of the table) or a dataframe.
 
-    :param source: response object to connecting a URL to request a table
+    :param source: The response object containing the HTML table from a requested URL.
     :type source: requests.Response
-    :param parser: ``'html.parser'`` (default), ``'html5lib'`` or ``'lxml'``
+    :param parser: The parser to use for processing the HTML;
+        options are ``'html.parser'`` (default), ``'html5lib'`` or ``'lxml'``.
     :type parser: str
-    :param as_dataframe: whether to return the parsed data in tabular form
+    :param as_dataframe: If ``True``, the parsed data is returned as a dataframe.
+        If ``False``, it returns a list of lists and column names; defaults to ``False``.
     :type as_dataframe: bool
-    :return: a list of lists each comprising a row of the requested table
-        (see also :func:`pyrcs.utils.parse_tr`) and a list of column names of the requested table
+    :return: A tuple containing a list of column names and a list of lists representing
+        rows of the table; if ``as_dataframe=True``, returns a dataframe.
     :rtype: tuple[list, list] | pandas.DataFrame | list
 
     **Examples**::
 
         >>> from pyrcs.parser import parse_table
         >>> import requests
-
         >>> source_dat = requests.get(url='http://www.railwaycodes.org.uk/elrs/elra.shtm')
-
         >>> columns_dat, records_dat = parse_table(source_dat)
-
         >>> columns_dat
         ['ELR', 'Line name', 'Mileages', 'Datum', 'Notes']
         >>> type(records_dat)
@@ -265,29 +274,32 @@ def parse_table(source, parser='html.parser', as_dataframe=False):
 
 def parse_date(str_date, as_date_type=False):
     """
-    Parse a date.
+    Parses a string representation of a date into a formatted date.
 
-    :param str_date: string-type date
+    This function attempts to parse a string date (even with slight errors or non-standard formats)
+    into either a string in the "YYYY-MM-DD" format or a `datetime.date`_ object.
+
+    .. _`datetime.date`: https://docs.python.org/3/library/datetime.html#datetime.date
+
+    :param str_date: The date as a string, whose format can vary and may include month names
+        or other elements.
     :type str_date: str
-    :param as_date_type: whether to return the date as `datetime.date`_, defaults to ``False``
+    :param as_date_type: If ``True``, returns the result as a `datetime.date` object;
+        if ``False`` (default), returns the result as a formatted string.
     :type as_date_type: bool
-    :return: parsed date as a string or `datetime.date`_
+    :return: The parsed date either as a string in "YYYY-MM-DD" format or as a date object.
     :rtype: str | datetime.date
 
-    .. _`datetime.date`: https://docs.python.org/3/library/datetime.html#datetime.date
-
     **Examples**::
 
         >>> from pyrcs.parser import parse_date
-
         >>> str_date_dat = '2020-01-01'
-
-        >>> parsed_date_dat = parse_date(str_date_dat)
-        >>> parsed_date_dat
+        >>> parse_date(str_date_dat)
         '2020-01-01'
-
-        >>> parsed_date_dat = parse_date(str_date_dat, as_date_type=True)
-        >>> parsed_date_dat
+        >>> str_date_dat = '2020-jan-01'
+        >>> parse_date(str_date_dat)
+        '2020-01-01'
+        >>> parse_date(str_date_dat, as_date_type=True)
         datetime.date(2020, 1, 1)
     """
 
@@ -435,23 +447,22 @@ def _get_site_map(source):
 
 def get_site_map(update=False, confirmation_required=True, verbose=False):
     """
-    Fetch the `site map <http://www.railwaycodes.org.uk/misc/sitemap.shtm>`_ from the package data.
+    Gets the `site map <http://www.railwaycodes.org.uk/misc/sitemap.shtm>`_.
 
-    :param update: whether to do an update check (for the package data), defaults to ``False``
+    :param update: Whether to check for updates to the package data; defaults to ``False``.
     :type update: bool
-    :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+    :param confirmation_required: Whether user confirmation is required before proceeding;
+        defaults to ``True``.
     :type confirmation_required: bool
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print relevant information to the console; defaults to ``False``.
     :type verbose: bool | int
-    :return: dictionary of site map data
+    :return: An ordered dictionary containing the data of site map.
     :rtype: collections.OrderedDict | None
 
     **Examples**::
 
         >>> from pyrcs.parser import get_site_map
-
         >>> site_map_dat = get_site_map()
-
         >>> type(site_map_dat)
         collections.OrderedDict
         >>> list(site_map_dat.keys())
@@ -474,7 +485,6 @@ def get_site_map(update=False, confirmation_required=True, verbose=False):
         site_map = None
 
         if confirmed("To collect the site map\n?", confirmation_required=confirmation_required):
-
             if verbose == 2:
                 print("Updating the package data", end=" ... ")
 
@@ -507,17 +517,23 @@ def get_site_map(update=False, confirmation_required=True, verbose=False):
 
 def get_last_updated_date(url, parsed=True, as_date_type=False, verbose=False):
     """
-    Get last update date.
+    Gets the last update date of a specified web page.
 
-    :param url: URL link of a requested web page
+    This function extracts the date when the given web page was last updated.
+    The date can be returned as a string or a date object.
+
+    :param url: The URL of the web page for which the last update date is requested.
     :type url: str
-    :param parsed: whether to reformat the date, defaults to ``True``
+    :param parsed: Whether to reformat the date into a standardized format (``YYYY-MM-DD``);
+        defaults to ``True``.
     :type parsed: bool
-    :param as_date_type: whether to return the date as `datetime.date`_, defaults to ``False``
+    :param as_date_type: If ``True``, the date is returned as a `datetime.date`_ object;
+        if ``False`` (default), it's returned as a string.
     :type as_date_type: bool
-    :param verbose: whether to print relevant information in console, defaults to ``False``
-    :type verbose: bool | int
-    :return: date of when the specified web page was last updated
+        :param verbose: Whether to print relevant information to the console; defaults to ``False``.
+        :type verbose: bool | int
+    :return: The last update date of the specified web page,
+        or ``None`` if this information is not available on the web page.
     :rtype: str | datetime.date | None
 
     .. _`datetime.date`: https://docs.python.org/3/library/datetime.html#datetime.date
@@ -525,16 +541,13 @@ def get_last_updated_date(url, parsed=True, as_date_type=False, verbose=False):
     **Examples**::
 
         >>> from pyrcs.parser import get_last_updated_date
-
         >>> url_a = 'http://www.railwaycodes.org.uk/crs/CRSa.shtm'
         >>> last_upd_date = get_last_updated_date(url_a, parsed=True, as_date_type=False)
         >>> type(last_upd_date)
         str
-
         >>> last_upd_date = get_last_updated_date(url_a, parsed=True, as_date_type=True)
         >>> type(last_upd_date)
         datetime.date
-
         >>> ldm_url = 'http://www.railwaycodes.org.uk/linedatamenu.shtm'
         >>> last_upd_date = get_last_updated_date(url=ldm_url)
         >>> print(last_upd_date)
@@ -571,18 +584,20 @@ def get_last_updated_date(url, parsed=True, as_date_type=False, verbose=False):
 
 def get_financial_year(date):
     """
-    Convert calendar year of a given date to Network Rail financial year.
+    Convert the calendar year of a given date to the corresponding financial year.
+
+    The financial year runs from 1st April to 31st March of the following year.
+    This function takes a date and determines the financial year it falls into.
 
-    :param date: date
+    :param date: The date for which the financial year is to be determined.
     :type date: datetime.datetime
-    :return: Network Rail financial year of the given ``date``
+    :return: The financial year of the given ``date``.
     :rtype: int
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.parser import get_financial_year
         >>> import datetime
-
         >>> financial_year = get_financial_year(date=datetime.datetime(2021, 3, 31))
         >>> financial_year
         2020
@@ -610,23 +625,25 @@ def _parse_h3_paras(h3):
 
 def get_introduction(url, delimiter='\n', verbose=True):
     """
-    Get contents of the Introduction page.
+    Gets the introduction section of a specified web page.
+
+    This function scrapes the introduction text from the given URL, typically used to
+    summarise data clusters.
 
-    :param url: URL of a web page (usually the main page of a data cluster)
+    :param url: The URL of the web page (usually the main page of a data cluster).
     :type url: str
-    :param delimiter: delimiter used for separating paragraphs, defaults to ``'\\n'``
+    :param delimiter: The delimiter used to separate paragraphs in the returned content;
+        defaults to ``'\\n'`` (newline).
     :type delimiter: str
-    :param verbose: whether to print relevant information in console, defaults to ``True``
+    :param verbose: Whether to print relevant information to the console; defaults to ``True``.
     :type verbose: bool | int
-    :return: introductory texts on the given web page
+    :return: The introductory text from the web page, formatted with the specified delimiter.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.parser import get_introduction
-
         >>> bridges_url = 'http://www.railwaycodes.org.uk/bridges/bridges0.shtm'
-
         >>> intro_text = get_introduction(url=bridges_url)
         >>> intro_text
         "There are thousands of bridges over and under the railway system. These pages attempt to...
@@ -653,25 +670,29 @@ def get_introduction(url, delimiter='\n', verbose=True):
 
 def get_catalogue(url, update=False, confirmation_required=True, json_it=True, verbose=False):
     """
-    Get the catalogue for a class.
+    Gets the catalogue of items from the main page of a data cluster.
 
-    :param url: URL of the main page of a data cluster
+    This function scrapes a catalogue of entries (typically hyperlinks) from a specified URL.
+    It offers the option to save the catalogue as a JSON file.
+
+    :param url: The URL of the main page of a data cluster.
     :type url: str
-    :param update: whether to do an update check (for the package data), defaults to ``False``
+    :param update: Whether to check for updates to the package data; defaults to ``False``.
     :type update: bool
-    :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+    :param confirmation_required: Whether user confirmation is required before proceeding;
+        defaults to ``True``.
     :type confirmation_required: bool
-    :param json_it: whether to save the catalogue as a JSON file, defaults to ``True``
+    :param json_it: Whether to save the catalogue as a JSON file; defaults to ``True``.
     :type json_it: bool
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print relevant information to the console; defaults to ``False``.
     :type verbose: bool | int
-    :return: catalogue in the form {'<title>': '<URL>'}
+    :return: The catalogue in the form of a dictionary, where keys are entry titles and
+        values are URLs, or ``None`` if the operation is unsuccessful.
     :rtype: dict | None
 
     **Examples**::
 
         >>> from pyrcs.parser import get_catalogue
-
         >>> elr_cat = get_catalogue(url='http://www.railwaycodes.org.uk/elrs/elr0.shtm')
         >>> type(elr_cat)
         dict
@@ -683,7 +704,6 @@ def get_catalogue(url, update=False, confirmation_required=True, json_it=True, v
          'LUL system',
          'DLR system',
          'Canals']
-
         >>> line_data_cat = get_catalogue(url='http://www.railwaycodes.org.uk/linedatamenu.shtm')
         >>> type(line_data_cat)
         dict
@@ -721,20 +741,25 @@ def get_catalogue(url, update=False, confirmation_required=True, json_it=True, v
                         cold_soup = soup.find(name='div', attrs={'class': 'fixed'})
 
                         catalogue = {
-                            a.text.replace('\xa0', ' ').strip(): urllib.parse.urljoin(url, a.get('href'))
-                            for a in cold_soup.find_all('a')}
+                            a.text.replace('\xa0', ' ').strip():
+                                urllib.parse.urljoin(url, a.get('href'))
+                            for a in cold_soup.find_all('a')
+                        }
 
                     except AttributeError:
                         cold_soup = soup.find(name='h1').find_all_next(name='a')
+                        # assert all(isinstance(a, bs4.Tag) for a in cold_soup)
+                        # noinspection PyUnresolvedReferences
                         catalogue = {
-                            a.text.replace('\xa0', ' ').strip(): urllib.parse.urljoin(url, a.get('href'))
-                            for a in cold_soup}
+                            a.text.replace('\xa0', ' ').strip():
+                                urllib.parse.urljoin(url, a.get('href')) for a in cold_soup
+                        }
 
                     if json_it and catalogue is not None:
                         save_data(catalogue, path_to_cat_json, verbose=verbose, indent=4)
 
                 except Exception as e:
-                    print("Failed to get the catalogue. {}".format(e))
+                    _print_failure_msg(e, msg="Failed to get the catalogue.")
 
         else:
             print("The catalogue for the requested data has not been acquired.")
@@ -744,27 +769,31 @@ def get_catalogue(url, update=False, confirmation_required=True, json_it=True, v
 
 def get_category_menu(url, update=False, confirmation_required=True, json_it=True, verbose=False):
     """
-    Get a menu of the available classes.
+    Gets a menu of the available classes from the specified URL.
 
-    :param url: URL of the menu page
+    This function scrapes a web page for available classes (typically categorised hyperlinks) and
+    returns them as a dictionary. It also provides options to update the catalogue and
+    save it as a JSON file.
+
+    :param url: The URL of the menu page.
     :type url: str
-    :param update: whether to do an update check (for the package data), defaults to ``False``
+    :param update: Whether to check for updates to the package data; defaults to ``False``.
     :type update: bool
-    :param confirmation_required: whether to confirm before proceeding, defaults to ``True``
+    :param confirmation_required: Whether user confirmation is required before proceeding;
+        defaults to ``True``.
     :type confirmation_required: bool
-    :param json_it: whether to save the catalogue as a .json file, defaults to ``True``
+    :param json_it: Whether to save the catalogue as a JSON file; defaults to ``True``.
     :type json_it: bool
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print relevant information to the console; defaults to ``False``.
     :type verbose: bool | int
-    :return: a category menu
+    :return: A category menu in dictionary form,
+        where keys are data cluster names and values are URLs.
     :rtype: dict | None
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.parser import get_category_menu
-
         >>> menu = get_category_menu('http://www.railwaycodes.org.uk/linedatamenu.shtm')
-
         >>> type(menu)
         dict
         >>> list(menu.keys())
@@ -781,8 +810,7 @@ def get_category_menu(url, update=False, confirmation_required=True, json_it=Tru
     else:
         cls_menu = None
 
-        if confirmed("To collect/update category menu?",
-                     confirmation_required=confirmation_required):
+        if confirmed("To collect/update category menu?", confirmation_required):
 
             try:
                 source = requests.get(url=url, headers=fake_requests_headers())
@@ -797,16 +825,19 @@ def get_category_menu(url, update=False, confirmation_required=True, json_it=Tru
                     cls_name = h1.text.replace(' menu', '')
 
                     if len(h2s) == 0:
+                        # noinspection PyUnresolvedReferences
                         cls_elem = dict(
                             (x.text, urllib.parse.urljoin(url, x.get('href')))
                             for x in h1.find_all_next('a'))
 
                     else:
+                        # noinspection PyUnresolvedReferences
                         all_next = [
                             x.replace(':', '') for x in h1.find_all_next(string=True)
                             if x != '\n' and x != '\xa0']
                         all_next = all_next[2:]
                         h2s_list = [x.text.replace(':', '') for x in h2s]
+                        # noinspection PyUnresolvedReferences
                         all_next_a = [
                             (x.text, urllib.parse.urljoin(url, x.get('href')))
                             for x in h1.find_all_next('a', href=True)]
@@ -834,7 +865,7 @@ def get_category_menu(url, update=False, confirmation_required=True, json_it=Tru
                         save_data(cls_menu, path_to_menu_json, verbose=verbose)
 
                 except Exception as e:
-                    print("Failed to get the category menu. {}".format(e))
+                    _print_failure_msg(e, msg="Failed to get the category menu.")
 
         else:
             print("The category menu has not been acquired.")
@@ -844,28 +875,24 @@ def get_category_menu(url, update=False, confirmation_required=True, json_it=Tru
 
 def get_heading_text(heading_tag, elem_tag_name='em'):
     """
-    Get the text of a given heading tag.
+    Gets the text from a given HTML heading tag.
 
-    :param heading_tag: tag of a heading
+    :param heading_tag: The HTML tag of a heading element.
     :type heading_tag: bs4.element.Tag
-    :param elem_tag_name: tag name of an element in the ``heading_tag``, defaults to ``'em'``
+    :param elem_tag_name: The tag name of an inner element within the heading; defaults to ``'em'``.
     :type elem_tag_name: str
-    :return: cleansed text of the given ``heading_tag``
+    :return: Cleaned text of the heading tag.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.parser import get_heading_text
         >>> from pyrcs.line_data import Electrification
-
         >>> elec = Electrification()
-
         >>> url = elec.catalogue[elec.KEY_TO_INDEPENDENT_LINES]
         >>> source = requests.get(url=url, headers=fake_requests_headers())
         >>> soup = bs4.BeautifulSoup(markup=source.content, features='html.parser')
-
         >>> h3 = soup.find('h3')
-
         >>> h3_text = get_heading_text(heading_tag=h3, elem_tag_name='em')
         >>> h3_text
         'Beamish Tramway'
@@ -874,6 +901,7 @@ def get_heading_text(heading_tag, elem_tag_name='em'):
     heading_x = []
 
     for elem in heading_tag.contents:
+        # noinspection PyUnresolvedReferences
         if elem.name == elem_tag_name:
             heading_x.append('[' + elem.text + ']')
         else:
@@ -887,30 +915,32 @@ def get_heading_text(heading_tag, elem_tag_name='em'):
 def get_page_catalogue(url, head_tag_name='nav', head_tag_txt='Jump to: ', feature_tag_name='h3',
                        verbose=False):
     """
-    Get the catalogue of the main page of a data cluster.
+    Gets the catalogue of features from the main page of a data cluster.
+
+    This function extracts structured data (features) from a web page by parsing specific tags,
+    typically used for features like headings and links in railway-related databases.
 
-    :param url: URL of the main page of a data cluster
+    :param url: The URL of the main page of a data cluster.
     :type url: str
-    :param head_tag_name: tag name of the feature list at the top of the page, defaults to ``'nav'``
+    :param head_tag_name: The tag name of the feature list at the top of the page;
+        defaults to ``'nav'``.
     :type head_tag_name: str
-    :param head_tag_txt: text that is contained in the head_tag, defaults to ``'Jump to: '``
+    :param head_tag_txt: Text contained in the head tag; defaults to ``'Jump to: '``.
     :type head_tag_txt: str
-    :param feature_tag_name: tag name of the headings of each feature, defaults to ``'h3'``
+    :param feature_tag_name: The tag name of the headings of each feature; defaults to ``'h3'``.
     :type feature_tag_name: str
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print relevant information to the console; defaults to ``False``.
     :type verbose: bool | int
-    :return: catalogue of the main page of a data cluster
+    :return: A dataframe containing the page's feature catalogue with columns for feature, URL and
+        heading.
     :rtype: pandas.DataFrame
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.parser import get_page_catalogue
         >>> from pyhelpers.settings import pd_preferences
-
         >>> pd_preferences(max_columns=1)
-
         >>> elec_url = 'http://www.railwaycodes.org.uk/electrification/mast_prefix2.shtm'
-
         >>> elec_catalogue = get_page_catalogue(elec_url)
         >>> elec_catalogue
                                                       Feature  ...
@@ -925,9 +955,7 @@ def get_page_catalogue(url, head_tag_name='nav', head_tag_txt='Jump to: ', featu
         19                          Snaefell Mountain Railway  ...
         20  Summerlee, Museum of Scottish Industrial Life ...  ...
         21                                  Tyne & Wear Metro  ...
-
         [22 rows x 3 columns]
-
         >>> elec_catalogue.columns.to_list()
         ['Feature', 'URL', 'Heading']
     """
@@ -971,15 +999,19 @@ def get_page_catalogue(url, head_tag_name='nav', head_tag_txt='Jump to: ', featu
 
 def get_hypertext(hypertext_tag, hyperlink_tag_name='a', md_style=True):
     """
-    Get text that is with a hyperlink.
+    Gets hyperlinked text from a specified HTML tag.
+
+    This function scrapes hypertext content, optionally returning it in Markdown format if
+    requested.
 
-    :param hypertext_tag: tag of hypertext (i.e. text that is with a hyperlink)
+    :param hypertext_tag: The tag containing hyperlinked text.
     :type hypertext_tag: bs4.element.Tag | bs4.element.PageElement
-    :param hyperlink_tag_name:
+    :param hyperlink_tag_name: The tag name of the hyperlink within the hypertext;
+        defaults to ``'a'``.
     :type hyperlink_tag_name: str
-    :param md_style: whether to return the obtained hypertext in markdown style, defaults to ``True``
+    :param md_style: Whether to return the hypertext in Markdown style, defaults to ``True``.
     :type md_style: bool
-    :return: hypertext
+    :return: The hypertext.
     :rtype: str
 
     **Examples**::
@@ -988,19 +1020,14 @@ def get_hypertext(hypertext_tag, hyperlink_tag_name='a', md_style=True):
         >>> from pyrcs.line_data import Electrification
         >>> import bs4
         >>> import requests
-
         >>> elec = Electrification()
-
         >>> url = elec.catalogue[elec.KEY_TO_INDEPENDENT_LINES]
         >>> source = requests.get(url)
         >>> soup = bs4.BeautifulSoup(source.content, 'html.parser')
-
         >>> h3 = soup.find('h3')
-
         >>> p = h3.find_all_next('p')[8]
         >>> p
         <p>Croydon Tramlink mast references can be found on the <a href="http://www.croydon-traml...
-
         >>> hyper_txt = get_hypertext(hypertext_tag=p, md_style=True)
         >>> hyper_txt
         'Croydon Tramlink mast references can be found on the [Croydon Tramlink Unofficial Site](...
@@ -1009,6 +1036,7 @@ def get_hypertext(hypertext_tag, hyperlink_tag_name='a', md_style=True):
     hypertext_x = []
 
     for x in hypertext_tag.contents:
+        # noinspection PyUnresolvedReferences
         if x.name == hyperlink_tag_name:
             # noinspection PyUnresolvedReferences
             href = x.get('href')
diff --git a/pyrcs/utils.py b/pyrcs/utils.py
index c4f5f7c..db2fe31 100644
--- a/pyrcs/utils.py
+++ b/pyrcs/utils.py
@@ -1,4 +1,6 @@
-"""Provide a number of helper functions."""
+"""
+Provides a number of helper functions.
+"""
 
 import copy
 import importlib.resources
@@ -17,15 +19,14 @@
 
 def home_page_url():
     """
-    Specify the homepage URL of the data source.
+    Returns the homepage URL of the data source.
 
-    :return: URL of the data source homepage
+    :return: The homepage URL of the data source.
     :rtype: str
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import home_page_url
-
         >>> home_page_url()
         'http://www.railwaycodes.org.uk/'
     """
@@ -38,15 +39,14 @@ def home_page_url():
 
 def is_home_connectable():
     """
-    Check whether the Railway Codes website is connectable.
+    Checks and returns whether the Railway Codes website is reacheable.
 
-    :return: whether the Railway Codes website is connectable
+    :return: Whether the Railway Codes website is reacheable.
     :rtype: bool
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import is_home_connectable
-
         >>> is_home_connectable()
         True
     """
@@ -60,26 +60,22 @@ def is_home_connectable():
 
 def is_str_float(x):
     """
-    Check if a string-type variable can express a float-type value.
+    Checks and returns whether a string represents a float value.
 
-    :param x: a string-type variable
+    :param x: String-type data.
     :type x: str
-    :return: whether ``str_val`` can express a float value
+    :return: Whether the string-type data represents a float value.
     :rtype: bool
 
     **Examples**::
 
         >>> from pyrcs.utils import is_str_float
-
         >>> is_str_float('')
         False
-
         >>> is_str_float('a')
         False
-
         >>> is_str_float('1')
         True
-
         >>> is_str_float('1.1')
         True
     """
@@ -96,25 +92,24 @@ def is_str_float(x):
 
 def validate_initial(x, as_is=False):
     """
-    Get a valid initial letter as an input.
+    Validates if a string is a single letter, returning it in upper case or as is.
 
-    :param x: any string variable (which is supposed to be an initial letter)
+    :param x: The input value to validate,
+        which is expected to be a string representing a single letter.
     :type x: str
-    :param as_is: whether to return the validated letter as is the input
+    :param as_is: If set to ``True``, the function returns the letter in its original case;
+        if set to ``False`` (default), the letter is returned in uppercase.
     :type as_is: bool
-    :return: validated initial letter
+    :return: The validated initial letter, either in uppercase or as-is.
     :rtype: str
 
     **Examples**::
 
         >>> from pyrcs.utils import validate_initial
-
         >>> validate_initial('x')
         'X'
-
         >>> validate_initial('x', as_is=True)
         'x'
-
         >>> validate_initial('xyz')
         AssertionError: `x` must be a single letter.
     """
@@ -126,52 +121,62 @@ def validate_initial(x, as_is=False):
     return valid_initial
 
 
-def validate_page_name(cls, page_no, valid_page_no):
+def validate_page_name(cls_instance, page_no, valid_page_no):
     """
-    Get a valid page name.
+    Retrieves the valid page name corresponding to a given page number.
+
+    This method checks if the provided ``page_no`` is within the set of
+    valid page numbers. If valid, it returns the name of the page
+    associated with the specified ``page_no`` from the catalogue of the given ``cls_instance``.
 
-    :param cls: instance of a class
-    :type cls: any
-    :param page_no: page number
+    :param cls_instance: An instance of the class that contains the page catalogue.
+    :type cls_instance: object
+    :param page_no: The page number to validate,
+        which can be an integer or a string representation of a number.
     :type page_no: int | str
-    :param valid_page_no: all valid page numbers
+    :param valid_page_no: A collection of valid page numbers,
+        which can be a set, list, or tuple containing the allowable page numbers.
     :type valid_page_no: set | list | tuple
-    :return: validated page name of the given ``cls``
+    :return: The validated page name associated with the given ``page_no`` in the class's catalogue.
     :rtype: str
 
     .. seealso::
 
-        - Examples for the methods
-          :meth:`Tunnels.collect_codes_by_page()
+        Examples for the methods:
+
+        - :meth:`Tunnels.collect_codes_by_page()
           <pyrcs.other_assets.tunnel.Tunnels.collect_codes_by_page>`
-          and
-          :meth:`Tunnels.collect_codes_by_page()
-          <pyrcs.other_assets.viaduct.Viaducts.collect_codes_by_page>`.
+        - :meth:`Tunnels.collect_codes_by_page()
+          <pyrcs.other_assets.viaduct.Viaducts.collect_codes_by_page>`
     """
 
     assert page_no in valid_page_no, f"Valid `page_no` must be one of {valid_page_no}."
 
-    page_name = [k for k in cls.catalogue.keys() if str(page_no) in k][0]
+    assert hasattr(cls_instance, 'catalogue'), \
+        "The input `cls_instance` must have an attribute named `catalogue`."
+    # noinspection PyUnresolvedReferences
+    page_name = [k for k in cls_instance.catalogue.keys() if str(page_no) in k][0]
 
     return page_name
 
 
 def collect_in_fetch_verbose(data_dir, verbose):
     """
-    Create a new parameter that indicates whether to print relevant information in console
-    (used only if it is necessary to re-collect data when trying to fetch the data).
+    Creates a new parameter that indicates whether to print relevant information to the console.
+
+    This function is used only if it is necessary to re-collect data when trying to fetch the data.
 
-    :param data_dir: name of a folder where the pickle file is to be saved
+    :param data_dir: The name of the folder where the pickle file is to be saved.
     :type data_dir: str | None
-    :param verbose: whether to print relevant information in console
+    :param verbose: Whether to print relevant information to the console.
     :type verbose: bool | int
-    :return: whether to print relevant information in console when collecting data
+    :return: A boolean indicating whether to print relevant information to the console when
+        collecting data.
     :rtype: bool | int
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import collect_in_fetch_verbose
-
         >>> collect_in_fetch_verbose(data_dir="data", verbose=True)
         False
     """
@@ -183,20 +188,21 @@ def collect_in_fetch_verbose(data_dir, verbose):
 
 def fetch_all_verbose(data_dir, verbose):
     """
-    Create a new parameter that indicates whether to print relevant information in console
-    (used only when trying to fetch all data of a cluster).
+    Creates a new parameter that indicates whether to print relevant information to the console.
+
+    This function is used only when fetching all data of a cluster.
 
-    :param data_dir: name of a folder where the pickle file is to be saved
+    :param data_dir: Name of the folder where the pickle file is to be saved.
     :type data_dir: str | None
-    :param verbose: whether to print relevant information in console
+    :param verbose: Whether to print relevant information to the console.
     :type verbose: bool | int
-    :return: whether to print relevant information in console when collecting data
+    :return: A boolean indicating whether to print relevant information to the console when
+        fetching all data of a cluster.
     :rtype: bool | int
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import fetch_all_verbose
-
         >>> fetch_all_verbose(data_dir="data", verbose=True)
         False
     """
@@ -214,17 +220,16 @@ def fetch_all_verbose(data_dir, verbose):
 
 def confirm_msg(data_name):
     """
-    Create a confirmation message (for data collection).
+    Returns a message for comfirming whether to proceed to collect a certain cluster of data.
 
-    :param data_name: name of data, e.g. "Railway Codes"
+    :param data_name: The name of data, e.g. "Railway Codes".
     :type data_name: str
-    :return: a confirmation message
+    :return: A confirmation message.
     :rtype: str
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import confirm_msg
-
         >>> msg = confirm_msg(data_name="Railway Codes")
         >>> print(msg)
         To collect data of Railway Codes
@@ -238,21 +243,20 @@ def confirm_msg(data_name):
 
 def print_collect_msg(data_name, verbose, confirmation_required, end=" ... "):
     """
-    Print a message about the status of collecting data.
+    Prints a message indicating the status of data collection.
 
-    :param data_name: name of the data being collected
+    :param data_name: The name of the data being collected.
     :type data_name: str
-    :param verbose: whether to print relevant information in console
+    :param verbose: Whether to print relevant information to the console.
     :type verbose: bool | int
-    :param confirmation_required: whether to confirm before proceeding
+    :param confirmation_required: Whether user confirmation is required before proceeding.
     :type confirmation_required: bool
-    :param end: string appended after the last value, defaults to ``" ... "``.
+    :param end: String appended at the end of the message; defaults to ``" ... "``.
     :type end: str
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import print_collect_msg
-
         >>> print_collect_msg("Railway Codes", verbose=2, confirmation_required=False)
         Collecting the data of "Railway Codes" ...
     """
@@ -266,15 +270,14 @@ def print_collect_msg(data_name, verbose, confirmation_required, end=" ... "):
 
 def print_conn_err(verbose=False):
     """
-    Print a message about unsuccessful attempts to establish a connection to the Internet.
+    Prints a message if an Internet connection attempt is unsuccessful.
 
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print relevant information to the console; defaults to ``False``
     :type verbose: bool | int
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import print_conn_err
-
         >>> # If Internet connection is ready, nothing would be printed
         >>> print_conn_err(verbose=True)
 
@@ -288,11 +291,11 @@ def print_conn_err(verbose=False):
 
 def format_err_msg(e):
     """
-    Format an error message.
+    Formats an error message from an exception.
 
-    :param e: Subclass of Exception.
+    :param e: An instance of an exception or ``None``.
     :type e: Exception | None
-    :return: An error message.
+    :return: A formatted error message.
     :rtype: str
     """
 
@@ -307,21 +310,19 @@ def format_err_msg(e):
 
 def print_inst_conn_err(update=False, verbose=False, e=None):
     """
-    Print a message about unsuccessful attempts to establish a connection to the Internet
-    (for an instance of a class).
+    Print a message when an instance fails to establish an Internet connection.
 
-    :param update: mostly complies with ``update`` in a parent function that uses this function,
+    :param update: Reflects the ``update`` parameter from the parent function;
         defaults to ``False``
     :type update: bool
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print relevant information to the console; defaults to ``False``.
     :type verbose: bool | int
-    :param e: error message
+    :param e: An optional exception message to display.
     :type e: Exception | None
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import print_inst_conn_err
-
         >>> print_inst_conn_err(verbose=True)
         The Internet connection is not available.
     """
@@ -339,18 +340,16 @@ def print_inst_conn_err(update=False, verbose=False, e=None):
 
 def print_void_msg(data_name, verbose):
     """
-    Print a message about the status of collecting data
-    (only when the data collection process fails).
+    Print a message when the data collection process fails.
 
-    :param data_name: name of the data being collected
+    :param data_name: The name of the data being collected.
     :type data_name: str
-    :param verbose: whether to print relevant information in console
+    :param verbose: Whether to print relevant information to the console.
     :type verbose: bool | int
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import print_void_msg
-
         >>> print_void_msg(data_name="Railway Codes", verbose=True)
         No data of "Railway Codes" has been freshly collected.
     """
@@ -364,25 +363,25 @@ def print_void_msg(data_name, verbose):
 
 def cd_data(*sub_dir, data_dir="data", mkdir=False, **kwargs):
     """
-    Specify (or change to) a directory (or any subdirectories) for backup data of the package.
+    Specifies or changes to a directory (or subdirectories) for storing backup data for the package.
 
-    :param sub_dir: [optional] name of a directory; names of directories (and/or a filename)
+    :param sub_dir: Name(s) of directories and/or a filename to navigate to or create.
     :type sub_dir: str
-    :param data_dir: name of a directory to store data, defaults to ``"data"``
+    :param data_dir: The base directory for storing data; defaults to ``"data"``.
     :type data_dir: str
-    :param mkdir: whether to create a directory, defaults to ``False``
+    :param mkdir: Whether to create the specified directory if it does not exist;
+        defaults to ``False``.
     :type mkdir: bool
-    :param kwargs: [optional] parameters (e.g. ``mode=0o777``) of `os.makedirs`_
-    :return: a full pathname of a directory or a file under the specified data directory ``data_dir``
+    :param kwargs: [Optional] Additional parameters for `os.makedirs()`_, such as ``mode=0o777``.
+    :return: The full path of the specified directory or file within ``data_dir``.
     :rtype: str
 
-    .. _`os.makedirs`: https://docs.python.org/3/library/os.html#os.makedirs
+    .. _`os.makedirs()`: https://docs.python.org/3/library/os.html#os.makedirs
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import cd_data
         >>> import os
-
         >>> path_to_dat_dir = cd_data(data_dir="data")
         >>> os.path.relpath(path_to_dat_dir)
         'pyrcs\\data'
@@ -404,28 +403,26 @@ def cd_data(*sub_dir, data_dir="data", mkdir=False, **kwargs):
 
 def init_data_dir(cls_instance, data_dir, category, cluster=None, **kwargs):
     """
-    Specify an initial data directory for (an instance of) a class for a data cluster.
+    Specifies the initial data directory for a class instance to manage a specific data cluster.
 
-    :param cls_instance: An instance of a class for a certain data cluster.
+    :param cls_instance: An instance of a class managing the data cluster.
     :type cls_instance: object
-    :param data_dir: The name of a folder where the pickle file is to be saved.
+    :param data_dir: The directory where the data (e.g. pickle file) will be saved.
     :type data_dir: str | None
-    :param category: The name of a data category, e.g. ``"line-data"``.
+    :param category: The name of the data category, e.g. ``"line-data"``.
     :type category: str
-    :param cluster: A replacement for ``cls.KEY``.
+    :param cluster: An optional replacement for ``cls_instance.KEY``.
     :type cluster: str | None
-    :param kwargs: [optional] parameters of the function :func:`~pyrcs.utils.cd_data`.
-    :return: Pathnames of a default data directory and a current data directory.
-    :rtype: tuple[str, os.PathLike[str]]
+    :param kwargs: [Optional] Additional parameters passed to :func:`~pyrcs.utils.cd_data`.
+    :return: A tuple containing the default data directory and the current data directory path.
+    :rtype: tuple[str, str]
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import init_data_dir
         >>> from pyrcs.line_data import Bridges
         >>> import os
-
         >>> bridges = Bridges()
-
         >>> dat_dir, current_dat_dir = init_data_dir(bridges, data_dir="data", category="line-data")
         >>> os.path.relpath(dat_dir)
         'data'
@@ -445,29 +442,27 @@ def init_data_dir(cls_instance, data_dir, category, cluster=None, **kwargs):
     return cls_instance.data_dir, cls_instance.current_data_dir
 
 
-def make_file_pathname(cls, data_name, ext=".pkl", data_dir=None):
+def make_file_pathname(cls_instance, data_name, ext=".pkl", data_dir=None):
     """
-    Make a pathname for saving data as a file of a certain format.
+    Generates a file pathname for saving data in a specified format.
 
-    :param cls: (An instance of) a class for a certain data cluster.
-    :type cls: object
-    :param data_name: The key to the dict-type data of a certain code cluster.
+    :param cls_instance: An instance of a class managing a specific data cluster.
+    :type cls_instance: object
+    :param data_name: The key identifying the data within a specific code cluster.
     :type data_name: str
-    :param ext: A file extension, defaults to ``".pkl"``.
+    :param ext: The file extension for the saved data; defaults to ``".pkl"``.
     :type ext: str
-    :param data_dir: The name of a folder where the data is saved, defaults to ``None``.
+    :param data_dir: The directory where the file will be saved; defaults to ``None``.
     :type data_dir: str | None
-    :return: A pathname for saving the data.
+    :return: The pathname for saving the data file.
     :rtype: str
 
-    **Example**::
+    **Examples**::
 
         >>> from pyrcs.utils import make_file_pathname
         >>> from pyrcs.line_data import Bridges
         >>> import os
-
         >>> bridges = Bridges()
-
         >>> example_pathname = make_file_pathname(bridges, data_name="example-data", ext=".pkl")
         >>> os.path.relpath(example_pathname)
         'pyrcs\\data\\line-data\\bridges\\example-data.pkl'
@@ -476,39 +471,37 @@ def make_file_pathname(cls, data_name, ext=".pkl", data_dir=None):
     filename = data_name.lower().replace(" ", "-") + ext
 
     if data_dir is not None:
-        cls.current_data_dir = validate_dir(path_to_dir=data_dir)
-        file_pathname = os.path.join(cls.current_data_dir, filename)
+        cls_instance.current_data_dir = validate_dir(path_to_dir=data_dir)
+        file_pathname = os.path.join(cls_instance.current_data_dir, filename)
 
     else:  # data_dir is None or data_dir == ""
-        # func = [x for x in dir(cls) if x.startswith('_cdd')][0]
-        file_pathname = getattr(cls, '_cdd')(filename)
+        # func = [x for x in dir(cls_instance) if x.startswith('_cdd')][0]
+        file_pathname = getattr(cls_instance, '_cdd')(filename)
 
     return file_pathname
 
 
 def fetch_location_names_errata(k=None, regex=False, as_dataframe=False, column_name=None):
     """
-    Create a dictionary for rectifying location names.
+    Fetches a dictionary or dataframe to rectify location names.
 
-    :param k: key of the created dictionary, defaults to ``None``
+    :param k: The key for the errata dictionary; defaults to ``None``.
     :type k: str | int | float | bool | None
-    :param regex: whether to create a dictionary for replacement based on regular expressions,
-        defaults to ``False``
+    :param regex: Whether to create the dictionary for replacements based on regular expressions;
+        defaults to ``False``.
     :type regex: bool
-    :param as_dataframe: whether to return the created dictionary as a pandas.DataFrame,
-        defaults to ``False``
+    :param as_dataframe: Whether to return the dictionary as a dataframe; defaults to ``False``.
     :type as_dataframe: bool
-    :param column_name: (if ``as_dataframe=True``) column name of the errata data as a dataframe
+    :param column_name: If ``as_dataframe=True``, the column name for the dataframe;
+        defaults to ``None``.
     :type column_name: str | list | None
-    :return: dictionary for rectifying location names
+    :return: A dictionary for rectifying location names, or a dataframe if requested.
     :rtype: dict | pandas.DataFrame
 
     **Examples**::
 
         >>> from pyrcs.utils import fetch_location_names_errata
-
         >>> repl_dict = fetch_location_names_errata()
-
         >>> type(repl_dict)
         dict
         >>> list(repl_dict.keys())[:5]
@@ -517,9 +510,7 @@ def fetch_location_names_errata(k=None, regex=False, as_dataframe=False, column_
          'ATLBRJN',
          'Aberdeen Craiginches',
          'Aberdeen Craiginches T.C.']
-
         >>> repl_dict = fetch_location_names_errata(regex=True, as_dataframe=True)
-
         >>> type(repl_dict)
         pandas.core.frame.DataFrame
         >>> repl_dict.head()
@@ -551,13 +542,13 @@ def fetch_location_names_errata(k=None, regex=False, as_dataframe=False, column_
 
 def _update_location_names_errata(new_items, regex, verbose=False):
     """
-    Update the location-names replacement dictionary in the package data.
+    Updates the location name replacement dictionary in the package data.
 
-    :param new_items: new items to replace
+    :param new_items: The new items to add or replace in the dictionary.
     :type new_items: dict
-    :param regex: whether this update is for regular-expression dictionary
+    :param regex: Whether this update applies to the regular expression dictionary.
     :type regex: bool
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print detailed information to the console; defaults to ``False``.
     :type verbose: bool | int
     """
 
@@ -577,23 +568,23 @@ def _update_location_names_errata(new_items, regex, verbose=False):
         save_data(location_name_repl_dict, path_to_json, verbose=verbose)
 
 
-def save_data_to_file(cls, data, data_name, ext, dump_dir=None, verbose=False, **kwargs):
+def save_data_to_file(cls_instance, data, data_name, ext, dump_dir=None, verbose=False, **kwargs):
     """
-    Save the collected data as a file, depending on the given parameters.
+    Saves collected data to a file based on the specified parameters.
 
-    :param cls: (an instance of) a class for a certain data cluster
-    :type cls: object
-    :param data: data collected for a certain cluster
+    :param cls_instance: An instance of a class managing a specific data cluster.
+    :type cls_instance: object
+    :param data: The data to be saved.
     :type data: pandas.DataFrame | list | dict
-    :param data_name: key to the dict-type data of a certain cluster
+    :param data_name: The key identifying the data within a specific cluster.
     :type data_name: str
-    :param ext: whether to save the data as a file, or file extension
-    :type ext: bool | str
-    :param dump_dir: pathname of a directory where the data file is to be dumped, defaults to ``None``
+    :param ext: The file extension or a boolean indicating whether to save the data.
+    :type ext: str | bool
+    :param dump_dir: The directory where the file should be saved; defaults to ``None``.
     :type dump_dir: str | None
-    :param verbose: whether to print relevant information in console, defaults to ``False``
+    :param verbose: Whether to print detailed information to the console; defaults to ``False``.
     :type verbose: bool | int
-    :param kwargs: [optional] parameters of the function `pyhelpers.store.save_data()`_
+    :param kwargs: [Optional] Additional parameters passed to `pyhelpers.store.save_data()`_.
 
     .. _`pyhelpers.store.save_data()`:
         https://pyhelpers.readthedocs.io/en/latest/_generated/pyhelpers.store.save_data.html
@@ -607,7 +598,8 @@ def save_data_to_file(cls, data, data_name, ext, dump_dir=None, verbose=False, *
         else:
             file_ext = ".pkl"
 
-        path_to_file = make_file_pathname(cls=cls, data_name=data_name, ext=file_ext, data_dir=dump_dir)
+        path_to_file = make_file_pathname(
+            cls_instance=cls_instance, data_name=data_name, ext=file_ext, data_dir=dump_dir)
 
         kwargs.update({'data': data, 'path_to_file': path_to_file, 'verbose': verbose})
         save_data(**kwargs)
@@ -616,38 +608,38 @@ def save_data_to_file(cls, data, data_name, ext, dump_dir=None, verbose=False, *
         print_void_msg(data_name=data_name, verbose=verbose)
 
 
-def fetch_data_from_file(cls, method, data_name, ext, update, dump_dir, verbose, data_dir=None,
-                         save_data_kwargs=None, **kwargs):
+def fetch_data_from_file(cls_instance, method, data_name, ext, update, dump_dir, verbose,
+                         data_dir=None, save_data_kwargs=None, **kwargs):
     """
-    Fetch/load desired data from a backup file, depending on the given parameters.
+    Fetches or loads data from a backup file based on the specified parameters.
 
-    :param cls: (an instance of) a class for a certain data cluster
-    :type cls: object
-    :param method: name of a method of the ``cls``, which is used for collecting the data
+    :param cls_instance: An instance of a class managing a specific data cluster.
+    :type cls_instance: object
+    :param method: The name of the method in ``cls_instance`` used to collect the data.
     :type method: str
-    :param data_name: key to the dict-type data of a certain cluster
+    :param data_name: The key identifying the data within a specific cluster.
     :type data_name: str
-    :param ext: whether to save the data as a file, or file extension
+    :param ext: The file extension or a boolean indicating whether to save the data.
     :type ext: bool | str
-    :param update: whether to do an update check (for the package data), defaults to ``False``
+    :param update: Whether to perform an update check on the package data; defaults to ``False``.
     :type update: bool
-    :param dump_dir: pathname of a directory where the data file is to be dumped, defaults to ``None``
-    :type dump_dir: str | os.PathLike[str] | None
-    :param verbose: whether to print relevant information in console
+    :param dump_dir: The directory where the file is stored; defaults to ``None``.
+    :type dump_dir: str | pathlib.Path | None
+    :param verbose: Whether to print detailed information to the console.
     :type verbose: bool | int
-    :param data_dir: pathname of a directory where the data is fetched, defaults to ``None``
+    :param data_dir: The directory where the data is fetched from; defaults to ``None``.
     :type data_dir: str | os.PathLike[str] | None
-    :param save_data_kwargs: equivalent of ``kwargs`` used by the function
-        :func:`pyrcs.utils.save_data_to_file`, defaults to ``None``
+    :param save_data_kwargs: Additional parameters for :func:`pyrcs.utils.save_data_to_file`;
+        defaults to ``None``.
     :type save_data_kwargs: dict | None
-    :param kwargs: [optional] parameters of the ``cls``.``method`` being called
-    :type kwargs: typing.Any
-    :return: data fetched for the desired cluster
+    :param kwargs: [Optional] Additional parameters for the ``cls_instance.method`` being called.
+    :return: The fetched data for the specified cluster.
     :rtype: dict | None
     """
 
     try:
-        path_to_file = make_file_pathname(cls=cls, data_name=data_name, ext=ext, data_dir=data_dir)
+        path_to_file = make_file_pathname(
+            cls_instance=cls_instance, data_name=data_name, ext=ext, data_dir=data_dir)
         if os.path.isfile(path_to_file) and not update:
             data = load_data(path_to_file)
 
@@ -655,15 +647,15 @@ def fetch_data_from_file(cls, method, data_name, ext, update, dump_dir, verbose,
             verbose_ = collect_in_fetch_verbose(data_dir=dump_dir, verbose=verbose)
 
             kwargs.update({'confirmation_required': False, 'verbose': verbose_})
-            data = getattr(cls, method)(**kwargs)
+            data = getattr(cls_instance, method)(**kwargs)
 
         if dump_dir is not None:
             if save_data_kwargs is None:
                 save_data_kwargs = {}
 
             save_data_to_file(
-                cls=cls, data=data, data_name=data_name, ext=ext, dump_dir=dump_dir, verbose=verbose,
-                **save_data_kwargs)
+                cls_instance=cls_instance, data=data, data_name=data_name, ext=ext,
+                dump_dir=dump_dir, verbose=verbose, **save_data_kwargs)
 
     except Exception as e:
         if verbose:
diff --git a/requirements.txt b/requirements.txt
index 8825296..d510323 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,16 +1,18 @@
-build==1.2.2
+build==1.2.2.post1
 fqdn==1.5.1
+furo==2024.8.6
 importlib-resources==6.4.0
 isoduration==20.11.0
-jaraco.text==3.12.1
-jsonpointer==2.4
+jaraco.collections==5.1.0
+jsonpointer==3.0.0
 notebook==7.2.2
 pip-chill==1.0.3
 pyhelpers==2.0.0
 pytest-cov==5.0.0
 sphinx-copybutton==0.5.2
-sphinx-rtd-theme==2.0.0
+sphinx-new-tab-link==0.6.1
+sphinx-toggleprompt==0.5.2
 tomli==2.0.1
 twine==5.1.1
 uri-template==1.3.0
-webcolors==1.13
+webcolors==24.8.0


Test patch:
diff --git a/tests/test_utils.py b/tests/test_utils.py
index d13f7be..b35c067 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -130,7 +130,8 @@ def test_fetch_data_from_file(capfd):
     from pyrcs.utils import fetch_data_from_file
 
     data = fetch_data_from_file(
-        cls=None, method=None, data_name=None, ext=None, update=None, dump_dir=None, verbose=True)
+        cls_instance=None, method=None, data_name=None, ext=None, update=None, dump_dir=None,
+        verbose=True)
     out, _ = capfd.readouterr()
     assert out == "Some errors occurred when fetching the data. " \
                   "'NoneType' object has no attribute 'lower'.\n"