Repository: amogorkon/justuse (language: python)

Issue:
help(use) sucks. make it suck less.



Discussion / hints:
This probably means that we have to move everything that doesn't belong to the API from `__init__.py` somewhere else.

Fix patch:
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..98f17df0
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,8 @@
+graft src/use/templates/
+graft docs
+
+include README.md
+include LICENSE
+include CODE_OF_CONDUCT.md
+include requirements.txt
+recursive-include src
diff --git a/docs/Showcase.ipynb b/docs/Showcase.ipynb
index d72a9e53..318febeb 100644
--- a/docs/Showcase.ipynb
+++ b/docs/Showcase.ipynb
@@ -20,48 +20,54 @@
    "execution_count": 1,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:17.214084Z",
-     "iopub.status.busy": "2021-11-26T14:28:17.213181Z",
-     "iopub.status.idle": "2021-11-26T14:28:23.791904Z",
-     "shell.execute_reply": "2021-11-26T14:28:23.789995Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:17.213932Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:31.782554Z",
+     "iopub.status.busy": "2022-03-29T17:08:31.781962Z",
+     "iopub.status.idle": "2022-03-29T17:08:37.098058Z",
+     "shell.execute_reply": "2022-03-29T17:08:37.097245Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:31.782412Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Collecting justuse\n",
-      "  Downloading justuse-0.6.5-py3-none-any.whl (113 kB)\n",
-      "Requirement already satisfied: hypothesis>=6.23.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (6.24.2)\n",
-      "Requirement already satisfied: pip in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.3.1)\n",
+      "Requirement already satisfied: justuse in /home/thorsten/anaconda3/lib/python3.8/site-packages (0.7.5)\n",
+      "Requirement already satisfied: beartype>=0.8.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.9.1)\n",
+      "Requirement already satisfied: icontract>=2.5.4 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.5.5)\n",
       "Requirement already satisfied: furl>=2.1.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.1.2)\n",
-      "Requirement already satisfied: typeguard>=2.12.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.13.0)\n",
-      "Requirement already satisfied: requests>=2.24.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.24.0)\n",
       "Requirement already satisfied: pydantic>=1.8.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (1.8.2)\n",
-      "Requirement already satisfied: icontract>=2.5.4 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.5.5)\n",
-      "Requirement already satisfied: wheel>=0.36.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.37.0)\n",
+      "Requirement already satisfied: jinja2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.11.3)\n",
+      "Requirement already satisfied: wheel in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.37.0)\n",
+      "Requirement already satisfied: toml in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.10.2)\n",
       "Requirement already satisfied: packaging==21.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.0)\n",
-      "Requirement already satisfied: pyparsing>=2.0.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from packaging==21.0->justuse) (2.4.7)\n",
+      "Requirement already satisfied: pip in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.3.1)\n",
+      "Requirement already satisfied: requests in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.26.0)\n",
+      "Requirement already satisfied: pyparsing>=2.0.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from packaging==21.0->justuse) (3.0.4)\n",
       "Requirement already satisfied: orderedmultidict>=1.0.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.0.1)\n",
-      "Requirement already satisfied: six>=1.8.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.15.0)\n",
-      "Requirement already satisfied: sortedcontainers<3.0.0,>=2.1.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from hypothesis>=6.23.1->justuse) (2.2.2)\n",
-      "Requirement already satisfied: attrs>=19.2.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from hypothesis>=6.23.1->justuse) (20.3.0)\n",
-      "Requirement already satisfied: typing-extensions in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (3.7.4.3)\n",
+      "Requirement already satisfied: six>=1.8.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.16.0)\n",
       "Requirement already satisfied: asttokens<3,>=2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (2.0.5)\n",
-      "Requirement already satisfied: chardet<4,>=3.0.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests>=2.24.0->justuse) (3.0.4)\n",
-      "Requirement already satisfied: idna<3,>=2.5 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests>=2.24.0->justuse) (2.10)\n",
-      "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests>=2.24.0->justuse) (1.25.11)\n",
-      "Requirement already satisfied: certifi>=2017.4.17 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests>=2.24.0->justuse) (2020.6.20)\n",
-      "Installing collected packages: justuse\n",
-      "Successfully installed justuse-0.6.5\n"
+      "Requirement already satisfied: typing-extensions in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (3.10.0.2)\n",
+      "Requirement already satisfied: MarkupSafe>=0.23 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from jinja2->justuse) (1.1.1)\n",
+      "Requirement already satisfied: certifi>=2017.4.17 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2021.10.8)\n",
+      "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (1.26.7)\n",
+      "Requirement already satisfied: idna<4,>=2.5 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (3.2)\n",
+      "Requirement already satisfied: charset-normalizer~=2.0.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2.0.4)\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING: You are using pip version 21.3.1; however, version 22.0.4 is available.\n",
+      "You should consider upgrading via the '/home/thorsten/anaconda3/bin/python3 -m pip install --upgrade pip' command.\n"
      ]
     }
    ],
    "source": [
     "%%bash\n",
-    "python -m pip install justuse"
+    "python3 -m pip install justuse"
    ]
   },
   {
@@ -69,12 +75,13 @@
    "execution_count": 2,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:23.795704Z",
-     "iopub.status.busy": "2021-11-26T14:28:23.794952Z",
-     "iopub.status.idle": "2021-11-26T14:28:24.937678Z",
-     "shell.execute_reply": "2021-11-26T14:28:24.935805Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:23.795650Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:37.099787Z",
+     "iopub.status.busy": "2022-03-29T17:08:37.099429Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.078322Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.075868Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:37.099752Z"
+    },
+    "tags": []
    },
    "outputs": [],
    "source": [
@@ -86,23 +93,21 @@
    "execution_count": 3,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:24.942835Z",
-     "iopub.status.busy": "2021-11-26T14:28:24.941470Z",
-     "iopub.status.idle": "2021-11-26T14:28:24.962554Z",
-     "shell.execute_reply": "2021-11-26T14:28:24.960562Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:24.942744Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:38.086978Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.086122Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.122451Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.121332Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.086872Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
-     "data": {
-      "text/plain": [
-       "'0.6.5'"
-      ]
-     },
-     "execution_count": 3,
-     "metadata": {},
-     "output_type": "execute_result"
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0.7.5\n"
+     ]
     }
    ],
    "source": [
@@ -136,14 +141,23 @@
    "execution_count": 4,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:30.345876Z",
-     "iopub.status.busy": "2021-11-26T14:28:30.345049Z",
-     "iopub.status.idle": "2021-11-26T14:28:30.624941Z",
-     "shell.execute_reply": "2021-11-26T14:28:30.622636Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:30.345826Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:38.124889Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.124471Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.389503Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.387990Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.124844Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'math' from '/home/thorsten/anaconda3/lib/python3.8/lib-dynload/math.cpython-38-x86_64-linux-gnu.so'>\n"
+     ]
+    },
     {
      "data": {
       "text/plain": [
@@ -193,12 +207,13 @@
    "execution_count": 5,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:31.076004Z",
-     "iopub.status.busy": "2021-11-26T14:28:31.074659Z",
-     "iopub.status.idle": "2021-11-26T14:28:31.086203Z",
-     "shell.execute_reply": "2021-11-26T14:28:31.084605Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:31.075911Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:38.391816Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.391418Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.401440Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.399907Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.391768Z"
+    },
+    "tags": []
    },
    "outputs": [],
    "source": [
@@ -240,14 +255,23 @@
    "execution_count": 6,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:31.773381Z",
-     "iopub.status.busy": "2021-11-26T14:28:31.772906Z",
-     "iopub.status.idle": "2021-11-26T14:28:31.785105Z",
-     "shell.execute_reply": "2021-11-26T14:28:31.782482Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:31.773344Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:38.404522Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.403910Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.463275Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.461173Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.404444Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, False, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = ImportError('No pkg installed named some_big_package and auto-installation not requested. Aborting.')\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -279,17 +303,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 7,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T16:36:50.866880Z",
-     "iopub.status.busy": "2021-11-26T16:36:50.866253Z",
-     "iopub.status.idle": "2021-11-26T16:36:50.887007Z",
-     "shell.execute_reply": "2021-11-26T16:36:50.885353Z",
-     "shell.execute_reply.started": "2021-11-26T16:36:50.866839Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:38.465395Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.464921Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.840734Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.839824Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.465313Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'pytest' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/pytest/__init__.py'>\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -327,20 +360,23 @@
    "execution_count": 8,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:33.328521Z",
-     "iopub.status.busy": "2021-11-26T14:28:33.326226Z",
-     "iopub.status.idle": "2021-11-26T14:28:33.684551Z",
-     "shell.execute_reply": "2021-11-26T14:28:33.683126Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:33.328360Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:38.842445Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.842158Z",
+     "iopub.status.idle": "2022-03-29T17:08:39.049843Z",
+     "shell.execute_reply": "2022-03-29T17:08:39.048869Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.842411Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/pimp.py:81: VersionWarning: numpy expected to be version 2022, but got 1.19.5 instead\n",
-      "  warn(Message.version_warning(name, version, result_version), category=VersionWarning)\n"
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, False, True, False)\n",
+      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/pimp.py:87: VersionWarning: numpy expected to be version 2022, but got 1.21.2 instead\n",
+      "  warn(UserMessage.version_warning(name, version, result_version), category=VersionWarning)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>\n"
      ]
     }
    ],
@@ -353,18 +389,19 @@
    "execution_count": 9,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:34.043159Z",
-     "iopub.status.busy": "2021-11-26T14:28:34.041723Z",
-     "iopub.status.idle": "2021-11-26T14:28:34.052605Z",
-     "shell.execute_reply": "2021-11-26T14:28:34.050906Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:34.043103Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:39.051461Z",
+     "iopub.status.busy": "2022-03-29T17:08:39.051169Z",
+     "iopub.status.idle": "2022-03-29T17:08:39.064756Z",
+     "shell.execute_reply": "2022-03-29T17:08:39.063369Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:39.051427Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "'1.19.5'"
+       "'1.21.2'"
       ]
      },
      "execution_count": 9,
@@ -395,14 +432,23 @@
    "execution_count": 10,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:36.977619Z",
