Skip to content

Commit 5a40518

Browse files
authored
Configurarion package and new log settings (#4)
1 parent 6839edd commit 5a40518

File tree

14 files changed

+230
-97
lines changed

14 files changed

+230
-97
lines changed

mds/__init__.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
1-
"""General mds-toolbox setup"""
1+
from mds.conf import settings
2+
from mds.core import mds_s3
3+
from mds.core import wrapper
4+
from mds.utils.log import configure_logging
25

36

4-
def setup():
5-
pass
7+
def setup(**kwargs) -> None:
8+
"""
9+
General mds-toolbox setup
10+
11+
Args:
12+
**kwargs: extra arguments to apply as app settings
13+
"""
14+
settings.configure(**kwargs)
15+
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING, settings.LOG_LEVEL)
16+
17+
18+
__all__ = [
19+
mds_s3.__name__,
20+
wrapper.__name__,
21+
]

mds/conf/__init__.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from mds.conf import global_settings
2+
3+
# List of modules to load settings from
4+
TO_LOAD = [global_settings]
5+
6+
7+
class Settings:
8+
def __init__(self, *modules):
9+
"""
10+
Initialize the Settings instance with the provided modules.
11+
12+
Args:
13+
*modules: Variable length argument list of modules to load settings from.
14+
"""
15+
for module in modules:
16+
for setting in dir(module):
17+
if setting.isupper():
18+
setattr(self, setting, getattr(module, setting))
19+
20+
def configure(self, **ext_settings):
21+
"""
22+
Configure the settings instance by setting new values or overriding existing ones.
23+
24+
Args:
25+
**ext_settings: Arbitrary keyword arguments representing settings to be configured.
26+
Only capital keywords are considered.
27+
"""
28+
for key, value in ext_settings.items():
29+
if key.isupper():
30+
setattr(self, key, value)
31+
32+
33+
# Create a Settings instance as unique entry point to the app settings
34+
settings = Settings(*TO_LOAD)

mds/conf/global_settings.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
########################
2+
# LOG
3+
########################
4+
5+
# The callable to use to configure logging
6+
LOGGING_CONFIG = "logging.config.dictConfig"
7+
8+
# Custom logging configuration.
9+
LOGGING = {}
10+
11+
LOG_LEVEL = "INFO"

mds/core/mds_s3.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1+
import logging
12
import os
23
from multiprocessing import Pool
34
from typing import List
45

5-
from mds.core.s3file import S3File
66
from mds.core import s3_singleton
77
from mds.core import utils
8-
from mds.utils import logging_config
8+
from mds.core.s3file import S3File
99

1010
# conf
11-
logger = logging_config.set_up("mds_s3")
11+
logger = logging.getLogger("mds")
1212
THREADS_TIMEOUT = 10 * 60
1313

1414

mds/core/s3_singleton.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
import glob
21
import fnmatch
2+
import glob
3+
import logging
34
import multiprocessing
4-
import boto3
55
import os
66

7+
import boto3
78
from botocore import UNSIGNED
89
from botocore.config import Config
910

1011
from mds.core.s3file import S3File
11-
from mds.utils import logging_config
1212

1313
# conf
14+
logger = logging.getLogger("mds")
1415
lock = multiprocessing.Lock()
1516
S3_ENDPOINT = "https://s3.waw3-1.cloudferro.com"
16-
logger = logging_config.set_up("s3")
1717

1818

1919
class Singleton(type):

mds/core/utils.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import datetime
22
import hashlib
33
import json
4+
import logging
45
import os
56
import shutil
67
import time
7-
88
from typing import Sequence, Callable
99

10-
from mds.utils import logging_config
1110

12-
logger = logging_config.set_up("utils")
11+
logger = logging.getLogger("mds")
1312

1413

1514
def cwd() -> str:

mds/core/wrapper.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616

1717
from mds.core import utils, copernicus
1818
from mds.core.utils import etag_match
19-
from mds.utils import logging_config
2019

21-
# log
22-
logger = logging_config.set_up("mds")
20+
logger = logging.getLogger("mds")
2321

