Skip to content

Commit 8d6714b

Browse files
committed
Add pylint and black
1 parent 0c3294a commit 8d6714b

36 files changed

+1011
-633
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Check PR Title
2+
3+
on:
4+
pull_request:
5+
branches: [ master ]
6+
types: [opened, edited, synchronize, reopened]
7+
8+
jobs:
9+
commitlint:
10+
name: Check PR title
11+
runs-on: ubuntu-latest
12+
steps:
13+
- name: Setup Node.js
14+
uses: actions/setup-node@v4
15+
with:
16+
node-version: '18.x'
17+
18+
- name: Setup
19+
run: |
20+
npm install -g @commitlint/cli @commitlint/config-conventional
21+
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
22+
23+
- name: Verify PR title is in the correct format
24+
env:
25+
TITLE: ${{ github.event.pull_request.title }}
26+
run: |
27+
echo $TITLE | npx commitlint -V

.github/workflows/pylint.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Pylint
2+
3+
on:
4+
pull_request:
5+
branches: [ master ]
6+
types: [opened, edited, synchronize, reopened]
7+
8+
jobs:
9+
pylint:
10+
runs-on: ubuntu-22.04
11+
steps:
12+
- name: Check out ${{ github.ref }}
13+
uses: actions/checkout@v3
14+
15+
- name: Set up Python 3.11
16+
uses: actions/setup-python@v4
17+
with:
18+
python-version: 3.11
19+
20+
- name: Install Dependencies
21+
run: |
22+
python -m pip install --upgrade pip
23+
pip install -r dev-requirements.txt
24+
25+
- name: Run Pylint
26+
run: |
27+
pylint -E ./honeybager

dev-requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
aiounittest
22
async-asgi-testclient
3+
black
34
blinker
45
celery
56
django
@@ -11,6 +12,7 @@ jinja2
1112
markupsafe
1213
mock
1314
psutil
15+
pylint
1416
pytest
1517
pytest-cov
1618
six

honeybadger/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from .core import Honeybadger
1212
from .version import __version__
1313

14-
__all__ = ['honeybadger', '__version__']
14+
__all__ = ["honeybadger", "__version__"]
1515

1616
honeybadger = Honeybadger()
1717
honeybadger.wrap_excepthook(sys.excepthook)

honeybadger/config.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,33 @@
55

66

77
class Configuration(object):
8-
DEVELOPMENT_ENVIRONMENTS = ['development', 'dev', 'test']
8+
DEVELOPMENT_ENVIRONMENTS = ["development", "dev", "test"]
99

1010
OPTIONS = (
11-
('api_key', str),
12-
('project_root', str),
13-
('environment', str),
14-
('hostname', str),
15-
('endpoint', str),
16-
('params_filters', list),
17-
('force_report_data', bool),
18-
('force_sync', bool),
19-
('excluded_exceptions', list),
20-
('report_local_variables', bool)
11+
("api_key", str),
12+
("project_root", str),
13+
("environment", str),
14+
("hostname", str),
15+
("endpoint", str),
16+
("params_filters", list),
17+
("force_report_data", bool),
18+
("force_sync", bool),
19+
("excluded_exceptions", list),
20+
("report_local_variables", bool),
2121
)
2222

2323
def __init__(self, *args, **kwargs):
24-
self.api_key = ''
24+
self.api_key = ""
2525
self.project_root = os.getcwd()
26-
self.environment = 'production'
26+
self.environment = "production"
2727
self.hostname = socket.gethostname()
28-
self.endpoint = 'https://api.honeybadger.io'
29-
self.params_filters = ['password', 'password_confirmation', 'credit_card', 'CSRF_COOKIE']
28+
self.endpoint = "https://api.honeybadger.io"
29+
self.params_filters = [
30+
"password",
31+
"password_confirmation",
32+
"credit_card",
33+
"CSRF_COOKIE",
34+
]
3035
self.force_report_data = False
3136
self.force_sync = self.is_aws_lambda_environment
3237
self.excluded_exceptions = []
@@ -37,12 +42,14 @@ def __init__(self, *args, **kwargs):
3742

3843
def set_12factor_config(self):
3944
for option in list(zip(*self.OPTIONS))[0]:
40-
val = os.environ.get('HONEYBADGER_{}'.format(option.upper()), getattr(self, option))
45+
val = os.environ.get(
46+
"HONEYBADGER_{}".format(option.upper()), getattr(self, option)
47+
)
4148
option_types = dict(self.OPTIONS)
4249

