File: //opt/alt/python27/lib/python2.7/site-packages/paste/exceptions/serial_number_generator.pyo
�
a�Nc           @   s�   d  Z  y d d l m Z Wn! e k
 r= d d l m Z n Xd Z e e � Z d �  Z e e d d e
 d � Z i d d 6d	 d
 6Z e
 d k r� d d l Z e j �  n  d S(
   s�   
Creates a human-readable identifier, using numbers and digits,
avoiding ambiguous numbers and letters.  hash_identifier can be used
to create compact representations that are unique for a certain string
(or concatenation of strings)
i����(   t   md5t   23456789abcdefghjkmnpqrtuvwxyzc         C   s�   t  |  t t f � s( t d |  � � n  |  d k  rG t d |  � � n  g  } x/ |  r~ |  t } | j t | � |  t }  qP Wd j | � S(   s,   
    Encodes a number as an identifier.
    s6   You can only make identifiers out of integers (not %r)i    s7   You cannot make identifiers out of negative numbers: %rt    (   t
   isinstancet   intt   longt
   ValueErrort   baset   appendt   good_characterst   join(   t   numbert   resultt   next(    (    sY   /opt/alt/python27/lib/python2.7/site-packages/paste/exceptions/serial_number_generator.pyt   make_identifier   s    
	
R   c         C   sW  t  | � s | j } n  | d k r@ | t k r@ t d | � n  t |  t � ra |  j d � }  n  | t |  � � } | j �  } t	 | }	 d }
 x, t
 | � D] } |
 d t | � |	 }
 q� Wt |
 � } | r� t
 d | t | � | } n  | r:g  }
 x* | r'|
 j d | | � | |  } q� Wd j |
 � } n  | rO| j �  } n  | | S(   s�  
    Hashes the string (with the given hashing module), then turns that
    hash into an identifier of the given length (using modulo to
    reduce the length of the identifier).  If ``pad`` is False, then
    the minimum-length identifier will be used; otherwise the
    identifier will be padded with 0's as necessary.
    ``prefix`` will be added last, and does not count towards the
    target length.  ``group`` will group the characters with ``-`` in
    the given lengths, and also does not count towards the target
    length.  E.g., ``group=4`` will cause a identifier like
    ``a5f3-hgk3-asdf``.  Grouping occurs before the prefix.
    i   sJ   md5 cannot create hashes longer than 26 characters in length (you gave %s)s   utf-8i    i   t   -(   t   callablet   newR    R   R   t   unicodet   encodet   strt   digestR   t   listt   ordR   R	   t   lent   insertR
   t   upper(   t   st   lengtht   padt   hashert   prefixt   groupR   t   ht   bin_hasht   moduloR   t   ct   identt   parts(    (    sY   /opt/alt/python27/lib/python2.7/site-packages/paste/exceptions/serial_number_generator.pyt   hash_identifier(   s4    
	s�  
    >>> make_identifier(0)
    ''
    >>> make_identifier(1000)
    'c53'
    >>> make_identifier(-100)
    Traceback (most recent call last):
        ...
    ValueError: You cannot make identifiers out of negative numbers: -100
    >>> make_identifier('test')
    Traceback (most recent call last):
        ...
    ValueError: You can only make identifiers out of integers (not 'test')
    >>> make_identifier(1000000000000)
    'c53x9rqh3'
    R   s'  
    >>> hash_identifier(0, 5)
    'cy2dr'
    >>> hash_identifier(0, 10)
    'cy2dr6rg46'
    >>> hash_identifier('this is a test of a long string', 5)
    'awatu'
    >>> hash_identifier(0, 26)
    'cy2dr6rg46cx8t4w2f3nfexzk4'
    >>> hash_identifier(0, 30)
    Traceback (most recent call last):
        ...
    ValueError: md5 cannot create hashes longer than 26 characters in length (you gave 30)
    >>> hash_identifier(0, 10, group=4)
    'cy-2dr6-rg46'
    >>> hash_identifier(0, 10, group=4, upper=True, prefix='M-')
    'M-CY-2DR6-RG46'
    R'