From eb813e18607275fea4d8ebca1d94c8d9db6c0b53 Mon Sep 17 00:00:00 2001 From: Ritiek Malhotra Date: Thu, 7 Mar 2019 16:23:47 +0530 Subject: [PATCH 1/5] Add toml as a dependency Signed-off-by: Ritiek Malhotra --- setup.py | 1 + src/packagedcode/__init__.py | 2 + src/packagedcode/cargo.py | 39 ++++++++++++++++++ .../gemspec/cat.gemspec.expected.json | 5 ++- thirdparty/toml-0.10.0-py2.py3-none-any.whl | Bin 0 -> 25796 bytes .../toml-0.10.0-py2.py3-none-any.whl.ABOUT | 15 +++++++ thirdparty/toml-0.10.0.tar.gz | Bin 0 -> 16719 bytes thirdparty/toml.LICENSE | 26 ++++++++++++ 8 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/packagedcode/cargo.py create mode 100644 thirdparty/toml-0.10.0-py2.py3-none-any.whl create mode 100644 thirdparty/toml-0.10.0-py2.py3-none-any.whl.ABOUT create mode 100644 thirdparty/toml-0.10.0.tar.gz create mode 100644 thirdparty/toml.LICENSE diff --git a/setup.py b/setup.py index b32c3fa3024..fa989d44efd 100644 --- a/setup.py +++ b/setup.py @@ -178,6 +178,7 @@ def read(*names, **kwargs): 'packageurl-python >= 0.7.0', 'xmltodict >= 0.11.0', 'javaproperties >= 0.5', + 'toml >= 0.10.0', # scancode 'click >= 6.0.0, < 7.0.0', diff --git a/src/packagedcode/__init__.py b/src/packagedcode/__init__.py index 704e2a843f8..668e24c444d 100644 --- a/src/packagedcode/__init__.py +++ b/src/packagedcode/__init__.py @@ -26,6 +26,7 @@ from __future__ import unicode_literals from packagedcode import models +from packagedcode import cargo from packagedcode import freebsd from packagedcode import haxe from packagedcode import maven @@ -54,6 +55,7 @@ npm.NpmPackage, phpcomposer.PHPComposerPackage, haxe.HaxePackage, + cargo.RustCargoCrate, models.MeteorPackage, models.BowerPackage, freebsd.FreeBSDPackage, diff --git a/src/packagedcode/cargo.py b/src/packagedcode/cargo.py new file mode 100644 index 00000000000..beb58d0aff2 --- /dev/null +++ b/src/packagedcode/cargo.py @@ -0,0 +1,39 @@ + +# Copyright (c) 2018 nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/scancode-toolkit/ +# The ScanCode software is licensed under the Apache License version 2.0. +# Data generated with ScanCode require an acknowledgment. +# ScanCode is a trademark of nexB Inc. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with ScanCode or any ScanCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with ScanCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# ScanCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# ScanCode is a free software code scanning tool from nexB Inc. and others. +# Visit https://github.com/nexB/scancode-toolkit/ for support and download. + + +import logging + +from packagedcode import models + + +""" +Handle Rust cargo crates +""" + + +logger = logging.getLogger(__name__) + +class RustCargoCrate(models.Package): + pass diff --git a/tests/packagedcode/data/rubygems/gemspec/cat.gemspec.expected.json b/tests/packagedcode/data/rubygems/gemspec/cat.gemspec.expected.json index f8ffc66c7c9..5b0c126fc26 100644 --- a/tests/packagedcode/data/rubygems/gemspec/cat.gemspec.expected.json +++ b/tests/packagedcode/data/rubygems/gemspec/cat.gemspec.expected.json @@ -32785,6 +32785,9 @@ "thirdparty/text_unidecode-1.2-py2.py3-none-any.whl", "thirdparty/text_unidecode-1.2-py2.py3-none-any.whl.ABOUT", "thirdparty/text_unidecode-1.2-py2.py3-none-any.whl.NOTICE", + "thirdparty/toml-0.10.0-py2.py3-none-any.whl", + "thirdparty/toml-0.10.0-py2.py3-none-any.whl.ABOUT", + "thirdparty/toml-0.10.0-py2.py3-none-any.whl.LICENSE", "thirdparty/typecode_libmagic-5.22-py2-none-manylinux1_x86_64.whl", "thirdparty/typecode_libmagic-5.22-py2-none-win32.whl", "thirdparty/typecode_libmagic-5.22-py2-none-win_amd64.whl", @@ -32840,4 +32843,4 @@ "original_platform": null, "new_platform": "ruby", "specification_version": 4 -} \ No newline at end of file +} diff --git a/thirdparty/toml-0.10.0-py2.py3-none-any.whl b/thirdparty/toml-0.10.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..bcfb2c68c904dbedb129446adbfd5610e2b9a5e4 GIT binary patch literal 25796 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 R81m~G__|Ec82szs{{!Guq&@%u literal 0 HcmV?d00001 diff --git a/thirdparty/toml-0.10.0-py2.py3-none-any.whl.ABOUT b/thirdparty/toml-0.10.0-py2.py3-none-any.whl.ABOUT new file mode 100644 index 00000000000..043d787f185 --- /dev/null +++ b/thirdparty/toml-0.10.0-py2.py3-none-any.whl.ABOUT @@ -0,0 +1,15 @@ +about_resource: toml-0.10.0-py2.py3-none-any.whl +checksum_md5: 70f2a3ce1fc099c20702b55f44f0b130 +checksum_sha1: 5a6d4ad5089719e4f567997a24da13204db2eb28 +contact: uiri@xqz.ca +copyright: Copyright 2013-2018 William Pearson +description: Python Library for Tom's Obvious, Minimal Language +download_url: https://files.pythonhosted.org/packages/b9/19/5cbd78eac8b1783671c40e34bb0fa83133a06d340a38b55c645076d40094/toml-0.10.0.tar.gz +homepage_url: https://github.com/uiri/toml +license_expression: mit +name: toml +notes: Used for parsing for TOML configuration files. +owner: Willam Pearson +owner_url: https://github.com/uiri +vcs_url: https://github.com/uiri/toml +version: 0.10.0 diff --git a/thirdparty/toml-0.10.0.tar.gz b/thirdparty/toml-0.10.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c44def8b0cf6da0de24d83e4f9c3d8d9e1f51f63 GIT binary patch literal 16719 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 BK1l!o literal 0 HcmV?d00001 diff --git a/thirdparty/toml.LICENSE b/thirdparty/toml.LICENSE new file mode 100644 index 00000000000..32ff3596f3c --- /dev/null +++ b/thirdparty/toml.LICENSE @@ -0,0 +1,26 @@ +The MIT License + +Copyright 2013-2018 William Pearson +Copyright 2015-2016 Julien Enselme +Copyright 2016 Google Inc. +Copyright 2017 Samuel Vasko +Copyright 2017 Nate Prewitt +Copyright 2017 Jack Evans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From ba6787860d3e1a98790d0081a5bb6a69b5e9691d Mon Sep 17 00:00:00 2001 From: Ritiek Malhotra Date: Fri, 8 Mar 2019 16:29:36 +0530 Subject: [PATCH 2/5] Implement basic subclass for cargo crates Signed-off-by: Ritiek Malhotra --- src/packagedcode/cargo.py | 78 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/src/packagedcode/cargo.py b/src/packagedcode/cargo.py index beb58d0aff2..06a001e810a 100644 --- a/src/packagedcode/cargo.py +++ b/src/packagedcode/cargo.py @@ -1,5 +1,5 @@ -# Copyright (c) 2018 nexB Inc. and others. All rights reserved. +# Copyright (c) 2019 nexB Inc. and others. All rights reserved. # http://nexb.com and https://github.com/nexB/scancode-toolkit/ # The ScanCode software is licensed under the Apache License version 2.0. # Data generated with ScanCode require an acknowledgment. @@ -22,9 +22,18 @@ # ScanCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/scancode-toolkit/ for support and download. +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals +import io +import toml import logging +import attr + +from commoncode import filetype +from commoncode import fileutils from packagedcode import models @@ -32,8 +41,73 @@ Handle Rust cargo crates """ +TRACE = False logger = logging.getLogger(__name__) +if TRACE: + import sys + logging.basicConfig(stream=sys.stdout) + logger.setLevel(logging.DEBUG) + + +@attr.s() class RustCargoCrate(models.Package): - pass + metafiles = ('Cargo.toml',) + default_type = 'cargo' + default_primary_language = 'Rust' + default_web_baseurl = "https://crates.io/" + default_download_baseurl = "https://crates.io/api/v1/" + default_api_baseurl = "https://crates.io/api/v1/" + + @classmethod + def recognize(cls, location): + return parse(location) + + @classmethod + def get_package_root(cls, manifest_resource, codebase): + return manifest_resource.parent(codebase) + + def repository_homepage_url(self, baseurl=default_web_baseurl): + return '{}/crates/{}'.format(baseurl, self.name) + + def repository_download_url(self, baseurl=default_download_baseurl): + return '{}/crates/{}/{}/download'.format(baseurl, self.name, self.version) + + def api_data_url(self, baseurl=default_api_baseurl): + return '{}/crates/{}'.format(baseurl, self.name) + + def compute_normalized_license(self): + return models.compute_normalized_license(self.declared_license) + + +def is_cargo_toml(location): + return (filetype.is_file(location) and fileutils.file_name(location).lower() == 'cargo.toml') + + +def parse(location): + """ + Return a Package object from a Cargo.toml file or None. + """ + if not is_cargo_toml(location): + return + + with io.open(location, encoding='utf-8') as loc: + package_data = toml.load(location) + + return build_package(package_data) + + +def build_package(package_data): + """ + Return a Pacakge object from a package data mapping or None. + """ + + name = package_data.get('package').get('name') + version = package_data.get('package').get('version') + package = RustCargoCrate( + name=name, + version=version, + ) + + return package From 5542e15b3cc0a9ef26583c10bc5fc0635ef798a0 Mon Sep 17 00:00:00 2001 From: Ritiek Malhotra Date: Fri, 8 Mar 2019 16:31:51 +0530 Subject: [PATCH 3/5] Conform with codestyle Signed-off-by: Ritiek Malhotra --- src/packagedcode/npm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packagedcode/npm.py b/src/packagedcode/npm.py index 9ffac177390..25db164966a 100644 --- a/src/packagedcode/npm.py +++ b/src/packagedcode/npm.py @@ -219,7 +219,7 @@ def build_package(package_data): if homepage: homepage = homepage[0] else: - homepage ='' + homepage = '' namespace, name = split_scoped_package_name(name) package = NpmPackage( namespace=namespace or None, From d57d87798039c2bd116928d965aaf06e587e70ab Mon Sep 17 00:00:00 2001 From: Ritiek Malhotra Date: Sun, 10 Mar 2019 14:03:53 +0530 Subject: [PATCH 4/5] Add test for RustCargoCrate instance Signed-off-by: Ritiek Malhotra --- tests/packagedcode/test_recognize.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/packagedcode/test_recognize.py b/tests/packagedcode/test_recognize.py index 4d9cebaa1d9..f993e998dad 100644 --- a/tests/packagedcode/test_recognize.py +++ b/tests/packagedcode/test_recognize.py @@ -33,6 +33,7 @@ from packagedcode import freebsd from packagedcode import maven from packagedcode import npm +from packagedcode import cargo from packagedcode import phpcomposer from packagedcode import rpm from packagedcode.recognize import recognize_package @@ -110,6 +111,11 @@ def test_recognize_npm(self): package = recognize_package(test_file) assert isinstance(package, npm.NpmPackage) + def test_recognize_cargo(self): + test_file = self.get_test_loc('recon/Cargo.toml') + package = recognize_package(test_file) + assert isinstance(package, cargo.RustCargoCrate) + def test_recognize_composer(self): test_file = self.get_test_loc('recon/composer.json') package = recognize_package(test_file) From d3d6cb52a10f8847f01924cd009aacf620052045 Mon Sep 17 00:00:00 2001 From: Ritiek Malhotra Date: Sun, 10 Mar 2019 14:06:29 +0530 Subject: [PATCH 5/5] Add tests for sample Cargo.toml files Signed-off-by: Ritiek Malhotra --- src/packagedcode/cargo.py | 13 ++- tests/packagedcode/data/cargo/clap/Cargo.toml | 92 +++++++++++++++++++ .../data/cargo/clap/Cargo.toml.expected | 35 +++++++ .../packagedcode/data/cargo/clippy/Cargo.toml | 66 +++++++++++++ .../data/cargo/clippy/Cargo.toml.expected | 35 +++++++ .../packagedcode/data/cargo/mdbook/Cargo.toml | 66 +++++++++++++ .../data/cargo/mdbook/Cargo.toml.expected | 35 +++++++ .../data/cargo/rustfmt/Cargo.toml | 67 ++++++++++++++ .../data/cargo/rustfmt/Cargo.toml.expected | 35 +++++++ .../packagedcode/data/cargo/rustup/Cargo.toml | 79 ++++++++++++++++ .../data/cargo/rustup/Cargo.toml.1 | 79 ++++++++++++++++ .../data/cargo/rustup/Cargo.toml.expected | 35 +++++++ tests/packagedcode/data/recon/Cargo.toml | 66 +++++++++++++ tests/packagedcode/test_cargo.py | 67 ++++++++++++++ 14 files changed, 769 insertions(+), 1 deletion(-) create mode 100644 tests/packagedcode/data/cargo/clap/Cargo.toml create mode 100644 tests/packagedcode/data/cargo/clap/Cargo.toml.expected create mode 100644 tests/packagedcode/data/cargo/clippy/Cargo.toml create mode 100644 tests/packagedcode/data/cargo/clippy/Cargo.toml.expected create mode 100644 tests/packagedcode/data/cargo/mdbook/Cargo.toml create mode 100644 tests/packagedcode/data/cargo/mdbook/Cargo.toml.expected create mode 100644 tests/packagedcode/data/cargo/rustfmt/Cargo.toml create mode 100644 tests/packagedcode/data/cargo/rustfmt/Cargo.toml.expected create mode 100644 tests/packagedcode/data/cargo/rustup/Cargo.toml create mode 100644 tests/packagedcode/data/cargo/rustup/Cargo.toml.1 create mode 100644 tests/packagedcode/data/cargo/rustup/Cargo.toml.expected create mode 100644 tests/packagedcode/data/recon/Cargo.toml create mode 100644 tests/packagedcode/test_cargo.py diff --git a/src/packagedcode/cargo.py b/src/packagedcode/cargo.py index 06a001e810a..bde7a1ac8dc 100644 --- a/src/packagedcode/cargo.py +++ b/src/packagedcode/cargo.py @@ -26,6 +26,8 @@ from __future__ import print_function from __future__ import unicode_literals +from collections import OrderedDict + import io import toml import logging @@ -93,7 +95,7 @@ def parse(location): return with io.open(location, encoding='utf-8') as loc: - package_data = toml.load(location) + package_data = toml.load(location, _dict=OrderedDict) return build_package(package_data) @@ -105,9 +107,18 @@ def build_package(package_data): name = package_data.get('package').get('name') version = package_data.get('package').get('version') + + # TODO: Remove this ordered_dict_map once cargo.py is able to handle + # the appropriate data (source_packages, dependencies, etc..) + # At the moment, this is only useful for making tests pass + ordered_dict_map = {} + for key in ("source_packages", "dependencies", "keywords", "parties"): + ordered_dict_map[key] = OrderedDict() + package = RustCargoCrate( name=name, version=version, + **ordered_dict_map ) return package diff --git a/tests/packagedcode/data/cargo/clap/Cargo.toml b/tests/packagedcode/data/cargo/clap/Cargo.toml new file mode 100644 index 00000000000..e71e3d4c0be --- /dev/null +++ b/tests/packagedcode/data/cargo/clap/Cargo.toml @@ -0,0 +1,92 @@ +[package] + +name = "clap" +version = "2.32.0" +authors = ["Kevin K. "] +exclude = ["examples/*", "clap-test/*", "tests/*", "benches/*", "*.png", "clap-perf/*", "*.dot"] +repository = "https://github.com/clap-rs/clap" +documentation = "https://docs.rs/clap/" +homepage = "https://clap.rs/" +readme = "README.md" +license = "MIT" +keywords = ["argument", "cli", "arg", "parser", "parse"] +categories = ["command-line-interface"] +description = """ +A simple to use, efficient, and full featured Command Line Argument Parser +""" + +[badges] +travis-ci = { repository = "clap-rs/clap" } +appveyor = { repository = "clap-rs/clap" } +coveralls = { repository = "clap-rs/clap", branch = "master" } +is-it-maintained-issue-resolution = { repository = "clap-rs/clap" } +is-it-maintained-open-issues = { repository = "clap-rs/clap" } +maintenance = {status = "actively-developed"} + +[dependencies] +bitflags = "1.0" +unicode-width = "0.1.4" +textwrap = "0.10.0" +strsim = { version = "0.8", optional = true } +yaml-rust = { version = "0.3.5", optional = true } +clippy = { version = "~0.0.166", optional = true } +atty = { version = "0.2.2", optional = true } +vec_map = { version = "0.8", optional = true } +term_size = { version = "0.3.0", optional = true } + +[target.'cfg(not(windows))'.dependencies] +ansi_term = { version = "0.11", optional = true } + +[dev-dependencies] +regex = "1" +# lazy_static 1.2 requires Rust 1.24.1+ +lazy_static = "~1.1" +version-sync = "0.5" + +[features] +default = ["suggestions", "color", "vec_map"] +suggestions = ["strsim"] +color = ["ansi_term", "atty"] +wrap_help = ["term_size", "textwrap/term_size"] +yaml = ["yaml-rust"] +unstable = [] # for building with unstable clap features (doesn't require nightly Rust) (currently none) +nightly = [] # for building with unstable Rust features (currently none) +lints = ["clippy"] # Requires nightly Rust +debug = [] # Enables debug messages +no_cargo = [] # Enable if you're not using Cargo, disables Cargo-env-var-dependent macros +doc = ["yaml"] # All the features which add to documentation + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 + +[profile.dev] +opt-level = 0 +debug = true +rpath = false +lto = false +debug-assertions = true +codegen-units = 4 + +[profile.test] +opt-level = 1 +debug = true +rpath = false +lto = false +debug-assertions = true +codegen-units = 4 + +[profile.bench] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 + +[package.metadata.docs.rs] +features = ["doc"] diff --git a/tests/packagedcode/data/cargo/clap/Cargo.toml.expected b/tests/packagedcode/data/cargo/clap/Cargo.toml.expected new file mode 100644 index 00000000000..ac6afeec877 --- /dev/null +++ b/tests/packagedcode/data/cargo/clap/Cargo.toml.expected @@ -0,0 +1,35 @@ +{ + "type": "cargo", + "namespace": null, + "name": "clap", + "version": "2.32.0", + "qualifiers": null, + "subpath": null, + "primary_language": "Rust", + "description": null, + "release_date": null, + "parties": {}, + "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": null, + "notice_text": null, + "manifest_path": null, + "dependencies": {}, + "contains_source_code": null, + "source_packages": {}, + "purl": "pkg:cargo/clap@2.32.0", + "repository_homepage_url": "https://crates.io//crates/clap", + "repository_download_url": "https://crates.io/api/v1//crates/clap/2.32.0/download", + "api_data_url": "https://crates.io/api/v1//crates/clap" +} diff --git a/tests/packagedcode/data/cargo/clippy/Cargo.toml b/tests/packagedcode/data/cargo/clippy/Cargo.toml new file mode 100644 index 00000000000..024b8ff28ad --- /dev/null +++ b/tests/packagedcode/data/cargo/clippy/Cargo.toml @@ -0,0 +1,66 @@ +[package] +name = "clippy" +version = "0.0.212" +authors = [ + "Manish Goregaokar ", + "Andre Bogus ", + "Georg Brandl ", + "Martin Carton ", + "Oliver Schneider " +] +description = "A bunch of helpful lints to avoid common pitfalls in Rust" +repository = "https://github.com/rust-lang/rust-clippy" +readme = "README.md" +license = "MIT/Apache-2.0" +keywords = ["clippy", "lint", "plugin"] +categories = ["development-tools", "development-tools::cargo-plugins"] +build = "build.rs" +edition = "2018" +publish = false + +[badges] +travis-ci = { repository = "rust-lang/rust-clippy" } +appveyor = { repository = "rust-lang/rust-clippy" } + +[lib] +name = "clippy" +plugin = true +test = false + +[[bin]] +name = "cargo-clippy" +test = false +path = "src/main.rs" + +[[bin]] +name = "clippy-driver" +path = "src/driver.rs" + +[dependencies] +# begin automatic update +clippy_lints = { version = "0.0.212", path = "clippy_lints" } +# end automatic update +regex = "1" +semver = "0.9" +rustc_tools_util = { version = "0.1.1", path = "rustc_tools_util"} + +[dev-dependencies] +clippy_dev = { version = "0.0.1", path = "clippy_dev" } +cargo_metadata = "0.7.1" +compiletest_rs = "0.3.19" +lazy_static = "1.0" +serde_derive = "1.0" +clippy-mini-macro-test = { version = "0.2", path = "mini-macro" } +serde = "1.0" +derive-new = "0.5" + +# A noop dependency that changes in the Rust repository, it's a bit of a hack. +# See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust` +# for more information. +rustc-workspace-hack = "1.0.0" + +[build-dependencies] +rustc_tools_util = { version = "0.1.1", path = "rustc_tools_util"} + +[features] +debugging = [] diff --git a/tests/packagedcode/data/cargo/clippy/Cargo.toml.expected b/tests/packagedcode/data/cargo/clippy/Cargo.toml.expected new file mode 100644 index 00000000000..7cd77746e0e --- /dev/null +++ b/tests/packagedcode/data/cargo/clippy/Cargo.toml.expected @@ -0,0 +1,35 @@ +{ + "type": "cargo", + "namespace": null, + "name": "clippy", + "version": "0.0.212", + "qualifiers": null, + "subpath": null, + "primary_language": "Rust", + "description": null, + "release_date": null, + "parties": {}, + "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": null, + "notice_text": null, + "manifest_path": null, + "dependencies": {}, + "contains_source_code": null, + "source_packages": {}, + "purl": "pkg:cargo/clippy@0.0.212", + "repository_homepage_url": "https://crates.io//crates/clippy", + "repository_download_url": "https://crates.io/api/v1//crates/clippy/0.0.212/download", + "api_data_url": "https://crates.io/api/v1//crates/clippy" +} diff --git a/tests/packagedcode/data/cargo/mdbook/Cargo.toml b/tests/packagedcode/data/cargo/mdbook/Cargo.toml new file mode 100644 index 00000000000..aa5129e47d9 --- /dev/null +++ b/tests/packagedcode/data/cargo/mdbook/Cargo.toml @@ -0,0 +1,66 @@ +[package] +name = "mdbook" +version = "0.2.4-alpha.0" +authors = [ + "Mathieu David ", + "Michael-F-Bryan ", + "Matt Ickstadt " +] +description = "Create books from markdown files" +documentation = "http://rust-lang-nursery.github.io/mdBook/index.html" +repository = "https://github.com/rust-lang-nursery/mdBook" +keywords = ["book", "gitbook", "rustbook", "markdown"] +license = "MPL-2.0" +readme = "README.md" +exclude = ["book-example/*"] + +[dependencies] +clap = "2.24" +chrono = "0.4" +handlebars = "1.0" +serde = "1.0" +serde_derive = "1.0" +error-chain = "0.12" +serde_json = "1.0" +pulldown-cmark = "0.1.2" +lazy_static = "1.0" +log = "0.4" +env_logger = "0.5" +toml = "0.4.8" +memchr = "2.0" +open = "1.1" +regex = "1.0.0" +tempfile = "3.0" +itertools = "0.7" +shlex = "0.1" +toml-query = "0.7" + +# Watch feature +notify = { version = "4.0", optional = true } + +# Serve feature +iron = { version = "0.6", optional = true } +staticfile = { version = "0.5", optional = true } +ws = { version = "0.7", optional = true} + +# Search feature +elasticlunr-rs = { version = "2.3", optional = true, default-features = false } +ammonia = { version = "1.1", optional = true } + +[dev-dependencies] +select = "0.4" +pretty_assertions = "0.5" +walkdir = "2.0" +pulldown-cmark-to-cmark = "1.1.0" + +[features] +default = ["output", "watch", "serve", "search"] +debug = [] +output = [] +watch = ["notify"] +serve = ["iron", "staticfile", "ws"] +search = ["elasticlunr-rs", "ammonia"] + +[[bin]] +doc = false +name = "mdbook" diff --git a/tests/packagedcode/data/cargo/mdbook/Cargo.toml.expected b/tests/packagedcode/data/cargo/mdbook/Cargo.toml.expected new file mode 100644 index 00000000000..febed74eaf9 --- /dev/null +++ b/tests/packagedcode/data/cargo/mdbook/Cargo.toml.expected @@ -0,0 +1,35 @@ +{ + "type": "cargo", + "namespace": null, + "name": "mdbook", + "version": "0.2.4-alpha.0", + "qualifiers": null, + "subpath": null, + "primary_language": "Rust", + "description": null, + "release_date": null, + "parties": {}, + "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": null, + "notice_text": null, + "manifest_path": null, + "dependencies": {}, + "contains_source_code": null, + "source_packages": {}, + "purl": "pkg:cargo/mdbook@0.2.4-alpha.0", + "repository_homepage_url": "https://crates.io//crates/mdbook", + "repository_download_url": "https://crates.io/api/v1//crates/mdbook/0.2.4-alpha.0/download", + "api_data_url": "https://crates.io/api/v1//crates/mdbook" +} diff --git a/tests/packagedcode/data/cargo/rustfmt/Cargo.toml b/tests/packagedcode/data/cargo/rustfmt/Cargo.toml new file mode 100644 index 00000000000..2274ae86bd2 --- /dev/null +++ b/tests/packagedcode/data/cargo/rustfmt/Cargo.toml @@ -0,0 +1,67 @@ +[package] + +name = "rustfmt-nightly" +version = "1.0.3" +authors = ["Nicholas Cameron ", "The Rustfmt developers"] +description = "Tool to find and fix Rust formatting issues" +repository = "https://github.com/rust-lang/rustfmt" +readme = "README.md" +license = "Apache-2.0/MIT" +build = "build.rs" +categories = ["development-tools"] +edition = "2018" + +[[bin]] +name = "rustfmt" +path = "src/bin/main.rs" + +[[bin]] +name = "cargo-fmt" +path = "src/cargo-fmt/main.rs" + +[[bin]] +name = "rustfmt-format-diff" +path = "src/format-diff/main.rs" + +[[bin]] +name = "git-rustfmt" +path = "src/git-rustfmt/main.rs" + +[features] +default = ["cargo-fmt", "rustfmt-format-diff"] +cargo-fmt = [] +rustfmt-format-diff = [] +generic-simd = ["bytecount/generic-simd"] + +[dependencies] +atty = "0.2" +itertools = "0.8" +toml = "0.4" +serde = "1.0" +serde_derive = "1.0" +serde_json = "1.0" +unicode-segmentation = "1.0.0" +regex = "1.0" +term = "0.5" +diff = "0.1" +log = "0.4" +env_logger = "0.6" +getopts = "0.2" +derive-new = "0.5" +cargo_metadata = "0.7" +rustc-ap-rustc_target = "373.0.0" +rustc-ap-syntax = "373.0.0" +rustc-ap-syntax_pos = "373.0.0" +failure = "0.1.3" +bytecount = "0.5" +unicode-width = "0.1.5" +unicode_categories = "0.1.1" +dirs = "1.0.4" + +# A noop dependency that changes in the Rust repository, it's a bit of a hack. +# See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust` +# for more information. +rustc-workspace-hack = "1.0.0" + +[dev-dependencies] +lazy_static = "1.0.0" diff --git a/tests/packagedcode/data/cargo/rustfmt/Cargo.toml.expected b/tests/packagedcode/data/cargo/rustfmt/Cargo.toml.expected new file mode 100644 index 00000000000..91273dbe431 --- /dev/null +++ b/tests/packagedcode/data/cargo/rustfmt/Cargo.toml.expected @@ -0,0 +1,35 @@ +{ + "type": "cargo", + "namespace": null, + "name": "rustfmt-nightly", + "version": "1.0.3", + "qualifiers": null, + "subpath": null, + "primary_language": "Rust", + "description": null, + "release_date": null, + "parties": {}, + "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": null, + "notice_text": null, + "manifest_path": null, + "dependencies": {}, + "contains_source_code": null, + "source_packages": {}, + "purl": "pkg:cargo/rustfmt-nightly@1.0.3", + "repository_homepage_url": "https://crates.io//crates/rustfmt-nightly", + "repository_download_url": "https://crates.io/api/v1//crates/rustfmt-nightly/1.0.3/download", + "api_data_url": "https://crates.io/api/v1//crates/rustfmt-nightly" +} diff --git a/tests/packagedcode/data/cargo/rustup/Cargo.toml b/tests/packagedcode/data/cargo/rustup/Cargo.toml new file mode 100644 index 00000000000..b5485de2283 --- /dev/null +++ b/tests/packagedcode/data/cargo/rustup/Cargo.toml @@ -0,0 +1,79 @@ +[package] + +name = "rustup" +version = "1.17.0" +edition = "2018" +authors = [ "Diggory Blake " ] +description = "Manage multiple rust installations with ease" + +documentation = "http://rust-lang.github.io/rustup.rs/rustup/index.html" +homepage = "https://github.com/rust-lang/rustup.rs" +repository = "https://github.com/rust-lang/rustup.rs" + +readme = "README.md" + +keywords = ["rustup", "multirust", "install", "proxy"] + +license = "MIT OR Apache-2.0" + +build = "build.rs" + +[features] + +default = ["curl-backend", "reqwest-backend"] + +curl-backend = ["download/curl-backend"] +reqwest-backend = ["download/reqwest-backend"] +vendored-openssl = ['openssl/vendored'] + +# Include in the default set to disable self-update and uninstall. +no-self-update = [] + +[dependencies] +rustup-dist = { path = "src/rustup-dist" } +rustup-utils = { path = "src/rustup-utils" } +download = { path = "src/download" } +clap = "2.18.0" +error-chain = "0.12.0" +itertools = "0.7.6" +libc = "0.2.0" +markdown = "0.2" +rand = "0.5.2" +regex = "1.0.1" +remove_dir_all = "0.5.1" +same-file = "1.0" +scopeguard = "0.3" +sha2 = "0.7.0" +tempdir = "0.3.4" +term = "0.5.1" +time = "0.1.34" +toml = "0.4" +url = "1.1.0" +wait-timeout = "0.1.5" +openssl = { version = '0.10.15', optional = true } + +[target."cfg(windows)".dependencies] +winapi = { version = "0.3", features = ["jobapi", "jobapi2", "processthreadsapi", "psapi", "synchapi", "winuser"] } +winreg = "0.5.0" +gcc = "0.3.50" + +[dev-dependencies] +rustup-mock = { path = "src/rustup-mock", version = "1.1.0" } +lazy_static = "1.0.0" + +[workspace] +members = ["src/download"] + +[lib] +name = "rustup" +path = "src/rustup/lib.rs" +test = false # no unit tests + +[[bin]] +name = "rustup-init" +path = "src/rustup-cli/main.rs" +test = false # no unit tests + +[profile.release] +lto = true +codegen-units = 1 diff --git a/tests/packagedcode/data/cargo/rustup/Cargo.toml.1 b/tests/packagedcode/data/cargo/rustup/Cargo.toml.1 new file mode 100644 index 00000000000..b5485de2283 --- /dev/null +++ b/tests/packagedcode/data/cargo/rustup/Cargo.toml.1 @@ -0,0 +1,79 @@ +[package] + +name = "rustup" +version = "1.17.0" +edition = "2018" +authors = [ "Diggory Blake " ] +description = "Manage multiple rust installations with ease" + +documentation = "http://rust-lang.github.io/rustup.rs/rustup/index.html" +homepage = "https://github.com/rust-lang/rustup.rs" +repository = "https://github.com/rust-lang/rustup.rs" + +readme = "README.md" + +keywords = ["rustup", "multirust", "install", "proxy"] + +license = "MIT OR Apache-2.0" + +build = "build.rs" + +[features] + +default = ["curl-backend", "reqwest-backend"] + +curl-backend = ["download/curl-backend"] +reqwest-backend = ["download/reqwest-backend"] +vendored-openssl = ['openssl/vendored'] + +# Include in the default set to disable self-update and uninstall. +no-self-update = [] + +[dependencies] +rustup-dist = { path = "src/rustup-dist" } +rustup-utils = { path = "src/rustup-utils" } +download = { path = "src/download" } +clap = "2.18.0" +error-chain = "0.12.0" +itertools = "0.7.6" +libc = "0.2.0" +markdown = "0.2" +rand = "0.5.2" +regex = "1.0.1" +remove_dir_all = "0.5.1" +same-file = "1.0" +scopeguard = "0.3" +sha2 = "0.7.0" +tempdir = "0.3.4" +term = "0.5.1" +time = "0.1.34" +toml = "0.4" +url = "1.1.0" +wait-timeout = "0.1.5" +openssl = { version = '0.10.15', optional = true } + +[target."cfg(windows)".dependencies] +winapi = { version = "0.3", features = ["jobapi", "jobapi2", "processthreadsapi", "psapi", "synchapi", "winuser"] } +winreg = "0.5.0" +gcc = "0.3.50" + +[dev-dependencies] +rustup-mock = { path = "src/rustup-mock", version = "1.1.0" } +lazy_static = "1.0.0" + +[workspace] +members = ["src/download"] + +[lib] +name = "rustup" +path = "src/rustup/lib.rs" +test = false # no unit tests + +[[bin]] +name = "rustup-init" +path = "src/rustup-cli/main.rs" +test = false # no unit tests + +[profile.release] +lto = true +codegen-units = 1 diff --git a/tests/packagedcode/data/cargo/rustup/Cargo.toml.expected b/tests/packagedcode/data/cargo/rustup/Cargo.toml.expected new file mode 100644 index 00000000000..60edc410175 --- /dev/null +++ b/tests/packagedcode/data/cargo/rustup/Cargo.toml.expected @@ -0,0 +1,35 @@ +{ + "type": "cargo", + "namespace": null, + "name": "rustup", + "version": "1.17.0", + "qualifiers": null, + "subpath": null, + "primary_language": "Rust", + "description": null, + "release_date": null, + "parties": {}, + "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": null, + "notice_text": null, + "manifest_path": null, + "dependencies": {}, + "contains_source_code": null, + "source_packages": {}, + "purl": "pkg:cargo/rustup@1.17.0", + "repository_homepage_url": "https://crates.io//crates/rustup", + "repository_download_url": "https://crates.io/api/v1//crates/rustup/1.17.0/download", + "api_data_url": "https://crates.io/api/v1//crates/rustup" +} diff --git a/tests/packagedcode/data/recon/Cargo.toml b/tests/packagedcode/data/recon/Cargo.toml new file mode 100644 index 00000000000..024b8ff28ad --- /dev/null +++ b/tests/packagedcode/data/recon/Cargo.toml @@ -0,0 +1,66 @@ +[package] +name = "clippy" +version = "0.0.212" +authors = [ + "Manish Goregaokar ", + "Andre Bogus ", + "Georg Brandl ", + "Martin Carton ", + "Oliver Schneider " +] +description = "A bunch of helpful lints to avoid common pitfalls in Rust" +repository = "https://github.com/rust-lang/rust-clippy" +readme = "README.md" +license = "MIT/Apache-2.0" +keywords = ["clippy", "lint", "plugin"] +categories = ["development-tools", "development-tools::cargo-plugins"] +build = "build.rs" +edition = "2018" +publish = false + +[badges] +travis-ci = { repository = "rust-lang/rust-clippy" } +appveyor = { repository = "rust-lang/rust-clippy" } + +[lib] +name = "clippy" +plugin = true +test = false + +[[bin]] +name = "cargo-clippy" +test = false +path = "src/main.rs" + +[[bin]] +name = "clippy-driver" +path = "src/driver.rs" + +[dependencies] +# begin automatic update +clippy_lints = { version = "0.0.212", path = "clippy_lints" } +# end automatic update +regex = "1" +semver = "0.9" +rustc_tools_util = { version = "0.1.1", path = "rustc_tools_util"} + +[dev-dependencies] +clippy_dev = { version = "0.0.1", path = "clippy_dev" } +cargo_metadata = "0.7.1" +compiletest_rs = "0.3.19" +lazy_static = "1.0" +serde_derive = "1.0" +clippy-mini-macro-test = { version = "0.2", path = "mini-macro" } +serde = "1.0" +derive-new = "0.5" + +# A noop dependency that changes in the Rust repository, it's a bit of a hack. +# See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust` +# for more information. +rustc-workspace-hack = "1.0.0" + +[build-dependencies] +rustc_tools_util = { version = "0.1.1", path = "rustc_tools_util"} + +[features] +debugging = [] diff --git a/tests/packagedcode/test_cargo.py b/tests/packagedcode/test_cargo.py new file mode 100644 index 00000000000..741487b26c0 --- /dev/null +++ b/tests/packagedcode/test_cargo.py @@ -0,0 +1,67 @@ + +# Copyright (c) 2019 nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/scancode-toolkit/ +# The ScanCode software is licensed under the Apache License version 2.0. +# Data generated with ScanCode require an acknowledgment. +# ScanCode is a trademark of nexB Inc. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with ScanCode or any ScanCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with ScanCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# ScanCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# ScanCode is a free software code scanning tool from nexB Inc. and others. +# Visit https://github.com/nexB/scancode-toolkit/ for support and download. + +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals + +import os + +from packagedcode import cargo + +from packages_test_utils import PackageTester + + +class TestCargo(PackageTester): + test_data_dir = os.path.join(os.path.dirname(__file__), 'data') + + def test_parse_clap(self): + test_file = self.get_test_loc('cargo/clap/Cargo.toml') + expected_loc = self.get_test_loc('cargo/clap/Cargo.toml.expected') + package = cargo.parse(test_file) + self.check_package(package, expected_loc, regen=False) + + def test_parse_clippy(self): + test_file = self.get_test_loc('cargo/clippy/Cargo.toml') + expected_loc = self.get_test_loc('cargo/clippy/Cargo.toml.expected') + package = cargo.parse(test_file) + self.check_package(package, expected_loc, regen=False) + + def test_parse_mdbook(self): + test_file = self.get_test_loc('cargo/mdbook/Cargo.toml') + expected_loc = self.get_test_loc('cargo/mdbook/Cargo.toml.expected') + package = cargo.parse(test_file) + self.check_package(package, expected_loc, regen=False) + + def test_parse_rustfmt(self): + test_file = self.get_test_loc('cargo/rustfmt/Cargo.toml') + expected_loc = self.get_test_loc('cargo/rustfmt/Cargo.toml.expected') + package = cargo.parse(test_file) + self.check_package(package, expected_loc, regen=False) + + def test_parse_rustup(self): + test_file = self.get_test_loc('cargo/rustup/Cargo.toml') + expected_loc = self.get_test_loc('cargo/rustup/Cargo.toml.expected') + package = cargo.parse(test_file) + self.check_package(package, expected_loc, regen=False)