Example #1
0
def main():
    info("CLMT Data Processing Tool")
    info("-------------------------")
    info("Vassilios Karakoidas (c) 2013")
    info("[email protected] (http://bkarak.wizhut.com/)")
    info("")

    if len(sys.argv) not in [1, 2, 3]:
        error('usage: clmt-stats.py [initdb|-d {directory}|-f {file}]')
        return

    if sys.argv[1] == 'initdb':
        from db.internals import create_database

        info("Creating the SQLite database ... ")
        create_database()
        return

    if len(sys.argv) == 3:
        if sys.argv[1] == '-f' and os.path.isfile(sys.argv[2]):
            info('Checking file: %s' % (sys.argv[2], ))
            import_file(sys.argv[2])
        elif sys.argv[1] == '-d' and os.path.isdir(sys.argv[2]):
            info('Checking directory: %s' % (sys.argv[2], ))
            import_directory(sys.argv[2])
        elif sys.argv[1] == '-dups' and os.path.isdir(sys.argv[2]):
            info('Duplicates Check on %s' % (sys.argv[2], ))
            check_directory(sys.argv[2])
        else:
            warning('"%s" is not a valid file to import!' % (sys.argv, ))
Example #2
0
def convert_jdepend_to_clmtx(filename):
    result = []

    try:
        fp = open(filename, 'r')
        xml_json = xmldict.parse(fp)
        packages = xml_json['JDepend']['Packages']['Package']

        if isinstance(packages, list):
            for p in packages:
                try:
                    package_name = p.get('@name', 'NotSet')

                    if p.get('error', None) is not None:
                        continue

                    stats = p.get('Stats', {})
                    results = {'id': package_name,
                               'filename': package_name.replace('.', '/'),
                               'category': 'module',
                               'measurement': [
                                   {'name': 'NumberOfClasses', 'result-type': 'integer', 'value': stats.get('TotalClasses', 0)},
                                   {'name': 'NumberOfConcreteClasses', 'result-type': 'integer', 'value': stats.get('ConcreteClasses', 0)},
                                   {'name': 'NumberOfAbstractClasses', 'result-type': 'integer', 'value': stats.get('AbstractClasses', 0)},
                                   {'name': 'AfferentCouplings', 'result-type': 'integer', 'value': stats.get('Ca', 0)},
                                   {'name': 'EfferentCouplings', 'result-type': 'integer', 'value': stats.get('Ce', 0)},
                                   {'name': 'Abstractness', 'result-type': 'float', 'value': stats.get('A', 0.0)},
                                   {'name': 'Instability', 'result-type': 'float', 'value': stats.get('I', 0.0)},
                                   {'name': 'DistanceMainSequence', 'result-type': 'float', 'value': stats.get('D', 0.0)}]}
                    result.append(results)
                except Exception, e:
                    warning('Conversion error: %s' % (e,))
                    continue
    except Exception, e:
        warning('Could not convert JDepend XML to clmtx (%s, %s)' % (filename, e))
Example #3
0
def main():
    info("CLMT Data Processing Tool")
    info("-------------------------")
    info("Vassilios Karakoidas (c) 2013")
    info("[email protected] (http://bkarak.wizhut.com/)")
    info("")

    if len(sys.argv) not in [1, 2, 3]:
        error('usage: clmt-stats.py [initdb|-d {directory}|-f {file}]')
        return

    if sys.argv[1] == 'initdb':
        from db.internals import create_database

        info("Creating the SQLite database ... ")
        create_database()
        return

    if len(sys.argv) == 3:
        if sys.argv[1] == '-f' and os.path.isfile(sys.argv[2]):
            info('Checking file: %s' % (sys.argv[2],))
            import_file(sys.argv[2])
        elif sys.argv[1] == '-d' and os.path.isdir(sys.argv[2]):
            info('Checking directory: %s' % (sys.argv[2],))
            import_directory(sys.argv[2])
        elif sys.argv[1] == '-dups' and os.path.isdir(sys.argv[2]):
            info('Duplicates Check on %s' % (sys.argv[2],))
            check_directory(sys.argv[2])
        else:
            warning('"%s" is not a valid file to import!' % (sys.argv,))
Example #4
0
    def load(self):
        results = []

        if self.is_valid():
            if self.generator() == 'clmtx':
                try:
                    fp = open(self.filename(), 'r')
                    data_json = json.load(fp)

                    for de in data_json:
                        # Artifact
                        results.append(None)

                    fp.close()
                except Exception, e:
                    warning('JSON is not in clmtx format (%s, %s)' %
                            (self.filename(), e))
            elif self.generator() == 'jdepend':
                try:
                    data_json = jdepend.convert_jdepend_to_clmtx(
                        self.filename())
                    for de in data_json:
                        # artifact
                        results.append(None)
                except Exception, e:
                    warning('XML is not in jdepend format (%s, %s)' %
                            (self.filename(), e))