-     "iopub.status.busy": "2021-11-26T14:28:36.976500Z",
-     "iopub.status.idle": "2021-11-26T14:28:37.061350Z",
-     "shell.execute_reply": "2021-11-26T14:28:37.058455Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:36.977439Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:39.066211Z",
+     "iopub.status.busy": "2022-03-29T17:08:39.065926Z",
+     "iopub.status.idle": "2022-03-29T17:08:39.149730Z",
+     "shell.execute_reply": "2022-03-29T17:08:39.146239Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:39.066177Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, False, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = ImportError('No pkg installed named pygame and auto-installation not requested. Aborting.')\n"
+     ]
+    },
     {
      "ename": "ImportError",
      "evalue": "No pkg installed named pygame and auto-installation not requested. Aborting.",
@@ -410,12 +456,13 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-10-916309d36fa0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mspam\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    101\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    102\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 103\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    104\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    105\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kw)\u001b[0m\n\u001b[1;32m     40\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     44\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    706\u001b[0m         \"\"\"\n\u001b[1;32m    707\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 708\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    709\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    710\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, modes, default, hash_algo, user_msg)\u001b[0m\n\u001b[1;32m    777\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 779\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    781\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    972\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m  \u001b[0;31m# TODO: write test for default\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    973\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 974\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m/tmp/ipykernel_3329/217604034.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mImportError\u001b[0m: No pkg installed named pygame and auto-installation not requested. Aborting."
      ]
     }
@@ -436,28 +483,51 @@
    "execution_count": 11,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:40.029837Z",
-     "iopub.status.busy": "2021-11-26T14:28:40.029119Z",
-     "iopub.status.idle": "2021-11-26T14:28:43.387312Z",
-     "shell.execute_reply": "2021-11-26T14:28:43.372274Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:40.029769Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:08:47.932063Z",
+     "iopub.status.busy": "2022-03-29T17:08:47.931709Z",
+     "iopub.status.idle": "2022-03-29T17:08:50.952098Z",
+     "shell.execute_reply": "2022-03-29T17:08:50.950268Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:47.932025Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, False, True)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "2.1.3.dev4\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = RuntimeWarning('Please specify version and hash for auto-installation of \\'pygame\\'.\\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)')\n"
+     ]
+    },
     {
      "ename": "RuntimeWarning",
-     "evalue": "Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser will open to the Snyk Advisor to check whether the package is vulnerable.\nIf you want to auto-install the latest version:\nuse(\"pygame\", version=\"2.1.0\", hashes={'J娼䥺瑹鍖谫癦䯅恢搸烃诺嬝矫暠鸤嘀邦'}, modes=use.auto_install)",
+     "evalue": "Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)",
      "output_type": "error",
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mRuntimeWarning\u001b[0m                            Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-11-939f1366e66f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mspam\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    101\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    102\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 103\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    104\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    105\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kw)\u001b[0m\n\u001b[1;32m     40\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     44\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    706\u001b[0m         \"\"\"\n\u001b[1;32m    707\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 708\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    709\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    710\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, modes, default, hash_algo, user_msg)\u001b[0m\n\u001b[1;32m    777\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    778\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 779\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    781\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    972\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m  \u001b[0;31m# TODO: write test for default\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    973\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 974\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;31mRuntimeWarning\u001b[0m: Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser will open to the Snyk Advisor to check whether the package is vulnerable.\nIf you want to auto-install the latest version:\nuse(\"pygame\", version=\"2.1.0\", hashes={'J娼䥺瑹鍖谫癦䯅恢搸烃诺嬝矫暠鸤嘀邦'}, modes=use.auto_install)"
+      "\u001b[0;32m/tmp/ipykernel_3329/1145780527.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mRuntimeWarning\u001b[0m: Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)"
      ]
     }
    ],
@@ -472,6 +542,98 @@
     "Now we're getting somewhere! Hmm.. it says \"To get some valuable insight on the health of this package, please check out https://snyk.io/advisor/python/pygame - see for yourself!"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's look at this last line of the message.. hmm.. a dev version? Nah, let's pick the last stable version instead."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:59.641601Z",
+     "iopub.status.busy": "2022-03-29T17:08:59.640706Z",
+     "iopub.status.idle": "2022-03-29T17:08:59.649621Z",
+     "shell.execute_reply": "2022-03-29T17:08:59.648519Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:59.641556Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Linux 5.4.0-105-generic \n",
+      " 3.8.5\n"
+     ]
+    }
+   ],
+   "source": [
+    "import platform; print(platform.system(), platform.release(), \"\\n\", platform.python_version())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:00.912046Z",
+     "iopub.status.busy": "2022-03-29T17:09:00.911204Z",
+     "iopub.status.idle": "2022-03-29T17:09:02.311836Z",
+     "shell.execute_reply": "2022-03-29T17:09:02.308668Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:00.912003Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, False, False, True)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = RuntimeWarning('Failed to auto-install \\'pygame\\' because hashes aren\\'t specified.\\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\\n        If you want to use the package only on this platform, this should work:\\n    use(\"pygame\", version=\"2.1.2\", hashes=\\'V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠\\', modes=use.auto_install)')\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠\n"
+     ]
+    },
+    {
+     "ename": "RuntimeWarning",
+     "evalue": "Failed to auto-install 'pygame' because hashes aren't specified.\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\n        If you want to use the package only on this platform, this should work:\n    use(\"pygame\", version=\"2.1.2\", hashes='V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠', modes=use.auto_install)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mRuntimeWarning\u001b[0m                            Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/1367005035.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"2.1.2\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mRuntimeWarning\u001b[0m: Failed to auto-install 'pygame' because hashes aren't specified.\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\n        If you want to use the package only on this platform, this should work:\n    use(\"pygame\", version=\"2.1.2\", hashes='V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠', modes=use.auto_install)"
+     ]
+    }
+   ],
+   "source": [
+    "use(\"pygame\", version=\"2.1.2\", modes=use.auto_install)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Hey, did you see the browser tab that just opened? You can select all the platforms and python versions you want to support there and just copy & paste the snippet - let's get the one for python 3.8 and ubuntu I'm running here.."
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {
@@ -491,43 +653,104 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Have a look at the last line of the Error message - let's try to copy&paste it.."
+    "Well, let's try to use all the linux ones for py38 - copy&paste.."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 14,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T14:28:54.873909Z",
-     "iopub.status.busy": "2021-11-26T14:28:54.873391Z",
-     "iopub.status.idle": "2021-11-26T14:28:55.077317Z",
-     "shell.execute_reply": "2021-11-26T14:28:55.076587Z",
-     "shell.execute_reply.started": "2021-11-26T14:28:54.873871Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:10.739111Z",
+     "iopub.status.busy": "2022-03-29T17:09:10.738727Z",
+     "iopub.status.idle": "2022-03-29T17:09:27.819663Z",
+     "shell.execute_reply": "2022-03-29T17:09:27.818176Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:10.739072Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, True, False, True)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting auto-installation of <1219a963941bd53aa754e8449364c142004fe706c33a9c22ff2a76521a82d078>...\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mDownloading artifact from PyPI...\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mDownload successful.\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting to install..\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "pygame 2.1.0 (SDL 2.0.16, Python 3.8.5)\n",
+      "Using pip 21.2.4 from /home/thorsten/anaconda3/lib/python3.8/site-packages/pip (python 3.8)\n",
+      "Non-user install due to --prefix or --target option\n",
+      "Created temporary directory: /tmp/pip-ephem-wheel-cache-2jr7tl_n\n",
+      "Created temporary directory: /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Initialized build tracking at /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Created build tracker: /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Entered build tracker: /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Created temporary directory: /tmp/pip-install-x1k3385k\n",
+      "Processing /home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl\n",
+      "  Added pygame==2.1.2 from file:///home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl to build tracker '/tmp/pip-req-tracker-1n7fx1dn'\n",
+      "  Removed pygame==2.1.2 from file:///home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl from build tracker '/tmp/pip-req-tracker-1n7fx1dn'\n",
+      "Created temporary directory: /tmp/pip-unpack-na9sd2b7\n",
+      "Installing collected packages: pygame\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mInstallation successful.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Successfully installed pygame-2.1.2\n",
+      "Removed build tracker: '/tmp/pip-req-tracker-1n7fx1dn'\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mdist=<importlib_metadata.PathDistribution object at 0x7f53729300a0>\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting to import...\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mSuccessfully imported.\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'pygame' from '/home/thorsten/.justuse-python/venv/pygame/2.1.2/lib/python3.8/site-packages/pygame/__init__.py'>\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "pygame 2.1.2 (SDL 2.0.16, Python 3.8.5)\n",
       "Hello from the pygame community. https://www.pygame.org/contribute.html\n"
      ]
     },
     {
      "data": {
       "text/plain": [
-       "<module 'pygame' from '/home/thorsten/.justuse-python/venv/pygame/2.1.0/lib/python3.8/site-packages/pygame/__init__.py'>"
+       "<module 'pygame' from '/home/thorsten/.justuse-python/venv/pygame/2.1.2/lib/python3.8/site-packages/pygame/__init__.py'>"
       ]
      },
-     "execution_count": 12,
+     "execution_count": 14,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "use(\"pygame\", version=\"2.1.0\", hashes={'J娼䥺瑹鍖谫癦䯅恢搸烃诺嬝矫暠鸤嘀邦'}, modes=use.auto_install)"
+    "use('pygame', version='2.1.2', modes=use.auto_install, hash_algo=use.Hash.sha256, hashes={\n",
+    "    '1219a963941bd53aa754e8449364c142004fe706c33a9c22ff2a76521a82d078',  # cp38-manylinux_2_12_x86_64.manylinux2010_x86_64\n",
+    "    'ea36f4f93524554a35cac2359df63b50af6556ed866830aa1f07f0d8580280ea',  # cp38-manylinux_2_5_x86_64.manylinux1_x86_64\n",
+    "    '97a74ba186deee68318a52637012ef6abf5be6282c659e1d1ba6ad08cf35ec85',  # cp38-manylinux_2_17_x86_64.manylinux2014_x86_64 \n",
+    "})"
    ]
   },
   {
@@ -585,15 +808,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 15,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:29.666835Z",
-     "iopub.status.busy": "2021-11-25T17:22:29.666271Z",
-     "iopub.status.idle": "2021-11-25T17:22:29.679415Z",
-     "shell.execute_reply": "2021-11-25T17:22:29.678243Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:29.666785Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:37.523441Z",
+     "iopub.status.busy": "2022-03-29T17:09:37.523070Z",
+     "iopub.status.idle": "2022-03-29T17:09:37.537150Z",
+     "shell.execute_reply": "2022-03-29T17:09:37.536156Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:37.523398Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -617,32 +841,42 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 16,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:31.142232Z",
-     "iopub.status.busy": "2021-11-25T17:22:31.141382Z",
-     "iopub.status.idle": "2021-11-25T17:22:32.422593Z",
-     "shell.execute_reply": "2021-11-25T17:22:32.421489Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:31.142184Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:39.008242Z",
+     "iopub.status.busy": "2022-03-29T17:09:39.007877Z",
+     "iopub.status.idle": "2022-03-29T17:09:39.022433Z",
+     "shell.execute_reply": "2022-03-29T17:09:39.021387Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:39.008204Z"
+    },
+    "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='demo' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/demo.py')\n"
+     ]
+    }
+   ],
    "source": [
     "mod = use(use.Path(\"../docs/demo.py\"))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 17,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:32.425403Z",
-     "iopub.status.busy": "2021-11-25T17:22:32.424586Z",
-     "iopub.status.idle": "2021-11-25T17:22:32.431595Z",
-     "shell.execute_reply": "2021-11-25T17:22:32.430428Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:32.425362Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:40.235932Z",
+     "iopub.status.busy": "2022-03-29T17:09:40.235520Z",
+     "iopub.status.idle": "2022-03-29T17:09:40.241824Z",
+     "shell.execute_reply": "2022-03-29T17:09:40.240800Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:40.235896Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -666,17 +900,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 18,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:37.742801Z",
-     "iopub.status.busy": "2021-11-25T17:22:37.742226Z",
-     "iopub.status.idle": "2021-11-25T17:22:38.981532Z",
-     "shell.execute_reply": "2021-11-25T17:22:38.980472Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:37.742746Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:42.934273Z",
+     "iopub.status.busy": "2022-03-29T17:09:42.933820Z",
+     "iopub.status.idle": "2022-03-29T17:09:42.959816Z",
+     "shell.execute_reply": "2022-03-29T17:09:42.958503Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:42.934219Z"
+    },
+    "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='demo' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/demo.py')\n"
+     ]
+    }
+   ],
    "source": [
     "mod = use(use.Path(\"../docs/demo.py\"), modes=use.reloading)"
    ]
@@ -706,25 +949,27 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 19,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:42.728021Z",
-     "iopub.status.busy": "2021-11-25T17:22:42.727162Z",
-     "iopub.status.idle": "2021-11-25T17:22:43.095180Z",
-     "shell.execute_reply": "2021-11-25T17:22:43.092602Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:42.727970Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:44.362039Z",
+     "iopub.status.busy": "2022-03-29T17:09:44.361536Z",
+     "iopub.status.idle": "2022-03-29T17:09:44.692046Z",
+     "shell.execute_reply": "2022-03-29T17:09:44.690576Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:44.361996Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/main.py:416: NoValidationWarning: Attempting to import from the interwebs with no validation whatsoever!\n",
+      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/main.py:399: NoValidationWarning: Attempting to import from the interwebs with no validation whatsoever!\n",
       "To safely reproduce:\n",
       "use(use.URL('https://raw.githubusercontent.com/amogorkon/justuse/unstable/docs/demo.py'), hash_algo=use.Hash.sha256, hash_value='59eff31bb220ce933ccc083b9306020ec25d19d43de30e5ad4341b355d4b48bf')\n",
-      "  warn(Message.no_validation(url, hash_algo, this_hash), NoValidationWarning)\n"
+      "  warn(UserMessage.no_validation(url, hash_algo, this_hash), NoValidationWarning)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/tests') package_name='' module_name='demo.py' module_path=PosixPath('/media/sf_Dropbox/code/justuse/tests/amogorkon/justuse/unstable/docs/demo.py')\n"
      ]
     }
    ],
