]> git.phdru.name Git - bookmarks_db.git/blob - sort_db.py
Minor refactoring
[bookmarks_db.git] / sort_db.py
1 #! /usr/bin/env python
2 """Sort bookmarks DB according to a rule:
3       -a - by AddDate
4       -v - by LastVisit
5       -m - by LastModified
6       -z - by Size
7       -t - by LastTested
8    default is -m
9       -r - reverse the sort order
10
11 This file is a part of Bookmarks database and Internet robot.
12
13 """
14
15 __author__ = "Oleg Broytman <phd@phdru.name>"
16 __copyright__ = "Copyright (C) 2000-2014 PhiloSoft Design"
17 __license__ = "GNU GPL"
18
19 import sys
20
21
22 class SortBy(object):
23    def __init__(self, sort_by):
24       self.sort_by = sort_by
25
26    def __call__(self, o1, o2):
27       try:
28          attr1 = int(getattr(o1, self.sort_by))
29       except (AttributeError, TypeError, ValueError):
30          return 1
31
32       try:
33          attr2 = int(getattr(o2, self.sort_by))
34       except (AttributeError, TypeError, ValueError):
35          return -1
36
37       return cmp(attr1, attr2)
38
39
40 def walk_linear(linear, walker):
41    for object in linear:
42       if object.isBookmark:
43          walker.bookmark(object, 0)
44
45
46 def run():
47    from getopt import getopt
48    optlist, args = getopt(sys.argv[1:], "avmztrs")
49
50    sort_by = "last_modified"
51    reverse = 0
52    report_stats = 1
53
54    for _opt, _arg in optlist:
55       if _opt == '-a':
56          sort_by = "add_date"
57       elif _opt == '-v':
58          sort_by = "last_visit"
59       elif _opt == '-m':
60          sort_by = "last_modified"
61       elif _opt == '-z':
62          sort_by = "size"
63       elif _opt == '-t':
64          sort_by = "last_tested"
65       elif _opt == '-r':
66          reverse = 1
67       elif _opt == '-s':
68          report_stats = 0
69    try:
70       del _opt, _arg
71    except NameError:
72       pass
73
74    from storage import storage
75    storage = storage()
76
77    if report_stats:
78       sys.stdout.write("Loading %s: " % storage.filename)
79       sys.stdout.flush()
80
81    root_folder = storage.load()
82
83    if report_stats:
84       print "Ok"
85       sys.stdout.write("Sorting (by %s): " % sort_by)
86       sys.stdout.flush()
87
88    from bkmk_objects import make_linear
89    make_linear(root_folder)
90
91    linear = root_folder.linear
92    del linear[0] # exclude root folder from sorting
93
94    by = SortBy(sort_by)
95    linear.sort(by)
96
97    from writers import writer
98    output_filename = "%s-sorted_by-%s" % (writer.filename, sort_by)
99
100    if reverse:
101       linear.reverse()
102       output_filename = output_filename + "-reverse"
103
104    if report_stats:
105       print "done"
106       sys.stdout.write("Writing %s: " % output_filename)
107       sys.stdout.flush()
108
109    outfile = open(output_filename, 'w')
110    writer = writer(outfile)
111    writer.root_folder(root_folder)
112    walk_linear(linear, writer)
113    outfile.close()
114
115    if report_stats:
116       print "Ok"
117
118
119 if __name__ == '__main__':
120    run()