Skip to content
Merged
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
92 changes: 45 additions & 47 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ name: CI

on:
push:
branches: [ main ]
branches: [main]
pull_request:
branches: [ main ]
branches: [main]
workflow_dispatch:

concurrency:
concurrency:
group: mailosaur-python
cancel-in-progress: true

Expand All @@ -21,7 +21,7 @@ jobs:
strategy:
max-parallel: 1
matrix:
python-version: ['3.9']
python-version: ["3.9"]

env:
MAILOSAUR_BASE_URL: https://mailosaur.com/
Expand All @@ -30,29 +30,28 @@ jobs:
MAILOSAUR_API_KEY: ${{ secrets.MAILOSAUR_API_KEY }}
MAILOSAUR_SERVER: ${{ secrets.MAILOSAUR_SERVER }}
MAILOSAUR_VERIFIED_DOMAIN: ${{ secrets.MAILOSAUR_VERIFIED_DOMAIN }}
MAILOSAUR_PREVIEWS_SERVER: ${{ secrets.MAILOSAUR_PREVIEWS_SERVER }}

steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Test with pytest
run: |
pytest
- name: Notify on Failure
uses: skitionek/notify-microsoft-teams@master
if: ${{ failure() }}
with:
webhook_url: ${{ secrets.TEAMS_BUILDS_WEBHOOK }}
needs: ${{ toJson(needs) }}
job: ${{ toJson(job) }}
overwrite: "{ title: `${workflow} failed for ${repository.name}` }"
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Test with pytest
run: |
pytest
- name: Notify on Failure
uses: skitionek/notify-microsoft-teams@master
if: ${{ failure() }}
with:
webhook_url: ${{ secrets.TEAMS_BUILDS_WEBHOOK }}
needs: ${{ toJson(needs) }}
job: ${{ toJson(job) }}
overwrite: "{ title: `${workflow} failed for ${repository.name}` }"

build-next:
if: ${{ always() }}
Expand All @@ -62,7 +61,7 @@ jobs:
strategy:
max-parallel: 1
matrix:
python-version: ['3.9']
python-version: ["3.9"]

env:
MAILOSAUR_BASE_URL: https://next.mailosaur.com/
Expand All @@ -71,26 +70,25 @@ jobs:
MAILOSAUR_API_KEY: ${{ secrets.MAILOSAUR_API_KEY }}
MAILOSAUR_SERVER: ${{ secrets.MAILOSAUR_SERVER }}
MAILOSAUR_VERIFIED_DOMAIN: ${{ secrets.MAILOSAUR_VERIFIED_DOMAIN }}
MAILOSAUR_PREVIEWS_SERVER: ${{ secrets.MAILOSAUR_PREVIEWS_SERVER }}

steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Test with pytest
run: |
pytest
- name: Notify on Failure
uses: skitionek/notify-microsoft-teams@master
if: ${{ failure() }}
with:
webhook_url: ${{ secrets.TEAMS_BUILDS_WEBHOOK }}
needs: ${{ toJson(needs) }}
job: ${{ toJson(job) }}
overwrite: "{ title: `${workflow} failed for ${repository.name}` }"
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Test with pytest
run: |
pytest
- name: Notify on Failure
uses: skitionek/notify-microsoft-teams@master
if: ${{ failure() }}
with:
webhook_url: ${{ secrets.TEAMS_BUILDS_WEBHOOK }}
needs: ${{ toJson(needs) }}
job: ${{ toJson(job) }}
overwrite: "{ title: `${workflow} failed for ${repository.name}` }"
5 changes: 4 additions & 1 deletion mailosaur/mailosaur_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, api_key, base_url="https://mailosaur.com/"):
""" Pass in your mailbox id and api key to authenticate """
session = requests.Session()
session.auth = (api_key, '')
session.headers.update({'User-Agent': 'mailosaur-python/7.0.0'})
session.headers.update({'User-Agent': 'mailosaur-python/8.0.0'})

if base_url is None:
base_url = "https://mailosaur.com/"
Expand Down Expand Up @@ -67,6 +67,9 @@ def handle_http_error(self, response):
elif response.status_code == 404:
raise MailosaurException("Not found, check input parameters.",
"invalid_request", response.status_code, response.text)
elif response.status_code == 410:
raise MailosaurException("Permanently expired or deleted.",
"gone", response.status_code, response.text)
else:
raise MailosaurException("An API error occurred, see httpResponse for further information.",
"api_error", response.status_code, response.text)
8 changes: 4 additions & 4 deletions mailosaur/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
from .device_create_options import DeviceCreateOptions
from .otp_result import OtpResult
from .preview_list_result import PreviewListResult
from .preview_email_client_list_result import PreviewEmailClientListResult
from .preview_request import PreviewRequest
from .email_client_list_result import EmailClientListResult
from .email_client import EmailClient
from .preview_request_options import PreviewRequestOptions

