Subversion Repositories DevTools

Rev

Rev 5101 | Rev 5258 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5101 Rev 5144
Line 6... Line 6...
6
GEOMETRY_KEY = 'geometry'
6
GEOMETRY_KEY = 'geometry'
7
LOCATION_KEY = 'location'
7
LOCATION_KEY = 'location'
8
LAT_KEY = 'lat'
8
LAT_KEY = 'lat'
9
LNG_KEY = 'lng'
9
LNG_KEY = 'lng'
10
 
10
 
-
 
11
def trace(*objs) :
-
 
12
    print(*objs,file=sys.stderr)
-
 
13
    sys.stderr.flush()
11
 
14
    
12
class CrucibleExtractor :
15
class CrucibleExtractor :
13
    def __init__(self) :
16
    def __init__(self) :
14
        pass
17
        pass
15
        self.selected_reviews = {}
18
        self.selected_reviews = {}
16
        self.runtime_defects = {}
19
        self.runtime_defects = {}
Line 18... Line 21...
18
        self.security_defects = {}
21
        self.security_defects = {}
19
        self.unclassified_defect_reviews = [ ]
22
        self.unclassified_defect_reviews = [ ]
20
        self.total_defects = 0
23
        self.total_defects = 0
21
        self.verbose = False
24
        self.verbose = False
22
    def url_to_object(self, url, top=None) :
25
    def url_to_object(self, url, top=None) :
-
 
26
        trace(url)
23
        req = Request(url)
27
        req = Request(url)
24
        req.add_header('Accept','application/json')
28
        req.add_header('Accept','application/json')
25
        req.add_header('Authorization', 'Basic dGxpdHRsZWY6MCRtb3JQRVRI')
29
        req.add_header('Authorization', 'Basic dGxpdHRsZWY6MCRtb3JQRVRI')
26
        resp = urlopen(req).read()
30
        resp = urlopen(req).read()
27
        retval = json.loads(str(resp,'utf-8'))
31
        retval = json.loads(str(resp,'utf-8'))
Line 35... Line 39...
35
            review_id = r["permaId"]["id"] 
39
            review_id = r["permaId"]["id"] 
36
            review_create_date = r["createDate"]
40
            review_create_date = r["createDate"]
37
            if review_create_date>=min_create_date and review_create_date<=max_create_date :
41
            if review_create_date>=min_create_date and review_create_date<=max_create_date :
38
                self.selected_reviews[review_id] = [ r['projectKey'], None, ]
42
                self.selected_reviews[review_id] = [ r['projectKey'], None, ]
39
            else :
43
            else :
-
 
44
                trace("Excluding review ",review_id)
40
                pass
45
                pass
41
        return self.selected_reviews.keys()
46
        return self.selected_reviews.keys()
42
    def get_review_summary(self,review_id) :
47
    def get_review_summary(self,review_id) :
43
        url = CRUCIBLE_URL_TEMPLATE + "/" + review_id + "/comments"
48
        url = CRUCIBLE_URL_TEMPLATE + "/" + review_id + "/comments"
44
        projectKey = str(self.selected_reviews[review_id][0])
49
        projectKey = str(self.selected_reviews[review_id][0])
Line 60... Line 65...
60
                self.unclassified_defect_reviews += [ review_id ]
65
                self.unclassified_defect_reviews += [ review_id ]
61
                self.total_defects += 1
66
                self.total_defects += 1
62
            else :
67
            else :
63
                defect_category_code =  metrics_keys[0]
68
                defect_category_code =  metrics_keys[0]
64
                defect_type = c['metrics'][defect_category_code]['value']
69
                defect_type = c['metrics'][defect_category_code]['value']
-
 
70
                trace(defect_category_code, defect_type)
65
                category_defect_map = None
71
                category_defect_map = None
66
                if defect_category_code == 'metric-57' : # maintenance
72
                if defect_category_code == 'metric-0' : # maintenance
67
                    retval[3] += 1
73
                    retval[3] += 1
68
                    category_defect_map = self.maintenance_defects
74
                    category_defect_map = self.maintenance_defects
69
                elif defect_category_code == 'metric-95' : # runtime
75
                elif defect_category_code == 'metric-1' : # runtime
70
                    retval[2] += 1
76
                    retval[2] += 1
71
                    category_defect_map = self.runtime_defects
77
                    category_defect_map = self.runtime_defects
72
                elif defect_category_code == 'metric-97' : # security
78
                elif defect_category_code == 'metric-97' : # security
73
                    retval[4] += 1
79
                    retval[4] += 1
74
                    category_defect_map = self.security_defects
80
                    category_defect_map = self.security_defects
75
                else :
81
                else :
76
                    print("Unexpected defect_category_code %s" % ( c['metrics'].keys()[0], ))
82
                    trace("Unexpected defect category %s (defect type is %s)" % ( defect_category_code, defect_type))
77
                    retval[5] += 1 
