-
-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathapi.py
More file actions
94 lines (81 loc) · 3.3 KB
/
api.py
File metadata and controls
94 lines (81 loc) · 3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env python
# -*- coding: utf8 -*-
# ============================================================================
# Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============================================================================
import json
from requests import get
from urllib.parse import quote
from urllib.parse import urlencode
from urllib.error import HTTPError
from attributecode import ERROR
from attributecode import Error
from attributecode import __version__
"""
API call helpers
"""
# FIXME: args should start with license_key
def request_license_data(api_url, api_key, license_key):
"""
Return a tuple of (dictionary of license data, list of errors) given a
`license_key`. Send a request to `api_url` authenticating with `api_key`.
"""
headers = {
'Authorization': 'Token %s' % api_key,
}
payload = {
'api_key': api_key,
'key': license_key,
'format': 'json'
}
api_url = api_url.rstrip('/')
payload = urlencode(payload)
full_url = '%(api_url)s/?%(payload)s' % locals()
# handle special characters in URL such as space etc.
quoted_url = quote(full_url, safe="%/:=&?~#+!$,;'@()*[]")
license_data = {}
errors = []
try:
response = get(quoted_url, headers=headers)
response_content = response.text
# FIXME: this should be an ordered dict
license_data = json.loads(response_content)
if not license_data.get('results', []):
msg = u"Invalid 'license': %s" % license_key
errors.append(Error(ERROR, msg))
except HTTPError as http_e:
msg = (u"Authorization denied. Invalid '--api_key'. "
u"License generation is skipped.")
errors.append(Error(ERROR, msg))
except Exception as e:
# Already checked the authorization and accessible of the URL.
# The only exception left is URL is accessible, but it's not a valid API URL
msg = (u"Invalid '--api_url'. "
u"License generation is skipped.")
errors.append(Error(ERROR, msg))
finally:
if license_data.get('count') == 1:
license_data = license_data.get('results')[0]
else:
license_data = {}
return license_data, errors
# FIXME: args should start with license_key
def get_license_details_from_api(api_url, api_key, license_key):
"""
Return a tuple of license data given a `license_key` using the `api_url`
authenticating with `api_key`.
The details are a tuple of (license_name, license_key, license_text, errors)
where errors is a list of strings.
Missing values are provided as empty strings.
"""
license_data, errors = request_license_data(api_url, api_key, license_key)
return license_data, errors