Skip to content

Commit

Permalink
++version (0.2.3)
Browse files Browse the repository at this point in the history
  • Loading branch information
uralbash committed Mar 15, 2015
1 parent f5f9a87 commit 04223c7
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 20 deletions.
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@
.project
.pydevproject
sacrud/.coverage
sacrud/TODO
sacrud/cover
TODO
TODO.txt
TODO.*
nohup.out
.cache
.webassets*
Expand Down
10 changes: 8 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
0.2.2 (215-03-??)
-----------------
0.2.3 (2015-03-15)
------------------

- Add attribute ``commit`` to ``create`` and ``update`` function.
- Write docs for m2o and m2o data.

0.2.2 (2015-03-09)
------------------

- New API!!!
- Add wrapper ``crud_sessionmaker`` for SQLAlchemy session.
Expand Down
15 changes: 15 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,21 @@ Look how easy it is to use:
CRUD(DBSession, Groups).delete(1)
**M2M and M2O data**

For adding multiple data for m2m or m2o use endinng `[]`, ex.:

.. code-block:: python
from .models import DBSession, Users
from sacrud.action import CRUD
CRUD(DBSession, Users).create(
{'name': 'Vasya', 'sex': 1,
'groups[]': ['["id", 1]', '["id", 2]']}
)
It support composit primary key.

**Wraps your SQLAlchemy session**

Expand Down
16 changes: 16 additions & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,22 @@ Look how easy it is to use:
CRUD(DBSession, Groups).delete(1)
**M2M and M2O data**

For adding multiple data for m2m or m2o use endinng `[]`, ex.:

.. code-block:: python
from .models import DBSession, Users
from sacrud.action import CRUD
CRUD(DBSession, Users).create(
{'name': 'Vasya', 'sex': 1,
'groups[]': ['["id", 1]', '["id", 2]']}
)
It support composit primary key.


**Wraps your SQLAlchemy session**

