cloe-logging 0.3.8__py3-none-any.whl → 0.3.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,8 +2,8 @@ import functools
2
2
  import logging
3
3
  import sys
4
4
  import time
5
- from typing import Any
6
5
  from collections.abc import Callable
6
+ from typing import Any
7
7
 
8
8
  from cloe_logging.formatters import DevOpsFormatter
9
9
 
@@ -52,7 +52,7 @@ def build_logger():
52
52
  start = time.time()
53
53
  value = func(*args, **kwargs)
54
54
  end = time.time()
55
- logger.info(f"\n##### END {func.__name__} DURATION [ '{round(end-start)}'s ] #####")
55
+ logger.info(f"\n##### END {func.__name__} DURATION [ '{round(end - start)}'s ] #####")
56
56
  except:
57
57
  logger.error(f"ERROR: {str(sys.exc_info()[1])}")
58
58
  raise
@@ -1,4 +1,4 @@
1
- from .dict_formatter import DictFormatter
2
1
  from .devops_formatter import DevOpsFormatter
2
+ from .dict_formatter import DictFormatter
3
3
 
4
4
  __all__ = ["DictFormatter", "DevOpsFormatter"]
@@ -61,7 +61,7 @@ class DevOpsFormatter(logging.Formatter):
61
61
  if record.levelno == logging.INFO:
62
62
  record_message = record.msg # f"{record.name} -- {record.msg}"
63
63
 
64
- return f"{self.parse_progress(record.msg)}{self.parse_group_start(record.msg)}{record_message}{self.parse_group_end(record.msg)}"
64
+ return f"{self.parse_progress(record.msg)}{self.parse_group_start(record.msg)}{record_message}{self.parse_group_end(record.msg)}" # noqa: E501
65
65
 
66
66
  # Replace the original format with one customized by logging level
67
67
  if record.levelno == logging.DEBUG:
@@ -1,5 +1,5 @@
1
- import logging
2
1
  import json
2
+ import logging
3
3
 
4
4
 
5
5
  class DictFormatter(logging.Formatter):
@@ -1,5 +1,5 @@
1
- from .unity_catalog_handler import UnityCatalogHandler
2
1
  from .log_analytics_handler import LogAnalyticsHandler
3
2
  from .snowflake_handler import SnowflakeHandler
3
+ from .unity_catalog_handler import UnityCatalogHandler
4
4
 
5
5
  __all__ = ["UnityCatalogHandler", "LogAnalyticsHandler", "SnowflakeHandler"]
@@ -3,7 +3,7 @@ import hashlib
3
3
  import hmac
4
4
  import logging
5
5
  import os
6
- from datetime import datetime
6
+ from datetime import UTC, datetime
7
7
 
8
8
  try:
9
9
  import requests
@@ -37,7 +37,7 @@ class LogAnalyticsHandler(logging.Handler):
37
37
  test_connectivity: bool = True,
38
38
  column_split_char: str = "|",
39
39
  key_value_split_char: str = ":",
40
- **kwargs, # required to work with the Factory
40
+ **kwargs, # noqa: ARG002 required to work with the Factory
41
41
  ):
42
42
  """Initializes a new instance of the LogAnalyticsHandler class.
43
43
 
@@ -99,7 +99,7 @@ class LogAnalyticsHandler(logging.Handler):
99
99
  )
100
100
  self.levelname = "INFO"
101
101
 
102
- def getMessage(self):
102
+ def getMessage(self): # noqa: N802 mimics logging.LogRecord.getMessage
103
103
  return self.msg
104
104
 
105
105
  try:
@@ -154,8 +154,7 @@ class LogAnalyticsHandler(logging.Handler):
154
154
  encoded_hash = base64.b64encode(
155
155
  hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest(),
156
156
  ).decode()
157
- authorization = f"SharedKey {self.workspace_id}:{encoded_hash}"
158
- return authorization
157
+ return f"SharedKey {self.workspace_id}:{encoded_hash}"
159
158
 
160
159
  def _make_message_compliant(self, input_string):
161
160
  """Encodes the input string as UTF-8 to make it compliant.
