Repository: Urban-Analytics-Technology-Platform/poppusher (language: python)

Issue:
Cannot use latest version of lxml (v5.3.0)
# How to reproduce

```bash
git clone ....
cd poppusher
pip install -e ".[dev]"
pytest # works
pip install --upgrade lxml. # upgrades to v5.3.0
pytest # fails
pytest -k test_retrieve_table_description # fails
```

# Expected behaviour

The tests should pass.

# Actual behaviour

This error message is produced:
```
DeprecationWarning: The 'strip_cdata' option of HTMLParser() has never done anything and will eventually be removed.
```





Discussion / hints:

Fix patch:
diff --git a/.copier-answers.yml b/.copier-answers.yml
index 41772d4..c03c8a4 100644
--- a/.copier-answers.yml
+++ b/.copier-answers.yml
@@ -6,7 +6,7 @@ email: andrewphilipsmith@users.noreply.github.com
 full_name: Andy Smith
 license: Apache
 org: Urban-Analytics-Technology-Platform
-project_name: popgetter
+project_name: poppusher
 project_short_description:
   A convenience tool for downloading census data from different countries
-url: https://github.com/Urban-Analytics-Technology-Platform/popgetter
+url: https://github.com/Urban-Analytics-Technology-Platform/poppusher
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 16cec2f..8a9afdf 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -71,7 +71,7 @@ pytest
 Use pytest-cov to generate coverage reports:
 
 ```bash
-pytest --cov=popgetter
+pytest --cov=poppusher
 ```
 
 # Building docs
diff --git a/.gitignore b/.gitignore
index 463ec92..013cc85 100644
--- a/.gitignore
+++ b/.gitignore
@@ -169,3 +169,4 @@ python/popgetter/assets/uk_venv/
 
 *.so
 *.xlsx
+/python/poppusher/staging_dir
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e7278ae..9ed50b3 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -4,9 +4,9 @@ ci:
 
 # Exclude files:
 # - `previous_code` permanently exclude the old code
-# - `popgetter` temporarily exclude the bulk of the code until we are satisfied that all of the repo checks are working correctly
-# exclude: "(previous_code|popgetter)"
-exclude: "(previous_code|python/popgetter/assets/(uk/legacy|us)|tests/demo_data)"
+# - `poppusher` temporarily exclude the bulk of the code until we are satisfied that all of the repo checks are working correctly
+# exclude: "(previous_code|poppusher)"
+exclude: "(previous_code|python/poppusher/assets/(uk/legacy|us)|tests/demo_data)"
 
 repos:
   - repo: https://github.com/psf/black-pre-commit-mirror
@@ -99,4 +99,4 @@ repos:
         entry: pyright
         types: [python]
         exclude: (.pre-commit-config.yaml|noxfile.py|tests)
-        # args: ["--ignoreexternal", "--verifytypes", "popgetter"]
+        # args: ["--ignoreexternal", "--verifytypes", "poppusher"]
diff --git a/README.md b/README.md
index 6968891..1739589 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# popgetter
+# poppusher
 
 [![Actions Status][actions-badge]][actions-link]
 [![Documentation Status][rtd-badge]][rtd-link]
@@ -12,19 +12,19 @@
 <!-- SPHINX-START -->
 
 <!-- prettier-ignore-start -->
-[actions-badge]:            https://github.com/Urban-Analytics-Technology-Platform/popgetter/workflows/CI/badge.svg
-[actions-link]:             https://github.com/Urban-Analytics-Technology-Platform/popgetter/actions
-[conda-badge]:              https://img.shields.io/conda/vn/conda-forge/popgetter
-[conda-link]:               https://github.com/conda-forge/popgetter-feedstock
+[actions-badge]:            https://github.com/Urban-Analytics-Technology-Platform/poppusher/workflows/CI/badge.svg
+[actions-link]:             https://github.com/Urban-Analytics-Technology-Platform/poppusher/actions
+[conda-badge]:              https://img.shields.io/conda/vn/conda-forge/poppusher
+[conda-link]:               https://github.com/conda-forge/poppusher-feedstock
 [github-discussions-badge]: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github
-[github-discussions-link]:  https://github.com/Urban-Analytics-Technology-Platform/popgetter/discussions
+[github-discussions-link]:  https://github.com/Urban-Analytics-Technology-Platform/poppusher/discussions
 [github-issues-badge]: https://img.shields.io/static/v1?label=GitHub&message=Issues&color=blue&logo=github
-[github-issues-link]:  https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues
-[pypi-link]:                https://pypi.org/project/popgetter/
-[pypi-platforms]:           https://img.shields.io/pypi/pyversions/popgetter
-[pypi-version]:             https://img.shields.io/pypi/v/popgetter
-[rtd-badge]:                https://readthedocs.org/projects/popgetter/badge/?version=latest
-[rtd-link]:                 https://popgetter.readthedocs.io/en/latest/?badge=latest
+[github-issues-link]:  https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues
+[pypi-link]:                https://pypi.org/project/poppusher/
+[pypi-platforms]:           https://img.shields.io/pypi/pyversions/poppusher
+[pypi-version]:             https://img.shields.io/pypi/v/poppusher
+[rtd-badge]:                https://readthedocs.org/projects/poppusher/badge/?version=latest
+[rtd-link]:                 https://poppusher.readthedocs.io/en/latest/?badge=latest
 
 <!-- prettier-ignore-end -->
 
@@ -69,15 +69,15 @@ the repo and then install using pip, with the `--editable` option:
    `pyenv` is the most tested with popgetter). eg:
 
 ```bash
-python  -m venv popgetter_venv    # create a virtual environment called `popgetter_venv`
-source popgetter_venv/bin/activate  # activate the virtual environment
+python  -m venv poppusher_venv    # create a virtual environment called `poppusher_venv`
+source poppusher_venv/bin/activate  # activate the virtual environment
 ```
 
 2. Clone the repo and then do an 'editable' install:
 
 ```bash
-git clone https://github.com/Urban-Analytics-Technology-Platform/popgetter.git
-cd popgetter
+git clone https://github.com/Urban-Analytics-Technology-Platform/poppusher.git
+cd poppusher
 pip install -e ".[dev]"
 ```
 
@@ -91,8 +91,8 @@ Open http://localhost:3000 with your browser to see the project.
 
 ## Development
 
-You can start writing assets in `popgetter/assets/` directory. New assets and
-jobs will need to be added to the `popgetter/__init__.py` file.
+You can start writing assets in `poppusher/assets/` directory. New assets and
+jobs will need to be added to the `poppusher/__init__.py` file.
 
 ### Adding new Python dependencies
 
@@ -100,7 +100,7 @@ You can specify new Python dependencies in `pyproject.toml`.
 
 ### Unit testing
 
