summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/lib/recipetool/create_cpan.py168
-rw-r--r--scripts/lib/recipetool/metacpan/__init__.py0
-rw-r--r--scripts/lib/recipetool/metacpan/query.py535
3 files changed, 703 insertions, 0 deletions
diff --git a/scripts/lib/recipetool/create_cpan.py b/scripts/lib/recipetool/create_cpan.py
new file mode 100644
index 00000000000..811fb65aeb8
--- /dev/null
+++ b/scripts/lib/recipetool/create_cpan.py
@@ -0,0 +1,168 @@
+# Recipe creation tool - perl CPAN module support plugin
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import json
+import logging
+import os
+import re
+import requests
+import shutil
+import subprocess
+import tempfile
+from recipetool.create import RecipeHandler, split_pkg_licenses, handle_license_vars
+from recipetool.metacpan.query import AbstractQuery, AuthorQuery, BugtrackerQuery, BuildDependsQuery, HomepageQuery, LicenseQuery, PauseIdQuery
+
+logger = logging.getLogger('recipetool')
+
+plugins = None
+tinfoil = None
+
+def plugin_init(pluginlist):
+ # Take a reference to the list so we can use it later
+ global plugins
+ plugins = pluginlist
+
+def tinfoil_init(instance):
+ global tinfoil
+ tinfoil = instance
+
+
+class CpanRecipeHandler(RecipeHandler):
+
+ def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
+ import bb.utils
+ import bb.providers
+ import oe
+ from collections import OrderedDict
+
+ if 'buildsystem' in handled:
+ return False
+
+ def read_meta_json(fn):
+ with open(fn, 'r', errors='surrogateescape') as f:
+ return json.loads(f.read())
+
+ # FIXME: really old modules will have META.yml and not META.json
+ files = RecipeHandler.checkfiles(srctree, ['META.json'])
+ logger.debug( bb.providers.getRuntimeProviders(tinfoil.cooker_data, 'libxml-perl'))
+ if files:
+ data = read_meta_json(files[0])
+ if 'name' in data and 'version' in data:
+ extravalues['PN'] = "lib%s-perl" % data['name'].lower()
+ extravalues['PV'] = data['version']
+ logger.debug("PN = \"%s\"" % extravalues['PN'])
+ logger.debug("PV = \"%s\"" % extravalues['PV'])
+ pq = PauseIdQuery(pn=data['name'], pv=data['version'])
+ logger.debug("PauseIdQuery.pauseid = \"%s\"" % pq.pauseid)
+ if pq.pauseid != None:
+ extravalues['PAUSEID'] = pq.pauseid
+ logger.debug("PAUSEID = \"%s\"" % extravalues['PAUSEID'])
+ aq = AuthorQuery(pauseid=pq.pauseid)
+ logger.debug("AuthorQuery.author = \"%s\"" % aq.author)
+ if aq.author != None:
+ extravalues['AUTHOR'] = aq.author
+ logger.debug("AUTHOR = \"%s\"" % extravalues['AUTHOR'])
+ classes.append('cpan')
+ handled.append('buildsystem')
+ absq = AbstractQuery(pn=data['name'], pv=data['version'])
+ if absq.abstract != None:
+ extravalues['SUMMARY'] = absq.abstract
+ logger.info("SUMMARY = \"%s\"" % extravalues['SUMMARY'])
+ hpq = HomepageQuery(pn=data['name'], pv=data['version'])
+ if hpq.homepage != None:
+ extravalues['HOMEPAGE'] = hpq.homepage
+ logger.info("HOMEPAGE = \"%s\"" % extravalues['HOMEPAGE'])
+ btq = BugtrackerQuery(pn=data['name'], pv=data['version'])
+ if btq.bugtracker != None:
+ extravalues['BUGTRACKER'] = btq.bugtracker
+ logger.info("BUGTRACKER = \"%s\"" % extravalues['BUGTRACKER'])
+ lq = LicenseQuery(pn=data['name'], pv=data['version'])
+ # if no license in response, try looking for LICENSE file and match text
+ # otherwise, look in README for typical copyright/license clause
+ # finally, punt and leave it to the user
+ try:
+ license_file = RecipeHandler.checkfiles(srctree, ['LICENSE'])[0]
+ except IndexError:
+ license_file = False
+ try:
+ readme_file = RecipeHandler.checkfiles(srctree, ['README'])[0]
+ except IndexError:
+ readme_file = False
+ if license_file:
+ if "under the same terms as Perl itself." in open(license_file, 'r').read():
+ extravalues['LICENSE'] = "Artistic-1.0 | GPL-1.0+"
+ logger.info("LICENSE = \"%s\"" % extravalues['LICENSE'])
+ else:
+ # figure out another way to determine the license from the license file
+ extravalues['LICENSE'] = "Unknown"
+ logger.debug("LICENSE = \"%s\"" % extravalues['LICENSE'])
+ perl_license = re.compile(r"This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.")
+ with open(license_file, 'r') as f:
+ logger.info("LICENSE: %s" % f.read())
+ logger.debug('re.search %s ' % re.search("under the same terms as Perl itself", f.read()))
+ logger.debug('perl_license.search %s ' % perl_license.search(f.read()))
+ logger.debug('perl_license.match %s ' % perl_license.match(f.read()))
+ if perl_license.match(f.read()):
+ logger.debug('LICENSE file matches perl_5 license')
+ extravalues['LICENSE'] = "Artistic-1.0 | GPL-1.0+"
+ if readme_file:
+ # need to match COPYRIGHT text and use beginline endline
+ if "under the same terms as Perl itself." in open(readme_file, 'r').read():
+ # need to handle similar to guess_license in create.py
+ extravalues['LICENSE'] = "Artistic-1.0 | GPL-1.0+"
+ logger.info("LICENSE = \"%s\"" % extravalues['LICENSE'])
+ else:
+ # figure out another way to determine the license from the readme file
+ extravalues['LICENSE'] = "Unknown"
+ logger.info("LICENSE = \"%s\"" % extravalues['LICENSE'])
+ elif lq.license != None:
+ extravalues['LICENSE'] = lq.license
+ logger.info("LICENSE = \"%s\"" % extravalues['LICENSE'])
+ deps = data.get('dependencies', {})
+ logger.debug(deps)
+ bdq = BuildDependsQuery(pn=data['name'], pv=data['version'])
+
+ #updated = self._handle_dependencies(tinfoil.config_data, deps, lines_before, srctree)
+ #if updated:
+ # We need to redo the license stuff
+ # self._replace_license_vars(srctree, lines_before, handled, extravalues, tinfoil.config_data)
+ # if line.startswith('LICENSE = '):
+ # lines_before[i] = 'LICENSE = "%s"' % ' & '.join(all_licenses)
+
+ # Need to move S setting after inherit npm
+ for i, line in enumerate(lines_before):
+ if line.startswith('S ='):
+ lines_before.pop(i)
+ lines_after.insert(0, '# Must be set after inherit npm since that itself sets S')
+ lines_after.insert(1, line)
+ break
+
+ return True
+
+ return False
+
+# def _handle_dependencies(self, d, deps, lines_before, srctree):
+# import scriptutils
+ #declared_build_deps = #_build_dependency_query()
+ #declared_runtime_deps = #_runtime_dependency_query()
+ #declared_test_deps = #_test_dependency_query()
+# return declared_build_deps
+
+def register_recipe_handlers(handlers):
+ handlers.append((CpanRecipeHandler(), 80))
+
+# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/scripts/lib/recipetool/metacpan/__init__.py b/scripts/lib/recipetool/metacpan/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/scripts/lib/recipetool/metacpan/__init__.py
diff --git a/scripts/lib/recipetool/metacpan/query.py b/scripts/lib/recipetool/metacpan/query.py
new file mode 100644
index 00000000000..4b1725a6831
--- /dev/null
+++ b/scripts/lib/recipetool/metacpan/query.py
@@ -0,0 +1,535 @@
+import json
+import logging
+import re
+import requests
+import scriptutils
+import string
+
+DEBUG = False
+
+logger = logging.getLogger('recipetool')
+
+class MetaCPANQuery(object):
+
+ def __init__(self):
+ pass
+
+class GetQuery(MetaCPANQuery):
+
+ def __init__(self, params=None):
+ self.params = params
+
+
+class PostQuery(MetaCPANQuery):
+ url = "https://fastapi.metacpan.org/v1/_search"
+
+ def __init__(self,
+ url="https://fastapi.metacpan.org/v1/_search",
+ data=None):
+ self.url = url
+ self.data = data
+ super(MetaCPANQuery, self).__init__()
+
+
+class ReleaseQuery(PostQuery):
+ url = 'https://fastapi.metacpan.org/v1/release/_search'
+
+ def __init__(self,
+ url='https://fastapi.metacpan.org/v1/release/_search',
+ data=None, pn=None, pv=None, fields=[]):
+ self.pn = pn
+ self.pv = pv
+ self.fields = fields
+ self.release = { 'release': self.pn,
+ 'version': self.pv }
+ self.query = {"query": { 'match_all':{} }}
+ self.query["fields"] = self.fields
+ self.query["filter"] = { 'and':
+ [{'term': {'distribution': '%s' % self.pn}},
+ {'term': {'version': '%s' % self.pv}}]}
+ self.data = json.dumps(self.query)
+ super(ReleaseQuery, self).__init__(url=url, data=self.data)
+ self.url = url
+
+ def _query(self):
+ r = requests.post(url=self.url,data=self.data)
+ if r.status_code == 200:
+ return r
+ else:
+ logger.error( "ReleaseQuery => Response: %s" % r.status_code )
+ return None
+
+
+class PauseIdQuery(ReleaseQuery):
+
+ def __init__(self, pn, pv):
+ self.pn = pn
+ self.pv = pv
+ self.fields = ["author"]
+ super(PauseIdQuery, self).__init__(self, pn=self.pn, pv=self.pv, fields=self.fields)
+ self.url = ReleaseQuery.url
+ self.pauseid = self._pauseid_query()
+
+ def _pauseid_query(self):
+ r = ReleaseQuery._query(self)
+ #logger.debug("_pauseid_query: r.json(): %s " % r.json())
+ #logger.debug("_pauseid_query: r.json().get('hits'): %s " % r.json().get('hits'))
+ if r != None:
+ self.pauseid = r.json().get('hits').get('hits')[0].get('fields').get('author')
+ # TODO: add to file data : print( "PAUSEID: %s" % result )
+ return self.pauseid
+ else:
+ logger.error( "PauseIdQuery => Response: %s" % r.status_code )
+ self.pauseid = None
+ return self.pauseid
+
+
+class AuthorQuery(PostQuery):
+
+ def __init__(self,
+ url='https://fastapi.metacpan.org/v1/author/_search',
+ pauseid=''):
+ self.url = url
+ self.pauseid = pauseid
+ self.query = {"query": { "match_all":{} }}
+ self.query["fields"] = ["name"]
+ self.query["filter"] = {"term": {"pauseid": "%s" % self.pauseid}}
+ self.data = json.dumps(self.query)
+ super(AuthorQuery, self).__init__(url=self.url, data=self.data)
+ self.author = self._author_query()
+
+ def _author_query(self):
+ logger.debug("metacpan.query._author_query.query = %", self.data )
+ r = requests.post(url=self.url,data=self.data)
+ if r.status_code == 200:
+ logger.debug("metacpan.query._author_query.r = %", r.json())
+ self.author = r.json().get('hits').get('hits')[0].get('fields').get('name')
+ # TODO: add to file data: print( "AUTHOR = \"%s\"" % result )
+ return self.author
+ else:
+ logger.error( "AuthorQuery => Response: %s" % r.status_code )
+ self.author = None
+ return self.author
+
+class AbstractQuery(ReleaseQuery):
+
+ def __init__(self, pn, pv):
+ self.pn = pn
+ self.pv = pv
+ self.fields = ["abstract"]
+ super(AbstractQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields)
+ self.url = ReleaseQuery.url
+ self.abstract = self._abstract_query()
+
+ def _abstract_query(self):
+ r = ReleaseQuery._query(self)
+ if r != None:
+ self.abstract = r.json().get('hits').get('hits')[0].get('fields').get('abstract')
+ return self.abstract
+ else:
+ logger.error( "AbstractQuery => Response: %s" % r.status_code )
+ self.abstract = None
+ return self.abstract
+
+
+class HomepageQuery(ReleaseQuery):
+ """
+ {
+ "query": {
+ "match_all": {}
+ },
+ "size": 10,
+ "fields": [ "distribution", "version", "resources.homepage" ],
+ "filter": {
+ "and": [
+ { "term": {"maturity": "released"} },
+ { "term": {"status": "latest"} },
+ { "exists" : { "field" : "resources.homepage" } }
+ ]
+ }
+ }
+ """
+ def __init__(self, pn, pv):
+ logger.debug("HomepageQuery: __init__")
+ self.pn = pn
+ self.pv = pv
+ self.fields = ["resources.homepage"]
+ super(HomepageQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields)
+ self.url = ReleaseQuery.url
+ self.homepage = self._homepage_query()
+
+ def _homepage_query(self):
+ #logger.debug("HomepageQuery: _homepage_query")
+ r = ReleaseQuery._query(self)
+ #logger.debug("_homepage_query: r.json().get('hits').get('hits')[0]: %s" % r.json().get('hits').get('hits')[0])
+ if r.json().get('hits').get('hits')[0].get('fields') != None:
+ self.homepage = r.json().get('hits').get('hits')[0].get('fields').get('resources.homepage')
+ return self.homepage
+ else:
+ if r.status_code == 200:
+ logger.warn( "HomepageQuery: No 'homepage' in response")
+ else:
+ logger.error( "HomepageQuery => Response: %s" % r.status_code )
+ self.homepage = None
+ return self.homepage
+
+
+class BugtrackerQuery(ReleaseQuery):
+
+ def __init__(self, pn, pv):
+ logger.debug("BugtrackerQuery: __init__")
+ self.pn = pn
+ self.pv = pv
+ self.fields = ["resources.bugtracker.web"]
+ super(BugtrackerQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields)
+ self.url = ReleaseQuery.url
+ self.bugtracker = self._bugtracker_query()
+
+ def _bugtracker_query(self):
+ #logger.debug("BugtrackerQuery: _bugtracker_query")
+ r = ReleaseQuery._query(self)
+ #logger.debug("_bugtracker_query: r.json().get('hits').get('hits')[0]: %s" % r.json().get('hits').get('hits')[0])
+ if r.json().get('hits').get('hits')[0].get('fields') != None:
+ self.bugtracker = r.json().get('hits').get('hits')[0].get('fields').get('resources.bugtracker.web')
+ return self.bugtracker
+ else:
+ if r.status_code == 200:
+ logger.warn( "BugtrackerQuery: No 'bugtracker' in response")
+ else:
+ logger.error( "BugtrackerQuery => Response: %s" % r.status_code )
+ self.bugtracker = None
+ return self.bugtracker
+
+
+class LicenseQuery(ReleaseQuery):
+
+ def __init__(self, pn, pv):
+ self.pn = pn
+ self.pv = pv
+ self.fields = ["license"]
+ super(LicenseQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields)
+ self.url = ReleaseQuery.url
+ self.license = self._license_query()
+
+ def _license_query(self):
+ r = ReleaseQuery._query(self)
+ logger.debug("_license_query: r => %s" % len(r.json().get('hits').get('hits')))
+ logger.debug("_license_query: r => %s" % len(r.json().get('hits').get('hits')[0]))
+ if len(r.json().get('hits').get('hits')) > 0 and r.json().get('hits').get('hits')[0].get('fields') != None:
+ raw_license = r.json().get('hits').get('hits')[0].get('fields').get('license')
+ logger.debug("_license_query: raw_license => %s" % raw_license )
+ if raw_license == 'perl_5':
+ self.license = "Artistic-1.0 | GPL-1.0+"
+ return self.license
+ else:
+ if r.status_code == 200:
+ logger.warn( "LicenseQuery: No 'license' in response")
+ else:
+ logger.error( "LicenseQuery => Response: %s" % r.status_code )
+ self.license = "Unknown"
+ return self.license
+
+
+class BuildDependsQuery(ReleaseQuery):
+
+ def __init__(self, pn, pv):
+ self.pn = pn
+ self.pv = pv
+ self.fields = ["prereqs.configure.requires"]
+ super(BuildDependsQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields)
+ self.url = ReleaseQuery.url
+ self.build_depends = self._build_dependency_query()
+
+ def _build_dependency_query(self):
+ r = ReleaseQuery._query(self)
+ logger.debug("_build_dependency_query: query => %s " % self.data)
+ logger.debug("_build_dependency_query: r.json => %s " % r.json())
+ if r.json().get('hits').get('hits')[0].get('fields') != None:
+ logger.debug("_build_dependency_query: %s" % r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('prereqs.configure.requires')
+ mylist = list(result)
+ deps = ' '.join([dep for dep in mylist if dep is not ''])
+ inherit = 'inherit cpan'
+ if u'ExtUtils::MakeMaker' in deps:
+ inherit = 'inherit cpan'
+ deps = re.sub(u'ExtUtils::MakeMaker', '', deps)
+ elif u'Module::Build' in deps:
+ inherit = 'inherit cpan_build'
+ deps = re.sub(u'Module::Build', '', deps)
+ else:
+ logger.warn('Failed to interpret build engine defaulting to \"cpan\"')
+ inherit = 'inherit cpan'
+ deps = re.sub(u'ExtUtils::MakeMaker', '', deps)
+ deps = deps.strip() # strip leading or trailing whitespace
+ modules = deps.split()
+ distribution = list()
+ for module in modules:
+ distribution.append(_module_to_distribution(module)['distribution'])
+ if distribution:
+ depends = ' '.join([dist for dist in distribution if dist is not ''])
+ logger.warn("DEPENDS = \"%s\"" % depends)
+ logger.warn( inherit )
+ return result
+ else:
+ if r.status_code == 200:
+ logger.warn( "BuildDependsQuery: No 'prereqs.configure.requires' in response")
+ else:
+ logger.error( "BuildDepndsQuery => Response: %s" % r.status_code )
+ return None
+
+
+class ModuleQuery(GetQuery):
+
+ def __init__(self, module):
+ self.module = module
+ self.distribution = ''
+ self.version = ''
+
+
+# NOTE: must have exact distribution name and exact version to get only one hit
+pn = "Moo"
+pv = "2.002004"
+#url = "https://fastapi.metacpan.org/v1/release/_search"
+
+
+""" /module/<module> is a convenience GET URL """
+def _module_to_distribution(module):
+ module_url = "http://fastapi.metacpan.org/v1/module/%s" % module
+ r = requests.get(url=module_url)
+ if DEBUG: print( r.url )
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ distribution = r.json().get('distribution')
+ version = r.json().get('version')
+ if DEBUG: print( "\"%s\" => \"%s\", \"%s\"" % ( module, distribution, version ))
+ return { "distribution": distribution, "version": version }
+ else:
+ print( "Response: %s" % r.status_code )
+ return None, None
+
+""" /module/<module> is a convenience GET URL """
+def _module_to_debian_naming(module):
+ module_url = "http://fastapi.metacpan.org/v1/module/%s" % module
+ r = requests.get(url=module_url)
+ if DEBUG: print( r.url )
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ name = r.json().get('path')
+ if DEBUG: print( "\"%s\" => \"%s\"" % ( module, name ))
+ name = re.sub('^lib/', 'lib', name)
+ name = re.sub('\.pm$', '-perl', name)
+ name = re.sub('/', '-', name)
+ name = name.encode('utf-8').lower()
+ return name
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+""" /module/<module> is a convenience GET URL """
+def _distribution_to_debian_naming(module):
+ module_url = "http://fastapi.metacpan.org/v1/module/%s" % module
+ r = requests.get(url=module_url)
+ if DEBUG: print( r.url )
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ name = r.json().get('path')
+ if DEBUG: print( "\"%s\" => \"%s\"" % ( module, name ))
+ name = re.sub('^lib/', 'lib', name)
+ name = re.sub('\.pm$', '-perl', name)
+ name = re.sub('/', '-', name)
+ return name
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+""" Returns 'abstract' which is what is known as 'SUMMARY' in OE """
+def _abstract_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['abstract'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('abstract')
+ print( "SUMMARY = \"%s\"" % result)
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+""" This is not often populated """
+def _homepage_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['resources.homepage'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ try:
+ result = r.json().get('hits').get('hits')[0].get('fields').get('resources.homepage')
+ except:
+ result = "https://metacpan.org/pod/%s" % pn
+ print( "HOMEPAGE = \"%s\"" % result)
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+""" This query will return the license 'perl_5' """
+def _license_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['license'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('license')
+ if result == 'perl_5': result = 'Artistic-1.0 | GPL-1.0+'
+ print( "LICENSE = \"%s\"" % result)
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+def _pauseid_query(pn, pv):
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['author'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ logger.debug( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ logger.debug( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('author')
+ print( "PAUSEID: %s" % result )
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+def _author_query(pn, pv):
+ author_url = "http://fastapi.metacpan.org/v1/author/_search"
+ self.query = {'query': { 'match_all':{} }}
+ self.query['fields'] = ['name']
+ self.query['filter'] = { 'term': {'pauseid': '%s' % self.pauseid}}
+ query = json.dumps(self.query)
+ print( query )
+ #logger.debug(print( query ))
+ r = requests.post(url=author_url,data=query)
+ if r.status_code == 200:
+ #logger.debug(print( r.json() ))
+ result = r.json().get('hits').get('hits')[0].get('fields').get('name')
+ print( "AUTHOR = \"%s\"" % result )
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+def _build_dependency_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['metadata.prereqs.configure.requires'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('metadata.prereqs.configure.requires')
+ mylist = list(result)
+ deps = ' '.join([dep for dep in mylist if dep is not ''])
+ inherit = 'inherit cpan'
+ if u'ExtUtils::MakeMaker' in deps:
+ inherit = 'inherit cpan'
+ deps = re.sub(u'ExtUtils::MakeMaker', '', deps)
+ elif u'Module::Build' in deps:
+ inherit = 'inherit cpan_build'
+ deps = re.sub(u'Module::Build', '', deps)
+ else:
+ print( 'Failed to interpret build engine defaulting to \"cpan\"')
+ deps = deps.strip() # strip leading or trailing whitespace
+ modules = deps.split()
+ distribution = list()
+ for module in modules:
+ distribution.append(_module_to_distribution(module)['distribution'])
+ if distribution:
+ depends = ' '.join([dist for dist in distribution if dist is not ''])
+ print( "DEPENDS = \"%s\"" % depends )
+ print( inherit )
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+def _runtime_dependency_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['metadata.prereqs.runtime.requires'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('metadata.prereqs.runtime.requires')
+ mylist = list(result)
+ deps = ' '.join([dep for dep in mylist if dep is not ''])
+ deps.strip()
+ modules = deps.split()
+ distribution = list()
+ for module in modules:
+ distribution.append(_module_to_distribution(module)['distribution'])
+ if distribution:
+ rdepends = ' '.join([dist for dist in distribution if dist is not ''])
+ print( "RDEPENDS_${PN} = \"%s\"" % rdepends )
+ return rdepends
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+def _test_dependency_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['metadata.prereqs.test.requires'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('metadata.prereqs.test.requires')
+ mylist = list(result)
+ deps = ' '.join([dep for dep in mylist if dep is not ''])
+ modules = deps.split()
+ distribution = list()
+ for module in modules:
+ distribution.append(_module_to_distribution(module)['distribution'])
+ if distribution:
+ rdepends = ' '.join([dist for dist in distribution if dist is not ''])
+ print( "RDEPENDS_${PN}-ptest = \"%s\"" % rdepends )
+ return rdepends
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+def _provides_query():
+ query = json.dumps({'query': { 'match_all':{} }, 'fields': ['provides'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}})
+ if DEBUG: print( query )
+ r = requests.post(url=url,data=query)
+ if r.status_code == 200:
+ if DEBUG: print( r.json() )
+ result = r.json().get('hits').get('hits')[0].get('fields').get('provides')
+ mylist = list(result)
+ # 'provides' which start with underscore are always internal only
+ provides = ' '.join([provide for provide in mylist if provide is not '' and not '::_' in provide])
+ modules = provides.split()
+ for module in modules:
+ provides = ' '.join([_module_to_debian_naming( module ) for module in modules])
+ print( "PROVIDES_${PN} = \"%s\"" % provides )
+ return result
+ else:
+ print( "Response: %s" % r.status_code )
+ return None
+
+if __name__ == "__main__":
+ #DEBUG = True
+ _abstract_query()
+ _bugtracker_query()
+ _homepage_query()
+ _license_query()
+ _author_query()
+ _build_dependency_query()
+ _runtime_dependency_query()
+ _test_dependency_query()
+ _provides_query()
+ _module_to_debian_naming()
+# TODO: FILES_${PN}-ptest = "/t" and a reasonable run-ptest script
+# perl Makefile.pl / make test => something better?
+# strip makefile and only package test goal?
+#
+# TODO: map module name to perl-* or lib*-perl
+# use generated lookup table for perl-* mapping
+# might need to build all of meta-perl before mapping lib*-perl
+# or use a versioned generated lookup table