impuls.tools.strings

impuls.tools.strings.camel_to_snake(camel: str) str

Converts camelCase or PascalCase to snake_case.

>>> camel_to_snake("Foo")
'foo'
>>> camel_to_snake("FooBar")
'foo_bar'
>>> camel_to_snake("fooBarBaz")
'foo_bar_baz'
impuls.tools.strings.find_non_conflicting_id(used: Container[str], id: str, separator: str = ':') str

Tries to find the lowest numeric suffix (joined with separator) to the id which generates a string not contained in used.

>>> find_non_conflicting_id({"A", "B"}, "C")
'C'
>>> find_non_conflicting_id({"A", "B"}, "A")
'A:1'
>>> find_non_conflicting_id({"A", "A/1", "A/2"}, "A", separator="/")
'A/3'
impuls.tools.strings.is_portable_name(name: str) bool

Checks if a name can be used as a filename - that is it only contains ASCII letters, digits, dot, hyphen or underscores, contains at least one character, and has no special meaning on certain systems (like “.”, “..” or “COM”)

impuls.tools.strings.ILLEGAL_PORTABLE_NAMES: frozenset[str] = frozenset({'.', '..', 'AUX', 'CLOCK$', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'CON', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9', 'NUL', 'PRN'})

Set of filenames which can’t be reliably used on some operating systems.

For example, “.” and “..” (dot and dot-dot) have special meaning in POSIX, while Windows has its own set of forbidden filenames.