Skip to content

Commit

Permalink
Merge pull request #87 from alfred82santa/feature/new-version-0.8.0
Browse files Browse the repository at this point in the history
Feature/new version 0.8.0
  • Loading branch information
alfred82santa committed Sep 27, 2016
2 parents dd92c59 + 9dd134e commit 6c69191
Show file tree
Hide file tree
Showing 12 changed files with 1,158 additions and 358 deletions.
3 changes: 2 additions & 1 deletion .coveragerc
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
[report]
show_missing = True
omit =
*/tests/*
*/site-packages/*

exclude_lines =
pragma: no cover
def __repr__
Expand Down
61 changes: 38 additions & 23 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@
:target: https://pypi.python.org/pypi/dirty-models/
:alt: Supported Python implementations

.. _Dirty Models Sphinx extension: http://dirty-models-sphinx-extension.readthedocs.io

============
dirty-models
Dirty Models
============

Dirty models for python 3
Expand Down Expand Up @@ -75,14 +76,28 @@ Features
- Pickable models.
- Datetime fields can use any datetime format using parser and formatter functions.
- No database dependent.
- Auto documentation using https://github.com/alfred82santa/dirty-models-sphinx
- Auto documentation using `Dirty Models Sphinx extension`_.
- Json encoder.
- Field access like dictionary but with wildcards.
- Opensource (BSD License)

---------
Changelog
---------

Version 0.8.0
-------------

- Renamed internal fields. Now they use double score format ``__fieldname__``.
- Raise a RunTimeError exception if two fields use same alias in a model.
- Fixed default docstrings.
- Cleanup default data. Only real name fields are allowed to use as key.
- Added :meth:`~dirty_models.models.get_attrs_by_path` in order to get all values using path.
- Added :meth:`~dirty_models.models.get_1st_attr_by_path` in order to get first value using path.
- Added option to access fields like in a dictionary, but using wildcards. Only for getters.
See: :meth:`~dirty_models.models.get_1st_attr_by_path`.
- Added some documentation.

Version 0.7.2
-------------

Expand Down Expand Up @@ -131,34 +146,34 @@ Version 0.6.2

- Improved datetime fields parser and formatter definitions. Now there are three ways to define them:

* Format string to use both parse and formatter:
* Format string to use both parse and formatter:

.. code-block:: python
.. code-block:: python
class ExampleModel(BaseModel):
datetime_field = DateTimeField(parse_format='%Y-%m-%dT%H:%M:%SZ')
class ExampleModel(BaseModel):
datetime_field = DateTimeField(parse_format='%Y-%m-%dT%H:%M:%SZ')
* Define a format string or function for parse and format datetime:
* Define a format string or function for parse and format datetime:

.. code-block:: python
.. code-block:: python
class ExampleModel(BaseModel):
datetime_field = DateTimeField(parse_format={'parser': callable_func,
'formatter': '%Y-%m-%dT%H:%M:%SZ'})
class ExampleModel(BaseModel):
datetime_field = DateTimeField(parse_format={'parser': callable_func,
'formatter': '%Y-%m-%dT%H:%M:%SZ'})
* Use predefined format:
* Use predefined format:

.. code-block:: python
.. code-block:: python
DateTimeField.date_parsers = {
'iso8061': {
'formatter': '%Y-%m-%dT%H:%M:%SZ',
'parser': iso8601.parse_date
}
DateTimeField.date_parsers = {
'iso8061': {
'formatter': '%Y-%m-%dT%H:%M:%SZ',
'parser': iso8601.parse_date
}
class ExampleModel(BaseModel):
datetime_field = DateTimeField(parse_format='iso8061')
}
class ExampleModel(BaseModel):
datetime_field = DateTimeField(parse_format='iso8061')
Version 0.6.1
Expand Down Expand Up @@ -191,7 +206,7 @@ Version 0.6.0
.. code-block:: python
class InheritExampleModel(ExampleModel):
_default_data = {'integer_field': 2}
__default_data__ = {'integer_field': 2}
model = InheritExampleModel()
assert model.integer_field is 2
Expand Down Expand Up @@ -281,8 +296,8 @@ Basic usage
assert fb.alias_field is 3
assert fb.alias1 is fb.alias_field
assert fb.alias2 is fb.alias_field
assert fb['alias_field'] is 3
.. note::

Look at tests for more examples
More examples and documentation on http://dirty-models.readthedocs.io/
28 changes: 14 additions & 14 deletions dirty_models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,58 +13,58 @@ class BaseData:

__slots__ = []

_locked = None
_read_only = None
_parent = None
__locked__ = None
__read_only__ = None
__parent__ = None

def __init__(self, *args, **kwargs):
self._locked = True
self._read_only = False
self._parent = None
self.__locked__ = True
self.__read_only__ = False
self.__parent__ = None

def get_read_only(self):
"""
Returns whether model could be modified or not
"""
return self._read_only
return self.__read_only__

def set_read_only(self, value):
"""
Sets whether model could be modified or not
"""
if self._read_only != value:
self._read_only = value
if self.__read_only__ != value:
self.__read_only__ = value
self._update_read_only()

def get_parent(self):
"""
Returns parent model
"""
return self._parent() if self._parent else None
return self.__parent__() if self.__parent__ else None

def set_parent(self, value):
"""
Sets parent model
"""
self._parent = weakref.ref(value)
self.__parent__ = weakref.ref(value)

def unlock(self):
"""
Unlock model to be able to write even it's read only
"""
self._locked = False
self.__locked__ = False

def lock(self):
"""
Lock model to avoid modification on read only fields
"""
self._locked = True
self.__locked__ = True

def is_locked(self):
"""
Returns whether model is locked
"""
if not self._locked:
if not self.__locked__:
return False
elif self.get_parent():
return self.get_parent().is_locked()
Expand Down

0 comments on commit 6c69191

Please sign in to comment.