Skip to content

Commit

Permalink
Fix list-value coercion regression.
Browse files Browse the repository at this point in the history
Fixes #2070
Refs #2046
  • Loading branch information
coleifer committed Dec 4, 2019
1 parent d140783 commit 5af60fd
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
2 changes: 1 addition & 1 deletion peewee.py
Original file line number Diff line number Diff line change
Expand Up @@ -4452,7 +4452,7 @@ def python_value(self, value):
return value if value is None else self.adapt(value)

def to_value(self, value):
return Value(value, self.db_value, self.unpack)
return Value(value, self.db_value, unpack=False)

def get_sort_key(self, ctx):
return self._sort_key
Expand Down
3 changes: 0 additions & 3 deletions playhouse/postgres_ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ def __init__(self, *args, **kwargs):

class ArrayField(IndexedFieldMixin, Field):
passthrough = True
unpack = False

def __init__(self, field_class=IntegerField, field_kwargs=None,
dimensions=1, convert_values=False, *args, **kwargs):
Expand Down Expand Up @@ -238,7 +237,6 @@ class DateTimeTZField(DateTimeField):

class HStoreField(IndexedFieldMixin, Field):
field_type = 'HSTORE'
unpack = False
__hash__ = Field.__hash__

def __getitem__(self, key):
Expand Down Expand Up @@ -284,7 +282,6 @@ def contains_any(self, *keys):

class JSONField(Field):
field_type = 'JSON'
unpack = False
_json_datatype = 'json'

def __init__(self, dumps=None, *args, **kwargs):
Expand Down
41 changes: 41 additions & 0 deletions tests/regressions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import datetime
import json

from peewee import *
from playhouse.hybrid import *
Expand Down Expand Up @@ -1067,3 +1068,43 @@ def assertQ(q):
.filter(page__site__url='s1')
.order_by(PageItem.content))
assertQ(q)


class JsonField(TextField):
def db_value(self, value):
return json.dumps(value) if value is not None else None
def python_value(self, value):
if value is not None:
return json.loads(value)

class JM(TestModel):
key = TextField()
data = JsonField()


class TestListValueConversion(ModelTestCase):
requires = [JM]

def test_list_value_conversion(self):
jm = JM.create(key='k1', data=['i0', 'i1'])
jm.key = 'k1-x'
jm.save()

jm_db = JM.get(JM.key == 'k1-x')
self.assertEqual(jm_db.data, ['i0', 'i1'])

JM.update(data=['i1', 'i2']).execute()
jm_db = JM.get(JM.key == 'k1-x')
self.assertEqual(jm_db.data, ['i1', 'i2'])

jm2 = JM.create(key='k2', data=['i3', 'i4'])

jm_db.data = ['i1', 'i2', 'i3']
jm2.data = ['i4', 'i5']

JM.bulk_update([jm_db, jm2], fields=[JM.key, JM.data])

jm = JM.get(JM.key == 'k1-x')
self.assertEqual(jm.data, ['i1', 'i2', 'i3'])
jm2 = JM.get(JM.key == 'k2')
self.assertEqual(jm2.data, ['i4', 'i5'])

0 comments on commit 5af60fd

Please sign in to comment.