7
from simplestreams import util
12
def tab2items(content):
14
# content-id product_name version_name img_name [key=value [key=value]]
15
# return a list with each item containing:
16
# (content_id, product_name, version_name, item_name, {data})
18
for line in content.splitlines():
19
fields = line.split('\t')
20
content_id, prodname, vername, itemname = fields[0:4]
24
for field in fields[4:]:
25
key, value = field.split("=")
27
kvdata[key] = int(value)
31
items.append((content_id, prodname, vername, itemname, kvdata,))
36
def items2content_trees(itemslist, exdata):
37
# input is a list with each item having:
38
# (content_id, product_name, version_name, item_name, {data})
40
for (content_id, prodname, vername, itemname, data) in itemslist:
41
if content_id not in ctrees:
42
ctrees[content_id] = {'content_id': content_id,
43
'format': 'products:1.0', 'products': {}}
44
ctrees[content_id].update(exdata)
46
ctree = ctrees[content_id]
47
if prodname not in ctree['products']:
48
ctree['products'][prodname] = {'versions': {}}
50
prodtree = ctree['products'][prodname]
51
if vername not in prodtree['versions']:
52
prodtree['versions'][vername] = {'items': {}}
54
vertree = prodtree['versions'][vername]
56
if itemname in vertree['items']:
57
raise ValueError("%s: already existed" %
58
str([content_id, prodname, vername, itemname]))
60
vertree['items'][itemname] = data
65
parser = argparse.ArgumentParser(
66
description="create content tree from tab data")
68
parser.add_argument("input", metavar='file',
69
help=('source tab delimited data'))
71
parser.add_argument("out_d", metavar='out_d',
72
help=('create content under output_dir'))
74
parser.add_argument('--sign', action='store_true', default=False,
75
help='sign all generated files')
77
args = parser.parse_args()
80
tabinput = sys.stdin.read()
82
with open(args.input, "r") as fp:
85
streamdir = "streams/v1"
87
items = tab2items(tabinput)
88
data = {'updated': util.timestamp(), 'datatype': 'image-downloads'}
89
trees = items2content_trees(items, data)
91
index = {"index": {}, 'format': 'index:1.0',
92
'updated': data['updated']}
94
to_write = [("%s/%s" % (streamdir, 'index.js'), index,)]
96
not_copied_up = ['content_id']
97
for content_id in trees:
98
util.condense_products(trees[content_id])
99
content = trees[content_id]
100
index['index'][content_id] = {
101
'path': "%s/%s.js" % (streamdir, content_id),
102
'products': content['products'].keys(),
104
for k in util.stringitems(content):
105
if k not in not_copied_up:
106
index['index'][content_id][k] = content[k]
108
to_write.append((index['index'][content_id]['path'], content,))
110
for (outfile, data) in to_write:
111
filef = os.path.join(args.out_d, outfile)
112
util.mkdir_p(os.path.dirname(filef))
113
with open(filef, "w") as fp:
114
sys.stderr.write("writing %s\n" % filef)
115
fp.write(json.dumps(data, indent=1) + "\n")
118
sys.stderr.write("signing %s\n" % filef)
119
toolutil.signjs_file(filef)
123
if __name__ == '__main__':