diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d46dff9c8dc..c689443dabe 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,24 +1,21 @@ Changelog ========= -v21.x.x (next, future) +31.0.0 (next, roadmap) ----------------------- + Important API changes: ~~~~~~~~~~~~~~~~~~~~~~~~ -- The data structure of the JSON output is now versioned and the next version - is available with a new command line option. We are also documenting a new - and clear API policy and backward compatibility policy. - - The data structure of the JSON output has changed for copyrights, authors and holders: we now use proper name for attributes and not a generic "value". - The data structure of the JSON output has changed for licenses: we now return match details once for each matched license expression rather than once for each license in a matched expression. There is a new top-level - "licenses" attributes that contains the data details for each detected - licenses only once. This data can contain the reference license text + "license_references" attributes that contains the data details for each + detected licenses only once. This data can contain the reference license text as an option. - The data structure of the JSON output has changed for packages: we now @@ -27,9 +24,9 @@ Important API changes: that contains each package instance that can be aggregating data from multiple manifests for a single package instance. -- The data structure for HTML output has been changed to include emails and urls under the - "infos" object. Now HTML template will output holders, authors, emails, and - urls into separate tables like "licenses" and "copyrights". +- The data structure for HTML output has been changed to include emails and + urls under the "infos" object. Now HTML template will output holders, + authors, emails, and urls into separate tables like "licenses" and "copyrights". Copyright detection: ~~~~~~~~~~~~~~~~~~~~ @@ -39,45 +36,176 @@ Copyright detection: - Several copyright detection bugs have been fixed. +License detection: +~~~~~~~~~~~~~~~~~~~ + +- There have been significant license detection rules and licenses updates: + + - XX new licenses have been added, + - XX existing license metadata have been updated, + - XXXX new license detection rules have been added, and + - XXXX existing license rules have been updated. + + +Package detection: +~~~~~~~~~~~~~~~~~~ + +- We now support new package manifest formats: + - OpenWRT packages. + - Yocto/BitBake .bb recipes. + +- We now support track the files of Package types. + + +Outputs: +~~~~~~~~ + +- There is a new CycloneDX 1.2 output as XML and JSON. + + + +30.0.0 - 2021-09-23 +-------------------- + +This is a major release with new features, and several bug fixes and +improvements including major updates to the license detection. + +We have droped using calendar-based versions and are now switched back to semver +versioning. To ensure that there is no ambiguity, the new major version has been +updated from 21 to 30. The primary reason is that calver was not helping +integrators to track major version changes like semver does. + +We also have introduced a new JSON output format version based on semver to +version the JSON output format data structure and have documented the new +versioning approach. + + Package detection: ~~~~~~~~~~~~~~~~~~ -- Add support for OpenWRT packages. -- Add support for Yocto/BitBake .bb recipes. -- Add support to track installed files for each Package type. +- The Debian packages declared license detection in machine readable copyright + files and unstructured copyright has been significantly improved with the + tracking of the detection start and end line of a license match. This is not + yet exposed outside of tests but has been essential to help improve detection. + - Debian copyright license detection has been significantly improved with new license detection rules. +- Support for Windows packages has been improved (and in particular the handling + of Windows packages detection in the Windows registry). + +- Support for Cocoapod packages has been significantly revamped and is now + working as expected. + +- Support for PyPI packages has been refined, in particular package descriptions. + + + +Copyright detection: +~~~~~~~~~~~~~~~~~~~~ + +- The copyright detection accuracy has been improved and several bugs have been + fixed. + License detection: ~~~~~~~~~~~~~~~~~~~ -- There have been XXX new licenses added, YYY new license detection rules added - and ZZZ updated license or rules. +There have been some significant updates in license detection. We now track +34,164 license and license notices: + + - 84 new licenses have been added, + - 34 existing license metadata have been updated, + - 2765 new license detection rules have been added, and + - 2041 existing license rules have been updated. + - Several license detection bugs have fixed. -- The SPDX license list 3.14 is now supported. We also include the version - of the SPDX license list in the ScanCode JSON and SPDX outputs, as well as - display it with the --version command line option. +- The SPDX license list 3.14 is now supported and has been synced with the + licensedb. We also include the version of the SPDX license list in the + ScanCode YAML, JSON and the SPDX outputs, as well as display it with the + "--version" command line option. -- Unknown licenses have a new flag "is_unknown" to identify them - beyond just the naming convention of having "unknown" as part of their name. +- Unknown licenses have a new flag "is_unknown" in their metadata to identify + them explicitly. Before that we were just relying on the naming convention of + having "unknown" as part of a license key. - Rules that match at least one unknown license have a flag "has_unknown" set - in the returned match results. - -- There is a new experimental command line option "--unknown-licenses" to - detect unknown licenses and follow license references such as "See license in - file COPYING". The actual data structure for this new option is evolving. + and returned in the match results. +- Experimental: License detection can now "follow" license mentions that + reference another file such as "see license in COPYING" where we can relate + this mention to the actual license detected in the COPYING file. Use the new + "--unknown-licenses" command line option to test this new feature. + This feature will evolve significantly in the next version(s). -Many thanks to every contributors that made this possible and in particular: + +Outputs: +~~~~~~~~ + +- The SPDX output now has the mandatory ids attribute per SPDX spec. And we + support SPDX 2.2 and SPDX license list 3.14. + + +Miscellaneous +~~~~~~~~~~~~~~~ + +- There is a new "--no-check-version" CLI option to scancode to bypass live, + remote outdated version check on PyPI + +- The scan results and the CLI now display an outdated version warning when + the installed ScanCode version is older than 90 days. This is to warn users + that they are relying on outdated, likely buggy, insecure and inaccurate scan + results and encourage them to update to a newer version. This is made entirely + locally based on date comparisons. + +- We now display again the command line progressbar counters correctly. + +- A bug has been fixed in summarization. + +- Generated code detection has been improved with several new keywords. + + +Thank you! +~~~~~~~~~~~~ + +Many thanks to the many contributors that made this release possible and in +particular: - Akanksha Garg @akugarg +- Armijn Hemel @armijnhemel - Ayan Sinha Mahapatra @AyanSinhaMahapatra +- Bryan Sutula @sutula +- Chin-Yeung Li @chinyeungli +- Dennis Clark @DennisClark +- dyh @yunhua-deng +- Dr. Frank Heimes @FrankHeimes +- gunaztar @gunaztar +- Helio Chissini de Castro @heliocastro +- Henrik Sandklef @hesa +- Jiyeong Seok @dd-jy +- John M. Horan @johnmhoran - Jono Yang @JonoYang +- Joseph Heck @heckj +- Luis Villa @tieguy +- Konrad Weihmann @priv-kweihmann +- mapelpapel @mapelpapel +- Maximilian Huber @maxhbr +- Michael Herzog @mjherzog +- MMarwedel @MMarwedel +- Mikko Murto @mmurto +- Nishchith Shetty @inishchith +- Peter Gardfjäll @petergardfjall - Philippe Ombredanne @pombredanne +- Rainer Bieniek @rbieniek +- Roshan Thomas @Thomshan +- Sadhana @s4-2 +- Sarita Singh @itssingh +- Siddhant Khare @Siddhant-K-code +- Soim Kim @soimkim +- Thorsten Godau @tgodau +- Yunus Rahbar @yns88 v21.8.4 diff --git a/docs/source/misc/index.rst b/docs/source/misc/index.rst index 884e0416346..386c5448771 100644 --- a/docs/source/misc/index.rst +++ b/docs/source/misc/index.rst @@ -7,3 +7,4 @@ faq support perf_report + versioning diff --git a/docs/source/misc/versioning.rst b/docs/source/misc/versioning.rst new file mode 100644 index 00000000000..b87451a3f41 --- /dev/null +++ b/docs/source/misc/versioning.rst @@ -0,0 +1,57 @@ +.. versioning: + + +Versioning approach +========================== + +ScanCode is composed of code and data (mostly license data used for license +detection). In the past, we have tried using calver for code versioning to also +convey that the data contained in ScanCode was updated but it proved to be not +as clear and as effective as planned so we are switching back to semver which is +simpler and overall more useful for users. We also want to provide hints about +JSON output data format changes. + +Therefore, this is our versioning approach starting with version 30.0.0: + +- ScanCode releases are versioned using semver as documented at + https://semver.org using major.minor.patch versioning. + +- Significant changes to the data (license or copyright detection) is considered + a major version change even if there are no code changes. The rationale is + that in our case the data has the same impact as the code. Using outdated data + is like using old code and means that several licenses may not be detected + correctly. Any data change triggers at least a minor version change. + +- We will signal separately to users with warnings messages when ScanCode needs + to be upgraded because its data and/or code are out of date. + + +In addition to the main code version, we also maintain a secondary output data +format version using also semver with two segments. The versioning approach is +adapted for data this way: + +- The first segment --the major version-- is incremented when data attributes + that are removed, renamed, changed or moved (but not reordered) in the JSON + output. Reordering the attributes of a JSON object is not considered as a + change and does not trigger a version change. + +- The second segment --the minor version-- of the output format is incremented + for an addition of attributes to the JSON output. + +- We store the output format version string in the JSON output object as the + first attribute and display that also in the help. + +- This output format versioning applies only to the JSON, pretty-printed JSON, + YAML and JSON lines formats. It does not apply to CSV and any other formats. + For these other formats there is no versioning and guaranteed format stability + (or there may be some other rationale and convention for versioning like for + SPDX). + +- The output format version is incremented by when a new ScanCode tagged release + is published + +- We document in the CHANGELOG the output format changes in any new format version. + +- For any format version changes, we will provide a documentation on the format + and its updates using JSON examples and a comprehensive and updated data + dictionary. See https://github.com/nexB/scancode-toolkit/issues/2008 for details. diff --git a/src/cluecode/copyrights.py b/src/cluecode/copyrights.py index c8d0d63365a..fb257bef371 100644 --- a/src/cluecode/copyrights.py +++ b/src/cluecode/copyrights.py @@ -1591,7 +1591,7 @@ def from_node( (r'^[A-Z]+[.][A-Z][a-z]+[,]?$', 'NNP'), # proper noun with apostrophe ': D'Orleans, D'Arcy, T'so, Ts'o - (r"^[A-Z][[a-z]?['][A-Z]?[a-z]+[,.]?$", 'NNP'), + (r"^[A-Z][a-z]?['][A-Z]?[a-z]+[,.]?$", 'NNP'), # proper noun with apostrophe ': d'Itri (r"^[a-z]['][A-Z]?[a-z]+[,\.]?$", 'NNP'), diff --git a/src/packagedcode/pypi.py b/src/packagedcode/pypi.py index c0f5c0b9d6c..95d93a80ab9 100644 --- a/src/packagedcode/pypi.py +++ b/src/packagedcode/pypi.py @@ -1,3 +1,4 @@ + # # Copyright (c) nexB Inc. and others. All rights reserved. # ScanCode is a trademark of nexB Inc. @@ -129,6 +130,7 @@ def parse(location): parse_sdist, ) + # FIXME: this does not make sense # try all available parser in a well defined order for parser in parsers: package = parser(location) @@ -192,22 +194,13 @@ def parse_archive(location): if not location or not location.endswith(bdist_file_suffixes): return - metafile = find_archive_metafile(location) - if metafile: - return parse_metadata(metafile) - - -def find_archive_metafile(location): - """ - Return a Path-like object to a Python metafile found in a Python package egg - or wheel archive at ``location`` or None. - """ - zf = zipfile.ZipFile(location) - for path in ZipPath(zf).iterdir(): - if path.name.endswith(meta_dir_suffixes): + with zipfile.ZipFile(location) as zf: + for path in ZipPath(zf).iterdir(): + if not path.name.endswith(meta_dir_suffixes): + continue for metapath in path.iterdir(): if metapath.name.endswith(meta_file_names): - return metapath + return parse_metadata(metapath) sdist_file_suffixes = '.tar.gz', '.tar.bz2', '.zip', @@ -247,11 +240,9 @@ def parse_setup_py(location): setup_args = get_setup_py_args(location) - # FIXME: it may be legit to have a name-less package? + # it may be legit to have a name-less package? + # in anycase we do not want to fail because of that package_name = setup_args.get('name') - if not package_name: - return - urls, other_urls = get_urls(setup_args) detected_version = setup_args.get('version') @@ -359,18 +350,45 @@ def get_description(metainfo, location=None): # newer metadata versions use the payload for the description if hasattr(metainfo, 'get_payload'): description = metainfo.get_payload() + description = description and description.strip() or None if not description: # legacymetadata versions use the Description for the description description = get_attribute(metainfo, 'Description') if not description and location: # older metadata versions can use a DESCRIPTION.rst file - description = get_legacy_description( - fileutils.parent_directory(location)) + description = get_legacy_description(location=fileutils.parent_directory(location)) summary = get_attribute(metainfo, 'Summary') + description = clean_description(description) return build_description(summary, description) +def clean_description(description): + """ + Return a cleaned description text, removing extra leading whitespaces if + needed. Some metadata formats padd each description line with 8 spaces. Some + do not. We check first and cleanup if needed. + """ + # TODO: verify what is the impact of Description-Content-Type: if any + description = description or '' + description = description.strip() + lines = description.splitlines(False) + + space_padding = ' ' * 8 + + # we need cleaning if any of the first two lines starts with 8 spaces + need_cleaning = any(l.startswith(space_padding) for l in lines[:2]) + if not need_cleaning: + return description + + cleaned_lines = [ + line[8:] if line.startswith(space_padding) else line + for line in lines + ] + + return '\n'.join(cleaned_lines) + + def get_legacy_description(location): """ Return the text of a legacy DESCRIPTION.rst. @@ -732,7 +750,8 @@ def get_setup_py_args(location): for statement in tree.body: # We only care about function calls or assignments to functions named # `setup` or `main` - if not (isinstance(statement, (ast.Expr, ast.Call, ast.Assign)) + if not ( + isinstance(statement, (ast.Expr, ast.Call, ast.Assign)) and isinstance(statement.value, ast.Call) and isinstance(statement.value.func, ast.Name) # we also look for main as sometimes this is used instead of setup() diff --git a/src/scancode/cli.py b/src/scancode/cli.py index cd0eac6940d..54eb46c974f 100644 --- a/src/scancode/cli.py +++ b/src/scancode/cli.py @@ -439,6 +439,14 @@ def scancode( cliutils.validate_option_dependencies(ctx) pretty_params = get_pretty_params(ctx, generic_paths=test_mode) + # warn for outdated version and/or check for updates + from scancode.outdated import check_scancode_version_locally + outdated = check_scancode_version_locally() + + if not outdated and check_version: + from scancode.outdated import check_scancode_version_remotely + outdated = check_scancode_version_remotely() + # run proper success, _results = run_scan( input=input, @@ -459,17 +467,14 @@ def scancode( pretty_params=pretty_params, # results are saved to file, no need to get them back in a cli context return_results=False, - echo_func=echo_stderr, + echo_func=echo_func, + outdated=outdated, *args, **kwargs ) - # check for updates - if check_version: - from scancode.outdated import check_scancode_version - outdated = check_scancode_version() - if not quiet and outdated: - echo_stderr(outdated, fg='yellow') + if not quiet and outdated: + echo_stderr(outdated, fg='yellow') except click.UsageError as e: # this will exit @@ -503,6 +508,7 @@ def run_scan( test_error_mode=False, pretty_params=None, plugin_options=plugin_options, + outdated=None, *args, **kwargs ): @@ -844,6 +850,8 @@ def echo_func(*_args, **_kwargs): cle.notice = notice cle.options = pretty_params or {} cle.extra_data['spdx_license_list_version'] = scancode_config.spdx_license_list_version + if outdated: + cle.extra_data['OUTDATED'] = outdated # TODO: this is weird: may be the timings should NOT be stored on the # codebase, since they exist in abstract of it?? diff --git a/src/scancode/cli_test_utils.py b/src/scancode/cli_test_utils.py index 3ca7ea70506..2f7126cc9e8 100644 --- a/src/scancode/cli_test_utils.py +++ b/src/scancode/cli_test_utils.py @@ -12,7 +12,9 @@ import os import time +import saneyaml from commoncode.system import on_windows + from scancode_config import scancode_root_dir @@ -192,11 +194,12 @@ def check_json_scan( results.pop('headers', None) expected.pop('headers', None) - # NOTE we redump the JSON as a string for a more efficient display of the - # failures comparison/diff - expected = json.dumps(expected, indent=2, separators=(',', ': ')) - results = json.dumps(results, indent=2, separators=(',', ': ')) - assert results == expected + # NOTE we redump the JSON as a YAML string for easier display of + # the failures comparison/diff + if results != expected: + expected = saneyaml.dump(expected) + results = saneyaml.dump(results) + assert results == expected def load_json_result(location, remove_file_date=False): @@ -312,7 +315,7 @@ def check_jsonlines_scan( expected = json.load(res) streamline_jsonlines_scan(expected, remove_file_date) - + if not check_headers: results[0].pop('headers', None) expected[0].pop('headers', None) diff --git a/src/scancode/outdated.py b/src/scancode/outdated.py index 5bff8d56ec5..bce3241600c 100644 --- a/src/scancode/outdated.py +++ b/src/scancode/outdated.py @@ -5,7 +5,7 @@ # See http://www.apache.org/licenses/LICENSE-2.0 for the license text. # See https://github.com/nexB/scancode-toolkit for support or download. # See https://aboutcode.org for more information about nexB OSS projects. -## +# # # This code was in part derived from the pip library: # Copyright (c) 2008-2014 The pip developers (see outdated.NOTICE file) # @@ -39,8 +39,19 @@ from scancode_config import scancode_cache_dir from scancode_config import __version__ as scancode_version +from scancode_config import __release_date__ as scancode_release_date from scancode import lockfile +""" +Utilities to check if the installed version of ScanCode is out of date. +The check is done either: +- locally based on elapsed time of 90 days +- remotely based on an API check for PyPI releases at the Python Software + Foundation PyPI.org. At most once a week + +This code is based on a pip module and heavilty modified for use here. +""" + SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" logger = logging.getLogger(__name__) @@ -56,7 +67,26 @@ def total_seconds(td): return val / 10 ** 6 -class VersionCheckState(object): +def is_outdated(release_date): + """ + Return True if 90 days have passed since `release_date` datetime object. + + For example: + + >>> release_date = datetime.datetime(2020, 9, 23) + >>> is_outdated(release_date) + True + >>> release_date = datetime.datetime.utcnow() + >>> is_outdated(release_date) + False + """ + current_time = datetime.datetime.utcnow() + seconds_since_last_check = total_seconds(current_time - release_date) + ninety_days = 90 * 24 * 60 * 60 + return seconds_since_last_check > ninety_days + + +class VersionCheckState: def __init__(self): self.statefile_path = path.join( @@ -81,8 +111,48 @@ def save(self, latest_version, current_time): separators=(',', ':')) -def check_scancode_version( +def build_outdated_message(installed_version, release_date, newer_version=''): + """ + Return a message about outdated version for display. + """ + rel_date, _, _ = release_date.isoformat().partition('T') + + newer_version = newer_version or '' + newer_version = newer_version.strip() + if newer_version: + newer_version = f'{newer_version} ' + + msg = ( + 'WARNING: Outdated ScanCode Toolkit version! ' + f'You are using an outdated version of ScanCode Toolkit: {installed_version} ' + f'released on: {rel_date}. ' + f'A new version {newer_version}is available with important ' + f'improvements including bug and security fixes, updated license, ' + f'copyright and package detection, and improved scanning accuracy. ' + 'Please download and install the latest version of ScanCode. ' + 'Visit https://github.com/nexB/scancode-toolkit/releases for details.' + ) + return msg + + +def check_scancode_version_locally( installed_version=scancode_version, + release_date=scancode_release_date, +): + """ + Return a message to display if outdated or None. Work offline, without a + PyPI remote check. + """ + if is_outdated(release_date): + return build_outdated_message( + installed_version=installed_version, + release_date=release_date, + ) + + +def check_scancode_version_remotely( + installed_version=scancode_version, + release_date=scancode_release_date, new_version_url='https://pypi.org/pypi/scancode-toolkit/json', force=False, ): @@ -92,10 +162,33 @@ def check_scancode_version( State is stored in the scancode_cache_dir. If `force` is True, redo a PyPI remote check. """ - installed_version = packaging_version.parse(installed_version) - latest_version = None - msg = None + newer_version = fetch_newer_version( + installed_version=installed_version, + new_version_url=new_version_url, + force=force, + ) + if newer_version: + return build_outdated_message( + installed_version=installed_version, + release_date=release_date, + newer_version=newer_version, + ) + +def fetch_newer_version( + installed_version=scancode_version, + new_version_url='https://pypi.org/pypi/scancode-toolkit/json', + force=False, +): + """ + Return a version string if there is an updated version of scancode-toolkit + newer than the installed version and available on PyPI. Return None + otherwise. + Limit the frequency of update checks to once per week. + State is stored in the scancode_cache_dir. + If `force` is True, redo a PyPI remote check. + """ + installed_version = packaging_version.parse(installed_version) try: state = VersionCheckState() @@ -117,7 +210,7 @@ def check_scancode_version( # Refresh the version if we need to or just see if we need to warn if latest_version is None: try: - latest_version = get_latest_version(new_version_url) + latest_version = fetch_latest_version(new_version_url) state.save(latest_version, current_time) except Exception: # save an empty version to avoid checking more than once a week @@ -126,18 +219,9 @@ def check_scancode_version( latest_version = packaging_version.parse(latest_version) - outdated_msg = ('WARNING: ' - 'You are using ScanCode Toolkit version %s, however the newer ' - 'version %s is available.\nYou should download and install the ' - 'latest version of ScanCode with bug and security fixes and the ' - 'latest license detection data for accurate scanning.\n' - 'Visit https://github.com/nexB/scancode-toolkit/releases for details.' - % (installed_version, latest_version) - ) - - # Our git version string is not PEP 440 compliant, and thus improperly parsed via - # most 3rd party version parsers. We handle this case by pulling out the "base" - # release version by split()-ting on "post". + # Our git version string is not PEP 440 compliant, and thus improperly + # parsed via most 3rd party version parsers. We handle this case by + # pulling out the "base" release version by split()-ting on "post". # # For example, "3.1.2.post351.850399ba3" becomes "3.1.2" if isinstance(installed_version, packaging_version.LegacyVersion): @@ -148,14 +232,14 @@ def check_scancode_version( # Determine if our latest_version is older if (installed_version < latest_version and installed_version.base_version != latest_version.base_version): - return outdated_msg + return str(latest_version) except Exception: msg = 'There was an error while checking for the latest version of ScanCode' logger.debug(msg, exc_info=True) -def get_latest_version(new_version_url='https://pypi.org/pypi/scancode-toolkit/json'): +def fetch_latest_version(new_version_url='https://pypi.org/pypi/scancode-toolkit/json'): """ Fetch `new_version_url` and return the latest version of scancode as a string. @@ -168,12 +252,12 @@ def get_latest_version(new_version_url='https://pypi.org/pypi/scancode-toolkit/j try: response = requests.get(new_version_url, **requests_args) except (ConnectionError) as e: - logger.debug('get_latest_version: Download failed for %(url)r' % locals()) + logger.debug('fetch_latest_version: Download failed for %(url)r' % locals()) raise status = response.status_code if status != 200: - msg = 'get_latest_version: Download failed for %(url)r with %(status)r' % locals() + msg = 'fetch_latest_version: Download failed for %(url)r with %(status)r' % locals() logger.debug(msg) raise Exception(msg) diff --git a/src/scancode_config.py b/src/scancode_config.py index c77bf0a379a..46b0b608a6c 100644 --- a/src/scancode_config.py +++ b/src/scancode_config.py @@ -6,6 +6,8 @@ # See https://github.com/nexB/scancode-toolkit for support or download. # See https://aboutcode.org for more information about nexB OSS projects. # + +import datetime import errno import os from os.path import abspath @@ -75,16 +77,18 @@ def _create_dir(location): # in case package is not installed or we do not have setutools/pkg_resources # on hand fall back to this version -__version__ = '21.8.4' +__version__ = '30.0.0' + +# used to warn user when the version is out of date +__release_date__ = datetime.datetime(2021, 9, 23) # See https://github.com/nexB/scancode-toolkit/issues/2653 for more information # on the data format version __output_format_version__ = '1.0.0' -# +# spdx_license_list_version = '3.14' - try: from pkg_resources import get_distribution, DistributionNotFound try: diff --git a/src/summarycode/summarizer.py b/src/summarycode/summarizer.py index 3245eef81cd..0e5ad4bf858 100644 --- a/src/summarycode/summarizer.py +++ b/src/summarycode/summarizer.py @@ -19,7 +19,6 @@ from summarycode.utils import get_resource_summary from summarycode.utils import set_resource_summary - # Tracing flags TRACE = False TRACE_LIGHT = False @@ -279,6 +278,7 @@ def summarize_values(values, attribute): holders=summarize_holders, authors=summarize_holders, programming_language=summarize_languages, + packages=summarize_packages, ) return value_summarizers_by_attr[attribute](values) @@ -328,7 +328,7 @@ def summarize_codebase_key_files(codebase, **kwargs): 'authors', 'programming_language', # 'packages', - ]) + ]) summarizable_attributes = [k for k in summarizable_attributes if k in really_summarizable_attributes] @@ -480,11 +480,28 @@ def package_summarizer(resource, children, keep_details=False): logger_debug('package_summarizer: for:', resource, 'packages are:', packs) - # Collect direct children packages summary - for child in children: - child_summaries = get_resource_summary(child, key='packages', as_attribute=False) or [] - packages.extend(child_summaries) + package_urls = [] + for package in packages: + purl = package.get('purl') + if purl: + package_urls.append(purl) # summarize proper - set_resource_summary(resource, key='packages', value=packages, as_attribute=False) - return packages + packages_counter = summarize_packages(package_urls) + summarized = sorted_counter(packages_counter) + set_resource_summary( + resource=resource, + key='packages', + value=summarized, + as_attribute=keep_details, + ) + + return summarized + + +def summarize_packages(package_urls): + """ + Given a list of package urls, return a mapping of {expression: count + of occurences} + """ + return Counter(package_urls) diff --git a/spdx-copy.txt b/tests/cluecode/data/copyrights/spdx-copy.txt similarity index 100% rename from spdx-copy.txt rename to tests/cluecode/data/copyrights/spdx-copy.txt diff --git a/spdx-copy.txt.yml b/tests/cluecode/data/copyrights/spdx-copy.txt.yml similarity index 100% rename from spdx-copy.txt.yml rename to tests/cluecode/data/copyrights/spdx-copy.txt.yml diff --git a/tests/packagedcode/data/pypi/setup.py/with_name-setup.py b/tests/packagedcode/data/pypi/setup.py/with_name-setup.py new file mode 100644 index 00000000000..144b0a06822 --- /dev/null +++ b/tests/packagedcode/data/pypi/setup.py/with_name-setup.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from distutils.core import setup + +setup(name='arpy', + version='0.1.1', + description='Library for accessing "ar" files', + author=u'Stanisław Pitucha', + author_email='viraptor@gmail.com', + url='http://bitbucket.org/viraptor/arpy', + py_modules=['arpy'], + license="Simplified BSD", + ) + diff --git a/tests/packagedcode/data/pypi/setup.py/with_name-setup.py.args.expected.json b/tests/packagedcode/data/pypi/setup.py/with_name-setup.py.args.expected.json new file mode 100644 index 00000000000..882e0019782 --- /dev/null +++ b/tests/packagedcode/data/pypi/setup.py/with_name-setup.py.args.expected.json @@ -0,0 +1,12 @@ +{ + "name": "arpy", + "version": "0.1.1", + "description": "Library for accessing \"ar\" files", + "author": "Stanis\u0142aw Pitucha", + "author_email": "viraptor@gmail.com", + "url": "http://bitbucket.org/viraptor/arpy", + "py_modules": [ + "arpy" + ], + "license": "Simplified BSD" +} \ No newline at end of file diff --git a/tests/packagedcode/data/pypi/setup.py/with_name-setup.py.expected.json b/tests/packagedcode/data/pypi/setup.py/with_name-setup.py.expected.json new file mode 100644 index 00000000000..9b93fc3266e --- /dev/null +++ b/tests/packagedcode/data/pypi/setup.py/with_name-setup.py.expected.json @@ -0,0 +1,46 @@ +{ + "type": "pypi", + "namespace": null, + "name": "arpy", + "version": "0.1.1", + "qualifiers": {}, + "subpath": null, + "primary_language": "Python", + "description": "Library for accessing \"ar\" files", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Stanis\u0142aw Pitucha", + "email": null, + "url": null + } + ], + "keywords": [], + "homepage_url": "http://bitbucket.org/viraptor/arpy", + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "license_expression": "bsd-simplified", + "declared_license": { + "license": "Simplified BSD" + }, + "notice_text": null, + "root_path": null, + "dependencies": [], + "contains_source_code": null, + "source_packages": [], + "extra_data": {}, + "purl": "pkg:pypi/arpy@0.1.1", + "repository_homepage_url": "https://pypi.org/project/https://pypi.org", + "repository_download_url": "https://pypi.org/packages/source/a/arpy/arpy-0.1.1.tar.gz", + "api_data_url": "https://pypi.org/pypi/arpy/0.1.1/json" +} \ No newline at end of file diff --git a/tests/packagedcode/data/pypi/setup.py/without_name-setup.py b/tests/packagedcode/data/pypi/setup.py/without_name-setup.py new file mode 100644 index 00000000000..146752c342a --- /dev/null +++ b/tests/packagedcode/data/pypi/setup.py/without_name-setup.py @@ -0,0 +1,8 @@ +from setuptools import setup + +setup( + version="1.0.0", + description="A sample package", + author="Test", + author_email="test@gmail.com", + package_requires=[]) diff --git a/tests/packagedcode/data/pypi/setup.py/without_name-setup.py.args.expected.json b/tests/packagedcode/data/pypi/setup.py/without_name-setup.py.args.expected.json new file mode 100644 index 00000000000..95ecfb4cb83 --- /dev/null +++ b/tests/packagedcode/data/pypi/setup.py/without_name-setup.py.args.expected.json @@ -0,0 +1,7 @@ +{ + "version": "1.0.0", + "description": "A sample package", + "author": "Test", + "author_email": "test@gmail.com", + "package_requires": [] +} \ No newline at end of file diff --git a/tests/packagedcode/data/pypi/setup.py/without_name-setup.py.expected.json b/tests/packagedcode/data/pypi/setup.py/without_name-setup.py.expected.json new file mode 100644 index 00000000000..fbb071b8ee1 --- /dev/null +++ b/tests/packagedcode/data/pypi/setup.py/without_name-setup.py.expected.json @@ -0,0 +1,44 @@ +{ + "type": "pypi", + "namespace": null, + "name": null, + "version": "1.0.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "Python", + "description": "A sample package", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Test", + "email": null, + "url": null + } + ], + "keywords": [], + "homepage_url": null, + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "license_expression": null, + "declared_license": {}, + "notice_text": null, + "root_path": null, + "dependencies": [], + "contains_source_code": null, + "source_packages": [], + "extra_data": {}, + "purl": null, + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null +} \ No newline at end of file diff --git a/tests/packagedcode/packages_test_utils.py b/tests/packagedcode/packages_test_utils.py index 1b08c95adfe..cb4e143be33 100644 --- a/tests/packagedcode/packages_test_utils.py +++ b/tests/packagedcode/packages_test_utils.py @@ -10,6 +10,8 @@ import json import os +import saneyaml + from commoncode import testcase from commoncode import text @@ -85,7 +87,8 @@ def check_result_equals_expected_json(result, expected_loc, regen=False): with open(expected_loc) as ex: expected = json.load(ex) - assert result == expected + if result != expected: + assert saneyaml.dump(result) == saneyaml.dump(expected) def get_test_files(location, test_file_suffix): diff --git a/tests/packagedcode/test_pypi.py b/tests/packagedcode/test_pypi.py index 8453b9675eb..705d6833fa7 100644 --- a/tests/packagedcode/test_pypi.py +++ b/tests/packagedcode/test_pypi.py @@ -172,6 +172,30 @@ def test_parse_metadata_unpacked_sdist_metadata_v10_subdir(self): expected_loc = self.get_test_loc('pypi/unpacked_sdist/metadata-1.0/PyJPString-0.0.3-subdir-expected.json') self.check_package(package, expected_loc, regen=False) + def test_parse_setup_py_with_name(self): + test_file = self.get_test_loc('pypi/setup.py/with_name-setup.py') + package = pypi.parse_setup_py(test_file) + expected_loc = self.get_test_loc('pypi/setup.py/with_name-setup.py.expected.json', must_exist=False) + self.check_package(package, expected_loc, regen=False) + + def test_parse_setup_py_without_name(self): + test_file = self.get_test_loc('pypi/setup.py/without_name-setup.py') + package = pypi.parse_setup_py(test_file) + expected_loc = self.get_test_loc('pypi/setup.py/without_name-setup.py.expected.json', must_exist=False) + self.check_package(package, expected_loc, regen=False) + + def test_get_setup_py_args_with_name(self): + test_file = self.get_test_loc('pypi/setup.py/with_name-setup.py') + kwargs = pypi.get_setup_py_args(test_file) + expected_loc = self.get_test_loc('pypi/setup.py/with_name-setup.py.args.expected.json', must_exist=False) + check_result_equals_expected_json(kwargs, expected_loc, regen=False) + + def test_get_setup_py_args_without_name(self): + test_file = self.get_test_loc('pypi/setup.py/without_name-setup.py') + kwargs = pypi.get_setup_py_args(test_file) + expected_loc = self.get_test_loc('pypi/setup.py/without_name-setup.py.args.expected.json', must_exist=False) + check_result_equals_expected_json(kwargs, expected_loc, regen=False) + def test_parse_metadata_unpacked_sdist_metadata_v11_1(self): test_file = self.get_test_loc('pypi/unpacked_sdist/metadata-1.1/python-mimeparse-1.6.0/PKG-INFO') package = pypi.parse_metadata(test_file) diff --git a/tests/scancode/test_cli.py b/tests/scancode/test_cli.py index 394ae2f5acd..5d4721e1fb5 100644 --- a/tests/scancode/test_cli.py +++ b/tests/scancode/test_cli.py @@ -112,6 +112,14 @@ def test_can_call_run_scan_as_a_function(): assert not results['headers'][0]['errors'] +def test_run_scan_includes_outdated_in_extra(): + from scancode.cli import run_scan + test_dir = test_env.get_test_loc('license', copy=True) + rc, results = run_scan(test_dir, outdated='out of date', return_results=True) + assert rc + assert results['headers'][0]['extra_data']['OUTDATED'] == 'out of date' + + def test_usage_and_help_return_a_correct_script_name_on_all_platforms(): result = run_scan_click(['--help']) assert 'Usage: scancode [OPTIONS]' in result.output diff --git a/tests/scancode/test_outdated.py b/tests/scancode/test_outdated.py index f9f52755080..18e57ff005c 100644 --- a/tests/scancode/test_outdated.py +++ b/tests/scancode/test_outdated.py @@ -12,7 +12,7 @@ from scancode import outdated -def test_get_latest_version(): +def test_fetch_latest_version(): from unittest import mock pypi_mock_releases = { 'releases': { @@ -30,6 +30,7 @@ def test_get_latest_version(): '3.0.0': [], } } + def jget(*args, **kwargs): return pypi_mock_releases @@ -38,19 +39,19 @@ def jget(*args, **kwargs): json=jget, status_code=200 ) - result = outdated.get_latest_version() + result = outdated.fetch_latest_version() assert result == '3.0.2' -def test_get_latest_version_fails_on_http_error(): +def test_fetch_latest_version_fails_on_http_error(): from unittest import mock with mock.patch('requests.get') as mock_get: mock_get.return_value = mock.Mock(status_code=400) with pytest.raises(Exception): - outdated.get_latest_version() + outdated.fetch_latest_version() -def test_get_latest_version_ignore_rc_versions(): +def test_fetch_latest_version_ignore_rc_versions(): from unittest import mock pypi_mock_releases = { 'releases': { @@ -62,6 +63,7 @@ def test_get_latest_version_ignore_rc_versions(): '2.9.0rc3': [], } } + def jget(*args, **kwargs): return pypi_mock_releases @@ -70,11 +72,37 @@ def jget(*args, **kwargs): json=jget, status_code=200 ) - result = outdated.get_latest_version() + result = outdated.fetch_latest_version() assert result == '2.2.1' -def test_check_scancode_version(): +def test_fetch_newer_version(): + from unittest import mock + pypi_mock_releases = { + 'releases': { + '2.0.0': [], + '2.0.0rc3': [], + '2.0.1': [], + '2.1.0': [], + '3.4.1': [], + '22.1': [], + '30.9.0rc3': [], + '42.5.1': [], + } + } + + def jget(*args, **kwargs): + return pypi_mock_releases + + with mock.patch('requests.get') as mock_get: + mock_get.return_value = mock.Mock( + json=jget, + status_code=200 + ) + assert outdated.fetch_newer_version(force=True) == '42.5.1' + + +def test_check_scancode_version_remotely(): from unittest import mock pypi_mock_releases = { 'releases': { @@ -88,6 +116,7 @@ def test_check_scancode_version(): '42.5.1': [], } } + def jget(*args, **kwargs): return pypi_mock_releases @@ -96,14 +125,13 @@ def jget(*args, **kwargs): json=jget, status_code=200 ) - expected1 = 'You are using ScanCode Toolkit version' - expected2 = 'however the newer version 42.5.1 is available' - result = outdated.check_scancode_version(force=True) - assert expected1 in result - assert expected2 in result + result = outdated.check_scancode_version_remotely(force=True) + assert result.startswith('WARNING: Outdated ScanCode') + assert 'A new version 42.5.1 is available' in result -def test_check_scancode_version_no_new_version(): + +def test_fetch_newer_version_no_new_version(): from unittest import mock pypi_mock_releases = { 'releases': { @@ -115,6 +143,7 @@ def test_check_scancode_version_no_new_version(): '3.9.0rc3': [], } } + def jget(*args, **kwargs): return pypi_mock_releases @@ -123,11 +152,11 @@ def jget(*args, **kwargs): json=jget, status_code=200 ) - result = outdated.check_scancode_version(force=True) - assert not result + assert not outdated.fetch_newer_version(force=True) + assert not outdated.check_scancode_version_remotely(force=True) -def test_check_scancode_version_local_git_version(): +def test_fetch_newer_version_local_git_version(): from unittest import mock pypi_mock_releases = { 'releases': { @@ -139,6 +168,7 @@ def test_check_scancode_version_local_git_version(): '3.1.2': [], } } + def jget(*args, **kwargs): return pypi_mock_releases @@ -147,5 +177,15 @@ def jget(*args, **kwargs): json=jget, status_code=200 ) - result = outdated.check_scancode_version(installed_version='3.1.2.post351.850399bc3', force=True) + + result = outdated.fetch_newer_version( + installed_version='3.1.2.post351.850399bc3', + force=True, + ) + assert not result + + result = outdated.check_scancode_version_remotely( + installed_version='3.1.2.post351.850399bc3', + force=True, + ) assert not result diff --git a/tests/summarycode/data/full_summary/summary.expected.json b/tests/summarycode/data/full_summary/summary.expected.json index 1f498e3d13e..eaf36708829 100644 --- a/tests/summarycode/data/full_summary/summary.expected.json +++ b/tests/summarycode/data/full_summary/summary.expected.json @@ -12,6 +12,7 @@ "--summary": true }, "notice": "Generated with ScanCode and provided on an \"AS IS\" BASIS, WITHOUT WARRANTIES\nOR CONDITIONS OF ANY KIND, either express or implied. No content created from\nScanCode should be considered or used as legal advice. Consult an Attorney\nfor any legal advice.\nScanCode is a free software code scanning tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.", + "output_format_version": "1.0.0", "message": null, "errors": [], "extra_data": { @@ -203,2852 +204,7 @@ "count": 1 } ], - "packages": [ - { - "type": "npm", - "namespace": null, - "name": "npm", - "version": "2.13.5", - "qualifiers": {}, - "subpath": null, - "primary_language": "JavaScript", - "description": "a package manager for JavaScript", - "release_date": null, - "parties": [ - { - "type": "person", - "role": "author", - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - { - "type": "person", - "role": "contributor", - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Steve Steiner", - "email": "ssteinerX@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Aaron Blohowiak", - "email": "aaron.blohowiak@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Martyn Smith", - "email": "martyn@dollyfish.net.nz", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Charlie Robbins", - "email": "charlie.robbins@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Francisco Treacy", - "email": "francisco.treacy@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Cliffano Subagio", - "email": "cliffano@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Christian Eager", - "email": "christian.eager@nokia.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Dav Glass", - "email": "davglass@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alex K. Wolfe", - "email": "alexkwolfe@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "James Sanders", - "email": "jimmyjazz14@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Reid Burke", - "email": "me@reidburke.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Arlo Breault", - "email": "arlolra@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Timo Derstappen", - "email": "teemow@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Bart Teeuwisse", - "email": "bart.teeuwisse@thecodemill.biz", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ben Noordhuis", - "email": "info@bnoordhuis.nl", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tor Valamo", - "email": "tor.valamo@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Whyme.Lyu", - "email": "5longluna@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Olivier Melcher", - "email": "olivier.melcher@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Toma\u017e Muraus", - "email": "kami@k5-storitve.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Evan Meagher", - "email": "evan.meagher@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Orlando Vazquez", - "email": "ovazquez@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kai Chen", - "email": "kaichenxyz@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "George Miroshnykov", - "email": "gmiroshnykov@lohika.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Geoff Flarity", - "email": "geoff.flarity@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Max Goodman", - "email": "c@chromakode.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Pete Kruckenberg", - "email": "pete@kruckenberg.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Laurie Harper", - "email": "laurie@holoweb.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Chris Wong", - "email": "chris@chriswongstudio.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Scott Bronson", - "email": "brons_github@rinspin.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Federico Romero", - "email": "federomero@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Visnu Pitiyanuvath", - "email": "visnupx@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Irakli Gozalishvili", - "email": "rfobic@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mark Cahill", - "email": "mark@tiemonster.info", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tony", - "email": "zearin@gonk.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Iain Sproat", - "email": "iainsproat@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Trent Mick", - "email": "trentm@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Felix Geisendo\u0308rfer", - "email": "felix@debuggable.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jameson Little", - "email": "t.jameson.little@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Conny Brunnkvist", - "email": "conny@fuchsia.se", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Will Elwood", - "email": "w.elwood08@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Dean Landolt", - "email": "dean@deanlandolt.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Oleg Efimov", - "email": "efimovov@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Martin Cooper", - "email": "mfncooper@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jann Horn", - "email": "jannhorn@googlemail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrew Bradley", - "email": "cspotcode@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Maciej Ma\u0142ecki", - "email": "me@mmalecki.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Stephen Sugden", - "email": "glurgle@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Michael Budde", - "email": "mbudde@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jason Smith", - "email": "jhs@iriscouch.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Gautham Pai", - "email": "buzypi@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "David Trejo", - "email": "david.daniel.trejo@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Paul Vorbach", - "email": "paul@vorb.de", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "George Ornbo", - "email": "george@shapeshed.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tim Oxley", - "email": "secoif@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tyler Green", - "email": "tyler.green2@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Dave Pacheco", - "email": "dap@joyent.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Danila Gerasimov", - "email": "danila.gerasimov@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Rod Vagg", - "email": "rod@vagg.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Christian Howe", - "email": "coderarity@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrew Lunny", - "email": "alunny@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Henrik Hodne", - "email": "dvyjones@binaryhex.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Adam Blackburn", - "email": "regality@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kris Windham", - "email": "kriswindham@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jens Grunert", - "email": "jens.grunert@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Joost-Wim Boekesteijn", - "email": "joost-wim@boekesteijn.nl", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Dalmais Maxence", - "email": "root@ip-10-195-202-5.ec2.internal", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Marcus Ekwall", - "email": "marcus.ekwall@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Aaron Stacy", - "email": "aaron.r.stacy@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Phillip Howell", - "email": "phowell@cothm.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Domenic Denicola", - "email": "domenic@domenicdenicola.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "James Halliday", - "email": "mail@substack.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jeremy Cantrell", - "email": "jmcantrell@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ribettes", - "email": "patlogan29@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Don Park", - "email": "donpark@docuverse.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Einar Otto Stangvik", - "email": "einaros@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kei Son", - "email": "heyacct@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nicolas Morel", - "email": "marsup@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mark Dube", - "email": "markisdee@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Maxim Bogushevich", - "email": "boga1@mail.ru", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Meaglin", - "email": "Meaglin.wasabi@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ben Evans", - "email": "ben@bensbit.co.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nathan Zadoks", - "email": "nathan@nathan7.eu", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Brian White", - "email": "mscdex@mscdex.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jed Schmidt", - "email": "tr@nslator.jp", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ian Livingstone", - "email": "ianl@cs.dal.ca", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Patrick Pfeiffer", - "email": "patrick@buzzle.at", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Paul Miller", - "email": "paul@paulmillr.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ryan Emery", - "email": "seebees@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Carl Lange", - "email": "carl@flax.ie", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jan Lehnardt", - "email": "jan@apache.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Stuart P. Bentley", - "email": "stuart@testtrack4.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Johan Sk\u00f6ld", - "email": "johan@skold.cc", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Stuart Knightley", - "email": "stuart@stuartk.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Niggler", - "email": "nirk.niggler@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Paolo Fragomeni", - "email": "paolo@async.ly", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jaakko Manninen", - "email": "jaakko@rocketpack.fi", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Luke Arduini", - "email": "luke.arduini@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Larz Conwell", - "email": "larz@larz-laptop.(none)", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Marcel Klehr", - "email": "mklehr@gmx.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Robert Kowalski", - "email": "rok@kowalski.gd", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Forbes Lindesay", - "email": "forbes@lindesay.co.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Vaz Allen", - "email": "vaz@tryptid.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jake Verbaten", - "email": "raynos2@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Schabse Laks", - "email": "Dev@SLaks.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Florian Margaine", - "email": "florian@margaine.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Johan Nordberg", - "email": "its@johan-nordberg.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ian Babrou", - "email": "ibobrik@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Di Wu", - "email": "dwu@palantir.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mathias Bynens", - "email": "mathias@qiwi.be", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Matt McClure", - "email": "matt.mcclure@mapmyfitness.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Matt Lunn", - "email": "matt@mattlunn.me.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alexey Kreschuk", - "email": "akrsch@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "elisee", - "email": "elisee@sparklin.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Robert Gieseke", - "email": "robert.gieseke@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Franc\u0327ois Frisch", - "email": "francoisfrisch@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Trevor Burnham", - "email": "tburnham@hubspot.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alan Shaw", - "email": "alan@freestyle-developments.co.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nicholas Kinsey", - "email": "pyro@feisty.io", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Paulo Cesar", - "email": "pauloc062@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Elan Shanker", - "email": "elan.shanker@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jon Spencer", - "email": "jon@jonspencer.ca", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jason Diamond", - "email": "jason@diamond.name", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Maximilian Antoni", - "email": "mail@maxantoni.de", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Thom Blake", - "email": "tblake@brightroll.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jess Martin", - "email": "jessmartin@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Spain Train", - "email": "michael.spainhower@opower.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alex Rodionov", - "email": "p0deje@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Matt Colyer", - "email": "matt@colyer.name", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Evan You", - "email": "yyx990803@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "bitspill", - "email": "bitspill+github@bitspill.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Gabriel Falkenberg", - "email": "gabriel.falkenberg@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alexej Yaroshevich", - "email": "alex@qfox.ru", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Quim Calpe", - "email": "quim@kalpe.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Steve Mason", - "email": "stevem@brandwatch.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Wil Moore III", - "email": "wil.moore@wilmoore.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Sergey Belov", - "email": "peimei@ya.ru", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tom Huang", - "email": "hzlhu.dargon@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "CamilleM", - "email": "camille.moulin@alterway.fr", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "S\u00e9bastien Santoro", - "email": "dereckson@espace-win.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Evan Lucas", - "email": "evan@btc.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Quinn Slack", - "email": "qslack@qslack.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alex Kocharin", - "email": "alex@kocharin.ru", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Daniel Santiago", - "email": "daniel.santiago@highlevelwebs.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Denis Gladkikh", - "email": "outcoldman@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrew Horton", - "email": "andrew.j.horton@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Zeke Sikelianos", - "email": "zeke@sikelianos.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Dylan Greene", - "email": "dylang@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Franck Cuny", - "email": "franck.cuny@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Yeonghoon Park", - "email": "sola92@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Rafael de Oleza", - "email": "rafa@spotify.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mikola Lysenko", - "email": "mikolalysenko@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Yazhong Liu", - "email": "yorkiefixer@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Neil Gentleman", - "email": "ngentleman@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kris Kowal", - "email": "kris.kowal@cixar.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alex Gorbatchev", - "email": "alex.gorbatchev@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Shawn Wildermuth", - "email": "shawn@wildermuth.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Wesley de Souza", - "email": "wesleywex@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "yoyoyogi", - "email": "yogesh.k@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "J. Tangelder", - "email": "j.tangelder@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jean Lauliac", - "email": "jean@lauliac.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrey Kislyuk", - "email": "kislyuk@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Thorsten Lorenz", - "email": "thlorenz@gmx.de", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Julian Gruber", - "email": "julian@juliangruber.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Benjamin Coe", - "email": "bencoe@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alex Ford", - "email": "Alex.Ford@CodeTunnel.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Matt Hickford", - "email": "matt.hickford@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Sean McGivern", - "email": "sean.mcgivern@rightscale.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "C J Silverio", - "email": "ceejceej@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Robin Tweedie", - "email": "robin@songkick.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Miroslav Bajto\u0161", - "email": "miroslav@strongloop.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "David Glasser", - "email": "glasser@davidglasser.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Gianluca Casati", - "email": "casati_gianluca@yahoo.it", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Forrest L Norvell", - "email": "ogd@aoaioxxysz.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Karsten Tinnefeld", - "email": "k.tinnefeld@googlemail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Bryan Burgers", - "email": "bryan@burgers.io", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "David Beitey", - "email": "david@davidjb.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Evan You", - "email": "yyou@google.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Zach Pomerantz", - "email": "zmp@umich.edu", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Chris Williams", - "email": "cwilliams88@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "sudodoki", - "email": "smd.deluzion@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mick Thompson", - "email": "dthompson@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Felix Rabe", - "email": "felix@rabe.io", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Michael Hayes", - "email": "michael@hayes.io", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Chris Dickinson", - "email": "christopher.s.dickinson@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Bradley Meck", - "email": "bradley.meck@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "GeJ", - "email": "geraud@gcu.info", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrew Terris", - "email": "atterris@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Michael Nisi", - "email": "michael.nisi@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "fengmk2", - "email": "fengmk2@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Adam Meadows", - "email": "adam.meadows@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Chulki Lee", - "email": "chulki.lee@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "\u4e0d\u56db", - "email": "busi.hyy@taobao.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "dead_horse", - "email": "dead_horse@qq.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kenan Yildirim", - "email": "kenan@kenany.me", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Laurie Voss", - "email": "git@seldo.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Rebecca Turner", - "email": "me@re-becca.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Hunter Loftis", - "email": "hunter@hunterloftis.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Peter Richardson", - "email": "github@zoomy.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jussi Kalliokoski", - "email": "jussi.kalliokoski@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Filip Weiss", - "email": "me@fiws.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Timo Wei\u00df", - "email": "timoweiss@Timo-MBP.local", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Christopher Hiller", - "email": "chiller@badwing.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "J\u00e9r\u00e9my Lal", - "email": "kapouer@melix.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Anders Janmyr", - "email": "anders@janmyr.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Chris Meyers", - "email": "chris.meyers.fsu@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ludwig Magnusson", - "email": "ludwig@mediatool.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Wout Mertens", - "email": "Wout.Mertens@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nick Santos", - "email": "nick@medium.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Terin Stock", - "email": "terinjokes@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Faiq Raza", - "email": "faiqrazarizvi@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Thomas Torp", - "email": "thomas@erupt.no", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Sam Mikes", - "email": "smikes@cubane.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mat Tyndall", - "email": "mat.tyndall@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tauren Mills", - "email": "tauren@sportzing.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ron Martinez", - "email": "ramartin.net@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kazuhito Hokamura", - "email": "k.hokamura@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tristan Davies", - "email": "github@tristan.io", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "David Volm", - "email": "david@volminator.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Lin Clark", - "email": "lin.w.clark@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ben Page", - "email": "bpage@dewalch.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jeff Jo", - "email": "jeffjo@squareup.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "martinvd", - "email": "martinvdpub@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mark J. Titorenko", - "email": "nospam-github.com@titorenko.net", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Oddur Sigurdsson", - "email": "oddurs@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Eric Mill", - "email": "eric@konklone.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Gabriel Barros", - "email": "descartavel1@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "KevinSheedy", - "email": "kevinsheedy@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Aleksey Smolenchuk", - "email": "aleksey@uber.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ed Morley", - "email": "emorley@mozilla.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Blaine Bublitz", - "email": "blaine@iceddev.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrey Fedorov", - "email": "anfedorov@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Daijiro Wachi", - "email": "daijiro.wachi@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Luc Thevenard", - "email": "lucthevenard@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Aria Stewart", - "email": "aredridel@nbtsc.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Charlie Rudolph", - "email": "charles.w.rudolph@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Vladimir Rutsky", - "email": "rutsky@users.noreply.github.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Isaac Murchie", - "email": "isaac@saucelabs.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Marcin Wosinek", - "email": "marcin.wosinek@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "David Marr", - "email": "davemarr@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Bryan English", - "email": "bryan@bryanenglish.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Anthony Zotti", - "email": "amZotti@users.noreply.github.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Karl Horky", - "email": "karl.horky@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jordan Harband", - "email": "ljharb@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Gu\u00f0laugur Stef\u00e1n Egilsson", - "email": "gulli@kolibri.is", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Helge Skogly Holm", - "email": "helge.holm@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Peter A. Shevtsov", - "email": "petr.shevtsov@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Alain Kalker", - "email": "a.c.kalker@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Bryant Williams", - "email": "b.n.williams@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jonas Weber", - "email": "github@jonasw.de", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Tim Whidden", - "email": "twhid@twhid.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andreas", - "email": "functino@users.noreply.github.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Karolis Narkevicius", - "email": "karolis.n@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Adrian Lynch", - "email": "adi_ady_ade@hotmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Richard Littauer", - "email": "richard.littauer@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Oli Evans", - "email": "oli@zilla.org.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Matt Brennan", - "email": "mattyb1000@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jeff Barczewski", - "email": "jeff.barczewski@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Danny Fritz", - "email": "dannyfritz@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Takaya Kobayashi", - "email": "jigsaw@live.jp", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ra'Shaun Stovall", - "email": "rashaunstovall@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Julien Meddah", - "email": "julien.meddah@deveryware.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Michiel Sikma", - "email": "michiel@wedemandhtml.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jakob Krigovsky", - "email": "jakob.krigovsky@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Charmander", - "email": "~@charmander.me", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Erik Wienhold", - "email": "git@ewie.name", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "James Butler", - "email": "james.butler@sandfox.co.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kevin Kragenbrink", - "email": "kevin@gaikai.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Arnaud Rinquin", - "email": "rinquin.arnaud@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Mike MacCana", - "email": "mike.maccana@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Antti Mattila", - "email": "anttti@fastmail.fm", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "laiso", - "email": "laiso@lai.so", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Matt Zorn", - "email": "zornme@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kyle Mitchell", - "email": "kyle@kemitchell.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Michael Klein", - "email": "mischkl@users.noreply.github.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Simen Bekkhus", - "email": "sbekkhus91@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Victor", - "email": "victor.shih@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "thefourtheye", - "email": "thechargingvolcano@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Clay Carpenter", - "email": "claycarpenter@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "bangbang93", - "email": "bangbang93@163.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nick Malaguti", - "email": "nmalaguti@palantir.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Cedric Nelson", - "email": "cedric.nelson@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kat March\u00e1n", - "email": "kzm@sykosomatic.org", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrew", - "email": "talktome@aboutandrew.co.uk", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Eduardo Pinho", - "email": "enet4mikeenet@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Rachel Hutchison", - "email": "rhutchix@intel.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Ryan Temple", - "email": "ryantemple145@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Eugene Sharygin", - "email": "eush77@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Nick Heiner", - "email": "nick.heiner@opower.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "James Talmage", - "email": "james@talmage.io", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "jane arc", - "email": "jane@uber.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Joseph Dykstra", - "email": "josephdykstra@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Joshua Egan", - "email": "josh-egan@users.noreply.github.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Thomas Cort", - "email": "thomasc@ssimicro.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Thaddee Tyl", - "email": "thaddee.tyl@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Steve Klabnik", - "email": "steve@steveklabnik.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Andrew Murray", - "email": "radarhere@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Stephan B\u00f6nnemann", - "email": "stephan@excellenteasy.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Kyle M. Tarplee", - "email": "kyle.tarplee@numerica.us", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Derek Peterson", - "email": "derekpetey@gmail.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "Greg Whiteley", - "email": "greg.whiteley@atomos.com", - "url": null - }, - { - "type": "person", - "role": "contributor", - "name": "murgatroid99", - "email": "mlumish@google.com", - "url": null - }, - { - "type": "person", - "role": "maintainer", - "name": "isaacs", - "email": "isaacs@npmjs.com", - "url": null - }, - { - "type": "person", - "role": "maintainer", - "name": "othiym23", - "email": "ogd@aoaioxxysz.net", - "url": null - }, - { - "type": "person", - "role": "maintainer", - "name": "iarna", - "email": "me@re-becca.org", - "url": null - }, - { - "type": "person", - "role": "maintainer", - "name": "zkat", - "email": "kat@sykosomatic.org", - "url": null - } - ], - "keywords": [ - "package manager", - "modules", - "install", - "package.json" - ], - "homepage_url": "https://docs.npmjs.com/", - "download_url": "https://registry.npmjs.org/npm/-/npm-2.13.5.tgz", - "size": null, - "sha1": "a124386bce4a90506f28ad4b1d1a804a17baaf32", - "md5": null, - "sha256": null, - "sha512": null, - "bug_tracking_url": "http://github.com/npm/npm/issues", - "code_view_url": null, - "vcs_url": "git+https://github.com/npm/npm.git@fc7bbf03e39cc48a8924b90696d28345a6a90f3c", - "copyright": null, - "license_expression": "artistic-2.0", - "declared_license": [ - "Artistic-2.0" - ], - "notice_text": null, - "root_path": "scan", - "dependencies": [ - { - "purl": "pkg:npm/abbrev", - "requirement": "~1.0.7", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/ansi", - "requirement": "~0.3.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/ansicolors", - "requirement": "~0.3.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/ansistyles", - "requirement": "~0.1.3", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/archy", - "requirement": "~1.0.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/async-some", - "requirement": "~1.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/block-stream", - "requirement": "0.0.8", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/char-spinner", - "requirement": "~1.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/chmodr", - "requirement": "~1.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/chownr", - "requirement": "0.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/cmd-shim", - "requirement": "~2.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/columnify", - "requirement": "~1.5.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/config-chain", - "requirement": "~1.1.9", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/dezalgo", - "requirement": "~1.0.3", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/editor", - "requirement": "~1.0.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/fs-vacuum", - "requirement": "~1.2.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/fs-write-stream-atomic", - "requirement": "~1.0.3", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/fstream", - "requirement": "~1.0.7", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/fstream-npm", - "requirement": "~1.0.4", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/github-url-from-git", - "requirement": "~1.4.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/github-url-from-username-repo", - "requirement": "~1.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/glob", - "requirement": "~5.0.14", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/graceful-fs", - "requirement": "~4.1.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/hosted-git-info", - "requirement": "~2.1.4", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/inflight", - "requirement": "~1.0.4", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/inherits", - "requirement": "~2.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/ini", - "requirement": "~1.3.4", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/init-package-json", - "requirement": "~1.7.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/lockfile", - "requirement": "~1.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/lru-cache", - "requirement": "~2.6.5", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/minimatch", - "requirement": "~2.0.10", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/mkdirp", - "requirement": "~0.5.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/node-gyp", - "requirement": "~2.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/nopt", - "requirement": "~3.0.3", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/normalize-git-url", - "requirement": "~3.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/normalize-package-data", - "requirement": "~2.3.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-cache-filename", - "requirement": "~1.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-install-checks", - "requirement": "~1.0.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-package-arg", - "requirement": "~4.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-registry-client", - "requirement": "~6.5.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-user-validate", - "requirement": "~0.1.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/npmlog", - "requirement": "~1.2.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/once", - "requirement": "~1.3.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/opener", - "requirement": "~1.4.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/osenv", - "requirement": "~0.1.3", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/path-is-inside", - "requirement": "~1.0.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/read", - "requirement": "~1.0.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/read-installed", - "requirement": "~4.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/read-package-json", - "requirement": "~2.0.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/readable-stream", - "requirement": "~1.1.13", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/realize-package-specifier", - "requirement": "~3.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/request", - "requirement": "~2.60.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/retry", - "requirement": "~0.6.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/rimraf", - "requirement": "~2.4.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/semver", - "requirement": "~5.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/sha", - "requirement": "~1.3.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/slide", - "requirement": "~1.1.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/sorted-object", - "requirement": "~1.0.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/spdx", - "requirement": "~0.4.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/tar", - "requirement": "~2.1.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/text-table", - "requirement": "~0.2.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/uid-number", - "requirement": "0.0.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/umask", - "requirement": "~1.1.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/validate-npm-package-name", - "requirement": "~2.2.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/which", - "requirement": "~1.1.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/wrappy", - "requirement": "~1.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/write-file-atomic", - "requirement": "~1.1.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/validate-npm-package-license", - "requirement": "*", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/deep-equal", - "requirement": "~1.0.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/marked", - "requirement": "~0.3.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/marked-man", - "requirement": "~0.1.5", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/nock", - "requirement": "~2.10.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-registry-couchapp", - "requirement": "~2.6.7", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/npm-registry-mock", - "requirement": "~1.0.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/require-inject", - "requirement": "~1.2.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/sprintf-js", - "requirement": "~1.0.2", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/tap", - "requirement": "~1.3.1", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - } - ], - "contains_source_code": null, - "source_packages": [], - "extra_data": {}, - "purl": "pkg:npm/npm@2.13.5", - "repository_homepage_url": "https://www.npmjs.com/package/npm", - "repository_download_url": "https://registry.npmjs.org/npm/-/npm-2.13.5.tgz", - "api_data_url": "https://registry.npmjs.org/npm/2.13.5", - "files": [ - { - "path": "scan/package.json", - "type": "file" - } - ] - } - ] + "packages": [] }, "files": [ { diff --git a/tests/summarycode/data/full_summary/summary_by_facet.expected.json b/tests/summarycode/data/full_summary/summary_by_facet.expected.json index a088a1c334c..a1cde259f7b 100644 --- a/tests/summarycode/data/full_summary/summary_by_facet.expected.json +++ b/tests/summarycode/data/full_summary/summary_by_facet.expected.json @@ -5,6 +5,7 @@ "options": { "input": "", "--copyright": true, + "--email": true, "--facet": [ "dev=*.java", "dev=*.cs", @@ -16,10 +17,13 @@ "--info": true, "--json-pp": "", "--license": true, + "--package": true, "--summary": true, - "--summary-by-facet": true + "--summary-by-facet": true, + "--url": true }, "notice": "Generated with ScanCode and provided on an \"AS IS\" BASIS, WITHOUT WARRANTIES\nOR CONDITIONS OF ANY KIND, either express or implied. No content created from\nScanCode should be considered or used as legal advice. Consult an Attorney\nfor any legal advice.\nScanCode is a free software code scanning tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.", + "output_format_version": "1.0.0", "message": null, "errors": [], "extra_data": { @@ -210,7 +214,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] }, "summary_by_facet": [ { @@ -297,6 +302,12 @@ "value": null, "count": 2 } + ], + "packages": [ + { + "value": "pkg:npm/npm@2.13.5", + "count": 1 + } ] } }, @@ -412,7 +423,8 @@ "value": null, "count": 1 } - ] + ], + "packages": [] } }, { @@ -447,7 +459,8 @@ "value": "C", "count": 2 } - ] + ], + "packages": [] } }, { @@ -482,7 +495,8 @@ "value": null, "count": 1 } - ] + ], + "packages": [] } }, { @@ -517,7 +531,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] } }, { @@ -527,7 +542,8 @@ "copyrights": [], "holders": [], "authors": [], - "programming_language": [] + "programming_language": [], + "packages": [] } } ], @@ -557,6 +573,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 26, "dirs_count": 9, @@ -588,6 +607,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 7, "dirs_count": 1, @@ -619,6 +641,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 7, "dirs_count": 0, @@ -703,6 +728,15 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://www.fsf.org/", + "start_line": 20, + "end_line": 20 + } + ], "facets": [ "dev" ], @@ -795,6 +829,20 @@ "end_line": 10 } ], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://creativecommons.org/licenses/by/2.5", + "start_line": 5, + "end_line": 5 + }, + { + "url": "http://www.jcip.net/", + "start_line": 6, + "end_line": 6 + } + ], "facets": [ "dev" ], @@ -881,6 +929,15 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://www.fsf.org/", + "start_line": 20, + "end_line": 20 + } + ], "facets": [ "dev" ], @@ -920,6 +977,9 @@ "end_line": 4 } ], + "packages": [], + "emails": [], + "urls": [], "facets": [ "dev" ], @@ -959,6 +1019,9 @@ "end_line": 3 } ], + "packages": [], + "emails": [], + "urls": [], "facets": [ "dev" ], @@ -1045,6 +1108,15 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://www.fsf.org/", + "start_line": 20, + "end_line": 20 + } + ], "facets": [ "dev" ], @@ -1084,6 +1156,9 @@ "end_line": 3 } ], + "packages": [], + "emails": [], + "urls": [], "facets": [ "dev" ], @@ -1117,6 +1192,20 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://zlib.net/zlib-1.2.8.tar.gz", + "start_line": 3, + "end_line": 3 + }, + { + "url": "http://master.dl.sourceforge.net/project/javagroups/JGroups/2.10.0.GA/JGroups-2.10.0.GA.src.zip", + "start_line": 4, + "end_line": 4 + } + ], "facets": [ "docs" ], @@ -1150,6 +1239,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 3, "dirs_count": 0, @@ -1236,6 +1328,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -1322,6 +1417,26 @@ } ], "authors": [], + "packages": [], + "emails": [ + { + "email": "jloup@gzip.org", + "start_line": 23, + "end_line": 23 + }, + { + "email": "madler@alumni.caltech.edu", + "start_line": 23, + "end_line": 23 + } + ], + "urls": [ + { + "url": "http://tools.ietf.org/html/rfc1950", + "start_line": 27, + "end_line": 27 + } + ], "facets": [ "core" ], @@ -1410,6 +1525,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -1484,6 +1602,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -1564,6 +1685,3136 @@ "end_line": 17 } ], + "packages": [ + { + "type": "npm", + "namespace": null, + "name": "npm", + "version": "2.13.5", + "qualifiers": {}, + "subpath": null, + "primary_language": "JavaScript", + "description": "a package manager for JavaScript", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + { + "type": "person", + "role": "contributor", + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Steve Steiner", + "email": "ssteinerX@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Aaron Blohowiak", + "email": "aaron.blohowiak@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Martyn Smith", + "email": "martyn@dollyfish.net.nz", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Charlie Robbins", + "email": "charlie.robbins@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Francisco Treacy", + "email": "francisco.treacy@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Cliffano Subagio", + "email": "cliffano@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Christian Eager", + "email": "christian.eager@nokia.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Dav Glass", + "email": "davglass@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alex K. Wolfe", + "email": "alexkwolfe@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "James Sanders", + "email": "jimmyjazz14@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Reid Burke", + "email": "me@reidburke.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Arlo Breault", + "email": "arlolra@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Timo Derstappen", + "email": "teemow@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Bart Teeuwisse", + "email": "bart.teeuwisse@thecodemill.biz", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ben Noordhuis", + "email": "info@bnoordhuis.nl", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tor Valamo", + "email": "tor.valamo@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Whyme.Lyu", + "email": "5longluna@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Olivier Melcher", + "email": "olivier.melcher@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Toma\u017e Muraus", + "email": "kami@k5-storitve.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Evan Meagher", + "email": "evan.meagher@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Orlando Vazquez", + "email": "ovazquez@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kai Chen", + "email": "kaichenxyz@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "George Miroshnykov", + "email": "gmiroshnykov@lohika.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Geoff Flarity", + "email": "geoff.flarity@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Max Goodman", + "email": "c@chromakode.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Pete Kruckenberg", + "email": "pete@kruckenberg.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Laurie Harper", + "email": "laurie@holoweb.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Chris Wong", + "email": "chris@chriswongstudio.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Scott Bronson", + "email": "brons_github@rinspin.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Federico Romero", + "email": "federomero@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Visnu Pitiyanuvath", + "email": "visnupx@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Irakli Gozalishvili", + "email": "rfobic@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mark Cahill", + "email": "mark@tiemonster.info", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tony", + "email": "zearin@gonk.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Iain Sproat", + "email": "iainsproat@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Trent Mick", + "email": "trentm@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Felix Geisendo\u0308rfer", + "email": "felix@debuggable.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jameson Little", + "email": "t.jameson.little@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Conny Brunnkvist", + "email": "conny@fuchsia.se", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Will Elwood", + "email": "w.elwood08@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Dean Landolt", + "email": "dean@deanlandolt.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Oleg Efimov", + "email": "efimovov@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Martin Cooper", + "email": "mfncooper@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jann Horn", + "email": "jannhorn@googlemail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrew Bradley", + "email": "cspotcode@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Maciej Ma\u0142ecki", + "email": "me@mmalecki.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Stephen Sugden", + "email": "glurgle@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Michael Budde", + "email": "mbudde@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jason Smith", + "email": "jhs@iriscouch.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Gautham Pai", + "email": "buzypi@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "David Trejo", + "email": "david.daniel.trejo@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Paul Vorbach", + "email": "paul@vorb.de", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "George Ornbo", + "email": "george@shapeshed.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tim Oxley", + "email": "secoif@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tyler Green", + "email": "tyler.green2@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Dave Pacheco", + "email": "dap@joyent.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Danila Gerasimov", + "email": "danila.gerasimov@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Rod Vagg", + "email": "rod@vagg.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Christian Howe", + "email": "coderarity@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrew Lunny", + "email": "alunny@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Henrik Hodne", + "email": "dvyjones@binaryhex.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Adam Blackburn", + "email": "regality@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kris Windham", + "email": "kriswindham@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jens Grunert", + "email": "jens.grunert@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Joost-Wim Boekesteijn", + "email": "joost-wim@boekesteijn.nl", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Dalmais Maxence", + "email": "root@ip-10-195-202-5.ec2.internal", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Marcus Ekwall", + "email": "marcus.ekwall@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Aaron Stacy", + "email": "aaron.r.stacy@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Phillip Howell", + "email": "phowell@cothm.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Domenic Denicola", + "email": "domenic@domenicdenicola.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "James Halliday", + "email": "mail@substack.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jeremy Cantrell", + "email": "jmcantrell@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ribettes", + "email": "patlogan29@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Don Park", + "email": "donpark@docuverse.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Einar Otto Stangvik", + "email": "einaros@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kei Son", + "email": "heyacct@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nicolas Morel", + "email": "marsup@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mark Dube", + "email": "markisdee@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Maxim Bogushevich", + "email": "boga1@mail.ru", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Meaglin", + "email": "Meaglin.wasabi@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ben Evans", + "email": "ben@bensbit.co.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nathan Zadoks", + "email": "nathan@nathan7.eu", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Brian White", + "email": "mscdex@mscdex.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jed Schmidt", + "email": "tr@nslator.jp", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ian Livingstone", + "email": "ianl@cs.dal.ca", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Patrick Pfeiffer", + "email": "patrick@buzzle.at", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Paul Miller", + "email": "paul@paulmillr.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ryan Emery", + "email": "seebees@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Carl Lange", + "email": "carl@flax.ie", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jan Lehnardt", + "email": "jan@apache.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Stuart P. Bentley", + "email": "stuart@testtrack4.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Johan Sk\u00f6ld", + "email": "johan@skold.cc", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Stuart Knightley", + "email": "stuart@stuartk.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Niggler", + "email": "nirk.niggler@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Paolo Fragomeni", + "email": "paolo@async.ly", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jaakko Manninen", + "email": "jaakko@rocketpack.fi", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Luke Arduini", + "email": "luke.arduini@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Larz Conwell", + "email": "larz@larz-laptop.(none)", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Marcel Klehr", + "email": "mklehr@gmx.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Robert Kowalski", + "email": "rok@kowalski.gd", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Forbes Lindesay", + "email": "forbes@lindesay.co.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Vaz Allen", + "email": "vaz@tryptid.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jake Verbaten", + "email": "raynos2@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Schabse Laks", + "email": "Dev@SLaks.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Florian Margaine", + "email": "florian@margaine.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Johan Nordberg", + "email": "its@johan-nordberg.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ian Babrou", + "email": "ibobrik@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Di Wu", + "email": "dwu@palantir.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mathias Bynens", + "email": "mathias@qiwi.be", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Matt McClure", + "email": "matt.mcclure@mapmyfitness.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Matt Lunn", + "email": "matt@mattlunn.me.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alexey Kreschuk", + "email": "akrsch@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "elisee", + "email": "elisee@sparklin.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Robert Gieseke", + "email": "robert.gieseke@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Franc\u0327ois Frisch", + "email": "francoisfrisch@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Trevor Burnham", + "email": "tburnham@hubspot.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alan Shaw", + "email": "alan@freestyle-developments.co.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nicholas Kinsey", + "email": "pyro@feisty.io", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Paulo Cesar", + "email": "pauloc062@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Elan Shanker", + "email": "elan.shanker@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jon Spencer", + "email": "jon@jonspencer.ca", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jason Diamond", + "email": "jason@diamond.name", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Maximilian Antoni", + "email": "mail@maxantoni.de", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Thom Blake", + "email": "tblake@brightroll.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jess Martin", + "email": "jessmartin@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Spain Train", + "email": "michael.spainhower@opower.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alex Rodionov", + "email": "p0deje@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Matt Colyer", + "email": "matt@colyer.name", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Evan You", + "email": "yyx990803@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "bitspill", + "email": "bitspill+github@bitspill.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Gabriel Falkenberg", + "email": "gabriel.falkenberg@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alexej Yaroshevich", + "email": "alex@qfox.ru", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Quim Calpe", + "email": "quim@kalpe.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Steve Mason", + "email": "stevem@brandwatch.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Wil Moore III", + "email": "wil.moore@wilmoore.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Sergey Belov", + "email": "peimei@ya.ru", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tom Huang", + "email": "hzlhu.dargon@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "CamilleM", + "email": "camille.moulin@alterway.fr", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "S\u00e9bastien Santoro", + "email": "dereckson@espace-win.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Evan Lucas", + "email": "evan@btc.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Quinn Slack", + "email": "qslack@qslack.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alex Kocharin", + "email": "alex@kocharin.ru", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Daniel Santiago", + "email": "daniel.santiago@highlevelwebs.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Denis Gladkikh", + "email": "outcoldman@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrew Horton", + "email": "andrew.j.horton@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Zeke Sikelianos", + "email": "zeke@sikelianos.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Dylan Greene", + "email": "dylang@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Franck Cuny", + "email": "franck.cuny@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Yeonghoon Park", + "email": "sola92@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Rafael de Oleza", + "email": "rafa@spotify.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mikola Lysenko", + "email": "mikolalysenko@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Yazhong Liu", + "email": "yorkiefixer@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Neil Gentleman", + "email": "ngentleman@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kris Kowal", + "email": "kris.kowal@cixar.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alex Gorbatchev", + "email": "alex.gorbatchev@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Shawn Wildermuth", + "email": "shawn@wildermuth.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Wesley de Souza", + "email": "wesleywex@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "yoyoyogi", + "email": "yogesh.k@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "J. Tangelder", + "email": "j.tangelder@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jean Lauliac", + "email": "jean@lauliac.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrey Kislyuk", + "email": "kislyuk@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Thorsten Lorenz", + "email": "thlorenz@gmx.de", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Julian Gruber", + "email": "julian@juliangruber.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Benjamin Coe", + "email": "bencoe@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alex Ford", + "email": "Alex.Ford@CodeTunnel.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Matt Hickford", + "email": "matt.hickford@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Sean McGivern", + "email": "sean.mcgivern@rightscale.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "C J Silverio", + "email": "ceejceej@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Robin Tweedie", + "email": "robin@songkick.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Miroslav Bajto\u0161", + "email": "miroslav@strongloop.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "David Glasser", + "email": "glasser@davidglasser.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Gianluca Casati", + "email": "casati_gianluca@yahoo.it", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Forrest L Norvell", + "email": "ogd@aoaioxxysz.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Karsten Tinnefeld", + "email": "k.tinnefeld@googlemail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Bryan Burgers", + "email": "bryan@burgers.io", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "David Beitey", + "email": "david@davidjb.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Evan You", + "email": "yyou@google.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Zach Pomerantz", + "email": "zmp@umich.edu", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Chris Williams", + "email": "cwilliams88@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "sudodoki", + "email": "smd.deluzion@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mick Thompson", + "email": "dthompson@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Felix Rabe", + "email": "felix@rabe.io", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Michael Hayes", + "email": "michael@hayes.io", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Chris Dickinson", + "email": "christopher.s.dickinson@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Bradley Meck", + "email": "bradley.meck@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "GeJ", + "email": "geraud@gcu.info", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrew Terris", + "email": "atterris@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Michael Nisi", + "email": "michael.nisi@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "fengmk2", + "email": "fengmk2@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Adam Meadows", + "email": "adam.meadows@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Chulki Lee", + "email": "chulki.lee@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "\u4e0d\u56db", + "email": "busi.hyy@taobao.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "dead_horse", + "email": "dead_horse@qq.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kenan Yildirim", + "email": "kenan@kenany.me", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Laurie Voss", + "email": "git@seldo.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Rebecca Turner", + "email": "me@re-becca.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Hunter Loftis", + "email": "hunter@hunterloftis.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Peter Richardson", + "email": "github@zoomy.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jussi Kalliokoski", + "email": "jussi.kalliokoski@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Filip Weiss", + "email": "me@fiws.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Timo Wei\u00df", + "email": "timoweiss@Timo-MBP.local", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Christopher Hiller", + "email": "chiller@badwing.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "J\u00e9r\u00e9my Lal", + "email": "kapouer@melix.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Anders Janmyr", + "email": "anders@janmyr.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Chris Meyers", + "email": "chris.meyers.fsu@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ludwig Magnusson", + "email": "ludwig@mediatool.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Wout Mertens", + "email": "Wout.Mertens@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nick Santos", + "email": "nick@medium.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Terin Stock", + "email": "terinjokes@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Faiq Raza", + "email": "faiqrazarizvi@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Thomas Torp", + "email": "thomas@erupt.no", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Sam Mikes", + "email": "smikes@cubane.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mat Tyndall", + "email": "mat.tyndall@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tauren Mills", + "email": "tauren@sportzing.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ron Martinez", + "email": "ramartin.net@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kazuhito Hokamura", + "email": "k.hokamura@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tristan Davies", + "email": "github@tristan.io", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "David Volm", + "email": "david@volminator.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Lin Clark", + "email": "lin.w.clark@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ben Page", + "email": "bpage@dewalch.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jeff Jo", + "email": "jeffjo@squareup.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "martinvd", + "email": "martinvdpub@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mark J. Titorenko", + "email": "nospam-github.com@titorenko.net", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Oddur Sigurdsson", + "email": "oddurs@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Eric Mill", + "email": "eric@konklone.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Gabriel Barros", + "email": "descartavel1@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "KevinSheedy", + "email": "kevinsheedy@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Aleksey Smolenchuk", + "email": "aleksey@uber.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ed Morley", + "email": "emorley@mozilla.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Blaine Bublitz", + "email": "blaine@iceddev.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrey Fedorov", + "email": "anfedorov@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Daijiro Wachi", + "email": "daijiro.wachi@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Luc Thevenard", + "email": "lucthevenard@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Aria Stewart", + "email": "aredridel@nbtsc.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Charlie Rudolph", + "email": "charles.w.rudolph@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Vladimir Rutsky", + "email": "rutsky@users.noreply.github.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Isaac Murchie", + "email": "isaac@saucelabs.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Marcin Wosinek", + "email": "marcin.wosinek@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "David Marr", + "email": "davemarr@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Bryan English", + "email": "bryan@bryanenglish.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Anthony Zotti", + "email": "amZotti@users.noreply.github.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Karl Horky", + "email": "karl.horky@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Gu\u00f0laugur Stef\u00e1n Egilsson", + "email": "gulli@kolibri.is", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Helge Skogly Holm", + "email": "helge.holm@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Peter A. Shevtsov", + "email": "petr.shevtsov@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Alain Kalker", + "email": "a.c.kalker@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Bryant Williams", + "email": "b.n.williams@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jonas Weber", + "email": "github@jonasw.de", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Tim Whidden", + "email": "twhid@twhid.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andreas", + "email": "functino@users.noreply.github.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Karolis Narkevicius", + "email": "karolis.n@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Adrian Lynch", + "email": "adi_ady_ade@hotmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Richard Littauer", + "email": "richard.littauer@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Oli Evans", + "email": "oli@zilla.org.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Matt Brennan", + "email": "mattyb1000@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jeff Barczewski", + "email": "jeff.barczewski@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Danny Fritz", + "email": "dannyfritz@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Takaya Kobayashi", + "email": "jigsaw@live.jp", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ra'Shaun Stovall", + "email": "rashaunstovall@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Julien Meddah", + "email": "julien.meddah@deveryware.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Michiel Sikma", + "email": "michiel@wedemandhtml.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jakob Krigovsky", + "email": "jakob.krigovsky@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Charmander", + "email": "~@charmander.me", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Erik Wienhold", + "email": "git@ewie.name", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "James Butler", + "email": "james.butler@sandfox.co.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kevin Kragenbrink", + "email": "kevin@gaikai.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Arnaud Rinquin", + "email": "rinquin.arnaud@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Mike MacCana", + "email": "mike.maccana@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Antti Mattila", + "email": "anttti@fastmail.fm", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "laiso", + "email": "laiso@lai.so", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Matt Zorn", + "email": "zornme@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kyle Mitchell", + "email": "kyle@kemitchell.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Jeremiah Senkpiel", + "email": "fishrock123@rocketmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Michael Klein", + "email": "mischkl@users.noreply.github.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Simen Bekkhus", + "email": "sbekkhus91@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Victor", + "email": "victor.shih@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "thefourtheye", + "email": "thechargingvolcano@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Clay Carpenter", + "email": "claycarpenter@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "bangbang93", + "email": "bangbang93@163.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nick Malaguti", + "email": "nmalaguti@palantir.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Cedric Nelson", + "email": "cedric.nelson@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kat March\u00e1n", + "email": "kzm@sykosomatic.org", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrew", + "email": "talktome@aboutandrew.co.uk", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Eduardo Pinho", + "email": "enet4mikeenet@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Rachel Hutchison", + "email": "rhutchix@intel.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Ryan Temple", + "email": "ryantemple145@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Eugene Sharygin", + "email": "eush77@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Nick Heiner", + "email": "nick.heiner@opower.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "James Talmage", + "email": "james@talmage.io", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "jane arc", + "email": "jane@uber.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Joseph Dykstra", + "email": "josephdykstra@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Joshua Egan", + "email": "josh-egan@users.noreply.github.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Thomas Cort", + "email": "thomasc@ssimicro.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Thaddee Tyl", + "email": "thaddee.tyl@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Steve Klabnik", + "email": "steve@steveklabnik.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Andrew Murray", + "email": "radarhere@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Stephan B\u00f6nnemann", + "email": "stephan@excellenteasy.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Kyle M. Tarplee", + "email": "kyle.tarplee@numerica.us", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Derek Peterson", + "email": "derekpetey@gmail.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "Greg Whiteley", + "email": "greg.whiteley@atomos.com", + "url": null + }, + { + "type": "person", + "role": "contributor", + "name": "murgatroid99", + "email": "mlumish@google.com", + "url": null + }, + { + "type": "person", + "role": "maintainer", + "name": "isaacs", + "email": "isaacs@npmjs.com", + "url": null + }, + { + "type": "person", + "role": "maintainer", + "name": "othiym23", + "email": "ogd@aoaioxxysz.net", + "url": null + }, + { + "type": "person", + "role": "maintainer", + "name": "iarna", + "email": "me@re-becca.org", + "url": null + }, + { + "type": "person", + "role": "maintainer", + "name": "zkat", + "email": "kat@sykosomatic.org", + "url": null + } + ], + "keywords": [ + "package manager", + "modules", + "install", + "package.json" + ], + "homepage_url": "https://docs.npmjs.com/", + "download_url": "https://registry.npmjs.org/npm/-/npm-2.13.5.tgz", + "size": null, + "sha1": "a124386bce4a90506f28ad4b1d1a804a17baaf32", + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": "http://github.com/npm/npm/issues", + "code_view_url": null, + "vcs_url": "git+https://github.com/npm/npm.git@fc7bbf03e39cc48a8924b90696d28345a6a90f3c", + "copyright": null, + "license_expression": "artistic-2.0", + "declared_license": [ + "Artistic-2.0" + ], + "notice_text": null, + "root_path": "scan", + "dependencies": [ + { + "purl": "pkg:npm/abbrev", + "requirement": "~1.0.7", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/ansi", + "requirement": "~0.3.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/ansicolors", + "requirement": "~0.3.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/ansistyles", + "requirement": "~0.1.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/archy", + "requirement": "~1.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/async-some", + "requirement": "~1.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/block-stream", + "requirement": "0.0.8", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/char-spinner", + "requirement": "~1.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/chmodr", + "requirement": "~1.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/chownr", + "requirement": "0.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/cmd-shim", + "requirement": "~2.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/columnify", + "requirement": "~1.5.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/config-chain", + "requirement": "~1.1.9", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/dezalgo", + "requirement": "~1.0.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/editor", + "requirement": "~1.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/fs-vacuum", + "requirement": "~1.2.6", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/fs-write-stream-atomic", + "requirement": "~1.0.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/fstream", + "requirement": "~1.0.7", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/fstream-npm", + "requirement": "~1.0.4", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/github-url-from-git", + "requirement": "~1.4.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/github-url-from-username-repo", + "requirement": "~1.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/glob", + "requirement": "~5.0.14", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/graceful-fs", + "requirement": "~4.1.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/hosted-git-info", + "requirement": "~2.1.4", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/inflight", + "requirement": "~1.0.4", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/inherits", + "requirement": "~2.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/ini", + "requirement": "~1.3.4", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/init-package-json", + "requirement": "~1.7.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/lockfile", + "requirement": "~1.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/lru-cache", + "requirement": "~2.6.5", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/minimatch", + "requirement": "~2.0.10", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/mkdirp", + "requirement": "~0.5.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/node-gyp", + "requirement": "~2.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/nopt", + "requirement": "~3.0.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/normalize-git-url", + "requirement": "~3.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/normalize-package-data", + "requirement": "~2.3.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-cache-filename", + "requirement": "~1.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-install-checks", + "requirement": "~1.0.6", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-package-arg", + "requirement": "~4.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-registry-client", + "requirement": "~6.5.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-user-validate", + "requirement": "~0.1.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/npmlog", + "requirement": "~1.2.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/once", + "requirement": "~1.3.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/opener", + "requirement": "~1.4.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/osenv", + "requirement": "~0.1.3", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/path-is-inside", + "requirement": "~1.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/read", + "requirement": "~1.0.6", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/read-installed", + "requirement": "~4.0.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/read-package-json", + "requirement": "~2.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/readable-stream", + "requirement": "~1.1.13", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/realize-package-specifier", + "requirement": "~3.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/request", + "requirement": "~2.60.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/retry", + "requirement": "~0.6.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/rimraf", + "requirement": "~2.4.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/semver", + "requirement": "~5.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/sha", + "requirement": "~1.3.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/slide", + "requirement": "~1.1.6", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/sorted-object", + "requirement": "~1.0.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/spdx", + "requirement": "~0.4.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/tar", + "requirement": "~2.1.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/text-table", + "requirement": "~0.2.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/uid-number", + "requirement": "0.0.6", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/umask", + "requirement": "~1.1.0", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/validate-npm-package-name", + "requirement": "~2.2.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/which", + "requirement": "~1.1.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/wrappy", + "requirement": "~1.0.1", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/write-file-atomic", + "requirement": "~1.1.2", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/validate-npm-package-license", + "requirement": "*", + "scope": "dependencies", + "is_runtime": true, + "is_optional": false, + "is_resolved": false + }, + { + "purl": "pkg:npm/deep-equal", + "requirement": "~1.0.0", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/marked", + "requirement": "~0.3.3", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/marked-man", + "requirement": "~0.1.5", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/nock", + "requirement": "~2.10.0", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-registry-couchapp", + "requirement": "~2.6.7", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/npm-registry-mock", + "requirement": "~1.0.0", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/require-inject", + "requirement": "~1.2.0", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/sprintf-js", + "requirement": "~1.0.2", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + }, + { + "purl": "pkg:npm/tap", + "requirement": "~1.3.1", + "scope": "devDependencies", + "is_runtime": false, + "is_optional": true, + "is_resolved": false + } + ], + "contains_source_code": null, + "source_packages": [], + "extra_data": {}, + "purl": "pkg:npm/npm@2.13.5", + "repository_homepage_url": "https://www.npmjs.com/package/npm", + "repository_download_url": "https://registry.npmjs.org/npm/-/npm-2.13.5.tgz", + "api_data_url": "https://registry.npmjs.org/npm/2.13.5", + "files": [ + { + "path": "scan/package.json", + "type": "file" + } + ] + } + ], + "emails": [ + { + "email": "i@izs.me", + "start_line": 18, + "end_line": 18 + }, + { + "email": "ssteinerX@gmail.com", + "start_line": 206, + "end_line": 206 + }, + { + "email": "mikeal.rogers@gmail.com", + "start_line": 210, + "end_line": 210 + }, + { + "email": "aaron.blohowiak@gmail.com", + "start_line": 214, + "end_line": 214 + }, + { + "email": "martyn@dollyfish.net.nz", + "start_line": 218, + "end_line": 218 + }, + { + "email": "charlie.robbins@gmail.com", + "start_line": 222, + "end_line": 222 + }, + { + "email": "francisco.treacy@gmail.com", + "start_line": 226, + "end_line": 226 + }, + { + "email": "cliffano@gmail.com", + "start_line": 230, + "end_line": 230 + }, + { + "email": "christian.eager@nokia.com", + "start_line": 234, + "end_line": 234 + }, + { + "email": "davglass@gmail.com", + "start_line": 238, + "end_line": 238 + }, + { + "email": "alexkwolfe@gmail.com", + "start_line": 242, + "end_line": 242 + }, + { + "email": "jimmyjazz14@gmail.com", + "start_line": 246, + "end_line": 246 + }, + { + "email": "me@reidburke.com", + "start_line": 250, + "end_line": 250 + }, + { + "email": "arlolra@gmail.com", + "start_line": 254, + "end_line": 254 + }, + { + "email": "teemow@gmail.com", + "start_line": 258, + "end_line": 258 + }, + { + "email": "bart.teeuwisse@thecodemill.biz", + "start_line": 262, + "end_line": 262 + }, + { + "email": "info@bnoordhuis.nl", + "start_line": 266, + "end_line": 266 + }, + { + "email": "tor.valamo@gmail.com", + "start_line": 270, + "end_line": 270 + }, + { + "email": "5longluna@gmail.com", + "start_line": 274, + "end_line": 274 + }, + { + "email": "olivier.melcher@gmail.com", + "start_line": 278, + "end_line": 278 + }, + { + "email": "kami@k5-storitve.net", + "start_line": 282, + "end_line": 282 + }, + { + "email": "evan.meagher@gmail.com", + "start_line": 286, + "end_line": 286 + }, + { + "email": "ovazquez@gmail.com", + "start_line": 290, + "end_line": 290 + }, + { + "email": "kaichenxyz@gmail.com", + "start_line": 294, + "end_line": 294 + }, + { + "email": "gmiroshnykov@lohika.com", + "start_line": 298, + "end_line": 298 + }, + { + "email": "geoff.flarity@gmail.com", + "start_line": 302, + "end_line": 302 + }, + { + "email": "c@chromakode.com", + "start_line": 306, + "end_line": 306 + }, + { + "email": "pete@kruckenberg.com", + "start_line": 310, + "end_line": 310 + }, + { + "email": "laurie@holoweb.net", + "start_line": 314, + "end_line": 314 + }, + { + "email": "chris@chriswongstudio.com", + "start_line": 318, + "end_line": 318 + }, + { + "email": "brons_github@rinspin.com", + "start_line": 322, + "end_line": 322 + }, + { + "email": "federomero@gmail.com", + "start_line": 326, + "end_line": 326 + }, + { + "email": "visnupx@gmail.com", + "start_line": 330, + "end_line": 330 + }, + { + "email": "rfobic@gmail.com", + "start_line": 334, + "end_line": 334 + }, + { + "email": "mark@tiemonster.info", + "start_line": 338, + "end_line": 338 + }, + { + "email": "zearin@gonk.net", + "start_line": 342, + "end_line": 342 + }, + { + "email": "iainsproat@gmail.com", + "start_line": 346, + "end_line": 346 + }, + { + "email": "trentm@gmail.com", + "start_line": 350, + "end_line": 350 + }, + { + "email": "felix@debuggable.com", + "start_line": 354, + "end_line": 354 + }, + { + "email": "t.jameson.little@gmail.com", + "start_line": 358, + "end_line": 358 + }, + { + "email": "conny@fuchsia.se", + "start_line": 362, + "end_line": 362 + }, + { + "email": "w.elwood08@gmail.com", + "start_line": 366, + "end_line": 366 + }, + { + "email": "dean@deanlandolt.com", + "start_line": 370, + "end_line": 370 + }, + { + "email": "efimovov@gmail.com", + "start_line": 374, + "end_line": 374 + }, + { + "email": "mfncooper@gmail.com", + "start_line": 378, + "end_line": 378 + }, + { + "email": "jannhorn@googlemail.com", + "start_line": 382, + "end_line": 382 + }, + { + "email": "cspotcode@gmail.com", + "start_line": 386, + "end_line": 386 + }, + { + "email": "me@mmalecki.com", + "start_line": 390, + "end_line": 390 + }, + { + "email": "glurgle@gmail.com", + "start_line": 394, + "end_line": 394 + }, + { + "email": "mbudde@gmail.com", + "start_line": 398, + "end_line": 398 + } + ], + "urls": [ + { + "url": "https://docs.npmjs.com/", + "start_line": 15, + "end_line": 15 + }, + { + "url": "http://blog.izs.me/", + "start_line": 19, + "end_line": 19 + }, + { + "url": "https://github.com/npm/npm.git", + "start_line": 23, + "end_line": 23 + }, + { + "url": "http://github.com/npm/npm/issues", + "start_line": 26, + "end_line": 26 + }, + { + "url": "http://registry.npmjs.org/npm/-/npm-2.13.5.tgz", + "start_line": 1549, + "end_line": 1549 + }, + { + "url": "https://registry.npmjs.org/npm/-/npm-2.13.5.tgz", + "start_line": 1569, + "end_line": 1569 + } + ], "facets": [ "core" ], @@ -1597,6 +4848,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 13, "dirs_count": 5, @@ -1628,6 +4882,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 1, "dirs_count": 0, @@ -1752,6 +5009,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "dev" ], @@ -1840,6 +5100,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -1928,6 +5191,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -2016,6 +5282,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -2049,6 +5318,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 2, "dirs_count": 0, @@ -2092,6 +5364,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "dev" ], @@ -2180,6 +5455,15 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://www.boost.org/LICENSE_1_0.txt", + "start_line": 5, + "end_line": 5 + } + ], "facets": [ "dev" ], @@ -2213,6 +5497,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 1, "dirs_count": 0, @@ -2303,6 +5590,25 @@ "end_line": 12 } ], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://www.zlib.net/", + "start_line": 33, + "end_line": 33 + }, + { + "url": "http://www.winimage.com/zLibDll", + "start_line": 34, + "end_line": 34 + }, + { + "url": "http://www.muppetlabs.com/~breadbox/software/assembly.html", + "start_line": 35, + "end_line": 35 + } + ], "facets": [ "data" ], @@ -2336,6 +5642,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 2, "dirs_count": 0, @@ -2422,6 +5731,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "tests" ], @@ -2510,6 +5822,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "tests" ], @@ -2543,6 +5858,9 @@ "copyrights": [], "holders": [], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [], "files_count": 1, "dirs_count": 0, @@ -2627,6 +5945,15 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [ + { + "url": "http://www.cmr.no/", + "start_line": 7, + "end_line": 7 + } + ], "facets": [ "core" ], @@ -2713,6 +6040,20 @@ } ], "authors": [], + "packages": [], + "emails": [ + { + "email": "jloup@gzip.org", + "start_line": 23, + "end_line": 23 + }, + { + "email": "madler@alumni.caltech.edu", + "start_line": 23, + "end_line": 23 + } + ], + "urls": [], "facets": [ "core" ], @@ -2801,6 +6142,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], @@ -2889,6 +6233,9 @@ } ], "authors": [], + "packages": [], + "emails": [], + "urls": [], "facets": [ "core" ], diff --git a/tests/summarycode/data/full_summary/summary_details.expected.json b/tests/summarycode/data/full_summary/summary_details.expected.json index e5cc26ad0a3..38cb516cb55 100644 --- a/tests/summarycode/data/full_summary/summary_details.expected.json +++ b/tests/summarycode/data/full_summary/summary_details.expected.json @@ -12,6 +12,7 @@ "--summary-with-details": true }, "notice": "Generated with ScanCode and provided on an \"AS IS\" BASIS, WITHOUT WARRANTIES\nOR CONDITIONS OF ANY KIND, either express or implied. No content created from\nScanCode should be considered or used as legal advice. Consult an Attorney\nfor any legal advice.\nScanCode is a free software code scanning tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.", + "output_format_version": "1.0.0", "message": null, "errors": [], "extra_data": { @@ -202,7 +203,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] }, "files": [ { @@ -413,7 +415,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] }, "files_count": 26, "dirs_count": 9, @@ -520,7 +523,8 @@ "value": "Java", "count": 7 } - ] + ], + "packages": [] }, "files_count": 7, "dirs_count": 1, @@ -627,7 +631,8 @@ "value": "Java", "count": 7 } - ] + ], + "packages": [] }, "files_count": 7, "dirs_count": 0, @@ -743,7 +748,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -865,7 +871,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -981,7 +988,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1050,7 +1058,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1119,7 +1128,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1235,7 +1245,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1304,7 +1315,8 @@ "value": "Java", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1367,7 +1379,8 @@ "value": null, "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1446,7 +1459,8 @@ "value": "C", "count": 3 } - ] + ], + "packages": [] }, "files_count": 3, "dirs_count": 0, @@ -1564,7 +1578,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1680,7 +1695,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1798,7 +1814,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -1902,7 +1919,8 @@ "value": null, "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -4857,6 +4875,12 @@ "value": null, "count": 1 } + ], + "packages": [ + { + "value": "pkg:npm/npm@2.13.5", + "count": 1 + } ] }, "files_count": 0, @@ -5004,7 +5028,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] }, "files_count": 13, "dirs_count": 5, @@ -5067,7 +5092,8 @@ "value": null, "count": 1 } - ] + ], + "packages": [] }, "files_count": 1, "dirs_count": 0, @@ -5223,7 +5249,8 @@ "value": null, "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -5341,7 +5368,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -5459,7 +5487,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -5577,7 +5606,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -5648,7 +5678,8 @@ "value": "C#", "count": 2 } - ] + ], + "packages": [] }, "files_count": 2, "dirs_count": 0, @@ -5723,7 +5754,8 @@ "value": "C#", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -5841,7 +5873,8 @@ "value": "C#", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -5904,7 +5937,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] }, "files_count": 1, "dirs_count": 0, @@ -6026,7 +6060,8 @@ "value": "GAS", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -6089,7 +6124,8 @@ "value": "C", "count": 2 } - ] + ], + "packages": [] }, "files_count": 2, "dirs_count": 0, @@ -6207,7 +6243,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -6325,7 +6362,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -6388,7 +6426,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 1, "dirs_count": 0, @@ -6504,7 +6543,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -6620,7 +6660,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -6738,7 +6779,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, @@ -6856,7 +6898,8 @@ "value": "C", "count": 1 } - ] + ], + "packages": [] }, "files_count": 0, "dirs_count": 0, diff --git a/tests/summarycode/data/packages/expected.json b/tests/summarycode/data/packages/expected.json index a3bd458441d..030242570ab 100644 --- a/tests/summarycode/data/packages/expected.json +++ b/tests/summarycode/data/packages/expected.json @@ -9,6 +9,7 @@ "--summary": true }, "notice": "Generated with ScanCode and provided on an \"AS IS\" BASIS, WITHOUT WARRANTIES\nOR CONDITIONS OF ANY KIND, either express or implied. No content created from\nScanCode should be considered or used as legal advice. Consult an Attorney\nfor any legal advice.\nScanCode is a free software code scanning tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.", + "output_format_version": "1.0.0", "message": null, "errors": [], "extra_data": { @@ -18,660 +19,7 @@ } ], "summary": { - "packages": [ - { - "type": "maven", - "namespace": "aopalliance", - "name": "aopalliance", - "version": "1.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "Java", - "description": "AOP alliance\nAOP Alliance", - "release_date": null, - "parties": [], - "keywords": [], - "homepage_url": "http://aopalliance.sourceforge.net", - "download_url": null, - "size": null, - "sha1": null, - "md5": null, - "sha256": null, - "sha512": null, - "bug_tracking_url": null, - "code_view_url": null, - "vcs_url": null, - "copyright": null, - "license_expression": "public-domain", - "declared_license": [ - { - "name": "Public Domain", - "url": null, - "comments": null, - "distribution": null - } - ], - "notice_text": null, - "root_path": "scan/aopalliance/aopalliance/1.0", - "dependencies": [], - "contains_source_code": null, - "source_packages": [ - "pkg:maven/aopalliance/aopalliance@1.0?classifier=sources" - ], - "extra_data": {}, - "purl": "pkg:maven/aopalliance/aopalliance@1.0", - "repository_homepage_url": "https://repo1.maven.org/maven2/aopalliance/aopalliance/1.0/", - "repository_download_url": "https://repo1.maven.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.jar", - "api_data_url": "https://repo1.maven.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.pom", - "files": [ - { - "path": "scan/aopalliance/aopalliance/1.0/aopalliance-1.0.pom", - "type": "file" - } - ] - }, - { - "type": "freebsd", - "namespace": null, - "name": "dmidecode", - "version": "2.12", - "qualifiers": { - "arch": "freebsd:10:x86:64", - "origin": "sysutils/dmidecode" - }, - "subpath": null, - "primary_language": null, - "description": "Dmidecode is a tool or dumping a computer's DMI (some say SMBIOS) table\ncontents in a human-readable format. The output contains a description of the\nsystem's hardware components, as well as other useful pieces of information\nsuch as serial numbers and BIOS revision.\n\nWWW: http://www.nongnu.org/dmidecode/", - "release_date": null, - "parties": [ - { - "type": "person", - "role": "maintainer", - "name": null, - "email": "anders@FreeBSD.org", - "url": null - } - ], - "keywords": [ - "sysutils" - ], - "homepage_url": "http://www.nongnu.org/dmidecode/", - "download_url": "https://pkg.freebsd.org/freebsd:10:x86:64/latest/All/dmidecode-2.12.txz", - "size": null, - "sha1": null, - "md5": null, - "sha256": null, - "sha512": null, - "bug_tracking_url": null, - "code_view_url": "https://svnweb.freebsd.org/ports/head/sysutils/dmidecode", - "vcs_url": null, - "copyright": null, - "license_expression": "gpl-2.0", - "declared_license": { - "licenses": [ - "GPLv2" - ], - "licenselogic": "single" - }, - "notice_text": null, - "root_path": "scan/freebsd/basic", - "dependencies": [], - "contains_source_code": null, - "source_packages": [], - "extra_data": {}, - "purl": "pkg:freebsd/dmidecode@2.12?arch=freebsd:10:x86:64&origin=sysutils/dmidecode", - "repository_homepage_url": null, - "repository_download_url": null, - "api_data_url": null, - "files": [ - { - "path": "scan/freebsd/basic/+COMPACT_MANIFEST", - "type": "file" - } - ] - }, - { - "type": "npm", - "namespace": "@ionic", - "name": "app-scripts", - "version": "3.0.1-201710301651", - "qualifiers": {}, - "subpath": null, - "primary_language": "JavaScript", - "description": "Scripts for Ionic Projects", - "release_date": null, - "parties": [ - { - "type": "person", - "role": "author", - "name": "Ionic Team", - "email": "hi@ionic.io", - "url": "https://ionic.io" - } - ], - "keywords": [], - "homepage_url": "https://ionicframework.com/", - "download_url": "https://registry.npmjs.org/@ionic/app-scripts/-/app-scripts-3.0.1-201710301651.tgz", - "size": null, - "sha1": null, - "md5": null, - "sha256": null, - "sha512": null, - "bug_tracking_url": "https://github.com/ionic-team/ionic-app-scripts/issues", - "code_view_url": null, - "vcs_url": "git+https://github.com/ionic-team/ionic-app-scripts.git", - "copyright": null, - "license_expression": "mit", - "declared_license": [ - "MIT" - ], - "notice_text": null, - "root_path": "scan/scoped1", - "dependencies": [ - { - "purl": "pkg:npm/%40angular-devkit/build-optimizer", - "requirement": "^0.0.31", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/autoprefixer", - "requirement": "^7.1.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/chalk", - "requirement": "^2.3.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/chokidar", - "requirement": "^1.7.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/clean-css", - "requirement": "^4.1.9", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/cross-spawn", - "requirement": "^5.1.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/express", - "requirement": "^4.16.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/fs-extra", - "requirement": "^4.0.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/glob", - "requirement": "^7.1.2", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/json-loader", - "requirement": "^0.5.7", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/node-sass", - "requirement": "^4.5.3", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/os-name", - "requirement": "^2.0.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/postcss", - "requirement": "^6.0.13", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/proxy-middleware", - "requirement": "^0.15.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/reflect-metadata", - "requirement": "^0.1.10", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/rollup", - "requirement": "0.50.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/rollup-plugin-commonjs", - "requirement": "8.2.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/rollup-plugin-node-resolve", - "requirement": "3.0.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/source-map", - "requirement": "^0.6.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/tiny-lr", - "requirement": "^1.0.5", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/tslint", - "requirement": "^5.8.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/tslint-eslint-rules", - "requirement": "^4.1.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/uglify-es", - "requirement": "^3.1.6", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/webpack", - "requirement": "^3.8.1", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/ws", - "requirement": "^3.2.0", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/xml2js", - "requirement": "^0.4.19", - "scope": "dependencies", - "is_runtime": true, - "is_optional": false, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/animations", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/common", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/compiler", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/compiler-cli", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/core", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/forms", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/http", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/platform-browser", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/platform-browser-dynamic", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/platform-server", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40angular/tsc-wrapped", - "requirement": "4.4.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/chokidar", - "requirement": "^1.7.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/clean-css", - "requirement": "^3.4.29", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/express", - "requirement": "^4.0.39", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/fs-extra", - "requirement": "^4.0.3", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/glob", - "requirement": "^5.0.30", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/jest", - "requirement": "^21.1.5", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/mock-fs", - "requirement": "^3.6.30", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/node", - "requirement": "^8.0.47", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/node-sass", - "requirement": "^3.10.32", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/rewire", - "requirement": "^2.5.27", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/webpack", - "requirement": "^3.0.14", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/%40types/ws", - "requirement": "^3.2.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/conventional-changelog-cli", - "requirement": "^1.3.1", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/github", - "requirement": "0.2.4", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/ionic-cz-conventional-changelog", - "requirement": "^1.0.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/jest", - "requirement": "^21.2.1", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/mock-fs", - "requirement": "^4.4.2", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/rewire", - "requirement": "^2.5.2", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/rimraf", - "requirement": "^2.6.1", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/rxjs", - "requirement": "^5.5.2", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/sw-toolbox", - "requirement": "^3.6.0", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/tslint-ionic-rules", - "requirement": "^0.0.11", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/typescript", - "requirement": "~2.3.4", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - }, - { - "purl": "pkg:npm/zone.js", - "requirement": "^0.8.17", - "scope": "devDependencies", - "is_runtime": false, - "is_optional": true, - "is_resolved": false - } - ], - "contains_source_code": null, - "source_packages": [], - "extra_data": {}, - "purl": "pkg:npm/%40ionic/app-scripts@3.0.1-201710301651", - "repository_homepage_url": "https://www.npmjs.com/package/@ionic/app-scripts", - "repository_download_url": "https://registry.npmjs.org/@ionic/app-scripts/-/app-scripts-3.0.1-201710301651.tgz", - "api_data_url": "https://registry.npmjs.org/@ionic%2fapp-scripts", - "files": [ - { - "path": "scan/scoped1/package.json", - "type": "file" - } - ] - } - ] + "packages": [] }, "files": [ { diff --git a/tests/summarycode/test_summarizer.py b/tests/summarycode/test_summarizer.py index 7072eb046ec..5d6b576db62 100644 --- a/tests/summarycode/test_summarizer.py +++ b/tests/summarycode/test_summarizer.py @@ -99,7 +99,7 @@ def test_full_summary_by_facet(self): result_file = self.get_temp_file('json') expected_file = self.get_test_loc('full_summary/summary_by_facet.expected.json') run_scan_click([ - '-cli', + '-clpieu', '--facet', 'dev=*.java', '--facet', 'dev=*.cs', '--facet', 'dev=*ada*',