@@ -174,8 +173,7 @@ class LogAnalyticsHandler(logging.Handler):
174
173
  Returns:
175
174
  str: The URL of the Azure Log Analytics workspace.
176
175
  """
177
- uri = f"https://{self.workspace_id}.ods.opinsights.azure.com{self.RESOURCE}?api-version=2016-04-01"
178
- return uri
176
+ return f"https://{self.workspace_id}.ods.opinsights.azure.com{self.RESOURCE}?api-version=2016-04-01"
179
177
 
180
178
  def emit(self, record: logging.LogRecord):
181
179
  """Sends the log message to Azure Log Analytics.
@@ -198,7 +196,7 @@ class LogAnalyticsHandler(logging.Handler):
198
196
  log_message_dict = self.serializer.serialize(log_message)
199
197
  compliant_log_message = self._make_message_compliant(str(log_message_dict))
200
198
  content_length = len(compliant_log_message)
201
- rfc1123date = datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT")
199
+ rfc1123date = datetime.now(UTC).strftime("%a, %d %b %Y %H:%M:%S GMT")
202
200
  signature = self._build_signature(rfc1123date, content_length)
203
201
 
204
202
  headers = {
@@ -2,8 +2,10 @@ import logging
2
2
  import os
3
3
 
4
4
  try:
5
- from cloe_util_snowflake_connector.connection_parameters import ConnectionParameters
6
- from cloe_util_snowflake_connector.snowflake_interface import SnowflakeInterface
5
+ from cloe_util_snowflake_connector.connection_parameters import ( # type: ignore[import-not-found]
6
+ ConnectionParameters,
7
+ )
8
+ from cloe_util_snowflake_connector.snowflake_interface import SnowflakeInterface # type: ignore[import-not-found]
7
9
  except ImportError:
8
10
  ConnectionParameters = None # type: ignore
9
11
  SnowflakeInterface = None # type: ignore
@@ -24,7 +26,7 @@ class SnowflakeHandler(logging.Handler):
24
26
  target_table: str = "",
25
27
  column_split_char: str = "|",
26
28
  key_value_split_char: str = ":",
27
- **kwargs, # required to work with the Factory
29
+ **kwargs, # noqa: ARG002 required to work with the Factory
28
30
  ):
29
31
  """Initializes a new instance of the SnowflakeHandler class.
30
32
 
@@ -79,8 +81,7 @@ class SnowflakeHandler(logging.Handler):
79
81
 
80
82
  def _get_snowflake_connection(self) -> SnowflakeInterface:
81
83
  conn_params = ConnectionParameters.init_from_env_variables()
82
- snowflake_conn = SnowflakeInterface(conn_params)
83
- return snowflake_conn
84
+ return SnowflakeInterface(conn_params)
84
85
 
85
86
  def _parse_dict_to_sql_insert(self, input_dict: dict) -> str:
86
87
  """
@@ -95,11 +96,7 @@ class SnowflakeHandler(logging.Handler):
95
96
  """
96
97
  columns = ", ".join(input_dict.keys())
97
98
  values = ", ".join(f"'{str(v)}'" for v in input_dict.values())
98
- sql_statement = (
99
- f"INSERT INTO {self.target_db}.{self.target_schema}.{self.target_table} ({columns}) VALUES ({values})"
100
- )
101
-
102
- return sql_statement
99
+ return f"INSERT INTO {self.target_db}.{self.target_schema}.{self.target_table} ({columns}) VALUES ({values})"
103
100
 
104
101
  def emit(self, record: logging.LogRecord):
105
102
  """Sends the log message to Snowflake.
@@ -3,8 +3,8 @@ import logging
3
3
  from typing import cast
4
4
 
5
5
  try:
6
- from databricks.sdk import WorkspaceClient
7
- from databricks.sdk.service.sql import ExecuteStatementRequestOnWaitTimeout
6
+ from databricks.sdk import WorkspaceClient # type: ignore[import-not-found]
7
+ from databricks.sdk.service.sql import ExecuteStatementRequestOnWaitTimeout # type: ignore[import-not-found]
8
8
  except ImportError:
9
9
  WorkspaceClient = None # type: ignore
10
10
  ExecuteStatementRequestOnWaitTimeout = None # type: ignore
@@ -60,7 +60,8 @@ class UnityCatalogHandler(logging.Handler):
60
60
  self.warehouse_id = cast(str, warehouse_id)
61
61
  if not all([self.catalog, self.schema, self.table, self.warehouse_id, self.workspace_url]):
62
62
  raise ValueError(
63
- "You must provide a workspace_url, warehouse_id, catalog, schema, and table to create a DatabricksHandler."
63
+ "You must provide a workspace_url, warehouse_id, catalog,"
64
+ " schema, and table to create a DatabricksHandler."
64
65
  )
65
66
  self.table_identifier = f"{self.catalog}.{self.schema}.{self.table}"
66
67
  self.workspace_client = workspace_client or WorkspaceClient(host=self.workspace_url)
@@ -136,8 +137,7 @@ class UnityCatalogHandler(logging.Handler):
136
137
  timestamp = split_values[0]
137
138
  casted_timestamp = f"to_timestamp({timestamp}, 'yyyy-MM-dd HH:mm:ss,SSS')"
138
139
  joined_values = ", ".join([casted_timestamp] + split_values[1:])
139
- sql_statement = f"INSERT INTO {self.table_identifier} ({columns}) VALUES ({joined_values})"
140
- return sql_statement
140
+ return f"INSERT INTO {self.table_identifier} ({columns}) VALUES ({joined_values})"
141
141
 
142
142
  def emit(self, record: logging.LogRecord) -> None:
143
143
  """Put a log record into the Queue.
@@ -1,7 +1,8 @@
1
1
  import logging
2
2
  from collections.abc import Callable
3
+ from typing import cast
3
4
 
4
- from cloe_logging.handlers import UnityCatalogHandler, SnowflakeHandler, LogAnalyticsHandler
5
+ from cloe_logging.handlers import LogAnalyticsHandler, SnowflakeHandler, UnityCatalogHandler
5
6
 
6
7
 
7
8
  class LoggerFactory:
@@ -47,18 +48,18 @@ class LoggerFactory:
47
48
  log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
48
49
  **kwargs,
49
50
  ) -> logging.Handler:
50
- HANDLER_FUNCTIONS: dict[str, Callable] = {
51
+ handler_functions: dict[str, Callable] = {
51
52
  "console": LoggerFactory.get_console_handler,
52
53
  "file": LoggerFactory.get_file_handler,
53
54
  "unity_catalog": LoggerFactory.get_unity_catalog_handler,
54
55
  "snowflake": LoggerFactory.get_snowflake_handler,
55
56
  "log_analytics": LoggerFactory.get_log_analytics_handler,
56
57
  }
57
- handler = HANDLER_FUNCTIONS[handler_type](**kwargs, log_format=log_format)
58
- return handler
58
+ handler = handler_functions[handler_type](**kwargs, log_format=log_format)
59
+ return cast(logging.Handler, handler)
59
60
 
60
61
  @staticmethod
61
- def get_console_handler(log_format: str, **kwargs) -> logging.Handler:
62
+ def get_console_handler(log_format: str, **kwargs) -> logging.Handler: # noqa: ARG004
62
63
  handler = logging.StreamHandler()
63
64
  handler.setFormatter(logging.Formatter(log_format))
64
65
  return handler
@@ -70,7 +71,7 @@ class LoggerFactory:
70
71
  mode: str = "a",
71
72
  encoding: str | None = None,
72
73
  delay: bool = False,
73
- **kwargs,
74
+ **kwargs, # noqa: ARG004
74
75
  ) -> logging.Handler:
75
76
  if filename is None:
76
77
  raise ValueError("filename is required for file logger")
@@ -89,7 +90,7 @@ class LoggerFactory:
89
90
  warehouse_id: str,
90
91
  column_split_char: str = DEFAULT_COLUMN_SPLIT_CHAR,
91
92
  key_value_split_char: str = DEFAULT_KEY_VALUE_SPLIT_CHAR,
92
- **kwargs,
93
+ **kwargs, # noqa: ARG003
93
94
  ) -> logging.Handler:
94
95
  return UnityCatalogHandler(
95
96
  catalog=uc_catalog_name,
@@ -110,7 +111,7 @@ class LoggerFactory:
110
111
  target_table: str,
111
112
  column_split_char: str = DEFAULT_COLUMN_SPLIT_CHAR,
112
113
  key_value_split_char: str = DEFAULT_KEY_VALUE_SPLIT_CHAR,
113
- **kwargs,
114
+ **kwargs, # noqa: ARG003
114
115
  ) -> logging.Handler:
115
116
  return SnowflakeHandler(
116
117
  target_db=target_db,
@@ -129,7 +130,7 @@ class LoggerFactory:
129
130
  test_connectivity: bool,
130
131
  column_split_char: str = DEFAULT_COLUMN_SPLIT_CHAR,
131
132
  key_value_split_char: str = DEFAULT_KEY_VALUE_SPLIT_CHAR,
132
- **kwargs,
133
+ **kwargs, # noqa: ARG003
133
134
  ) -> logging.Handler:
134
135
  return LogAnalyticsHandler(
135
136
  workspace_id=workspace_id,
@@ -152,7 +153,7 @@ class LoggerFactory:
152
153
  The logger with the handler added.
153
154
  """