-Tests are in the `popgetter_tests` directory and you can run tests using
+Tests are in the `poppusher_tests` directory and you can run tests using
 `pytest`:
 
 ```bash
diff --git a/cli_usage.md b/cli_usage.md
index 3932db4..419d429 100644
--- a/cli_usage.md
+++ b/cli_usage.md
@@ -1,4 +1,4 @@
-# popgetter CLI
+# poppusher CLI
 
 For countries which have been ported to Dagster, the downloads can be invoked
 via the [Dagster CLI](https://docs.dagster.io/_apidocs/cli).
@@ -9,7 +9,7 @@ Typically there is a single job per country. For Belgium, the job is called
 `job_be`:
 
 ```bash
-DAGSTER_HOME=$PWD/persist dagster job execute -m popgetter --job job_be
+DAGSTER_HOME=$PWD/persist dagster job execute -m poppusher --job job_be
 ```
 
 ### Run a single asset
@@ -19,7 +19,7 @@ single asset (and any required dependencies). The command gets the number of
 cars per census sector in Belgium.
 
 ```bash
-DAGSTER_HOME=$PWD/persist dagster asset materialize -m popgetter --select be/get_car_per_sector
+DAGSTER_HOME=$PWD/persist dagster asset materialize -m poppusher --select be/get_car_per_sector
 ```
 
 (Typically we organise assets with the country code as a prefix, to ensure that
@@ -31,5 +31,5 @@ asset names are unique).
 shell.)
 
 ```bash