2422
# conf
2523
DOWNLOAD_MODES = ["subset", "get"]

mds/mng/app.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

mds/mng/cli.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,17 @@
99

1010
import click
1111

12-
from mds.core import wrapper
13-
from mds.core import mds_s3
12+
from mds import mds_s3
13+
from mds import wrapper
14+
from mds.mng import initializer
15+
16+
verbose = click.option(
17+
"--log-level",
18+
"LOG_LEVEL",
19+
type=click.Choice(["DEBUG", "INFO", "WARN", "ERROR", "CRITICAL", "QUIET"]),
20+
default="INFO",
21+
help="Verbosity level based on standard logging library",
22+
)
1423

1524

1625
@click.group()
@@ -79,6 +88,8 @@ def cli():
7988
)
8089
@click.option("-n", "--username", type=str, default=None, help="Username")
8190
@click.option("-w", "--password", type=str, default=None, help="Password")
91+
@verbose
92+
@initializer.init_app()
8293
def subset(**kwargs):
8394
wrapper.mds_download("subset", **kwargs)
8495

@@ -124,6 +135,8 @@ def subset(**kwargs):
124135
)
125136
@click.option("-n", "--username", type=str, default=None, help="Username")
126137
@click.option("-w", "--password", type=str, default=None, help="Password")
138+
@verbose
139+
@initializer.init_app()
127140
def get(**kwargs):
128141
update = kwargs.pop("update")
129142
if update:
@@ -138,6 +151,8 @@ def get(**kwargs):
138151
@click.option(
139152
"-g", "--dataset-version", type=str, default=None, help="Dataset version or tag"
140153
)
154+
@verbose
155+
@initializer.init_app()
141156
def file_list(*args, **kwargs):
142157
mds_file_list = wrapper.mds_list(*args, **kwargs)
143158
print(f"{' '.join(mds_file_list)}")
@@ -174,6 +189,8 @@ def file_list(*args, **kwargs):
174189
default=None,
175190
help="Pattern to filter data (no regex)",
176191
)
192+
@verbose
193+
@initializer.init_app()
177194
def etag(**kwargs):
178195
s3_files = wrapper.mds_etag(**kwargs)
179196
for s3_file in s3_files:
@@ -245,6 +262,8 @@ def etag(**kwargs):
245262
default=False,
246263
help="Update the file if it changes on the server using etag information",
247264
)
265+
@verbose
266+
@initializer.init_app()
248267
def s3_get(**kwargs):
249268
mds_s3.download_files(**kwargs)
250269

@@ -281,6 +300,8 @@ def s3_get(**kwargs):
281300
@click.option(
282301
"-r", "--recursive", is_flag=True, default=False, help="List recursive all s3 files"
283302
)
303+
@verbose
304+
@initializer.init_app()
284305
def s3_list(**kwargs):
285306
s3_files = mds_s3.get_file_list(**kwargs)
286307
print(f"{' '.join([f.file for f in s3_files])}")

mds/mng/initializer.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""Entry point to mds-toolbox API"""
2+
3+
import functools
4+
5+
import mds
6+
7+
8+
def init_app():
9+
"""Initialize the application functions before the execution"""
10+
11+
def decorated(func):
12+
@functools.wraps(func)
13+
def setup(**kwargs):
14+
"""
15+
Extract app settings and configure application setup, then start mds functions.
16+
17+
Args:
18+
**kwargs: Arbitrary keyword arguments passed to the function.
19+
"""
20+
user_settings = dict()
21+
# Assume that upper settings are app settings related
22+
upper_keys = [k for k in kwargs.keys() if k.isupper()]
23+
24+
# Remove upper settings from plot arguments to avoid crash in PlotSettings class
25+
for k in upper_keys:
26+
user_settings[k] = kwargs.pop(k)
27+
28+
# Perform general app initialization
29+
mds.setup(**user_settings)
30+
31+
# Start application
32+
return func(**kwargs)
33+
34+
# Return the setup function which wraps the original function
35+
return setup
36+
37+
# Return the decorator function
38+
return decorated

0 commit comments

Comments
 (0)