diff --git a/src/packagedcode/rubygems.py b/src/packagedcode/rubygems.py index e80295c48af..e38c798646f 100644 --- a/src/packagedcode/rubygems.py +++ b/src/packagedcode/rubygems.py @@ -97,7 +97,7 @@ def parse(cls, location, package_only=False): @classmethod def assemble(cls, package_data, resource, codebase, package_adder): - yield from assemble_extracted_gem(cls, package_data, resource, codebase) + yield from assemble_extracted_gem(cls, package_data, resource, codebase, package_adder) class BaseGemProjectHandler(models.DatafileHandler): diff --git a/tests/packagedcode/data/plugin/rubygems-package-expected.json b/tests/packagedcode/data/plugin/rubygems-package-expected.json index d72c1b66d45..ee3cf4ac110 100644 --- a/tests/packagedcode/data/plugin/rubygems-package-expected.json +++ b/tests/packagedcode/data/plugin/rubygems-package-expected.json @@ -63,7 +63,7 @@ { "license_expression": "mit", "license_expression_spdx": "MIT", - "from_file": "package/m2r-2.1.0.gem", + "from_file": "m2r-2.1.0.gem", "start_line": 1, "end_line": 1, "matcher": "1-spdx-id", @@ -366,7 +366,7 @@ { "license_expression": "mit", "license_expression_spdx": "MIT", - "from_file": "package/m2r-2.1.0.gem", + "from_file": "m2r-2.1.0.gem", "start_line": 1, "end_line": 1, "matcher": "1-spdx-id", @@ -548,13 +548,6 @@ "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758" ], "scan_errors": [] - }, - { - "path": "m2r-2.1.0.gem.json", - "type": "file", - "package_data": [], - "for_packages": [], - "scan_errors": [] } ] } \ No newline at end of file diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract.json b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract.json new file mode 100644 index 00000000000..b3cc3148952 --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract.json @@ -0,0 +1,451 @@ +{ + "packages": [ + { + "type": "gem", + "namespace": null, + "name": "json", + "version": "version", + "qualifiers": {}, + "subpath": null, + "primary_language": "Ruby", + "description": "JSON Implementation for Ruby\nThis is a JSON implementation as a Ruby extension in C.", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Florian Frank", + "email": null, + "url": null + }, + { + "type": "person", + "role": "author", + "name": null, + "email": "flori@ping.de", + "url": null + } + ], + "keywords": [], + "homepage_url": "https://github.com/ruby/json", + "download_url": "https://rubygems.org/downloads/json-version.gem", + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "is_private": false, + "is_virtual": false, + "extra_data": {}, + "repository_homepage_url": "https://rubygems.org/gems/json/versions/version", + "repository_download_url": "https://rubygems.org/downloads/json-version.gem", + "api_data_url": "https://rubygems.org/api/v2/rubygems/json/versions/version.json", + "package_uid": "pkg:gem/json@version?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "json-3.0.2-java.gem-extract/data.tar.gz-extract/json.gemspec" + ], + "datasource_ids": [ + "gemspec" + ], + "purl": "pkg:gem/json@version" + } + ], + "dependencies": [], + "files": [ + { + "path": "json-3.0.2-java.gem-extract", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/checksums.yaml.gz-extract", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/checksums.yaml.gz-extract/checksums.yaml.gz-extract", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/BSDL", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/COPYING", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/LEGAL", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/README.md", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/json.gemspec", + "type": "file", + "package_data": [ + { + "type": "gem", + "namespace": null, + "name": "json", + "version": "version", + "qualifiers": {}, + "subpath": null, + "primary_language": "Ruby", + "description": "JSON Implementation for Ruby\nThis is a JSON implementation as a Ruby extension in C.", + "release_date": null, + "parties": [ + { + "type": "person", + "role": "author", + "name": "Florian Frank", + "email": null, + "url": null + }, + { + "type": "person", + "role": "author", + "name": null, + "email": "flori@ping.de", + "url": null + } + ], + "keywords": [], + "homepage_url": "https://github.com/ruby/json", + "download_url": "https://rubygems.org/downloads/json-version.gem", + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "is_private": false, + "is_virtual": false, + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": "https://rubygems.org/gems/json/versions/version", + "repository_download_url": "https://rubygems.org/downloads/json-version.gem", + "api_data_url": "https://rubygems.org/api/v2/rubygems/json/versions/version.json", + "datasource_id": "gemspec", + "purl": "pkg:gem/json@version" + } + ], + "for_packages": [ + "pkg:gem/json@version?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json.rb", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/common.rb", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext.rb", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/META-INF", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/META-INF/MANIFEST.MF", + "type": "file", + "package_data": [ + { + "type": "jar", + "namespace": null, + "name": null, + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": null, + "description": "", + "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, + "holder": null, + "declared_license_expression": null, + "declared_license_expression_spdx": null, + "license_detections": [], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "is_private": false, + "is_virtual": false, + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "java_jar_manifest", + "purl": null + } + ], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/json", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/json/ext", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/json/ext/Generator.class", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator/state.rb", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/truffle_ruby", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/truffle_ruby/generator.rb", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/version.rb", + "type": "file", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/metadata.gz-extract", + "type": "directory", + "package_data": [], + "for_packages": [], + "scan_errors": [] + }, + { + "path": "json-3.0.2-java.gem-extract/metadata.gz-extract/metadata.gz-extract", + "type": "file", + "package_data": [ + { + "type": "gem", + "namespace": null, + "name": "json", + "version": "3.0.2", + "qualifiers": { + "platform": "java" + }, + "subpath": null, + "primary_language": "Ruby", + "description": "JSON Implementation for Ruby\nA JSON implementation as a JRuby extension.", + "release_date": "2026-09-09", + "parties": [ + { + "type": null, + "role": "author", + "name": "Daniel Luz", + "email": null, + "url": null + } + ], + "keywords": [], + "homepage_url": "https://github.com/ruby/json", + "download_url": "https://rubygems.org/downloads/json-3.0.2-java.gem", + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": "https://github.com/ruby/json", + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": "ruby", + "declared_license_expression_spdx": "Ruby", + "license_detections": [ + { + "license_expression": "ruby", + "license_expression_spdx": "Ruby", + "matches": [ + { + "license_expression": "ruby", + "license_expression_spdx": "Ruby", + "from_file": "json-3.0.2-java.gem-extract/metadata.gz-extract/metadata.gz-extract", + "start_line": 1, + "end_line": 1, + "matcher": "1-spdx-id", + "score": 100.0, + "matched_length": 1, + "match_coverage": 100.0, + "rule_relevance": 100, + "rule_identifier": "spdx-license-identifier-ruby-a13349454c4e6b2b906b10512a1b09cdf0400d7d", + "rule_url": null, + "matched_text": "Ruby" + } + ], + "identifier": "ruby-69064f70-573f-8fda-e447-1666ddbf8fcf" + } + ], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": "- Ruby\n", + "notice_text": null, + "source_packages": [], + "file_references": [], + "is_private": false, + "is_virtual": false, + "extra_data": {}, + "dependencies": [], + "repository_homepage_url": "https://rubygems.org/gems/json/versions/3.0.2", + "repository_download_url": "https://rubygems.org/downloads/json-3.0.2-java.gem", + "api_data_url": "https://rubygems.org/api/v2/rubygems/json/versions/3.0.2.json", + "datasource_id": "gem_archive_extracted", + "purl": "pkg:gem/json@3.0.2?platform=java" + } + ], + "for_packages": [], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/checksums.yaml.gz-extract/checksums.yaml.gz-extract b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/checksums.yaml.gz-extract/checksums.yaml.gz-extract new file mode 100644 index 00000000000..1e4f463f9da --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/checksums.yaml.gz-extract/checksums.yaml.gz-extract @@ -0,0 +1,7 @@ +--- +SHA256: + metadata.gz: 4be775fd0d4221af4703313be47b36df730b542f95063025472d82386bc6f949 + data.tar.gz: aa1136bf72ebb55174ab30a3ddcaf908364a7e0cde743b952435a5ab59195d0a +SHA512: + metadata.gz: 3b1da37df8ae7d0a8a40e41caed988f2b9f33c8ef147e66220e811adbc26199482189055badf0023bc5c4b8f201f2954a30cfa355cd7629604485c0424869f06 + data.tar.gz: 7e50467d636c6a30b701d4778650355e6856660add1de37eef2519865977107e715cf19d3bcceff288ee068b5993908535243b6b799f7bc37bd7f41b8c270d37 diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/BSDL b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/BSDL new file mode 100644 index 00000000000..66d93598aa3 --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/BSDL @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/COPYING b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/COPYING new file mode 100644 index 00000000000..426810a7fbb --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/COPYING @@ -0,0 +1,56 @@ +Ruby is copyrighted free software by Yukihiro Matsumoto . +You can redistribute it and/or modify it under either the terms of the +2-clause BSDL (see the file BSDL), or the conditions below: + + 1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + + 2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b) use the modified software only within your corporation or + organization. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a) distribute the binaries and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b) accompany the distribution with the machine-readable source of + the software. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + + 5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + + 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/LEGAL b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/LEGAL new file mode 100644 index 00000000000..3d3e0935aee --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/LEGAL @@ -0,0 +1,20 @@ +# -*- rdoc -*- + += LEGAL NOTICE INFORMATION +-------------------------- + +All the files in this distribution are covered under either the Ruby's +license (see the file COPYING) or public-domain except some files +mentioned below. + +ext/json/ext/vendor/fpconv.h:: + This file is adapted from https://github.com/night-shift/fpconv + It is licensed under Boost Software License 1.0. + +ext/json/ext/vendor/jeaiii-ltoa.h:: + This file is adapted from https://github.com/jeaiii/itoa + It is licensed under the MIT License + +ext/json/ext/vendor/fast_float_parser.h:: + This file is adapted from the Fast Float C++ library by The fast_float authors https://github.com/fastfloat/fast_float + It is licensed under the MIT License diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/README.md b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/README.md new file mode 100644 index 00000000000..0f39ee6c4c5 --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/README.md @@ -0,0 +1,33 @@ +# JSON implementation for Ruby + +## Description + +This is an implementation of the JSON specification according to RFC 7159 +http://www.ietf.org/rfc/rfc7159.txt . + +The JSON generator generate UTF-8 character sequences by default. +If an :ascii\_only option with a true value is given, they escape all +non-ASCII and control characters with \uXXXX escape sequences, and support +UTF-16 surrogate pairs in order to be able to generate the whole range of +unicode code points. + +All strings, that are to be encoded as JSON strings, should be UTF-8 byte +sequences on the Ruby side. + +## Author + +Florian Frank + +## License + +Ruby License, see https://www.ruby-lang.org/en/about/license.txt. + +## Download + +The latest version of this library can be downloaded at + +* https://rubygems.org/gems/json + +Online Documentation should be located at + +* https://www.rubydoc.info/gems/json diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/json.gemspec b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/json.gemspec new file mode 100644 index 00000000000..55757310250 --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/json.gemspec @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +version = File.foreach(File.join(__dir__, "lib/json/version.rb")) do |line| + /^\s*VERSION\s*=\s*'(.*)'/ =~ line and break $1 +end rescue nil + +spec = Gem::Specification.new do |s| + java_ext = Gem::Platform === s.platform && s.platform =~ 'java' || RUBY_ENGINE == 'jruby' + + s.name = "json" + s.version = version + + s.summary = "JSON Implementation for Ruby" + s.homepage = "https://github.com/ruby/json" + s.metadata = { + 'bug_tracker_uri' => 'https://github.com/ruby/json/issues', + 'changelog_uri' => 'https://github.com/ruby/json/blob/master/CHANGES.md', + 'documentation_uri' => 'https://docs.ruby-lang.org/en/master/JSON.html', + 'homepage_uri' => s.homepage, + 'source_code_uri' => 'https://github.com/ruby/json', + } + + s.required_ruby_version = Gem::Requirement.new(">= 2.7") + + if java_ext + s.description = "A JSON implementation as a JRuby extension." + s.author = "Daniel Luz" + s.email = "dev+ruby@mernen.com" + else + s.description = "This is a JSON implementation as a Ruby extension in C." + s.authors = ["Florian Frank"] + s.email = "flori@ping.de" + end + + s.licenses = ["Ruby"] + + s.extra_rdoc_files = ["README.md"] + s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"] + + s.files = [ + "CHANGES.md", + "COPYING", + "BSDL", + "LEGAL", + "README.md", + "json.gemspec", + ] + Dir.glob("lib/**/*.rb", base: File.expand_path("..", __FILE__)) + + if java_ext + s.platform = 'java' + s.files += Dir["lib/json/ext/**/*.jar"] + else + s.extensions = Dir["ext/json/**/extconf.rb"] + s.files += Dir["ext/json/**/*.{c,h,rb}"] + end +end + +if RUBY_ENGINE == 'jruby' && $0 == __FILE__ + Gem::Builder.new(spec).build +else + spec +end diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json.rb b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json.rb new file mode 100644 index 00000000000..c481352354b --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +require 'json/common' + +## +# = JavaScript \Object Notation (\JSON) +# +# \JSON is a lightweight data-interchange format. +# +# \JSON is easy for us humans to read and write, +# and equally simple for machines to read (parse) and write (generate). +# +# \JSON is language-independent, making it an ideal interchange format +# for applications in differing programming languages +# and on differing operating systems. +# + +module JSON + require 'json/version' + require 'json/ext' +end diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/common.rb b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/common.rb new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext.rb b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext.rb new file mode 100644 index 00000000000..da17df1e8a6 --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'json/common' + +module JSON + # This module holds all the modules/classes that implement JSON's + # functionality as C extensions. + module Ext + class Parser + class << self + def parse(...) + new(...).parse + end + alias_method :parse, :parse # Allow redefinition by extensions + end + + def initialize(source, opts = nil) + @source = source + @config = Config.new(opts) + end + + def source + @source.dup + end + + def parse + @config.parse(@source) + end + end + + require 'json/ext/parser' + Ext::Parser::Config = Ext::ParserConfig + JSON.parser = Ext::Parser + + if RUBY_ENGINE == 'truffleruby' + require 'json/truffle_ruby/generator' + JSON.generator = JSON::TruffleRuby::Generator + else + require 'json/ext/generator' + JSON.generator = Generator + end + end + + if defined?(ResumableParser) # Not yet available on JRuby + class ResumableParser + # Returns whether the parser is entirely done: no unconsumed bytes in + # the buffer, no document under construction and no parsed value + # awaiting retrieval. + # + # The main use case is detecting a truncated stream once the input is + # exhausted: + # + # loop do + # begin + # parser << socket.readpartial(4096) + # rescue EOFError + # break + # end + # while parser.parse + # process(parser.value) + # end + # end + # warn "stream was truncated" unless parser.empty? + def empty? + eos? && !partial_value? && !value? + end + end + end +end diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/META-INF/MANIFEST.MF b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..f817567d050 --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 10.0.1 (Oracle Corporation) + diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/json/ext/Generator.class b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/json/ext/Generator.class new file mode 100644 index 00000000000..13c6f213ff0 Binary files /dev/null and b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator.jar-extract/json/ext/Generator.class differ diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator/state.rb b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator/state.rb new file mode 100644 index 00000000000..a9578b9bd7a --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/ext/generator/state.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module JSON + module Ext + module Generator + class State + # call-seq: new(opts = {}) + # + # Instantiates a new State object, configured by _opts_. + # + # Argument +opts+, if given, contains a \Hash of options for the generation. + # See {Generating Options}[rdoc-ref:JSON@Generating+Options]. + def initialize(opts = nil) + if opts && !opts.empty? + configure(opts) + end + end + + # call-seq: configure(opts) + # + # Configure this State instance with the Hash _opts_, and return + # itself. + def configure(opts) + unless opts.is_a?(Hash) + if opts.respond_to?(:to_hash) + opts = opts.to_hash + elsif opts.respond_to?(:to_h) + opts = opts.to_h + else + raise TypeError, "can't convert #{opts.class} into Hash" + end + end + _configure(opts) + end + + alias_method :merge, :configure + + # call-seq: to_h + # + # Returns the configuration instance variables as a hash, that can be + # passed to the configure method. + def to_h + result = { + indent: indent, + space: space, + space_before: space_before, + object_nl: object_nl, + array_nl: array_nl, + as_json: as_json, + allow_nan: allow_nan?, + ascii_only: ascii_only?, + max_nesting: max_nesting, + script_safe: script_safe?, + strict: strict?, + depth: depth, + buffer_initial_length: buffer_initial_length, + sort_keys: sort_keys + } + + allow_duplicate_key = allow_duplicate_key? + unless allow_duplicate_key.nil? + result[:allow_duplicate_key] = allow_duplicate_key + end + + instance_variables.each do |iv| + iv = iv.to_s[1..-1] + result[iv.to_sym] = self[iv] + end + + result + end + + alias_method :to_hash, :to_h + end + end + end +end diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/truffle_ruby/generator.rb b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/truffle_ruby/generator.rb new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/version.rb b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/version.rb new file mode 100644 index 00000000000..318272defda --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/data.tar.gz-extract/lib/json/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JSON + VERSION = '3.0.2' +end diff --git a/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/metadata.gz-extract/metadata.gz-extract b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/metadata.gz-extract/metadata.gz-extract new file mode 100644 index 00000000000..b8b3b9a4fdf --- /dev/null +++ b/tests/packagedcode/data/rubygems/package/json-3.0.2-java.gem-extract/metadata.gz-extract/metadata.gz-extract @@ -0,0 +1,62 @@ +--- !ruby/object:Gem::Specification +name: json +version: !ruby/object:Gem::Version + version: 3.0.2 +platform: java +authors: +- Daniel Luz +bindir: bin +cert_chain: [] +date: 2026-09-09 00:00:00.000000000 Z +dependencies: [] +description: A JSON implementation as a JRuby extension. +email: dev+ruby@mernen.com +executables: [] +extensions: [] +extra_rdoc_files: +- README.md +files: +- BSDL +- CHANGES.md +- COPYING +- LEGAL +- README.md +- json.gemspec +- lib/json.rb +- lib/json/common.rb +- lib/json/ext.rb +- lib/json/ext/generator.jar +- lib/json/ext/generator/state.rb +- lib/json/truffle_ruby/generator.rb +- lib/json/version.rb +homepage: https://github.com/ruby/json +licenses: +- Ruby +metadata: + bug_tracker_uri: https://github.com/ruby/json/issues + changelog_uri: https://github.com/ruby/json/blob/master/CHANGES.md + documentation_uri: https://docs.ruby-lang.org/en/master/JSON.html + homepage_uri: https://github.com/ruby/json + source_code_uri: https://github.com/ruby/json +rdoc_options: +- "--title" +- JSON implementation for Ruby +- "--main" +- README.md +require_paths: +- lib +required_ruby_version: !ruby/object:Gem::Requirement + requirements: + - - ">=" + - !ruby/object:Gem::Version + version: '2.7' +required_rubygems_version: !ruby/object:Gem::Requirement + requirements: + - - ">=" + - !ruby/object:Gem::Version + version: '0' +requirements: [] +rubygems_version: 3.6.3 +specification_version: 4 +summary: JSON Implementation for Ruby +test_files: [] diff --git a/tests/packagedcode/data/rubygems/package/m2r-2.1.0.gem.json b/tests/packagedcode/data/rubygems/package/m2r-2.1.0.gem.json index 24edcc7bdfc..ee3cf4ac110 100644 --- a/tests/packagedcode/data/rubygems/package/m2r-2.1.0.gem.json +++ b/tests/packagedcode/data/rubygems/package/m2r-2.1.0.gem.json @@ -1,171 +1,553 @@ -[ - { - "type": "gem", - "namespace": null, - "name": "m2r", - "version": "2.1.0", - "qualifiers": {}, - "subpath": null, - "primary_language": "Ruby", - "description": "Mongrel2 interface and handler library for Ruby.\nMongrel2 Rack handler and pure handler. Works with Rack, so it works with Rails!", - "release_date": "2013-10-29", - "parties": [ - { - "type": null, - "role": "author", - "name": "Colin Curtin", - "email": null, - "url": null - }, - { - "type": null, - "role": "author", - "name": "Pradeep Elankumaran", - "email": null, - "url": null - }, - { - "type": null, - "role": "author", - "name": "Pawel Pacana", - "email": null, - "url": null - }, - { - "type": null, - "role": "author", - "name": "Robert Pankowecki", - "email": null, - "url": null - } - ], - "keywords": [], - "homepage_url": "http://github.com/perplexes/m2r", - "download_url": "https://rubygems.org/downloads/m2r-2.1.0.gem", - "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": "mit", - "declared_license": [ - "MIT" - ], - "notice_text": null, - "dependencies": [ - { - "purl": "pkg:gem/ffi-rzmq", - "requirement": ">= 1.0.1", - "scope": "runtime", - "is_runtime": true, - "is_optional": false, - "is_pinned": false - }, - { - "purl": "pkg:gem/ffi", - "requirement": ">= 1.0.0", - "scope": "runtime", - "is_runtime": true, - "is_optional": false, - "is_pinned": false - }, - { - "purl": "pkg:gem/multi_json", - "requirement": null, - "scope": "runtime", - "is_runtime": true, - "is_optional": false, - "is_pinned": false - }, - { - "purl": "pkg:gem/tnetstring", - "requirement": null, - "scope": "runtime", - "is_runtime": true, - "is_optional": false, - "is_pinned": false - }, - { - "purl": "pkg:gem/rack", - "requirement": null, - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": false - }, - { - "purl": "pkg:gem/rake", - "requirement": null, - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": false - }, - { - "purl": "pkg:gem/minitest", - "requirement": "= 3.2.0", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": true - }, - { - "purl": "pkg:gem/mocha", - "requirement": ">= 0.14.0", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": false - }, - { - "purl": "pkg:gem/bbq", - "requirement": "= 0.0.4", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": true - }, - { - "purl": "pkg:gem/capybara-mechanize", - "requirement": "= 0.3.0", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": true - }, - { - "purl": "pkg:gem/activesupport", - "requirement": "~> 3.2.7", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": false - }, - { - "purl": "pkg:gem/yard", - "requirement": "~> 0.8.2", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": false - }, - { - "purl": "pkg:gem/kramdown", - "requirement": "~> 0.13.7", - "scope": "development", - "is_runtime": false, - "is_optional": true, - "is_pinned": false - } - ], - "source_packages": [], - "purl": "pkg:gem/m2r@2.1.0", - "repository_homepage_url": "https://rubygems.org/gems/m2r/versions/2.1.0", - "repository_download_url": "https://rubygems.org/downloads/m2r-2.1.0.gem", - "api_data_url": "https://rubygems.org/api/v2/rubygems/m2r/versions/2.1.0.json" - } -] \ No newline at end of file +{ + "packages": [ + { + "type": "gem", + "namespace": null, + "name": "m2r", + "version": "2.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "Ruby", + "description": "Mongrel2 interface and handler library for Ruby.\nMongrel2 Rack handler and pure handler. Works with Rack, so it works with Rails!", + "release_date": "2013-10-29", + "parties": [ + { + "type": null, + "role": "author", + "name": "Colin Curtin", + "email": null, + "url": null + }, + { + "type": null, + "role": "author", + "name": "Pradeep Elankumaran", + "email": null, + "url": null + }, + { + "type": null, + "role": "author", + "name": "Pawel Pacana", + "email": null, + "url": null + }, + { + "type": null, + "role": "author", + "name": "Robert Pankowecki", + "email": null, + "url": null + } + ], + "keywords": [], + "homepage_url": "http://github.com/perplexes/m2r", + "download_url": "https://rubygems.org/downloads/m2r-2.1.0.gem", + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": "mit", + "declared_license_expression_spdx": "MIT", + "license_detections": [ + { + "license_expression": "mit", + "license_expression_spdx": "MIT", + "matches": [ + { + "license_expression": "mit", + "license_expression_spdx": "MIT", + "from_file": "m2r-2.1.0.gem", + "start_line": 1, + "end_line": 1, + "matcher": "1-spdx-id", + "score": 100.0, + "matched_length": 1, + "match_coverage": 100.0, + "rule_relevance": 100, + "rule_identifier": "spdx-license-identifier-mit-5da48780aba670b0860c46d899ed42a0f243ff06", + "rule_url": null, + "matched_text": "MIT" + } + ], + "identifier": "mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf" + } + ], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": "- MIT\n", + "notice_text": null, + "source_packages": [], + "is_private": false, + "is_virtual": false, + "extra_data": {}, + "repository_homepage_url": "https://rubygems.org/gems/m2r/versions/2.1.0", + "repository_download_url": "https://rubygems.org/downloads/m2r-2.1.0.gem", + "api_data_url": "https://rubygems.org/api/v2/rubygems/m2r/versions/2.1.0.json", + "package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_paths": [ + "m2r-2.1.0.gem" + ], + "datasource_ids": [ + "gem_archive" + ], + "purl": "pkg:gem/m2r@2.1.0" + } + ], + "dependencies": [ + { + "purl": "pkg:gem/ffi-rzmq", + "extracted_requirement": ">= 1.0.1", + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/ffi-rzmq?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/ffi", + "extracted_requirement": ">= 1.0.0", + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/ffi?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/multi_json", + "extracted_requirement": null, + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/multi_json?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/tnetstring", + "extracted_requirement": null, + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/tnetstring?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/rack", + "extracted_requirement": null, + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/rack?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/rake", + "extracted_requirement": null, + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/rake?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/minitest", + "extracted_requirement": "= 3.2.0", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": true, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/minitest?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/mocha", + "extracted_requirement": ">= 0.14.0", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/mocha?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/bbq", + "extracted_requirement": "= 0.0.4", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": true, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/bbq?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/capybara-mechanize", + "extracted_requirement": "= 0.3.0", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": true, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/capybara-mechanize?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/activesupport", + "extracted_requirement": "~> 3.2.7", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/activesupport?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/yard", + "extracted_requirement": "~> 0.8.2", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/yard?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + }, + { + "purl": "pkg:gem/kramdown", + "extracted_requirement": "~> 0.13.7", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {}, + "dependency_uid": "pkg:gem/kramdown?uuid=fixed-uid-done-for-testing-5642512d1758", + "for_package_uid": "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758", + "datafile_path": "m2r-2.1.0.gem", + "datasource_id": "gem_archive" + } + ], + "files": [ + { + "path": "m2r-2.1.0.gem", + "type": "file", + "package_data": [ + { + "type": "gem", + "namespace": null, + "name": "m2r", + "version": "2.1.0", + "qualifiers": {}, + "subpath": null, + "primary_language": "Ruby", + "description": "Mongrel2 interface and handler library for Ruby.\nMongrel2 Rack handler and pure handler. Works with Rack, so it works with Rails!", + "release_date": "2013-10-29", + "parties": [ + { + "type": null, + "role": "author", + "name": "Colin Curtin", + "email": null, + "url": null + }, + { + "type": null, + "role": "author", + "name": "Pradeep Elankumaran", + "email": null, + "url": null + }, + { + "type": null, + "role": "author", + "name": "Pawel Pacana", + "email": null, + "url": null + }, + { + "type": null, + "role": "author", + "name": "Robert Pankowecki", + "email": null, + "url": null + } + ], + "keywords": [], + "homepage_url": "http://github.com/perplexes/m2r", + "download_url": "https://rubygems.org/downloads/m2r-2.1.0.gem", + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "holder": null, + "declared_license_expression": "mit", + "declared_license_expression_spdx": "MIT", + "license_detections": [ + { + "license_expression": "mit", + "license_expression_spdx": "MIT", + "matches": [ + { + "license_expression": "mit", + "license_expression_spdx": "MIT", + "from_file": "m2r-2.1.0.gem", + "start_line": 1, + "end_line": 1, + "matcher": "1-spdx-id", + "score": 100.0, + "matched_length": 1, + "match_coverage": 100.0, + "rule_relevance": 100, + "rule_identifier": "spdx-license-identifier-mit-5da48780aba670b0860c46d899ed42a0f243ff06", + "rule_url": null, + "matched_text": "MIT" + } + ], + "identifier": "mit-a822f434-d61f-f2b1-c792-8b8cb9e7b9bf" + } + ], + "other_license_expression": null, + "other_license_expression_spdx": null, + "other_license_detections": [], + "extracted_license_statement": "- MIT\n", + "notice_text": null, + "source_packages": [], + "file_references": [], + "is_private": false, + "is_virtual": false, + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:gem/ffi-rzmq", + "extracted_requirement": ">= 1.0.1", + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/ffi", + "extracted_requirement": ">= 1.0.0", + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/multi_json", + "extracted_requirement": null, + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/tnetstring", + "extracted_requirement": null, + "scope": "runtime", + "is_runtime": true, + "is_optional": false, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/rack", + "extracted_requirement": null, + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/rake", + "extracted_requirement": null, + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/minitest", + "extracted_requirement": "= 3.2.0", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": true, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/mocha", + "extracted_requirement": ">= 0.14.0", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/bbq", + "extracted_requirement": "= 0.0.4", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": true, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/capybara-mechanize", + "extracted_requirement": "= 0.3.0", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": true, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/activesupport", + "extracted_requirement": "~> 3.2.7", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/yard", + "extracted_requirement": "~> 0.8.2", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + }, + { + "purl": "pkg:gem/kramdown", + "extracted_requirement": "~> 0.13.7", + "scope": "development", + "is_runtime": false, + "is_optional": true, + "is_pinned": false, + "is_direct": true, + "resolved_package": {}, + "extra_data": {} + } + ], + "repository_homepage_url": "https://rubygems.org/gems/m2r/versions/2.1.0", + "repository_download_url": "https://rubygems.org/downloads/m2r-2.1.0.gem", + "api_data_url": "https://rubygems.org/api/v2/rubygems/m2r/versions/2.1.0.json", + "datasource_id": "gem_archive", + "purl": "pkg:gem/m2r@2.1.0" + } + ], + "for_packages": [ + "pkg:gem/m2r@2.1.0?uuid=fixed-uid-done-for-testing-5642512d1758" + ], + "scan_errors": [] + } + ] +} \ No newline at end of file diff --git a/tests/packagedcode/test_plugin_package.py b/tests/packagedcode/test_plugin_package.py index 77fe034dbaf..68ee6d97176 100644 --- a/tests/packagedcode/test_plugin_package.py +++ b/tests/packagedcode/test_plugin_package.py @@ -123,7 +123,7 @@ def test_package_command_scan_python(self): check_json_scan(expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES) def test_package_command_scan_rubygems(self): - test_dir = self.get_test_loc('rubygems/package') + test_dir = self.get_test_loc('rubygems/package/m2r-2.1.0.gem') result_file = self.get_temp_file('json') expected_file = self.get_test_loc('plugin/rubygems-package-expected.json') run_scan_click(['--package', '--strip-root', '--processes', '-1', test_dir, '--json', result_file]) diff --git a/tests/packagedcode/test_rubygems.py b/tests/packagedcode/test_rubygems.py index af55f355ab7..fffee60c3ee 100644 --- a/tests/packagedcode/test_rubygems.py +++ b/tests/packagedcode/test_rubygems.py @@ -17,10 +17,8 @@ from packagedcode import rubygems from packages_test_utils import PackageTester from scancode_config import REGEN_TEST_FIXTURES - -# TODO: Add test with https://rubygems.org/gems/pbox2d/versions/1.0.3-java -# this is a multiple personality package (Java and Ruby) -# see also https://rubygems.org/downloads/jaro_winkler-1.5.1-java.gem +from scancode.cli_test_utils import run_scan_click +from scancode.cli_test_utils import check_json_scan class TestGemSpec(PackageTester): @@ -84,6 +82,24 @@ def test_rubygems_with_variables_gemspec(self): packages = rubygems.GemspecHandler.parse(test_file) self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES) + def test_ruby_gem_scan(self): + test_file = self.get_test_loc('rubygems/package/m2r-2.1.0.gem') + expected_file = self.get_test_loc('rubygems/package/m2r-2.1.0.gem.json') + result_file = self.get_temp_file('results.json') + run_scan_click(['--package', test_file, '--json', result_file]) + check_json_scan( + expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES + ) + + def test_ruby_extracted_gem_scan(self): + test_file = self.get_test_loc('rubygems/package/json-3.0.2-java.gem-extract') + expected_file = self.get_test_loc('rubygems/package/json-3.0.2-java.gem-extract.json') + result_file = self.get_temp_file('results.json') + run_scan_click(['--package', test_file, '--json', result_file]) + check_json_scan( + expected_file, result_file, remove_uuid=True, regen=REGEN_TEST_FIXTURES + ) + class TestRubyGemMetadata(FileBasedTesting): test_data_dir = os.path.join(os.path.dirname(__file__), 'data')