# This Source Code Form of OSSEval is subject to the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE, v. 3.0. If a copy of the AGPL was not
# distributed with this file, You can obtain one at http://www.gnu.org/licenses/agpl.txt
#
# OSSeval is powered by the SOS Open Source AGPL edition.
# The AGPL requires that you do not remove the SOS Open Source attribution and copyright
# notices from the user interface (see section 5.d below).
# OSSEval Copyright 2014 Bitergium SLL
# SOS Open Source Copyright 2012 Roberto Galoppini
# Author: Davide Galletti
from xml.dom import minidom
from utils import Configuration, xmlElements, Forges, UrllibHelper
from OSSEval.utils import TrivialJSONEncoder
class OhlohProxy():
def search_json(self, name):
a = TrivialJSONEncoder().encode(OhlohProxy.search(name))
return a
@staticmethod
def search(name):
page = 1
print "Ohloh search - " + name + " - page " + str(page)
url_ohloh = "https://www.openhub.net/p.xml?api_key=" + Configuration.api_key + "&query=" + name + "&page="
xml = UrllibHelper.urlopen(url_ohloh + str(page))
xmldoc = minidom.parseString(xml)
items_available = xmlElements(xmldoc.getElementsByTagName('items_available')).firstValue()
status = xmlElements(xmldoc.getElementsByTagName('status')).firstValue()
project_list = []
previous_len_project_list = -1
while (status == 'success' and previous_len_project_list < len(project_list) and len(project_list) < min(Configuration.max_number_of_records, items_available)):
previous_len_project_list = len(project_list)
print "Ohloh search - " + name + " - page " + str(page) + " len(project_list): " + str(len(project_list))
page = page + 1
item_list = xmldoc.getElementsByTagName('project')
for s in item_list :
try:
op = OhlohProject()
op.id = xmlElements(s.getElementsByTagName('url_name')).firstValue()
op.name = xmlElements(s.getElementsByTagName('name')).firstValue()
op.description = xmlElements(s.getElementsByTagName('description')).firstValue()
op.small_logo_url = xmlElements(s.getElementsByTagName('small_logo_url')).firstValue()
op.homepage_url = xmlElements(s.getElementsByTagName('homepage_url')).firstValue()
op.id_forge = Forges.OHLOH
op.datasource_id = 0
project_list.append(op)
except Exception as ex:
print str(ex)
xml = UrllibHelper.urlopen(url_ohloh + str(page))
xmldoc = minidom.parseString(xml)
status = xmldoc.getElementsByTagName('status')[0].firstChild.nodeValue
return project_list
@staticmethod
def getProjectInfo(project_identifier):
url_ohloh = "http://www.openhub.net/projects/" + project_identifier + ".xml?api_key=" + Configuration.api_key
xml = UrllibHelper.urlopen(url_ohloh)
xmldoc = minidom.parseString(xml)
info = {}
status = xmlElements(xmldoc.getElementsByTagName('status')).firstValue()
if status == 'success':
info['id'] = project_identifier
info['project_identifier'] = project_identifier
info['widget_languages'] = '<script type="text/javascript" src="http://www.openhub.net/p/' + project_identifier + '/widgets/project_languages.js"></script>'
info['ohloh_url'] = "http://www.openhub.net/p/" + project_identifier
info['commits_spark'] = "http://www.openhub.net/p/" + project_identifier + "/analyses/latest/commits_spark.png";
info['created_at'] = xmlElements(xmldoc.getElementsByTagName('created_at')).firstValue()
info['updated_at'] = xmlElements(xmldoc.getElementsByTagName('updated_at')).firstValue()
info['description'] = xmlElements(xmldoc.getElementsByTagName('description')).firstValue()
info['homepage_url'] = xmlElements(xmldoc.getElementsByTagName('homepage_url')).firstValue()
info['download_url'] = xmlElements(xmldoc.getElementsByTagName('download_url')).firstValue()
info['medium_logo_url'] = xmlElements(xmldoc.getElementsByTagName('medium_logo_url')).firstValue()
info['small_logo_url'] = xmlElements(xmldoc.getElementsByTagName('small_logo_url')).firstValue()
info['user_count'] = xmlElements(xmldoc.getElementsByTagName('user_count')).firstValue()
info['average_rating'] = xmlElements(xmldoc.getElementsByTagName('average_rating')).firstValue()
info['rating_count'] = xmlElements(xmldoc.getElementsByTagName('rating_count')).firstValue()
info['review_count'] = xmlElements(xmldoc.getElementsByTagName('review_count')).firstValue()
info['twelve_month_contributor_count'] = xmlElements(xmldoc.getElementsByTagName('twelve_month_contributor_count')).firstValue()
info['total_code_lines'] = xmlElements(xmldoc.getElementsByTagName('total_code_lines')).firstValue()
info['main_language_name'] = xmlElements(xmldoc.getElementsByTagName('main_language_name')).firstValue()
info['licenses'] = []
license_list = xmldoc.getElementsByTagName('license')
for s in license_list :
info['licenses'].append(xmlElements(s.getElementsByTagName('nice_name')).firstValue())
info['languages'] = []
language_list = xmldoc.getElementsByTagName('language')
for l in language_list :
language = {}
language['project_identifier'] = l.firstChild.nodeValue
language['percentage'] = l.attributes['percentage'].value
language['color'] = l.attributes['color'].value
language['id'] = l.attributes['id'].value
info['languages'].append(language)
url_ohloh = "http://www.openhub.net/projects/" + project_identifier + "/factoids.xml?api_key=" + Configuration.api_key
xml = UrllibHelper.urlopen(url_ohloh)
xmldoc = minidom.parseString(xml)
status = xmlElements(xmldoc.getElementsByTagName('status')).firstValue()
info['factoids'] = []
if status == 'success':
factoid_list = xmldoc.getElementsByTagName('factoid')
for f in factoid_list :
factoid = {}
factoid['type'] = xmlElements(f.getElementsByTagName('type')).firstValue()
factoid['description'] = xmlElements(f.getElementsByTagName('description')).firstValue()
factoid['severity'] = xmlElements(f.getElementsByTagName('severity')).firstValue()
info['factoids'].append(factoid)
url_ohloh = "http://www.openhub.net/projects/" + project_identifier + "/analyses/latest/size_facts.xml?api_key=" + Configuration.api_key
xml = UrllibHelper.urlopen(url_ohloh)
xmldoc = minidom.parseString(xml)
info['size_fact'] = None
status = xmlElements(xmldoc.getElementsByTagName('status')).firstValue()
if status == 'success':
size_fact_list = xmldoc.getElementsByTagName('size_fact')
if len(size_fact_list) > 0:
sf = size_fact_list[len(size_fact_list) - 1]
size_fact = {}
size_fact['month'] = xmlElements(sf.getElementsByTagName('month')).firstValue()
size_fact['code'] = xmlElements(sf.getElementsByTagName('code')).firstValue()
size_fact['comments'] = xmlElements(sf.getElementsByTagName('comments')).firstValue()
size_fact['blanks'] = xmlElements(sf.getElementsByTagName('comment_ratio')).firstValue()
size_fact['commits'] = xmlElements(sf.getElementsByTagName('commits')).firstValue()
size_fact['comment_ratio'] = xmlElements(sf.getElementsByTagName('comment_ratio')).firstValue()
size_fact['man_months'] = xmlElements(sf.getElementsByTagName('man_months')).firstValue()
# I just need the last as it is the most recent
info['size_fact'] = size_fact
return info
class OhlohProject():
id = 0
name = ""
description = ""
small_logo_url = ""
homepage_url = ""
id_forge = 0
datasource_id = 0
def load_information(self):
self.info = OhlohProxy.getProjectInfo(self.name)