__all__ = [
Expand Down Expand Up @@ -68,7 +68,7 @@
'DeviceCreateOptions',
'OtpResult',
'PreviewListResult',
'PreviewEmailClientListResult',
'PreviewRequest',
'EmailClientListResult',
'EmailClient',
'PreviewRequestOptions'
]
22 changes: 22 additions & 0 deletions mailosaur/models/email_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class EmailClient(object):
"""Describes an email client with which email previews can be generated.

:param label: The unique email client label. Used when generating email preview requests.
:type label: str

:param name: The display name of the email client.
:type name: str
"""

def __init__(self, data=None):
if data is None:
data = {}

self.label = data.get('label', None)
self.name = data.get('name', None)

def to_json(self):
return {
'label': self.label,
'name': self.name
}
15 changes: 15 additions & 0 deletions mailosaur/models/email_client_list_result.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from .email_client import EmailClient


class EmailClientListResult(object):
"""A list of available email clients with which to generate email previews.

:param items: A list of available email clients.
:type items: list[~mailosaur.models.EmailClient]
"""

def __init__(self, data=None):
if data is None:
data = {}

self.items = [EmailClient(i) for i in data.get('items', None)]
47 changes: 0 additions & 47 deletions mailosaur/models/preview_email_client.py

This file was deleted.

15 changes: 0 additions & 15 deletions mailosaur/models/preview_email_client_list_result.py

This file was deleted.

19 changes: 0 additions & 19 deletions mailosaur/models/preview_request.py

This file was deleted.

16 changes: 5 additions & 11 deletions mailosaur/models/preview_request_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,14 @@
class PreviewRequestOptions(object):
"""PreviewRequestOptions.

:param previews: The list of email preview requests.
:type previews: list[~mailosaur.models.PreviewRequest]
:param email_clients: The list email clients to generate previews with.
:type email_clients: list[str]
"""

def __init__(self, previews=None):
self.previews = previews
def __init__(self, email_clients=None):
self.email_clients = email_clients

def to_json(self):
previews = []

if self.previews is not None:
for a in self.previews:
previews.append(a.to_json())

return {
'previews': previews
'emailClients': self.email_clients
}
37 changes: 31 additions & 6 deletions mailosaur/operations/files_operations.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from ..models import MailosaurException
import time
from datetime import datetime


class FilesOperations(object):
Expand Down Expand Up @@ -67,11 +69,34 @@ def get_preview(self, id):
:raises:
:class:`HttpOperationError<msrest.exceptions.HttpOperationError>`
"""
url = "%sapi/files/previews/%s" % (self.base_url, id)
response = self.session.get(url, stream=True)
timeout = 120000
poll_count = 0
start_time = datetime.today()

if response.status_code not in [200]:
self.handle_http_error(response)
return
while True:
url = "%sapi/files/screenshots/%s" % (self.base_url, id)
response = self.session.get(url, stream=True)

return response
if response.status_code == 200:
return response

if response.status_code not in [202]:
self.handle_http_error(response)
return

# List conversion necessary for Python 3 compatibility
# https://stackoverflow.com/questions/36982858/object-of-type-map-has-no-len-in-python-3
delay_pattern = list(
map(int, (response.headers.get('x-ms-delay') or '1000').split(',')))

delay = delay_pattern[len(
delay_pattern) - 1] if poll_count >= len(delay_pattern) else delay_pattern[poll_count]

poll_count += 1

# Stop if timeout will be exceeded
if ((1000 * (datetime.today() - start_time).total_seconds()) + delay) > timeout:
raise MailosaurException(
"An email preview was not generated in time. The email client may not be available, or the preview ID [%s] may be incorrect." % id, "preview_timeout")

time.sleep(delay / 1000)
2 changes: 1 addition & 1 deletion mailosaur/operations/messages_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ def generate_previews(self, id, options):
:raises:
:class:`MailosaurException<mailosaur.models.MailosaurException>`
"""
url = "%sapi/messages/%s/previews" % (self.base_url, id)
url = "%sapi/messages/%s/screenshots" % (self.base_url, id)
response = self.session.post(url, json=options.to_json())

if response.status_code not in [200]:
Expand Down
Loading