4350
try:
4451
if option_types[option] is list:
45-
val = val.split(',')
52+
val = val.split(",")
4653
elif option_types[option] is int:
4754
val = int(val)
4855
elif option_types[option] is bool:
@@ -53,7 +60,7 @@ def set_12factor_config(self):
5360
setattr(self, option, val)
5461

5562
def set_config_from_dict(self, config):
56-
for (key, value) in iteritems(config):
63+
for key, value in iteritems(config):
5764
if key in list(zip(*self.OPTIONS))[0]:
5865
setattr(self, key, value)
5966

honeybadger/connection.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,31 @@
99

1010
logger = logging.getLogger(__name__)
1111

12+
1213
def _make_http_request(path, config, payload):
1314

1415
if not config.api_key:
15-
logger.error("Honeybadger API key missing from configuration: cannot report errors.")
16+
logger.error(
17+
"Honeybadger API key missing from configuration: cannot report errors."
18+
)
1619
return
17-
18-
request_object = request.Request(url=config.endpoint + path,
19-
data=b(json.dumps(payload, cls=StringReprJSONEncoder)))
20-
request_object.add_header('X-Api-Key', config.api_key)
21-
request_object.add_header('Content-Type', 'application/json')
22-
request_object.add_header('Accept', 'application/json')
20+
21+
request_object = request.Request(
22+
url=config.endpoint + path,
23+
data=b(json.dumps(payload, cls=StringReprJSONEncoder)),
24+
)
25+
request_object.add_header("X-Api-Key", config.api_key)
26+
request_object.add_header("Content-Type", "application/json")
27+
request_object.add_header("Accept", "application/json")
2328

2429
def send_request():
2530
response = request.urlopen(request_object)
2631

2732
status = response.getcode()
2833
if status != 201:
29-
logger.error("Received error response [{}] from Honeybadger API.".format(status))
34+
logger.error(
35+
"Received error response [{}] from Honeybadger API.".format(status)
36+
)
3037

3138
if config.force_sync:
3239
send_request()
@@ -37,11 +44,11 @@ def send_request():
3744

3845
def send_notice(config, payload):
3946
notice_id = payload.get("error", {}).get("token", None)
40-
path = '/v1/notices/'
47+
path = "/v1/notices/"
4148
_make_http_request(path, config, payload)
4249
return notice_id
4350

4451

4552
def send_event(config, payload):
46-
path = '/v1/events/'
53+
path = "/v1/events/"
4754
return _make_http_request(path, config, payload)

honeybadger/contrib/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from honeybadger.contrib.celery import CeleryHoneybadger
77

88
__all__ = [
9-
'FlaskHoneybadger',
10-
'DjangoHoneybadgerMiddleware',
11-
'AWSLambdaPlugin',
12-
'HoneybadgerHandler'
13-
'ASGIHoneybadger',
14-
'CeleryHoneybadger',
9+
"FlaskHoneybadger",
10+
"DjangoHoneybadgerMiddleware",
11+
"AWSLambdaPlugin",
12+
"HoneybadgerHandler",
13+
"ASGIHoneybadger",
14+
"CeleryHoneybadger",
1515
]

honeybadger/contrib/asgi.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ def __init__(self, app, **kwargs):
103103
def _run_asgi2(self, scope):
104104
async def inner(receive, send):
105105
return await self._run_app(scope, lambda: self.app(scope)(receive, send))
106+
106107
return inner
107108

108109
async def _run_asgi3(self, scope, receive, send):

honeybadger/contrib/aws_lambda.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414

1515
_thread_locals = local()
16-
REQUEST_LOCAL_KEY = '__awslambda_current_request'
16+
REQUEST_LOCAL_KEY = "__awslambda_current_request"
1717

1818

1919
def current_event():
@@ -63,7 +63,9 @@ def get_lambda_bootstrap():
6363
return sys.modules["bootstrap"]
6464
elif "__main__" in sys.modules:
6565
module = sys.modules["__main__"]
66-
if hasattr(module, "awslambdaricmain") and hasattr(module.awslambdaricmain, "bootstrap"):
66+
if hasattr(module, "awslambdaricmain") and hasattr(
67+
module.awslambdaricmain, "bootstrap"
68+
):
6769
return module.awslambdaricmain.bootstrap
6870
elif hasattr(module, "bootstrap"):
6971
return module.bootstrap
@@ -96,10 +98,12 @@ def wrapped_handler(aws_event, aws_context, *args, **kwargs):
9698
class AWSLambdaPlugin(Plugin):
9799