Example #5
0
    def load_directory(directory):
        if not os.path.exists(directory):
            warning('Directory does not exist (%s)' % (directory,))
            return []

        artifacts = []

        for (root, dirs, files) in os.walk(directory):
            for f in files:
                r = {'file' : '%s/%s' % (root, f)}

                if f.endswith('.json'):
                    r['type'] = 'json'
                    r['generator'] = 'clmtx'
                elif f.endswith('.xml'):
                    r['type'] = 'xml'
                    r['generator'] = 'jdepend'
                else:
                    continue

                artifacts.extend(DataFile(r).load())

        return artifacts
Example #6
0
    def load_directory(directory):
        if not os.path.exists(directory):
            warning('Directory does not exist (%s)' % (directory, ))
            return []

        artifacts = []

        for (root, dirs, files) in os.walk(directory):
            for f in files:
                r = {'file': '%s/%s' % (root, f)}

                if f.endswith('.json'):
                    r['type'] = 'json'
                    r['generator'] = 'clmtx'
                elif f.endswith('.xml'):
                    r['type'] = 'xml'
                    r['generator'] = 'jdepend'
                else:
                    continue

                artifacts.extend(DataFile(r).load())

        return artifacts
Example #7
0
    def load(self):
        results = []

        if self.is_valid():
            if self.generator() == 'clmtx':
                try:
                    fp = open(self.filename(), 'r')
                    data_json = json.load(fp)

                    for de in data_json:
                        # Artifact
                        results.append(None)

                    fp.close()
                except Exception, e:
                    warning('JSON is not in clmtx format (%s, %s)' % (self.filename(), e))
            elif self.generator() == 'jdepend':
                try:
                    data_json = jdepend.convert_jdepend_to_clmtx(self.filename())
                    for de in data_json:
                        # artifact
                        results.append(None)
                except Exception, e:
                    warning('XML is not in jdepend format (%s, %s)' % (self.filename(), e))
Example #8
0
    def is_valid(self):
        __valid_gentypes = {'clmtx': ['json'], 'jdepend': ['xml']}
        generator_types = __valid_gentypes.get(self.generator(), None)

        if generator_types is None:
            warning('Invalid Generator %s not in %s' % (self.generator(), __valid_gentypes.keys()))
            return False

        if self.type() in generator_types:
            if os.path.exists(self.filename()):
                return True
            else:
                warning('File does not exist: %s' % (self.filename(),))
        else:
            warning('Invalid File Type %s not in %s' % (self.type(), generator_types))

        return False
Example #9
0
    def is_valid(self):
        __valid_gentypes = {'clmtx': ['json'], 'jdepend': ['xml']}
        generator_types = __valid_gentypes.get(self.generator(), None)

        if generator_types is None:
            warning('Invalid Generator %s not in %s' %
                    (self.generator(), __valid_gentypes.keys()))
            return False

        if self.type() in generator_types:
            if os.path.exists(self.filename()):
                return True
            else:
                warning('File does not exist: %s' % (self.filename(), ))
        else:
            warning('Invalid File Type %s not in %s' %
                    (self.type(), generator_types))

        return False
Example #10
0
def convert_jdepend_to_clmtx(filename):
    result = []

    try:
        fp = open(filename, 'r')
        xml_json = xmldict.parse(fp)
        packages = xml_json['JDepend']['Packages']['Package']

        if isinstance(packages, list):
            for p in packages:
                try:
                    package_name = p.get('@name', 'NotSet')

                    if p.get('error', None) is not None:
                        continue

                    stats = p.get('Stats', {})
                    results = {
                        'id':
                        package_name,
                        'filename':
                        package_name.replace('.', '/'),
                        'category':
                        'module',
                        'measurement': [{
                            'name': 'NumberOfClasses',
                            'result-type': 'integer',
                            'value': stats.get('TotalClasses', 0)
                        }, {
                            'name':
                            'NumberOfConcreteClasses',
                            'result-type':
                            'integer',
                            'value':
                            stats.get('ConcreteClasses', 0)
                        }, {
                            'name':
                            'NumberOfAbstractClasses',
                            'result-type':
                            'integer',
                            'value':
                            stats.get('AbstractClasses', 0)
                        }, {
                            'name': 'AfferentCouplings',
                            'result-type': 'integer',
                            'value': stats.get('Ca', 0)
                        }, {
                            'name': 'EfferentCouplings',
                            'result-type': 'integer',
                            'value': stats.get('Ce', 0)
                        }, {
                            'name': 'Abstractness',
                            'result-type': 'float',
                            'value': stats.get('A', 0.0)
                        }, {
                            'name': 'Instability',
                            'result-type': 'float',
                            'value': stats.get('I', 0.0)
                        }, {
                            'name': 'DistanceMainSequence',
                            'result-type': 'float',
                            'value': stats.get('D', 0.0)
                        }]
                    }
                    result.append(results)
                except Exception, e:
                    warning('Conversion error: %s' % (e, ))
                    continue
    except Exception, e:
        warning('Could not convert JDepend XML to clmtx (%s, %s)' %
                (filename, e))
