stats.py
Go to the documentation of this file.
1 #!/usr/bin/python
2 
3 import rospy
4 import xml.dom.minidom
5 import os
6 import os.path
7 import sys
8 import collections
9 import operator
10 from urlparse import urlparse
11 import httplib
12 
13 
14 def get_code(url):
15  x = urlparse(url)
16 
17  try:
18  conn = httplib.HTTPConnection(x.netloc)
19  conn.request("HEAD", x.path)
20  return conn.getresponse().status
21  except StandardError:
22  return None
23 
24 
25 def get_element(doc, name):
26  elements = manifest.getElementsByTagName(name)
27  if len(elements) == 0:
28  return None
29  element = elements[0]
30  return element
31 
32 def get_text(doc, name):
33  element = get_element(doc, name)
34  if element is None or len(element.childNodes)==0:
35  return ''
36  return element.childNodes[0].data
37 
38 def report(name, rdict):
39  sorted_report = sorted(rdict.iteritems(), key=operator.itemgetter(1))
40  print
41  print "=" * 5, name, "="*(40-len(name))
42  for (value, count) in sorted_report:
43  print value, count
44 
45 def extract_items(s, split=False):
46  authors = []
47  if 'Maintained by' in s:
48  i = s.index('Maintained by')
49  s = s[:i] + s[i+1+len('Maintained by'):]
50 
51  for a in s.split(','):
52  for b in a.split('and'):
53  if split and '/' in b:
54  b = b[:b.index('/')]
55  authors.append(b.strip())
56  return authors
57 
58 #diff mainpage.dox ../pr2_sith/mainpage.dox | grep '^>'
59 
60 authors = collections.defaultdict(list)
61 descriptions = collections.defaultdict(int)
62 briefs = collections.defaultdict(int)
63 reviews = collections.defaultdict(int)
64 licenses = collections.defaultdict(int)
65 urls = collections.defaultdict(int)
66 packages = []
67 stacks = []
68 
69 if len(sys.argv)<=1 or '-h' in sys.argv:
70  print "Need to specify a directory to search through as the first parameter"
71  print " [use the -web flag to ping the address "
72  print " specified in the URL tag to see if it exists ] "
73  exit(1)
74 
75 check_urls = '-web' in sys.argv
76 
77 for root, subFolders, files in os.walk(sys.argv[1]):
78  if 'manifest.xml' in files:
79  is_package = True
80  elif 'stack.xml' in files:
81  is_package = False
82  else:
83  continue
84 
85  package = os.path.basename(root)
86  if is_package:
87  manifest_xml = open("%s/manifest.xml"%root, 'r').read()
88  else:
89  manifest_xml = open("%s/stack.xml"%root, 'r').read()
90 
91  try:
92  manifest = xml.dom.minidom.parseString(manifest_xml)
93  except:
94  continue
95 
96  node = {'name': package}
97 
98  author = get_text(manifest, 'author')
99  for a_name in extract_items(author, True):
100  authors[a_name].append(package)
101  node['author'] = author
102 
103  description_xml = get_element(manifest, 'description')
104  if not description_xml:
105  node['description'] = None
106  node['brief'] = None
107  else:
108  description = get_text(manifest, 'description').strip()
109  brief = description_xml.getAttribute('brief').strip()
110  node['description'] = 'minimal' if description==package else 'detailed'
111  node['brief'] = 'minimal' if brief==package else 'detailed'
112 
113  descriptions[ node['description'] ] += 1
114  briefs[ node['brief'] ] += 1
115 
116  review_xml = get_element(manifest, 'review')
117  if review_xml is None:
118  review = None
119  else:
120  review = review_xml.getAttribute('status')
121  node[ 'review' ] = review
122  reviews[review] += 1
123 
124  license = get_text(manifest, 'license')
125  node[ 'license' ] = license
126  for lic in extract_items(license):
127  licenses[lic] += 1
128 
129  url = get_text(manifest, 'url')
130  if url is not None:
131  if check_urls:
132  url = get_code(url)
133  else:
134  url = 'specified'
135  node[ 'url' ] = url
136  urls[url] += 1
137 
138  if is_package:
139  packages.append(node)
140  else:
141  stacks.append(node)
142 
143 lengths = collections.defaultdict(int)
144 for d in packages + stacks:
145  for a,b in d.iteritems():
146  if type(b)==type(u''):
147  b = b.encode('ascii', 'replace')
148  if len(str(b)) > lengths[a]:
149  lengths[a] = len(str(b))
150  if len(str(a)) > lengths[a]:
151  lengths[a] = len(str(a))
152 
153 fields = ['name', 'description', 'brief', 'license', 'url', 'review', 'author']
154 
155 if len(stacks)>0:
156  for field in fields:
157  print ("%%-%ds"%lengths[field])%field,
158  print
159 
160  for field in fields:
161  print "=" * lengths[field],
162  print
163 
164  for d in stacks:
165  for field in fields:
166  print ("%%-%ds"%lengths[field])%str(d[field]),
167  print
168  print
169 
170 if len(packages)>0:
171  for field in fields:
172  print ("%%-%ds"%lengths[field])%field,
173  print
174 
175  for field in fields:
176  print "=" * lengths[field],
177  print
178 
179  for d in packages:
180  for field in fields:
181  val = d[field]
182  if type(val)==type(u''):
183  val = val.encode('ascii', 'replace')
184  print val,
185  n = lengths[field] - len(val)-1
186  if n>0:
187  print " "*n,
188  else:
189  print ("%%-%ds"%lengths[field])%str(val),
190  print
191 
192 report('Descriptions', descriptions)
193 report('Brief Descriptions', briefs)
194 report('Reviews', reviews)
195 report('Licenses', licenses)
196 report('Urls', urls)
197 print
198 name = "Authors"
199 print "=" * 5, name, "="*(40-len(name))
200 for a,c in sorted(authors.items()):
201  a = a.encode('ascii', 'replace')
202  print "%s %4d"%(a.strip(),len(c))
203  print ' ',
204  for (i,b) in enumerate(c):
205  print "%-30s"%b,
206  if i%3==2:
207  print '\n ',
208  print
209 
210 
def get_element(doc, name)
Definition: stats.py:25
def get_code(url)
Definition: stats.py:14
def report(name, rdict)
Definition: stats.py:38
def get_text(doc, name)
Definition: stats.py:32
def extract_items(s, split=False)
Definition: stats.py:45


manifest_cleaner
Author(s): David V. Lu!!
autogenerated on Mon Jun 10 2019 15:48:50