Skip to content
This repository has been archived by the owner on Dec 31, 2021. It is now read-only.

Commit

Permalink
adicionada feature de post e put utilizando o próprio objeto para env…
Browse files Browse the repository at this point in the history
…iar os dados desse objeto
  • Loading branch information
nsigustavo committed Mar 23, 2015
1 parent 4f21e93 commit 7cc6efd
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 19 deletions.
32 changes: 22 additions & 10 deletions pluct/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ def init(self, url, data=None, schema=None, session=None):
self.schema = schema
self.session = session

self.parse_data()

def session_request_json(self, url):
return self.session.request(url).json()

Expand All @@ -40,7 +38,7 @@ def is_valid(self):

def rel(self, name, **kwargs):
link = self.schema.get_link(name)
method = link.get('method', 'get')
method = link.get('method', 'get').lower()
href = link.get('href', '')

params = kwargs.get('params', {})
Expand All @@ -51,12 +49,19 @@ def rel(self, name, **kwargs):

if not urlparse.urlparse(uri).netloc:
uri = urlparse.urljoin(self.url, uri)

if 'params' in kwargs:
unused_params = {
k: v for k, v in params.items() if k not in variables}
kwargs['params'] = unused_params

if "data" in kwargs and isinstance(kwargs.get("data"), Resource):
resource = kwargs.get("data")
kwargs["data"] = resource.data
schema_uri = resource.schema.url
headers = kwargs.get('headers', {})
headers.setdefault('content-type',
'application/json; profile=' + schema_uri)
kwargs['headers'] = headers
return self.session.resource(uri, method=method, **kwargs)

def has_rel(self, name):
Expand Down Expand Up @@ -96,15 +101,16 @@ def from_response(cls, response, session, schema):
schema=schema
)

def parse_data(self):
for key, value in self.iterate_items():
schema = self.item_schema(key)
self.data[key] = self.from_data(
self.url, data=value, schema=schema, session=self.session)

def resolve_pointer(self, *args, **kwargs):
return jsonpointer.resolve_pointer(self.data, *args, **kwargs)

def __getitem__(self, item):
schema = self.item_schema(item)
return self.from_data(self.url,
data=self.data[item],
schema=schema,
session=self.session)


class ObjectResource(datastructures.IterableUserDict, Resource, dict):

Expand All @@ -129,6 +135,9 @@ def __ne__(self, other):
def __eq__(self, other):
return self.data == other

def __getitem__(self, item):
return Resource.__getitem__(self, item)


class ArrayResource(datastructures.UserList, Resource, list):

Expand All @@ -146,3 +155,6 @@ def iterate_items(self):
def item_schema(self, key):
href = '#/{0}'.format(self.SCHEMA_PREFIX)
return Schema(href, raw_schema=self.schema, session=self.session)

def __getitem__(self, item):
return Resource.__getitem__(self, item)
3 changes: 1 addition & 2 deletions pluct/tests/test_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,7 @@ def test_wraps_array_objects_as_resources(self):
}
app = self.resource_from_data(
url="appurl.com", data=data, schema=self.schema)
item = app.data['objects'][0]

item = app['objects'][0]
self.assertIsInstance(item, ObjectResource)
self.assertEqual(item.data['id'], 111)
self.assertEqual(item.schema, self.item_schema)
Expand Down
25 changes: 18 additions & 7 deletions pluct/tests/test_resource_rel.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from unittest import TestCase
from mock import patch
from copy import deepcopy

from pluct.resource import Resource
from pluct.schema import Schema
Expand All @@ -24,21 +25,24 @@ def setUp(self):
{
'rel': 'create',
'href': '/root',
'method': 'post',
'method': 'POST',
},
{
'rel': 'list',
'href': '/root',
}
]
}
data = {'id': '123', 'slug': 'slug'}
self.data = {'id': '123',
'slug': 'slug',
'items': [{"ide": 1},
{"ida": 2}]}

self.session = Session()
self.schema = Schema('/schema', raw_schema, session=self.session)
self.resource = Resource.from_data(
'http://much.url.com/',
data=data, schema=self.schema, session=self.session
data=deepcopy(self.data), schema=self.schema, session=self.session
)

self.request_patcher = patch.object(self.session, 'request')
Expand All @@ -62,15 +66,22 @@ def test_has_rel_detects_unexistent_link(self):
self.assertFalse(self.resource.has_rel('foo_bar'))

def test_delegates_request_to_session(self):
self.resource.rel('create')
self.resource.rel('create', data=self.resource)
self.request.assert_called_with(
'http://much.url.com/root', method='post'
'http://much.url.com/root',
method='post',
data=self.data,
headers={'content-type': 'application/json; profile=/schema'}
)

def test_accepts_extra_parameters(self):
self.resource.rel('create', timeout=333)
self.resource.rel('create', data=self.resource, timeout=333)
self.request.assert_called_with(
'http://much.url.com/root', method='post', timeout=333
'http://much.url.com/root',
method='post',
data=self.data,
headers={'content-type': 'application/json; profile=/schema'},
timeout=333
)

def test_uses_get_as_default_verb(self):
Expand Down

0 comments on commit 7cc6efd

Please sign in to comment.