@@ -749,32 +994,42 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 20,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:48.805442Z",
-     "iopub.status.busy": "2021-11-25T17:22:48.804867Z",
-     "iopub.status.idle": "2021-11-25T17:22:48.955884Z",
-     "shell.execute_reply": "2021-11-25T17:22:48.953385Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:48.805393Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:49.144653Z",
+     "iopub.status.busy": "2022-03-29T17:09:49.143622Z",
+     "iopub.status.idle": "2022-03-29T17:09:49.226852Z",
+     "shell.execute_reply": "2022-03-29T17:09:49.225797Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:49.144608Z"
+    },
+    "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/tests') package_name='' module_name='demo.py' module_path=PosixPath('/media/sf_Dropbox/code/justuse/tests/amogorkon/justuse/unstable/docs/demo.py')\n"
+     ]
+    }
+   ],
    "source": [
     "mod = use(use.URL('https://raw.githubusercontent.com/amogorkon/justuse/unstable/docs/demo.py'), hash_algo=use.Hash.sha256, hash_value='59eff31bb220ce933ccc083b9306020ec25d19d43de30e5ad4341b355d4b48bf')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 21,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:22:50.392432Z",
-     "iopub.status.busy": "2021-11-25T17:22:50.391775Z",
-     "iopub.status.idle": "2021-11-25T17:22:50.398784Z",
-     "shell.execute_reply": "2021-11-25T17:22:50.397663Z",
-     "shell.execute_reply.started": "2021-11-25T17:22:50.392377Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:51.395045Z",
+     "iopub.status.busy": "2022-03-29T17:09:51.394084Z",
+     "iopub.status.idle": "2022-03-29T17:09:51.401257Z",
+     "shell.execute_reply": "2022-03-29T17:09:51.400030Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:51.395015Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -808,15 +1063,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 22,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T00:39:49.115044Z",
-     "iopub.status.busy": "2021-11-26T00:39:49.114580Z",
-     "iopub.status.idle": "2021-11-26T00:39:49.245519Z",
-     "shell.execute_reply": "2021-11-26T00:39:49.244322Z",
-     "shell.execute_reply.started": "2021-11-26T00:39:49.115003Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:53.149046Z",
+     "iopub.status.busy": "2022-03-29T17:09:53.147915Z",
+     "iopub.status.idle": "2022-03-29T17:09:53.288414Z",
+     "shell.execute_reply": "2022-03-29T17:09:53.287384Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:53.149003Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -825,13 +1081,15 @@
      "text": [
       "/media/sf_Dropbox/code/justuse/docs\n",
       "insgesamt 47\n",
-      "-rwxrwx--- 1 root    43 Nov 23 01:13 \u001b[0m\u001b[01;32mdemo.py\u001b[0m*\n",
-      "-rwxrwx--- 1 root    97 Nov 26 01:35 \u001b[01;32mmodule_a.py\u001b[0m*\n",
-      "-rwxrwx--- 1 root    47 Nov 26 01:36 \u001b[01;32mmodule_b.py\u001b[0m*\n",
-      "-rwxrwx--- 1 root    62 Nov 26 01:12 \u001b[01;32mmodule_circular_a.py\u001b[0m*\n",
-      "-rwxrwx--- 1 root    68 Nov 26 01:12 \u001b[01;32mmodule_circular_b.py\u001b[0m*\n",
-      "drwxrwx--- 1 root  4096 Nov 26 01:12 \u001b[01;34m__pycache__\u001b[0m/\n",
-      "-rwxrwx--- 1 root 80661 Nov 26 01:38 \u001b[01;32mShowcase.ipynb\u001b[0m*\n"
+      "-rwxrwx--- 1 root  2356 Mär 24 11:29  \u001b[0m\u001b[01;32mcodeflow.md\u001b[0m*\n",
+      "-rwxrwx--- 1 root  1326 Mär 24 11:29 \u001b[01;32m'database schema.md'\u001b[0m*\n",
+      "-rwxrwx--- 1 root    43 Feb 16 11:35  \u001b[01;32mdemo.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    97 Feb 16 11:35  \u001b[01;32mmodule_a.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    47 Feb 16 11:35  \u001b[01;32mmodule_b.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    62 Feb 16 11:35  \u001b[01;32mmodule_circular_a.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    68 Feb 16 11:35  \u001b[01;32mmodule_circular_b.py\u001b[0m*\n",
+      "drwxrwx--- 1 root     0 Mär 29 18:06  \u001b[01;34m__pycache__\u001b[0m/\n",
+      "-rwxrwx--- 1 root 74015 Mär 29 19:09  \u001b[01;32mShowcase.ipynb\u001b[0m*\n"
      ]
     }
    ],
@@ -842,15 +1100,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 23,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:23:11.838117Z",
-     "iopub.status.busy": "2021-11-25T17:23:11.837304Z",
-     "iopub.status.idle": "2021-11-25T17:23:11.847034Z",
-     "shell.execute_reply": "2021-11-25T17:23:11.845916Z",
-     "shell.execute_reply.started": "2021-11-25T17:23:11.838062Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:56.211386Z",
+     "iopub.status.busy": "2022-03-29T17:09:56.210155Z",
+     "iopub.status.idle": "2022-03-29T17:09:56.221247Z",
+     "shell.execute_reply": "2022-03-29T17:09:56.220253Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:56.211338Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -858,9 +1117,9 @@
       "text/plain": [
        "\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from A!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
        "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
-       "\u001b[0;34m\u001b[0m\u001b[0mfoo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_b\u001b[0m\u001b[0;34m\u001b[0m\n",
        "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
-       "\u001b[0;34m\u001b[0m\u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_b\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
+       "\u001b[0;34m\u001b[0m\u001b[0mfoo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
       ]
      },
      "metadata": {},
@@ -873,21 +1132,25 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 24,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-25T17:23:16.919760Z",
-     "iopub.status.busy": "2021-11-25T17:23:16.918994Z",
-     "iopub.status.idle": "2021-11-25T17:23:16.928951Z",
-     "shell.execute_reply": "2021-11-25T17:23:16.926696Z",
-     "shell.execute_reply.started": "2021-11-25T17:23:16.919711Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:57.040251Z",
+     "iopub.status.busy": "2022-03-29T17:09:57.039433Z",
+     "iopub.status.idle": "2022-03-29T17:09:57.047982Z",
+     "shell.execute_reply": "2022-03-29T17:09:57.046971Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:57.040210Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from B!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
+       "\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;32mfrom\u001b[0m \u001b[0mmodule_circular_a\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from B!\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
       ]
      },
      "metadata": {},
@@ -900,15 +1163,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 25,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T00:12:17.517867Z",
-     "iopub.status.busy": "2021-11-26T00:12:17.517151Z",
-     "iopub.status.idle": "2021-11-26T00:12:17.673345Z",
-     "shell.execute_reply": "2021-11-26T00:12:17.671781Z",
-     "shell.execute_reply.started": "2021-11-26T00:12:17.517734Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:09:57.912191Z",
+     "iopub.status.busy": "2022-03-29T17:09:57.911299Z",
+     "iopub.status.idle": "2022-03-29T17:09:57.973617Z",
+     "shell.execute_reply": "2022-03-29T17:09:57.970810Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:57.912143Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -925,7 +1189,7 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-1-420778313a26>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_a\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m/tmp/ipykernel_3329/2853914029.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_a\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
       "\u001b[0;32m/media/sf_Dropbox/code/justuse/docs/module_circular_a.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from A!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_b\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mfoo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m/media/sf_Dropbox/code/justuse/docs/module_circular_b.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mmodule_circular_a\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from B!\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mImportError\u001b[0m: cannot import name 'foo' from partially initialized module 'module_circular_a' (most likely due to a circular import) (/media/sf_Dropbox/code/justuse/docs/module_circular_a.py)"
