Simple escaping of text, given a set of safe characters and an escape character.
Not much to it. Two functions:
escaped = escapism.escape('string to escape')
# 'string_20to_20escape'
original = escapism.unescape(escaped)There are two optional arguments you can pass to escape():
safe: a string or set of characters that don't need escaping. Default: ascii letters and numbers.escape_char: a single character used for escaping. Default:_.escape_charwill never be considered a safe value.
unescape() accepts the same escape_char argument as escape() if a value other than the default is used.
import string
import escapism
safe = string.ascii_letters + string.digits + '@_-.+'
escape_char = r'%'
escaped = escapism.escape('foø-bar@%!xX?', safe=safe, escape_char=escape_char)
# 'fo%C3%B8-bar@%25%21xX%3F'
original = escapism.unescape(escaped, escape_char=escape_char)escapism 1.1 adds a safe_slug API (extracted from kubespawner 7).
When to use safe_slug instead of escape:
- you don't need to recover the original string (
safe_slugis lossy), but you do need: - length requirements
- start/end rules
- arbitrary other validity requirements
- uniqueness
safe_slug takes an is_valid callable,
which you can use to specify whether a key passes a validity check.
If it passes, the string is returned unmodified.
The default is_valid callable applies a strict subset of various kubernetes rules,
so it will always return a unique string that is valid in just about any kubernetes field (object name, label values, etc.)
- min length of 1
- max length of 63
- contains only lowercase ascii letters, numbers, and '-'
- starts with a letter
- ends with a letter or number
If the input string does not pass the is_valid check,
it is stripped and hashed to ensure validity and uniqueness.
This does:
- cast to lowercase
- strip all non-alphanumeric characters
- if it doesn't start with a letter, prefix with
x- - truncate the safe subset
- append a hash of the original name, utf8-encoded, after
---
Examples:
safe_slug("valid-slug") # "valid-slug"
safe_slug("4start") # "x-4start---3a570dbd"
safe_slug("a" * 64, max_length=20) # "aaaaaaaaa---ffe054fe"
safe_slug("üñîçø∂é") # "x---4072f5a6"Note: the 'safe' result is not customizable,
which means that safe_slug can only be used if this trim-and-hash result is valid in your scheme.