Example #11
0
def import_json(project_name, project_input, json_obj):
    from db.models import Filenames, Category, Project, Measurement, MeasurementType

    info('Importing Project: %s (%s)' % (project_name, project_input))
    _project_obj = Project.get_or_insert(project_name)

    if _project_obj == -1:
        error('Could not import Project: %s (%s)' % (project_name, project_input))
        return

    for element in json_obj:
        try:
            # retrieve id
            _id = element['id']
            _category = element['category']
            _filename = element['filename']

            # retrieve ids
            _id_obj = Filenames.get_or_insert(_id)

            if _id_obj == -1:
                warning('Invalid Element (id, filename): (%s, %s)' % (_id, _filename))
                continue

            # retrieve categories
            _category_obj = Category.get_or_insert(_category)

            if _category_obj == -1:
                warning('Invalid Element (id, filename): (%s, %s)' % (_id, _filename))
                continue

            # retrieve filenames
            _filename_obj = Filenames.get_or_insert(_filename)

            if _filename_obj == -1:
                warning('Invalid Element (id, filename): (%s, %s)' % (_id, _filename))
                continue

            from db.internals import Session

            db_session = Session()

            for measurements in element.get('measurement', []):
                try:
                    try:
                        _name = measurements[u'name']
                    except Exception, e:
                        _name = measurements[u'Name']

                    _mt_obj = MeasurementType.get_or_insert(_name + '_' + project_input)

                    if _mt_obj == -1:
                        warning('Invalid Measurement Type: %s' % (_name + '_' + project_input,))
                        continue

                    _value = str(measurements['value'])

                    meas_object = Measurement()
                    meas_object.cat_pk = _category_obj
                    meas_object.prj_pk = _project_obj
                    meas_object.meas_id = _id_obj
                    meas_object.meas_filename = _filename_obj
                    meas_object.meas_value = _value
                    meas_object.mt_pk = _mt_obj
                    db_session.add(meas_object)
                except Exception, e:
                    warning('Invalid Measurement: %s (%s)' % (measurements, e.message))
                    continue
Example #12
0
def import_json(project_name, project_input, json_obj):
    from db.models import Filenames, Category, Project, Measurement, MeasurementType

    info('Importing Project: %s (%s)' % (project_name, project_input))
    _project_obj = Project.get_or_insert(project_name)

    if _project_obj == -1:
        error('Could not import Project: %s (%s)' %
              (project_name, project_input))
        return

    for element in json_obj:
        try:
            # retrieve id
            _id = element['id']
            _category = element['category']
            _filename = element['filename']

            # retrieve ids
            _id_obj = Filenames.get_or_insert(_id)

            if _id_obj == -1:
                warning('Invalid Element (id, filename): (%s, %s)' %
                        (_id, _filename))
                continue

            # retrieve categories
            _category_obj = Category.get_or_insert(_category)

            if _category_obj == -1:
                warning('Invalid Element (id, filename): (%s, %s)' %
                        (_id, _filename))
                continue

            # retrieve filenames
            _filename_obj = Filenames.get_or_insert(_filename)

            if _filename_obj == -1:
                warning('Invalid Element (id, filename): (%s, %s)' %
                        (_id, _filename))
                continue

            from db.internals import Session

            db_session = Session()

            for measurements in element.get('measurement', []):
                try:
                    try:
                        _name = measurements[u'name']
                    except Exception, e:
                        _name = measurements[u'Name']

                    _mt_obj = MeasurementType.get_or_insert(_name + '_' +
                                                            project_input)

                    if _mt_obj == -1:
                        warning('Invalid Measurement Type: %s' %
                                (_name + '_' + project_input, ))
                        continue

                    _value = str(measurements['value'])

                    meas_object = Measurement()
                    meas_object.cat_pk = _category_obj
                    meas_object.prj_pk = _project_obj
                    meas_object.meas_id = _id_obj
                    meas_object.meas_filename = _filename_obj
                    meas_object.meas_value = _value
                    meas_object.mt_pk = _mt_obj
                    db_session.add(meas_object)
                except Exception, e:
                    warning('Invalid Measurement: %s (%s)' %
                            (measurements, e.message))
                    continue