@@ -938,15 +1202,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 26,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T00:39:55.751033Z",
-     "iopub.status.busy": "2021-11-26T00:39:55.750247Z",
-     "iopub.status.idle": "2021-11-26T00:39:55.758422Z",
-     "shell.execute_reply": "2021-11-26T00:39:55.757219Z",
-     "shell.execute_reply.started": "2021-11-26T00:39:55.750992Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:10:00.083951Z",
+     "iopub.status.busy": "2022-03-29T17:10:00.083080Z",
+     "iopub.status.idle": "2022-03-29T17:10:00.092100Z",
+     "shell.execute_reply": "2022-03-29T17:10:00.091117Z",
+     "shell.execute_reply.started": "2022-03-29T17:10:00.083921Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -969,15 +1234,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 27,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T00:40:01.282521Z",
-     "iopub.status.busy": "2021-11-26T00:40:01.281841Z",
-     "iopub.status.idle": "2021-11-26T00:40:01.288882Z",
-     "shell.execute_reply": "2021-11-26T00:40:01.287663Z",
-     "shell.execute_reply.started": "2021-11-26T00:40:01.282482Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:10:01.836206Z",
+     "iopub.status.busy": "2022-03-29T17:10:01.835205Z",
+     "iopub.status.idle": "2022-03-29T17:10:03.818776Z",
+     "shell.execute_reply": "2022-03-29T17:10:03.817885Z",
+     "shell.execute_reply.started": "2022-03-29T17:10:01.836163Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
@@ -998,17 +1264,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 28,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T00:36:46.721866Z",
-     "iopub.status.busy": "2021-11-26T00:36:46.720984Z",
-     "iopub.status.idle": "2021-11-26T00:36:49.177806Z",
-     "shell.execute_reply": "2021-11-26T00:36:49.176531Z",
-     "shell.execute_reply.started": "2021-11-26T00:36:46.721814Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:10:03.822150Z",
+     "iopub.status.busy": "2022-03-29T17:10:03.820565Z",
+     "iopub.status.idle": "2022-03-29T17:10:09.823025Z",
+     "shell.execute_reply": "2022-03-29T17:10:09.821773Z",
+     "shell.execute_reply.started": "2022-03-29T17:10:03.822108Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='module_a' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/module_a.py')\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='module_b' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/module_b.py')\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -1075,61 +1350,77 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Our solution: use() adds functionality to the modules you request and gives you an easy way to decorate *everything* in a single line:"
+    "Our solution: use() adds functionality to the modules you request and gives you an easy way to decorate *everything* in a single line."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 29,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T15:29:01.700128Z",
-     "iopub.status.busy": "2021-11-26T15:29:01.699648Z",
-     "iopub.status.idle": "2021-11-26T15:29:01.713190Z",
-     "shell.execute_reply": "2021-11-26T15:29:01.712051Z",
-     "shell.execute_reply.started": "2021-11-26T15:29:01.700089Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:11:52.533686Z",
+     "iopub.status.busy": "2022-03-29T17:11:52.533263Z",
+     "iopub.status.idle": "2022-03-29T17:11:52.566761Z",
+     "shell.execute_reply": "2022-03-29T17:11:52.565859Z",
+     "shell.execute_reply.started": "2022-03-29T17:11:52.533646Z"
+    },
+    "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>\n"
+     ]
+    }
+   ],
    "source": [
-    "from functools import wraps\n",
-    "\n",
-    "def decorator(func):\n",
-    "    @wraps(func)\n",
-    "    def wrapper(*args, **kwargs):\n",
-    "        print(func, args, kwargs)\n",
-    "        return func(*args, **kwargs)\n",
-    "    return wrapper\n",
-    "\n",
     "np = use(\"numpy\")"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Justuse comes with two decorators `use.woody_logger` and `use.tinny_profiler` which you can use but it also works for decorators like `beartype`."
+   ]
+  },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 30,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T15:29:02.214297Z",
-     "iopub.status.busy": "2021-11-26T15:29:02.213336Z",
-     "iopub.status.idle": "2021-11-26T15:29:02.270864Z",
-     "shell.execute_reply": "2021-11-26T15:29:02.267503Z",
-     "shell.execute_reply.started": "2021-11-26T15:29:02.214179Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:13:24.617281Z",
+     "iopub.status.busy": "2022-03-29T17:13:24.616920Z",
+     "iopub.status.idle": "2022-03-29T17:13:25.286756Z",
+     "shell.execute_reply": "2022-03-29T17:13:25.285785Z",
+     "shell.execute_reply.started": "2022-03-29T17:13:24.617243Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Please check your browser to select options and filters for aspects.\n"
+     ]
+    },
     {
      "data": {
       "text/plain": [
        "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
       ]
      },
-     "execution_count": 16,
+     "execution_count": 30,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "np @ (use.isfunction, \"\", decorator)"
+    "np @  use.woody_logger"
    ]
   },
   {
@@ -1144,132 +1435,64 @@
     }
    },
    "source": [
-    "Let's have a look at our log file to see what just happened:"
+    "After waiting until the page is fully loaded (which can take a while..) we now can see all the thousands of callables inside numpy that we could apply our decorator with. This also allows us to play with different filters to make sure we only hit what we want. Now let's see what happens when we actually apply this decorator to all those callables."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 31,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T15:29:04.122158Z",
-     "iopub.status.busy": "2021-11-26T15:29:04.121562Z",
-     "iopub.status.idle": "2021-11-26T15:29:04.148995Z",
-     "shell.execute_reply": "2021-11-26T15:29:04.145725Z",
-     "shell.execute_reply.started": "2021-11-26T15:29:04.122118Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:13:34.619405Z",
+     "iopub.status.busy": "2022-03-29T17:13:34.618424Z",
+     "iopub.status.idle": "2022-03-29T17:13:34.848266Z",
+     "shell.execute_reply": "2022-03-29T17:13:34.847301Z",
+     "shell.execute_reply.started": "2022-03-29T17:13:34.619364Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::take_along_axis [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::put_along_axis [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::broadcast_to [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::broadcast_arrays [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::diag [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::diagflat [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::eye [function]\n",
-      "16:29:02,248 use.pimp DEBUG Applied decorator to numpy::fliplr [function]\n",
-      "16:29:02,249 use.pimp DEBUG Applied decorator to numpy::flipud [function]\n",
-      "16:29:02,249 use.pimp DEBUG Applied decorator to numpy::tri [function]\n",
-      "16:29:02,249 use.pimp DEBUG Applied decorator to numpy::triu [function]\n",
-      "16:29:02,249 use.pimp DEBUG Applied decorator to numpy::tril [function]\n",
-      "16:29:02,250 use.pimp DEBUG Applied decorator to numpy::vander [function]\n",
-      "16:29:02,250 use.pimp DEBUG Applied decorator to numpy::histogram2d [function]\n",
-      "16:29:02,250 use.pimp DEBUG Applied decorator to numpy::mask_indices [function]\n",
-      "16:29:02,250 use.pimp DEBUG Applied decorator to numpy::tril_indices [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::tril_indices_from [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::triu_indices [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::triu_indices_from [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::fix [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::isneginf [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::isposinf [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::pad [function]\n",
-      "16:29:02,251 use.pimp DEBUG Applied decorator to numpy::poly [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::roots [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polyint [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polyder [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polyadd [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polysub [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polymul [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polydiv [function]\n",
-      "16:29:02,252 use.pimp DEBUG Applied decorator to numpy::polyval [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy::polyfit [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy::issubclass_ [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy::issubsctype [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy.lib.utils::deprecate [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy.lib.utils::<lambda> [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy.lib.utils::get_include [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy::info [function]\n",
-      "16:29:02,253 use.pimp DEBUG Applied decorator to numpy::source [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy.lib.utils::who [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy::lookfor [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy.lib.utils::byte_bounds [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy.lib.utils::safe_eval [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy::ediff1d [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy::intersect1d [function]\n",
-      "16:29:02,254 use.pimp DEBUG Applied decorator to numpy::setxor1d [function]\n",
-      "16:29:02,255 use.pimp DEBUG Applied decorator to numpy::union1d [function]\n",
-      "16:29:02,255 use.pimp DEBUG Applied decorator to numpy::setdiff1d [function]\n",
-      "16:29:02,255 use.pimp DEBUG Applied decorator to numpy::unique [function]\n",
-      "16:29:02,255 use.pimp DEBUG Applied decorator to numpy::in1d [function]\n",
-      "16:29:02,255 use.pimp DEBUG Applied decorator to numpy::isin [function]\n",
-      "16:29:02,255 use.pimp DEBUG Applied decorator to numpy::savetxt [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy::loadtxt [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy::genfromtxt [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy.lib.npyio::ndfromtxt [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy.lib.npyio::mafromtxt [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy.lib.npyio::recfromtxt [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy.lib.npyio::recfromcsv [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy::load [function]\n",
-      "16:29:02,256 use.pimp DEBUG Applied decorator to numpy::loads [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::save [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::savez [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::savez_compressed [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::packbits [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::unpackbits [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::fromregex [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::fv [function]\n",
-      "16:29:02,257 use.pimp DEBUG Applied decorator to numpy::pmt [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::nper [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::ipmt [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::ppmt [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::pv [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::rate [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::irr [function]\n",
-      "16:29:02,258 use.pimp DEBUG Applied decorator to numpy::npv [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::mirr [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nansum [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanmax [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanmin [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanargmax [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanargmin [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanmean [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanmedian [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanpercentile [function]\n",
-      "16:29:02,259 use.pimp DEBUG Applied decorator to numpy::nanvar [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::nanstd [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::nanprod [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::nancumsum [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::nancumprod [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::nanquantile [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::histogram [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::histogramdd [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::histogram_bin_edges [function]\n",
-      "16:29:02,260 use.pimp DEBUG Applied decorator to numpy::bmat [function]\n",
-      "16:29:02,261 use.pimp DEBUG Applied decorator to numpy::asmatrix [function]\n",
-      "16:29:02,261 use.pimp DEBUG Applied decorator to numpy::asmatrix [function]\n",
-      "16:29:02,261 use.pimp DEBUG Applied decorator to numpy::round_ [function]\n",
-      "16:29:02,261 use.pimp DEBUG Applied decorator to numpy::amax [function]\n",
-      "16:29:02,261 use.pimp DEBUG Applied decorator to numpy::amin [function]\n"
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_ipython_display_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_mimebundle_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_html_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_markdown_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_svg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_png_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_pdf_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_jpeg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_latex_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_json_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_javascript_',) {} -> numpy.__getattr__\n"
      ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "%%bash\n",
-    "tail -100 /home/thorsten/.justuse-python/logs/usage.log"
+    "use.apply_aspect(np, use.woody_logger)"
    ]
   },
   {
@@ -1281,34 +1504,54 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 32,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T15:30:22.116852Z",
-     "iopub.status.busy": "2021-11-26T15:30:22.116398Z",
-     "iopub.status.idle": "2021-11-26T15:30:22.129248Z",
-     "shell.execute_reply": "2021-11-26T15:30:22.127185Z",
-     "shell.execute_reply.started": "2021-11-26T15:30:22.116815Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:13:47.971129Z",
+     "iopub.status.busy": "2022-03-29T17:13:47.970573Z",
+     "iopub.status.idle": "2022-03-29T17:13:48.094803Z",
+     "shell.execute_reply": "2022-03-29T17:13:48.093669Z",
+     "shell.execute_reply.started": "2022-03-29T17:13:47.971088Z"
+    },
+    "tags": []
    },
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "<function amax at 0x7fd13028baf0> (array(...),) {}\n",
-      "<function amin at 0x7fd13028bca0> (array(...),) {}\n"
+      "([1, 2, 3],) {} -> numpy.array\n",
+      "(<class 'int'>,) {} -> numpy.dtype\n"
      ]
     },
     {
-     "data": {
-      "text/plain": [
-       "array([1, 2, 3])"
-      ]
-     },
-     "execution_count": 18,
-     "metadata": {},
-     "output_type": "execute_result"
+     "ename": "TypeError",
+     "evalue": "issubclass() arg 2 must be a class or tuple of classes",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/3038565759.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    233\u001b[0m         \u001b[0;31m# )\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    234\u001b[0m         print(\n\u001b[0;32m--> 235\u001b[0;31m             \u001b[0;34mf\"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    236\u001b[0m         )\n\u001b[1;32m    237\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array_str_implementation\u001b[0;34m(a, max_line_width, precision, suppress_small, array2string)\u001b[0m\n\u001b[1;32m   1549\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_guarded_repr_or_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1551\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0marray2string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_line_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprecision\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msuppress_small\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m' '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1552\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36marray2string\u001b[0;34m(a, max_line_width, precision, suppress_small, separator, prefix, style, formatter, threshold, edgeitems, sign, floatmode, suffix, legacy)\u001b[0m\n\u001b[1;32m    696\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"[]\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    697\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 698\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0m_array2string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseparator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprefix\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    699\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    700\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    473\u001b[0m             \u001b[0mrepr_running\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    474\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 475\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    476\u001b[0m             \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    477\u001b[0m                 \u001b[0mrepr_running\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array2string\u001b[0;34m(a, options, separator, prefix)\u001b[0m\n\u001b[1;32m    499\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    500\u001b[0m     \u001b[0;31m# find the right formatting function for the array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 501\u001b[0;31m     \u001b[0mformat_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_format_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    502\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    503\u001b[0m     \u001b[0;31m# skip over \"[\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_get_format_function\u001b[0;34m(data, **options)\u001b[0m\n\u001b[1;32m    427\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mformatdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timedelta'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    428\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 429\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mformatdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'int'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    430\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypeobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloating\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    431\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypeobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlongfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m()\u001b[0m\n\u001b[1;32m    372\u001b[0m     formatdict = {\n\u001b[1;32m    373\u001b[0m         \u001b[0;34m'bool'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mBoolFormat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 374\u001b[0;31m         \u001b[0;34m'int'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mIntegerFormat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    375\u001b[0m         'float': lambda: FloatingFormat(\n\u001b[1;32m    376\u001b[0m             data, precision, floatmode, suppress, sign, legacy=legacy),\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m   1185\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1186\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1187\u001b[0;31m             max_str_len = max(len(str(np.max(data))),\n\u001b[0m\u001b[1;32m   1188\u001b[0m                               len(str(np.min(data))))\n\u001b[1;32m   1189\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    226\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 227\u001b[0;31m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{args} {kwargs} -> {module}{qualname}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    228\u001b[0m         \u001b[0mbefore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mperf_counter_ns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    229\u001b[0m         \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array_repr_implementation\u001b[0;34m(arr, max_line_width, precision, suppress_small, array2string)\u001b[0m\n\u001b[1;32m   1436\u001b[0m         \u001b[0mclass_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"array\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1437\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1438\u001b[0;31m     \u001b[0mskipdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdtype_is_implied\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1439\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1440\u001b[0m     \u001b[0mprefix\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclass_name\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"(\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36mdtype_is_implied\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m   1388\u001b[0m     \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mint8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1389\u001b[0m     \"\"\"\n\u001b[0;32m-> 1390\u001b[0;31m     \u001b[0mdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1391\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0m_format_options\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'legacy'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'1.13'\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mbool_\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1392\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    226\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 227\u001b[0;31m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{args} {kwargs} -> {module}{qualname}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    228\u001b[0m         \u001b[0mbefore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mperf_counter_ns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    229\u001b[0m         \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m__repr__\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m     44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m     \u001b[0marg_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_construction_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minclude_align\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misalignedstruct\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m         \u001b[0marg_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marg_str\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\", align=True\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_construction_repr\u001b[0;34m(dtype, include_align, short)\u001b[0m\n\u001b[1;32m     98\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_subarray_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     99\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_scalar_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_scalar_str\u001b[0;34m(dtype, short)\u001b[0m\n\u001b[1;32m    102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    103\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_scalar_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 104\u001b[0;31m     \u001b[0mbyteorder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_byte_order_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    105\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    106\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbool_\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_byte_order_str\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m    161\u001b[0m     \u001b[0;34m\"\"\" Normalize byteorder to '<' or '>' \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    162\u001b[0m     \u001b[0;31m# hack to obtain the native and swapped byte order characters\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 163\u001b[0;31m     \u001b[0mswapped\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnewbyteorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'S'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    164\u001b[0m     \u001b[0mnative\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswapped\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnewbyteorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'S'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    233\u001b[0m         \u001b[0;31m# )\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    234\u001b[0m         print(\n\u001b[0;32m--> 235\u001b[0;31m             \u001b[0;34mf\"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    236\u001b[0m         )\n\u001b[1;32m    237\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m__str__\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m     37\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubdtype\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     38\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_subarray_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m     \u001b[0;32melif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflexible\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnative\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     40\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mTypeError\u001b[0m: issubclass() arg 2 must be a class or tuple of classes"
+     ]
     }
    ],
    "source": [
@@ -1325,24 +1568,55 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 34,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2021-11-26T15:34:55.974746Z",
-     "iopub.status.busy": "2021-11-26T15:34:55.974205Z",
-     "iopub.status.idle": "2021-11-26T15:34:56.018229Z",
-     "shell.execute_reply": "2021-11-26T15:34:56.016461Z",
-     "shell.execute_reply.started": "2021-11-26T15:34:55.974704Z"
-    }
+     "iopub.execute_input": "2022-03-29T17:14:26.695988Z",
+     "iopub.status.busy": "2022-03-29T17:14:26.695478Z",
+     "iopub.status.idle": "2022-03-29T17:14:26.739781Z",
+     "shell.execute_reply": "2022-03-29T17:14:26.738349Z",
+     "shell.execute_reply.started": "2022-03-29T17:14:26.695949Z"
+    },
+    "tags": []
    },
    "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "() {} -> numpy.__dir__\n",
