From a37b06fc9a6218d39ef42b88c8fd9d2ccb5acf2d Mon Sep 17 00:00:00 2001
From: Ilias Tsitsimpis <iliastsi@grnet.gr>
Date: Tue, 26 Aug 2014 15:07:42 +0300
Subject: [PATCH] astakosclient: Fallback to Python's json package

If simplejson is not installed, fallback to python's default 'json'
package. This is needed because 'simplejson' is not available in some
distributions (i.e. CentOs 7).
---
 astakosclient/astakosclient/__init__.py |  8 +++++--
 astakosclient/astakosclient/tests.py    | 30 ++++++++++++++-----------
 astakosclient/setup.py                  |  6 ++++-
 3 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/astakosclient/astakosclient/__init__.py b/astakosclient/astakosclient/__init__.py
index 9e2cb43be..10b896dcf 100644
--- a/astakosclient/astakosclient/__init__.py
+++ b/astakosclient/astakosclient/__init__.py
@@ -24,7 +24,11 @@ import hashlib
 from base64 import b64encode
 from copy import copy
 
-import simplejson
+try:
+    import simplejson as json
+except ImportError:
+    import json
+
 from astakosclient.utils import \
     retry_dec, scheme_to_class, parse_request, check_input, join_urls
 from astakosclient.errors import \
@@ -300,7 +304,7 @@ class AstakosClient(object):
 
         try:
             if data:
-                return simplejson.loads(unicode(data))
+                return json.loads(unicode(data))
             else:
                 return None
         except Exception as err:
diff --git a/astakosclient/astakosclient/tests.py b/astakosclient/astakosclient/tests.py
index 41f96d2ef..d327cb098 100644
--- a/astakosclient/astakosclient/tests.py
+++ b/astakosclient/astakosclient/tests.py
@@ -24,7 +24,11 @@ the astakos client library
 
 import re
 import sys
-import simplejson
+
+try:
+    import simplejson as json
+except ImportError:
+    import json
 
 import astakosclient
 from astakosclient import AstakosClient
@@ -271,10 +275,10 @@ def _req_tokens(conn, method, url, **kwargs):
 
     if 'body' in kwargs:
         # Return endpoints with authenticate info
-        return ("", simplejson.dumps(endpoints_with_info), 200)
+        return ("", json.dumps(endpoints_with_info), 200)
     else:
         # Return endpoints without authenticate info
-        return ("", simplejson.dumps(endpoints), 200)
+        return ("", json.dumps(endpoints), 200)
 
 
 def _req_catalogs(conn, method, url, **kwargs):
@@ -291,7 +295,7 @@ def _req_catalogs(conn, method, url, **kwargs):
         return _request_status_401(conn, method, url, **kwargs)
 
     # Return
-    body = simplejson.loads(kwargs['body'])
+    body = json.loads(kwargs['body'])
     if 'uuids' in body:
         # Return uuid_catalog
         uuids = body['uuids']
@@ -308,7 +312,7 @@ def _req_catalogs(conn, method, url, **kwargs):
         return_catalog = {"displayname_catalog": catalogs, "uuid_catalog": {}}
     else:
         return_catalog = {"displayname_catalog": {}, "uuid_catalog": {}}
-    return ("", simplejson.dumps(return_catalog), 200)
+    return ("", json.dumps(return_catalog), 200)
 
 
 def _req_resources(conn, method, url, **kwargs):
@@ -322,7 +326,7 @@ def _req_resources(conn, method, url, **kwargs):
         return _request_status_400(conn, method, url, **kwargs)
 
     # Return
-    return ("", simplejson.dumps(resources), 200)
+    return ("", json.dumps(resources), 200)
 
 
 def _req_quotas(conn, method, url, **kwargs):
@@ -339,7 +343,7 @@ def _req_quotas(conn, method, url, **kwargs):
         return _request_status_401(conn, method, url, **kwargs)
 
     # Return
-    return ("", simplejson.dumps(quotas), 200)
+    return ("", json.dumps(quotas), 200)
 
 
 def _req_commission(conn, method, url, **kwargs):
@@ -357,22 +361,22 @@ def _req_commission(conn, method, url, **kwargs):
     if method == "POST":
         if 'body' not in kwargs:
             return _request_status_400(conn, method, url, **kwargs)
-        body = simplejson.loads(unicode(kwargs['body']))
+        body = json.loads(unicode(kwargs['body']))
         if re.match('/?'+api_commissions+'$', url) is not None:
             # Issue Commission
             # Check if we have enough resources to give
             if body['provisions'][1]['quantity'] > 420000000:
-                return ("", simplejson.dumps(commission_failure_response), 413)
+                return ("", json.dumps(commission_failure_response), 413)
             else:
                 return \
-                    ("", simplejson.dumps(commission_successful_response), 200)
+                    ("", json.dumps(commission_successful_response), 200)
         else:
             # Issue commission action
             serial = url.split('/')[3]
             if serial == "action":
                 # Resolve multiple actions
                 if body == resolve_commissions_req:
-                    return ("", simplejson.dumps(resolve_commissions_rep), 200)
+                    return ("", json.dumps(resolve_commissions_rep), 200)
                 else:
                     return _request_status_400(conn, method, url, **kwargs)
             else:
@@ -388,12 +392,12 @@ def _req_commission(conn, method, url, **kwargs):
     elif method == "GET":
         if re.match('/?'+api_commissions+'$', url) is not None:
             # Return pending commission
-            return ("", simplejson.dumps(pending_commissions), 200)
+            return ("", json.dumps(pending_commissions), 200)
         else:
             # Return commissions's description
             serial = re.sub('/?' + api_commissions, '', url)[1:]
             if serial == str(57):
-                return ("", simplejson.dumps(commission_description), 200)
+                return ("", json.dumps(commission_description), 200)
             else:
                 return _request_status_404(conn, method, url, **kwargs)
     else:
diff --git a/astakosclient/setup.py b/astakosclient/setup.py
index da5390592..d1fd8752b 100644
--- a/astakosclient/setup.py
+++ b/astakosclient/setup.py
@@ -42,9 +42,12 @@ CLASSIFIERS = []
 # Package requirements
 INSTALL_REQUIRES = [
     "objpool>=0.3",
-    "simplejson"
 ]
 
+EXTRAS_REQUIRES = {
+    'SimpleJSON': ['simplejson'],
+}
+
 # Provided as an attribute, so you can append to these instead
 # of replicating them:
 standard_exclude = ["*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak"]
@@ -158,6 +161,7 @@ setup(
     zip_safe=False,
 
     install_requires=INSTALL_REQUIRES,
+    extras_require=EXTRAS_REQUIRES,
     tests_require=['mock'],
 
     entry_points={},
-- 
GitLab