commit python-slumber for openSUSE:Factory
Hello community, here is the log from the commit of package python-slumber for openSUSE:Factory checked in at 2012-11-12 16:06:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-slumber (Old) and /work/SRC/openSUSE:Factory/.python-slumber.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-slumber", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/python-slumber/python-slumber.changes 2012-06-10 21:52:18.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-slumber.new/python-slumber.changes 2012-11-12 16:06:33.000000000 +0100 @@ -1,0 +2,9 @@ +Mon Nov 5 21:48:52 UTC 2012 - saschpe@suse.de + +- Update to version 0.5.1: + + Fix serializers to work with multiple content_types +- Changes from version 0.5.0: + + Refactoring release +- Disabled testsuite, upstream seems to have dropped it + +------------------------------------------------------------------- Old: ---- slumber-0.4.2.tar.gz New: ---- slumber-0.5.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-slumber.spec ++++++ --- /var/tmp/diff_new_pack.5OJSIP/_old 2012-11-12 16:06:34.000000000 +0100 +++ /var/tmp/diff_new_pack.5OJSIP/_new 2012-11-12 16:06:34.000000000 +0100 @@ -17,7 +17,7 @@ Name: python-slumber -Version: 0.4.2 +Version: 0.5.1 Release: 0 Url: http://slumber.in/ Summary: A library that makes consuming a REST API easier and more convenient @@ -27,8 +27,8 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: python-devel BuildRequires: python-distribute -BuildRequires: python-mock -BuildRequires: python-requests +#BuildRequires: python-mock +#BuildRequires: python-requests Requires: python-PyYAML Requires: python-requests Requires: python-simplejson @@ -53,10 +53,8 @@ %install python setup.py install --prefix=%{_prefix} --root=%{buildroot} -%if 0%{?suse_version} != 1110 -%check -python setup.py test -%endif +#check +#python setup.py test %files %defattr(-,root,root,-) ++++++ slumber-0.4.2.tar.gz -> slumber-0.5.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/MANIFEST.in new/slumber-0.5.1/MANIFEST.in --- old/slumber-0.4.2/MANIFEST.in 2012-01-21 21:48:34.000000000 +0100 +++ new/slumber-0.5.1/MANIFEST.in 2012-10-29 17:12:17.000000000 +0100 @@ -2,3 +2,4 @@ include README.rst include LICENSE.txt include CHANGELOG.rst +prune tests diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/PKG-INFO new/slumber-0.5.1/PKG-INFO --- old/slumber-0.4.2/PKG-INFO 2012-04-16 13:58:11.000000000 +0200 +++ new/slumber-0.5.1/PKG-INFO 2012-10-30 18:08:48.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: slumber -Version: 0.4.2 +Version: 0.5.1 Summary: A library that makes consuming a REST API easier and more convenient Home-page: http://slumber.in/ Author: Donald Stufft diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/docs/options.rst new/slumber-0.5.1/docs/options.rst --- old/slumber-0.4.2/docs/options.rst 2012-04-13 01:25:01.000000000 +0200 +++ new/slumber-0.5.1/docs/options.rst 2012-10-29 17:12:17.000000000 +0100 @@ -32,9 +32,9 @@ Serializer ========== -Slumber allows you to use either json or yaml as your serializer. It defaults to using -json. You can change this default by specifying a ``format`` argument to your -api class.:: +Slumber allows you to use any serialization you want. It comes with json and +yaml but creating your own is easy. By default it will attempt to use json. You +can change the default by specifying a ``format`` argument to your api class.:: # Use Yaml instead of Json api = slumber.API("http://path/to/my/api/", format="yaml") @@ -45,6 +45,40 @@ api = slumber.API("http://path/to/my/api/") # Serializer defaults to Json api.resource_name(format="yaml").get() # Serializer will be Yaml +If you want to create your own serializer you can do so. A serialize inherits from +``slumber.serialize.BaseSerializer`` and implements ``loads``, ``dumps``. It +also must have a class member of ``key`` which will be the string key for this +serialization (such as "json").The final requirement is either a class member +of ``content_type`` which is the content type to use for requests (such as +"application/json") or define a ``get_content_type`` method. + +An example:: + + class PickleSerializer(slumber.serialize.BaseSerializer): + key = "pickle" + content_type = "x-application/pickle" + + def loads(self, data): + return pickle.loads(data) + + def dumps(self, data): + return pickle.dumps(data) + +Once you have a custom serializer you can pass it to slumber like so:: + + from slumber import serialize + import slumber + + s = serialize.Serializer( + default="pickle", + serializers=[ + serialize.JsonSerializer(), + serialize.YamlSerializer(), + PickleSerializer(), + ] + ) + api = slumber.API("http://example.com/api/v1/", format="pickle", serializer=s) + Slashes ======= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/docs/tutorial.rst new/slumber-0.5.1/docs/tutorial.rst --- old/slumber-0.4.2/docs/tutorial.rst 2012-04-16 13:30:26.000000000 +0200 +++ new/slumber-0.5.1/docs/tutorial.rst 2012-10-29 17:12:17.000000000 +0100 @@ -44,6 +44,8 @@ >>> new = api.note.post({"title": "My Test Note", "content": "This is the content of my Test Note!"}) >>> ## PUT http://slumber.in/api/v1/note/{id}/ >>> api.note(new["id"]).put({"content": "I just changed the content of my Test Note!"}) + >>> ## PATCH http://slumber.in/api/v1/note/{id}/ + >>> api.note(new["id"]).patch({"content": "Wat!"}) >>> ## GET http://slumber.in/api/v1/note/{id}/ >>> api.note(new["id"]).get() >>> ## DELETE http://slumber.in/api/v1/note/{id}/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/setup.py new/slumber-0.5.1/setup.py --- old/slumber-0.4.2/setup.py 2012-04-16 13:56:18.000000000 +0200 +++ new/slumber-0.5.1/setup.py 2012-10-30 18:07:44.000000000 +0100 @@ -11,7 +11,7 @@ setup( name = "slumber", - version = "0.4.2", + version = "0.5.1", description = "A library that makes consuming a REST API easier and more convenient", long_description="\n\n".join([ open(os.path.join(base_dir, "README.rst"), "r").read(), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/slumber/__init__.py new/slumber-0.5.1/slumber/__init__.py --- old/slumber-0.4.2/slumber/__init__.py 2012-04-16 13:55:47.000000000 +0200 +++ new/slumber-0.5.1/slumber/__init__.py 2012-10-30 18:04:33.000000000 +0100 @@ -88,11 +88,8 @@ return self.__class__(**kwargs) - def get_serializer(self): - return Serializer(default_format=self._store["format"]) - def _request(self, method, data=None, params=None): - s = self.get_serializer() + s = self._store["serializer"] url = self._store["base_url"] if self._store["append_slash"] and not url.endswith("/"): @@ -105,44 +102,63 @@ elif 500 <= resp.status_code <= 599: raise exceptions.HttpServerError("Server Error %s: %s" % (resp.status_code, url), response=resp, content=resp.content) + self._ = resp + return resp - def get(self, **kwargs): - s = self.get_serializer() + def _handle_redirect(self, resp, **kwargs): + # @@@ Hacky, see description in __call__ + resource_obj = self(url_override=resp.headers["location"]) + return resource_obj.get(params=kwargs) + + def _try_to_serialize_response(self, resp): + s = self._store["serializer"] + + if resp.headers.get("content-type", None): + content_type = resp.headers.get("content-type").split(";")[0].strip() + + try: + stype = s.get_serializer(content_type=content_type) + except exceptions.SerializerNotAvailable: + return resp.content + + return stype.loads(resp.content) + else: + return resp.content + def get(self, **kwargs): resp = self._request("GET", params=kwargs) if 200 <= resp.status_code <= 299: - if resp.status_code == 200: - return s.loads(resp.content) - else: - return resp.content + return self._try_to_serialize_response(resp) else: return # @@@ We should probably do some sort of error here? (Is this even possible?) def post(self, data, **kwargs): - s = self.get_serializer() + s = self._store["serializer"] resp = self._request("POST", data=s.dumps(data), params=kwargs) if 200 <= resp.status_code <= 299: - if resp.status_code == 201: - # @@@ Hacky, see description in __call__ - resource_obj = self(url_override=resp.headers["location"]) - return resource_obj.get(params=kwargs) - else: - return resp.content + return self._try_to_serialize_response(resp) + else: + # @@@ Need to be Some sort of Error Here or Something + return + + def patch(self, data, **kwargs): + s = self._store["serializer"] + + resp = self._request("PATCH", data=s.dumps(data), params=kwargs) + if 200 <= resp.status_code <= 299: + return self._try_to_serialize_response(resp) else: # @@@ Need to be Some sort of Error Here or Something return def put(self, data, **kwargs): - s = self.get_serializer() + s = self._store["serializer"] resp = self._request("PUT", data=s.dumps(data), params=kwargs) if 200 <= resp.status_code <= 299: - if resp.status_code == 204: - return True - else: - return True # @@@ Should this really be True? + return self._try_to_serialize_response(resp) else: return False @@ -159,12 +175,16 @@ class API(ResourceAttributesMixin, object): - def __init__(self, base_url=None, auth=None, format=None, append_slash=True, session=None): + def __init__(self, base_url=None, auth=None, format=None, append_slash=True, session=None, serializer=None): + if serializer is None: + s = Serializer(default=format) + self._store = { "base_url": base_url, "format": format if format is not None else "json", "append_slash": append_slash, "session": requests.session(auth=auth) if session is None else session, + "serializer": s, } # Do some Checks for Required Values diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/slumber/serialize.py new/slumber-0.5.1/slumber/serialize.py --- old/slumber-0.4.2/slumber/serialize.py 2012-01-21 21:48:34.000000000 +0100 +++ new/slumber-0.5.1/slumber/serialize.py 2012-10-30 17:48:33.000000000 +0100 @@ -1,6 +1,6 @@ from slumber import exceptions -SERIALIZERS = { +_SERIALIZERS = { "json": True, "yaml": True, } @@ -11,25 +11,23 @@ try: import json except ImportError: - SERIALIZERS["json"] = False + _SERIALIZERS["json"] = False try: import yaml except ImportError: - SERIALIZERS["yaml"] = False - -if not len([x for x in SERIALIZERS.values() if x]): - raise exceptions.SerializerNoAvailable("There are no Available Serializers.") + _SERIALIZERS["yaml"] = False class BaseSerializer(object): - content_type = None + content_types = None + key = None def get_content_type(self): - if self.content_type is None: + if self.content_types is None: raise NotImplementedError() - return self.content_type + return self.content_types[0] def loads(self, data): raise NotImplementedError() @@ -40,7 +38,14 @@ class JsonSerializer(BaseSerializer): - content_type = "application/json" + content_types = [ + "application/json", + "application/x-javascript", + "text/javascript", + "text/x-javascript", + "text/x-json", + ] + key = "json" def loads(self, data): return json.loads(data) @@ -51,7 +56,8 @@ class YamlSerializer(BaseSerializer): - content_type = "text/yaml" + content_types = ["text/yaml"] + key = "yaml" def loads(self, data): return yaml.safe_load(data) @@ -62,24 +68,36 @@ class Serializer(object): - _serializers = { - "json": JsonSerializer(), - "yaml": YamlSerializer(), - } - - def __init__(self, default_format="json"): - default_format = default_format if default_format is not None else "json" - - self.available_serializers = [x[0] for x in SERIALIZERS.items() if x[1]] - self.default_format = self.get_serializer(default_format) - - def get_serializer(self, name=None): - if name is None: - return self.default_format - else: - if not name in self.available_serializers: + def __init__(self, default=None, serializers=None): + if default is None: + default = "json" if _SERIALIZERS["json"] else "yaml" + + if serializers is None: + serializers = [x() for x in [JsonSerializer, YamlSerializer] if _SERIALIZERS[x.key]] + + if not serializers: + raise exceptions.SerializerNoAvailable("There are no Available Serializers.") + + self.serializers = {} + + for serializer in serializers: + self.serializers[serializer.key] = serializer + + self.default = default + + def get_serializer(self, name=None, content_type=None): + if name is None and content_type is None: + return self.serializers[self.default] + elif name is not None and content_type is None: + if not name in self.serializers: raise exceptions.SerializerNotAvailable("%s is not an available serializer" % name) - return self._serializers[name] + return self.serializers[name] + else: + for x in self.serializers.values(): + for ctype in x.content_types: + if content_type == ctype: + return x + raise exceptions.SerializerNotAvailable("%s is not an available serializer" % content_type) def loads(self, data, format=None): s = self.get_serializer(format) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/slumber.egg-info/PKG-INFO new/slumber-0.5.1/slumber.egg-info/PKG-INFO --- old/slumber-0.4.2/slumber.egg-info/PKG-INFO 2012-04-16 13:58:09.000000000 +0200 +++ new/slumber-0.5.1/slumber.egg-info/PKG-INFO 2012-10-30 18:08:46.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: slumber -Version: 0.4.2 +Version: 0.5.1 Summary: A library that makes consuming a REST API easier and more convenient Home-page: http://slumber.in/ Author: Donald Stufft diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/slumber.egg-info/SOURCES.txt new/slumber-0.5.1/slumber.egg-info/SOURCES.txt --- old/slumber-0.4.2/slumber.egg-info/SOURCES.txt 2012-04-16 13:58:09.000000000 +0200 +++ new/slumber-0.5.1/slumber.egg-info/SOURCES.txt 2012-10-30 18:08:46.000000000 +0100 @@ -15,7 +15,4 @@ slumber.egg-info/dependency_links.txt slumber.egg-info/not-zip-safe slumber.egg-info/requires.txt -slumber.egg-info/top_level.txt -tests/__init__.py -tests/resource.py -tests/utils.py \ No newline at end of file +slumber.egg-info/top_level.txt \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/tests/__init__.py new/slumber-0.5.1/tests/__init__.py --- old/slumber-0.4.2/tests/__init__.py 2012-01-21 21:48:34.000000000 +0100 +++ new/slumber-0.5.1/tests/__init__.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -import os.path -import unittest - - -def get_tests(): - start_dir = os.path.dirname(__file__) - return unittest.TestLoader().discover(start_dir, pattern="*.py") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/tests/resource.py new/slumber-0.5.1/tests/resource.py --- old/slumber-0.4.2/tests/resource.py 2012-04-13 01:25:10.000000000 +0200 +++ new/slumber-0.5.1/tests/resource.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,36 +0,0 @@ -import mock -import unittest -import requests -import slumber - - -class ResourceTestCase(unittest.TestCase): - - def setUp(self): - self.base_resource = slumber.Resource(base_url="http://example/api/v1/test", format="json", append_slash=False) - - def test_get_serializer(self): - self.assertTrue(isinstance(self.base_resource.get_serializer(), slumber.Serializer)) - - def test_request_200(self): - r = mock.Mock(spec=requests.Response) - r.status_code = 200 - r.content = "Mocked Content" - - self.base_resource._store.update({ - "session": mock.Mock(spec=requests.Session), - }) - self.base_resource._store["session"].request.return_value = r - - resp = self.base_resource._request("GET") - - self.assertTrue(resp is r) - self.assertEqual(resp.content, "Mocked Content") - - self.base_resource._store["session"].request.assert_called_once_with( - "GET", - "http://example/api/v1/test", - data=None, - params=None, - headers={"content-type": self.base_resource.get_serializer().get_content_type(), "accept": self.base_resource.get_serializer().get_content_type()} - ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/slumber-0.4.2/tests/utils.py new/slumber-0.5.1/tests/utils.py --- old/slumber-0.4.2/tests/utils.py 2012-04-16 13:55:47.000000000 +0200 +++ new/slumber-0.5.1/tests/utils.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import slumber - - -class UtilsTestCase(unittest.TestCase): - - def test_url_join_http(self): - self.assertEqual(slumber.url_join("http://example.com/"), "http://example.com/") - self.assertEqual(slumber.url_join("http://example.com/", "test"), "http://example.com/test") - self.assertEqual(slumber.url_join("http://example.com/", "test", "example"), "http://example.com/test/example") - - self.assertEqual(slumber.url_join("http://example.com"), "http://example.com/") - self.assertEqual(slumber.url_join("http://example.com", "test"), "http://example.com/test") - self.assertEqual(slumber.url_join("http://example.com", "test", "example"), "http://example.com/test/example") - - def test_url_join_https(self): - self.assertEqual(slumber.url_join("https://example.com/"), "https://example.com/") - self.assertEqual(slumber.url_join("https://example.com/", "test"), "https://example.com/test") - self.assertEqual(slumber.url_join("https://example.com/", "test", "example"), "https://example.com/test/example") - - self.assertEqual(slumber.url_join("https://example.com"), "https://example.com/") - self.assertEqual(slumber.url_join("https://example.com", "test"), "https://example.com/test") - self.assertEqual(slumber.url_join("https://example.com", "test", "example"), "https://example.com/test/example") - - def test_url_join_http_port(self): - self.assertEqual(slumber.url_join("http://example.com:80/"), "http://example.com:80/") - self.assertEqual(slumber.url_join("http://example.com:80/", "test"), "http://example.com:80/test") - self.assertEqual(slumber.url_join("http://example.com:80/", "test", "example"), "http://example.com:80/test/example") - - def test_url_join_https_port(self): - self.assertEqual(slumber.url_join("https://example.com:443/"), "https://example.com:443/") - self.assertEqual(slumber.url_join("https://example.com:443/", "test"), "https://example.com:443/test") - self.assertEqual(slumber.url_join("https://example.com:443/", "test", "example"), "https://example.com:443/test/example") - - def test_url_join_path(self): - self.assertEqual(slumber.url_join("/"), "/") - self.assertEqual(slumber.url_join("/", "test"), "/test") - self.assertEqual(slumber.url_join("/", "test", "example"), "/test/example") - - self.assertEqual(slumber.url_join("/path/"), "/path/") - self.assertEqual(slumber.url_join("/path/", "test"), "/path/test") - self.assertEqual(slumber.url_join("/path/", "test", "example"), "/path/test/example") - - def test_url_join_trailing_slash(self): - self.assertEqual(slumber.url_join("http://example.com/", "test/"), "http://example.com/test/") - self.assertEqual(slumber.url_join("http://example.com/", "test/", "example/"), "http://example.com/test/example/") - - def test_url_join_encoded_unicode(self): - expected = "http://example.com/tǝst/" - - url = slumber.url_join("http://example.com/", "tǝst/") - self.assertEqual(url, expected) - - url = slumber.url_join("http://example.com/", "tǝst/".decode('utf8').encode('utf8')) - self.assertEqual(url, expected) - - def test_url_join_decoded_unicode(self): - url = slumber.url_join("http://example.com/", "tǝst/".decode('utf8')) - expected = "http://example.com/tǝst/".decode('utf8') - self.assertEqual(url, expected) -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de