+      "-> numpy.__dir__ (in 103966 ns (0.0001 sec) -> ['zeros', 'diagflat', 'reciprocal', '__getattr__', 'PINF', 'UFUNC_BUFSIZE_DEFAULT', 'base_repr', 'greater_equal', 'rollaxis', 'sort', 'allclose', 'isin', 'save', 'Bytes0', 'signedinteger', 's_', 'put', 'diag_indices_from', 'hsplit', 'roots', 'shares_memory', 'equal', 'identity', 'add', 'nanquantile', 'Str0', 'lookfor', 'issubsctype', 'format_parser', 'TooHardError', 'DataSource', 'iinfo', 'dsplit', 'around', 'add_docstring', 'ma', 'recarray', 'reshape', 'infty', '_distributor_init', 'polyder', 'void0', 'os', '__doc__', 'array', 'warnings', 'argpartition', 'single', 'char', 'MAY_SHARE_BOUNDS', 'test', 'sometrue', 'inf', 'spacing', 'sctypeDict', 'atleast_1d', 'SHIFT_INVALID', 'load', 'transpose', 'mask_indices', 'put_along_axis', 'flatnonzero', 'False_', 'roll', 'nanmean', 'alen', 'promote_types', 'kernel_version', 'flip', '__loader__', 'source', 'Datetime64', 'mintypecode', 'product', 'ndfromtxt', 'linalg', 'longfloat', 'multiply', 'nanpercentile', 'SHIFT_DIVIDEBYZERO', '_version', 'repeat', 'longlong', 'tril', 'divmod', 'negative', 'add_newdoc_ufunc', 'str_', 'isfortran', 'logaddexp2', 'mod', 'min_scalar_type', 'ERR_DEFAULT', 'signbit', 'expand_dims', 'corrcoef', 'pad', 'geterrobj', 'radians', 'amax', 'indices', 'PZERO', 'array_equiv', 'True_', 'string_', 'asanyarray', 'nonzero', 'float32', 'ubyte', 'ScalarType', 'find_common_type', 'hamming', 'who', 'blackman', 'ones', 'divide', 'cov', 'cdouble', 'float_', 'ndim', 'format_float_scientific', 'diagonal', 'typecodes', 'void', 'convolve', 'FPE_DIVIDEBYZERO', 'setxor1d', 'finfo', 'RAISE', 'mkl', 'asmatrix', 'logaddexp', 'geterrcall', 'issubclass_', 'savetxt', '_globals', 'may_share_memory', 'append', 'take', '__cached__', 'broadcast_shapes', '_pytesttester', 'maximum_sctype', 'hanning', 'asfarray', 'copysign', 'datetime_as_string', 'clongfloat', 'triu_indices_from', 'broadcast_arrays', 'invert', 'cfloat', 'unravel_index', 'packbits', 'log2', 'uintc', 'arcsinh', 'ix_', 'newaxis', 'floating', 'absolute', 'meshgrid', 'little_endian', 'get_array_wrap', 'histogramdd', 'sinh', 'sqrt', 'greater', 'Uint64', '_financial_names', 'dstack', 'ogrid', 'rad2deg', '__mkl_version__', 'correlate', 'seterrobj', 'disp', 'tensordot', 'vstack', 'round', 'unpackbits', 'angle', 'choose', 'quantile', 'full_like', 'csingle', 'fmod', 'cbrt', 'bitwise_not', '_mat', 'bitwise_and', 'bincount', 'bmat', '__expired_functions__', 'polyfit', 'minimum', 'info', 'ravel_multi_index', 'expm1', 'trunc', 'bartlett', 'Infinity', 'datetime_data', '__git_version__', 'vdot', 'matmul', 'BUFSIZE', '__builtins__', 'array_equal', 'floor', 'nanmin', 'frompyfunc', 'clip', 'sum', 'polyint', 'i0', 'loads', 'log', 'float16', 'einsum', 'NZERO', 'polynomial', 'shape', 'fromstring', 'issctype', 'matrixlib', 'sctypes', 'nansum', 'where', 'polymul', 'delete', 'hypot', '__config__', 'cross', 'isscalar', 'vsplit', 'matrix', 'tanh', 'row_stack', 'int64', 'true_divide', 'savez', 'errstate', 'interp', 'nanstd', 'positive', 'asarray_chkfinite', 'all', 'histogram2d', 'diag_indices', 'apply_over_axes', 'nditer', 'sort_complex', 'ufunc', 'printoptions', 'sign', 'average', 'fliplr', 'nanprod', 'int0', 'fromiter', 'memmap', 'WRAP', 'array_str', 'intc', 'polysub', 'ndarray', 'alltrue', 'use_hugepage', 'nextafter', 'zeros_like', 'apply_along_axis', 'arctanh', 'cast', 'place', 'ascontiguousarray', 'deg2rad', 'tri', 'ceil', 'iscomplex', 'complex64', 'frombuffer', 'recfromtxt', '__package__', 'arange', 'datetime64', 'ushort', 'nanargmin', 'amin', 'log1p', 'sctype2char', 'squeeze', '_NoValue', 'argmin', 'ERR_LOG', 'euler_gamma', 'oldnumeric', 'can_cast', 'fix', 'Inf', 'is_busday', 'insert', 'MAXDIMS', 'asfortranarray', 'setbufsize', 'arctan', 'outer', 'argwhere', 'deprecate_with_doc', 'logical_not', 'CLIP', 'deprecate', 'isnan', 'bool8', 'clongdouble', 'intersect1d', 'mat', 'concatenate', 'ndenumerate', 'flipud', 'hstack', 'bytes_', 'isneginf', 'real_if_close', 'NaN', 'obj2sctype', 'getbufsize', 'inner', 'fromregex', 'compress', 'trapz', 'degrees', 'busday_count', 'SHIFT_OVERFLOW', 'fromfunction', 'fft', 'compat', 'logical_and', 'isinf', 'prod', 'index_exp', 'conjugate', 'isrealobj', 'searchsorted', 'histogram_bin_edges', 'ALLOW_THREADS', 'swapaxes', 'VisibleDeprecationWarning', 'copyto', 'bitwise_xor', 'uint0', 'atleast_2d', 'diag', 'unicode_', 'msort', 'dot', 'number', 'numarray', 'broadcast_to', 'trace', 'longdouble', '__version__', 'kaiser', 'result_type', 'poly1d', 'split', 'moveaxis', 'take_along_axis', 'rint', 'arctan2', 'format_float_positional', 'conj', 'object0', 'isclose', 'floor_divide', 'AxisError', 'float64', '__name__', 'get_include', 'byte_bounds', 'nan', 'atleast_3d', 'column_stack', 'count_nonzero', 'busday_offset', 'triu', 'cumsum', 'require', 'set_printoptions', 'full', 'fill_diagonal', 'tan', 'uint16', 'union1d', 'chararray', 'iscomplexobj', 'FPE_UNDERFLOW', 'flexible', 'arccos', 'isreal', 'ERR_CALL', 'nanvar', 'tile', 'ravel', 'array_repr', 'cumprod', 'lexsort', 'diff', 'modf', '__file__', 'std', 'Tester', 'eye', 'lcm', 'heaviside', 'lib', 'putmask', 'percentile', 'issubdtype', 'ediff1d', 'longcomplex', 'record', 'generic', 'geterr', 'iterable', 'nanmedian', 'int32', 'unsignedinteger', 'nan_to_num', 'uint8', 'safe_eval', 'math', 'mean', 'e', 'partition', 'NAN', 'double', 'arccosh', 'float_power', 'trim_zeros', 'log10', 'nancumsum', 'real', '_add_newdoc_ufunc', '__dir__', 'right_shift', 'busdaycalendar', 'sys', 'ModuleDeprecationWarning', 'copy', 'genfromtxt', 'array_split', 'less', 'FPE_OVERFLOW', 'ERR_WARN', 'inexact', 'isnat', 'uint64', 'complex256', 'imag', 'triu_indices', 'get_printoptions', 'complex128', 'MAY_SHARE_EXACT', 'add_newdoc', 'logspace', 'emath', 'extract', 'uint', 'seterr', 'fabs', 'block', 'ctypeslib', 'ERR_IGNORE', 'intp', 'subtract', 'median', 'round_', 'show_config', 'cosh', 'mgrid', 'compare_chararrays', 'NINF', 'square', 'nested_iters', 'digitize', 'size', 'pi', 'loadtxt', 'exp', 'FPE_INVALID', 'recfromcsv', 'sin', 'uintp', 'broadcast', 'power', 'piecewise', 'SHIFT_UNDERFLOW', 'fromfile', 'asscalar', 'binary_repr', 'argsort', 'set_numeric_ops', 'cumproduct', 'uint32', 'bool_', 'select', 'UFUNC_PYVALS_NAME', '__spec__', 'ldexp', 'int8', 'einsum_path', 'byte', 'fmin', 'ERR_PRINT', 'gradient', 'set_string_function', 'r_', 'min', 'polyadd', 'logical_xor', 'isposinf', 'poly', 'mafromtxt', 'c_', 'integer', 'random', '__NUMPY_SETUP__', 'tril_indices_from', 'core', 'stack', 'ulonglong', 'setdiff1d', 'left_shift', 'ndindex', 'ERR_RAISE', 'savez_compressed', '__deprecated_attrs__', 'maximum', 'singlecomplex', 'nbytes', 'cos', 'vander', 'common_type', 'dtype', 'nanargmax', 'vectorize', 'complexfloating', 'fastCopyAndTranspose', 'tril_indices', 'half', 'empty_like', 'FLOATING_POINT_SUPPORT', 'RankWarning', 'not_equal', 'rec', 'frexp', 'nancumprod', '__all__', 'testing', 'character', 'asarray', 'abs', 'ptp', 'array2string', 'timedelta64', 'flatiter', 'less_equal', 'int16', 'gcd', 'geomspace', 'tracemalloc_domain', 'histogram', 'complex_', 'polyval', 'nanmax', 'logical_or', 'unwrap', 'unique', 'in1d', 'typename', 'short', 'ComplexWarning', 'ones_like', 'exp2', 'isfinite', 'linspace', '__path__', 'bytes0', 'empty', 'var', 'int_', 'polydiv', 'float128', 'object_', 'resize', 'bitwise_or', '_UFUNC_API', 'seterrcall', 'remainder', 'fmax', 'max', 'sinc', 'MachAr', 'version', 'any', 'rot90', 'argmax', 'arcsin', 'str0', 'kron'] <class 'list'>\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_ipython_display_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_mimebundle_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_html_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_markdown_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_svg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_png_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_pdf_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_jpeg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_latex_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_json_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_javascript_',) {} -> numpy.__getattr__\n"
+     ]
+    },
     {
      "data": {
       "text/plain": [
        "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
       ]
      },
-     "execution_count": 20,
+     "execution_count": 34,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1350,7 +1624,7 @@
    "source": [
     "from beartype import beartype\n",
     "\n",
-    "np @ (use.isfunction, \"\", beartype)"
+    "use.apply_aspect(np, beartype)"
    ]
   },
   {
diff --git a/setup.py b/setup.py
index cc5daf9c..ef4f157d 100755
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,10 @@
 import os
 import sys
 
-from setuptools import find_packages, setup
+from pathlib import Path
+
+from setuptools import find_packages
+from setuptools import setup
 
 here = os.path.abspath(os.path.dirname(__file__))
 src = os.path.join(here, "src/use")
@@ -77,13 +80,14 @@
 )
 
 
