From d647789f87c78193f2eec245b28a3d17c72b09be Mon Sep 17 00:00:00 2001 From: Sanket Saurav Date: Mon, 4 Nov 2019 19:54:27 +0530 Subject: [PATCH] fix: Resolve some bug risks and code quality issues (#497) Changes: - Fix dangerous default argument in `twilio/base/serialize.py` (PYL-W0102) - Classmethods should have `cls` as the first arg. in `twilio/jwt/validation/__init__.py` and `twilio/base/page.py` (PYL-C0202) - Removed unused imports in `tests/unit/http/test_validation_client.py` and `tests/unit/http/test_http_client.py` (PYL-W0611) - Fix `len()` used as condition in `twilio/request_validator.py` (PYL-C1801) Also added `.deepsource.toml` configuration file to run continuous static analysis on the repository with DeepSource. --- .deepsource.toml | 25 +++++++++++++++++++++++ tests/unit/http/test_http_client.py | 4 +--- tests/unit/http/test_validation_client.py | 1 - twilio/base/page.py | 2 +- twilio/base/serialize.py | 9 +++++++- twilio/jwt/validation/__init__.py | 4 ++-- twilio/request_validator.py | 6 +++--- 7 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000000..1fc2a332af --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,25 @@ +version = 1 + +exclude_patterns = [ + 'examples/**', + + # auto-generated files + 'twilio/rest/**', + 'twilio/twiml/**', + 'tests/integration/**', + + # compat files + 'twilio/compat.py', +] + +test_patterns = [ + 'tests/**' +] + +[[analyzers]] +name = "python" +enabled = true + + [analyzers.meta] + max_line_length = 100 + skip_doc_coverage = ["module", "magic", "class"] diff --git a/tests/unit/http/test_http_client.py b/tests/unit/http/test_http_client.py index 54d1d910f5..7fd727949c 100644 --- a/tests/unit/http/test_http_client.py +++ b/tests/unit/http/test_http_client.py @@ -1,10 +1,8 @@ # -*- coding: utf-8 -*- -import six - import unittest from mock import patch, Mock -from requests import Request, Session +from requests import Session from twilio.http.http_client import TwilioHttpClient from twilio.http.response import Response diff --git a/tests/unit/http/test_validation_client.py b/tests/unit/http/test_validation_client.py index e626701325..87a6ad26ed 100644 --- a/tests/unit/http/test_validation_client.py +++ b/tests/unit/http/test_validation_client.py @@ -2,7 +2,6 @@ import unittest -import mock from mock import patch, Mock from requests import Request from requests import Session diff --git a/twilio/base/page.py b/twilio/base/page.py index e355c18680..3183efb180 100644 --- a/twilio/base/page.py +++ b/twilio/base/page.py @@ -48,7 +48,7 @@ def next(self): return self.get_instance(next(self._records)) @classmethod - def process_response(self, response): + def process_response(cls, response): """ Load a JSON response. diff --git a/twilio/base/serialize.py b/twilio/base/serialize.py index c0fcf1023f..f70a5f5db5 100644 --- a/twilio/base/serialize.py +++ b/twilio/base/serialize.py @@ -39,7 +39,14 @@ def prefixed_collapsible_map(m, prefix): if m == values.unset: return {} - def flatten_dict(d, result={}, prv_keys=[]): + def flatten_dict(d, result=None, prv_keys=None): + + if result is None: + result = {} + + if prv_keys is None: + prv_keys = [] + for k, v in d.items(): if isinstance(v, dict): flatten_dict(v, result, prv_keys + [k]) diff --git a/twilio/jwt/validation/__init__.py b/twilio/jwt/validation/__init__.py index 70c1d41ec4..63b9292bcf 100644 --- a/twilio/jwt/validation/__init__.py +++ b/twilio/jwt/validation/__init__.py @@ -72,13 +72,13 @@ def _generate_payload(self): } @classmethod - def _sort_and_join(self, values, joiner): + def _sort_and_join(cls, values, joiner): if isinstance(values, string_types): return values return joiner.join(sorted(values)) @classmethod - def _hash(self, input_str): + def _hash(cls, input_str): if not input_str: return input_str diff --git a/twilio/request_validator.py b/twilio/request_validator.py index c24a52acdc..7e57923f5a 100644 --- a/twilio/request_validator.py +++ b/twilio/request_validator.py @@ -52,7 +52,7 @@ def add_port(uri): """ if uri.port: return uri.geturl() - + port = 443 if uri.scheme == "https" else 80 new_netloc = uri.netloc + ":" + str(port) new_uri = uri._replace(netloc=new_netloc) @@ -75,7 +75,7 @@ def compute_signature(self, uri, params, utf=PY3): :returns: The computed signature """ s = uri - if len(params) > 0: + if params: for k, v in sorted(params.items()): s += k + v @@ -117,7 +117,7 @@ def validate(self, uri, params, signature): valid_body_hash = compare(self.compute_hash(params), query["bodySHA256"][0]) params = {} - # check signature of uri with and without port, + # check signature of uri with and without port, # since sig generation on back end is inconsistent valid_signature = compare(self.compute_signature(uri_without_port, params), signature) valid_signature_with_port = compare(self.compute_signature(uri_with_port, params), signature)