1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
import sys
import types
import os
def can_loop_over(maybe):
"""Test value to see if it is list like"""
try:
iter(maybe)
except:
return 0
else:
return 1
def is_list_or_tuple(maybe):
return isinstance(maybe, (types.TupleType, types.ListType))
def is_scalar(maybe):
"""Test to see value is a string, an int, or some other scalar type"""
return is_string_like(maybe) or not can_loop_over(maybe)
def is_string_like(maybe):
"""Test value to see if it acts like a string"""
try:
maybe+""
except TypeError:
return 0
else:
return 1
def flatten_list(sequence, scalarp=is_scalar, result=None):
"""flatten out a list by putting sublist entries in the main list"""
if result is None:
result = []
for item in sequence:
if scalarp(item):
result.append(item)
else:
flatten_list(item, scalarp, result)
def load_module(module):
"""Load a named python module."""
try:
module = sys.modules[module]
except KeyError:
__import__(module)
module = sys.modules[module]
return module
def get_flat_list(sequence):
"""flatten out a list and return the flat list"""
flat = []
flatten_list(sequence, result=flat)
return flat
def url_join(*args):
"""Join any arbitrary strings into a forward-slash delimited string.
Do not strip leading / from first element, nor trailing / from last element.
This function can take lists as arguments, flattening them appropriately.
example:
url_join('one','two',['three','four'],'five') => 'one/two/three/four/five'
"""
if len(args) == 0:
return ""
args = get_flat_list(args)
if len(args) == 1:
return str(args[0])
else:
args = [str(arg).replace("\\", "/") for arg in args]
work = [args[0]]
for arg in args[1:]:
if arg.startswith("/"):
work.append(arg[1:])
else:
work.append(arg)
joined = reduce(os.path.join, work)
return joined.replace("\\", "/")
|