Skip to content

Commit 43cfabd

Browse files
feature: implement logger
1 parent ef8557a commit 43cfabd

File tree

7 files changed

+63
-10
lines changed

7 files changed

+63
-10
lines changed

poetry.lock

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "api-to-dataframe"
3-
version = "1.3.1a0"
3+
version = "1.3.0"
44
description = "A package to convert API responses to pandas dataframe"
55
authors = ["IvanildoBarauna <ivanildo.jnr@outlook.com>"]
66
readme = "README.md"
@@ -26,6 +26,7 @@ Repository = "https://github.com/IvanildoBarauna/api-to-dataframe"
2626
python = "^3.9"
2727
pandas = "^2.2.2"
2828
requests = "^2.32.3"
29+
logging = "^0.4.9.6"
2930

3031
[tool.poetry.group.dev.dependencies]
3132
poetry-dynamic-versioning = "^1.3.0"

src/api_to_dataframe/controller/client_builder.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from api_to_dataframe.models.retainer import retry_strategies, Strategies
22
from api_to_dataframe.models.get_data import GetData
3+
from api_to_dataframe.utils.logger import log, LogLevel
34

45

56
class ClientBuilder:
@@ -33,13 +34,17 @@ def __init__( # pylint: disable=too-many-arguments
3334
if headers is None:
3435
headers = {}
3536
if endpoint == "":
36-
raise ValueError("::: endpoint param is mandatory :::")
37+
log("endpoint param is mandatory", LogLevel.ERROR)
38+
raise ValueError
3739
if not isinstance(retries, int) or retries < 0:
38-
raise ValueError("retries must be a non-negative integer")
40+
log("retries must be a non-negative integer", LogLevel.ERROR)
41+
raise ValueError
3942
if not isinstance(initial_delay, int) or initial_delay < 0:
40-
raise ValueError("delay must be a non-negative integer")
43+
log("delay must be a non-negative integer", LogLevel.ERROR)
44+
raise ValueError
4145
if not isinstance(connection_timeout, int) or connection_timeout < 0:
42-
raise ValueError("connection_timeout must be a non-negative integer")
46+
log("connection_timeout must be a non-negative integer", LogLevel.ERROR)
47+
raise ValueError
4348

4449
self.endpoint = endpoint
4550
self.retry_strategy = retry_strategy
@@ -61,6 +66,7 @@ def get_api_data(self):
6166
headers=self.headers,
6267
connection_timeout=self.connection_timeout,
6368
)
69+
6470
return response.json()
6571

6672
def _get_raw_api_data(self):
@@ -74,4 +80,5 @@ def _get_raw_api_data(self):
7480
@staticmethod
7581
def api_to_dataframe(response: dict):
7682
df = GetData.to_dataframe(response)
83+
log("serialized to dataframe: OK", LogLevel.INFO)
7784
return df
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
import requests
22
import pandas as pd
33

4+
from api_to_dataframe.utils.logger import log, LogLevel
5+
46

57
class GetData:
68
@staticmethod
79
def get_response(endpoint: str, headers: dict, connection_timeout: int):
810
response = requests.get(endpoint, timeout=connection_timeout, headers=headers)
911
response.raise_for_status()
12+
log("get_response: ok", LogLevel.INFO)
1013
return response
1114

1215
@staticmethod
1316
def to_dataframe(response):
1417
try:
1518
df = pd.DataFrame(response)
1619
except Exception as err:
20+
log(f"Error serializing to dataframe: {err}", LogLevel.ERROR)
1721
raise TypeError(
1822
f"Invalid response for transform in dataframe: {err}"
1923
) from err
2024

2125
if df.empty:
26+
log("DataFrame is empty", LogLevel.ERROR)
2227
raise ValueError("::: DataFrame is empty :::")
2328

2429
return df

src/api_to_dataframe/models/retainer.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import time
22
from enum import Enum
33
from requests.exceptions import RequestException
4+
from api_to_dataframe.utils.logger import log, LogLevel
45

56

67
class Strategies(Enum):
@@ -14,9 +15,10 @@ def wrapper(*args, **kwargs): # pylint: disable=inconsistent-return-statements
1415
retry_number = 0
1516
while retry_number < args[0].retries:
1617
try:
17-
print(
18+
log(
1819
f"Trying for the {retry_number + 1} of {args[0].retries} retries. "
19-
f"Using {args[0].retry_strategy}"
20+
f"Using {args[0].retry_strategy}",
21+
LogLevel.INFO,
2022
)
2123
return func(*args, **kwargs)
2224
except RequestException as e:
@@ -30,8 +32,9 @@ def wrapper(*args, **kwargs): # pylint: disable=inconsistent-return-statements
3032
time.sleep(args[0].delay * 2**retry_number)
3133

3234
if retry_number == args[0].retries:
33-
print(
34-
f"Failed after {retry_number} retries using {args[0].retry_strategy}"
35+
log(
36+
f"Failed after {retry_number} retries using {args[0].retry_strategy}",
37+
LogLevel.ERROR,
3538
)
3639
raise e
3740

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import logging
2+
from enum import Enum
3+
4+
5+
class LogLevel(Enum):
6+
INFO = logging.INFO
7+
WARNING = logging.WARNING
8+
ERROR = logging.ERROR
9+
10+
11+
# Configure logging once at the start of your program
12+
logging.basicConfig(
13+
encoding="utf-8",
14+
format="%(asctime)s :: %(levelname)s :: %(message)s",
15+
datefmt="%Y-%m-%d %H:%M:%S %Z",
16+
level=logging.DEBUG,
17+
)
18+
19+
20+
def log(message: str, level: LogLevel):
21+
logger = logging.getLogger("api-to-dataframe")
22+
logger.log(level.value, message)
23+
24+
25+
log("This is an info message", LogLevel.INFO)
26+
log("This is a warning message", LogLevel.WARNING)
27+
log("This is an error message", LogLevel.ERROR)

src/api_to_dataframe/views/dataframe_metrics.py

Whitespace-only changes.

0 commit comments

Comments
 (0)