Skip to content

Commit 8efa824

Browse files
mshaileshr@gmail.commshaileshr@gmail.com
authored andcommitted
docstring
1 parent 365cad7 commit 8efa824

File tree

4 files changed

+172
-79
lines changed

4 files changed

+172
-79
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"python.pythonPath": "venv/bin/python3.7",
2+
"python.pythonPath": "/Library/Frameworks/Python.framework/Versions/3.7/bin/python3",
33
"python.testing.unittestArgs": [
44
"-v",
55
"-s",

contentstack/config.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,18 @@ class ContentstackRegion(enum.Enum):
2525
class Config(object):
2626

2727
def __init__(self):
28+
29+
"""
30+
31+
"""
2832
self.default = dict(protocol="https", region=ContentstackRegion.US, host="cdn.contentstack.io", version="v3")
2933

34+
@property
35+
def region(self):
36+
""" :returns region of the stack """
37+
return self.default['region']
38+
39+
@region.setter
3040
def region(self, region=ContentstackRegion.US):
3141

3242
"""
@@ -40,15 +50,22 @@ def region(self, region=ContentstackRegion.US):
4050
4151
[Example:]
4252
43-
>>> config = Config().region(region=ContentstackRegion.US)
53+
>>> config = Config()
54+
>>> config.region = ContentstackRegion.US
4455
4556
==============================
4657
"""
4758

4859
if region is not None and isinstance(region, ContentstackRegion):
4960
self.default['region'] = region
50-
return self
5161

62+
63+
@property
64+
def host(self):
65+
66+
return self.default['host']
67+
68+
@host.setter
5269
def host(self, host):
5370

5471
"""
@@ -64,7 +81,6 @@ def host(self, host):
6481

6582
if host is not None and isinstance(host, str):
6683
self.default['host'] = host
67-
return self
6884

6985
def version(self, version=None):
7086

@@ -102,10 +118,10 @@ def endpoint(self):
102118

103119
def __get_url(self):
104120
host = self.default["host"]
105-
if self.default['region'] is not ContentstackRegion.US:
106-
if self.default["host"] == 'cdn.contentstack.io':
107-
self.default["host"] = 'cdn.contentstack.com'
108-
else:
109-
regional_host = str(self.default['region'].value)
110-
host = '{}-{}'.format(regional_host, self.default["host"])
111-
return "{0}://{1}/{2}".format(self.default["protocol"], host, self.default["version"])
121+
region = self.default['region'].value
122+
if region is not None:
123+
if region is not 'us':
124+
if self.default["host"] == 'cdn.contentstack.io':
125+
self.default["host"] = 'cdn.contentstack.com'
126+
host = '{}-{}'.format(region, self.default["host"])
127+
return "{0}://{1}/{2}".format(self.default["protocol"], host, self.default["version"])

contentstack/http_connection.py

Lines changed: 145 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import logging
1010
import requests
11-
from urllib import parse
11+
from urllib.parse import urlencode
1212
from contentstack import Error
1313
from json import JSONDecodeError
1414
from requests.exceptions import Timeout, HTTPError
@@ -18,44 +18,55 @@ class HTTPConnection(object):
1818

1919
def __init__(self, url, query, stack_headers):
2020

21-
"""
22-
Initialises the HTTPConnection to make Http Request
23-
:param url: url for the request to made
24-
:param query: It will be executed to retrieve entries. This query should be in key value format.
25-
:param stack_headers: It contains like API key of your stack, access token and others.
26-
"""
2721
if None not in (url, query, stack_headers):
28-
self.__url = url
22+
self.__payload = None
23+
self.__base_url = url
2924
self.__query_params = query
30-
self.__stack_headers = stack_headers
31-
self.__stack_headers.update(self.__user_agents())
25+
self.__headers = stack_headers
26+
self.__headers.update(self.__user_agents())
27+
28+
if 'environment' in self.__headers:
29+
environment = self.__headers['environment']
30+
self.__query_params['environment'] = environment
3231

3332
def get_result(self, url: str, query: dict, headers: dict):
33+
3434
if None not in (url, query, headers):
35-
if len(url) > 0 and len(self.__stack_headers) > 0:
36-
self.__url = url
37-
self.__query_params = query
38-
self.__stack_headers.update(headers)
39-
else:
40-
raise ValueError('Kindly provide a valid input')
41-
42-
# Headers from locale
43-
if 'environment' in self.__stack_headers:
44-
environment = self.__stack_headers['environment']
45-
self.__query_params['environment'] = environment
46-
logging.info('Query Parameters ={}'.format(self.__query_params))
47-
logging.info('Headers ={}'.format(self.__stack_headers))
48-
payload = parse.urlencode(query=self.__query_params, encoding='UTF-8')
35+
if len(url) > 0 and len(self.__headers) > 0:
36+
self.__base_url = url
37+
if len(headers) > 0:
38+
self.__headers.update(headers)
39+
self.__query_params.update(query)
40+
41+
# Case: If UIR Parameter contains entries
42+
if 'entries' in self.__base_url:
43+
self.__payload = self.__execute_entry()
44+
# self.__payload = parse.urlencode(query=params, encoding='UTF-8')
45+
else:
46+
url_param = ''
47+
for (key, value) in self.__query_params.items():
48+
url_param = '{}&{}={}'.format(url_param, key, value)
49+
self.__payload = url_param
50+
4951
try:
50-
response = requests.get(self.__url, verify=True, timeout=(10, 8), params=payload,
51-
headers=self.__stack_headers)
52+
if self.__payload.startswith("&"):
53+
self.__payload = self.__payload[1:]
54+
_url = '{}?{}'.format(self.__base_url, self.__payload)
55+
logging.info('{}?{}'.format(self.__base_url, self.__payload))
56+
response = requests.get(_url, verify=True, timeout=(10, 8), headers=self.__headers)
57+
5258
if response.status_code == 200:
5359
if response.raise_for_status() is None:
5460
return self.__parse_dict(response)
5561
else:
5662
err = response.json()
5763
if err is not None:
58-
return Error()._config(err)
64+
error = Error()
65+
error._config(err)
66+
return error
67+
68+
logging.info('\n\nrequest url => {}\nresponse={}'.format(response.url, response))
69+
5970
except Timeout:
6071
raise TimeoutError('The request timed out')
6172
except ConnectionError:
@@ -65,46 +76,99 @@ def get_result(self, url: str, query: dict, headers: dict):
6576
except HTTPError:
6677
raise HTTPError('Http Error Occurred')
6778

79+
# def __check_for_valid_query(self):
80+
#
81+
# if 'include[]' in self.__query_params:
82+
# url_params = ''
83+
# params = self.__query_params['include[]']
84+
# for param in params:
85+
# url_params = '{}&include[]={}'.format(url_params, param)
86+
# del self.__query_params['include[]']
87+
# return self.__return_query(url_params)
88+
#
89+
# elif 'only[BASE][]' in self.__query_params:
90+
# url_params = ''
91+
# params = self.__query_params['only[BASE][]']
92+
# for param in params:
93+
# url_params = '{}&only[BASE][]={}'.format(url_params, param)
94+
# del self.__query_params['only[BASE][]']
95+
# return self.__return_query(url_params)
96+
#
97+
# elif 'except[BASE][]' in self.__query_params:
98+
# url_params = ''
99+
# params = self.__query_params['except[BASE][]']
100+
# for param in params:
101+
# url_params = '{}&except[BASE][]={}'.format(url_params, param)
102+
# del self.__query_params['except[BASE][]']
103+
# return self.__return_query(url_params)
104+
#
105+
# elif 'only' in self.__query_params:
106+
# url_params = ''
107+
# params = self.__query_params['only']
108+
# for param in params:
109+
# url_params = '{}&only={}'.format(url_params, param)
110+
# del self.__query_params['only']
111+
# return self.__return_query(url_params)
112+
#
113+
# elif 'except' in self.__query_params:
114+
# url_params = ''
115+
# params = self.__query_params['except']
116+
# for param in params:
117+
# url_params = '{}&except={}'.format(url_params, param)
118+
# del self.__query_params['except']
119+
# return self.__return_query(url_params)
120+
#
121+
# elif 'query' in self.__query_params:
122+
# url_params = ''
123+
# params = self.__query_params['query']
124+
# for param in params:
125+
# url_params = '{}&query={}'.format(url_params, param)
126+
# del self.__query_params['query']
127+
# return self.__return_query(url_params)
128+
# else:
129+
# pass
130+
#
131+
# def __return_query(self, url_params):
132+
# other_queries = ''
133+
# for key, value in self.__query_params.items():
134+
# other_queries = '{}&{}={}'.format(other_queries, key, value)
135+
# url_params = '{}{}'.format(other_queries, url_params)
136+
# self.__query_params.clear()
137+
# return url_params
138+
68139
def __parse_dict(self, response):
69140
from contentstack.stack import SyncResult
70141
result = response.json()
71-
logging.info('\n\nrequest url => {}\nresponse={}'.format(response.url, result))
72142

73143
if 'stack' in result:
74144
return result['stack']
75-
# If result contains entry, return Entry
76145
if 'entry' in result:
77146
dict_entry = result['entry']
78147
return self.__parse_entries(dict_entry)
79-
# If result contains entries, return list[Entry]
80148
if 'entries' in result:
81149
entry_list = result['entries']
82150
return self.__parse_entries(entry_list)
83-
# If result contains asset, return Asset
84151
if 'asset' in result:
85152
dict_asset = result['asset']
86153
return self.__parse_assets(dict_asset)
87-
# If result contains assets, return list[Asset]
88154
if 'assets' in result:
89155
asset_list = result['assets']
90156
return self.__parse_assets(asset_list)
91-
# If result contains content_type,return content_type json
92157
if 'content_type' in result:
93158
return result['content_type']
94-
# If result contains content_types,return content_types json
95159
if 'content_types' in result:
96160
return result['content_types']
97-
# If result contains items, return SyncResult json
98161
if 'items' in result:
99-
sync_result = SyncResult()._configure(result)
162+
sync_result = SyncResult()
163+
sync_result._configure(result)
100164
return sync_result
101165

102166
return None
103167

104168
@staticmethod
105169
def __parse_entries(result):
106170
from contentstack import Entry
107-
entries: list[Entry] = []
171+
entries = []
108172
entry = Entry()
109173
# if 'count' in result:
110174
# entry.count = result['count']
@@ -120,7 +184,7 @@ def __parse_entries(result):
120184
@staticmethod
121185
def __parse_assets(result):
122186
from contentstack import Asset
123-
assets: list[Asset] = []
187+
assets = []
124188
asset = Asset()
125189

126190
if result is not None and len(result) > 0:
@@ -138,37 +202,51 @@ def __user_agents() -> dict:
138202
import contentstack
139203
import platform
140204

141-
"""
142-
Contentstack-User-Agent.
143-
"""
144205
header = {'sdk': dict(name=contentstack.__package__, version=contentstack.__version__)}
145-
os_name = platform.system()
146-
147-
if os_name == 'Darwin':
148-
os_name = 'macOS'
149-
150-
elif not os_name or os_name == 'Java':
151-
os_name = None
152-
153-
elif os_name and os_name not in ['macOS', 'Windows']:
154-
os_name = 'Linux'
206+
os = platform.system()
207+
if os == 'Darwin':
208+
os = 'macOS'
209+
elif not os or os == 'Java':
210+
os = None
211+
elif os and os not in ['macOS', 'Windows']:
212+
os = 'Linux'
213+
header['os'] = {'name': os, 'version': platform.release()}
214+
package = "contentstack-python, - {}".format(contentstack.__version__)
215+
local_headers = {'User-Agent': str(header), "Content-Type": 'application/json', "X-User-Agent": package}
216+
return local_headers
155217

156-
header['os'] = {
157-
'name': os_name,
158-
'version': platform.release()
159-
}
218+
def __execute_entry(self):
219+
220+
url_param = ''
221+
222+
for (key, value) in self.__query_params.items():
223+
if key == 'include[]':
224+
if isinstance(value, list):
225+
url_param = '{}&{}'.format(url_param, urlencode({key: value}, doseq=True))
226+
elif key == 'only[BASE][]':
227+
if isinstance(value, list):
228+
url_param = '{}&{}'.format(url_param, urlencode({key: value}, doseq=True))
229+
elif key == 'except[BASE][]':
230+
if isinstance(value, list):
231+
url_param = '{}&{}'.format(url_param, urlencode({key: value}, doseq=True))
232+
elif key == 'only':
233+
for uid in value:
234+
inner_list = value[uid]
235+
inner_key = 'only[{}][]'.format(uid)
236+
if isinstance(inner_list, list):
237+
url_param = '{}&{}'.format(url_param, urlencode({inner_key: inner_list}, doseq=True))
238+
elif key == 'except':
239+
for uid in value:
240+
inner_list = value[uid]
241+
inner_key = 'except[{}][]'.format(uid)
242+
if isinstance(inner_list, list):
243+
url_param = '{}&{}'.format(url_param, urlencode({inner_key: inner_list}, doseq=True))
244+
elif key == 'query':
245+
query = urlencode({key: value})
246+
url_param = '{}&{}'.format(url_param, query, doseq=True)
247+
else:
248+
url_param = '{}&{}={}'.format(url_param, key, value)
160249

161-
local_headers = {'User-Agent': str(header),
162-
"Content-Type": 'application/json',
163-
"X-User-Agent": "contentstack-python, {}".format(contentstack.__version__)
164-
}
165-
return local_headers
250+
return url_param
166251

167-
def __is_valid_json(self, json_string):
168252

169-
import json
170-
try:
171-
json.loads(json_string)
172-
return True
173-
except ValueError as e:
174-
return False

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
"name": "contentstack.python",
33
"version": "0.0.1",
44
"dependencies": {
5-
65
}
76
}

0 commit comments

Comments
 (0)