154
155
  if len(logger.handlers) > 0:
155
- if not any([isinstance(h, handler.__class__) for h in logger.handlers]):
156
+ if not any(isinstance(h, handler.__class__) for h in logger.handlers):
156
157
  logger.addHandler(handler)
157
158
  else:
158
159
  logger.addHandler(handler)
@@ -49,7 +49,8 @@ class DictSerializer(LogSerializer):
49
49
  dict: The converted dictionary.
50
50
 
51
51
  Raises:
52
- ValueError: If the log_record is not a string, or if any part of the log_record does not contain the key_value_split_char.
52
+ ValueError: If the log_record is not a string, or if any part of the
53
+ log_record does not contain the key_value_split_char.
53
54
  """
54
55
  if not isinstance(log_record, str):
55
56
  raise ValueError("record must be a string.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloe-logging
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: A Standardized Solution for logging to various targets.
5
5
  Author-email: David Achilles <david.achilles@accenture.com>, Ole Steinbrueck <ole.steinbrueck@accenture.com>
6
6
  License: Proprietary
@@ -0,0 +1,17 @@
1
+ cloe_logging/__init__.py,sha256=3rsW-XtJbAaENMtN9ah2qRZyQnZOtqTnkCE_OqXBLNw,74
2
+ cloe_logging/logger_factory.py,sha256=3H_5_Ry-l2ap2-aGe-bkh9lmDcHr0a81qLN8X7mkXaA,5666
3
+ cloe_logging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ cloe_logging/decorators/__init__.py,sha256=ZFfADCScnpZ3ofxNgle1UybF322cdH9vuIGCx3S9wUU,71
5
+ cloe_logging/decorators/devops_decorator.py,sha256=npuOLa2HLxPlhTN9HMa_EBqyVWQxv8HvlTtaICyfVRw,1961
6
+ cloe_logging/formatters/__init__.py,sha256=1hhmT6qeIGuom63oHrg_2SHQZpLWG2GclMSTmF-fR_g,136
7
+ cloe_logging/formatters/devops_formatter.py,sha256=EeTgN932jGisW1Q_z9RXdd0yvXuOgbN-CuFaSQ3usss,3315
8
+ cloe_logging/formatters/dict_formatter.py,sha256=QGUcCx3KrCAXFGkYD3SY4s13k0OIgSBn6fhijgJ4m0Y,1553
9
+ cloe_logging/handlers/__init__.py,sha256=5RTIz8UooLgVc9h5GnXvI2yF-FkOKiJBfHbSKHKitRE,236
10
+ cloe_logging/handlers/log_analytics_handler.py,sha256=x5gX98srlvBsEFmIWTISzO0v1Fx-O6CfsBDvyigA4YI,9048
11
+ cloe_logging/handlers/snowflake_handler.py,sha256=TWctiCR10UacVrkDCIF6Z1GvuhfhC7iIpNefzdTgd0Q,5049
12
+ cloe_logging/handlers/unity_catalog_handler.py,sha256=DabwGA-2_F1BGGUZnEA9YMSIPmeaUkhkKjo3Fm-rXps,6928
13
+ cloe_logging/utility/__init__.py,sha256=wp758l5P1M20bNUbbGojSkBUscFUgRd_TLLdnHgQ_l8,70
14
+ cloe_logging/utility/serializer.py,sha256=a_XNHC3DTPongLXcEBp7UCvVdmdjT-qAQ9ZHubCV0oI,2656
15
+ cloe_logging-0.3.9.dist-info/METADATA,sha256=QsOVBzsajELGWn-VhU9_uLYuVAEfAuYA7q5fcv7-GpQ,2487
16
+ cloe_logging-0.3.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
+ cloe_logging-0.3.9.dist-info/RECORD,,
@@ -1,17 +0,0 @@
1
- cloe_logging/__init__.py,sha256=3rsW-XtJbAaENMtN9ah2qRZyQnZOtqTnkCE_OqXBLNw,74
2
- cloe_logging/logger_factory.py,sha256=az_XcRSrUCge4yG3HXNqFPSPRJ0V8EMKmjPPl54UIms,5541
3
- cloe_logging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- cloe_logging/decorators/__init__.py,sha256=ZFfADCScnpZ3ofxNgle1UybF322cdH9vuIGCx3S9wUU,71
5
- cloe_logging/decorators/devops_decorator.py,sha256=1jCfNa22lU87u-QPNUt6fVLJOCINhZncYz76UjUh2XE,1959
6
- cloe_logging/formatters/__init__.py,sha256=0FbiRRJbo4zYgNb2QSxY5aGthu8evt9Gex5c_-jxCIs,136
7
- cloe_logging/formatters/devops_formatter.py,sha256=KwarCm_EPpRV-cZk6nGM3GZVNKN39FNOofXfC0KfkQg,3301
8
- cloe_logging/formatters/dict_formatter.py,sha256=PsbNXxdCZxtEC9g-nIukhdQwCcsCfz42EumHPHFt9-4,1553
9
- cloe_logging/handlers/__init__.py,sha256=xgYTK6qXJEgNFPZE6yHXwS1o9bmGuQQZ7so_7BncW7A,236
10
- cloe_logging/handlers/log_analytics_handler.py,sha256=2Z-Hg2mWgvqAbO3nvego9AjDy3PGgzPQOxVWL7x5GAY,9038
11
- cloe_logging/handlers/snowflake_handler.py,sha256=bZR5UIJIlivAJT3IeniVoFXlsQhq5-YDuSUH4qrXeL0,5054
12
- cloe_logging/handlers/unity_catalog_handler.py,sha256=aXIiwDq9tHHheAFMusHhEI9uvYpI39KCscuVntFvNLA,6879
13
- cloe_logging/utility/__init__.py,sha256=wp758l5P1M20bNUbbGojSkBUscFUgRd_TLLdnHgQ_l8,70
14
- cloe_logging/utility/serializer.py,sha256=uPdmpawqM3WXZQVxz63deCalvKJYxRNecxjBQeDzTIY,2639
15
- cloe_logging-0.3.8.dist-info/METADATA,sha256=Q99bSKcf_De64RBjVtSY-Y-T7RmuBPHpWMVSd9E04YM,2487
16
- cloe_logging-0.3.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
- cloe_logging-0.3.8.dist-info/RECORD,,