/usr/share/pyshared/dap/lib.py is in python-dap 2.2.6.7-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | from __future__ import division
"""Basic functions concerning the DAP.
These functions are mostly related to encoding data according to the DAP.
"""
from urllib import quote as _quote
__author__ = 'Roberto De Almeida <rob@pydap.org>'
__version__ = (2,2,6,7) # module version
__dap__ = (2,0) # protocol version
# Constants that used to live in __init__.py but had to be moved
# because we share the namespace with plugins and responses.
USER_AGENT = 'pydap/%s' % '.'.join([str(_) for _ in __version__])
INDENT = ' ' * 4
VERBOSE = False
CACHE = None
TIMEOUT = None
PROXY = None
def isiterable(o):
"""Tests if an object is iterable.
>>> print isiterable(range(10))
True
>>> print isiterable({})
True
>>> def a():
... for i in range(10): yield i
>>> print isiterable(a())
True
>>> print isiterable('string')
False
>>> print isiterable(1)
False
"""
# We DON'T want to iterate over strings.
if isinstance(o, basestring): return False
try:
iter(o)
return True
except TypeError:
return False
def to_list(L):
if hasattr(L, 'tolist'): return L.tolist() # shortcut for numpy arrays
elif isiterable(L): return [to_list(item) for item in L]
else: return L
def quote(name):
"""Extended quote for the DAP spec.
The period MUST be escaped in names (DAP spec, item 5.1):
>>> quote("White space")
'White%20space'
>>> _quote("Period.")
'Period.'
>>> quote("Period.")
'Period%2E'
"""
return _quote(name).replace('.', '%2E')
def encode_atom(atom):
r"""Atomic types encoding.
Encoding atomic types for the DAS. Integers should be printed using the
base 10 ASCII representation of its value:
>>> encode_atom(42)
'42'
Floating point values are printed using the base 10 ASCII
representation of its value, conforming to ANSI C's description of
printf using the %g format and precision 6.
>>> encode_atom(1/3)
'0.333333'
String and URLs are printed in ASCII, escaped according to escape().
>>> encode_atom('This is a "string".')
'"This is a \\"string\\"."'
"""
return {basestring: lambda s: escape(s),
unicode : lambda s: escape(s),
str : lambda s: escape(s),
float : lambda f: '%.6g' % f,
long : lambda f: '%.6g' % f,
int : lambda i: repr(i),
}.get(type(atom), lambda obj: '%s' % obj)(atom)
def escape(s):
r"""Escape a string.
Enclose strings with double quotes, escape double quotes and backslashes:
>>> escape('String')
'"String"'
>>> escape('This is a "test".')
'"This is a \\"test\\"."'
"""
s = s.replace(r'\\', r'\\\\')
s = s.replace(r'"', r'\"')
s = '"%s"' % s
return s
def _test():
import doctest
doctest.testmod()
if __name__ == "__main__":
_test()
|