83
                    retval[5] += 1 
78
                    self.unclassified_defect_reviews += [ review_id ]
84
                    self.unclassified_defect_reviews += [ review_id ]
79
                    self.total_defects += 1
85
                    self.total_defects += 1
80
                if category_defect_map is None :
86
                if category_defect_map is None :
81
                    pass
87
                    pass
Line 88... Line 94...
88
        return retval
94
        return retval
89
    def summarize_by_project(self, month_prefix) :
95
    def summarize_by_project(self, month_prefix) :
90
        start_date = month_prefix + "-00"
96
        start_date = month_prefix + "-00"
91
        end_date = month_prefix + "-99"
97
        end_date = month_prefix + "-99"
92
        if self.verbose : 
98
        if self.verbose : 
93
            print("Getting review ids")
99
            trace("Getting review ids")
94
        review_ids = self.get_selected_review_ids(start_date, end_date)
100
        review_ids = self.get_selected_review_ids(start_date, end_date)
95
        project_summaries = {}
101
        project_summaries = {}
96
        overall_summary = [ 0, ] * 6
102
        overall_summary = [ 0, ] * 6
97
        for review_id in sorted(review_ids) :
103
        for review_id in review_ids :
98
            if True :
104
            if True :
99
                review_summary = self.get_review_summary(review_id)
105
                review_summary = self.get_review_summary(review_id)
100
                if self.verbose : 
106
                if self.verbose : 
101
                    print("%-12s: %s" % ( review_id, self.selected_reviews[review_id][1], ))
107
                    trace("%-12s: %s" % ( review_id, self.selected_reviews[review_id][1], ))
102
                project_id = review_summary[0]
108
                project_id = review_summary[0]
103
                if  project_id in project_summaries.keys() :
109
                if  project_id in project_summaries.keys() :
104
                    project_summary = project_summaries[project_id]
110
                    project_summary = project_summaries[project_id]
105
                else :
111
                else :
106
                    project_summary = [ 0,] * 6
112
                    project_summary = [ 0,] * 6
Line 150... Line 156...
150
    def summarize_by_defect_type(self) :
156
    def summarize_by_defect_type(self) :
151
        self.summarize_for_category("maintenance",self.maintenance_defects)
157
        self.summarize_for_category("maintenance",self.maintenance_defects)
152
        self.summarize_for_category("runtime",self.runtime_defects)
158
        self.summarize_for_category("runtime",self.runtime_defects)
153
        self.summarize_for_category("security",self.security_defects)
159
        self.summarize_for_category("security",self.security_defects)
154
    def report_on_unclassified_defects(self) : 
160
    def report_on_unclassified_defects(self) : 
155
        print ( "Reviews with unclassified defects: %s" % (self.unclassified_defect_reviews,) )
161
        trace ( "Reviews with unclassified defects: %s" % (self.unclassified_defect_reviews,) )
156
 
162
 
157
if __name__ == "__main__" :
163
if __name__ == "__main__" :
158
    extractor = CrucibleExtractor()
164
    extractor = CrucibleExtractor()
159
    
165
    
160
    if sys.argv[1] == "--usage" :
166
    if len(sys.argv)<2 or sys.argv[1] == "--usage" :
161
        print ( "crucible_reporting.py YYYY-MM" )
167
        trace ( "crucible_reporting.py YYYY-MM" )
162
        print ( "   report stats for specified month" )
168
        trace ( "   report stats for specified month" )
163
        print ( "crucible_reporting.py" ) 
-
 
164
        print ( "   report stats for previous month" )
-
 
165
        sys.exit(0)
169
        sys.exit(0)
166
    elif sys.argv[1] == "--verbose" :
170
    elif sys.argv[1] == "--verbose" :
167
        extractor.verbose = True
171
        extractor.verbose = True
168
        sys.argv = sys.argv[1:]
172
        sys.argv = sys.argv[1:]
169
        
173
        
Line 171... Line 175...
171
        today = datetime.date.today()
175
        today = datetime.date.today()
172
        if today.month!= 1 :
176
        if today.month!= 1 :
173
            month_prefix = "%04d-%02d" % (today.year, today.month-1)
177
            month_prefix = "%04d-%02d" % (today.year, today.month-1)
174
        else :
178
        else :
175
            month_prefix = "%04d-%02d" % (today.year-1, 12)
179
            month_prefix = "%04d-%02d" % (today.year-1, 12)
176
        print ( "Generating report for previous month (" + month_prefix + ")" )
180
        trace ( "Generating report for previous month (" + month_prefix + ")" )
177
    else :
181
    else :
178
        month_prefix = sys.argv[1]
182
        month_prefix = sys.argv[1]
179
    
183
    
180
    extractor.summarize_by_project(month_prefix)
184
    extractor.summarize_by_project(month_prefix)
181
    extractor.summarize_by_defect_type()
185
    extractor.summarize_by_defect_type()