-DAGSTER_HOME=$PWD/persist dagster asset materialize -m popgetter --select "*"
+DAGSTER_HOME=$PWD/persist dagster asset materialize -m poppusher --select "*"
 ```
diff --git a/mkdocs.yml b/mkdocs.yml
index 789e24a..f0d78aa 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,1 +1,1 @@
-site_name: Popgetter
+site_name: Poppusher
diff --git a/notebooks/explore.ipynb b/notebooks/explore.ipynb
index aac160f..33c43b3 100644
--- a/notebooks/explore.ipynb
+++ b/notebooks/explore.ipynb
@@ -2,11 +2,11 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
-    "import popgetter\n",
+    "import poppusher\n",
     "from icecream import ic\n",
     "import pandas as pd\n",
     "import re"
@@ -18,7 +18,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "catalog: pd.DataFrame = popgetter.defs.load_asset_value([\"be\", \"catalog_as_dataframe\"])\n",
+    "catalog: pd.DataFrame = poppusher.defs.load_asset_value([\"be\", \"catalog_as_dataframe\"])\n",
     "\n",
     "geo_cat = catalog[\n",
     "    catalog[\"source_format\"].str.contains(\n",
@@ -44,35 +44,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "2024-07-04 11:42:45 +0100 - dagster - DEBUG - system - Loading file from: /Users/a.smith/code/urbananalytics/popgetter/persist/storage/gbr/catalog using PickledObjectFilesystemIOManager...\n",
-      "ic| source_download_url: array(['https://www.nomisweb.co.uk/output/census/2021/census2021-ts001.zip'],\n",
-      "                               dtype=object)\n",
-      "ic| source_archive_file_path: 'census2021-ts001-oa.csv'\n",
-      "ic| source_download_url: array(['https://www.nomisweb.co.uk/output/census/2021/census2021-ts001.zip'],\n",
-      "                               dtype=object)\n",
-      "ic| source_archive_file_path: 'census2021-ts001-oa.csv'\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "'census2021-ts001-oa.csv'"
-      ]
-     },
-     "execution_count": 32,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "catalog: pd.DataFrame = popgetter.defs.load_asset_value([\"gbr\", \"catalog\"])\n",
+    "catalog: pd.DataFrame = poppusher.defs.load_asset_value([\"gbr\", \"catalog\"])\n",
     "\n",
     "# catalog.head(1).T\n",
     "\n",
@@ -97,7 +73,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "geometry = popgetter.defs.load_asset_value(\n",
+    "geometry = poppusher.defs.load_asset_value(\n",
     "    [\"be\", \"individual_census_table\"], partition_key=\"https://statbel.fgov.be/node/4726\"\n",
     ")\n",
     "# Statistical sectors 2023\n",
@@ -127,49 +103,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "ic| df.shape: (331, 312)\n",
-      "ic| list(range(5, 17)): [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]\n",
-      "ic| columns_to_sum: ['Sex: All persons; Age: Aged 5 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 6 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 7 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 8 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 9 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 10 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 11 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 12 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 13 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 14 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 15 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 16 years; measures: Value',\n",
-      "                     'Sex: All persons; Age: Aged 17 years; measures: Value']\n",
-      "ic| new_table.shape: (331, 4)\n",
-      "ic| new_table.head():    date             geography geography code  new_col\n",
-      "                      0  2021            Hartlepool      E06000001    14847\n",
-      "                      1  2021         Middlesbrough      E06000002    24540\n",
-      "                      2  2021  Redcar and Cleveland      E06000003    20440\n",
-      "                      3  2021      Stockton-on-Tees      E06000004    32528\n",
-      "                      4  2021            Darlington      E06000005    16739\n",
-      "ic| new_table.columns: Index(['date', 'geography', 'geography code', 'new_col'], dtype='object')\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "Index(['date', 'geography', 'geography code', 'new_col'], dtype='object')"
-      ]
-     },
-     "execution_count": 24,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Test aggregation of census2021-ts009-ltla\n",
     "\n",
@@ -225,27 +161,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "ic| l: ['z', 'a', 'b', 'c']\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "['z', 'a', 'b', 'c']"
-      ]
-     },
-     "execution_count": 25,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "d = {\"a\": 1, \"b\": 2, \"c\": 3}\n",
     "\n",
@@ -255,19 +173,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 53,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "abc\n",
-      "defghi\n",
-      "jklmnopqrstuvwxyz\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Understanding partials\n",
     "\n",
@@ -320,129 +228,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 61,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "2024-07-04 20:31:03 +0100 - dagster - DEBUG - system - Loading file from: /Users/a.smith/code/urbananalytics/popgetter/persist/storage/gbr/census_tables/ltla/TS009 using PickledObjectFilesystemIOManager...\n",
-      "ic| type(derived): <class 'pandas.core.frame.DataFrame'>\n",
-      "ic| derived.head(1).T:                                                              0\n",
-      "                       date                                                      2021\n",
-      "                       geography                                           Hartlepool\n",
-      "                       geography code                                       E06000001\n",
-      "                       Sex: All persons; Age: Total; measures: Value            92347\n",
-      "                       Sex: All persons; Age: Aged 4 years and under; ...        4981\n",
-      "                       ...                                                        ...\n",
-      "                       Sex: Male; Age: Aged 86 years; measures: Value             122\n",
-      "                       Sex: Male; Age: Aged 87 years; measures: Value             122\n",
-      "                       Sex: Male; Age: Aged 88 years; measures: Value             101\n",
-      "                       Sex: Male; Age: Aged 89 years; measures: Value              81\n",
-      "                       Sex: Male; Age: Aged 90 years and over; measure...         217\n",
-      "                       \n",
-      "                       [312 rows x 1 columns]\n"
-     ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>0</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>date</th>\n",
-       "      <td>2021</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>geography</th>\n",
-       "      <td>Hartlepool</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>geography code</th>\n",
-       "      <td>E06000001</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: All persons; Age: Total; measures: Value</th>\n",
-       "      <td>92347</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: All persons; Age: Aged 4 years and under; measures: Value</th>\n",
-       "      <td>4981</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>...</th>\n",
-       "      <td>...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: Male; Age: Aged 86 years; measures: Value</th>\n",
-       "      <td>122</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: Male; Age: Aged 87 years; measures: Value</th>\n",
-       "      <td>122</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: Male; Age: Aged 88 years; measures: Value</th>\n",
-       "      <td>101</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: Male; Age: Aged 89 years; measures: Value</th>\n",
-       "      <td>81</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>Sex: Male; Age: Aged 90 years and over; measures: Value</th>\n",
-       "      <td>217</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>312 rows × 1 columns</p>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "                                                             0\n",
-       "date                                                      2021\n",
-       "geography                                           Hartlepool\n",
-       "geography code                                       E06000001\n",
-       "Sex: All persons; Age: Total; measures: Value            92347\n",
-       "Sex: All persons; Age: Aged 4 years and under; ...        4981\n",
-       "...                                                        ...\n",
-       "Sex: Male; Age: Aged 86 years; measures: Value             122\n",
-       "Sex: Male; Age: Aged 87 years; measures: Value             122\n",
-       "Sex: Male; Age: Aged 88 years; measures: Value             101\n",
-       "Sex: Male; Age: Aged 89 years; measures: Value              81\n",
-       "Sex: Male; Age: Aged 90 years and over; measure...         217\n",
-       "\n",
-       "[312 rows x 1 columns]"
-      ]
-     },
-     "execution_count": 61,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "derived = popgetter.defs.load_asset_value(\n",
+    "derived = poppusher.defs.load_asset_value(\n",
     "    [\"gbr\", \"census_tables\"], partition_key=\"ltla/TS009\"\n",
     ")\n",
     "\n",
@@ -455,7 +245,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "popget-dev",
+   "display_name": "popgetter-3.12",
    "language": "python",
    "name": "python3"
   },
diff --git a/noxfile.py b/noxfile.py
index 81a50f1..0bd5cd9 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -33,7 +33,7 @@ def pylint(session: nox.Session) -> None:
     # This needs to be installed into the package environment, and is slower
     # than a pre-commit check
     session.install(".", "pylint")
-    session.run("pylint", "popgetter", *session.posargs)
+    session.run("pylint", "poppusher", *session.posargs)
 
 
 @nox.session(python="3.11", reuse_venv=True)
@@ -45,7 +45,7 @@ def pyright(session: nox.Session) -> None:
     # than a pre-commit check
     session.install(".", "pyright")
     session.run(
-        "pyright", "--ignoreexternal", "--verifytypes", "popgetter", *session.posargs
+        "pyright", "--ignoreexternal", "--verifytypes", "poppusher", *session.posargs
     )
 
 
@@ -115,7 +115,7 @@ def build_api_docs(session: nox.Session) -> None:
         "--module-first",
         "--no-toc",
         "--force",
-        "../src/popgetter",
+        "../src/poppusher",
     )
 
 
diff --git a/pyproject.toml b/pyproject.toml
index 3f66e27..a42022e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "maturin"
 
 
 [project]
-name = "popgetter"
+name = "poppusher"
 version = "0.1.0"
 authors = [
   { name = "Andy Smith", email = "andrewphilipsmith@users.noreply.github.com" },
@@ -35,10 +35,10 @@ dependencies = [
   "dagster >=1.6.11,<1.7.0", # Version matched to `dagster-cloud` and `dagster-webserver` (see below)
   "dagster-cloud >=1.6.11,<1.7.0", # Version matched to dagster (see above)
   "dagster-azure >=0.22.11",  # Only required for production deployments, could be moved to an optional
-  "pandas >=2.1,<2.2", # Pinned to 2.1 as 2.2 might be causing the failure here https://github.com/Urban-Analytics-Technology-Platform/popgetter/actions/runs/7593850248/job/20684737578
+  "pandas >=2.1,<2.2", # Pinned to 2.1 as 2.2 might be causing the failure here https://github.com/Urban-Analytics-Technology-Platform/poppusher/actions/runs/7593850248/job/20684737578
   "geopandas >=0.14.1,<1", # Compatibility with 1.0 to be determined
-  "docker",  # Use and version to be confirmed, see https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues/38#issuecomment-2009350512
-  "lxml >=4.9.3",  # Used by `download_from_wfs` function
+  "docker",  # Use and version to be confirmed, see https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues/38#issuecomment-2009350512
+  "lxml >=4.9.3,<5.1.1",  # Used by `download_from_wfs` function
   "pyarrow", # Used interface with polars-arrow
   "fsspec",  # Used in legacy `get_path_to_cache` function (pending removal)
   "aiohttp", # Used by `fsspec` in legacy `get_path_to_cache` function (pending removal)
@@ -80,17 +80,17 @@ docs = [
 ]
 
 [project.urls]
-Homepage = "https://github.com/Urban-Analytics-Technology-Platform/popgetter"
-"Bug Tracker" = "https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues"
-Discussions = "https://github.com/Urban-Analytics-Technology-Platform/popgetter/discussions"
-Changelog = "https://github.com/Urban-Analytics-Technology-Platform/popgetter/releases"
+Homepage = "https://github.com/Urban-Analytics-Technology-Platform/poppusher"
+"Bug Tracker" = "https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues"
+Discussions = "https://github.com/Urban-Analytics-Technology-Platform/poppusher/discussions"
+Changelog = "https://github.com/Urban-Analytics-Technology-Platform/poppusher/releases"
 
 [project.scripts]
-popgetter-export-schema = "popgetter.metadata:export_schema"
+poppusher-export-schema = "poppusher.metadata:export_schema"
 
 [tool.maturin]
-module-name = "popgetter._core"
-python-packages = ["popgetter"]
+module-name = "poppusher._core"
+python-packages = ["poppusher"]
 python-source = "python"
 # sdist-generator = "git"  # default is cargo
 
@@ -115,11 +115,11 @@ filterwarnings = [
 log_cli_level = "INFO"
 testpaths = [
   "tests",
-  "popgetter_tests"
+  "poppusher_tests"
 ]
 
 [tool.coverage]
-run.source = ["popgetter"]
+run.source = ["poppusher"]
 port.exclude_lines = [
   'pragma: no cover',
   '\.\.\.',
@@ -128,20 +128,20 @@ port.exclude_lines = [
 
 [tool.pyright]
 include = [
-  "python/popgetter/utils.py",
-  "python/popgetter/assets/uk/__init__.py",
-  "python/popgetter/assets/be/",
+  "python/poppusher/utils.py",
+  "python/poppusher/assets/uk/__init__.py",
+  "python/poppusher/assets/be/",
   # "python/**/*.py",
   # "tests/**/*.py",
 ]
 exclude = [
-  "python/popgetter/assets/uk/legacy",
-  "python/popgetter/assets/uk_venv",
+  "python/poppusher/assets/uk/legacy",
+  "python/poppusher/assets/uk_venv",
 ]
 ignore = [
   "previous_code",
-  "python/popgetter/assets/uk_venv/",
-  "python/popgetter/assets/uk/legacy/*.py",
+  "python/poppusher/assets/uk_venv/",
+  "python/poppusher/assets/uk/legacy/*.py",
 ]
 defineConstant = { DEBUG = true }
 stubPath = "src/stubs"
@@ -184,7 +184,7 @@ ignore = [
 ]
 isort.required-imports = ["from __future__ import annotations"]
 # Uncomment if using a _compat.typing backport
-# typing-modules = ["popgetter._compat.typing"]
+# typing-modules = ["poppusher._compat.typing"]
 
 [tool.ruff.lint.per-file-ignores]
 "tests/**" = ["T20"]
@@ -194,7 +194,7 @@ isort.required-imports = ["from __future__ import annotations"]
 [tool.pylint]
 py-version = "3.11"
 ignore-paths = [".*/_version.py"]
-extension-pkg-allow-list = ["popgetter._core"]
+extension-pkg-allow-list = ["poppusher._core"]
 reports.output-format = "colorized"
 similarities.ignore-imports = "yes"
 messages_control.disable = [
@@ -207,7 +207,7 @@ messages_control.disable = [
 
 
 [tool.dagster]
-module_name = "popgetter"
+module_name = "poppusher"
 
 
 [tool.codespell]
diff --git a/python/popgetter/__init__.py b/python/poppusher/__init__.py
similarity index 94%
rename from python/popgetter/__init__.py
rename to python/poppusher/__init__.py
index e769339..16842ee 100644
--- a/python/popgetter/__init__.py
+++ b/python/poppusher/__init__.py
@@ -12,7 +12,7 @@
 if "IGNORE_EXPERIMENTAL_WARNINGS" in os.environ:
     warnings.filterwarnings("ignore", category=ExperimentalWarning)
 
-from popgetter.io_managers.azure import (
+from poppusher.io_managers.azure import (
     AzureGeneralIOManager,
     AzureGeoIOManager,
     AzureMetadataIOManager,
@@ -20,14 +20,14 @@
     AzureMetricsMetadataIOManager,
     AzureMetricsPartitionedIOManager,
 )
-from popgetter.io_managers.local import (
+from poppusher.io_managers.local import (
     LocalGeoIOManager,
     LocalMetadataIOManager,
     LocalMetricsIOManager,
     LocalMetricsMetadataIOManager,
     LocalMetricsPartitionedIOManager,
 )
-from popgetter.utils import StagingDirResource
+from poppusher.utils import StagingDirResource
 
 __version__ = "0.1.0"
 
@@ -53,8 +53,8 @@
     UnresolvedAssetJobDefinition,
 )
 
-from popgetter import azure_test, cloud_outputs
-from popgetter.assets import countries
+from poppusher import azure_test, cloud_outputs
+from poppusher.assets import countries
 
 PROD = os.getenv("ENV") == "prod"
 
diff --git a/python/popgetter/_core.pyi b/python/poppusher/_core.pyi
similarity index 100%
rename from python/popgetter/_core.pyi
rename to python/poppusher/_core.pyi
diff --git a/python/popgetter/assets/__init__.py b/python/poppusher/assets/__init__.py
similarity index 100%
rename from python/popgetter/assets/__init__.py
rename to python/poppusher/assets/__init__.py
diff --git a/python/popgetter/assets/bel/__init__.py b/python/poppusher/assets/bel/__init__.py
similarity index 98%
rename from python/popgetter/assets/bel/__init__.py
rename to python/poppusher/assets/bel/__init__.py
index 34f026c..3d27dd5 100644
--- a/python/popgetter/assets/bel/__init__.py
+++ b/python/poppusher/assets/bel/__init__.py
@@ -11,7 +11,7 @@
 from rdflib import Graph, URIRef
 from rdflib.namespace import DCAT, DCTERMS
 
-from popgetter.assets.bel.utils import (
+from poppusher.assets.bel.utils import (
     DOWNLOAD_HANDLERS,
     check_not_str,
     check_str,
@@ -22,13 +22,13 @@
     nationality_to_string,
     no_op_format_handler,
 )
-from popgetter.assets.country import Country
-from popgetter.cloud_outputs import (
+from poppusher.assets.country import Country
+from poppusher.cloud_outputs import (
     GeometryOutput,
     MetricsOutput,
     send_to_geometry_sensor,
 )
-from popgetter.metadata import (
+from poppusher.metadata import (
     COL,
     CountryMetadata,
     DataPublisher,
@@ -37,7 +37,7 @@
     SourceDataRelease,
     metadata_to_dataframe,
 )
-from popgetter.utils import add_metadata, markdown_from_plot
+from poppusher.utils import add_metadata, markdown_from_plot
 
 KNOWN_FAILING_DATASETS = {
     # sqlite compressed as tar.gz
diff --git a/python/popgetter/assets/bel/utils.py b/python/poppusher/assets/bel/utils.py
similarity index 99%
rename from python/popgetter/assets/bel/utils.py
rename to python/poppusher/assets/bel/utils.py
index 1571884..dc78530 100644
--- a/python/popgetter/assets/bel/utils.py
+++ b/python/poppusher/assets/bel/utils.py
@@ -16,7 +16,7 @@
 from rdflib import Graph, URIRef
 from rdflib.namespace import DCAT, DCTERMS, SKOS
 
-from popgetter.utils import extract_main_file_from_zip, markdown_from_plot
+from poppusher.utils import extract_main_file_from_zip, markdown_from_plot
 
 ## Functions to process catalog
 
diff --git a/python/popgetter/assets/country.py b/python/poppusher/assets/country.py
similarity index 99%
rename from python/popgetter/assets/country.py
rename to python/poppusher/assets/country.py
index 4349c97..94f557c 100644
--- a/python/popgetter/assets/country.py
+++ b/python/poppusher/assets/country.py
@@ -11,14 +11,14 @@
     asset,
 )
 
-from popgetter.cloud_outputs import (
+from poppusher.cloud_outputs import (
     GeometryOutput,
     MetricsOutput,
     send_to_geometry_sensor,
     send_to_metadata_sensor,
     send_to_metrics_sensor,
 )
-from popgetter.metadata import (
+from poppusher.metadata import (
     CountryMetadata,
     DataPublisher,
     MetricMetadata,
diff --git a/python/popgetter/assets/gb_eaw/__init__.py b/python/poppusher/assets/gb_eaw/__init__.py
similarity index 100%
rename from python/popgetter/assets/gb_eaw/__init__.py
rename to python/poppusher/assets/gb_eaw/__init__.py
diff --git a/python/popgetter/assets/gb_eaw/england_wales_census.py b/python/poppusher/assets/gb_eaw/england_wales_census.py
similarity index 99%
rename from python/popgetter/assets/gb_eaw/england_wales_census.py
rename to python/poppusher/assets/gb_eaw/england_wales_census.py
index 644815a..f839dc1 100644
--- a/python/popgetter/assets/gb_eaw/england_wales_census.py
+++ b/python/poppusher/assets/gb_eaw/england_wales_census.py
@@ -21,9 +21,9 @@
 from icecream import ic
 from pandas import DataFrame
 
-from popgetter.assets.country import Country
-from popgetter.cloud_outputs import GeometryOutput, MetricsOutput
-from popgetter.metadata import (
+from poppusher.assets.country import Country
+from poppusher.cloud_outputs import GeometryOutput, MetricsOutput
+from poppusher.metadata import (
     COL,
     CountryMetadata,
     DataPublisher,
@@ -32,7 +32,7 @@
     SourceDataRelease,
     metadata_to_dataframe,
 )
-from popgetter.utils import (
+from poppusher.utils import (
     SourceDataAssumptionsOutdated,
     add_metadata,
     extract_main_file_from_zip,
diff --git a/python/popgetter/assets/gb_nir/README.md b/python/poppusher/assets/gb_nir/README.md
similarity index 100%
rename from python/popgetter/assets/gb_nir/README.md
rename to python/poppusher/assets/gb_nir/README.md
diff --git a/python/popgetter/assets/gb_nir/__init__.py b/python/poppusher/assets/gb_nir/__init__.py
similarity index 99%
rename from python/popgetter/assets/gb_nir/__init__.py
rename to python/poppusher/assets/gb_nir/__init__.py
index 41e798e..5a9aeba 100644
--- a/python/popgetter/assets/gb_nir/__init__.py
+++ b/python/poppusher/assets/gb_nir/__init__.py
@@ -19,9 +19,9 @@
 )
 from icecream import ic
 
-from popgetter.assets.country import Country
-from popgetter.cloud_outputs import GeometryOutput, MetricsOutput
-from popgetter.metadata import (
+from poppusher.assets.country import Country
+from poppusher.cloud_outputs import GeometryOutput, MetricsOutput
+from poppusher.metadata import (
     COL,
     CountryMetadata,
     DataPublisher,
@@ -30,7 +30,7 @@
     SourceDataRelease,
     metadata_to_dataframe,
 )
-from popgetter.utils import add_metadata, markdown_from_plot
+from poppusher.utils import add_metadata, markdown_from_plot
 
 
 @dataclass
diff --git a/python/popgetter/assets/gb_sct/__init__.py b/python/poppusher/assets/gb_sct/__init__.py
similarity index 99%
rename from python/popgetter/assets/gb_sct/__init__.py
rename to python/poppusher/assets/gb_sct/__init__.py
index f23d701..114cd5d 100755
--- a/python/popgetter/assets/gb_sct/__init__.py
+++ b/python/poppusher/assets/gb_sct/__init__.py
@@ -18,14 +18,14 @@
 )
 from icecream import ic
 
-from popgetter.assets.country import Country
-from popgetter.assets.gb_sct.utils import HEADERS, download_file
-from popgetter.cloud_outputs import (
+from poppusher.assets.country import Country
+from poppusher.assets.gb_sct.utils import HEADERS, download_file
+from poppusher.cloud_outputs import (
     GeometryOutput,
     MetricsOutput,
     send_to_geometry_sensor,
 )
-from popgetter.metadata import (
+from poppusher.metadata import (
     COL,
     CountryMetadata,
     DataPublisher,
@@ -34,7 +34,7 @@
     SourceDataRelease,
     metadata_to_dataframe,
 )
-from popgetter.utils import add_metadata, markdown_from_plot
+from poppusher.utils import add_metadata, markdown_from_plot
 
 # Currently including only releases matching tables included
 GENERAL_METHODS_URL = "https://www.scotlandscensus.gov.uk/media/jx2lz54n/scotland-s_census_2011_general_report.pdf"
diff --git a/python/popgetter/assets/gb_sct/utils.py b/python/poppusher/assets/gb_sct/utils.py
similarity index 100%
rename from python/popgetter/assets/gb_sct/utils.py
rename to python/poppusher/assets/gb_sct/utils.py
diff --git a/python/popgetter/assets/uk/__init__.py b/python/poppusher/assets/uk/__init__.py
similarity index 100%
rename from python/popgetter/assets/uk/__init__.py
rename to python/poppusher/assets/uk/__init__.py
diff --git a/python/popgetter/assets/uk/uk_os_opendata.py b/python/poppusher/assets/uk/uk_os_opendata.py
similarity index 99%
rename from python/popgetter/assets/uk/uk_os_opendata.py
rename to python/poppusher/assets/uk/uk_os_opendata.py
index ed3bf09..1723f78 100644
--- a/python/popgetter/assets/uk/uk_os_opendata.py
+++ b/python/poppusher/assets/uk/uk_os_opendata.py
@@ -17,7 +17,7 @@
 )
 from slugify import slugify
 
-from popgetter.utils import (
+from poppusher.utils import (
     SourceDataAssumptionsOutdated,
     StagingDirResource,
     extract_main_file_from_zip,
@@ -284,7 +284,7 @@ def download_with_redirect(
         if not temp_file.exists():
             # Using a custom header here to avoid a javascript redirect
             # https://stackoverflow.com/a/50111203
-            headers = {"User-Agent": "popgetter"}
+            headers = {"User-Agent": "poppusher"}
 
             with temp_file.open(mode="wb") as f, requests.get(
                 source_download_url, headers=headers, allow_redirects=True, stream=True
diff --git a/python/popgetter/assets/uk/united_kingdom.py b/python/poppusher/assets/uk/united_kingdom.py
similarity index 85%
rename from python/popgetter/assets/uk/united_kingdom.py
rename to python/poppusher/assets/uk/united_kingdom.py
index f8e6c70..d5a9ab2 100644
--- a/python/popgetter/assets/uk/united_kingdom.py
+++ b/python/poppusher/assets/uk/united_kingdom.py
@@ -1,6 +1,6 @@
 from __future__ import annotations
 
-from popgetter.metadata import CountryMetadata
+from poppusher.metadata import CountryMetadata
 
 country: CountryMetadata = CountryMetadata(
     name_short_en="United Kingdom",
diff --git a/python/popgetter/assets/usa/__init__.py b/python/poppusher/assets/usa/__init__.py
similarity index 97%
rename from python/popgetter/assets/usa/__init__.py
rename to python/poppusher/assets/usa/__init__.py
index 1adb7cd..eb0fcc5 100644
--- a/python/popgetter/assets/usa/__init__.py
+++ b/python/poppusher/assets/usa/__init__.py
@@ -1,8 +1,25 @@
-from dataclasses import dataclass
+from __future__ import annotations
+
 import itertools
-from popgetter.assets.country import Country
-from typing import Callable
-from popgetter.metadata import (
+from collections.abc import Callable
+from dataclasses import dataclass
+from datetime import date
+from functools import reduce
+from typing import Any, ClassVar
+
+import geopandas as gpd
+import pandas as pd
+from dagster import AssetIn, AssetOut, MetadataValue, asset, multi_asset
+from icecream import ic
+from more_itertools import batched
+from poppusher.assets.country import Country
+from poppusher.cloud_outputs import (
+    GeometryOutput,
+    MetricsOutput,
+    send_to_metrics_metadata_sensor,
+)
+from poppusher.metadata import (
+    COL,
     CountryMetadata,
     DataPublisher,
     GeometryMetadata,
@@ -10,35 +27,18 @@
     SourceDataRelease,
     metadata_to_dataframe,
 )
-from popgetter.utils import add_metadata, markdown_from_plot
-import geopandas as gpd
-from popgetter.cloud_outputs import (
-    GeometryOutput,
-    MetricsOutput,
-    send_to_metrics_metadata_sensor,
-    send_to_metrics_partitioned_sensor,
-)
-import pandas as pd
-from typing import Any, ClassVar, Tuple
-from dagster import MetadataValue, asset, multi_asset, AssetOut, AssetIn
-from functools import reduce
+from poppusher.utils import add_metadata
+
 from .census_tasks import (
-    get_geom_ids_table_for_summary,
-    generate_variable_dictionary,
+    ACS_METADATA,
+    SUMMARY_LEVELS,
+    extract_values_at_specified_levels,
     generate_variable_dictionary,
     get_geom_ids_table_for_summary,
-    get_summary_table_file_names,
     get_summary_table,
-    extract_values_at_specified_levels,
-    generate_variable_dictionary,
+    get_summary_table_file_names,
     select_estimates,
-    select_errors,
 )
-from datetime import date
-from more_itertools import batched
-from icecream import ic
-from popgetter.metadata import COL
-from .census_tasks import ACS_METADATA, SUMMARY_LEVELS
 
 SUMMARY_LEVEL_STRINGS = ["oneYear", "fiveYear"]
 GEOMETRY_COL = "AFFGEOID"
@@ -227,8 +227,8 @@ def _data_publisher(
             url="https://www.census.gov/programs-surveys/acs",
             description=(
                 """
-                The United States Census Bureau, officially the Bureau of the Census, 
-                is a principal agency of the U.S. Federal Statistical System, responsible 
+                The United States Census Bureau, officially the Bureau of the Census,
+                is a principal agency of the U.S. Federal Statistical System, responsible
                 for producing data about the American people and economy.
                 """
             ),
@@ -461,7 +461,8 @@ def _source_metric_metadata(
         context,
         catalog: pd.DataFrame,
         source_data_releases: dict[str, SourceDataRelease],
-    ) -> MetricMetadata: ...
+    ) -> MetricMetadata:
+        ...
 
     def _gen_url(
         self, col: str, table_names: list[str], year: int, summary_level: str
@@ -581,8 +582,7 @@ def derived_metrics(
             catalog: pd.DataFrame,
             census_tables: pd.DataFrame,
             source_data_releases: dict[str, SourceDataRelease],
-        ) -> Tuple[list[MetricMetadata], MetricsOutput]:
-
+        ) -> tuple[list[MetricMetadata], MetricsOutput]:
             partition_key = context.partition_key
 
             row = catalog[catalog["partition_key"] == partition_key].iloc[0].to_dict()
@@ -686,7 +686,6 @@ def derived_metrics(
                 context.log.debug(
                     f"Partition key ({partition_key}) has no additional derived metric specifications."
                 )
-                pass
 
             # Add remaining metrics
             for col in estimates.columns:
@@ -732,10 +731,10 @@ def derived_metrics(
         return derived_metrics
 
     # Implementation not required since overridden
-    def _derived_metrics(self, _census_tables): ...
+    def _derived_metrics(self, _census_tables):
+        ...
 
     def create_metrics_metadata_output(self):
-
         @send_to_metrics_metadata_sensor
         @asset(key_prefix=self.key_prefix)
         def metrics_metadata_output(
diff --git a/python/popgetter/assets/usa/census_tasks.py b/python/poppusher/assets/usa/census_tasks.py
similarity index 100%
rename from python/popgetter/assets/usa/census_tasks.py
rename to python/poppusher/assets/usa/census_tasks.py
diff --git a/python/popgetter/cloud_outputs/__init__.py b/python/poppusher/cloud_outputs/__init__.py
similarity index 98%
rename from python/popgetter/cloud_outputs/__init__.py
rename to python/poppusher/cloud_outputs/__init__.py
index 907b866..1c44926 100644
--- a/python/popgetter/cloud_outputs/__init__.py
+++ b/python/poppusher/cloud_outputs/__init__.py
@@ -6,7 +6,7 @@
 import pandas as pd
 from dagster import AssetsDefinition
 
-from popgetter.metadata import GeometryMetadata, MetricMetadata
+from poppusher.metadata import GeometryMetadata, MetricMetadata
 
 from .sensor_class import CloudAssetSensor
 
diff --git a/python/popgetter/cloud_outputs/sensor_class.py b/python/poppusher/cloud_outputs/sensor_class.py
similarity index 96%
rename from python/popgetter/cloud_outputs/sensor_class.py
rename to python/poppusher/cloud_outputs/sensor_class.py
index a8ac49c..f206839 100644
--- a/python/popgetter/cloud_outputs/sensor_class.py
+++ b/python/poppusher/cloud_outputs/sensor_class.py
@@ -27,7 +27,7 @@ class CloudAssetSensor:
     ---------
     `io_manager_key`: str
         The key of the IO manager used for publishing. See the 'resources' and
-        'resources_by_env' dicts in python/popgetter/__init__.py.
+        'resources_by_env' dicts in python/poppusher/__init__.py.
 
     `prefix`: str
         A string used to disambiguate the different assets / sensors that are
@@ -74,10 +74,10 @@ def create_publishing_asset(self):
             io_manager_key=self.io_manager_key,
         )
         def publish(context):
-            from popgetter import defs as popgetter_defs
+            from poppusher import defs as poppusher_defs
 
             # load_asset_value expects a list of strings
-            output = popgetter_defs.load_asset_value(context.partition_key.split("/"))
+            output = poppusher_defs.load_asset_value(context.partition_key.split("/"))
             return Output(output)
 
         return publish
diff --git a/python/popgetter/cloud_outputs_old.py b/python/poppusher/cloud_outputs_old.py
similarity index 96%
rename from python/popgetter/cloud_outputs_old.py
rename to python/poppusher/cloud_outputs_old.py
index 1d885e7..7c24596 100644
--- a/python/popgetter/cloud_outputs_old.py
+++ b/python/poppusher/cloud_outputs_old.py
@@ -47,8 +47,8 @@ def __init__(self, **kwargs):
 
 # TODO. This is a temporary structure to list the end points of each country pipeline
 # A more robust solution should be implemented as part of
-# https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues/38
-# and https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues/39
+# https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues/38
+# and https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues/39
 assets_to_monitor = (
     # UK Geography
     (
@@ -138,8 +138,8 @@ def country_outputs_sensor(context):
             yield RunRequest(
                 # TODO: run_key is set to None for now, as it is convenient to enable re-running the sensor
                 # whilst debugging. A proper run_key should be included as part of
-                # # https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues/38
-                # and https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues/39
+                # # https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues/38
+                # and https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues/39
                 run_key=None,
                 # run_key=run_key,
                 run_config=RunConfig(
@@ -196,9 +196,9 @@ def upstream_df(context):
     # However I cannot find another may to load the asset except
     # by using the Definitions object (or creating a RepositoryDefinition which seems to be deprecated)
     # Import the Definitions object here in the function, avoids a circular import error.
-    from popgetter import defs as popgetter_defs
+    from poppusher import defs as poppusher_defs
 
-    cartography_gdf = popgetter_defs.load_asset_value(
+    cartography_gdf = poppusher_defs.load_asset_value(
         AssetKey(asset_to_load.split("/")),
         partition_key=partition_to_load,
     )
@@ -243,7 +243,7 @@ def geojsonseq(context, upstream_df):  # noqa: ARG001
 
 
 # Not working yet - need to figure out questions about how we run docker
-# See comments here https://github.com/Urban-Analytics-Technology-Platform/popgetter/pull/68#issue-2205271531
+# See comments here https://github.com/Urban-Analytics-Technology-Platform/poppusher/pull/68#issue-2205271531
 # @asset()
 # def generate_pmtiles(context, geojson_seq_path):
 #     client = docker.from_env()
diff --git a/python/popgetter/io_managers/__init__.py b/python/poppusher/io_managers/__init__.py
similarity index 97%
rename from python/popgetter/io_managers/__init__.py
rename to python/poppusher/io_managers/__init__.py
index bcede0f..76a8271 100644
--- a/python/popgetter/io_managers/__init__.py
+++ b/python/poppusher/io_managers/__init__.py
@@ -8,8 +8,8 @@
 from iso639 import iter_langs
 from upath import UPath
 
-from popgetter.cloud_outputs import GeometryOutput, MetricsOutput
-from popgetter.metadata import (
+from poppusher.cloud_outputs import GeometryOutput, MetricsOutput
+from poppusher.metadata import (
     COL,
     CountryMetadata,
     DataPublisher,
@@ -27,7 +27,7 @@ class IOManagerError(Exception):
     pass
 
 
-class PopgetterIOManager(IOManager):
+class PoppusherIOManager(IOManager):
     def get_base_path(self) -> UPath:
         raise NotImplementedError
 
@@ -41,7 +41,7 @@ def load_input(self, _context: InputContext) -> pd.DataFrame:
         raise RuntimeError(err_msg)
 
 
-class MetadataIOManager(PopgetterIOManager):
+class MetadataIOManager(PoppusherIOManager):
     def get_output_filename(
         self, obj_entry: CountryMetadata | DataPublisher | SourceDataRelease
     ) -> str:
@@ -108,7 +108,7 @@ def all_same_class_and_accepted(objs) -> bool:
         self.handle_df(context, metadata_to_dataframe(vals), full_path)
 
 
-class GeoIOManager(PopgetterIOManager):
+class GeoIOManager(PoppusherIOManager):
     def handle_flatgeobuf(
         self, context: OutputContext, geo_df: gpd.GeoDataFrame, full_path: UPath
     ) -> None:
@@ -234,7 +234,7 @@ def handle_output(
         )
 
 
-class MetricsIOManager(PopgetterIOManager):
+class MetricsIOManager(PoppusherIOManager):
     def get_full_path_metadata(
         self,
         context: OutputContext,
@@ -340,7 +340,7 @@ def handle_output(
         )
 
 
-class MetricsPartitionedIOManager(PopgetterIOManager):
+class MetricsPartitionedIOManager(PoppusherIOManager):
     def get_full_path_metrics(
         self,
         parquet_path: str,
@@ -420,7 +420,7 @@ def load_input(self, _context: InputContext) -> pd.DataFrame:
         return super().load_input(_context)
 
 
-class MetricsMetdataIOManager(PopgetterIOManager):
+class MetricsMetdataIOManager(PoppusherIOManager):
     def get_full_path_metadata(
         self,
         context: OutputContext,
diff --git a/python/popgetter/io_managers/azure.py b/python/poppusher/io_managers/azure.py
similarity index 99%
rename from python/popgetter/io_managers/azure.py
rename to python/poppusher/io_managers/azure.py
index f14e81e..f0ea585 100644
--- a/python/popgetter/io_managers/azure.py
+++ b/python/poppusher/io_managers/azure.py
@@ -198,7 +198,7 @@ class AzureMetricsMetadataIOManager(AzureMixin, MetricsMetdataIOManager):
 class AzureGeneralIOManager(AzureMixin, IOManager):
     """This class is used only for an asset which tests the Azure functionality
     (see cloud_outputs/azure_test.py). It is not used for publishing any
-    popgetter data."""
+    poppusher data."""
 
     extension: str
 
diff --git a/python/popgetter/io_managers/local.py b/python/poppusher/io_managers/local.py
similarity index 100%
rename from python/popgetter/io_managers/local.py
rename to python/poppusher/io_managers/local.py
diff --git a/python/popgetter/metadata.py b/python/poppusher/metadata.py
similarity index 98%
rename from python/popgetter/metadata.py
rename to python/poppusher/metadata.py
index 520acb5..c367000 100644
--- a/python/popgetter/metadata.py
+++ b/python/poppusher/metadata.py
@@ -397,7 +397,7 @@ def fix_types(cls, df: pd.DataFrame) -> pd.DataFrame:
 def export_schema():
     """
     Generates a JSON schema for all the models in this script and outputs it to
-    the specified directory, with the filename `popgetter_{VERSION}.json`.
+    the specified directory, with the filename `poppusher_{VERSION}.json`.
     """
     import argparse
     import json
@@ -405,7 +405,7 @@ def export_schema():
 
     from pydantic.json_schema import models_json_schema
 
-    from popgetter import __version__
+    from poppusher import __version__
 
     parser = argparse.ArgumentParser(description=export_schema.__doc__)
     parser.add_argument(
@@ -416,11 +416,11 @@ def export_schema():
 
     _, top_level_schema = models_json_schema(
         [(model, "serialization") for model in EXPORTED_MODELS],
-        title="popgetter_schema",
+        title="poppusher_schema",
         description=f"Version {__version__}",
     )
     if not out_dir.exists():
         error_msg = f"Directory {out_dir} does not exist."
         raise FileNotFoundError(error_msg)
-    with (out_dir / f"popgetter_{__version__}.json").open("w") as f:
+    with (out_dir / f"poppusher_{__version__}.json").open("w") as f:
         json.dump(top_level_schema, f, indent=2)
diff --git a/python/popgetter/py.typed b/python/poppusher/py.typed
similarity index 100%
rename from python/popgetter/py.typed
rename to python/poppusher/py.typed
diff --git a/python/popgetter/templates.py b/python/poppusher/templates.py
similarity index 63%
rename from python/popgetter/templates.py
rename to python/poppusher/templates.py
index 34f6ea9..d1eaf05 100644
--- a/python/popgetter/templates.py
+++ b/python/poppusher/templates.py
@@ -1,6 +1,6 @@
 from __future__ import annotations
 
-from popgetter.metadata import CountryMetadata
+from poppusher.metadata import CountryMetadata
 
 
 class Country:
diff --git a/python/popgetter/utils.py b/python/poppusher/utils.py
similarity index 100%
rename from python/popgetter/utils.py
rename to python/poppusher/utils.py
diff --git a/workspace.yml b/workspace.yml
index 48d7ecf..50e4422 100644
--- a/workspace.yml
+++ b/workspace.yml
@@ -1,2 +1,2 @@
 load_from:
-  - python_package: popgetter
+  - python_package: poppusher


Test patch:
diff --git a/python/popgetter/azure_test.py b/python/poppusher/azure_test.py
similarity index 100%
rename from python/popgetter/azure_test.py
rename to python/poppusher/azure_test.py
diff --git a/tests/test_bel.py b/tests/test_bel.py
index 2ee0be0..35d7276 100644
--- a/tests/test_bel.py
+++ b/tests/test_bel.py
@@ -26,7 +26,7 @@ def demo_catalog() -> Graph:
 
 
 # # TODO: consider revising tests to incorporate changes following change to base class implementation.
-# # See issue: https://github.com/Urban-Analytics-Technology-Platform/popgetter/issues/133
+# # See issue: https://github.com/Urban-Analytics-Technology-Platform/poppusher/issues/133
 # @pytest.fixture(scope="module")
 # def demo_catalog_df(demo_catalog) -> pd.DataFrame:
 #     context = build_asset_context()
diff --git a/tests/test_cloud_outputs.py b/tests/test_cloud_outputs.py
index 73df5d2..6f5d5ab 100644
--- a/tests/test_cloud_outputs.py
+++ b/tests/test_cloud_outputs.py
@@ -3,7 +3,7 @@
 import pytest
 
 # generate_pmtiles,
-# from popgetter.cloud_outputs import (
+# from poppusher.cloud_outputs import (
 #    cartography_in_cloud_formats,
 #    country_outputs_sensor,
 # )
diff --git a/tests/test_compiled.py b/tests/test_compiled.py
index 917f3f2..67f8dca 100644
--- a/tests/test_compiled.py
+++ b/tests/test_compiled.py
@@ -1,6 +1,6 @@
 from __future__ import annotations
 
-import popgetter._core as m
+import poppusher._core as m
 
 
 def test_add():
diff --git a/tests/test_metadata.py b/tests/test_metadata.py
index bd742fc..f639760 100644
--- a/tests/test_metadata.py
+++ b/tests/test_metadata.py
@@ -4,7 +4,7 @@
 
 import pytest
 
-from popgetter.metadata import (
+from poppusher.metadata import (
     COL,
     CountryMetadata,
     DataPublisher,
diff --git a/tests/test_package.py b/tests/test_package.py
index ef2e44d..5bb02d5 100644
--- a/tests/test_package.py
+++ b/tests/test_package.py
@@ -4,11 +4,11 @@
 
 import pytest
 
-import popgetter as m
+import poppusher as m
 
 
 def test_version():
-    assert importlib.metadata.version("popgetter") == m.__version__
+    assert importlib.metadata.version("poppusher") == m.__version__
 
 
 def test_always_passing():
diff --git a/tests/test_uk.py b/tests/test_uk.py
index 0c0bc11..fb9c6ad 100644
--- a/tests/test_uk.py
+++ b/tests/test_uk.py
@@ -6,8 +6,8 @@
 from dagster import build_asset_context
 from icecream import ic
 
-from popgetter.assets.gb_eaw import england_wales_census as ew_census
-from popgetter.metadata import MetricMetadata
+from poppusher.assets.gb_eaw import england_wales_census as ew_census
+from poppusher.metadata import MetricMetadata
 
 
 def test_retrieve_table_description():
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 7cbbc5f..3aae8d0 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -3,9 +3,9 @@
 from pathlib import Path
 
 from dagster import build_op_context
-from python.popgetter.utils import StagingDirResource
+from python.poppusher.utils import StagingDirResource
 
-from popgetter.utils import get_staging_dir
+from poppusher.utils import get_staging_dir
 
 
 # Test StagingDirectory