Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Updates #2

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -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-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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 0 additions & 6 deletions .travis.yml

This file was deleted.

15 changes: 15 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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
File renamed without changes.
5 changes: 3 additions & 2 deletions mailgun/api.py → mailgun_sdk/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -24,7 +25,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 `mailgun_sdk.initialize()`.

:param api_key: your Mailgun API key
"""
Expand Down
16 changes: 11 additions & 5 deletions mailgun/base.py → mailgun_sdk/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -35,12 +36,17 @@ 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)

response = self.api.session.request(method, url, **params)
response.raise_for_status()

try:
response.raise_for_status()
except HTTPError as e:

raise HTTPError("{}\n{}".format(e.strerror, e.response.text), e.response)

return response.json()

Expand All @@ -52,9 +58,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):
"""
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
48 changes: 48 additions & 0 deletions mailgun_sdk/domain/messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""
Messages API.
url: https://documentation.mailgun.com/en/latest/user_manual.html#sending-via-api
"""
import json

from mailgun_sdk.base import ApiDomainResource


class Messages(ApiDomainResource):
"""
Mailing list resource.
"""

api_endpoint = "messages"
require_tls = False
"""
data example
data={
"from": "Excited User <YOU@YOUR_DOMAIN_NAME>",
"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, variables: dict):
payload = {
"from": "{} <{}>".format(from_name, from_email),
"to": [to],
"subject": subject,
"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'

return self.request(
"POST",
data=payload,
)
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
[metadata]
description-file = README.md

[tool.pytest]
env =
MAILGUN_BASE_URL="https://api.eu.mailgun.net/v3"
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@


setup(
name='mailgun-python-sdk',
name='mailgun_sdk',
version=VERSION,
description='Mailgun Python SDK (unofficial)',
author='Maxime Vdb',
author_email='me@maxvdb.com',
packages=find_packages(),
install_requires=['requests', 'six'],
license="MIT",
keywords="mailgun 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={
Expand Down
6 changes: 3 additions & 3 deletions tests/domain/test_init.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import unittest

from mailgun.api import MailgunApi
from mailgun.domain import Domain
from mailgun.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()

Expand Down
4 changes: 2 additions & 2 deletions tests/domain/test_ips.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from mock import patch

from mailgun.api import MailgunApi
from mailgun.domain.ips import IPs
from mailgun_sdk.api import MailgunApi
from mailgun_sdk.domain.ips import IPs


api = MailgunApi()
Expand Down
4 changes: 2 additions & 2 deletions tests/domain/test_logs.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from mock import patch

from mailgun.api import MailgunApi
from mailgun.domain.logs import Logs
from mailgun_sdk.api import MailgunApi
from mailgun_sdk.domain.logs import Logs


api = MailgunApi()
Expand Down
68 changes: 68 additions & 0 deletions tests/domain/test_messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import json
import unittest
import os

from mock import patch, call

from mailgun_sdk.api import MailgunApi
from mailgun_sdk.domain.messages import Messages


class MessagesTestCase(unittest.TestCase):
def setUp(self):
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_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",
variables=sending_variables
)

request.assert_called_with(
"POST",
data={
"from": "Al brenss <albrens@domain.com>",
"to": ["ml@domain.com"],
"subject": "Hello",
"template": "template.test",
"h:X-Mailgun-Variables": json.dumps(
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 <albrens@domain.com>",
"to": ["ml@domain.com"],
"subject": "Hello",
"template": "template.test",
"h:X-Mailgun-Variables": json.dumps(
sending_variables
),
"o:require-tls": "True"
},
)
6 changes: 3 additions & 3 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

import requests

from mailgun.api import MailgunApi
from mailgun.domain import Domain
from mailgun.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):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 mailgun_sdk.api import MailgunApi
from mailgun_sdk.base import ApiResource, ApiDomainResource, silence_error


class FakeResource(ApiResource):
Expand Down
10 changes: 5 additions & 5 deletions tests/test_init.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import unittest

import mailgun
from mailgun.api import MailgunApi
import mailgun_sdk
from mailgun_sdk.api import MailgunApi


class MailgunInitTestCase(unittest.TestCase):
def test_api(self):
self.assertIsInstance(mailgun.api, MailgunApi)
self.assertIsInstance(mailgun_sdk.api, MailgunApi)

def test_initialize(self):
mailgun.initialize("api-key-xxx")
self.assertEqual(mailgun.api.api_key, "api-key-xxx")
mailgun_sdk.initialize("api-key-xxx")
self.assertEqual(mailgun_sdk.api.api_key, "api-key-xxx")
4 changes: 2 additions & 2 deletions tests/test_ips.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from mock import patch

from mailgun.api import MailgunApi
from mailgun.ips import IPs
from mailgun_sdk.api import MailgunApi
from mailgun_sdk.ips import IPs


class IPsTestCase(unittest.TestCase):
Expand Down
7 changes: 3 additions & 4 deletions tests/test_mailing_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from mock import patch, call

from mailgun.api import MailgunApi
from mailgun.mailing_list import MailingList
from mailgun_sdk.api import MailgunApi
from mailgun_sdk.mailing_list import MailingList


class MailingListTestCase(unittest.TestCase):
Expand Down Expand Up @@ -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",
},
Expand Down
3 changes: 2 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[tox]
envlist = py27,py36
envlist = py3{6,7,8,9}, pypy


[testenv]
passenv = TRAVIS TRAVIS_*
Expand Down