view roundup/anypy/random_.py @ 7698:4e37a7833708

doc: add FTS5 requirement for sqlite backend. Document the requirement for FTS5 if you are using the sqlite backend. Tonu Mikk reported issues with using a SQLite that was missing FTS5 support (RedHat 7 sqlite with python 3.6). Even though FTS5 has been in the sqlite amalgamation since 2015-10-14 (v3.9.0) RedHat chose to not build their package with that. This leads to a traceback when initializing the database.
author John Rouillard <rouilj@ieee.org>
date Sat, 11 Nov 2023 19:39:57 -0500
parents 07ce4e4110f5
children f002747b6773
line wrap: on
line source

try:
    from secrets import choice, randbelow, token_bytes

    def seed(v=None):
        pass

    is_weak = False
except ImportError:
    import os as _os
    import random as _random

    # prefer to use SystemRandom if it is available
    if hasattr(_random, 'SystemRandom'):
        def seed(v=None):
            pass

        _r = _random.SystemRandom()
        is_weak = False
    else:
        # don't completely throw away the existing state, but add some
        # more random state to the existing state
        def seed(v=None):
            import os
            import time
            _r.seed((_r.getstate(),
                     v,
                     hasattr(os, 'getpid') and os.getpid(),
                     time.time()))

        # create our own instance so we don't mess with the global
        # random number generator
        _r = _random.Random()
        seed()
        is_weak = True

    choice = _r.choice

    def randbelow(i):
        return _r.randint(0, i - 1)

    if hasattr(_os, 'urandom'):
        def token_bytes(l):
            return _os.urandom(l)
    else:
        def token_bytes(l):
            _bchr = chr if str == bytes else lambda x: bytes((x,))
            return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)])

Roundup Issue Tracker: http://roundup-tracker.org/