-with open("README.md") as f:
-    LONG_DESCRIPTION = f.read()
-
+LONG_DESCRIPTION = Path("README.md").read_text()
 setup(
     packages=find_packages(where="src"),
-    package_dir={"": "src"},
+    package_dir={
+        "": "src",
+    },
     package_name="use",
+    include_package_data=True,
     long_description=LONG_DESCRIPTION,
     long_description_content_type="text/markdown",
     requires=requires,
diff --git a/src/use/__init__.py b/src/use/__init__.py
index 0793f29c..350b21f6 100755
--- a/src/use/__init__.py
+++ b/src/use/__init__.py
@@ -1,10 +1,13 @@
 """
 This is where the story begins. Welcome to JustUse!
 Only imports and project-global constants are defined here. 
+All superfluous imports are deleted to clean up the namespace - and thus help()
+
 """
 
 
 import sys
+from datetime import timezone
 
 if sys.version_info < (3, 9) and "tests" not in sys.modules:
     import gc
@@ -22,26 +25,30 @@
                 "__class_getitem__": classmethod(GenericAlias),
             }
         )
+    del (gc,)
+    del types
+    del typing
+    del ABCMeta
+    del Callable
+    del CellType
+    del GenericAlias
+
 
-import hashlib
 import os
 import tempfile
 from collections import namedtuple
 from datetime import datetime
 from enum import Enum, IntEnum
-from logging import DEBUG, basicConfig, getLogger
+from logging import basicConfig, getLogger
 from pathlib import Path
-from typing import NamedTuple
 from uuid import uuid4
-from warnings import catch_warnings, filterwarnings, simplefilter
+from warnings import catch_warnings, filterwarnings
 
-import toml
 from beartype import beartype
 from beartype.roar import BeartypeDecorHintPep585DeprecationWarning
 
-from use.pydantics import Configuration
-
 sessionID = uuid4()
+del uuid4
 
 home = Path(os.getenv("JUSTUSE_HOME", str(Path.home() / ".justuse-python")))
 
@@ -51,10 +58,16 @@
     # this should fix the permission issues on android #80
     home = tempfile.mkdtemp(prefix="justuse_")
 
+import toml
+
 (home / "config.toml").touch(mode=0o755, exist_ok=True)
 config_dict = toml.load(home / "config.toml")
+del toml
+
+from use.pydantics import Configuration
 
 config = Configuration(**config_dict)
+del Configuration
 
 config.logs.mkdir(mode=0o755, parents=True, exist_ok=True)
 config.packages.mkdir(mode=0o755, parents=True, exist_ok=True)
@@ -68,7 +81,7 @@
 
 def fraction_of_day(now: datetime = None) -> float:
     if now is None:
-        now = datetime.utcnow()
+        now = datetime.now(timezone.utc)
     return round(
         (
             now.hour / 24
@@ -87,7 +100,7 @@ def fraction_of_day(now: datetime = None) -> float:
     format="%(asctime)s %(levelname)s %(name)s %(message)s",
     datefmt=f"%Y%m%d {fraction_of_day()}",
     # datefmt="%Y-%m-%d %H:%M:%S",
-    level=DEBUG,
+    level=config.debug_level,
 )
 
 # !!! SEE NOTE !!!
@@ -95,7 +108,7 @@ def fraction_of_day(now: datetime = None) -> float:
 # current use __version__ variable **AS A STRING LITERAL** from
 # this file. If you do anything except updating the version,
 # please check that setup.py can still be executed.
-__version__ = "0.7.1"
+__version__ = "0.7.5"
 # for tests
 __version__ = os.getenv("USE_VERSION", __version__)
 __name__ = "use"
@@ -145,48 +158,50 @@ class InstallationError(ImportError, JustuseIssue):
 
     filterwarnings("ignore", category=BeartypeDecorHintPep585DeprecationWarning, module="beartype")
 
-    from use.hash_alphabet import *
 
-    ModInUse = namedtuple("ModInUse", "name mod path spec frame")
+import hashlib
+
+
+class Hash(Enum):
+    sha256 = hashlib.sha256
+    blake = hashlib.blake2s
+
 
-    class Hash(Enum):
-        sha256 = hashlib.sha256
-        blake = hashlib.blake2s
+del hashlib
 
-    class Modes(IntEnum):
-        auto_install = 2**0
-        fatal_exceptions = 2**1
-        reloading = 2**2
-        no_public_installation = 2**3
-        fastfail = 2**4
-        recklessness = 2**5
-        no_browser = 2**6
-        no_cleanup = 2**7
+
+class Modes(IntEnum):
+    auto_install = 2**0
+    fatal_exceptions = 2**1
+    reloading = 2**2
+    no_public_installation = 2**3
+    fastfail = 2**4
+    recklessness = 2**5
+    no_browser = 2**6
+    no_cleanup = 2**7
 
 
-from use.aspectizing import *
 from use.aspectizing import apply_aspect
 from use.buffet_old import buffet_table
-from use.main import *
-from use.messages import *
-
-### NEEDED FOR TESTS!! ###
-from use.pimp import *
-from use.pimp import _get_data_from_pypi, _get_version, _is_version_satisfied, _parse_name, get_supported
-from use.pydantics import *
-from use.tools import *
+from use.main import ProxyModule, Use, test_version
+from use.pydantics import Version
 
 for member in Modes:
     setattr(Use, member.name, member.value)
 
 use = Use()
 
+del os
 use.__dict__.update(dict(globals()))
 use = ProxyModule(use)
+if not test_version:
+    sys.modules["use"] = use
+
+del test_version
+del use.__dict__["test_version"]
+del sys
+del use.__dict__["sys"]
 
 with catch_warnings():
     filterwarnings("ignore", category=BeartypeDecorHintPep585DeprecationWarning, module="beartype")
     # apply_aspect(use, beartype, check=isbeartypeable, pattern="")
-
-if not test_version:
-    sys.modules["use"] = use
diff --git a/src/use/main.py b/src/use/main.py
index adc48f01..f39a4ab1 100755
--- a/src/use/main.py
+++ b/src/use/main.py
@@ -15,6 +15,7 @@
 import threading
 import time
 import traceback
+from collections import namedtuple
 from collections.abc import Callable
 from datetime import datetime
 from logging import DEBUG, INFO, NOTSET, getLogger, root
@@ -32,7 +33,6 @@
     AmbiguityWarning,
     Hash,
     Modes,
-    ModInUse,
     NotReloadableWarning,
     NoValidationWarning,
     UnexpectedHash,
@@ -43,18 +43,16 @@
     home,
     sessionID,
 )
-from use.aspectizing import apply_aspect
+from use.aspectizing import _applied_decorators, apply_aspect
 from use.hash_alphabet import JACK_as_num, is_JACK, num_as_hexdigest
 from use.messages import KwargMessage, StrMessage, TupleMessage, UserMessage
-from use.pimp import _build_mod, _ensure_path, _fail_or_default, _parse_name
+from use.pimp import _build_mod, _ensure_path, _fail_or_default, _parse_name, _real_path
 from use.pydantics import Version
 from use.tools import methdispatch
-from use.aspectizing import _applied_decorators
 
 log = getLogger(__name__)
 
 # internal subpackage imports
-test_config: str = locals().get("test_config", {})
 test_version: str = locals().get("test_version", None)
 
 _reloaders: dict["ProxyModule", "ModuleReloader"] = {}  # ProxyModule:Reloader
@@ -70,6 +68,8 @@ def _release_locks():
 
 atexit.register(_release_locks)
 
+ModInUse = namedtuple("ModInUse", "name mod path spec")
+
 
 class ProxyModule(ModuleType):
     def __init__(self, mod):
@@ -358,9 +358,9 @@ def delete_folder(path):
                 self.del_entry(name, version)
         self.registry.connection.commit()
 
-    def _set_mod(self, *, name, mod, frame, path=None, spec=None):
+    def _set_mod(self, *, name, mod, path=None, spec=None):
         """Helper to get the order right."""
-        self._using[name] = ModInUse(name, mod, path, spec, frame)
+        self._using[name] = ModInUse(name, mod, path, spec)
 
     @methdispatch
     def __call__(self, thing, /, *args, **kwargs):
