diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/shorturls/baseconv.py | 30 | ||||
| -rw-r--r-- | src/shorturls/tests/test_baseconv.py | 17 | 
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' +        ) +     | 
