From 19c6197885309c4cb129d5a25676212ad7b5dc05 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 07:10:19 +0200 Subject: [PATCH 01/16] Changing build to github actions (#1) * github actions install * Add poetry + deps * fix make install * github actions: install poetry * fix test_mailing flake format --- .github/workflows/test.yml | 38 +++++ Makefile | 15 ++ poetry.lock | 315 +++++++++++++++++++++++++++++++++++++ pyproject.toml | 20 +++ tests/test_mailing_list.py | 3 +- tox.ini | 3 +- 6 files changed, 391 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 Makefile create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..304ea24 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,38 @@ +name: Run Tests +on: + push: + branches: [ '*' ] + pull_request: + branches: [ master ] + schedule: + # Run automatically at 8AM PST Monday-Friday + - cron: '0 15 * * 1-5' + workflow_dispatch: + +jobs: + tests: + name: Run Tests + runs-on: ubuntu-latest + timeout-minutes: 20 + strategy: + matrix: + python-version: [ '3.6', '3.7', '3.8', '3.9' ] + steps: + - name: Install Poetry + uses: snok/install-poetry@v1 + - name: Checkout mailgun-sdk + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Dependencies + run: | + pip install virtualenv --upgrade + make install + make test-install + + - name: Run the tests + run: make test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2043dab --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +.PHONY: install test-install + + +install: + poetry install --no-dev + +test-install: install + poetry install + +analysis: + poetry run flake8 --ignore=E123,E126,E128,E501,W391,W291,W293,F401 tests + poetry run flake8 --ignore=E402,F401,W391,W291,W293 mailgun --max-line-length=300 + +test: analysis + poetry run pytest diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..7c2bee4 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,315 @@ +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "charset-normalizer" +version = "2.0.9" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mock" +version = "4.0.3" +description = "Rolling backport of unittest.mock for all Pythons" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +build = ["twine", "wheel", "blurb"] +docs = ["sphinx"] +test = ["pytest (<5.4)", "pytest-cov"] + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyparsing" +version = "3.0.6" +description = "Python parsing module" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "e2b06e42e04eb3431d5389e014414c30d6e446780af6134360c27f11e812e4b3" + +[metadata.files] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.9.tar.gz", hash = "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"}, + {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +mock = [ + {file = "mock-4.0.3-py3-none-any.whl", hash = "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62"}, + {file = "mock-4.0.3.tar.gz", hash = "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] +pyparsing = [ + {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, + {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +urllib3 = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..62aeedb --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,20 @@ +[tool.poetry] +name = "mailgun-python-sdk" +version = "0.2.0" +description = "Mailgun SDK" +authors = ["Maxime Vdb ", "Omar Shaban "] +license = "MIT License" + +[tool.poetry.dependencies] +python = "^3.8" +requests = "^2.26.0" + +[tool.poetry.dev-dependencies] +flake8 = "^4.0.1" +pytest = "^6.2.5" +six = "^1.16.0" +mock = "^4.0.3" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/tests/test_mailing_list.py b/tests/test_mailing_list.py index 0002c43..e675bd1 100644 --- a/tests/test_mailing_list.py +++ b/tests/test_mailing_list.py @@ -125,8 +125,7 @@ def test_update_multiple_list_members_several_batches(self, request): "ml@domain.com/members.json", data={ "members": json.dumps( - ["member@gmail.com"] - * self.mailing_list.MEMBERS_UPLOAD_LIMIT + ["member@gmail.com"] * self.mailing_list.MEMBERS_UPLOAD_LIMIT ), "upsert": "yes", }, diff --git a/tox.ini b/tox.ini index 67ffbc5..42d0fd4 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,6 @@ [tox] -envlist = py27,py36 +envlist = py3{6,7,8,9}, pypy + [testenv] passenv = TRAVIS TRAVIS_* From 7494702a5b76efc32efa2b0b5d00fdaad13db397 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 06:12:00 +0100 Subject: [PATCH 02/16] remove travis build --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 071fa3d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: python -python: - - "2.7" - - "3.6" -install: pip install tox-travis -script: tox From 249e30b3d1126c79fdb3ccf99e7a8551a13d9f95 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 06:13:36 +0100 Subject: [PATCH 03/16] add env var for mailgun base url --- poetry.lock | 16 +++++++++++++++- pyproject.toml | 1 + setup.cfg | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 7c2bee4..a210fe1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -176,6 +176,17 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +name = "pytest-env" +version = "0.6.2" +description = "py.test plugin that allows you to add environment variables." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pytest = ">=2.6.0" + [[package]] name = "requests" version = "2.26.0" @@ -226,7 +237,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e2b06e42e04eb3431d5389e014414c30d6e446780af6134360c27f11e812e4b3" +content-hash = "32bc0a89f44da699d1824e05b9bf4923c4eb7720c06cc1a6b5e4cdffb3e21423" [metadata.files] atomicwrites = [ @@ -297,6 +308,9 @@ pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] +pytest-env = [ + {file = "pytest-env-0.6.2.tar.gz", hash = "sha256:7e94956aef7f2764f3c147d216ce066bf6c42948bb9e293169b1b1c880a580c2"}, +] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, diff --git a/pyproject.toml b/pyproject.toml index 62aeedb..56e9c9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ flake8 = "^4.0.1" pytest = "^6.2.5" six = "^1.16.0" mock = "^4.0.3" +pytest-env = "^0.6.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/setup.cfg b/setup.cfg index b88034e..dbf0e50 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,6 @@ [metadata] description-file = README.md + +[tool.pytest] +env = + MAILGUN_BASE_URL="https://api.mailgun.net/v3" \ No newline at end of file From d2f08b00f27eb2d6f1130225b83f4c9e6bb3c15b Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 07:04:05 +0100 Subject: [PATCH 04/16] Messages.send_via_template: sending via template --- mailgun/domain/messages.py | 42 +++++++++++++++++++++++++++++++++++ tests/domain/test_messages.py | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 mailgun/domain/messages.py create mode 100644 tests/domain/test_messages.py diff --git a/mailgun/domain/messages.py b/mailgun/domain/messages.py new file mode 100644 index 0000000..248b918 --- /dev/null +++ b/mailgun/domain/messages.py @@ -0,0 +1,42 @@ +""" +Messages API. +url: https://documentation.mailgun.com/en/latest/user_manual.html#sending-via-api +""" +from __future__ import division +import json +import math + +from mailgun.base import ApiDomainResource + + +class Messages(ApiDomainResource): + """ + Mailing list resource. + """ + + api_endpoint = "messages" + + """ + data example + data={ + "from": "Excited User ", + "to": ["bar@example.com"], + "subject": "Hello", + "template": "template.test", + "h:X-Mailgun-Variables": json.dumps( + {"title": "API documentation", "body": "Sending messages with templates"} + ) + }, + """ + + def send_via_template(self, from_name: str, from_email: str, to: str, subject: str, template: str, vars: dict): + return self.request( + "POST", + data={ + "from": "{} <{}>".format(from_name, from_email), + "to": [to], + "subject": subject, + "template": template, + "h:X-Mailgun-Variables": json.dumps(vars) + }, + ) diff --git a/tests/domain/test_messages.py b/tests/domain/test_messages.py new file mode 100644 index 0000000..6d93a26 --- /dev/null +++ b/tests/domain/test_messages.py @@ -0,0 +1,39 @@ +import json +import unittest + +from mock import patch, call + +from mailgun.api import MailgunApi +from mailgun.domain.messages import Messages + + +class MailingListTestCase(unittest.TestCase): + def setUp(self): + super(MailingListTestCase, self).setUp() + api = MailgunApi(api_key="blah") + self.messages = Messages(api, api.domain("blah.net")) + + @patch.object(Messages, "request") + def test_send_via_template(self, request): + sending_vars = {"title": "API documentation", "body": "Sending messages with templates"} + self.messages.send_via_template( + from_name="Al brenss", + from_email="albrens@domain.com", + to="ml@domain.com", + subject="Hello", + template="template.test", + vars=sending_vars + ) + + request.assert_called_with( + "POST", + data={ + "from": "Al brenss ", + "to": ["ml@domain.com"], + "subject": "Hello", + "template": "template.test", + "h:X-Mailgun-Variables": json.dumps( + sending_vars + ) + }, + ) From 0753abf0700cd69be2784c8bd300e5169cdd4117 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 07:54:19 +0100 Subject: [PATCH 05/16] add base_url as env var --- mailgun/base.py | 7 ++++--- setup.cfg | 2 +- tests/domain/test_messages.py | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mailgun/base.py b/mailgun/base.py index d12b382..15d08b2 100644 --- a/mailgun/base.py +++ b/mailgun/base.py @@ -15,9 +15,10 @@ class ApiResource(object): # pylint: disable=too-few-public-methods api_endpoint = None api_url = "https://api.mailgun.net/v3" - def __init__(self, api): + def __init__(self, api, base_url="https://api.mailgun.net/v3"): assert self.api_endpoint, "Missing `api_endpoint` attribute definition." self.api = api + self.api_url = base_url self.base_url = self._get_base_url() def _get_base_url(self): @@ -52,9 +53,9 @@ class ApiDomainResource(ApiResource): # pylint: disable=too-few-public-methods DOMAIN_NAMESPACE = False - def __init__(self, api, domain): + def __init__(self, api, domain, base_url=ApiResource.api_url): self.domain = domain - super(ApiDomainResource, self).__init__(api) + super(ApiDomainResource, self).__init__(api, base_url) def _get_base_url(self): """ diff --git a/setup.cfg b/setup.cfg index dbf0e50..a597672 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,4 +3,4 @@ description-file = README.md [tool.pytest] env = - MAILGUN_BASE_URL="https://api.mailgun.net/v3" \ No newline at end of file + MAILGUN_BASE_URL="https://api.eu.mailgun.net/v3" \ No newline at end of file diff --git a/tests/domain/test_messages.py b/tests/domain/test_messages.py index 6d93a26..168cda2 100644 --- a/tests/domain/test_messages.py +++ b/tests/domain/test_messages.py @@ -1,5 +1,6 @@ import json import unittest +import os from mock import patch, call @@ -11,7 +12,7 @@ class MailingListTestCase(unittest.TestCase): def setUp(self): super(MailingListTestCase, self).setUp() api = MailgunApi(api_key="blah") - self.messages = Messages(api, api.domain("blah.net")) + self.messages = Messages(api, api.domain('blah.net'), os.getenv('MAILGUN_BASE_URL')) @patch.object(Messages, "request") def test_send_via_template(self, request): From 9906f983652799ce1b7f48a4f994464646d15b1e Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 07:59:19 +0100 Subject: [PATCH 06/16] messages classname test --- tests/domain/test_messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/domain/test_messages.py b/tests/domain/test_messages.py index 168cda2..f18825a 100644 --- a/tests/domain/test_messages.py +++ b/tests/domain/test_messages.py @@ -8,7 +8,7 @@ from mailgun.domain.messages import Messages -class MailingListTestCase(unittest.TestCase): +class MessagesTestCase(unittest.TestCase): def setUp(self): super(MailingListTestCase, self).setUp() api = MailgunApi(api_key="blah") From 79f629cb8bb634d43c414475c774557cf6950471 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Fri, 10 Dec 2021 16:17:48 +0100 Subject: [PATCH 07/16] Add a flag to require TLS on messages API --- mailgun/domain/messages.py | 23 +++++++++++++--------- tests/domain/test_messages.py | 36 +++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/mailgun/domain/messages.py b/mailgun/domain/messages.py index 248b918..4f8211d 100644 --- a/mailgun/domain/messages.py +++ b/mailgun/domain/messages.py @@ -15,7 +15,7 @@ class Messages(ApiDomainResource): """ api_endpoint = "messages" - + require_tls = False """ data example data={ @@ -29,14 +29,19 @@ class Messages(ApiDomainResource): }, """ - def send_via_template(self, from_name: str, from_email: str, to: str, subject: str, template: str, vars: dict): + def send_via_template(self, from_name: str, from_email: str, to: str, subject: str, template: str, variables: dict): + payload = { + "from": "{} <{}>".format(from_name, from_email), + "to": [to], + "subject": subject, + "template": template, + "h:X-Mailgun-Variables": json.dumps(variables) + } + + if self.require_tls: + payload['o:require-tls'] = 'True' + return self.request( "POST", - data={ - "from": "{} <{}>".format(from_name, from_email), - "to": [to], - "subject": subject, - "template": template, - "h:X-Mailgun-Variables": json.dumps(vars) - }, + data=payload, ) diff --git a/tests/domain/test_messages.py b/tests/domain/test_messages.py index f18825a..4f1a688 100644 --- a/tests/domain/test_messages.py +++ b/tests/domain/test_messages.py @@ -10,20 +10,21 @@ class MessagesTestCase(unittest.TestCase): def setUp(self): - super(MailingListTestCase, self).setUp() + super(MessagesTestCase, self).setUp() api = MailgunApi(api_key="blah") self.messages = Messages(api, api.domain('blah.net'), os.getenv('MAILGUN_BASE_URL')) @patch.object(Messages, "request") def test_send_via_template(self, request): - sending_vars = {"title": "API documentation", "body": "Sending messages with templates"} + sending_variables = {"title": "API documentation", "body": "Sending messages with templates"} + self.messages.send_via_template( from_name="Al brenss", from_email="albrens@domain.com", to="ml@domain.com", subject="Hello", template="template.test", - vars=sending_vars + variables=sending_variables ) request.assert_called_with( @@ -34,7 +35,34 @@ def test_send_via_template(self, request): "subject": "Hello", "template": "template.test", "h:X-Mailgun-Variables": json.dumps( - sending_vars + sending_variables ) }, ) + + @patch.object(Messages, "request") + def test_send_with_tls(self, request): + sending_variables = {"title": "API documentation", "body": "Sending messages with templates"} + self.messages.require_tls = True + self.messages.send_via_template( + from_name="Al brenss", + from_email="albrens@domain.com", + to="ml@domain.com", + subject="Hello", + template="template.test", + variables=sending_variables + ) + + request.assert_called_with( + "POST", + data={ + "from": "Al brenss ", + "to": ["ml@domain.com"], + "subject": "Hello", + "template": "template.test", + "h:X-Mailgun-Variables": json.dumps( + sending_variables + ), + "o:require-tls": "True" + }, + ) From d902b19482bcb106cc139581346b284061696463 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Thu, 16 Dec 2021 09:10:14 +0100 Subject: [PATCH 08/16] rename package to be compliant with poetry install --- .github/workflows/test.yml | 2 +- {mailgun => mailgunsdk}/__init__.py | 0 {mailgun => mailgunsdk}/api.py | 2 +- {mailgun => mailgunsdk}/base.py | 2 +- {mailgun => mailgunsdk}/domain/__init__.py | 0 {mailgun => mailgunsdk}/domain/ips.py | 0 {mailgun => mailgunsdk}/domain/logs.py | 0 {mailgun => mailgunsdk}/domain/messages.py | 7 ++++--- {mailgun => mailgunsdk}/ips.py | 0 {mailgun => mailgunsdk}/mailing_list.py | 0 setup.py | 4 ++-- tests/domain/test_init.py | 6 +++--- tests/domain/test_ips.py | 4 ++-- tests/domain/test_logs.py | 4 ++-- tests/domain/test_messages.py | 4 ++-- tests/test_api.py | 6 +++--- tests/test_base.py | 4 ++-- tests/test_init.py | 10 +++++----- tests/test_ips.py | 4 ++-- tests/test_mailing_list.py | 4 ++-- 20 files changed, 32 insertions(+), 31 deletions(-) rename {mailgun => mailgunsdk}/__init__.py (100%) rename {mailgun => mailgunsdk}/api.py (97%) rename {mailgun => mailgunsdk}/base.py (98%) rename {mailgun => mailgunsdk}/domain/__init__.py (100%) rename {mailgun => mailgunsdk}/domain/ips.py (100%) rename {mailgun => mailgunsdk}/domain/logs.py (100%) rename {mailgun => mailgunsdk}/domain/messages.py (91%) rename {mailgun => mailgunsdk}/ips.py (100%) rename {mailgun => mailgunsdk}/mailing_list.py (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 304ea24..9389627 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Install Poetry uses: snok/install-poetry@v1 - - name: Checkout mailgun-sdk + - name: Checkout mailgunsdk-sdk uses: actions/checkout@v2 - name: Set up Python diff --git a/mailgun/__init__.py b/mailgunsdk/__init__.py similarity index 100% rename from mailgun/__init__.py rename to mailgunsdk/__init__.py diff --git a/mailgun/api.py b/mailgunsdk/api.py similarity index 97% rename from mailgun/api.py rename to mailgunsdk/api.py index 6dcdf4c..7574130 100644 --- a/mailgun/api.py +++ b/mailgunsdk/api.py @@ -24,7 +24,7 @@ def __init__(self, api_key=None): def set_api_key(self, api_key): """ - Set the API key on the client. This is called by `mailgun.initialize()`. + Set the API key on the client. This is called by `mailgunsdk.initialize()`. :param api_key: your Mailgun API key """ diff --git a/mailgun/base.py b/mailgunsdk/base.py similarity index 98% rename from mailgun/base.py rename to mailgunsdk/base.py index 15d08b2..d8c4589 100644 --- a/mailgun/base.py +++ b/mailgunsdk/base.py @@ -36,7 +36,7 @@ def request(self, method, endpoint="", **params): :param **params: every additional keyword argument is forwarded to `requests` """ - url = self.base_url + url = self._get_base_url() if endpoint: url = "{}/{}".format(url, endpoint) diff --git a/mailgun/domain/__init__.py b/mailgunsdk/domain/__init__.py similarity index 100% rename from mailgun/domain/__init__.py rename to mailgunsdk/domain/__init__.py diff --git a/mailgun/domain/ips.py b/mailgunsdk/domain/ips.py similarity index 100% rename from mailgun/domain/ips.py rename to mailgunsdk/domain/ips.py diff --git a/mailgun/domain/logs.py b/mailgunsdk/domain/logs.py similarity index 100% rename from mailgun/domain/logs.py rename to mailgunsdk/domain/logs.py diff --git a/mailgun/domain/messages.py b/mailgunsdk/domain/messages.py similarity index 91% rename from mailgun/domain/messages.py rename to mailgunsdk/domain/messages.py index 4f8211d..aab5041 100644 --- a/mailgun/domain/messages.py +++ b/mailgunsdk/domain/messages.py @@ -2,11 +2,9 @@ Messages API. url: https://documentation.mailgun.com/en/latest/user_manual.html#sending-via-api """ -from __future__ import division import json -import math -from mailgun.base import ApiDomainResource +from mailgunsdk.base import ApiDomainResource class Messages(ApiDomainResource): @@ -37,6 +35,9 @@ def send_via_template(self, from_name: str, from_email: str, to: str, subject: s "template": template, "h:X-Mailgun-Variables": json.dumps(variables) } + print(self.base_url) + + print(self.api_endpoint) if self.require_tls: payload['o:require-tls'] = 'True' diff --git a/mailgun/ips.py b/mailgunsdk/ips.py similarity index 100% rename from mailgun/ips.py rename to mailgunsdk/ips.py diff --git a/mailgun/mailing_list.py b/mailgunsdk/mailing_list.py similarity index 100% rename from mailgun/mailing_list.py rename to mailgunsdk/mailing_list.py diff --git a/setup.py b/setup.py index 64486e1..371430b 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( - name='mailgun-python-sdk', + name='mailgunsdk', version=VERSION, description='Mailgun Python SDK (unofficial)', author='Maxime Vdb', @@ -15,7 +15,7 @@ packages=find_packages(), install_requires=['requests', 'six'], license="MIT", - keywords="mailgun api sdk", + keywords="mailgunsdk api sdk", url='https://github.com/m-vdb/mailgun-python-sdk', download_url='https://github.com/m-vdb/mailgun-python-sdk/archive/v{}.tar.gz'.format(VERSION), project_urls={ diff --git a/tests/domain/test_init.py b/tests/domain/test_init.py index 93eed16..7ca2265 100644 --- a/tests/domain/test_init.py +++ b/tests/domain/test_init.py @@ -1,8 +1,8 @@ import unittest -from mailgun.api import MailgunApi -from mailgun.domain import Domain -from mailgun.domain.logs import Logs +from mailgunsdk.api import MailgunApi +from mailgunsdk.domain import Domain +from mailgunsdk.domain.logs import Logs api = MailgunApi() diff --git a/tests/domain/test_ips.py b/tests/domain/test_ips.py index d24a570..ef264d4 100644 --- a/tests/domain/test_ips.py +++ b/tests/domain/test_ips.py @@ -2,8 +2,8 @@ from mock import patch -from mailgun.api import MailgunApi -from mailgun.domain.ips import IPs +from mailgunsdk.api import MailgunApi +from mailgunsdk.domain.ips import IPs api = MailgunApi() diff --git a/tests/domain/test_logs.py b/tests/domain/test_logs.py index 26eb816..91da654 100644 --- a/tests/domain/test_logs.py +++ b/tests/domain/test_logs.py @@ -2,8 +2,8 @@ from mock import patch -from mailgun.api import MailgunApi -from mailgun.domain.logs import Logs +from mailgunsdk.api import MailgunApi +from mailgunsdk.domain.logs import Logs api = MailgunApi() diff --git a/tests/domain/test_messages.py b/tests/domain/test_messages.py index 4f1a688..9217bd1 100644 --- a/tests/domain/test_messages.py +++ b/tests/domain/test_messages.py @@ -4,8 +4,8 @@ from mock import patch, call -from mailgun.api import MailgunApi -from mailgun.domain.messages import Messages +from mailgunsdk.api import MailgunApi +from mailgunsdk.domain.messages import Messages class MessagesTestCase(unittest.TestCase): diff --git a/tests/test_api.py b/tests/test_api.py index e2f5af0..020545b 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,9 +3,9 @@ import requests -from mailgun.api import MailgunApi -from mailgun.domain import Domain -from mailgun.mailing_list import MailingList +from mailgunsdk.api import MailgunApi +from mailgunsdk.domain import Domain +from mailgunsdk.mailing_list import MailingList class MailgunApiTestCase(unittest.TestCase): diff --git a/tests/test_base.py b/tests/test_base.py index 7edca45..8b47160 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -5,8 +5,8 @@ from requests import Response from requests.exceptions import HTTPError -from mailgun.api import MailgunApi -from mailgun.base import ApiResource, ApiDomainResource, silence_error +from mailgunsdk.api import MailgunApi +from mailgunsdk.base import ApiResource, ApiDomainResource, silence_error class FakeResource(ApiResource): diff --git a/tests/test_init.py b/tests/test_init.py index 88a619a..20addf5 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,13 +1,13 @@ import unittest -import mailgun -from mailgun.api import MailgunApi +import mailgunsdk +from mailgunsdk.api import MailgunApi class MailgunInitTestCase(unittest.TestCase): def test_api(self): - self.assertIsInstance(mailgun.api, MailgunApi) + self.assertIsInstance(mailgunsdk.api, MailgunApi) def test_initialize(self): - mailgun.initialize("api-key-xxx") - self.assertEqual(mailgun.api.api_key, "api-key-xxx") + mailgunsdk.initialize("api-key-xxx") + self.assertEqual(mailgunsdk.api.api_key, "api-key-xxx") diff --git a/tests/test_ips.py b/tests/test_ips.py index 6007da6..f82dddd 100644 --- a/tests/test_ips.py +++ b/tests/test_ips.py @@ -3,8 +3,8 @@ from mock import patch -from mailgun.api import MailgunApi -from mailgun.ips import IPs +from mailgunsdk.api import MailgunApi +from mailgunsdk.ips import IPs class IPsTestCase(unittest.TestCase): diff --git a/tests/test_mailing_list.py b/tests/test_mailing_list.py index e675bd1..b84a976 100644 --- a/tests/test_mailing_list.py +++ b/tests/test_mailing_list.py @@ -3,8 +3,8 @@ from mock import patch, call -from mailgun.api import MailgunApi -from mailgun.mailing_list import MailingList +from mailgunsdk.api import MailgunApi +from mailgunsdk.mailing_list import MailingList class MailingListTestCase(unittest.TestCase): From 9fa42da9acaf08b34eecba0cf508a2b88398b27a Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Thu, 16 Dec 2021 09:23:45 +0100 Subject: [PATCH 09/16] package rename --- .github/workflows/test.yml | 2 +- {mailgunsdk => mailgun_sdk}/__init__.py | 0 {mailgunsdk => mailgun_sdk}/api.py | 2 +- {mailgunsdk => mailgun_sdk}/base.py | 0 {mailgunsdk => mailgun_sdk}/domain/__init__.py | 0 {mailgunsdk => mailgun_sdk}/domain/ips.py | 0 {mailgunsdk => mailgun_sdk}/domain/logs.py | 0 {mailgunsdk => mailgun_sdk}/domain/messages.py | 2 +- {mailgunsdk => mailgun_sdk}/ips.py | 0 {mailgunsdk => mailgun_sdk}/mailing_list.py | 0 setup.py | 4 ++-- tests/domain/test_init.py | 6 +++--- tests/domain/test_ips.py | 4 ++-- tests/domain/test_logs.py | 4 ++-- tests/domain/test_messages.py | 4 ++-- tests/test_api.py | 6 +++--- tests/test_base.py | 4 ++-- tests/test_init.py | 10 +++++----- tests/test_ips.py | 4 ++-- tests/test_mailing_list.py | 4 ++-- 20 files changed, 28 insertions(+), 28 deletions(-) rename {mailgunsdk => mailgun_sdk}/__init__.py (100%) rename {mailgunsdk => mailgun_sdk}/api.py (97%) rename {mailgunsdk => mailgun_sdk}/base.py (100%) rename {mailgunsdk => mailgun_sdk}/domain/__init__.py (100%) rename {mailgunsdk => mailgun_sdk}/domain/ips.py (100%) rename {mailgunsdk => mailgun_sdk}/domain/logs.py (100%) rename {mailgunsdk => mailgun_sdk}/domain/messages.py (96%) rename {mailgunsdk => mailgun_sdk}/ips.py (100%) rename {mailgunsdk => mailgun_sdk}/mailing_list.py (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9389627..b1439fa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Install Poetry uses: snok/install-poetry@v1 - - name: Checkout mailgunsdk-sdk + - name: Checkout mailgun_sdk-sdk uses: actions/checkout@v2 - name: Set up Python diff --git a/mailgunsdk/__init__.py b/mailgun_sdk/__init__.py similarity index 100% rename from mailgunsdk/__init__.py rename to mailgun_sdk/__init__.py diff --git a/mailgunsdk/api.py b/mailgun_sdk/api.py similarity index 97% rename from mailgunsdk/api.py rename to mailgun_sdk/api.py index 7574130..49479cd 100644 --- a/mailgunsdk/api.py +++ b/mailgun_sdk/api.py @@ -24,7 +24,7 @@ def __init__(self, api_key=None): def set_api_key(self, api_key): """ - Set the API key on the client. This is called by `mailgunsdk.initialize()`. + Set the API key on the client. This is called by `mailgun_sdk.initialize()`. :param api_key: your Mailgun API key """ diff --git a/mailgunsdk/base.py b/mailgun_sdk/base.py similarity index 100% rename from mailgunsdk/base.py rename to mailgun_sdk/base.py diff --git a/mailgunsdk/domain/__init__.py b/mailgun_sdk/domain/__init__.py similarity index 100% rename from mailgunsdk/domain/__init__.py rename to mailgun_sdk/domain/__init__.py diff --git a/mailgunsdk/domain/ips.py b/mailgun_sdk/domain/ips.py similarity index 100% rename from mailgunsdk/domain/ips.py rename to mailgun_sdk/domain/ips.py diff --git a/mailgunsdk/domain/logs.py b/mailgun_sdk/domain/logs.py similarity index 100% rename from mailgunsdk/domain/logs.py rename to mailgun_sdk/domain/logs.py diff --git a/mailgunsdk/domain/messages.py b/mailgun_sdk/domain/messages.py similarity index 96% rename from mailgunsdk/domain/messages.py rename to mailgun_sdk/domain/messages.py index aab5041..1d5f713 100644 --- a/mailgunsdk/domain/messages.py +++ b/mailgun_sdk/domain/messages.py @@ -4,7 +4,7 @@ """ import json -from mailgunsdk.base import ApiDomainResource +from mailgun_sdk.base import ApiDomainResource class Messages(ApiDomainResource): diff --git a/mailgunsdk/ips.py b/mailgun_sdk/ips.py similarity index 100% rename from mailgunsdk/ips.py rename to mailgun_sdk/ips.py diff --git a/mailgunsdk/mailing_list.py b/mailgun_sdk/mailing_list.py similarity index 100% rename from mailgunsdk/mailing_list.py rename to mailgun_sdk/mailing_list.py diff --git a/setup.py b/setup.py index 371430b..10f9cea 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( - name='mailgunsdk', + name='mailgun_sdk', version=VERSION, description='Mailgun Python SDK (unofficial)', author='Maxime Vdb', @@ -15,7 +15,7 @@ packages=find_packages(), install_requires=['requests', 'six'], license="MIT", - keywords="mailgunsdk api sdk", + keywords="mailgun_sdk api sdk", url='https://github.com/m-vdb/mailgun-python-sdk', download_url='https://github.com/m-vdb/mailgun-python-sdk/archive/v{}.tar.gz'.format(VERSION), project_urls={ diff --git a/tests/domain/test_init.py b/tests/domain/test_init.py index 7ca2265..1ad89bc 100644 --- a/tests/domain/test_init.py +++ b/tests/domain/test_init.py @@ -1,8 +1,8 @@ import unittest -from mailgunsdk.api import MailgunApi -from mailgunsdk.domain import Domain -from mailgunsdk.domain.logs import Logs +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.domain import Domain +from mailgun_sdk.domain.logs import Logs api = MailgunApi() diff --git a/tests/domain/test_ips.py b/tests/domain/test_ips.py index ef264d4..5db9268 100644 --- a/tests/domain/test_ips.py +++ b/tests/domain/test_ips.py @@ -2,8 +2,8 @@ from mock import patch -from mailgunsdk.api import MailgunApi -from mailgunsdk.domain.ips import IPs +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.domain.ips import IPs api = MailgunApi() diff --git a/tests/domain/test_logs.py b/tests/domain/test_logs.py index 91da654..511afcf 100644 --- a/tests/domain/test_logs.py +++ b/tests/domain/test_logs.py @@ -2,8 +2,8 @@ from mock import patch -from mailgunsdk.api import MailgunApi -from mailgunsdk.domain.logs import Logs +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.domain.logs import Logs api = MailgunApi() diff --git a/tests/domain/test_messages.py b/tests/domain/test_messages.py index 9217bd1..6db4d4e 100644 --- a/tests/domain/test_messages.py +++ b/tests/domain/test_messages.py @@ -4,8 +4,8 @@ from mock import patch, call -from mailgunsdk.api import MailgunApi -from mailgunsdk.domain.messages import Messages +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.domain.messages import Messages class MessagesTestCase(unittest.TestCase): diff --git a/tests/test_api.py b/tests/test_api.py index 020545b..5a8ca17 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,9 +3,9 @@ import requests -from mailgunsdk.api import MailgunApi -from mailgunsdk.domain import Domain -from mailgunsdk.mailing_list import MailingList +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.domain import Domain +from mailgun_sdk.mailing_list import MailingList class MailgunApiTestCase(unittest.TestCase): diff --git a/tests/test_base.py b/tests/test_base.py index 8b47160..0684918 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -5,8 +5,8 @@ from requests import Response from requests.exceptions import HTTPError -from mailgunsdk.api import MailgunApi -from mailgunsdk.base import ApiResource, ApiDomainResource, silence_error +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.base import ApiResource, ApiDomainResource, silence_error class FakeResource(ApiResource): diff --git a/tests/test_init.py b/tests/test_init.py index 20addf5..e5dea8c 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,13 +1,13 @@ import unittest -import mailgunsdk -from mailgunsdk.api import MailgunApi +import mailgun_sdk +from mailgun_sdk.api import MailgunApi class MailgunInitTestCase(unittest.TestCase): def test_api(self): - self.assertIsInstance(mailgunsdk.api, MailgunApi) + self.assertIsInstance(mailgun_sdk.api, MailgunApi) def test_initialize(self): - mailgunsdk.initialize("api-key-xxx") - self.assertEqual(mailgunsdk.api.api_key, "api-key-xxx") + mailgun_sdk.initialize("api-key-xxx") + self.assertEqual(mailgun_sdk.api.api_key, "api-key-xxx") diff --git a/tests/test_ips.py b/tests/test_ips.py index f82dddd..4b931bb 100644 --- a/tests/test_ips.py +++ b/tests/test_ips.py @@ -3,8 +3,8 @@ from mock import patch -from mailgunsdk.api import MailgunApi -from mailgunsdk.ips import IPs +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.ips import IPs class IPsTestCase(unittest.TestCase): diff --git a/tests/test_mailing_list.py b/tests/test_mailing_list.py index b84a976..7327395 100644 --- a/tests/test_mailing_list.py +++ b/tests/test_mailing_list.py @@ -3,8 +3,8 @@ from mock import patch, call -from mailgunsdk.api import MailgunApi -from mailgunsdk.mailing_list import MailingList +from mailgun_sdk.api import MailgunApi +from mailgun_sdk.mailing_list import MailingList class MailingListTestCase(unittest.TestCase): From f383b7b0359676178ca69199a44e4f5d1fe62c3c Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Thu, 16 Dec 2021 09:29:35 +0100 Subject: [PATCH 10/16] package rename --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 56e9c9c..035ef07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "mailgun-python-sdk" +name = "mailgun-sdk" version = "0.2.0" description = "Mailgun SDK" authors = ["Maxime Vdb ", "Omar Shaban "] From ab7c707ccd9f0df500cdc77f8ac99add50515635 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Mon, 20 Dec 2021 12:22:53 +0100 Subject: [PATCH 11/16] remove poetry --- poetry.lock | 329 ------------------------------------------------- pyproject.toml | 21 ---- 2 files changed, 350 deletions(-) delete mode 100644 poetry.lock delete mode 100644 pyproject.toml diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index a210fe1..0000000 --- a/poetry.lock +++ /dev/null @@ -1,329 +0,0 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] - -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "charset-normalizer" -version = "2.0.9" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "flake8" -version = "4.0.1" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.8.0,<2.9.0" -pyflakes = ">=2.4.0,<2.5.0" - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mock" -version = "4.0.3" -description = "Rolling backport of unittest.mock for all Pythons" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -build = ["twine", "wheel", "blurb"] -docs = ["sphinx"] -test = ["pytest (<5.4)", "pytest-cov"] - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pycodestyle" -version = "2.8.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyflakes" -version = "2.4.0" -description = "passive checker of Python programs" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyparsing" -version = "3.0.6" -description = "Python parsing module" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-env" -version = "0.6.2" -description = "py.test plugin that allows you to add environment variables." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pytest = ">=2.6.0" - -[[package]] -name = "requests" -version = "2.26.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "urllib3" -version = "1.26.7" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.8" -content-hash = "32bc0a89f44da699d1824e05b9bf4923c4eb7720c06cc1a6b5e4cdffb3e21423" - -[metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.9.tar.gz", hash = "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"}, - {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -flake8 = [ - {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, - {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mock = [ - {file = "mock-4.0.3-py3-none-any.whl", hash = "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62"}, - {file = "mock-4.0.3.tar.gz", hash = "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycodestyle = [ - {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, - {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, -] -pyflakes = [ - {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, - {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, -] -pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytest-env = [ - {file = "pytest-env-0.6.2.tar.gz", hash = "sha256:7e94956aef7f2764f3c147d216ce066bf6c42948bb9e293169b1b1c880a580c2"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 035ef07..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,21 +0,0 @@ -[tool.poetry] -name = "mailgun-sdk" -version = "0.2.0" -description = "Mailgun SDK" -authors = ["Maxime Vdb ", "Omar Shaban "] -license = "MIT License" - -[tool.poetry.dependencies] -python = "^3.8" -requests = "^2.26.0" - -[tool.poetry.dev-dependencies] -flake8 = "^4.0.1" -pytest = "^6.2.5" -six = "^1.16.0" -mock = "^4.0.3" -pytest-env = "^0.6.2" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" From a4aea83a285edcbb64e6f3cff025e4f7f71fc341 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Wed, 29 Dec 2021 15:38:52 +0100 Subject: [PATCH 12/16] authenticate API over initialization --- mailgun_sdk/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mailgun_sdk/api.py b/mailgun_sdk/api.py index 49479cd..bd41af6 100644 --- a/mailgun_sdk/api.py +++ b/mailgun_sdk/api.py @@ -14,8 +14,9 @@ class MailgunApi(object): # pylint: disable=too-few-public-methods """ def __init__(self, api_key=None): - self.api_key = api_key self.session = requests.Session() + self.set_api_key(api_key) + # APIs self.ips = IPs(self) self.mailing_list = MailingList(self) From 4bafed49198e9a3f671c10a13804691ecba8a966 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Wed, 26 Jan 2022 17:48:09 +0200 Subject: [PATCH 13/16] raise HTTP error with response message --- .gitignore | 2 +- mailgun_sdk/base.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 84229f4..b1e1787 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ wheels/ *.egg-info/ .installed.cfg *.egg - +.idea # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. diff --git a/mailgun_sdk/base.py b/mailgun_sdk/base.py index d8c4589..ba8be00 100644 --- a/mailgun_sdk/base.py +++ b/mailgun_sdk/base.py @@ -41,7 +41,14 @@ def request(self, method, endpoint="", **params): url = "{}/{}".format(url, endpoint) response = self.api.session.request(method, url, **params) - response.raise_for_status() + + if response.status_code != 200: + print(resp) + + try: + response.raise_for_status() + except HTTPError as e: + raise HTTPError(str(e.response), e.response) return response.json() From 1a23edb26036c8c9d295ed88849cd7e59c115d5f Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Thu, 27 Jan 2022 06:56:25 +0200 Subject: [PATCH 14/16] fix error --- mailgun_sdk/base.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/mailgun_sdk/base.py b/mailgun_sdk/base.py index ba8be00..4bbe3e1 100644 --- a/mailgun_sdk/base.py +++ b/mailgun_sdk/base.py @@ -42,9 +42,6 @@ def request(self, method, endpoint="", **params): response = self.api.session.request(method, url, **params) - if response.status_code != 200: - print(resp) - try: response.raise_for_status() except HTTPError as e: From c7af3ac2ca74923bbed7ea2cae4c666d03e16e3f Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Thu, 27 Jan 2022 08:00:16 +0200 Subject: [PATCH 15/16] verbose http error --- mailgun_sdk/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mailgun_sdk/base.py b/mailgun_sdk/base.py index 4bbe3e1..6fda6b9 100644 --- a/mailgun_sdk/base.py +++ b/mailgun_sdk/base.py @@ -45,7 +45,7 @@ def request(self, method, endpoint="", **params): try: response.raise_for_status() except HTTPError as e: - raise HTTPError(str(e.response), e.response) + raise HTTPError("{}\n{}".format(e.strerror, e.response.text), e.response) return response.json() From de69806ee0538a9269950fb600eff5174c4084b2 Mon Sep 17 00:00:00 2001 From: Omar Shaban Date: Thu, 27 Jan 2022 11:11:15 +0200 Subject: [PATCH 16/16] try --- mailgun_sdk/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mailgun_sdk/base.py b/mailgun_sdk/base.py index 6fda6b9..9c09170 100644 --- a/mailgun_sdk/base.py +++ b/mailgun_sdk/base.py @@ -45,6 +45,7 @@ def request(self, method, endpoint="", **params): try: response.raise_for_status() except HTTPError as e: + raise HTTPError("{}\n{}".format(e.strerror, e.response.text), e.response) return response.json()