aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Firshman2010-01-25 00:05:00 +0000
committerBen Firshman2014-09-21 17:07:11 -0700
commiteb1e1c2feddb282c74dc597c4f51c5ccfe5c7fe1 (patch)
treeb454e1a703e55e06048231794d7222cfb436d79f
parentdd385d25d42bc16251c9e755b72500fec519b262 (diff)
downloaddjango-shorturls-eb1e1c2feddb282c74dc597c4f51c5ccfe5c7fe1.tar.bz2
Added Crockford's base32 converter
-rw-r--r--src/shorturls/baseconv.py30
-rw-r--r--src/shorturls/tests/test_baseconv.py17
2 files changed, 45 insertions, 2 deletions
diff --git a/src/shorturls/baseconv.py b/src/shorturls/baseconv.py
index 1e22ed1..1f1fbbd 100644
--- a/src/shorturls/baseconv.py
+++ b/src/shorturls/baseconv.py
@@ -14,6 +14,7 @@ Sample usage:
class BaseConverter(object):
decimal_digits = "0123456789"
+ decode_mapping = {}
def __init__(self, digits):
self.digits = digits
@@ -22,6 +23,14 @@ class BaseConverter(object):
return self.convert(i, self.decimal_digits, self.digits)
def to_decimal(self, s):
+ if self.decode_mapping:
+ new = ''
+ for digit in s:
+ if digit in self.decode_mapping:
+ new += self.decode_mapping[digit]
+ else:
+ new += digit
+ s = new
return int(self.convert(s, self.digits, self.decimal_digits))
def convert(number, fromdigits, todigits):
@@ -55,4 +64,23 @@ bin = BaseConverter('01')
hexconv = BaseConverter('0123456789ABCDEF')
base62 = BaseConverter(
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
-) \ No newline at end of file
+)
+
+class Base32Converter(BaseConverter):
+ """
+ http://www.crockford.com/wrmg/base32.html
+ """
+ decode_mapping = {
+ 'o': '0',
+ 'i': '1',
+ 'l': '1',
+ }
+
+ def __init__(self):
+ super(Base32Converter, self).__init__('0123456789abcdefghjkmnpqrstvwxyz')
+
+ def to_decimal(self, s):
+ return super(Base32Converter, self).to_decimal(s.lower())
+
+base32 = Base32Converter()
+
diff --git a/src/shorturls/tests/test_baseconv.py b/src/shorturls/tests/test_baseconv.py
index 5e203b7..24f944f 100644
--- a/src/shorturls/tests/test_baseconv.py
+++ b/src/shorturls/tests/test_baseconv.py
@@ -16,4 +16,19 @@ class BaseConvTests(unittest.TestCase):
self._test_converter(baseconv.hexconv)
def test_base62(self):
- self._test_converter(baseconv.base62) \ No newline at end of file
+ self._test_converter(baseconv.base62)
+
+ def test_base32(self):
+ self._test_converter(baseconv.base32)
+
+ def test_base32_mappings(self):
+ converter = baseconv.base32
+ self.assertEqual(
+ converter.from_decimal(converter.to_decimal('Fo9')),
+ 'f09'
+ )
+ self.assertEqual(
+ converter.from_decimal(converter.to_decimal('43FG5i2L')),
+ '43fg5121'
+ )
+