-
Notifications
You must be signed in to change notification settings - Fork 1
/
marcout_common.py
135 lines (101 loc) · 4.08 KB
/
marcout_common.py
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
124
125
126
127
128
129
130
131
132
#!/usr/bin/python
import os.path
import errno
# =============================================================================
#
# ================== CONSTANTS ================================================
# =============================================================================
#
# ================== FUNCTIONS ================================================
def get_param_content(param):
'''This function accepts a string that is either a filepath or raw content.
If it is the form of a filepath, this attempts to read and return that
content; otherwise it treats the param as literal content.
OSErrors, EXCEPT the obvious discriminator errno.ENAMETOOLONG which is taken
to mean a raw file,
'''
content = None
filepath = None
contentfile = None
# distinguish between filepath and raw content
if os.path.isfile(param):
filepath = param
with open(filepath, 'r') as contentfile:
content = contentfile.read()
else:
content = param
return content
def truncate_msg(message, length):
retval = message
if retval and (len(retval) > length):
retval = retval[:length] + '...'
return retval
def prettyblock(structure, indentlevel=0):
'''Returns a pretty-formatted string representation of a simple
(not very nested or complicated) datastructure.
'''
retval = []
indent = ' ' * indentlevel
if isinstance(structure, (list, tuple)):
for item in structure:
line = indent + str(item)
retval.append(line.rstrip())
elif isinstance(structure, dict):
for key in sorted(list(structure.keys())):
line = indent + key + ': ' + str(structure[key])
retval.append(line.rstrip())
elif isinstance(structure, set):
for item in sorted(list(structure)):
line = indent + str(item)
retval.append(line.rstrip())
else:
retval.append(indent + str(structure).rstrip())
return '\n'.join(retval) + '\n'
def pretty_marc_field(marc_field, indentlevel=0):
'''Returns a pretty-formatted string representation
of a MARC field template or populated field
'''
retval = []
indent = ' ' * indentlevel
for key in ('tag', 'fixed', 'content', 'indicator_1', 'indicator_2'):
if key in marc_field:
line = indent + key + ': ' + str(marc_field[key])
retval.append(line.rstrip())
if 'subfields' in marc_field:
line = indent + 'subfields:'
retval.append(line)
for subfield in marc_field['subfields']:
line = (indent + ' ' + str(subfield))
retval.append(line)
if 'foreach' in marc_field:
line = indent + 'foreach:'
retval.append(line)
for item in ('itemsource', 'eachitem', 'prefix'):
if item in marc_field['foreach']:
line = (indent + ' ' + item + ': ' + str(marc_field['foreach'][item]))
retval.append(line)
if 'subfields' in marc_field['foreach']:
line = indent + ' ' + 'subfields:'
retval.append(line)
for subfield in marc_field['foreach']['subfields']:
line = (indent + ' ' + str(subfield))
retval.append(line)
for item in ('suffix', 'sortby'):
if item in marc_field['foreach']:
line = (indent + ' ' + item + ': ' + str(marc_field['foreach'][item]))
retval.append(line)
if 'terminator' in marc_field:
line = indent + 'terminator: ' + str(marc_field['terminator'])
retval.append(line)
return '\n'.join(retval) + '\n'
def prettyprint_marcout_engine(engine):
print_order = engine['parse_order']
for blockname in print_order:
if blockname in engine:
print(blockname)
if blockname == 'marc_field_templates':
for marc_field in engine['marc_field_templates']:
print(pretty_marc_field(marc_field, 1))
else:
print(prettyblock(engine[blockname], 1))
print()