68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
![]() |
# Copyright 2012 OpenStack Foundation
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||
|
# not use this file except in compliance with the License. You may obtain
|
||
|
# a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
# License for the specific language governing permissions and limitations
|
||
|
# under the License.
|
||
|
|
||
|
import os
|
||
|
import re
|
||
|
|
||
|
|
||
|
class HookableMixin(object):
|
||
|
"""Mixin so classes can register and run hooks."""
|
||
|
_hooks_map = {}
|
||
|
|
||
|
@classmethod
|
||
|
def add_hook(cls, hook_type, hook_func):
|
||
|
if hook_type not in cls._hooks_map:
|
||
|
cls._hooks_map[hook_type] = []
|
||
|
|
||
|
cls._hooks_map[hook_type].append(hook_func)
|
||
|
|
||
|
@classmethod
|
||
|
def run_hooks(cls, hook_type, *args, **kwargs):
|
||
|
hook_funcs = cls._hooks_map.get(hook_type) or []
|
||
|
for hook_func in hook_funcs:
|
||
|
hook_func(*args, **kwargs)
|
||
|
|
||
|
|
||
|
def env(*vars, **kwargs):
|
||
|
"""
|
||
|
returns the first environment variable set
|
||
|
if none are non-empty, defaults to '' or keyword arg default
|
||
|
"""
|
||
|
for v in vars:
|
||
|
value = os.environ.get(v, None)
|
||
|
if value:
|
||
|
return value
|
||
|
return kwargs.get('default', '')
|
||
|
|
||
|
|
||
|
_slugify_strip_re = re.compile(r'[^\w\s-]')
|
||
|
_slugify_hyphenate_re = re.compile(r'[-\s]+')
|
||
|
|
||
|
|
||
|
# http://code.activestate.com/recipes/
|
||
|
# 577257-slugify-make-a-string-usable-in-a-url-or-filename/
|
||
|
def slugify(value):
|
||
|
"""
|
||
|
Normalizes string, converts to lowercase, removes non-alpha characters,
|
||
|
and converts spaces to hyphens.
|
||
|
|
||
|
From Django's "django/template/defaultfilters.py".
|
||
|
"""
|
||
|
import unicodedata
|
||
|
if not isinstance(value, unicode):
|
||
|
value = unicode(value)
|
||
|
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
|
||
|
value = unicode(_slugify_strip_re.sub('', value).strip().lower())
|
||
|
return _slugify_hyphenate_re.sub('-', value)
|