From 4a39409c336e05f83bc3e9fa1b17ace988c1b1bb Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:57:05 +0100 Subject: [PATCH 1/2] use parse from packaging --- .../epidata/getDataIntoPandasDataFrame.py | 25 +++++++++++-------- pycode/memilio-epidata/pyproject.toml | 2 +- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py b/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py index 32df796921..439fcd6390 100644 --- a/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py +++ b/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py @@ -42,7 +42,7 @@ from io import BytesIO from zipfile import ZipFile from enum import Enum -from pkg_resources import parse_version +from packaging.version import parse import pandas as pd @@ -66,7 +66,7 @@ class Conf: v_level = 'Info' show_progr = False - if parse_version(pd.__version__) < parse_version('2.2'): + if parse(pd.__version__) < parse('2.2'): excel_engine = 'openpyxl' else: # calamine is faster, but cannot be used for pandas < 2.2 @@ -196,9 +196,12 @@ def download_file( """ if verify not in [True, False, "interactive"]: - warnings.warn('Invalid input for argument verify. Expected True, False, or' - ' "interactive", got ' + str(verify) + '.' - ' Proceeding with "verify=True".', category=RuntimeWarning) + warnings.warn( + 'Invalid input for argument verify. Expected True, False, or' + ' "interactive", got ' + str(verify) + + '.' + ' Proceeding with "verify=True".', + category=RuntimeWarning) verify = True # send GET request as stream so the content is not downloaded at once try: @@ -438,8 +441,7 @@ def cli(what): parser.add_argument( '-s', '--start-date', default=start_date_default, help='Defines start date for data download. Should have form: YYYY-mm-dd.' - 'Default is ' + - str(dd.defaultDict['start_date']) + + 'Default is ' + str(dd.defaultDict['start_date']) + ' (2020-04-24 for divi and 2020-01-22 for jh)', type=lambda s: datetime.datetime.strptime(s, '%Y-%m-%d').date()) if 'end_date' in what_list: @@ -455,8 +457,10 @@ def cli(what): ' omitting dates where no data was reported', action='store_true') if 'moving_average' in what_list: parser.add_argument( - '-m', '--moving-average', type=int, default=dd.defaultDict['moving_average'], - help='Compute a moving average of N days over the time series. Default is ' + str(dd.defaultDict['moving_average'])) + '-m', '--moving-average', type=int, default=dd.defaultDict + ['moving_average'], + help='Compute a moving average of N days over the time series. Default is ' + + str(dd.defaultDict['moving_average'])) if 'split_berlin' in what_list: parser.add_argument( '-b', '--split-berlin', default=dd.defaultDict['split_berlin'], @@ -504,7 +508,8 @@ def cli(what): if '--interactive' in sys.argv: parser.add_argument( '--interactive', - help='Interactive download (Handle warnings, passwords etc.).', action='store_true') + help='Interactive download (Handle warnings, passwords etc.).', + action='store_true') if not {'--verbose', '-v', '-vv', '-vvv', '-vvvv', '-vvvvv', '-vvvvvv'}.isdisjoint(sys.argv): parser.add_argument( diff --git a/pycode/memilio-epidata/pyproject.toml b/pycode/memilio-epidata/pyproject.toml index 75eef7bbe2..55ebfbaffa 100644 --- a/pycode/memilio-epidata/pyproject.toml +++ b/pycode/memilio-epidata/pyproject.toml @@ -14,7 +14,7 @@ maintainers = [ { email = "martin.kuehn@dlr.de" } ] dependencies = [ - "setuptools>=68", + "packaging", "pandas>=2.0.0", "pyarrow", "matplotlib", From 94c220c9cc84c7919af126b62d3248a66cb6c6e9 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:22:07 +0100 Subject: [PATCH 2/2] fix cli test --- .../memilio/epidata/geoModificationGermany.py | 4 +-- .../epidata/getDataIntoPandasDataFrame.py | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/pycode/memilio-epidata/memilio/epidata/geoModificationGermany.py b/pycode/memilio-epidata/memilio/epidata/geoModificationGermany.py index 3fea97e2fc..43691b8c7a 100644 --- a/pycode/memilio-epidata/memilio/epidata/geoModificationGermany.py +++ b/pycode/memilio-epidata/memilio/epidata/geoModificationGermany.py @@ -371,9 +371,9 @@ def get_nuts3_county_id_map(): """ # download county list county_table = get_official_county_table() - # delete rows with nuts3 = NaN + # delete rows with nuts3 or idCounty = NaN # take just columns with name dd.EngEng['idCounty'] and dd.EngEng['nuts3'] - key_nuts3 = county_table.dropna(subset=[dd.EngEng['nuts3']])[ + key_nuts3 = county_table.dropna(subset=[dd.EngEng['nuts3'], dd.EngEng['idCounty']])[ [dd.EngEng['idCounty'], dd.EngEng['nuts3']]] # convert ID data types key_nuts3 = key_nuts3.astype({dd.EngEng['idCounty']: int}) diff --git a/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py b/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py index 439fcd6390..b890bee29b 100644 --- a/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py +++ b/pycode/memilio-epidata/memilio/epidata/getDataIntoPandasDataFrame.py @@ -489,47 +489,56 @@ def cli(what): ) # add optional download options - if '--no-progress-indicators' in sys.argv: + argv = sys.argv[1:] + if '--no-progress-indicators' in argv: parser.add_argument( '--no-progress-indicators', dest='show_progress', help='Disables all progress indicators (used for downloads etc.).', action='store_false') - if not {'--no-raw', '-n'}.isdisjoint(sys.argv): + if not {'--no-raw', '-n'}.isdisjoint(argv): parser.add_argument( '-n', '--no-raw', help='Defines if raw data will be stored for further use.', action='store_true') - if not {'--make_plot', '-p'}.isdisjoint(sys.argv): + if not {'--make_plot', '-p'}.isdisjoint(argv): parser.add_argument('-p', '--make-plot', help='Plots the data.', action='store_true') - if '--interactive' in sys.argv: + if '--interactive' in argv: parser.add_argument( '--interactive', help='Interactive download (Handle warnings, passwords etc.).', action='store_true') - if not {'--verbose', '-v', '-vv', '-vvv', '-vvvv', '-vvvvv', '-vvvvvv'}.isdisjoint(sys.argv): + if not {'--verbose', '-v', '-vv', '-vvv', '-vvvv', '-vvvvv', '-vvvvvv'}.isdisjoint(argv): parser.add_argument( '-v', '--verbose', dest='verbosity_level', help='Increases verbosity level (Trace, Debug, Info, Warning, Error, Critical, Off).', action='count', default=0) - if '--skip-checks' in sys.argv: + if '--skip-checks' in argv: parser.add_argument( '--skip-checks', dest='run_checks', action='store_false', help='Skips sanity checks etc.') - if '--to-dataset' in sys.argv: + if '--to-dataset' in argv: parser.add_argument( '--to-dataset', dest='to_dataset', help="To return saved dataframes as objects.", action='store_true' ) - args = vars(parser.parse_args()) + args, unknown = parser.parse_known_args() + if unknown: + # if unknown arguments are present, check if they are from + # a test runner (unittest, pytest). If not, we want to fail. + if not any(x in sys.argv[0] for x in + ['unittest', 'pytest']): + parser.parse_args() + + args = vars(args) return args