Skip to content

Commit bac330e

Browse files
First tests passing
1 parent f768690 commit bac330e

13 files changed

Lines changed: 124 additions & 418 deletions

example_v3_universalclient_test.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import sendgrid
2+
import json
3+
4+
import os
5+
if os.path.exists('.env'):
6+
for line in open('.env'):
7+
var = line.strip().split('=')
8+
if len(var) == 2:
9+
os.environ[var[0]] = var[1]
10+
11+
# StopLight Proxy Test
12+
# https://designer.stoplight.io/wk/F8THnzoqMYoLiWfin/xffLhad2tAAaLiKEq/S5LsAX4SWF7cJHu2R/requests/56b3da76f787db00033b3e18
13+
# sg = sendgrid.SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'), host="https://qpsfwaq3savksegdq.stoplight-proxy.io/v3/")
14+
sg = sendgrid.SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
15+
16+
templates = sg.client.templates
17+
18+
#TODO: Do the POST first
19+
20+
# GET Retrieve all templates.
21+
response = templates.get()
22+
print(response.status_code)
23+
print(response.json())
24+
25+
# GET Retrieve a single template.
26+
template_id = "13b8f94f-bcae-4ec6-b752-70d6cb59f932"
27+
response = templates._(template_id).get()
28+
print(response.status_code)
29+
print(response.json())
30+
31+
# POST Create a template.
32+
data = {"name": "UniversalClient Template Test v1"}
33+
response = templates.post(data=data)
34+
print(response.status_code)
35+
response_json = response.json()
36+
print(response_json)
37+
template_id = response_json['id']
38+
39+
# PATCH Edit a template.
40+
data = {"name": "UniversalClient Template Test v2"}
41+
response = templates._(template_id).patch(data=data)
42+
print(response.status_code)
43+
print(response.json())
44+
45+
# DELETE Delete a template.
46+
response = templates._(template_id).delete()
47+
print(response.status_code)

sendgrid/client.py

Lines changed: 11 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,33 @@
1+
from universalclient import Client, jsonFilter
12
import json
23
from .version import __version__
3-
from socket import timeout
4-
try:
5-
import urllib.request as urllib_request
6-
from urllib.parse import urlencode
7-
from urllib.error import HTTPError
8-
except ImportError: # Python 2
9-
import urllib2 as urllib_request
10-
from urllib2 import HTTPError
11-
from urllib import urlencode
12-
13-
from .exceptions import SendGridClientError, SendGridServerError
14-
from .resources.api_keys import APIKeys
15-
from .resources.asm_groups import ASMGroups
16-
from .resources.asm_suppressions import ASMSuppressions
17-
from .resources.asm_global_suppressions import ASMGlobalSuppressions
18-
from .resources.suppressions import Suppressions
19-
from .resources.stats import Stats
20-
214
class SendGridAPIClient(object):
225

236
"""SendGrid API."""
247

258
def __init__(self, apikey, **opts):
269
"""
27-
Construct SendGrid API object.
10+
Construct SendGrid v3 API object.
2811
2912
Args:
3013
apikey: SendGrid API key
31-
opts: You can pass in host or proxies
14+
opts: You can pass in a different host
3215
"""
3316
self._apikey = apikey
3417
self.useragent = 'sendgrid/' + __version__ + ';python_v3'
35-
self.host = opts.get('host', 'https://api.sendgrid.com')
36-
# urllib cannot connect to SSL servers using proxies
37-
self.proxies = opts.get('proxies', None)
18+
self.host = opts.get('host', 'https://api.sendgrid.com/v3/')
19+
self.version = __version__
3820

39-
self.apikeys = APIKeys(self)
40-
self.asm_groups = ASMGroups(self)
41-
self.asm_suppressions = ASMSuppressions(self)
42-
self.asm_global_suppressions = ASMGlobalSuppressions(self)
43-
self.suppressions = Suppressions(self)
44-
self.stats = Stats(self)
21+
headers = "{\"Authorization\": \"Bearer " + self._apikey + "\", \
22+
\"Content-Type\": \"application/json\", \
23+
\"User-agent\": \"" + self.useragent + "\"}"
24+
25+
self.client = Client(self.host, dataFilter=jsonFilter, headers=json.loads(headers))
4526

4627
@property
4728
def apikey(self):
4829
return self._apikey
4930

5031
@apikey.setter
5132
def apikey(self, value):
52-
self._apikey = value
53-
54-
def _build_request(self, url, json_header=False, method='GET', data=None):
55-
if self.proxies:
56-
proxy_support = urllib_request.ProxyHandler(self.proxies)
57-
opener = urllib_request.build_opener(proxy_support)
58-
urllib_request.install_opener(opener)
59-
req = urllib_request.Request(url)
60-
req.get_method = lambda: method
61-
req.add_header('User-Agent', self.useragent)
62-
req.add_header('Authorization', 'Bearer ' + self.apikey)
63-
if json_header:
64-
req.add_header('Content-Type', 'application/json')
65-
try:
66-
if data:
67-
response = urllib_request.urlopen(req, json.dumps(data))
68-
else:
69-
response = urllib_request.urlopen(req, timeout=10)
70-
except HTTPError as e:
71-
if 400 <= e.code < 500:
72-
raise SendGridClientError(e.code, e.read())
73-
elif 500 <= e.code < 600:
74-
raise SendGridServerError(e.code, e.read())
75-
else:
76-
assert False
77-
except timeout as e:
78-
raise SendGridClientError(408, 'Request timeout')
79-
body = response.read()
80-
return response.getcode(), body
81-
82-
def get(self, api):
83-
url = self.host + api.endpoint
84-
response, body = self._build_request(url, False, 'GET')
85-
return response, body
86-
87-
def post(self, api, data):
88-
url = self.host + api.endpoint
89-
response, body = self._build_request(url, True, 'POST', data)
90-
return response, body
91-
92-
def delete(self, api):
93-
url = self.host + api.endpoint
94-
response, body = self._build_request(url, False, 'DELETE')
95-
return response, body
96-
97-
def patch(self, api, data):
98-
url = self.host + api.endpoint
99-
response, body = self._build_request(url, True, 'PATCH', data)
100-
return response, body
33+
self._apikey = value

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
def getRequires():
10-
deps = ['smtpapi==0.3.1']
10+
deps = ['smtpapi==0.3.1', 'universalclient']
1111
if sys.version_info < (2, 7):
1212
deps.append('unittest2')
1313
elif (3, 0) <= sys.version_info < (3, 2):

test/base_test.py

Lines changed: 0 additions & 37 deletions
This file was deleted.

test/test_api_client.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

test/test_api_keys.py

Lines changed: 0 additions & 51 deletions
This file was deleted.

test/test_asm_global_suppressions.py

Lines changed: 0 additions & 48 deletions
This file was deleted.

test/test_asm_groups.py

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)