def search_for_builddep(module): try: if not isinstance(module, _Npm2Deb): _debug(1, 'getting builddep - calling npm view %s' % module) npm_out = _getstatusoutput('npm view "%s" ' 'devDependencies --json 2>/dev/null' % module)[1] builddeb = _parseJSON(npm_out) else: builddeb = module.json['devDependencies'] module = module.name except ValueError: return None mapper = _Mapper.get_instance() result = {} for dep in sorted(builddeb.keys()): result[dep] = {} result[dep]['version'] = builddeb[dep] result[dep]['debian'] = mapper.get_debian_package(dep)['repr'] print_formatted_dependency("%s (%s)" % (dep, result[dep]['version']), result[dep]['debian']) return result
def read_package_info(self): data = None name_is = None if _re.match("^(http:\/\/|https:\/\/)", self.name): utils.debug(1, "reading json - opening url %s" % self.name) data = _urlopen(self.name).read().decode('utf-8') name_is = 'url' elif _os.path.isfile(self.name): utils.debug(1, "reading json - opening file %s" % self.name) with open(self.name, 'r') as fd: data = fd.read() name_is = 'file' else: name_is = 'npm' utils.debug(1, "reading json - calling npm view %s" % self.name) info = _getstatusoutput('npm view "%s" --json 2>/dev/null' % self.name) # if not status 0, raise expection if info[0] != 0: info = _getstatusoutput('npm view "%s" --json' % self.name) exception = 'npm reports errors about %s module:\n' % self.name exception += info[1] raise ValueError(exception) if not info[1]: exception = 'npm returns empty json for %s module' % self.name raise ValueError(exception) data = info[1] try: self.json = _parseJSON(data) except ValueError as value_error: # if error during parse, try to fail graceful if str(value_error) == 'Expecting value: line 1 column 1 (char 0)': if name_is != 'npm': raise ValueError("Data read from %s " "is not in a JSON format." % name_is) versions = [] for line in data.split('\n'): if _re.match(r"^[a-z](.*)@[0-9]", line): version = line.split('@')[1] versions.append(version) if len(versions) > 0: exception = "More than one version found. "\ "Please specify one of:\n %s" % '\n '.join(versions) raise ValueError(exception) else: raise value_error else: raise value_error self.name = self.json['name'] self._get_json_author() self._get_json_repo_url() self._get_json_homepage() self._get_json_description() self._get_json_version() self._get_json_license()
def __init__(self): if self.INSTANCE is not None: raise ValueError("Mapper is a Singleton. " "Please use get_instance method.") _debug(2, 'loading database from %s' % DB_URL) data = _findall('{{{(.*)}}}', _urlopen("%s?action=raw" % DB_URL).read().decode('utf-8').replace('\n', ''))[0] self.json = _parseJSON(data) self._warnings = {} self.reset_warnings()
def get_debian_package(self, node_module): result = {} result['info'] = None result['name'] = None result['version'] = None result['suite'] = None result['repr'] = None db_package = None if node_module in self.json: db_package = self.json[node_module] else: for pattern in self.json.keys(): if _fnmatch(node_module, pattern): db_package = self.json[pattern] break if db_package: if 'replace' in db_package: result['name'] = db_package['replace'] if 'info' in db_package: result['info'] = ('info', db_package['info']) self.append_warning('info', node_module, db_package['info']) elif 'warning' in db_package: result['info'] = ('warning', db_package['warning']) self.append_warning('warning', node_module, db_package['warning']) elif 'error' in db_package: result['info'] = ('error', db_package['error']) self.append_warning('error', node_module, db_package['error']) else: result['name'] = 'node-%s' % _debianize_name(node_module) if not result['name']: return result data = _urlopen(MADISON_URL % result['name']).read().decode('utf-8') packages = _parseJSON(data) if len(packages) < 1: result['name'] = None return result result['version'] = '0:0' for suite, versions in packages[0][result['name']].items(): for version, source in versions.items(): if apt_pkg.version_compare(version, result['version']) > 0: result['version'] = version result['suite'] = suite result['name'] = source['source'] result['repr'] = '%s (%s)' % (result['name'], result['version']) result['version'] = result['version'] if result['version'] == '0:0': result['version'] = None return result
def __init__(self): if self.INSTANCE is not None: raise ValueError("Mapper is a Singleton. " "Please use get_instance method.") _debug(2, 'loading database from %s' % DB_URL) data = _findall( '{{{(.*)}}}', _urlopen("%s?action=raw" % DB_URL).read().decode('utf-8').replace( '\n', ''))[0] self.json = _parseJSON(data) self._warnings = {} self.reset_warnings()
def search_for_dependencies(module, recursive=False, force=False, prefix=u'', expanded_dependencies=[]): try: if not isinstance(module, _Npm2Deb): _debug(1, 'getting dependencies - calling npm view %s' % module) npm_out = _getstatusoutput('npm view "%s" ' 'dependencies --json 2>/dev/null' % module)[1] dependencies = _parseJSON(npm_out) else: dependencies = module.json['dependencies'] module = module.name except ValueError: return None mapper = _Mapper.get_instance() result = {} keys = sorted(list(dependencies.keys())) last_dep = False for dep in keys: if dep == keys[-1]: last_dep = True result[dep] = {} result[dep]['version'] = dependencies[dep] result[dep]['debian'] = mapper.get_debian_package(dep)['repr'] dep_prefix = u'└─' if last_dep else u'├─' print_formatted_dependency( u"%s %s (%s)" % (dep_prefix, dep, result[dep]['version']), result[dep]['debian'], prefix) if recursive and not dep in expanded_dependencies: expanded_dependencies.append(dep) if (result[dep]['debian'] and force) or \ result[dep]['debian'] is None: new_prefix = "%s%s " % (prefix, u" " if last_dep else u"│ ") result[dep]['dependencies'] = \ search_for_dependencies(dep, recursive, force, new_prefix, expanded_dependencies) else: result[dep]['dependencies'] = None return result
def search_for_reverse_dependencies(module): if isinstance(module, _Npm2Deb): module = module.name url = "http://registry.npmjs.org/-/_view/dependedUpon?startkey=" \ + "[%%22%(name)s%%22]&endkey=[%%22%(name)s%%22,%%7B%%7D]&group_level=2" url = url % {'name': module} _debug(1, "opening url %s" % url) data = _urlopen(url).read().decode('utf-8') data = _parseJSON(data) result = [] if 'rows' in data and len(data['rows']) > 0: my_print("Reverse Depends:") for row in data['rows']: dependency = row['key'][1] result.append(dependency) my_print(" %s" % dependency) else: my_print("Module %s has no reverse dependencies" % module) return result
def search_for_dependencies(module, recursive=False, force=False, prefix=u'', expanded_dependencies=[]): try: if not isinstance(module, _Npm2Deb): _debug(1, 'getting dependencies - calling npm view %s' % module) npm_out = _getstatusoutput('npm view "%s" ' 'dependencies --json 2>/dev/null' % module)[1] dependencies = _parseJSON(npm_out) else: dependencies = module.json['dependencies'] module = module.name except ValueError: return None mapper = _Mapper.get_instance() result = {} keys = sorted(list(dependencies.keys())) last_dep = False for dep in keys: if dep == keys[-1]: last_dep = True result[dep] = {} result[dep]['version'] = dependencies[dep] result[dep]['debian'] = mapper.get_debian_package(dep)['repr'] dep_prefix = u'└─' if last_dep else u'├─' print_formatted_dependency(u"%s %s (%s)" % (dep_prefix, dep, result[dep]['version']), result[dep]['debian'], prefix) if recursive and not dep in expanded_dependencies: expanded_dependencies.append(dep) if (result[dep]['debian'] and force) or \ result[dep]['debian'] is None: new_prefix = "%s%s " % (prefix, u" " if last_dep else u"│ ") result[dep]['dependencies'] = \ search_for_dependencies(dep, recursive, force, new_prefix, expanded_dependencies) else: result[dep]['dependencies'] = None return result
def search_in_new(module): if isinstance(module, _Npm2Deb): module = module.name my_print('Looking for packages in NEW:') _debug(1, "calling new-check") found = False formatted = " {0:20} {1:>3}" url = "https://api.ftp-master.debian.org/sources_in_suite/new" _debug(1, "opening url %s" % url) data = _urlopen(url).read().decode('utf-8') data = _parseJSON(data) result = [] for package in data: name = package['source'] version = package['version'] if not module in name: continue found = True result.append(package) my_print(formatted.format(package['source'], package['version'])) if not found: my_print(" None") return result
def read_package_info(self): data = None name_is = None if _re.match("^(http://|https://)", self.name): utils.debug(1, "reading json - opening url %s" % self.name) data = _urlopen(self.name).read().decode('utf-8') name_is = 'url' elif _os.path.isfile(self.name) and tarfile.is_tarfile(self.name): utils.debug(1, "reading json - opening tarball %s" % self.name) pkgInfo = None with tarfile.open(self.name) as tarball: for info in tarball.getmembers(): if 'package.json' in info.name: pkgInfo = info break if pkgInfo is None: raise ValueError("package.json file not found in tarball") data = tarball.extractfile(pkgInfo).read() name_is = 'tarfile' elif _os.path.isfile(self.name): utils.debug(1, "reading json - opening file %s" % self.name) with open(self.name, 'r') as fd: data = fd.read() name_is = 'file' else: name_is = 'npm' utils.debug( 1, "reading json - calling npm view %s@%s" % (self.name, self.version)) info = _getstatusoutput('npm view "%s@%s" --json 2>/dev/null' % (self.name, self.version)) # if not status 0, raise expection if info[0] != 0: info = _getstatusoutput('npm view "%s@%s" --json' % (self.name, self.version)) exception = 'npm reports errors about %s module:\n' % self.name exception += info[1] raise ValueError(exception) if not info[1]: exception = 'npm returns empty json for %s module' % self.name raise ValueError(exception) data = info[1] try: self.json = _parseJSON(data) except ValueError as value_error: # if error during parse, try to fail graceful if str(value_error) == 'Expecting value: line 1 column 1 (char 0)': if name_is != 'npm': raise ValueError("Data read from %s " "is not in a JSON format." % name_is) versions = [] for line in data.split('\n'): if _re.match(r"^[a-z](.*)@[0-9]", line): version = line.split('@')[1] versions.append(version) if len(versions) > 0: exception = "More than one version found. "\ "Please specify one of:\n %s" % '\n '.join(versions) raise ValueError(exception) else: raise value_error else: raise value_error self.name = self.json['name'] self._get_json_author() self._get_json_repo_url() self._get_json_homepage() self._get_json_description() self._get_json_version() self._get_json_license()