@@ -412,7 +412,7 @@ def _use_url(
             return _fail_or_default(ImportError(exc), default)
 
         frame = inspect.getframeinfo(inspect.currentframe())
-        self._set_mod(name=name, mod=mod, frame=frame)
+        self._set_mod(name=name, mod=mod)
         if as_import:
             sys.modules[as_import] = mod
         return ProxyModule(mod)
@@ -423,7 +423,6 @@ def _use_path(
         path,
         /,
         *,
-        package_name=None,
         initial_globals=None,
         as_import: str = None,
         default=Modes.fastfail,
@@ -450,153 +449,73 @@ def _use_path(
 
         exc = None
         mod = None
+        original_cwd = Path.cwd()
 
         if path.is_dir():
             return _fail_or_default(ImportError(f"Can't import directory {path}"), default)
 
-        original_cwd = source_dir = Path.cwd()
         try:
-            # calling from another use()d module
-            # let's see where we started
-            main_mod = __import__("__main__")
-            # there are a number of ways to call use() from a non-use() starting point
-            # let's first check if we are running in jupyter
-            jupyter = "ipykernel" in sys.modules
-            # we're in jupyter, we use the CWD as set in the notebook
-            if not jupyter and hasattr(main_mod, "__file__"):
-                # problem: user wants to use.Path("some_file_in_the_same_dir")
-                # so we have to figure out where the file of the calling function is.
-                # but the *calling* function could also be a decorator, living completely elsewhere
-                # so we have to figure out whether we're being called by a decorator first.
-                # We use use.__call__ as landmark, because that's the official entry point
-                # and we can count on it being called. From there we need to check whether it was aspectized.
-                # If it was, we need to skip those decorators before finally get to the user code and
-                # we can actually see from where we've been called.
-                frame = inspect.currentframe()
-                while True:
-                    if frame.f_code == Use.__call__.__code__:
-                        break
-                    else:
-                        frame = frame.f_back
-                # a few more steps..
-                for x in _applied_decorators:
-                    frame = frame.f_back
-                try:
-                    # frame is in __call__ (or the last decorator we control), we need to step one more frame back
-                    source_dir = Path(frame.f_back.f_code.co_filename).resolve().parent
-                # we are being called from a shell like thonny, so we have to assume cwd
-                except OSError:
-                    source_dir = Path.cwd()
-
-            if source_dir is None:
-                if main_mod.__loader__ and hasattr(main_mod.__loader__, "path"):
-                    source_dir = _ensure_path(main_mod.__loader__.path).parent
-                else:
-                    source_dir = Path.cwd()
-            if not source_dir.joinpath(path).exists():
-                if files := [*[*source_dir.rglob(f"**/{path}")]]:
-                    source_dir = _ensure_path(files[0]).parent
-                else:
-                    source_dir = Path.cwd()
-            if not source_dir.exists():
-                return _fail_or_default(
-                    NotImplementedError("Can't determine a relative path from a virtual file."),
-                    default,
-                )
-            if not path.exists():
-                path = source_dir.joinpath(path).resolve()
-            if not path.exists():
-                return _fail_or_default(ImportError(f"Sure '{path}' exists?"), default)
-            if not path.is_absolute():
-                path = path.resolve()
-            try:
-                name = path.relative_to(source_dir)
-            except ValueError:
-                source_dir = path.parent
-                os.chdir(source_dir)
-                name = path.relative_to(source_dir)
-            ext = name.as_posix().rpartition(".")[-1]
-            name_as_path_with_ext = name.as_posix()
-            name_as_path = name_as_path_with_ext[: -len(ext) - (1 if ext else 0)]
-            name = name_as_path.replace("/", ".")
-            name_parts = name.split(".")
-            package_name = package_name or ".".join(name_parts[:-1])
-            module_name = path.stem  # sic!
-            if reloading:
-                try:
-                    with open(path, "rb") as rfile:
-                        code = rfile.read()
-                    # initial instance, if this doesn't work, just throw the towel
-                    mod = _build_mod(
-                        module_name=module_name,
-                        code=code,
-                        initial_globals=initial_globals,
-                        module_path=path.resolve(),
-                        package_name=package_name,
-                    )
-                except KeyError:
-                    exc = traceback.format_exc()
-                if exc:
-                    return _fail_or_default(ImportError(exc), default)
-                mod = ProxyModule(mod)
-                reloader = ModuleReloader(
-                    proxy=mod,
-                    name=name,
-                    path=path,
-                    initial_globals=initial_globals,
-                    package_name=package_name,
-                )
-                _reloaders[mod] = reloader
+            name, module_name, package_name, path = _real_path(
+                path=path, _applied_decorators=_applied_decorators, landmark=Use.__call__.__code__
+            )
+        except (NotImplementedError, ImportError):
+            exc = traceback.format_exc()
 
-                threaded = False
-                # this looks like a hack, but isn't one -
-                # jupyter is running an async loop internally, which works better async than threaded!
-                try:
-                    asyncio.get_running_loop()
-                # we're dealing with non-async code, we need threading
-                except RuntimeError:
-                    # can't have the code inside the handler because of "during handling of X, another exception Y happened"
-                    threaded = True
-                if not threaded:
-                    reloader.start_async()
-                else:
-                    reloader.start_threaded()
-
-                if not all(
-                    inspect.isfunction(value)
-                    for key, value in mod.__dict__.items()
-                    if key not in initial_globals.keys() and not key.startswith("__")
-                ):
-                    warn(UserMessage.not_reloadable(name), NotReloadableWarning)
-            else:  # NOT reloading
-                with open(path, "rb") as rfile:
-                    code = rfile.read()
-                # the path needs to be set before attempting to load the new module - recursion confusing ftw!
-                frame = inspect.getframeinfo(inspect.currentframe())
-                self._set_mod(name=module_name, mod=mod, frame=frame)
-                try:
-                    mod = _build_mod(
-                        module_name=module_name,
-                        code=code,
-                        initial_globals=initial_globals,
-                        module_path=path,
-                        package_name=package_name,
-                    )
-                except KeyError:
-                    del self._using[name]
-                    exc = traceback.format_exc()
+        with open(path, "rb") as rfile:
+            code = rfile.read()
+        try:
+            mod = _build_mod(
+                module_name=module_name,
+                code=code,
+                initial_globals=initial_globals,
+                module_path=path,
+                package_name=package_name,
+            )
         except KeyError:
             exc = traceback.format_exc()
-        finally:
-            # let's not confuse the user and restore the cwd to the original in any case
-            os.chdir(original_cwd)
+        if exc:
+            return _fail_or_default(exc, default)
+        mod = ProxyModule(mod)
+
+        if reloading:
+            reloader = ModuleReloader(
+                proxy=mod,
+                name=name,
+                path=path,
+                initial_globals=initial_globals,
+                package_name=package_name,
+            )
+            _reloaders[mod] = reloader
+
+            threaded = False
+            # this looks like a hack, but isn't one -
+            # jupyter is running an async loop internally, which works better async than threaded!
+            try:
+                asyncio.get_running_loop()
+            # we're dealing with non-async code, we need threading
+            except RuntimeError:
+                # can't have the code inside the handler because of "during handling of X, another exception Y happened"
+                threaded = True
+            if not threaded:
+                reloader.start_async()
+            else:
+                reloader.start_threaded()
+
+            if not all(
+                inspect.isfunction(value)
+                for key, value in mod.__dict__.items()
+                if key not in initial_globals.keys() and not key.startswith("__")
+            ):
+                warn(UserMessage.not_reloadable(name), NotReloadableWarning)
+
+        os.chdir(original_cwd)
         if exc:
             return _fail_or_default(ImportError(exc), default)
+
         if as_import:
             sys.modules[as_import] = mod
-        frame = inspect.getframeinfo(inspect.currentframe())
-        self._set_mod(name=name, mod=mod, frame=frame)
-        return ProxyModule(mod)
+        self._set_mod(name=name, mod=mod)
+        return mod
 
     @__call__.register(type(None))  # singledispatch is picky - can't be anything but a type
     def _use_kwargs(
@@ -809,6 +728,5 @@ def _use_package(
             return _fail_or_default(result, default)
 
         if isinstance(result, ModuleType):
-            frame = inspect.getframeinfo(inspect.currentframe())
-            self._set_mod(name=name, mod=result, spec=spec, frame=frame)
+            self._set_mod(name=name, mod=result, spec=spec)
             return ProxyModule(result)
diff --git a/src/use/pimp.py b/src/use/pimp.py
index d689e8ea..c6912bc9 100755
--- a/src/use/pimp.py
+++ b/src/use/pimp.py
@@ -3,10 +3,10 @@
 """
 
 
-
 import codecs
 import contextlib
 import importlib.util
+import inspect
 import linecache
 import os
 import platform
@@ -31,8 +31,7 @@
 from sqlite3 import Cursor
 from subprocess import CalledProcessError, run
 from types import ModuleType
-from typing import (Any, Iterable, Optional, Protocol, TypeVar, Union,
-                    runtime_checkable)
+from typing import Any, Iterable, Optional, Protocol, TypeVar, Union, runtime_checkable
 from warnings import catch_warnings, filterwarnings, warn
 
 import furl
@@ -44,11 +43,9 @@
 from packaging import tags
 from packaging.specifiers import SpecifierSet
 
-from use import (Hash, InstallationError, Modes, UnexpectedHash,
-                 VersionWarning, config, sessionID)
+from use import Hash, InstallationError, Modes, UnexpectedHash, VersionWarning, config, sessionID
 from use.hash_alphabet import JACK_as_num, hexdigest_as_JACK, num_as_hexdigest
-from use.messages import (UserMessage, _web_pebkac_no_hash,
-                          _web_pebkac_no_version_no_hash)
+from use.messages import UserMessage, _web_pebkac_no_hash, _web_pebkac_no_version_no_hash
 from use.pydantics import PyPI_Project, PyPI_Release, RegistryEntry, Version
 from use.tools import pipes
 
@@ -127,12 +124,10 @@ def get_supported() -> frozenset[PlatformTag]:  # cov: exclude
                 from pip._internal.models.target_python import get_supported
         if not get_supported:
             with contextlib.suppress(ImportError):
-                from pip._internal.utils.compatibility_tags import \
-                    get_supported
+                from pip._internal.utils.compatibility_tags import get_supported
         if not get_supported:
             with contextlib.suppress(ImportError):
-                from pip._internal.resolution.resolvelib.factory import \
-                    get_supported
+                from pip._internal.resolution.resolvelib.factory import get_supported
     get_supported = get_supported or (lambda: [])
 
     items: list[PlatformTag] = [PlatformTag(platform=tag.platform) for tag in get_supported()]
@@ -858,7 +853,6 @@ def _is_platform_compatible(
         f"py{tags.interpreter_version()}",
     }
 
-
     if info.platform_tag:
         given_platform_tags = info.platform_tag.split(".") << map(PlatformTag) >> frozenset
     else:
@@ -973,3 +967,72 @@ def _fail_or_default(exception: BaseException, default: Any):
 #         proj = _filter_by_version(proj, version)
 
 #     _web_pebkac_no_hash(package_name=package_name, version=version, name=name, project=proj)
+
+
+def _real_path(*, path: Path, _applied_decorators: dict, landmark) -> tuple[str, str, str, Path]:
+    source_dir = Path.cwd()
+    # calling from another use()d module
+    # let's see where we started
+    main_mod = __import__("__main__")
+    # there are a number of ways to call use() from a non-use() starting point
+    # let's first check if we are running in jupyter
+    jupyter = "ipykernel" in sys.modules
+    # we're in jupyter, we use the CWD as set in the notebook
+    if not jupyter and hasattr(main_mod, "__file__"):
+        # problem: user wants to use.Path("some_file_in_the_same_dir")
+        # so we have to figure out where the file of the calling function is.
+        # but the *calling* function could also be a decorator, living completely elsewhere
+        # so we have to figure out whether we're being called by a decorator first.
+        # We use use.__call__ as landmark, because that's the official entry point
+        # and we can count on it being called. From there we need to check whether it was aspectized.
+        # If it was, we need to skip those decorators before finally get to the user code and
+        # we can actually see from where we've been called.
+        frame = inspect.currentframe()
+        while True:
+            if frame.f_code == landmark:
+                break
+            else:
+                frame = frame.f_back
+        # a few more steps..
+        for x in _applied_decorators:
+            frame = frame.f_back
+        try:
+            # frame is in __call__ (or the last decorator we control), we need to step one more frame back
+            source_dir = Path(frame.f_back.f_code.co_filename).resolve().parent
+        # we are being called from a shell like thonny, so we have to assume cwd
+        except OSError:
+            source_dir = Path.cwd()
+
+    if source_dir is None:
+        if main_mod.__loader__ and hasattr(main_mod.__loader__, "path"):
+            source_dir = _ensure_path(main_mod.__loader__.path).parent
+        else:
+            source_dir = Path.cwd()
+    if not source_dir.joinpath(path).exists():
+        if files := [*[*source_dir.rglob(f"**/{path}")]]:
+            source_dir = _ensure_path(files[0]).parent
+        else:
+            source_dir = Path.cwd()
+    if not source_dir.exists():
+        raise NotImplementedError("Can't determine a relative path from a virtual file.")
+    if not path.exists():
+        path = source_dir.joinpath(path).resolve()
+    if not path.exists():
+        raise ImportError(f"Sure '{path}' exists?")
+    if not path.is_absolute():
+        path = path.resolve()
+    try:
+        name = path.relative_to(source_dir)
+    except ValueError:
+        source_dir = path.parent
+        os.chdir(source_dir)
+        name = path.relative_to(source_dir)
+    ext = name.as_posix().rpartition(".")[-1]
+    name_as_path_with_ext = name.as_posix()
+    name_as_path = name_as_path_with_ext[: -len(ext) - (1 if ext else 0)]
+    name = name_as_path.replace("/", ".")
+    name_parts = name.split(".")
+    package_name = ".".join(name_parts[:-1])
+    module_name = path.stem  # sic!
+
+    return name, module_name, package_name, path
diff --git a/src/use/pydantics.py b/src/use/pydantics.py
index 44500dec..c4bf81b9 100644
--- a/src/use/pydantics.py
+++ b/src/use/pydantics.py
@@ -3,11 +3,15 @@
 """
 import os
 import re
+
+from logging import INFO
 from logging import getLogger
 from pathlib import Path
-from typing import Optional, Union
+from typing import Optional
+from typing import Union
 
 import packaging
+
 from packaging.version import Version as PkgVersion
 from pydantic import BaseModel
 
@@ -24,6 +28,7 @@ def __repr__(self):
 
 
 class Configuration(BaseModel):
+    debug_level: int = INFO  # 20
     version_warning: bool = True
     no_browser: bool = False
     disable_jack: bool = bool(int(os.getenv("DISABLE_JACK", "0")))
@@ -45,11 +50,11 @@ class Config:
 
 
 class Version(PkgVersion):
-    def __new__(cls, *args, **kwargs):
+    def __new__(self, *args, **kwargs):
         if args and isinstance(args[0], Version):
             return args[0]
         else:
-            return super(cls, Version).__new__(cls)
+            return super(self, Version).__new__(self)
 
     def __init__(self, versionobj: Optional[Union[PkgVersion, str]] = None, *, major=0, minor=0, patch=0):
         if isinstance(versionobj, Version):


Test patch:
diff --git a/src/.test6.py b/src/.test6.py
index 5889734d..d7979689 100644
--- a/src/.test6.py
+++ b/src/.test6.py
@@ -1,7 +1,3 @@
-class Test:
-    def __init__(self, x):
-        self.x = x
-
-    def foo(self):
-        return self.x
+import use
 
+mod = use(use.Path("../tests/.tests/modE.py"))
diff --git a/src/.test8.py b/src/.test8.py
index 51c79eda..4eab8319 100644
--- a/src/.test8.py
+++ b/src/.test8.py
@@ -1,6 +1,143 @@
+import inspect
+from typing import Any, get_args, get_origin
+from numbers import Number, Complex, Real, Rational, Integral
+from collections.abc import Sequence
+from itertools import zip_longest
+from warnings import warn
+import typing
+import collections
 
-hits = {1,2,3}
 
+def test1(a, b, *, y:float, x:str):
+    return x
 
-print(list(hits))
-    
\ No newline at end of file
+def test2(a, b, *, x: str, y:float):
+    return x
+
+def test3(x: float):
+    return x
+
+def test4(x: int):
+    return x
+
+def test5(x: Sequence[int]):
+    return x
+
+def test6(x: list[int]):
+    return x
+
+def test7(x: typing.Sequence):
+    return x
+
+def test8(x: Sequence):
+    return x
+
+numerics = [bool, Integral, Rational, Real, Complex]
+
+class NotComparableWarning(UserWarning):
+    pass
+
+def is_compatible(pre, post):
+    sig = inspect.signature(pre)
+    pre_sig = []
+    # first separate args and kwargs so we can sort kwargs alphabetically
+    args = []
+    kwargs = []
+    
+    for k, v in sig.parameters.items():
+        if v.kind is v.VAR_KEYWORD or v.POSITIONAL_OR_KEYWORD:
+            kwargs.append((k,v))
+        else:
+            args.append((k,v))
+    
+    for k, v in args:
+        v = v.annotation
+        pre_sig.append(v if v is not inspect._empty else Any)
+    
+    for k, v in sorted(kwargs):
+        v = v.annotation
+        pre_sig.append(v if v is not inspect._empty else Any)
+        
+    v = sig.return_annotation
+    pre_sig.append(v if v is not inspect._empty else Any)
+    
+    sig = inspect.signature(post)
+    post_sig = []
+    
+    args = []
+    kwargs = []
+    
+    for k, v in sig.parameters.items():
+        if v.kind is v.VAR_KEYWORD or v.POSITIONAL_OR_KEYWORD:
+            kwargs.append((k,v))
+        else:
+            args.append((k,v))
+    
+    for k, v in args:
+        v = v.annotation
+        post_sig.append(v if v is not inspect._empty else Any)
+    
+    for k, v in sorted(kwargs):
+        v = v.annotation
+        post_sig.append(v if v is not inspect._empty else Any)
+    
+    v = sig.return_annotation
+    post_sig.append(v if v is not inspect._empty else Any)
+        
+    def check(x, y):
+        print(f"checking {x} {type(x)} => {y} {type(y)}")
+        if x is Any:
+            return True
+        if y is Any:
+            return False
+        # let's first check if we're dealing with numbers
+        try:
+            if issubclass(x, Number) and issubclass(y, Number):
+                # since the generic implementations aren't actual subclasses of each other
+                # we have to map to the numeric tower classes
+                for X in numerics:
+                    if issubclass(x, X):
+                        break
+                x = X
+                for Y in numerics:
+                    if issubclass(y, Y):
+                        break
+                y = Y
+        except TypeError:  # issubclass is allergic to container classes (types.GenericAlias)
+            pass
+
+        # the other important type hierarchy are containers
+        # let's check if the user is using typing classes and educate them to use collections.abc instead
+        if x.__module__ == "typing":
+            x = getattr(collections.abc, str(x).split(".")[-1])
+            warn(NotComparableWarning(f"{x} is of a type from the typing module, which can't be compared. Please use a type from collections.abc instead."))
+        if y.__module__ == "typing":
+            y = getattr(collections.abc, str(y).split(".")[-1])
+            warn(NotComparableWarning(f"{y} is of a type from the typing module, which can't be compared. Please use a type from collections.abc instead.")) 
+
+        X = get_origin(x)
+        Y = get_origin(y)
+        if X is not None and Y is not None:
+                    # (Sequence => list) is OK, (list => Sequence) is NOK
+            return (
+                all(
+                    check(x_, y_)
+                    for x_, y_ in zip_longest(
+                        get_args(x), get_args(y), fillvalue=Any
+                    )
+                )
+                if issubclass(Y, X)
+                else False
+            )
+
+        try:
+            # (x => y) where y is not a subclass of x is NOK
+            return issubclass(y, x)
+        except TypeError:  # (int => list[int]) or (list[int] => int) NOK
+            return False
+
+    return all(check(x, y) for x, y in zip_longest(pre_sig, post_sig, fillvalue=Any))
+        
+#print(is_compatible(test1, test2))
+#print(is_compatible(test5, test6))
+print(is_compatible(test1, test2))
diff --git a/tests/.tests/.test2.py b/tests/.tests/.test2.py
index 00d46f57..a5f39912 100644
--- a/tests/.tests/.test2.py
+++ b/tests/.tests/.test2.py
@@ -1,7 +1,8 @@
 from time import perf_counter_ns
-from statistics import mean, stdev, median
+from statistics import geometric_mean, stdev, median
 from enum import Enum, IntEnum
 
+from time import sleep
 import numpy as np
 import sys
 
@@ -169,7 +170,7 @@ def test_gauss():
 def test_gaussmf():
     return [gaussmf(x, 0, 10) for x in random_vars]
 
-from time import sleep
+
 test_funcs = [
     lambda: list({}),
     lambda: list({1: 2}),
@@ -177,28 +178,55 @@ def test_gaussmf():
     lambda: [3, 3, 4],
     lambda: [],
     lambda: list({0, 1, 2, 3, ...}),
-    lambda: list({3, 9, 9}),
+    lambda: list({3, 9}),
     lambda: list(set()),
     lambda: [],
     lambda: [1, 2, 1, 1],
     lambda: sleep(0.5),
 ]
 
+
+from collections import defaultdict
+import inspect
+
+
+foo = defaultdict(int)
+foo["hello"] = 1
+foo["world"] = 2
+def test_dict1():
+    return dict(foo)
+
+def test_dict2():
+    return {**foo}
+
+def test_bool1():
+    return not not foo
+
+def test_bool2():
+    return bool(foo)
+
+
+def test_tuple():
+    return 3 in {1, 3}
+
+def test_set():
+    return 3 in {1,3}
+
 def timeit(func):
     res = []
-    for _ in range(100):
+    for _ in range(10_000_000):
         before = perf_counter_ns()
         func()
-        res.append(perf_counter_ns() - before)
-    for f in (min, mean, median, stdev):
+        after = perf_counter_ns()
+        res.append(after - before)
+    print("####################")
+    print(inspect.getsource(func))
+    for f in (min, geometric_mean, median, stdev):
         print(f.__name__, f"{f(res)} ns ({round(f(res)/10**9,5)} s)")
     return res
 
 
-import inspect
+test_funcs = [test_tuple, test_set]
 
 for f in test_funcs:
-    print("####################")
-    print(inspect.getsource(f))
-    timeit(f)
-    
\ No newline at end of file
+    timeit(f)
\ No newline at end of file
diff --git a/tests/.tests/.test3.py b/tests/.tests/.test3.py
index 92cc3e76..2a89caf7 100644
--- a/tests/.tests/.test3.py
+++ b/tests/.tests/.test3.py
@@ -1,1 +1,1 @@
-print("FOO!")
\ No newline at end of file
+print("adsf".translate({ord("a"): ord("b")}))
\ No newline at end of file
diff --git a/tests/test.py b/tests/test.py
index 37bf1734..9ab79a9c 100644
--- a/tests/test.py
+++ b/tests/test.py
@@ -1,12 +1,4 @@
-import os
+s = 'abcdefgabcd'
+set(s)
 
-from pathlib import Path
-
-here = Path()
-os.chdir(Path(__file__).resolve().parent / "../src/")
-
-import use
-
-mod = use("pip")
-
-os.chdir(here)
+print(''.join(x for x in s if x not in set(s)))
\ No newline at end of file
diff --git a/tests/unit_test.py b/tests/unit_test.py
index 7de5f3cf..609dc582 100755
--- a/tests/unit_test.py
+++ b/tests/unit_test.py
@@ -35,9 +35,8 @@
 
 from use import auto_install, fatal_exceptions, no_cleanup, use
 from use.aspectizing import _unwrap, _wrap
-from use.hash_alphabet import (JACK_as_num, hexdigest_as_JACK, is_JACK,
-                               num_as_hexdigest)
-from use.pimp import _parse_name
+from use.hash_alphabet import JACK_as_num, hexdigest_as_JACK, is_JACK, num_as_hexdigest
+from use.pimp import _get_data_from_pypi, _is_version_satisfied, _parse_name
 from use.pydantics import JustUse_Info, PyPI_Project, PyPI_Release, Version
 
 log = logging.getLogger(".".join((__package__, __name__)))
@@ -227,7 +226,7 @@ def test_is_version_satisfied(reuse):
         "yanked": False,
         "yanked_reason": None,
     }
-    assert reuse._is_version_satisfied(info.get("requires_python", ""), sys_version)
+    assert _is_version_satisfied(info.get("requires_python", ""), sys_version)
 
     # requires >= python 4!
     info = {
@@ -250,7 +249,7 @@ def test_is_version_satisfied(reuse):
         "yanked": False,
         "yanked_reason": None,
     }
-    assert False == reuse._is_version_satisfied(info.get("requires_python", ""), reuse.Version(sys_version))
+    assert False == _is_version_satisfied(info.get("requires_python", ""), reuse.Version(sys_version))
 
     # pure python
     info = {
@@ -273,11 +272,11 @@ def test_is_version_satisfied(reuse):
         "yanked": False,
         "yanked_reason": None,
     }
-    assert reuse._is_version_satisfied(info.get("requires_python", ""), sys_version)
+    assert _is_version_satisfied(info.get("requires_python", ""), sys_version)
 
 
 def test_find_windows_artifact(reuse):
-    assert reuse.Version("3.17.3") in reuse._get_data_from_pypi(package_name="protobuf").releases
+    assert reuse.Version("3.17.3") in _get_data_from_pypi(package_name="protobuf").releases
 
 
 def test_classic_import_same_version(reuse):
@@ -410,7 +409,7 @@ def test_85_pywt_jupyter_ubuntu_case1010(reuse, name, version, hashes):
 
 
 def test_387_usepath_filename(reuse):
-    mod = use(use.Path(".file_for_test387.py"))
+    mod = use(use.Path(".tests/.file_for_test387.py"))
     assert mod
 
 
@@ -473,8 +472,8 @@ def test_use_version_upgrade_warning(reuse):
         )
         match = re.search(r"(?P<category>[a-zA-Z_]+): " r"(?:(?!\d).)* (?P<version>\d+\.\d+\.\d+)", output)
         assert match
-        assert match.group("category") == use.VersionWarning.__name__
-        assert match.group("version") == str(version)
+        assert match["category"] == use.VersionWarning.__name__
+        assert match["version"] == str(version)
 
 
 def test_fraction_of_day(reuse):