From 857af8e31007ee3a03d6f5d6a70ae0926c758e5e Mon Sep 17 00:00:00 2001 From: Michael Aydinbas Date: Sun, 29 Oct 2023 01:40:40 +0200 Subject: [PATCH] refactor code to implement new config; correct tests --- nb/00_Setup.ipynb | 23 +- nb/01_Databases.ipynb | 8 +- nb/cache.ipynb | 20 +- nb/cube.ipynb | 17 +- nb/table.ipynb | 486 ++---------------------------------- src/pystatis/__init__.py | 8 + src/pystatis/cache.py | 39 ++- src/pystatis/config.py | 37 +-- src/pystatis/db.py | 22 +- src/pystatis/helloworld.py | 7 +- src/pystatis/http_helper.py | 14 +- src/pystatis/profile.py | 11 +- tests/test_cache.py | 24 +- tests/test_config.py | 146 +++++------ 14 files changed, 213 insertions(+), 649 deletions(-) diff --git a/nb/00_Setup.ipynb b/nb/00_Setup.ipynb index 7d23bf8..510e65d 100644 --- a/nb/00_Setup.ipynb +++ b/nb/00_Setup.ipynb @@ -17,9 +17,10 @@ "metadata": {}, "outputs": [], "source": [ + "\n", "import dotenv\n", "import pystatis\n", - "import pystatis.config\n", + "from pystatis.config import get_supported_db, config\n", "\n", "print(\"pystatis version: \", pystatis.__version__)\n", "dotenv.load_dotenv()" @@ -32,7 +33,7 @@ "metadata": {}, "outputs": [], "source": [ - " # only execute if you want to delete your config file for test purposes\n", + "# only execute if you want to delete your config file for test purposes\n", "pystatis.config.delete_config()\n", "pystatis.config.init_config()" ] @@ -86,20 +87,12 @@ "source": [ "from pprint import pprint\n", "\n", - "config = pystatis.config.load_config()\n", - "\n", - "for db in pystatis.config.get_supported_db():\n", - " for field in [\"username\", \"password\"]:\n", - " print(f\"{db} {field}: {config[db][field]}\")" + "for db in get_supported_db():\n", + " print(\"Database: \", db)\n", + " for k, v in config[db].items():\n", + " print(k, v)\n", + " print()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "faa25df3", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/nb/01_Databases.ipynb b/nb/01_Databases.ipynb index 9feefd9..b2534a5 100644 --- a/nb/01_Databases.ipynb +++ b/nb/01_Databases.ipynb @@ -25,6 +25,7 @@ "metadata": {}, "outputs": [], "source": [ + "# expected to fail!\n", "pystatdb.set_db(\"test\")" ] }, @@ -47,13 +48,6 @@ "pystatdb.set_db(\"zensus\")\n", "logincheck()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/nb/cache.ipynb b/nb/cache.ipynb index 474b9c6..9552b64 100644 --- a/nb/cache.ipynb +++ b/nb/cache.ipynb @@ -11,18 +11,18 @@ "logging.basicConfig(level=logging.INFO)\n", "\n", "import pystatis\n", - "from pystatis import Cube, Table, init_config, clear_cache" + "from pystatis import Cube, Table, clear_cache\n", + "from pystatis.db import set_db" ] }, { "cell_type": "code", "execution_count": null, - "id": "6c4b965e", + "id": "5c944d20", "metadata": {}, "outputs": [], "source": [ - "# only run this if you haven't done so earlier\n", - "# init_config()" + "set_db(\"genesis\")" ] }, { @@ -34,7 +34,7 @@ "source": [ "# first, let's download two data sets\n", "# these will be cached under your \n", - "Cube(name=\"22922KJ1141\").get_data()\n", + "#Cube(name=\"22922KJ1141\").get_data()\n", "Table(name=\"21311-0001\").get_data()" ] }, @@ -60,6 +60,14 @@ "# Or without a name to clear the whole cache at once\n", "clear_cache()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7219b44b", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -78,7 +86,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.11.5" }, "vscode": { "interpreter": { diff --git a/nb/cube.ipynb b/nb/cube.ipynb index ef9584e..db56f0a 100644 --- a/nb/cube.ipynb +++ b/nb/cube.ipynb @@ -10,7 +10,18 @@ "import logging\n", "logging.basicConfig(level=logging.INFO)\n", "\n", - "from pystatis import Cube" + "from pystatis import Cube\n", + "from pystatis.db import set_db" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "812c0e39", + "metadata": {}, + "outputs": [], + "source": [ + "set_db(\"genesis\")" ] }, { @@ -30,7 +41,7 @@ "metadata": {}, "outputs": [], "source": [ - "c.get_data()" + "c.get_data() # TODO: currently broken?" ] }, { @@ -105,7 +116,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.11.5" }, "vscode": { "interpreter": { diff --git a/nb/table.ipynb b/nb/table.ipynb index b8e37cf..f8f021d 100644 --- a/nb/table.ipynb +++ b/nb/table.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "165da3a1", "metadata": { "scrolled": true @@ -12,12 +12,23 @@ "import logging\n", "logging.basicConfig(level=logging.INFO)\n", "\n", - "from pystatis import Table" + "from pystatis import Table\n", + "from pystatis.db import set_db" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, + "id": "c500ccb8", + "metadata": {}, + "outputs": [], + "source": [ + "set_db(\"genesis\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "5d25c79a", "metadata": {}, "outputs": [], @@ -27,499 +38,52 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "632fc783", "metadata": { "scrolled": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:pystatis.cache:Data was successfully cached under C:\\Users\\micha\\.pystatis\\data\\21311-0001\\5d17194a9264f364cb40\\20220922.txt.\n", - "INFO:pystatis.http_helper:Code 0 : erfolgreich\n" - ] - } - ], + "outputs": [], "source": [ "t.get_data()" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "f5f1aded", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'21311-0001'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "t.name" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "8fede338", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Statistik_Code;Statistik_Label;Zeit_Code;Zeit_Label;Zeit;1_Merkmal_Code;1_Merkmal_Label;1_Auspraegung_Code;1_Auspraegung_Label;2_Merkmal_Code;2_Merkmal_Label;2_Auspraegung_Code;2_Auspraegung_Label;3_Merkmal_Code;3_Merkmal_Label;3_Auspraegung_Code;3_Auspraegung_Label;BIL002__Studierende__Anzahl\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;907403\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;727254\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1634657\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;92321\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;73673\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;165994\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;999724\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;800927\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1998/99;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1800651\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;872178\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;723246\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1595424\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;95460\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;79605\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;175065\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;967638\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;802851\\n21311;Statistik der Studenten;SEMEST;Semester;WS 1999/00;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1770489\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;870016\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;741820\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1611836\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;99906\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;87121\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;187027\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;969922\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;828941\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2000/01;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1798863\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;887462\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;774628\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1662090\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;107831\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;98410\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;206241\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;995293\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;873038\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2001/02;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1868331\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;903218\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;808567\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1711785\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;117205\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;109821\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;227026\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1020423\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;918388\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2002/03;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1938811\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;935718\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;837611\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1773329\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;125826\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;120310\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;246136\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1061544\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;957921\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2003/04;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2019465\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;901979\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;814795\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1716774\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;124220\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;122114\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;246334\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1026199\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;936909\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2004/05;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1963108\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;912696\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;824712\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1737408\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;124447\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;123910\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;248357\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1037143\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;948622\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2005/06;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1985765\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;909740\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;822934\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1732674\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;122923\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;123446\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;246369\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1032663\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;946380\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2006/07;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1979043\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;898061\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;809738\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1707799\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;116700\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;116906\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;233606\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1014761\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;926644\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2007/08;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;1941405\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;938552\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;847612\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1786164\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;119254\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;119889\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;239143\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1057806\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;967501\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2008/09;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2025307\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;984097\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;892306\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1876403\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;122353\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;122422\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;244775\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1106450\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1014728\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2009/10;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2121178\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1031086\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;934176\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;1965262\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;126399\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;125633\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;252032\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1157485\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1059809\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2010/11;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2217294\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1122200\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;993482\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2115682\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;133172\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;132120\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;265292\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1255372\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1125602\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2011/12;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2380974\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1171894\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1045314\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2217208\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;142123\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;140078\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;282201\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1314017\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1185392\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2012/13;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2499409\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1218965\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1096566\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2315531\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;152675\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;148675\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;301350\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1371640\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1245241\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2013/14;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2616881\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1245029\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1132312\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2377341\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;163505\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;158064\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;321569\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1408534\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1290376\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2014/15;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2698910\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1260203\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1157291\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2417494\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;173923\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;166382\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;340305\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1434126\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1323673\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2015/16;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2757799\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1269166\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1178949\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2448115\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;184459\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;174436\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;358895\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1453625\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1353385\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2016/17;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2807010\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1270098\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1200297\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2470395\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;194545\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;180038\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;374583\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1464643\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1380335\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2017/18;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2844978\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1258281\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1215276\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2473557\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;207697\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;186968\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;394665\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1465978\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1402244\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2018/19;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2868222\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1246852\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1232596\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2479448\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;218015\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;193586\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;411601\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1464867\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1426182\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2019/20;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2891049\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1253399\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1274309\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2527708\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;222967\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;193470\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;416437\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1476366\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1467779\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2020/21;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2944145\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESM;männlich;1231256\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;GESW;weiblich;1270095\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATD;Deutsche;GES;Geschlecht;;Insgesamt;2501351\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESM;männlich;235026\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;GESW;weiblich;205538\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;NATA;Ausländer;GES;Geschlecht;;Insgesamt;440564\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESM;männlich;1466282\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;GESW;weiblich;1475633\\n21311;Statistik der Studenten;SEMEST;Semester;WS 2021/22;DINSG;Deutschland insgesamt;DG;Deutschland;NAT;Nationalität;;Insgesamt;GES;Geschlecht;;Insgesamt;2941915\\n'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "t.raw_data" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "874bbbb9", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Statistik_CodeStatistik_LabelZeit_CodeZeit_LabelZeit1_Merkmal_Code1_Merkmal_Label1_Auspraegung_Code1_Auspraegung_Label2_Merkmal_Code2_Merkmal_Label2_Auspraegung_Code2_Auspraegung_Label3_Merkmal_Code3_Merkmal_Label3_Auspraegung_Code3_Auspraegung_LabelBIL002__Studierende__Anzahl
021311Statistik der StudentenSEMESTSemesterWS 1998/99DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATDDeutscheGESGeschlechtGESMmännlich907403
121311Statistik der StudentenSEMESTSemesterWS 1998/99DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATDDeutscheGESGeschlechtGESWweiblich727254
221311Statistik der StudentenSEMESTSemesterWS 1998/99DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATDDeutscheGESGeschlechtNaNInsgesamt1634657
321311Statistik der StudentenSEMESTSemesterWS 1998/99DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATAAusländerGESGeschlechtGESMmännlich92321
421311Statistik der StudentenSEMESTSemesterWS 1998/99DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATAAusländerGESGeschlechtGESWweiblich73673
.........................................................
21121311Statistik der StudentenSEMESTSemesterWS 2021/22DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATAAusländerGESGeschlechtGESWweiblich205538
21221311Statistik der StudentenSEMESTSemesterWS 2021/22DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNATAAusländerGESGeschlechtNaNInsgesamt440564
21321311Statistik der StudentenSEMESTSemesterWS 2021/22DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNaNInsgesamtGESGeschlechtGESMmännlich1466282
21421311Statistik der StudentenSEMESTSemesterWS 2021/22DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNaNInsgesamtGESGeschlechtGESWweiblich1475633
21521311Statistik der StudentenSEMESTSemesterWS 2021/22DINSGDeutschland insgesamtDGDeutschlandNATNationalitätNaNInsgesamtGESGeschlechtNaNInsgesamt2941915
\n", - "

216 rows × 18 columns

\n", - "
" - ], - "text/plain": [ - " Statistik_Code Statistik_Label Zeit_Code Zeit_Label Zeit \\\n", - "0 21311 Statistik der Studenten SEMEST Semester WS 1998/99 \n", - "1 21311 Statistik der Studenten SEMEST Semester WS 1998/99 \n", - "2 21311 Statistik der Studenten SEMEST Semester WS 1998/99 \n", - "3 21311 Statistik der Studenten SEMEST Semester WS 1998/99 \n", - "4 21311 Statistik der Studenten SEMEST Semester WS 1998/99 \n", - ".. ... ... ... ... ... \n", - "211 21311 Statistik der Studenten SEMEST Semester WS 2021/22 \n", - "212 21311 Statistik der Studenten SEMEST Semester WS 2021/22 \n", - "213 21311 Statistik der Studenten SEMEST Semester WS 2021/22 \n", - "214 21311 Statistik der Studenten SEMEST Semester WS 2021/22 \n", - "215 21311 Statistik der Studenten SEMEST Semester WS 2021/22 \n", - "\n", - " 1_Merkmal_Code 1_Merkmal_Label 1_Auspraegung_Code \\\n", - "0 DINSG Deutschland insgesamt DG \n", - "1 DINSG Deutschland insgesamt DG \n", - "2 DINSG Deutschland insgesamt DG \n", - "3 DINSG Deutschland insgesamt DG \n", - "4 DINSG Deutschland insgesamt DG \n", - ".. ... ... ... \n", - "211 DINSG Deutschland insgesamt DG \n", - "212 DINSG Deutschland insgesamt DG \n", - "213 DINSG Deutschland insgesamt DG \n", - "214 DINSG Deutschland insgesamt DG \n", - "215 DINSG Deutschland insgesamt DG \n", - "\n", - " 1_Auspraegung_Label 2_Merkmal_Code 2_Merkmal_Label 2_Auspraegung_Code \\\n", - "0 Deutschland NAT Nationalität NATD \n", - "1 Deutschland NAT Nationalität NATD \n", - "2 Deutschland NAT Nationalität NATD \n", - "3 Deutschland NAT Nationalität NATA \n", - "4 Deutschland NAT Nationalität NATA \n", - ".. ... ... ... ... \n", - "211 Deutschland NAT Nationalität NATA \n", - "212 Deutschland NAT Nationalität NATA \n", - "213 Deutschland NAT Nationalität NaN \n", - "214 Deutschland NAT Nationalität NaN \n", - "215 Deutschland NAT Nationalität NaN \n", - "\n", - " 2_Auspraegung_Label 3_Merkmal_Code 3_Merkmal_Label 3_Auspraegung_Code \\\n", - "0 Deutsche GES Geschlecht GESM \n", - "1 Deutsche GES Geschlecht GESW \n", - "2 Deutsche GES Geschlecht NaN \n", - "3 Ausländer GES Geschlecht GESM \n", - "4 Ausländer GES Geschlecht GESW \n", - ".. ... ... ... ... \n", - "211 Ausländer GES Geschlecht GESW \n", - "212 Ausländer GES Geschlecht NaN \n", - "213 Insgesamt GES Geschlecht GESM \n", - "214 Insgesamt GES Geschlecht GESW \n", - "215 Insgesamt GES Geschlecht NaN \n", - "\n", - " 3_Auspraegung_Label BIL002__Studierende__Anzahl \n", - "0 männlich 907403 \n", - "1 weiblich 727254 \n", - "2 Insgesamt 1634657 \n", - "3 männlich 92321 \n", - "4 weiblich 73673 \n", - ".. ... ... \n", - "211 weiblich 205538 \n", - "212 Insgesamt 440564 \n", - "213 männlich 1466282 \n", - "214 weiblich 1475633 \n", - "215 Insgesamt 2941915 \n", - "\n", - "[216 rows x 18 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "t.data" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "81d27994", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Copyright': '© Statistisches Bundesamt (Destatis), 2022',\n", - " 'Ident': {'Method': 'table', 'Service': 'metadata'},\n", - " 'Object': {'Code': '21311-0001',\n", - " 'Content': 'Studierende: Deutschland, Semester, Nationalität,\\n'\n", - " 'Geschlecht',\n", - " 'Structure': {'Columns': [{'Code': 'NAT',\n", - " 'Content': 'Nationalität',\n", - " 'Selected': None,\n", - " 'Structure': [{'Code': 'GES',\n", - " 'Content': 'Geschlecht',\n", - " 'Selected': None,\n", - " 'Structure': None,\n", - " 'Type': 'Merkmal',\n", - " 'Updated': 'see parent',\n", - " 'Values': None}],\n", - " 'Type': 'Merkmal',\n", - " 'Updated': 'see parent',\n", - " 'Values': None}],\n", - " 'Head': {'Code': '21311',\n", - " 'Content': 'Statistik der Studenten',\n", - " 'Selected': None,\n", - " 'Structure': [{'Code': 'DINSG',\n", - " 'Content': 'Deutschland '\n", - " 'insgesamt',\n", - " 'Selected': '1',\n", - " 'Structure': [{'Code': 'BIL002',\n", - " 'Content': 'Studierende',\n", - " 'Selected': None,\n", - " 'Structure': None,\n", - " 'Type': 'Merkmal',\n", - " 'Updated': 'see '\n", - " 'parent',\n", - " 'Values': None}],\n", - " 'Type': 'Merkmal',\n", - " 'Updated': 'see parent',\n", - " 'Values': '1'}],\n", - " 'Type': 'Statistik',\n", - " 'Updated': 'see parent',\n", - " 'Values': None},\n", - " 'Rows': [{'Code': 'SEMEST',\n", - " 'Content': 'Semester',\n", - " 'Selected': None,\n", - " 'Structure': None,\n", - " 'Type': 'Merkmal',\n", - " 'Updated': 'see parent',\n", - " 'Values': None}],\n", - " 'Subheading': None,\n", - " 'Subtitel': None},\n", - " 'Time': {'From': 'WS 1998/99', 'To': 'WS 2021/22'},\n", - " 'Updated': '13.08.2013 13:41:54h',\n", - " 'Valid': 'false'},\n", - " 'Parameter': {'area': 'Alle',\n", - " 'language': 'de',\n", - " 'name': '21311-0001',\n", - " 'password': '********************',\n", - " 'username': '********************'},\n", - " 'Status': {'Code': 0, 'Content': 'erfolgreich', 'Type': 'Information'}}\n" - ] - } - ], + "outputs": [], "source": [ "from pprint import pprint\n", "\n", @@ -543,7 +107,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.11.5" }, "vscode": { "interpreter": { diff --git a/src/pystatis/__init__.py b/src/pystatis/__init__.py index a1726bb..b23ef32 100644 --- a/src/pystatis/__init__.py +++ b/src/pystatis/__init__.py @@ -7,6 +7,14 @@ print("Version:", pstat.__version__) ``` """ +import pystatis.cache +import pystatis.config +import pystatis.cube +import pystatis.db +import pystatis.find +import pystatis.helloworld +import pystatis.profile +import pystatis.table from pystatis.cache import clear_cache from pystatis.config import setup_credentials from pystatis.cube import Cube diff --git a/src/pystatis/cache.py b/src/pystatis/cache.py index 1c0f0ec..d823ffc 100644 --- a/src/pystatis/cache.py +++ b/src/pystatis/cache.py @@ -6,17 +6,19 @@ import shutil import zipfile from datetime import date +from operator import attrgetter from pathlib import Path from typing import Optional -from pystatis.config import load_config +from pystatis.config import get_cache_dir logger = logging.getLogger(__name__) + JOB_ID_PATTERN = r"\d+" def cache_data( - cache_dir: Path, + cache_dir: str, name: Optional[str], params: dict, data: str, @@ -28,10 +30,8 @@ def cache_data( This allows to cache different results for different params. Args: - cache_dir (Path): The cash directory as configured in the config. + cache_dir (str): The cash directory as configured in the config. name (str): The unique identifier in GENESIS-Online. - endpoint (str): The endpoint for this data request. - method (str): The method for this data request. params (dict): The dictionary holding the params for this data request. data (str): The actual raw text data as returned by GENESIS-Online. """ @@ -73,8 +73,6 @@ def read_from_cache( Args: cache_dir (Path): The cash directory as configured in the config. name (str): The unique identifier in GENESIS-Online. - endpoint (str): The endpoint for this data request. - method (str): The method for this data request. params (dict): The dictionary holding the params for this data request. Returns: @@ -85,11 +83,11 @@ def read_from_cache( data_dir = _build_file_path(cache_dir, name, params) - versions = sorted( + latest_version = sorted( data_dir.glob("*"), - key=lambda path: int(path.stem), - ) - file_name = versions[-1].name + key=attrgetter("stem"), + )[-1] + file_name = latest_version.name file_path = data_dir / file_name with zipfile.ZipFile(file_path, "r") as myzip: with myzip.open(file_name.replace(".zip", ".txt")) as file: @@ -98,15 +96,13 @@ def read_from_cache( return data -def _build_file_path(cache_dir: Path, name: str, params: dict) -> Path: +def _build_file_path(cache_dir: str, name: str, params: dict) -> Path: """Builds a unique cache directory name from name and hashed params dictionary. - The way this method works is that it creates a path under cache dir that is unique - because the name is a unique EVAS identifier number in Destatis and the hash - is (close enough) unique to a given dictionary with query parameter values. + The way this method works is that it creates a path under cache dir that is unique because the name is a unique EVAS identifier number in Destatis and the hash is (close enough) unique to a given dictionary with query parameter values. Args: - cache_dir (Path): The root cache directory as configured in the config.ini. + cache_dir (str): The root cache directory as configured in the config.ini. name (str): The unique identifier for an object in Destatis. params (dict): The query parameters for a given call to the Destatis API. @@ -120,7 +116,7 @@ def _build_file_path(cache_dir: Path, name: str, params: dict) -> Path: del params_["job"] params_hash = hashlib.blake2s(digest_size=10, usedforsecurity=False) params_hash.update(json.dumps(params_).encode("UTF-8")) - data_dir = cache_dir / name / params_hash.hexdigest() + data_dir = Path(cache_dir) / name / params_hash.hexdigest() return data_dir @@ -141,17 +137,15 @@ def normalize_name(name: str) -> str: def hit_in_cash( - cache_dir: Path, + cache_dir: str, name: Optional[str], params: dict, ) -> bool: """Check if data is already cached. Args: - cache_dir (Path): The cash directory as configured in the config. + cache_dir (str): The cash directory as configured in the config. name (str): The unique identifier in GENESIS-Online. - endpoint (str): The endpoint for this data request. - method (str): The method for this data request. params (dict): The dictionary holding the params for this data request. Returns: @@ -170,8 +164,7 @@ def clear_cache(name: Optional[str] = None) -> None: Args: name (str, optional): Unique name to be deleted from cached data. """ - config = load_config() - cache_dir = Path(config["DATA"]["cache_dir"]) + cache_dir = Path(get_cache_dir()) # remove specified file (directory) from the data cache # or clear complete cache (remove childs, preserve base) diff --git a/src/pystatis/config.py b/src/pystatis/config.py index 1193f7f..01b80e4 100644 --- a/src/pystatis/config.py +++ b/src/pystatis/config.py @@ -14,9 +14,10 @@ PKG_NAME = __name__.split(".", maxsplit=1)[0] logger = logging.getLogger(__name__) +config = None DEFAULT_CONFIG_DIR = str(Path().home() / f".{PKG_NAME}") -CUSTOM_CONFIG_PATH = DEFAULT_CONFIG_DIR +CUSTOM_CONFIG_DIR = DEFAULT_CONFIG_DIR SUPPORTED_DB = ["genesis", "zensus"] @@ -28,11 +29,11 @@ def init_config(config_dir: str = DEFAULT_CONFIG_DIR) -> None: Args: config_dir (str, optional): Path to the root config directory. Defaults to the user home directory. """ - global CUSTOM_CONFIG_PATH + global CUSTOM_CONFIG_DIR, config - CUSTOM_CONFIG_PATH = config_dir + CUSTOM_CONFIG_DIR = config_dir - if not build_config_file().exists(): + if not _build_config_file_path().exists(): config = create_default_config() write_config(config) @@ -41,26 +42,26 @@ def init_config(config_dir: str = DEFAULT_CONFIG_DIR) -> None: def setup_credentials() -> None: """Setup credentials for all supported databases.""" - config = load_config() + global config for db in get_supported_db(): - config[db]["username"] = get_user_input(db, "username") - config[db]["password"] = get_user_input(db, "password") + config[db]["username"] = _get_user_input(db, "username") + config[db]["password"] = _get_user_input(db, "password") write_config(config) logger.info( "Config was updated with latest credentials. Path: %s.", - build_config_file(), + _build_config_file_path(), ) -def build_config_file() -> Path: +def _build_config_file_path() -> Path: """Build the path to the config file.""" - return Path(CUSTOM_CONFIG_PATH) / "config.ini" + return Path(CUSTOM_CONFIG_DIR) / "config.ini" -def get_user_input(db: str, field: str) -> str: +def _get_user_input(db: str, field: str) -> str: """Get user input for the given database and field.""" env_var = os.environ.get(f"PYSTATIS_{db.upper()}_API_{field.upper()}") @@ -76,7 +77,7 @@ def get_user_input(db: str, field: str) -> str: def load_config(config_file: Path | None = None) -> ConfigParser: """Load a config from a file.""" if config_file is None: - config_file = build_config_file() + config_file = _build_config_file_path() config = ConfigParser() successful_reads = config.read(config_file) @@ -94,7 +95,7 @@ def load_config(config_file: Path | None = None) -> ConfigParser: def write_config(config: ConfigParser, config_file: Path | None = None) -> None: """Write a config to a file.""" if config_file is None: - config_file = build_config_file() + config_file = _build_config_file_path() if not config_file.parent.exists(): config_file.parent.mkdir(parents=True) @@ -126,7 +127,7 @@ def create_default_config() -> ConfigParser: "doku": "https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf", } - config["DATA"] = {"cache_dir": str(Path(CUSTOM_CONFIG_PATH) / "data")} + config["DATA"] = {"cache_dir": str(Path(CUSTOM_CONFIG_DIR) / "data")} cache_dir = Path(config["DATA"]["cache_dir"]) if not cache_dir.exists(): @@ -140,9 +141,14 @@ def get_supported_db() -> list[str]: return SUPPORTED_DB +def get_cache_dir() -> str: + """Get the cache directory.""" + return config["DATA"]["cache_dir"] + + def delete_config() -> None: """Delete the config file.""" - config_file = build_config_file() + config_file = _build_config_file_path() if config_file.exists(): config_file.unlink() @@ -151,3 +157,4 @@ def delete_config() -> None: init_config() +config = load_config() diff --git a/src/pystatis/db.py b/src/pystatis/db.py index 7d06726..f83e209 100644 --- a/src/pystatis/db.py +++ b/src/pystatis/db.py @@ -1,8 +1,7 @@ import logging -from pystatis.config import get_supported_db, load_config +from pystatis.config import config, get_supported_db, write_config -config = load_config() # this module works with a local copy of the config! logger = logging.getLogger(__name__) @@ -10,16 +9,24 @@ def set_db(name: str) -> None: """Set the active database.""" if name.lower() not in get_supported_db(): raise ValueError( - f"Database {name} not supported! Please choose one of {get_supported_db()}" + f"Database {name} not supported! Please choose one of {', '.join(get_supported_db())}" ) config["SETTINGS"]["active_db"] = name.lower() def get_db() -> str: """Get the active database.""" - if config["SETTINGS"]["active_db"] == "": + active_db = config["SETTINGS"]["active_db"] + if not active_db: logger.critical("No active database set! Please run `set_db()`.") - return config["SETTINGS"]["active_db"] + + if not config[active_db]["username"] or not config[active_db]["password"]: + logger.critical( + "No credentials for %s found. Please run `setup_credentials()`.", + active_db, + ) + + return active_db def get_db_host() -> str: @@ -34,6 +41,11 @@ def get_db_pw() -> str: return config[get_db()]["password"] +def set_db_pw(new_pw: str) -> None: + config[get_db()]["password"] = new_pw + write_config(config) + + def get_db_settings() -> tuple[str, str, str]: """Get the active database settings (host, user, password).""" return get_db_host(), get_db_user(), get_db_pw() diff --git a/src/pystatis/helloworld.py b/src/pystatis/helloworld.py index 23e41eb..89f85a3 100644 --- a/src/pystatis/helloworld.py +++ b/src/pystatis/helloworld.py @@ -31,11 +31,12 @@ def logincheck() -> str: Returns: str: text logincheck response from Destatis """ - url = f"{db.get_db_host()}" + "helloworld/logincheck" + db_host, db_user, db_pw = db.get_db_settings() + url = f"{db_host}helloworld/logincheck" params = { - "username": db.get_db_user(), - "password": db.get_db_pw(), + "username": db_user, + "password": db_pw, } response = requests.get(url, params=params, timeout=(1, 15)) diff --git a/src/pystatis/http_helper.py b/src/pystatis/http_helper.py index b4e7906..eff6431 100644 --- a/src/pystatis/http_helper.py +++ b/src/pystatis/http_helper.py @@ -14,7 +14,8 @@ normalize_name, read_from_cache, ) -from pystatis.config import load_config +from pystatis.config import get_cache_dir +from pystatis.db import get_db_settings from pystatis.exception import DestatisStatusError logger = logging.getLogger(__name__) @@ -39,8 +40,7 @@ def load_data( Returns: Union[str, dict]: The data as raw text or JSON dict. """ - config = load_config() - cache_dir = Path(config["DATA"]["cache_dir"]) + cache_dir = Path(get_cache_dir()) name = params.get("name") if name is not None: @@ -94,15 +94,15 @@ def get_data_from_endpoint( Returns: requests.Response: the response object holding the response from calling the Destatis endpoint. """ - config = load_config() - url = f"{config['GENESIS API']['base_url']}{endpoint}/{method}" + db_host, db_user, db_pw = get_db_settings() + url = f"{db_host}{endpoint}/{method}" # params is used to calculate hash for caching so don't alter params dict here! params_ = params.copy() params_.update( { - "username": config["GENESIS API"]["username"], - "password": config["GENESIS API"]["password"], + "username": db_user, + "password": db_pw, } ) diff --git a/src/pystatis/profile.py b/src/pystatis/profile.py index 93c91cb..a4422cc 100644 --- a/src/pystatis/profile.py +++ b/src/pystatis/profile.py @@ -3,7 +3,7 @@ import logging from typing import cast -from pystatis.config import _write_config, load_config +from pystatis.db import set_db_pw from pystatis.http_helper import load_data logger = logging.getLogger(__name__) @@ -19,19 +19,19 @@ def change_password(new_password: str) -> str: Returns: str: text response from Destatis """ + global config + params = { "new": new_password, "repeat": new_password, } - # load config.ini beforehand, to ensure passwords are changed at the same time - config = load_config() try: config["GENESIS API"]["password"] except KeyError as e: raise KeyError( "Password not found in config! Please make sure \ - init_config() was run properly & your user data is set correctly!", + setup_credentials() was run properly & your user data is set correctly!", ) from e # change remote password @@ -39,8 +39,7 @@ def change_password(new_password: str) -> str: endpoint="profile", method="password", params=params ) # change local password - config["GENESIS API"]["password"] = new_password - _write_config(config, get_config_path_from_settings()) + set_db_pw(new_password) logger.info("Password changed successfully!") diff --git a/tests/test_cache.py b/tests/test_cache.py index 25196bf..a733929 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -11,13 +11,7 @@ normalize_name, read_from_cache, ) -from pystatis.config import ( - DEFAULT_SETTINGS_FILE, - _write_config, - init_config, - load_config, - load_settings, -) +from pystatis.config import get_cache_dir, init_config @pytest.fixture() @@ -26,19 +20,9 @@ def cache_dir(tmp_path_factory): temp_dir = str(tmp_path_factory.mktemp(".pystatis")) temp_dir = re.sub(r"[^\x00-\x7f]", r"", temp_dir.replace(" ", "")) - init_config("myuser", "mypw", temp_dir) - - config = load_config() - cache_dir = Path(config["DATA"]["cache_dir"]) - - return cache_dir - + init_config(temp_dir) -@pytest.fixture(autouse=True) -def restore_settings(): - old_settings = load_settings() - yield - _write_config(old_settings, DEFAULT_SETTINGS_FILE) + return get_cache_dir() @pytest.fixture(scope="module") @@ -55,7 +39,7 @@ def test_build_file_path(cache_dir, params): def test_cache_data(cache_dir, params): - assert len(list((cache_dir / "data").glob("*"))) == 0 + assert len(list((Path(cache_dir) / "data").glob("*"))) == 0 test_data = "test" cache_data(cache_dir, "test-cache-data", params, test_data) diff --git a/tests/test_config.py b/tests/test_config.py index 45ffc87..ac36d24 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,128 +1,118 @@ import logging +import os import re from configparser import ConfigParser from pathlib import Path import pytest -import pystatis.config from pystatis.config import ( - DEFAULT_SETTINGS_FILE, - _write_config, - create_settings, - get_config_path_from_settings, + _build_config_file_path, + config, + delete_config, + get_cache_dir, + get_supported_db, init_config, load_config, - load_settings, + setup_credentials, ) @pytest.fixture() -def config_dir(tmp_path_factory): +def config_dir(tmp_path_factory) -> str: # remove white-space and non-latin characters (issue fo some user names) temp_dir = str(tmp_path_factory.mktemp(".pystatis")) temp_dir = re.sub(r"[^\x00-\x7f]", r"", temp_dir.replace(" ", "")) - return Path(temp_dir) + return temp_dir -@pytest.fixture(autouse=True) -def restore_settings(): - old_settings = load_settings() - yield - _write_config(old_settings, DEFAULT_SETTINGS_FILE) - - -def test_create_settings_is_run_on_import(): - assert DEFAULT_SETTINGS_FILE.exists() and DEFAULT_SETTINGS_FILE.is_file() - - -def test_create_settings(config_dir, mocker): - mocker.patch.object(pystatis.config, "DEFAULT_CONFIG_DIR", config_dir) - mocker.patch.object( - pystatis.config, "DEFAULT_SETTINGS_FILE", config_dir / "settings.ini" - ) - create_settings() - - assert (config_dir / "settings.ini").is_file() - - -def test_load_settings(): - settings = load_settings() - - assert isinstance(settings, ConfigParser) - assert settings.has_option("SETTINGS", "config_dir") - - -def test_get_config_path_from_settings(): - config_path = get_config_path_from_settings() - - assert isinstance(config_path, Path) +def test_init_config_is_run_on_import(): + assert isinstance(config, ConfigParser) + assert _build_config_file_path().exists() -def test_init_config_with_config_dir(config_dir, caplog): +def test_custom_config_dir(config_dir, caplog): caplog.clear() caplog.set_level(logging.INFO) - init_config("myuser", "mypw", config_dir) + init_config(config_dir) + config = load_config() - assert len(caplog.records) == 2 + assert len(caplog.records) == 1 assert caplog.records[0].levelname == "INFO" - assert caplog.records[1].levelname == "INFO" - assert "Settings file updated" in caplog.text assert "New config was created" in caplog.text - assert (config_dir / "data").exists() - - config = load_config() + assert Path(get_cache_dir()).exists() + assert _build_config_file_path().exists() assert isinstance(config, ConfigParser) assert len(config.sections()) > 0 - assert config["DATA"]["cache_dir"] == str(config_dir / "data") - assert len(list((config_dir / "data").glob("*"))) == 0 - - config_file = get_config_path_from_settings() - - assert config_file.exists() and config_file.is_file() + assert get_cache_dir() == str(Path(config_dir) / "data") + assert len(list((Path(get_cache_dir())).glob("*"))) == 0 def test_load_config(config_dir): - init_config("myuser", "mypw123!", config_dir) - config: ConfigParser = load_config() + init_config(config_dir) + config = load_config() - for section in ["GENESIS API", "DATA"]: + assert config.has_section("SETTINGS") + assert config.has_option("SETTINGS", "active_db") + assert config.has_option("SETTINGS", "supported_db") + assert config.has_section("DATA") + assert config.has_option("DATA", "cache_dir") + + for section in get_supported_db(): assert config.has_section(section) - assert config.options("GENESIS API") == [ - "base_url", - "username", - "password", - "doku", - ] - assert config.options("DATA") == ["cache_dir"] + assert config.options(section) == [ + "base_url", + "username", + "password", + "doku", + ] - assert config["GENESIS API"]["username"] == "myuser" - assert config["GENESIS API"]["password"] == "mypw123!" + assert config[section]["username"] == "" + assert config[section]["password"] == "" -def test_missing_username(config_dir, caplog): - init_config("", "", config_dir) +def test_missing_file(config_dir, caplog): + init_config(config_dir) + (Path(config_dir) / "config.ini").unlink() caplog.clear() - _ = load_config() + config = load_config() + assert not config.sections() + + for record in caplog.records: + assert record.levelname == "CRITICAL" + - assert caplog.records[0].levelname == "CRITICAL" - assert "Username and/or password are missing!" in caplog.text +def test_delete_config(config_dir): + init_config(config_dir) + assert _build_config_file_path().exists() + delete_config() + assert not _build_config_file_path().exists() -def test_missing_file(config_dir, caplog): - init_config("", "", config_dir) - (config_dir / "config.ini").unlink() - caplog.clear() +def test_setup_credentials(config_dir): + init_config(config_dir) + for db in get_supported_db(): + for field in ["username", "password"]: + if field == "username": + os.environ[ + f"PYSTATIS_{db.upper()}_API_{field.upper()}" + ] = "test" + else: + os.environ[ + f"PYSTATIS_{db.upper()}_API_{field.upper()}" + ] = "test123!" + + setup_credentials() config = load_config() - assert not config.sections() - for record in caplog.records: - assert record.levelname == "CRITICAL" + for db in get_supported_db(): + assert config[db]["username"] == "test" + assert config[db]["password"] == "test123!"