def setup(self): """ Return a tuple of (list of all plugin classes, list of all options of all plugin classes). Load and validate available plugins for this PluginManager from its assigned `entrypoint`. Raise a ScancodeError if a plugin is not valid such that when it does not subcclass the manager `plugin_base_class`. Must be called once to setup the plugins of this manager. """ if self.initialized: return # FIXME: this should be part of the plugincode tree from scancode import CommandLineOption entrypoint = self.entrypoint try: self.manager.load_setuptools_entrypoints(entrypoint) except ImportError as e: raise e stage = self.stage plugin_options = [] plugin_classes = [] required_plugins = set() for name, plugin_class in self.manager.list_name_plugin(): if not issubclass(plugin_class, self.plugin_base_class): qname = '%(stage)s:%(name)s' % locals() plugin_base_class = self.plugin_base_class from scancode import ScancodeError #NOQA raise ScancodeError( 'Invalid plugin: %(qname)r: %(plugin_class)r ' 'must extend %(plugin_base_class)r.' % locals()) for option in plugin_class.options: if not isinstance(option, CommandLineOption): qname = '%(stage)s:%(name)s' % locals() oname = option.name clin = CommandLineOption from scancode import ScancodeError #NOQA raise ScancodeError( 'Invalid plugin: %(qname)r: option %(oname)r ' 'must extend %(clin)r.' % locals()) plugin_options.append(option) plugin_class.stage = stage plugin_class.name = name plugin_classes.append(plugin_class) self.plugin_classes = sorted(plugin_classes, key=lambda c: (c.sort_order, c.name)) self.initialized = True return self.plugin_classes, plugin_options
def get_emails(location, threshold=50, test_slow_mode=False, test_error_mode=False, **kwargs): """ Return a mapping with a single 'emails' key with a value that is a list of mappings for emails detected in the file at `location`. Return only up to `threshold` values. Return all values if `threshold` is 0. If test_mode is True, the scan will be slow for testing purpose and pause for one second. """ if test_error_mode: raise ScancodeError('Triggered email failure') if test_slow_mode: import time time.sleep(1) from cluecode.finder import find_emails results = [] found_emails = ((em, ln) for (em, ln) in find_emails(location) if em) if threshold: found_emails = islice(found_emails, threshold) for email, line_num in found_emails: result = OrderedDict() results.append(result) result['email'] = email result['start_line'] = line_num result['end_line'] = line_num return dict(emails=results)
def load_plugins(cls): """ Setup the plugins enviroment. Must be called once to initialize all the plugins of all managers. """ plugin_classes = [] plugin_options = [] for stage, manager in cls.managers.items(): mgr_setup = manager.setup() if not mgr_setup: from scancode import ScancodeError msg = 'Cannot load ScanCode plugins for stage: %(stage)s' % locals() raise ScancodeError(msg) mplugin_classes, mplugin_options = mgr_setup plugin_classes.extend(mplugin_classes) plugin_options.extend(mplugin_options) return plugin_classes, plugin_options
def run_extractcode(location, options=None, raise_on_error=False): """ Extract content at `location` with extractcode. Optional arguments for the `extractcode` executable can be provided with the `options` list. If `raise_on_error` is enabled, a ScancodeError will be raised if the exitcode greater than 0. """ extractcode_args = [ pipes.get_bin_executable("extractcode"), shlex.quote(location), ] if options: extractcode_args.extend(options) exitcode, output = pipes.run_command(extractcode_args) if exitcode > 0 and raise_on_error: raise ScancodeError(output) return exitcode, output
def run_scancode(location, output_file, options, raise_on_error=False): """ Scan `location` content and write results into `output_file`. The `scancode` executable will be run using the provided `options`. If `raise_on_error` is enabled, a ScancodeError will be raised if the exitcode greater than 0. """ default_options = getattr(settings, "SCANCODE_DEFAULT_OPTIONS", []) scancode_args = [ pipes.get_bin_executable("scancode"), shlex.quote(location), *default_options, *options, f"--json-pp {shlex.quote(output_file)}", ] exitcode, output = pipes.run_command(scancode_args) if exitcode > 0 and raise_on_error: raise ScancodeError(output) return exitcode, output