~ubuntu-branches/ubuntu/vivid/simplestreams/vivid-updates

« back to all changes in this revision

Viewing changes to tools/tab2streams

  • Committer: Package Import Robot
  • Author(s): Scott Moser
  • Date: 2013-03-26 01:10:01 UTC
  • Revision ID: package-import@ubuntu.com-20130326011001-342bcgb65worw4r8
Tags: upstream-0.1.0~bzr191
ImportĀ upstreamĀ versionĀ 0.1.0~bzr191

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
import argparse
 
4
import json
 
5
import os
 
6
import sys
 
7
from simplestreams import util
 
8
 
 
9
import toolutil
 
10
 
 
11
 
 
12
def tab2items(content):
 
13
    # tab content is
 
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})
 
17
    items = []
 
18
    for line in content.splitlines():
 
19
        fields = line.split('\t')
 
20
        content_id, prodname, vername, itemname = fields[0:4]
 
21
 
 
22
        kvdata = {}
 
23
        if len(fields) > 4:
 
24
            for field in fields[4:]:
 
25
                key, value = field.split("=")
 
26
                if key == "size":
 
27
                    kvdata[key] = int(value)
 
28
                else:
 
29
                    kvdata[key] = value
 
30
 
 
31
        items.append((content_id, prodname, vername, itemname, kvdata,))
 
32
 
 
33
    return items
 
34
 
 
35
 
 
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})
 
39
    ctrees = {}
 
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)
 
45
 
 
46
        ctree = ctrees[content_id]
 
47
        if prodname not in ctree['products']:
 
48
            ctree['products'][prodname] = {'versions': {}}
 
49
 
 
50
        prodtree = ctree['products'][prodname]
 
51
        if vername not in prodtree['versions']:
 
52
            prodtree['versions'][vername] = {'items': {}}
 
53
 
 
54
        vertree = prodtree['versions'][vername]
 
55
 
 
56
        if itemname in vertree['items']:
 
57
            raise ValueError("%s: already existed" %
 
58
                             str([content_id, prodname, vername, itemname]))
 
59
 
 
60
        vertree['items'][itemname] = data
 
61
    return ctrees
 
62
 
 
63
 
 
64
def main():
 
65
    parser = argparse.ArgumentParser(
 
66
        description="create content tree from tab data")
 
67
 
 
68
    parser.add_argument("input", metavar='file',
 
69
                        help=('source tab delimited data'))
 
70
 
 
71
    parser.add_argument("out_d", metavar='out_d',
 
72
                        help=('create content under output_dir'))
 
73
 
 
74
    parser.add_argument('--sign', action='store_true', default=False,
 
75
                        help='sign all generated files')
 
76
 
 
77
    args = parser.parse_args()
 
78
 
 
79
    if args.input == "-":
 
80
        tabinput = sys.stdin.read()
 
81
    else:
 
82
        with open(args.input, "r") as fp:
 
83
            tabinput = fp.read()
 
84
 
 
85
    streamdir = "streams/v1"
 
86
 
 
87
    items = tab2items(tabinput)
 
88
    data = {'updated': util.timestamp(), 'datatype': 'image-downloads'}
 
89
    trees = items2content_trees(items, data)
 
90
 
 
91
    index = {"index": {}, 'format': 'index:1.0',
 
92
             'updated': data['updated']}
 
93
 
 
94
    to_write = [("%s/%s" % (streamdir, 'index.js'), index,)]
 
95
 
 
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(),
 
103
        }
 
104
        for k in util.stringitems(content):
 
105
            if k not in not_copied_up:
 
106
                index['index'][content_id][k] = content[k]
 
107
 
 
108
        to_write.append((index['index'][content_id]['path'], content,))
 
109
 
 
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")
 
116
 
 
117
        if args.sign:
 
118
            sys.stderr.write("signing %s\n" % filef)
 
119
            toolutil.signjs_file(filef)
 
120
 
 
121
    return
 
122
 
 
123
if __name__ == '__main__':
 
124
    sys.exit(main())
 
125
 
 
126
# vi: ts=4 expandtab