Skip to content

Commit

Permalink
simple hash function
Browse files Browse the repository at this point in the history
  • Loading branch information
joamag committed Jan 31, 2017
1 parent cd8dc1a commit 0674df7
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 7 deletions.
16 changes: 14 additions & 2 deletions src/budy/models/measurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ def from_omni(
force = False
):
from . import product

# tries to retrieve the various elements that are going to be used
# for the proper construction of the measurement from an omni
# sub product entity (as expected)
sub_product = sub_product or merchandise
parent = sub_product["product"]
object_id = sub_product["object_id"]
Expand Down Expand Up @@ -158,7 +162,7 @@ def from_omni(
# tries converts the value into an integer value, falling back
# to the absolute hash value of it in case there's an error
try: value = int(value)
except ValueError: value = cls._increment("measurement:value")
except ValueError: value = cls._hash(value)

# tries to retrieve a measurement that is considered to be equivalent
# to the one described by the associated subproduct in case it does
Expand Down Expand Up @@ -190,6 +194,14 @@ def from_omni(
measurement.taxes = base_price - merchandise.get("price", 0.0)
return measurement

@classmethod
def _hash(cls, value):
counter = 0
for index in range(len(value)):
value_i = appier.legacy.ord(value[index])
counter += value_i * pow(256, index)
return counter

def pre_delete(self):
base.BudyBase.pre_delete(self)
if not self.product: return
Expand Down Expand Up @@ -249,7 +261,7 @@ def duplicate_s(self):
def _fix_value_s(self):
cls = self.__class__
try: self.value = int(self.value)
except ValueError: self.value = cls._increment("measurement:value")
except ValueError: self.value = self._hash(self.value)
self.save()

def _fix_invalid_s(self):
Expand Down
25 changes: 20 additions & 5 deletions src/budy/test/measurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,29 @@ def test__fix_value_s(self):

self.assertEqual(measurement.product.id, product.id)
self.assertEqual(measurement.name, "measurement")
self.assertEqual(measurement.value, 1)
self.assertEqual(measurement.value, 97)
self.assertEqual(measurement.value_s, "2")

measurement.value = "b"
measurement._fix_value_s()

self.assertEqual(measurement.product.id, product.id)
self.assertEqual(measurement.name, "measurement")
self.assertEqual(measurement.value, 98)
self.assertEqual(measurement.value_s, "2")

for _index in range(10):
measurement.value = "a"
measurement._fix_value_s()
measurement.value = "abc"
measurement._fix_value_s()

self.assertEqual(measurement.product.id, product.id)
self.assertEqual(measurement.name, "measurement")
self.assertEqual(measurement.value, 6513249)
self.assertEqual(measurement.value_s, "2")

measurement.value = "abcabcabcabcabc"
measurement._fix_value_s()

self.assertEqual(measurement.product.id, product.id)
self.assertEqual(measurement.name, "measurement")
self.assertEqual(measurement.value, 11)
self.assertEqual(measurement.value, 516032781025820288067766219337589345)
self.assertEqual(measurement.value_s, "2")

0 comments on commit 0674df7

Please sign in to comment.