98100
def __init__(self):
99-
super(AWSLambdaPlugin, self).__init__('AWSLambda')
101+
super(AWSLambdaPlugin, self).__init__("AWSLambda")
100102
lambda_bootstrap = get_lambda_bootstrap()
101103
if not lambda_bootstrap:
102-
logger.warning('Lambda function not wrapped by honeybadger: Unable to locate bootstrap module.')
104+
logger.warning(
105+
"Lambda function not wrapped by honeybadger: Unable to locate bootstrap module."
106+
)
103107
self.initialize_request_handler(lambda_bootstrap)
104108

105109
def supports(self, config, context):
@@ -110,13 +114,10 @@ def generate_payload(self, default_payload, config, context):
110114
Generate payload by checking the lambda's
111115
request event
112116
"""
113-
request_payload = {
114-
"params": {
115-
"event": current_event()
116-
},
117-
"context": context
118-
}
119-
default_payload["request"].update(filter_dict(request_payload, config.params_filters))
117+
request_payload = {"params": {"event": current_event()}, "context": context}
118+
default_payload["request"].update(
119+
filter_dict(request_payload, config.params_filters)
120+
)
120121

121122
AWS_ENV_MAP = (
122123
("_HANDLER", "handler"),
@@ -126,10 +127,12 @@ def generate_payload(self, default_payload, config, context):
126127
("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "memory"),
127128
("AWS_LAMBDA_FUNCTION_VERSION", "version"),
128129
("AWS_LAMBDA_LOG_GROUP_NAME", "log_group"),
129-
("AWS_LAMBDA_LOG_STREAM_NAME", "log_name")
130+
("AWS_LAMBDA_LOG_STREAM_NAME", "log_name"),
130131
)
131132

132-
lambda_details = {detail[1]: os.environ.get(detail[0], None) for detail in AWS_ENV_MAP}
133+
lambda_details = {
134+
detail[1]: os.environ.get(detail[0], None) for detail in AWS_ENV_MAP
135+
}
133136
default_payload["details"] = {}
134137
default_payload["details"]["Lambda Details"] = lambda_details
135138
default_payload["request"]["component"] = lambda_details["function"]
@@ -146,6 +149,7 @@ def initialize_request_handler(self, lambda_bootstrap):
146149
and override it with a wrapped version
147150
"""
148151
if hasattr(lambda_bootstrap, "handle_http_request"): # pre python3.7
152+
149153
def event_handler(request_handler, *args, **kwargs):
150154
request_handler = _wrap_lambda_handler(request_handler)
151155
return original_event_handler(request_handler, *args, **kwargs)
@@ -161,13 +165,18 @@ def http_handler(request_handler, *args, **kwargs):
161165
lambda_bootstrap.handle_event_request = event_handler
162166
lambda_bootstrap.handle_http_request = http_handler
163167

164-
except AttributeError as e: # Fail safely if we can't monkeypatch lambda handler
165-
logger.warning('Lambda function not wrapped by honeybadger: %s' % e)
168+
except (
169+
AttributeError
170+
) as e: # Fail safely if we can't monkeypatch lambda handler
171+
logger.warning("Lambda function not wrapped by honeybadger: %s" % e)
166172

167173
else:
174+
168175
def event_handler(lambda_runtime_client, request_handler, *args, **kwargs):
169176
request_handler = _wrap_lambda_handler(request_handler)
170-
return original_event_handler(lambda_runtime_client, request_handler, *args, **kwargs)
177+
return original_event_handler(
178+
lambda_runtime_client, request_handler, *args, **kwargs
179+
)
171180

172181
try:
173182
original_event_handler = lambda_bootstrap.handle_event_request
@@ -178,4 +187,4 @@ def event_handler(lambda_runtime_client, request_handler, *args, **kwargs):
178187
# either of these will raise an Attribute error as "handle_event_request" or "handle_event_request"
179188
# may not be found.
180189
except AttributeError as e:
181-
logger.warning('Lambda function not wrapped by honeybadger: %s' % e)
190+
logger.warning("Lambda function not wrapped by honeybadger: %s" % e)

honeybadger/contrib/celery.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def generate_payload(self, default_payload, config, context):
2828

2929
# Ensure we have a mutable context dictionary
3030
context = dict(context or {})
31-
31+
3232
# Add Celery task information to context
3333
context.update(
3434
task_id=current_task.request.id,

0 commit comments

Comments
 (0)