diff options
Diffstat (limited to 'third_party/python/slugid/slugid/slugid.py')
-rw-r--r-- | third_party/python/slugid/slugid/slugid.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/third_party/python/slugid/slugid/slugid.py b/third_party/python/slugid/slugid/slugid.py new file mode 100644 index 0000000000..2a1377c84b --- /dev/null +++ b/third_party/python/slugid/slugid/slugid.py @@ -0,0 +1,48 @@ +# Licensed under the Mozilla Public Licence 2.0. +# https://www.mozilla.org/en-US/MPL/2.0 + +import sys +import uuid +import base64 + + +def encode(uuid_): + """ + Returns the given uuid.UUID object as a 22 character slug. This can be a + regular v4 slug or a "nice" slug. + """ + return base64.urlsafe_b64encode(uuid_.bytes)[:-2] # Drop '==' padding + + +def decode(slug): + """ + Returns the uuid.UUID object represented by the given v4 or "nice" slug + """ + if sys.version_info.major != 2 and isinstance(slug, bytes): + slug = slug.decode('ascii') + slug = slug + '==' # base64 padding + return uuid.UUID(bytes=base64.urlsafe_b64decode(slug)) + + +def v4(): + """ + Returns a randomly generated uuid v4 compliant slug + """ + return base64.urlsafe_b64encode(uuid.uuid4().bytes)[:-2] # Drop '==' padding + + +def nice(): + """ + Returns a randomly generated uuid v4 compliant slug which conforms to a set + of "nice" properties, at the cost of some entropy. Currently this means one + extra fixed bit (the first bit of the uuid is set to 0) which guarantees the + slug will begin with [A-Za-f]. For example such slugs don't require special + handling when used as command line parameters (whereas non-nice slugs may + start with `-` which can confuse command line tools). + + Potentially other "nice" properties may be added in future to further + restrict the range of potential uuids that may be generated. + """ + rawBytes = bytearray(uuid.uuid4().bytes) + rawBytes[0] = rawBytes[0] & 0x7f # Ensure slug starts with [A-Za-f] + return base64.urlsafe_b64encode(rawBytes)[:-2] # Drop '==' padding |