Beispiel #1
0
    def get_info(self, timestamp=None):
        model = Requirement(self.env)
        met = RequirementMetric(model)

        predicate = None

        results = met.pmi(predicate, timestamp)

        if len(results) == 0:
            self.no_results()

        pmis = []
        for pairing in results.keys():
            cur_fp = Fp(self.env, id=pairing[0])['name']
            cur_obj = Object(self.env, id=pairing[1])['name']
            pmis.append((cur_fp, cur_obj, '%.3f' % results[pairing]))

        self.req.hdf['pmis'] = pmis
Beispiel #2
0
    def get_info( self, timestamp=None ):
        model = Requirement(self.env)
        met = RequirementMetric(model)

        results = met.entropy(timestamp)
        if results is None:
            self.no_results()
        else:
            total_entropy = results[0]
            avg_entropy = results[1]
            components_entropies = results[2]
            req_entropies = results[3]
            fp_entropies = results[4]
            object_entropies = results[5]

            # Ease division below
            if total_entropy == 0:
                total_entropy = 1;

            reqs = []
            for req, entropy in req_entropies.iteritems():
                my_fp = Fp(self.env, id=req[1])['name']
                my_obj = Object(self.env, id=req[2])['name']
                reqs.append({'name': '<'+req[0]+' '+my_fp+' '+my_obj+'>',
                             'link': self.req.href.requirement(req[0]+
                                     '-'+my_fp+'-'+my_obj),
                             'entropy': '%.3f' % entropy})

            components = []
            for comp, entropy in components_entropies.iteritems():
                components.append({'name': comp,
                                   'percent': '%.1f' % (100 * entropy / total_entropy)})
            self.req.hdf['graph_path'] = self.req.href.requirements()+'/graph/'

            self.req.hdf['reqs'] = sorted(reqs, lambda x,y: cmp(float(y['entropy']), float(x['entropy'])))
            self.req.hdf['components'] = sorted(components, lambda x,y: cmp(x['name'], y['name']))
Beispiel #3
0
    def entropy_graph(self):
        """Creates a graph of entropy over time for requirements

        This returns an image with each requirement's entropy over
        time shown over the course of the project. If a project is old,
        or there are a lot of requirements, this can be a time consuming 
        process.
        """
        # Image generation prelude.
        fig = self._new_image((4,4))
        canvas = FigureCanvasAgg(fig)
        ax = fig.add_axes([0.1, 0.2, 0.85, 0.75])
        
        # Set up our time range from oldest time to now/newest.
        metric = RequirementMetric(Requirement(self.env))
        start_time = metric.model.get_timestamp_first_entity()
        end_time = metric.model.get_timestamp_latest_req_reqchange_milestone()
        current_time = int(time.time())
        if current_time > end_time:
            end_time = current_time
        
        #create the list of timestamps and make labels.
        times = []
        timestamp = end_time
        # We'll use two week increments for now to reduce 
        # delay while loading. 
        seconds_in_unit = (60 * 60 * 24 * 7 * 2)
        while timestamp > start_time:
            times.append(timestamp)
            timestamp -= seconds_in_unit        
        times.reverse()
        labels = [time.strftime("%b %d '%y",time.gmtime(timestamp)) \
                  for timestamp in times]

        # Create the coordinates lists for graphing
        coords = {}
        i = 0
        for timestamp in times:
            i = i + 1
            if timestamp > current_time:
                break;
            entropy_data = metric.entropy(timestamp)
            if entropy_data:
                _,_,_, req_entropies, _, _ = entropy_data
                for key in req_entropies.keys():
                    if not coords.has_key(key):
                        coords[key] = [(i, req_entropies[key])]
                    else:
                        coords[key].append((i, req_entropies[key]))

        biggest = []
        # Now we can actually graph them all
        for req in coords.keys():
            x = [x[0] for x in coords[req]]
            y = [y[1] for y in coords[req]]
            biggest.append(max(y))
            ax.plot(x,y,'k-')

        # Add the milestone markers.
        milestones = Requirement(self.env).get_milestones()
        x = []
        for (_, due) in milestones:
            if due == 0:
                continue
            x.append( float(due - times[0]) / float( seconds_in_unit))
        height = int(float(max(biggest)) + 1.5) 
        ax.vlines(x, 0, height,colors='r')
        # Label and shape the graph

        ax.set_xticks(range(0, len(times), 1))
        ax.set_xticklabels(labels)
        ax.set_xlim(0, len(times))
        setp(ax.get_xticklabels(),'rotation', 80, fontsize=6)
        ax.set_xlabel('Time in two-week increments', fontsize=6)
        
        ax.set_yticks(arange(0,height, 1))
        ax.set_ylim(0, height)
        setp(ax.get_yticklabels(), fontsize=6)
        ax.set_ylabel("Entropy", fontsize=6)

        return canvas