From f7e4a3fe7ddc8b64ed03e3485e0f4a5d41755c7f Mon Sep 17 00:00:00 2001 From: Nikola Kotur Date: Mon, 6 Jan 2014 17:14:39 +0100 Subject: [PATCH 01/30] Fix syntax errors in documentation. --- docs/basics.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/basics.rst b/docs/basics.rst index 83c862c..e6fcd66 100644 --- a/docs/basics.rst +++ b/docs/basics.rst @@ -999,7 +999,7 @@ schema, then the schema definition can be made more succinct using the @colander.instantiate() class friend(colander.TupleSchema): - rank = colander.SchemaNode(colander.Int(), + rank = colander.SchemaNode(colander.Int(), validator=colander.Range(0, 9999)) name = colander.SchemaNode(colander.String()) @@ -1008,7 +1008,7 @@ schema, then the schema definition can be made more succinct using the @colander.instantiate() class phone(colander.MappingSchema): - location = colander.SchemaNode(colander.String(), + location = colander.SchemaNode(colander.String(), validator=colander.OneOf(['home', 'work'])) number = colander.SchemaNode(colander.String()) @@ -1076,22 +1076,22 @@ We can imperatively construct a completely equivalent schema like so: import colander - friend = colander.SchemaNode(Tuple()) + friend = colander.SchemaNode(colander.Tuple()) friend.add(colander.SchemaNode(colander.Int(), validator=colander.Range(0, 9999), name='rank')) - friend.add(colander.SchemaNode(colander.String(), name='name') + friend.add(colander.SchemaNode(colander.String(), name='name')) - phone = colander.SchemaNode(Mapping()) + phone = colander.SchemaNode(colander.Mapping()) phone.add(colander.SchemaNode(colander.String(), validator=colander.OneOf(['home', 'work']), name='location')) phone.add(colander.SchemaNode(colander.String(), name='number')) - schema = colander.SchemaNode(Mapping()) + schema = colander.SchemaNode(colander.Mapping()) schema.add(colander.SchemaNode(colander.String(), name='name')) - schema.add(colander.SchemaNode(colander.Int(), name='age'), - validator=colander.Range(0, 200)) + schema.add(colander.SchemaNode(colander.Int(), name='age', + validator=colander.Range(0, 200))) schema.add(colander.SchemaNode(colander.Sequence(), friend, name='friends')) schema.add(colander.SchemaNode(colander.Sequence(), phone, name='phones')) @@ -1129,7 +1129,7 @@ For example, in a Python module, you might have code that looks like this: .. code-block:: python - from colander import MappingSchema + from colander import SchemaNode, MappingSchema from colander import Int class MySchema1(MappingSchema): From b5d6b8201dfeef41379e45637ba379915c915c55 Mon Sep 17 00:00:00 2001 From: Nikola Kotur Date: Tue, 7 Jan 2014 10:35:18 +0100 Subject: [PATCH 02/30] Documentation: correct subclassing SchemaNode examples. Fixes #149 and fixes #155. --- docs/basics.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/basics.rst b/docs/basics.rst index 83c862c..a7b978c 100644 --- a/docs/basics.rst +++ b/docs/basics.rst @@ -171,7 +171,7 @@ The imperative style that looks like this still works, of course: .. code-block:: python ranged_int = colander.SchemaNode( - typ=colander.Int(), + schema_type=colander.Int, validator=colander.Range(0, 10), default=10, title='Ranged Int' @@ -182,7 +182,7 @@ But in 1.0a1+, you can alternately now do something like this: .. code-block:: python class RangedInt(colander.SchemaNode): - typ = colander.Int() + schema_type = colander.Int validator = colander.Range(0, 10) default = 10 title = 'Ranged Int' @@ -195,7 +195,7 @@ the schemanode subclass instead of plain attributes: .. code-block:: python class RangedInt(colander.SchemaNode): - typ = colander.Int() + schema_type = colander.Int default = 10 title = 'Ranged Int' @@ -220,7 +220,7 @@ example this will *not* work: .. code-block:: python class RangedInt(colander.SchemaNode): - typ = colander.Int() + schema_type = colander.Int default = 10 title = 'Ranged Int' @@ -247,7 +247,7 @@ indeed work): .. code-block:: python class RangedInt(colander.SchemaNode): - typ = colander.Int() + schema_type = colander.Int default = 10 title = 'Ranged Int' @@ -271,7 +271,7 @@ the bind parameters within values that are plain old methods: .. code-block:: python class RangedInt(colander.SchemaNode): - typ = colander.Int() + schema_type = colander.Int default = 10 title = 'Ranged Int' @@ -292,7 +292,7 @@ attributes of the schemanode that rely on binding variables: .. code-block:: python class UserIdSchemaNode(colander.SchemaNode): - typ = colander.String() + schema_type = colander.String title = 'User Id' def after_bind(self, node, kw): @@ -304,7 +304,7 @@ constructor: .. code-block:: python class RangedInt(colander.SchemaNode): - typ = colander.Int() + schema_type = colander.Int default = 10 title = 'Ranged Int' validator = colander.Range(0, 10) @@ -999,7 +999,7 @@ schema, then the schema definition can be made more succinct using the @colander.instantiate() class friend(colander.TupleSchema): - rank = colander.SchemaNode(colander.Int(), + rank = colander.SchemaNode(colander.Int(), validator=colander.Range(0, 9999)) name = colander.SchemaNode(colander.String()) @@ -1008,7 +1008,7 @@ schema, then the schema definition can be made more succinct using the @colander.instantiate() class phone(colander.MappingSchema): - location = colander.SchemaNode(colander.String(), + location = colander.SchemaNode(colander.String(), validator=colander.OneOf(['home', 'work'])) number = colander.SchemaNode(colander.String()) From 30ef63522c79a3318735c1c815e8c02be9673eae Mon Sep 17 00:00:00 2001 From: Robert Buchholz Date: Mon, 2 Jun 2014 14:50:57 +0200 Subject: [PATCH 03/30] Update german translation --- colander/locale/de/LC_MESSAGES/colander.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/colander/locale/de/LC_MESSAGES/colander.po b/colander/locale/de/LC_MESSAGES/colander.po index b58eeca..b7663d1 100644 --- a/colander/locale/de/LC_MESSAGES/colander.po +++ b/colander/locale/de/LC_MESSAGES/colander.po @@ -31,11 +31,11 @@ msgstr "Ungültige E-Mail-Adresse" #: colander/__init__.py:315 msgid "${val} is less than minimum value ${min}" -msgstr "${val} ist kleiner als der erlaubter Mindestwert (${min})" +msgstr "${val} ist kleiner als der erlaubte Mindestwert (${min})" #: colander/__init__.py:316 msgid "${val} is greater than maximum value ${max}" -msgstr "${val} ist größer als der erlaubter Höchstwert (${max})" +msgstr "${val} ist größer als der erlaubte Höchstwert (${max})" #: colander/__init__.py:348 msgid "Shorter than minimum length ${min}" @@ -51,11 +51,11 @@ msgstr "\"${val}\" ist nicht in der Auswahl ${choices}" #: colander/__init__.py:377 msgid "One or more of the choices you made was not acceptable" -msgstr "" +msgstr "Mindestens eine Auswahl war nicht akzeptabel" #: colander/__init__.py:423 msgid "Must be a URL" -msgstr "" +msgstr "Muss eine URL sein" #: colander/__init__.py:519 msgid "\"${val}\" is not a mapping type: ${err}" @@ -99,7 +99,7 @@ msgstr "${val} ist keine Zeichenkette" #: colander/__init__.py:1279 msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" -msgstr "" +msgstr "\"${val}\" ist weder in (${false_choices}) noch in (${true_choices}) enthalten" #: colander/__init__.py:1339 colander/__init__.py:1356 #: colander/__init__.py:1366 From b72547afe0a416f0c9f54e16652bb6e598da994d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Messiant?= Date: Fri, 27 Jun 2014 11:50:57 +0200 Subject: [PATCH 04/30] Add myself to CONTRIBUTORS --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index e1ef2e0..7033902 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -116,3 +116,4 @@ Contributors - Veeti Paananen, 2013/08/20 - Michael Howitz, 2013/12/05 - Alex Marandon, 2013/12/21 +- Cédric Messiant, 2014/06/27 From a7bee85504aeef269c919d80e35f8fcf5ad96760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Messiant?= Date: Fri, 27 Jun 2014 11:51:21 +0200 Subject: [PATCH 05/30] Update French translations --- colander/locale/fr/LC_MESSAGES/colander.mo | Bin 3315 -> 3470 bytes colander/locale/fr/LC_MESSAGES/colander.po | 31 ++++++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/colander/locale/fr/LC_MESSAGES/colander.mo b/colander/locale/fr/LC_MESSAGES/colander.mo index 164708b425d5789cec54d596189519a82e545f3d..5f0ee9f1a4ac39f45e46310988e08b119a51fc2b 100644 GIT binary patch delta 936 zcmX}qOH30%7{KvaS}mouJXH|X!DlO!w6&Ii1QkIDK4K~+96YeniCI%xvR$|t5)URG zG{y~4FM9DHCp8TRPekCDbIj~{LK+ZQ&Pf{TK( zpV~ofF@#89w1ywbD;&qy*ouE}2zLgA*o%|ciSu{_AEO?(;`kAKV%r$2~$U zh;bSR8KAHW?_wO6aTjjjKKzMMY}v-**oivs#T__|I+45|JD4NBjkWj&58x{5M89D- z>x=02t&Tp-^2Zdu;1m||3h^MbyYV58;R;Hu4GVDy6L=Lbp+3Rqn8ddzantW_s1u@( zIEi{gH!#ln;tq{d_!3X!ChC(&MT9tx*HG{90qPTZiZNWqMtqO`xQ=bu$g$|_>_YY+ z&f_rVaS$J22G?<6fJT_FkK#FGX;?EjpmIQ}x3CN{EKOV>aq7Nd8{o zsd$O_q1a8Mp4#AdkZ;C&EF|J(&KvRWmaEZ^!#hq8%~ZW}U1HUHH4{dSDcxeAqxv-< zji6)AsOqoaCu1a=Oy!c9UYSn!XLDVtbShPM!K^sR3EM1Hil$Sx`{mhpO9k7SmKRl} zVwojJ4ooZE(KF+BxUo>)IO$G>Ds7X=QB_j**2K$YRj?eH?m5wub=N{itG`3fjPP7Z zmapGbj&wpO2nQ-*sh9Ckm}4IMsHu=%8tYR0sR(kjiHMXR91n3}WI|IkfDmJH>t aMMj#HoG#l;nJt$Ja@MR!bIv^${qPrDv4gDu delta 843 zcmXZaKWI}y9KiA4tBHw8{MXplTD9lDv}qenQqh{me-%+{Cym9$;n_Sfkj9c18V8}9 z;v$xZi%SGS3?e8Q?5G3>!KENh>LM;8F5)0`@OzhcaQ)oxa=p9X@7;reKmAMJx&x1d zwu`=#9e&P;{1w{6V zEXfdqQ6?_pFxIgbpWtqMgE9P!J@_3r;y=_IhJu|qiARW!Vi+s97wf1m_87qYL9?KBox@F~<;m}Hmp#IvZdf&1|-Ucn!zD>k`7B!yQ|$9M4+aS)f0JIiZ4gDZFf*D#Bdlr4`H zJclokJk6dI&oq6$xi!g1+)Q;2+2W5i6hsE-Bw!9?AJcdO<_-9v`8=BlHv1FgV?HJK zkv=+~-ZUz2-U#oY+f3-c+sudxv|e@fqve%9_z4_SL_>ip@ VY*#I|o7K{dQoE_jj`u$H;Xn10Z`S|- diff --git a/colander/locale/fr/LC_MESSAGES/colander.po b/colander/locale/fr/LC_MESSAGES/colander.po index e30f1c0..3cba97b 100644 --- a/colander/locale/fr/LC_MESSAGES/colander.po +++ b/colander/locale/fr/LC_MESSAGES/colander.po @@ -8,14 +8,15 @@ msgstr "" "Project-Id-Version: colander 0.8\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2013-05-19 13:15+0200\n" -"PO-Revision-Date: 2011-10-02 21:38+0100\n" -"Last-Translator: Bard Stéphane \n" +"PO-Revision-Date: 2014-06-27 11:46+0100\n" +"Last-Translator: Cédric Messiant \n" "Language-Team: fr \n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" +"X-Generator: Poedit 1.5.4\n" #: colander/__init__.py:233 msgid "Invalid value" @@ -23,11 +24,11 @@ msgstr "Valeur incorrecte" #: colander/__init__.py:270 msgid "String does not match expected pattern" -msgstr "La chaîne de caractères n'a pas vérifié le modèle attendu" +msgstr "La chaîne de caractères ne correspond pas au modèle attendu" #: colander/__init__.py:287 msgid "Invalid email address" -msgstr "Invalide adresse email" +msgstr "Adresse email invalide" #: colander/__init__.py:315 msgid "${val} is less than minimum value ${min}" @@ -39,7 +40,7 @@ msgstr "${val} est plus grand que la valeur maximum autorisée (${max})" #: colander/__init__.py:348 msgid "Shorter than minimum length ${min}" -msgstr "La longueur est inférieur à la taille minimum autorisée (${min})" +msgstr "La longueur est inférieure à la taille minimum autorisée (${min})" #: colander/__init__.py:354 msgid "Longer than maximum length ${max}" @@ -73,11 +74,10 @@ msgstr "\"${val}\" n'est pas itérable" #: colander/__init__.py:664 msgid "" -"\"${val}\" has an incorrect number of elements (expected ${exp}, was " -"${was})" +"\"${val}\" has an incorrect number of elements (expected ${exp}, was ${was})" msgstr "" -"\"${val}\" possède un nombre incorrecte d'éléments (attendu ${exp}, " -"trouvé ${was})" +"\"${val}\" possède un nombre incorrect d'éléments (attendu ${exp}, trouvé " +"${was})" #: colander/__init__.py:803 msgid "${cstruct} is not iterable" @@ -97,11 +97,12 @@ msgstr "\"${val}\" n'est pas un nombre" #: colander/__init__.py:1268 msgid "${val} is not a string" -msgstr "${val} n'est pas une chaîne de carctères" +msgstr "${val} n'est pas une chaîne de caractères" #: colander/__init__.py:1279 msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" -msgstr "\"${val}\" ne fait partie ni de (${false_choices}) ni de (${true_choices})" +msgstr "" +"\"${val}\" ne fait partie ni de (${false_choices}) ni de (${true_choices})" #: colander/__init__.py:1339 colander/__init__.py:1356 #: colander/__init__.py:1366 @@ -133,16 +134,14 @@ msgid "\"${val}\" is not a date object" msgstr "\"${val}\" n'est pas un objet date" #: colander/__init__.py:1610 -#, fuzzy #| msgid "Invalid date" msgid "Invalid time" -msgstr "Date invalide" +msgstr "Heure invalide" #: colander/__init__.py:1621 -#, fuzzy #| msgid "\"${val}\" is not a datetime object" msgid "\"${val}\" is not a time object" -msgstr "\"${val}\" n'est pas un objet datetime" +msgstr "\"${val}\" n'est pas un objet time" #: colander/__init__.py:1878 colander/__init__.py:1880 msgid "Required" From 4b0e85de7789395a1622a954fdc530dc04adae2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Fern=C3=A1ndez=20Casta=C3=B1o?= Date: Thu, 21 Aug 2014 11:49:25 +0200 Subject: [PATCH 06/30] Update basics.rst --- docs/basics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/basics.rst b/docs/basics.rst index 7c23e08..4e8bbcf 100644 --- a/docs/basics.rst +++ b/docs/basics.rst @@ -395,7 +395,7 @@ Earlier we defined a schema: Let's now use this schema to try to deserialize some concrete data structures. -Each of thse concrete data structures is called a :term:`cstruct`. +Each of these concrete data structures is called a :term:`cstruct`. "cstruct" is an abbreviation of "colander structure": you can think of a cstruct as a serialized representation of some application data. A "cstruct" is usually generated by the From 27b47cf23262fd9964bf9049ea06fc70f8d61d30 Mon Sep 17 00:00:00 2001 From: "OCHIAI, Gouji" Date: Fri, 22 Aug 2014 01:05:31 +0900 Subject: [PATCH 07/30] contributor's agreement. --- CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 7033902..fe72d82 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -117,3 +117,4 @@ Contributors - Michael Howitz, 2013/12/05 - Alex Marandon, 2013/12/21 - Cédric Messiant, 2014/06/27 +- Gouji Ochiai, 2014/08/21 From c2a8316680f7fa4f89af969b0052dac2f2e10056 Mon Sep 17 00:00:00 2001 From: "OCHIAI, Gouji" Date: Fri, 22 Aug 2014 01:28:51 +0900 Subject: [PATCH 08/30] add testcases --- colander/tests/test_colander.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py index 487eca1..4ff4939 100644 --- a/colander/tests/test_colander.py +++ b/colander/tests/test_colander.py @@ -2726,6 +2726,22 @@ class TestSchemaNodeSubclassing(unittest.TestCase): result = node.deserialize(colander.null) self.assertEqual(result, 10) + def test_subclass_uses_title(self): + import colander + class MyNode(colander.SchemaNode): + schema_type = colander.Int + title = 'some title' + node = MyNode(name='my') + self.assertEqual(node.title, 'some title') + + def test_subclass_title_overwritten_by_constructor(self): + import colander + class MyNode(colander.SchemaNode): + schema_type = colander.Int + title = 'some title' + node = MyNode(name='my', title='other title') + self.assertEqual(node.title, 'other title') + def test_subclass_value_overridden_by_constructor(self): import colander class MyNode(colander.SchemaNode): From 99e6f5e7ccfa7a03ceec43530fff5936c341c13a Mon Sep 17 00:00:00 2001 From: "OCHIAI, Gouji" Date: Fri, 22 Aug 2014 01:31:53 +0900 Subject: [PATCH 09/30] fixes over writing title --- colander/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/colander/__init__.py b/colander/__init__.py index 6f4185b..82eb96b 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -1815,7 +1815,7 @@ class _SchemaNode(object): missing_msg = _('Required') name = '' raw_title = _marker - title = '' + title = _marker description = '' widget = None after_bind = None @@ -1842,8 +1842,9 @@ class _SchemaNode(object): # bw compat forces us to manufacture a title if one is not supplied title = kw.get('title', _marker) if title is _marker: - name = kw.get('name', self.name) - kw['title'] = name.replace('_', ' ').title() + if self.title is _marker: + name = kw.get('name', self.name) + kw['title'] = name.replace('_', ' ').title() else: kw['raw_title'] = title From c5766396e220c111a6a399fc8be452bf76d8ba6a Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Thu, 21 Aug 2014 13:56:00 -0500 Subject: [PATCH 10/30] update changelog --- CHANGES.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 02b4949..fce58b7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,11 @@ Bug Fixes returning the ``drop`` instance instead of omitting the value. https://github.com/Pylons/colander/issues/139 +- Fix an issue where the ``SchemaNode.title`` was clobbered by the ``name`` + when defined as a class attribute. + See https://github.com/Pylons/colander/pull/183 and + https://github.com/Pylons/colander/pull/185 + Features ~~~~~~~~ From 9af19552ade20b9b36abde15804652e1c7f9dd72 Mon Sep 17 00:00:00 2001 From: Tim Tisdall Date: Wed, 10 Sep 2014 18:54:12 +0000 Subject: [PATCH 11/30] remove local iso8601 and use pypi version When running some tests on another project I stumbled upon a failed test that revealed a bug in colander's iso8601. If you try to deserialize "2014-09-09T15:15:57.516967" into a datetime object you get `datetime.datetime(2014, 9, 9, 15, 15, 57, 516966)` (notice the microseconds are off by 1). I traced it down to this: ``` groups["fraction"] = int(float("0.%s" % groups["fraction"]) * 1e6) ``` `int(float("0.%s" % "516967") * 1e6)` is equal to 516966 due to rounding. I was going to fix it, but iso8601 is a currently maintained project on pypi that has this issue (and possibly others) already fixed. So, it makes much more sense to offload everything back to that project. The only difference (besides the bug fixes) is following: `iso8601.Utc` => `iso8601.iso8601.Utc` `iso8601.FixedOffset` => `iso8601.iso8601.FixedOffset` --- colander/iso8601.py | 152 +-------------------------------- colander/tests/test_iso8601.py | 11 ++- setup.py | 2 +- 3 files changed, 11 insertions(+), 154 deletions(-) diff --git a/colander/iso8601.py b/colander/iso8601.py index 0dcd9a6..1d72fec 100644 --- a/colander/iso8601.py +++ b/colander/iso8601.py @@ -1,152 +1,4 @@ -""" -Copyright (c) 2007 Michael Twomey - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -ISO 8601 date time string parsing - -Basic usage: ->>> import iso8601 ->>> iso8601.parse_date("2007-01-25T12:00:00Z") -datetime.datetime(2007, 1, 25, 12, 0, tzinfo=) ->>> -""" - - -from datetime import datetime, timedelta, tzinfo -import re - -from .compat import string_types +import iso8601 +from iso8601.iso8601 import (parse_date, ParseError, Utc, FixedOffset, UTC, ZERO) __all__ = ["parse_date", "ParseError", "Utc", "FixedOffset"] - -# Adapted from http://delete.me.uk/2005/03/iso8601.html -ISO8601_REGEX = re.compile( - r"(?P[0-9]{4})(-(?P[0-9]{1,2})(-(?P[0-9]{1,2})" - r"((?P.)(?P[0-9]{2})(:(?P[0-9]{2})(:(?P[0-9]{2})(\.(?P[0-9]+))?)?)?" - r"(?PZ|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?" -) -TIMEZONE_REGEX = re.compile( - "(?P[+-])(?P[0-9]{2})(:?(?P[0-9]{2}))?") - -class ParseError(Exception): - """Raised when there is a problem parsing a date string""" - -# Yoinked from python docs -ZERO = timedelta(0) -class Utc(tzinfo): - """UTC - - """ - def utcoffset(self, dt): - return ZERO - - def tzname(self, dt): - return "UTC" - - def dst(self, dt): - return ZERO -UTC = Utc() - -class FixedOffset(tzinfo): - """Fixed offset in hours and minutes from UTC - - """ - def __init__(self, offset_hours, offset_minutes, name): - self.__offset = timedelta(hours=offset_hours, minutes=offset_minutes) - self.__name = name - - def __getinitargs__(self): - # tzinfo.__reduce__ returns the type as the factory: supply - # defaults here, rather than in __init__. - return 0, 0, 'unknown' - - def utcoffset(self, dt): - return self.__offset - - def tzname(self, dt): - return self.__name - - def dst(self, dt): - return ZERO - - def __repr__(self): - return "" % self.__name - -def parse_timezone(tzstring, default_timezone=UTC): - """Parses ISO 8601 time zone specs into tzinfo offsets - - """ - if tzstring == "Z": - return UTC - # This isn't strictly correct, but it's common to encounter dates without - # timezones so I'll assume the default (which defaults to UTC). - # Addresses issue 4. - if tzstring is None: - return default_timezone - m = TIMEZONE_REGEX.match(tzstring) - prefix = m.group('prefix') - hours = int(m.group('hours')) - minutes = m.group('minutes') - if minutes is None: - minutes = 0 - else: - minutes = int(minutes) - if prefix == "-": - hours = -hours - minutes = -minutes - return FixedOffset(hours, minutes, tzstring) - -def parse_date(datestring, default_timezone=UTC): - """Parses ISO 8601 dates into datetime objects - - The timezone is parsed from the date string. However it is quite common to - have dates without a timezone (not strictly correct). In this case the - default timezone specified in default_timezone is used. This is UTC by - default. - """ - if not isinstance(datestring, string_types): - raise ParseError("Expecting a string %r" % datestring) - m = ISO8601_REGEX.match(datestring) - if not m: - raise ParseError("Unable to parse date string %r" % datestring) - groups = m.groupdict() - tz = parse_timezone(groups["timezone"], default_timezone=default_timezone) - if (groups['year'] is None or - groups['month'] is None or - groups['day'] is None): - raise ParseError('Unable to parse date string %r' % datestring) - if groups["hour"] is None: - groups["hour"] = 0 - if groups["minute"] is None: - groups["minute"] = 0 - if groups["second"] is None: - groups["second"] = 0 - if groups["fraction"] is None: - groups["fraction"] = 0 - else: - groups["fraction"] = int(float("0.%s" % groups["fraction"]) * 1e6) - try: - return datetime( - int(groups["year"]), int(groups["month"]), int(groups["day"]), - int(groups["hour"]), int(groups["minute"]), int(groups["second"]), - int(groups["fraction"]), tz) - except ValueError as e: - raise ParseError(*e.args) diff --git a/colander/tests/test_iso8601.py b/colander/tests/test_iso8601.py index c579eee..45d4a2a 100644 --- a/colander/tests/test_iso8601.py +++ b/colander/tests/test_iso8601.py @@ -68,12 +68,17 @@ class Test_FixedOffset(unittest.TestCase): def test___repr__(self): inst = self._makeOne() result = inst.__repr__() - self.assertEqual(result, "") + self.assertEqual(result, "") class Test_parse_timezone(unittest.TestCase): def _callFUT(self, tzstring, **kw): - from ..iso8601 import parse_timezone - return parse_timezone(tzstring, **kw) + # mimic old parse_timezone() by returning a FixedOffset + from datetime import tzinfo + from ..iso8601 import (parse_date, FixedOffset) + if tzstring is None: + tzstring = '' + dt = parse_date("2006-10-11T00:14:33{}".format(tzstring), **kw) + return dt.tzinfo def test_default_Z(self): from ..iso8601 import UTC diff --git a/setup.py b/setup.py index 9a6c66c..1961c5a 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ except: README = '' CHANGES = '' -requires = ['translationstring'] +requires = ['translationstring', 'iso8601'] testing_extras = ['nose', 'coverage'] docs_extras = ['Sphinx'] From f1c682aa7bdf7fa87d606e9db240445f0b58c055 Mon Sep 17 00:00:00 2001 From: Tim Tisdall Date: Wed, 10 Sep 2014 18:54:53 +0000 Subject: [PATCH 12/30] remove license note about iso8601 --- LICENSE.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index c4a6ed2..5ced96e 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -39,6 +39,3 @@ License THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -This package uses code from the "pyiso8601" package by Michael Twomey, -licensed under the MIT license. See the source file named "iso8601.py" for -copyright information and license text. From 138e2f7b5452e9a7f93e9dd3f5688a31ed02ccc8 Mon Sep 17 00:00:00 2001 From: Tim Tisdall Date: Wed, 10 Sep 2014 18:56:58 +0000 Subject: [PATCH 13/30] documented changes; added name to contibutors --- CHANGES.txt | 5 +++++ CONTRIBUTORS.txt | 1 + 2 files changed, 6 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index fce58b7..da20d24 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,11 @@ Unreleased Bug Fixes ~~~~~~~~~ +- Removed forked iso8601 and change to dependency on pypi iso8601 + (due to float rounding bug on microsecond portion when parsing + iso8601 datetime string). Left an iso8601.py stub for backwards + compatibility. + - Time of "00:00" no longer gives ``colander.Invalid``. - Un-break wrapping of callable instances as ``colander.deferred``. diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index fe72d82..6c6130b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -118,3 +118,4 @@ Contributors - Alex Marandon, 2013/12/21 - Cédric Messiant, 2014/06/27 - Gouji Ochiai, 2014/08/21 +- Tim Tisdall, 2014/09/10 From 7f1a5e9c015e4e543ad4de13a44fbe1c53dcb220 Mon Sep 17 00:00:00 2001 From: Tim Tisdall Date: Wed, 10 Sep 2014 19:12:42 +0000 Subject: [PATCH 14/30] py26 compatibility --- colander/iso8601.py | 1 + colander/tests/test_iso8601.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/colander/iso8601.py b/colander/iso8601.py index 1d72fec..2f7deaa 100644 --- a/colander/iso8601.py +++ b/colander/iso8601.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import import iso8601 from iso8601.iso8601 import (parse_date, ParseError, Utc, FixedOffset, UTC, ZERO) diff --git a/colander/tests/test_iso8601.py b/colander/tests/test_iso8601.py index 45d4a2a..bd73ae2 100644 --- a/colander/tests/test_iso8601.py +++ b/colander/tests/test_iso8601.py @@ -77,7 +77,7 @@ class Test_parse_timezone(unittest.TestCase): from ..iso8601 import (parse_date, FixedOffset) if tzstring is None: tzstring = '' - dt = parse_date("2006-10-11T00:14:33{}".format(tzstring), **kw) + dt = parse_date("2006-10-11T00:14:33{0}".format(tzstring), **kw) return dt.tzinfo def test_default_Z(self): From b354a5b327f95f6ac24fd70d63b7c8d04590510b Mon Sep 17 00:00:00 2001 From: Tim Tisdall Date: Wed, 10 Sep 2014 19:28:03 +0000 Subject: [PATCH 15/30] change to please deform deform imports ISO8601_REGEX, so we should make that available too --- colander/iso8601.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/colander/iso8601.py b/colander/iso8601.py index 2f7deaa..f608c11 100644 --- a/colander/iso8601.py +++ b/colander/iso8601.py @@ -1,5 +1,5 @@ from __future__ import absolute_import import iso8601 -from iso8601.iso8601 import (parse_date, ParseError, Utc, FixedOffset, UTC, ZERO) +from iso8601.iso8601 import (parse_date, ParseError, Utc, FixedOffset, UTC, ZERO, ISO8601_REGEX) __all__ = ["parse_date", "ParseError", "Utc", "FixedOffset"] From b6ca0f9816b5759ac75eeedadc769d8ffd761273 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:03:43 -0500 Subject: [PATCH 16/30] Add explicit support (and tests) for Python 3.4 and PyPy3. --- CHANGES.txt | 5 +++++ setup.py | 3 ++- tox.ini | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index da20d24..efa4a6d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,11 @@ Unreleased ---------- +Platform +-------- + +- Addd explicit support for Python 3.4 and PyPy3. + Bug Fixes ~~~~~~~~~ diff --git a/setup.py b/setup.py index 1961c5a..5389131 100644 --- a/setup.py +++ b/setup.py @@ -43,12 +43,13 @@ setup(name='colander', classifiers=[ "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python", + "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ], diff --git a/tox.ini b/tox.ini index 69295a2..8963fe4 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] envlist = - py26,py27,py32,py33,pypy,cover,docs + py26,py27,py32,py33,py34,pypy,pypy3,cover,docs [testenv] commands = From 704f9b80113edc65648bb1d2413c91b7a431f841 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:04:05 -0500 Subject: [PATCH 17/30] No doctests present. --- tox.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/tox.ini b/tox.ini index 8963fe4..82daf13 100644 --- a/tox.ini +++ b/tox.ini @@ -20,6 +20,5 @@ basepython = python2.6 commands = sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html -# sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest deps = Sphinx From c3e2bf25d9a7655ae30c74a76b017eef591857c1 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:04:26 -0500 Subject: [PATCH 18/30] Require preserving 100% coverage. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 82daf13..4010935 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,7 @@ commands = basepython = python2.6 commands = - python setup.py nosetests --with-xunit --with-xcoverage + python setup.py nosetests --with-xunit --with-xcoverage --cover-min-percentage=100 deps = nosexcover From f2b23a7aca0e66272e1f6005340c4d0b5593d2bd Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:06:53 -0500 Subject: [PATCH 19/30] Add Travis CI integration. --- .travis.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..5a205b2 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +# Wire up travis +language: python + +env: + - TOXENV=py26 + - TOXENV=py27 + - TOXENV=py32 + - TOXENV=py33 + - TOXENV=py34 + - TOXENV=pypy + - TOXENV=pypy3 + - TOXENV=cover + +install: + - travis_retry pip install tox + +script: + - travis_retry tox + +notifications: + email: + - pyramid-checkins@lists.repoze.org From a787bce3de9430153c459c9cbba0639ff361e801 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:11:14 -0500 Subject: [PATCH 20/30] Nest into Github better. --- CHANGES.txt => CHANGES.rst | 0 README.txt => README.rst | 0 setup.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename CHANGES.txt => CHANGES.rst (100%) rename README.txt => README.rst (100%) diff --git a/CHANGES.txt b/CHANGES.rst similarity index 100% rename from CHANGES.txt rename to CHANGES.rst diff --git a/README.txt b/README.rst similarity index 100% rename from README.txt rename to README.rst diff --git a/setup.py b/setup.py index 5389131..4d47ea1 100644 --- a/setup.py +++ b/setup.py @@ -24,8 +24,8 @@ def read(fname): return fp.read() try: - README = read(os.path.join(here, 'README.txt')) - CHANGES = read(os.path.join(here, 'CHANGES.txt')) + README = read(os.path.join(here, 'README.rst')) + CHANGES = read(os.path.join(here, 'CHANGES.rst')) except: README = '' CHANGES = '' From 1fd406177dff69fcc62eb4076b2021273a5fa15a Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:12:11 -0500 Subject: [PATCH 21/30] Add Travis and RTD badges. --- README.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.rst b/README.rst index 215ba5d..91ae97c 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,15 @@ Colander ======== + +.. image:: https://travis-ci.org/Pylons/colander.svg?branch=master + :target: https://travis-ci.org/Pylons/colander + +.. image:: https://readthedocs.org/projects/pyramid/badge/?version=master + :target: http://docs.pylonsproject.org/projects/pyramid/en/master/ + :alt: Documentation Status + + An extensible package which can be used to: - deserialize and validate a data structure composed of strings, From 8b3e8cb637341976a91d1b823ee1520ded835d3f Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:16:27 -0500 Subject: [PATCH 22/30] Update list of supported Python versions. --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 91ae97c..ca7ab6f 100644 --- a/README.rst +++ b/README.rst @@ -18,7 +18,8 @@ An extensible package which can be used to: - serialize an arbitrary data structure to a data structure composed of strings, mappings, and lists. -It runs on Python 2.6, 2.7, 3.2, and 3.3. +It runs on Python 2.6, 2.7, 3.2, 3.3, and 3.4, and on current PyPy +and PyPy3 versions. Please see http://docs.pylonsproject.org/projects/colander/en/latest/ for further documentation. From 13de90275b7f341f318fbfdf7713e119d7b44b38 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 11:38:35 -0500 Subject: [PATCH 23/30] Note first contrib from @mcdonc, add myself at first commit. --- CONTRIBUTORS.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 6c6130b..466fc7b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -101,7 +101,8 @@ and agrees to the terms above in the section within this document entitled Contributors ------------ -- Chris McDonough, 2011/02/16 +- Chris McDonough, 2010/03/11 +- Tres Seaver, 2010/04/05 - Chris Withers, 2011/05/45 - Mathieu Le Marec - Pasquet (kiorky), 2011/07/11 - Atsushi Odagiri, 2012/02/04 From da3d16af40d8e4b52e79b8812fac57a100c517d7 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 12:09:16 -0500 Subject: [PATCH 24/30] Move changelog entry for new feature to correct section. --- CHANGES.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index efa4a6d..84f5230 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -41,6 +41,9 @@ Features - Allow localization of error messages returned by ``colander.Invalid.asdict`` by adding an optional ``translate`` callable argument. +- Add a ``missing_msg`` argument to ``SchemaNode`` that specifies the error + message to be used when the node is required and missing + 1.0b1 (2013-09-01) ------------------ @@ -96,9 +99,6 @@ Features - The ``typ`` of a ``SchemaNode`` can optionally be pased in as a keyword argument. See https://github.com/Pylons/colander/issues/90 -- Add a ``missing_msg`` argument to ``SchemaNode`` that specifies the error - message to be used when the node is required and missing - 1.0a5 (2013-05-31) ------------------ From 58f591d33de298ddf5fd7cc48c7d2509dceb41bf Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 12:56:31 -0500 Subject: [PATCH 25/30] Fix RTD badge. --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index ca7ab6f..dba9a81 100644 --- a/README.rst +++ b/README.rst @@ -5,8 +5,8 @@ Colander .. image:: https://travis-ci.org/Pylons/colander.svg?branch=master :target: https://travis-ci.org/Pylons/colander -.. image:: https://readthedocs.org/projects/pyramid/badge/?version=master - :target: http://docs.pylonsproject.org/projects/pyramid/en/master/ +.. image:: https://readthedocs.org/projects/colander/badge/?version=master + :target: http://docs.pylonsproject.org/projects/colander/en/master/ :alt: Documentation Status From a3fe918f4ebf9e477548e3a8c645001b1afae50c Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 12:57:26 -0500 Subject: [PATCH 26/30] Fix RTD badge HARDER. --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index dba9a81..ddc4d1a 100644 --- a/README.rst +++ b/README.rst @@ -6,7 +6,7 @@ Colander :target: https://travis-ci.org/Pylons/colander .. image:: https://readthedocs.org/projects/colander/badge/?version=master - :target: http://docs.pylonsproject.org/projects/colander/en/master/ + :target: http://docs.pylonsproject.org/projects/colander/en/latest/ :alt: Documentation Status From 852786e74a62eb4ca96fd36ed1f2a18763cd15f3 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 12:58:10 -0500 Subject: [PATCH 27/30] Fix RTD badge MOAR HARDER. --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ddc4d1a..71e181a 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Colander .. image:: https://travis-ci.org/Pylons/colander.svg?branch=master :target: https://travis-ci.org/Pylons/colander -.. image:: https://readthedocs.org/projects/colander/badge/?version=master +.. image:: https://readthedocs.org/projects/colander/badge/?version=latest :target: http://docs.pylonsproject.org/projects/colander/en/latest/ :alt: Documentation Status From 0e7a65623207fd3f762b66542525a6b06fac582f Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 13:19:17 -0500 Subject: [PATCH 28/30] Un-re-break RTD links after MM's RTD config. --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 71e181a..dba9a81 100644 --- a/README.rst +++ b/README.rst @@ -5,8 +5,8 @@ Colander .. image:: https://travis-ci.org/Pylons/colander.svg?branch=master :target: https://travis-ci.org/Pylons/colander -.. image:: https://readthedocs.org/projects/colander/badge/?version=latest - :target: http://docs.pylonsproject.org/projects/colander/en/latest/ +.. image:: https://readthedocs.org/projects/colander/badge/?version=master + :target: http://docs.pylonsproject.org/projects/colander/en/master/ :alt: Documentation Status From 6f78d66c89b7eb1e779d96af9e27c1c183ba8af5 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 14:06:51 -0500 Subject: [PATCH 29/30] Sync w/ 1.0 release. --- CHANGES.rst | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 84f5230..05afe56 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,12 +6,27 @@ Platform - Addd explicit support for Python 3.4 and PyPy3. +Features +~~~~~~~~ + +- Add `Any` validator which succeeds if at least one of its subvalidators + succeeded. + +- Allow localization of error messages returned by ``colander.Invalid.asdict`` + by adding an optional ``translate`` callable argument. + +- Add a ``missing_msg`` argument to ``SchemaNode`` that specifies the error + message to be used when the node is required and missing + +1.0 (2014-11-26) +---------------- + Bug Fixes ~~~~~~~~~ -- Removed forked iso8601 and change to dependency on pypi iso8601 +- Removed forked ``iso8601`` and change to dependency on PyPI ``iso8601`` (due to float rounding bug on microsecond portion when parsing - iso8601 datetime string). Left an iso8601.py stub for backwards + iso8601 datetime string). Left an ``iso8601.py`` stub for backwards compatibility. - Time of "00:00" no longer gives ``colander.Invalid``. @@ -32,17 +47,8 @@ Bug Fixes See https://github.com/Pylons/colander/pull/183 and https://github.com/Pylons/colander/pull/185 -Features -~~~~~~~~ +- Updated translations: ``fr``, ``de``, ``ja`` -- Add `Any` validator which succeeds if at least one of its subvalidators - succeeded. - -- Allow localization of error messages returned by ``colander.Invalid.asdict`` - by adding an optional ``translate`` callable argument. - -- Add a ``missing_msg`` argument to ``SchemaNode`` that specifies the error - message to be used when the node is required and missing 1.0b1 (2013-09-01) ------------------ From 4ad4b6a7441888ada83073734137eb571bfaf8cf Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 26 Nov 2014 14:07:01 -0500 Subject: [PATCH 30/30] Mark dev status. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4d47ea1..130f79f 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ testing_extras = ['nose', 'coverage'] docs_extras = ['Sphinx'] setup(name='colander', - version='1.0b1', + version='1.1dev', description=('A simple schema-based serialization and deserialization ' 'library'), long_description=README + '\n\n' + CHANGES,