Expand Down
35 changes: 25 additions & 10 deletions sacrud/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,25 @@ def __init__(self, session, table, preprocessing=ObjPreprocessing,
self.commit = commit
self.preprocessing = preprocessing

def create(self, data):
def create(self, data, **kwargs):
"""
Creates a new object pretreated input data.
.. code-block:: python
DBSession.sacrud(Users).create({'name': 'Vasya', 'sex': 1})
For adding multiple data for m2m or m2o use endinng `[]`, ex.:
.. code-block:: python
DBSession.sacrud(Users).create(
{'name': 'Vasya', 'sex': 1,
'groups[]': ['["id", 1]', '["id", 2]']}
)
"""
obj = get_obj_by_request(self.session, self.table, data)
return self._add(obj, data)
return self._add(obj, data, **kwargs)

def read(self, *pk):
"""
Expand Down Expand Up @@ -76,7 +85,7 @@ def read(self, *pk):
return get_obj(self.session, self.table, pk)
return self.session.query(self.table)

def update(self, pk, data):
def update(self, pk, data, **kwargs):
"""
Updates the object by primary_key.
Expand All @@ -86,11 +95,14 @@ def update(self, pk, data):
DBSession.sacrud(Users).update('1', {'name': 'Petya'})
DBSession.sacrud(User2Groups).update({'user_id': 4, 'group_id': 2},
{'group_id': 1})
Default it run ``transaction.commit()``. If it is not necessary use
attribute ``commit=False``.
"""
obj = get_obj(self.session, self.table, pk)
return self._add(obj, data)
return self._add(obj, data, **kwargs)

def delete(self, pk):
def delete(self, pk, **kwargs):
"""
Delete the object by primary_key.
Expand All @@ -99,12 +111,15 @@ def delete(self, pk):
DBSession.sacrud(Users).delete(1)
DBSession.sacrud(Users).delete('1')
DBSession.sacrud(User2Groups).delete({'user_id': 4, 'group_id': 2})
Default it run ``transaction.commit()``. If it is not necessary use
attribute ``commit=False``.
"""
obj = get_obj(self.session, self.table, pk)
if self._delete(obj):
if self._delete(obj, **kwargs):
return {'pk': pk, 'name': obj.__repr__()}

def _add(self, obj, data):
def _add(self, obj, data, **kwargs):
""" Update the object directly.
.. code-block:: python
Expand All @@ -114,11 +129,11 @@ def _add(self, obj, data):
obj = self.preprocessing(obj=obj or self.table)\
.add(self.session, data, self.table)
self.session.add(obj)
if self.commit is True:
if kwargs.get('commit', self.commit) is True:
transaction.commit()
return obj

def _delete(self, obj):
def _delete(self, obj, **kwargs):
""" Delete the object directly.
.. code-block:: python
Expand All @@ -133,6 +148,6 @@ def _delete(self, obj):
"""
obj = self.preprocessing(obj=obj).delete()
self.session.delete(obj)
if self.commit is True:
if kwargs.get('commit', self.commit) is True:
transaction.commit()
return True
3 changes: 3 additions & 0 deletions sacrud/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,15 @@ def _add_item(self, table, *args, **kwargs):
return obj

def setUp(self):
self.session2 = orm.scoped_session(orm.sessionmaker())
self.session = orm.scoped_session(
orm.sessionmaker(extension=ZopeTransactionExtension(),
expire_on_commit=False))
engine = create_engine('sqlite:///:memory:')
self.session.remove()
self.session2.remove()
self.session.configure(bind=engine)
self.session2.configure(bind=engine)

# Create tables
User.metadata.create_all(engine)
Expand Down
56 changes: 52 additions & 4 deletions sacrud/tests/test_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,28 @@ def test_create_with_relation(self):
self.assertEqual([x.id for x in user.groups],
[group1.id, group3.id])

def test_create_no_commit(self):
self.request['name'] = 'foo'
group = CRUD(self.session, Groups).create(self.request, commit=False)
self.assertEqual(group.name, 'foo')
self.assertEqual(group.id, None)

transaction.commit()
db_group = self.session.query(Groups).get(group.id)
self.assertEqual(group.id, db_group.id)

def test_create_m2m(self):
self._add_item(Groups, name='foo')
self._add_item(Groups, name='bar')
self._add_item(Groups, name='baz')

self.request['name'] = 'foo'
self.request['fullname'] = 'foo'
self.request['password'] = 'foo'
self.request['groups[]'] = ['["id", 1]', '["id", 2]']
app = CRUD(self.session, User).create(self.request)
self.assertEqual([g.id for g in app.groups], [1, 2])


class UpdateTest(ActionTest):

Expand All @@ -182,7 +204,8 @@ def test_update_by_int_id(self):
user = self.session.query(User).get(user.id)

CRUD(self.session, User).update(user.id, data={'name': 'Petya'})
self.assertEqual(user.name, 'Petya')
db_user = self.session.query(User).get(user.id)
self.assertEqual(db_user.name, 'Petya')

def test_update_by_str_id(self):
user = self._add_item(User, 'Vasya', 'Pupkin', "123")
Expand Down Expand Up @@ -237,26 +260,39 @@ def test_update_profile(self):
self.assertEqual(profile.user.id, 2)
self.assertEqual(profile.salary, float(23))

def test_update_no_commit(self):
user = self._add_item(User, 'Vasya', 'Pupkin', "123")
user = self.session.query(User).get(user.id)

CRUD(self.session2, User).update(user.id, data={'name': 'Petya'})
db_user = self.session.query(User).get(user.id)
self.assertEqual(db_user.name, 'Vasya')

self.session2.commit()
self.session.close()
db_user = self.session.query(User).get(user.id)
self.assertEqual(db_user.name, 'Petya')


class DeleteTest(ActionTest):

def test_update_by_int_id(self):
def test_delete_by_int_id(self):
user = self._add_item(User, 'Vasya', 'Pupkin', "123")
user = self.session.query(User).get(user.id)

CRUD(self.session, User).delete(user.id)
user = self.session.query(User).filter_by(id=user.id).all()
self.assertEqual(user, [])

def test_update_by_str_id(self):
def test_delete_by_str_id(self):
user = self._add_item(User, 'Vasya', 'Pupkin', "123")
user = self.session.query(User).get(user.id)

CRUD(self.session, User).delete(str(user.id))
user = self.session.query(User).filter_by(id=user.id).all()
self.assertEqual(user, [])

def test_update_by_composit_pk(self):
def test_delete_by_composit_pk(self):
self._add_item(Groups2User, **{'group_id': 3, 'user_id': 2})

CRUD(self.session, Groups2User).delete({'group_id': 3, 'user_id': 2})
Expand Down Expand Up @@ -290,3 +326,15 @@ def test_delete_user(self):

# check file also deleted
self.assertEqual(glob.glob("%s/*.html" % (PHOTO_PATH, )), [])

def test_delete_no_commit(self):
user = self._add_item(User, 'Vasya', 'Pupkin', "123")
user = self.session.query(User).get(user.id)

CRUD(self.session2, User).delete(user.id, commit=False)
users = self.session.query(User).filter_by(id=user.id).all()
self.assertEqual(len(users), 1)

self.session2.commit()
user = self.session.query(User).filter_by(id=user.id).all()
self.assertEqual(len(user), 0)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def read(name):

setup(
name='sacrud',
version='0.2.2',
version='0.2.3',
url='http://github.com/ITCase/sacrud/',
author='Svintsov Dmitry',
author_email='root@uralbash.ru',
Expand Down

0 comments on commit 04223c7

Please sign in to comment.