From b07685291b65e51e0afc2b6cee91251419e0b3c1 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 10 Jun 2020 12:29:25 -0400 Subject: [PATCH 001/149] Add license to formula DSL --- Library/Homebrew/formula.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 2a37b445dc..23017a3995 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -351,6 +351,9 @@ class Formula # @see .desc= delegate desc: :"self.class" + # The SPDX ID of the software license. + delegate license: :"self.class" + # The homepage for the software. # @method homepage # @see .homepage= @@ -1678,6 +1681,7 @@ class Formula "aliases" => aliases.sort, "versioned_formulae" => versioned_formulae.map(&:name), "desc" => desc, + "license" => license, "homepage" => homepage, "versions" => { "stable" => stable&.version&.to_s, @@ -2199,6 +2203,13 @@ class Formula #
desc "Example formula"
attr_rw :desc + # @!attribute [w] + # The SPDX ID of the open-source license that the formula uses. + # Shows when running `brew info`. + # + #
license " BSD-2-Clause"
+ attr_rw :license + # @!attribute [w] homepage # The homepage for the software. Used by users to get more information # about the software and Homebrew maintainers as a point of contact for From 864cc76b3ba56543627139c99775cb818392823b Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 10 Jun 2020 12:29:54 -0400 Subject: [PATCH 002/149] Print license information in brew info --- Library/Homebrew/cmd/info.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index e6db9ec358..c41d2cb5c0 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -211,6 +211,8 @@ module Homebrew puts "From: #{Formatter.url(github_info(f))}" + puts "License: #{f.license}" if f.license + unless f.deps.empty? ohai "Dependencies" %w[build required recommended optional].map do |type| From c10b6bcc3c1e4676a17d7fb305876ce539de9069 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Sat, 13 Jun 2020 02:34:34 +0800 Subject: [PATCH 003/149] brew audit: Checks if a formula has a spdx license --- Library/Homebrew/dev-cmd/audit.rb | 9 +++++++++ Library/Homebrew/dev-cmd/spdx.json | 0 2 files changed, 9 insertions(+) create mode 100644 Library/Homebrew/dev-cmd/spdx.json diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 25f3bba70a..a527c6c809 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -12,6 +12,7 @@ require "date" require "missing_formula" require "digest" require "cli/parser" +require 'json' module Homebrew module_function @@ -341,6 +342,14 @@ module Homebrew openssl@1.1 ].freeze + def audit_licenses + path = File.join(File.dirname(__FILE__),"spdx.json") + file = File.open(File.expand_path(path)) + valid_licenses = JSON.load(file) + return if valid_licenses.key?(formula.license) + problem "#{formula.license} is not an SPDX license." + end + def audit_deps @specs.each do |spec| # Check for things we don't like to depend on. diff --git a/Library/Homebrew/dev-cmd/spdx.json b/Library/Homebrew/dev-cmd/spdx.json new file mode 100644 index 0000000000..e69de29bb2 From 803f9dd4a346b517c592c9ac6f3c2799073eab5a Mon Sep 17 00:00:00 2001 From: lionellloh Date: Sat, 13 Jun 2020 02:43:02 +0800 Subject: [PATCH 004/149] brew audit: check if license data exists --- Library/Homebrew/dev-cmd/audit.rb | 8 +- Library/Homebrew/dev-cmd/spdx.json | 2047 ++++++++++++++++++++++++++++ 2 files changed, 2053 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index a527c6c809..f890cc9772 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -346,8 +346,12 @@ module Homebrew path = File.join(File.dirname(__FILE__),"spdx.json") file = File.open(File.expand_path(path)) valid_licenses = JSON.load(file) - return if valid_licenses.key?(formula.license) - problem "#{formula.license} is not an SPDX license." + unless formula.license.nil? + return if valid_licenses.key?(formula.license) + problem "#{formula.license} is not an SPDX license." + else + problem "No license specified for package." + end end def audit_deps diff --git a/Library/Homebrew/dev-cmd/spdx.json b/Library/Homebrew/dev-cmd/spdx.json index e69de29bb2..d09c5647e5 100644 --- a/Library/Homebrew/dev-cmd/spdx.json +++ b/Library/Homebrew/dev-cmd/spdx.json @@ -0,0 +1,2047 @@ +{ + "0BSD": { + "name": "BSD Zero Clause License", + "url": "http://landley.net/toybox/license.html", + "osiApproved": true + }, + "AAL": { + "name": "Attribution Assurance License", + "url": "https://opensource.org/licenses/attribution", + "osiApproved": true + }, + "ADSL": { + "name": "Amazon Digital Services License", + "url": "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense", + "osiApproved": false + }, + "AFL-1.1": { + "name": "Academic Free License v1.1", + "url": "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", + "osiApproved": true + }, + "AFL-1.2": { + "name": "Academic Free License v1.2", + "url": "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", + "osiApproved": true + }, + "AFL-2.0": { + "name": "Academic Free License v2.0", + "url": "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt", + "osiApproved": true + }, + "AFL-2.1": { + "name": "Academic Free License v2.1", + "url": "http://opensource.linux-mirror.org/licenses/afl-2.1.txt", + "osiApproved": true + }, + "AFL-3.0": { + "name": "Academic Free License v3.0", + "url": "http://www.rosenlaw.com/AFL3.0.htm", + "osiApproved": true + }, + "AGPL-1.0": { + "name": "Affero General Public License v1.0", + "url": "http://www.affero.org/oagpl.html", + "osiApproved": false + }, + "AGPL-1.0-only": { + "name": "Affero General Public License v1.0 only", + "url": "http://www.affero.org/oagpl.html", + "osiApproved": false + }, + "AGPL-1.0-or-later": { + "name": "Affero General Public License v1.0 or later", + "url": "http://www.affero.org/oagpl.html", + "osiApproved": false + }, + "AGPL-3.0": { + "name": "GNU Affero General Public License v3.0", + "url": "https://www.gnu.org/licenses/agpl.txt", + "osiApproved": true + }, + "AGPL-3.0-only": { + "name": "GNU Affero General Public License v3.0 only", + "url": "https://www.gnu.org/licenses/agpl.txt", + "osiApproved": true + }, + "AGPL-3.0-or-later": { + "name": "GNU Affero General Public License v3.0 or later", + "url": "https://www.gnu.org/licenses/agpl.txt", + "osiApproved": true + }, + "AMDPLPA": { + "name": "AMD's plpa_map.c License", + "url": "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License", + "osiApproved": false + }, + "AML": { + "name": "Apple MIT License", + "url": "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License", + "osiApproved": false + }, + "AMPAS": { + "name": "Academy of Motion Picture Arts and Sciences BSD", + "url": "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD", + "osiApproved": false + }, + "ANTLR-PD": { + "name": "ANTLR Software Rights Notice", + "url": "http://www.antlr2.org/license.html", + "osiApproved": false + }, + "APAFML": { + "name": "Adobe Postscript AFM License", + "url": "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM", + "osiApproved": false + }, + "APL-1.0": { + "name": "Adaptive Public License 1.0", + "url": "https://opensource.org/licenses/APL-1.0", + "osiApproved": true + }, + "APSL-1.0": { + "name": "Apple Public Source License 1.0", + "url": "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0", + "osiApproved": true + }, + "APSL-1.1": { + "name": "Apple Public Source License 1.1", + "url": "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE", + "osiApproved": true + }, + "APSL-1.2": { + "name": "Apple Public Source License 1.2", + "url": "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php", + "osiApproved": true + }, + "APSL-2.0": { + "name": "Apple Public Source License 2.0", + "url": "http://www.opensource.apple.com/license/apsl/", + "osiApproved": true + }, + "Abstyles": { + "name": "Abstyles License", + "url": "https://fedoraproject.org/wiki/Licensing/Abstyles", + "osiApproved": false + }, + "Adobe-2006": { + "name": "Adobe Systems Incorporated Source Code License Agreement", + "url": "https://fedoraproject.org/wiki/Licensing/AdobeLicense", + "osiApproved": false + }, + "Adobe-Glyph": { + "name": "Adobe Glyph List License", + "url": "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph", + "osiApproved": false + }, + "Afmparse": { + "name": "Afmparse License", + "url": "https://fedoraproject.org/wiki/Licensing/Afmparse", + "osiApproved": false + }, + "Aladdin": { + "name": "Aladdin Free Public License", + "url": "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm", + "osiApproved": false + }, + "Apache-1.0": { + "name": "Apache License 1.0", + "url": "http://www.apache.org/licenses/LICENSE-1.0", + "osiApproved": false + }, + "Apache-1.1": { + "name": "Apache License 1.1", + "url": "http://apache.org/licenses/LICENSE-1.1", + "osiApproved": true + }, + "Apache-2.0": { + "name": "Apache License 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0", + "osiApproved": true + }, + "Artistic-1.0": { + "name": "Artistic License 1.0", + "url": "https://opensource.org/licenses/Artistic-1.0", + "osiApproved": true + }, + "Artistic-1.0-Perl": { + "name": "Artistic License 1.0 (Perl)", + "url": "http://dev.perl.org/licenses/artistic.html", + "osiApproved": true + }, + "Artistic-1.0-cl8": { + "name": "Artistic License 1.0 w/clause 8", + "url": "https://opensource.org/licenses/Artistic-1.0", + "osiApproved": true + }, + "Artistic-2.0": { + "name": "Artistic License 2.0", + "url": "http://www.perlfoundation.org/artistic_license_2_0", + "osiApproved": true + }, + "BSD-1-Clause": { + "name": "BSD 1-Clause License", + "url": "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision=326823", + "osiApproved": false + }, + "BSD-2-Clause": { + "name": "BSD 2-Clause \"Simplified\" License", + "url": "https://opensource.org/licenses/BSD-2-Clause", + "osiApproved": true + }, + "BSD-2-Clause-FreeBSD": { + "name": "BSD 2-Clause FreeBSD License", + "url": "http://www.freebsd.org/copyright/freebsd-license.html", + "osiApproved": false + }, + "BSD-2-Clause-NetBSD": { + "name": "BSD 2-Clause NetBSD License", + "url": "http://www.netbsd.org/about/redistribution.html#default", + "osiApproved": false + }, + "BSD-2-Clause-Patent": { + "name": "BSD-2-Clause Plus Patent License", + "url": "https://opensource.org/licenses/BSDplusPatent", + "osiApproved": true + }, + "BSD-3-Clause": { + "name": "BSD 3-Clause \"New\" or \"Revised\" License", + "url": "https://opensource.org/licenses/BSD-3-Clause", + "osiApproved": true + }, + "BSD-3-Clause-Attribution": { + "name": "BSD with attribution", + "url": "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution", + "osiApproved": false + }, + "BSD-3-Clause-Clear": { + "name": "BSD 3-Clause Clear License", + "url": "http://labs.metacarta.com/license-explanation.html#license", + "osiApproved": false + }, + "BSD-3-Clause-LBNL": { + "name": "Lawrence Berkeley National Labs BSD variant license", + "url": "https://fedoraproject.org/wiki/Licensing/LBNLBSD", + "osiApproved": true + }, + "BSD-3-Clause-No-Nuclear-License": { + "name": "BSD 3-Clause No Nuclear License", + "url": "http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam=1467140197_43d516ce1776bd08a58235a7785be1cc", + "osiApproved": false + }, + "BSD-3-Clause-No-Nuclear-License-2014": { + "name": "BSD 3-Clause No Nuclear License 2014", + "url": "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense", + "osiApproved": false + }, + "BSD-3-Clause-No-Nuclear-Warranty": { + "name": "BSD 3-Clause No Nuclear Warranty", + "url": "https://jogamp.org/git/?p=gluegen.git;a=blob_plain;f=LICENSE.txt", + "osiApproved": false + }, + "BSD-3-Clause-Open-MPI": { + "name": "BSD 3-Clause Open MPI variant", + "url": "https://www.open-mpi.org/community/license.php", + "osiApproved": false + }, + "BSD-4-Clause": { + "name": "BSD 4-Clause \"Original\" or \"Old\" License", + "url": "http://directory.fsf.org/wiki/License:BSD_4Clause", + "osiApproved": false + }, + "BSD-4-Clause-UC": { + "name": "BSD-4-Clause (University of California-Specific)", + "url": "http://www.freebsd.org/copyright/license.html", + "osiApproved": false + }, + "BSD-Protection": { + "name": "BSD Protection License", + "url": "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License", + "osiApproved": false + }, + "BSD-Source-Code": { + "name": "BSD Source Code Attribution", + "url": "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt", + "osiApproved": false + }, + "BSL-1.0": { + "name": "Boost Software License 1.0", + "url": "http://www.boost.org/LICENSE_1_0.txt", + "osiApproved": true + }, + "Bahyph": { + "name": "Bahyph License", + "url": "https://fedoraproject.org/wiki/Licensing/Bahyph", + "osiApproved": false + }, + "Barr": { + "name": "Barr License", + "url": "https://fedoraproject.org/wiki/Licensing/Barr", + "osiApproved": false + }, + "Beerware": { + "name": "Beerware License", + "url": "https://fedoraproject.org/wiki/Licensing/Beerware", + "osiApproved": false + }, + "BitTorrent-1.0": { + "name": "BitTorrent Open Source License v1.0", + "url": "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1=1.1&r2=1.1.1.1&diff_format=s", + "osiApproved": false + }, + "BitTorrent-1.1": { + "name": "BitTorrent Open Source License v1.1", + "url": "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1", + "osiApproved": false + }, + "BlueOak-1.0.0": { + "name": "Blue Oak Model License 1.0.0", + "url": "https://blueoakcouncil.org/license/1.0.0", + "osiApproved": false + }, + "Borceux": { + "name": "Borceux license", + "url": "https://fedoraproject.org/wiki/Licensing/Borceux", + "osiApproved": false + }, + "CATOSL-1.1": { + "name": "Computer Associates Trusted Open Source License 1.1", + "url": "https://opensource.org/licenses/CATOSL-1.1", + "osiApproved": true + }, + "CC-BY-1.0": { + "name": "Creative Commons Attribution 1.0 Generic", + "url": "https://creativecommons.org/licenses/by/1.0/legalcode", + "osiApproved": false + }, + "CC-BY-2.0": { + "name": "Creative Commons Attribution 2.0 Generic", + "url": "https://creativecommons.org/licenses/by/2.0/legalcode", + "osiApproved": false + }, + "CC-BY-2.5": { + "name": "Creative Commons Attribution 2.5 Generic", + "url": "https://creativecommons.org/licenses/by/2.5/legalcode", + "osiApproved": false + }, + "CC-BY-3.0": { + "name": "Creative Commons Attribution 3.0 Unported", + "url": "https://creativecommons.org/licenses/by/3.0/legalcode", + "osiApproved": false + }, + "CC-BY-4.0": { + "name": "Creative Commons Attribution 4.0 International", + "url": "https://creativecommons.org/licenses/by/4.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-1.0": { + "name": "Creative Commons Attribution Non Commercial 1.0 Generic", + "url": "https://creativecommons.org/licenses/by-nc/1.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-2.0": { + "name": "Creative Commons Attribution Non Commercial 2.0 Generic", + "url": "https://creativecommons.org/licenses/by-nc/2.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-2.5": { + "name": "Creative Commons Attribution Non Commercial 2.5 Generic", + "url": "https://creativecommons.org/licenses/by-nc/2.5/legalcode", + "osiApproved": false + }, + "CC-BY-NC-3.0": { + "name": "Creative Commons Attribution Non Commercial 3.0 Unported", + "url": "https://creativecommons.org/licenses/by-nc/3.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-4.0": { + "name": "Creative Commons Attribution Non Commercial 4.0 International", + "url": "https://creativecommons.org/licenses/by-nc/4.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-ND-1.0": { + "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", + "url": "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-ND-2.0": { + "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", + "url": "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-ND-2.5": { + "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", + "url": "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode", + "osiApproved": false + }, + "CC-BY-NC-ND-3.0": { + "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", + "url": "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-ND-4.0": { + "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "url": "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-SA-1.0": { + "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", + "url": "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-SA-2.0": { + "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", + "url": "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-SA-2.5": { + "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", + "url": "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode", + "osiApproved": false + }, + "CC-BY-NC-SA-3.0": { + "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", + "url": "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode", + "osiApproved": false + }, + "CC-BY-NC-SA-4.0": { + "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", + "url": "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode", + "osiApproved": false + }, + "CC-BY-ND-1.0": { + "name": "Creative Commons Attribution No Derivatives 1.0 Generic", + "url": "https://creativecommons.org/licenses/by-nd/1.0/legalcode", + "osiApproved": false + }, + "CC-BY-ND-2.0": { + "name": "Creative Commons Attribution No Derivatives 2.0 Generic", + "url": "https://creativecommons.org/licenses/by-nd/2.0/legalcode", + "osiApproved": false + }, + "CC-BY-ND-2.5": { + "name": "Creative Commons Attribution No Derivatives 2.5 Generic", + "url": "https://creativecommons.org/licenses/by-nd/2.5/legalcode", + "osiApproved": false + }, + "CC-BY-ND-3.0": { + "name": "Creative Commons Attribution No Derivatives 3.0 Unported", + "url": "https://creativecommons.org/licenses/by-nd/3.0/legalcode", + "osiApproved": false + }, + "CC-BY-ND-4.0": { + "name": "Creative Commons Attribution No Derivatives 4.0 International", + "url": "https://creativecommons.org/licenses/by-nd/4.0/legalcode", + "osiApproved": false + }, + "CC-BY-SA-1.0": { + "name": "Creative Commons Attribution Share Alike 1.0 Generic", + "url": "https://creativecommons.org/licenses/by-sa/1.0/legalcode", + "osiApproved": false + }, + "CC-BY-SA-2.0": { + "name": "Creative Commons Attribution Share Alike 2.0 Generic", + "url": "https://creativecommons.org/licenses/by-sa/2.0/legalcode", + "osiApproved": false + }, + "CC-BY-SA-2.5": { + "name": "Creative Commons Attribution Share Alike 2.5 Generic", + "url": "https://creativecommons.org/licenses/by-sa/2.5/legalcode", + "osiApproved": false + }, + "CC-BY-SA-3.0": { + "name": "Creative Commons Attribution Share Alike 3.0 Unported", + "url": "https://creativecommons.org/licenses/by-sa/3.0/legalcode", + "osiApproved": false + }, + "CC-BY-SA-4.0": { + "name": "Creative Commons Attribution Share Alike 4.0 International", + "url": "https://creativecommons.org/licenses/by-sa/4.0/legalcode", + "osiApproved": false + }, + "CC-PDDC": { + "name": "Creative Commons Public Domain Dedication and Certification", + "url": "https://creativecommons.org/licenses/publicdomain/", + "osiApproved": false + }, + "CC0-1.0": { + "name": "Creative Commons Zero v1.0 Universal", + "url": "https://creativecommons.org/publicdomain/zero/1.0/legalcode", + "osiApproved": false + }, + "CDDL-1.0": { + "name": "Common Development and Distribution License 1.0", + "url": "https://opensource.org/licenses/cddl1", + "osiApproved": true + }, + "CDDL-1.1": { + "name": "Common Development and Distribution License 1.1", + "url": "http://glassfish.java.net/public/CDDL+GPL_1_1.html", + "osiApproved": false + }, + "CDLA-Permissive-1.0": { + "name": "Community Data License Agreement Permissive 1.0", + "url": "https://cdla.io/permissive-1-0", + "osiApproved": false + }, + "CDLA-Sharing-1.0": { + "name": "Community Data License Agreement Sharing 1.0", + "url": "https://cdla.io/sharing-1-0", + "osiApproved": false + }, + "CECILL-1.0": { + "name": "CeCILL Free Software License Agreement v1.0", + "url": "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html", + "osiApproved": false + }, + "CECILL-1.1": { + "name": "CeCILL Free Software License Agreement v1.1", + "url": "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html", + "osiApproved": false + }, + "CECILL-2.0": { + "name": "CeCILL Free Software License Agreement v2.0", + "url": "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html", + "osiApproved": false + }, + "CECILL-2.1": { + "name": "CeCILL Free Software License Agreement v2.1", + "url": "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html", + "osiApproved": true + }, + "CECILL-B": { + "name": "CeCILL-B Free Software License Agreement", + "url": "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html", + "osiApproved": false + }, + "CECILL-C": { + "name": "CeCILL-C Free Software License Agreement", + "url": "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html", + "osiApproved": false + }, + "CERN-OHL-1.1": { + "name": "CERN Open Hardware Licence v1.1", + "url": "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1", + "osiApproved": false + }, + "CERN-OHL-1.2": { + "name": "CERN Open Hardware Licence v1.2", + "url": "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2", + "osiApproved": false + }, + "CNRI-Jython": { + "name": "CNRI Jython License", + "url": "http://www.jython.org/license.html", + "osiApproved": false + }, + "CNRI-Python": { + "name": "CNRI Python License", + "url": "https://opensource.org/licenses/CNRI-Python", + "osiApproved": true + }, + "CNRI-Python-GPL-Compatible": { + "name": "CNRI Python Open Source GPL Compatible License Agreement", + "url": "http://www.python.org/download/releases/1.6.1/download_win/", + "osiApproved": false + }, + "CPAL-1.0": { + "name": "Common Public Attribution License 1.0", + "url": "https://opensource.org/licenses/CPAL-1.0", + "osiApproved": true + }, + "CPL-1.0": { + "name": "Common Public License 1.0", + "url": "https://opensource.org/licenses/CPL-1.0", + "osiApproved": true + }, + "CPOL-1.02": { + "name": "Code Project Open License 1.02", + "url": "http://www.codeproject.com/info/cpol10.aspx", + "osiApproved": false + }, + "CUA-OPL-1.0": { + "name": "CUA Office Public License v1.0", + "url": "https://opensource.org/licenses/CUA-OPL-1.0", + "osiApproved": true + }, + "Caldera": { + "name": "Caldera License", + "url": "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf", + "osiApproved": false + }, + "ClArtistic": { + "name": "Clarified Artistic License", + "url": "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", + "osiApproved": false + }, + "Condor-1.1": { + "name": "Condor Public License v1.1", + "url": "http://research.cs.wisc.edu/condor/license.html#condor", + "osiApproved": false + }, + "Crossword": { + "name": "Crossword License", + "url": "https://fedoraproject.org/wiki/Licensing/Crossword", + "osiApproved": false + }, + "CrystalStacker": { + "name": "CrystalStacker License", + "url": "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd=Licensing/CrystalStacker", + "osiApproved": false + }, + "Cube": { + "name": "Cube License", + "url": "https://fedoraproject.org/wiki/Licensing/Cube", + "osiApproved": false + }, + "D-FSL-1.0": { + "name": "Deutsche Freie Software Lizenz", + "url": "http://www.dipp.nrw.de/d-fsl/lizenzen/", + "osiApproved": false + }, + "DOC": { + "name": "DOC License", + "url": "http://www.cs.wustl.edu/~schmidt/ACE-copying.html", + "osiApproved": false + }, + "DSDP": { + "name": "DSDP License", + "url": "https://fedoraproject.org/wiki/Licensing/DSDP", + "osiApproved": false + }, + "Dotseqn": { + "name": "Dotseqn License", + "url": "https://fedoraproject.org/wiki/Licensing/Dotseqn", + "osiApproved": false + }, + "ECL-1.0": { + "name": "Educational Community License v1.0", + "url": "https://opensource.org/licenses/ECL-1.0", + "osiApproved": true + }, + "ECL-2.0": { + "name": "Educational Community License v2.0", + "url": "https://opensource.org/licenses/ECL-2.0", + "osiApproved": true + }, + "EFL-1.0": { + "name": "Eiffel Forum License v1.0", + "url": "http://www.eiffel-nice.org/license/forum.txt", + "osiApproved": true + }, + "EFL-2.0": { + "name": "Eiffel Forum License v2.0", + "url": "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", + "osiApproved": true + }, + "EPL-1.0": { + "name": "Eclipse Public License 1.0", + "url": "http://www.eclipse.org/legal/epl-v10.html", + "osiApproved": true + }, + "EPL-2.0": { + "name": "Eclipse Public License 2.0", + "url": "https://www.eclipse.org/legal/epl-2.0", + "osiApproved": true + }, + "EUDatagrid": { + "name": "EU DataGrid Software License", + "url": "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", + "osiApproved": true + }, + "EUPL-1.0": { + "name": "European Union Public License 1.0", + "url": "http://ec.europa.eu/idabc/en/document/7330.html", + "osiApproved": false + }, + "EUPL-1.1": { + "name": "European Union Public License 1.1", + "url": "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", + "osiApproved": true + }, + "EUPL-1.2": { + "name": "European Union Public License 1.2", + "url": "https://joinup.ec.europa.eu/page/eupl-text-11-12", + "osiApproved": true + }, + "Entessa": { + "name": "Entessa Public License v1.0", + "url": "https://opensource.org/licenses/Entessa", + "osiApproved": true + }, + "ErlPL-1.1": { + "name": "Erlang Public License v1.1", + "url": "http://www.erlang.org/EPLICENSE", + "osiApproved": false + }, + "Eurosym": { + "name": "Eurosym License", + "url": "https://fedoraproject.org/wiki/Licensing/Eurosym", + "osiApproved": false + }, + "FSFAP": { + "name": "FSF All Permissive License", + "url": "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html", + "osiApproved": false + }, + "FSFUL": { + "name": "FSF Unlimited License", + "url": "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License", + "osiApproved": false + }, + "FSFULLR": { + "name": "FSF Unlimited License (with License Retention)", + "url": "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant", + "osiApproved": false + }, + "FTL": { + "name": "Freetype Project License", + "url": "http://freetype.fis.uniroma2.it/FTL.TXT", + "osiApproved": false + }, + "Fair": { + "name": "Fair License", + "url": "http://fairlicense.org/", + "osiApproved": true + }, + "Frameworx-1.0": { + "name": "Frameworx Open License 1.0", + "url": "https://opensource.org/licenses/Frameworx-1.0", + "osiApproved": true + }, + "FreeImage": { + "name": "FreeImage Public License v1.0", + "url": "http://freeimage.sourceforge.net/freeimage-license.txt", + "osiApproved": false + }, + "GFDL-1.1": { + "name": "GNU Free Documentation License v1.1", + "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt", + "osiApproved": false + }, + "GFDL-1.1-only": { + "name": "GNU Free Documentation License v1.1 only", + "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt", + "osiApproved": false + }, + "GFDL-1.1-or-later": { + "name": "GNU Free Documentation License v1.1 or later", + "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt", + "osiApproved": false + }, + "GFDL-1.2": { + "name": "GNU Free Documentation License v1.2", + "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt", + "osiApproved": false + }, + "GFDL-1.2-only": { + "name": "GNU Free Documentation License v1.2 only", + "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt", + "osiApproved": false + }, + "GFDL-1.2-or-later": { + "name": "GNU Free Documentation License v1.2 or later", + "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt", + "osiApproved": false + }, + "GFDL-1.3": { + "name": "GNU Free Documentation License v1.3", + "url": "https://www.gnu.org/licenses/fdl-1.3.txt", + "osiApproved": false + }, + "GFDL-1.3-only": { + "name": "GNU Free Documentation License v1.3 only", + "url": "https://www.gnu.org/licenses/fdl-1.3.txt", + "osiApproved": false + }, + "GFDL-1.3-or-later": { + "name": "GNU Free Documentation License v1.3 or later", + "url": "https://www.gnu.org/licenses/fdl-1.3.txt", + "osiApproved": false + }, + "GL2PS": { + "name": "GL2PS License", + "url": "http://www.geuz.org/gl2ps/COPYING.GL2PS", + "osiApproved": false + }, + "GPL-1.0": { + "name": "GNU General Public License v1.0 only", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", + "osiApproved": false + }, + "GPL-1.0+": { + "name": "GNU General Public License v1.0 or later", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", + "osiApproved": false + }, + "GPL-1.0-only": { + "name": "GNU General Public License v1.0 only", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", + "osiApproved": false + }, + "GPL-1.0-or-later": { + "name": "GNU General Public License v1.0 or later", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", + "osiApproved": false + }, + "GPL-2.0": { + "name": "GNU General Public License v2.0 only", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "osiApproved": true + }, + "GPL-2.0+": { + "name": "GNU General Public License v2.0 or later", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "osiApproved": true + }, + "GPL-2.0-only": { + "name": "GNU General Public License v2.0 only", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "osiApproved": true + }, + "GPL-2.0-or-later": { + "name": "GNU General Public License v2.0 or later", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "osiApproved": true + }, + "GPL-2.0-with-GCC-exception": { + "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", + "url": "https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/libgcc1.c;h=762f5143fc6eed57b6797c82710f3538aa52b40b;hb=cb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10", + "osiApproved": false + }, + "GPL-2.0-with-autoconf-exception": { + "name": "GNU General Public License v2.0 w/Autoconf exception", + "url": "http://ac-archive.sourceforge.net/doc/copyright.html", + "osiApproved": false + }, + "GPL-2.0-with-bison-exception": { + "name": "GNU General Public License v2.0 w/Bison exception", + "url": "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id=193d7c7054ba7197b0789e14965b739162319b5e#n141", + "osiApproved": false + }, + "GPL-2.0-with-classpath-exception": { + "name": "GNU General Public License v2.0 w/Classpath exception", + "url": "https://www.gnu.org/software/classpath/license.html", + "osiApproved": false + }, + "GPL-2.0-with-font-exception": { + "name": "GNU General Public License v2.0 w/Font exception", + "url": "https://www.gnu.org/licenses/gpl-faq.html#FontException", + "osiApproved": false + }, + "GPL-3.0": { + "name": "GNU General Public License v3.0 only", + "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "osiApproved": true + }, + "GPL-3.0+": { + "name": "GNU General Public License v3.0 or later", + "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "osiApproved": true + }, + "GPL-3.0-only": { + "name": "GNU General Public License v3.0 only", + "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "osiApproved": true + }, + "GPL-3.0-or-later": { + "name": "GNU General Public License v3.0 or later", + "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "osiApproved": true + }, + "GPL-3.0-with-GCC-exception": { + "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", + "url": "https://www.gnu.org/licenses/gcc-exception-3.1.html", + "osiApproved": true + }, + "GPL-3.0-with-autoconf-exception": { + "name": "GNU General Public License v3.0 w/Autoconf exception", + "url": "https://www.gnu.org/licenses/autoconf-exception-3.0.html", + "osiApproved": false + }, + "Giftware": { + "name": "Giftware License", + "url": "http://liballeg.org/license.html#allegro-4-the-giftware-license", + "osiApproved": false + }, + "Glide": { + "name": "3dfx Glide License", + "url": "http://www.users.on.net/~triforce/glidexp/COPYING.txt", + "osiApproved": false + }, + "Glulxe": { + "name": "Glulxe License", + "url": "https://fedoraproject.org/wiki/Licensing/Glulxe", + "osiApproved": false + }, + "HPND": { + "name": "Historical Permission Notice and Disclaimer", + "url": "https://opensource.org/licenses/HPND", + "osiApproved": true + }, + "HPND-sell-variant": { + "name": "Historical Permission Notice and Disclaimer - sell variant", + "url": "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h=v4.19", + "osiApproved": false + }, + "HaskellReport": { + "name": "Haskell Language Report License", + "url": "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License", + "osiApproved": false + }, + "IBM-pibs": { + "name": "IBM PowerPC Initialization and Boot Software", + "url": "http://git.denx.de/?p=u-boot.git;a=blob;f=arch/powerpc/cpu/ppc4xx/miiphy.c;h=297155fdafa064b955e53e9832de93bfb0cfb85b;hb=9fab4bf4cc077c21e43941866f3f2c196f28670d", + "osiApproved": false + }, + "ICU": { + "name": "ICU License", + "url": "http://source.icu-project.org/repos/icu/icu/trunk/license.html", + "osiApproved": false + }, + "IJG": { + "name": "Independent JPEG Group License", + "url": "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev=1.2", + "osiApproved": false + }, + "IPA": { + "name": "IPA Font License", + "url": "https://opensource.org/licenses/IPA", + "osiApproved": true + }, + "IPL-1.0": { + "name": "IBM Public License v1.0", + "url": "https://opensource.org/licenses/IPL-1.0", + "osiApproved": true + }, + "ISC": { + "name": "ISC License", + "url": "https://www.isc.org/downloads/software-support-policy/isc-license/", + "osiApproved": true + }, + "ImageMagick": { + "name": "ImageMagick License", + "url": "http://www.imagemagick.org/script/license.php", + "osiApproved": false + }, + "Imlib2": { + "name": "Imlib2 License", + "url": "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", + "osiApproved": false + }, + "Info-ZIP": { + "name": "Info-ZIP License", + "url": "http://www.info-zip.org/license.html", + "osiApproved": false + }, + "Intel": { + "name": "Intel Open Source License", + "url": "https://opensource.org/licenses/Intel", + "osiApproved": true + }, + "Intel-ACPI": { + "name": "Intel ACPI Software License Agreement", + "url": "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement", + "osiApproved": false + }, + "Interbase-1.0": { + "name": "Interbase Public License v1.0", + "url": "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html", + "osiApproved": false + }, + "JPNIC": { + "name": "Japan Network Information Center License", + "url": "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366", + "osiApproved": false + }, + "JSON": { + "name": "JSON License", + "url": "http://www.json.org/license.html", + "osiApproved": false + }, + "JasPer-2.0": { + "name": "JasPer License", + "url": "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE", + "osiApproved": false + }, + "LAL-1.2": { + "name": "Licence Art Libre 1.2", + "url": "http://artlibre.org/licence/lal/licence-art-libre-12/", + "osiApproved": false + }, + "LAL-1.3": { + "name": "Licence Art Libre 1.3", + "url": "https://artlibre.org/", + "osiApproved": false + }, + "LGPL-2.0": { + "name": "GNU Library General Public License v2 only", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", + "osiApproved": true + }, + "LGPL-2.0+": { + "name": "GNU Library General Public License v2 or later", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", + "osiApproved": true + }, + "LGPL-2.0-only": { + "name": "GNU Library General Public License v2 only", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", + "osiApproved": true + }, + "LGPL-2.0-or-later": { + "name": "GNU Library General Public License v2 or later", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", + "osiApproved": true + }, + "LGPL-2.1": { + "name": "GNU Lesser General Public License v2.1 only", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "osiApproved": true + }, + "LGPL-2.1+": { + "name": "GNU Library General Public License v2.1 or later", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "osiApproved": true + }, + "LGPL-2.1-only": { + "name": "GNU Lesser General Public License v2.1 only", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "osiApproved": true + }, + "LGPL-2.1-or-later": { + "name": "GNU Lesser General Public License v2.1 or later", + "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "osiApproved": true + }, + "LGPL-3.0": { + "name": "GNU Lesser General Public License v3.0 only", + "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "osiApproved": true + }, + "LGPL-3.0+": { + "name": "GNU Lesser General Public License v3.0 or later", + "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "osiApproved": true + }, + "LGPL-3.0-only": { + "name": "GNU Lesser General Public License v3.0 only", + "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "osiApproved": true + }, + "LGPL-3.0-or-later": { + "name": "GNU Lesser General Public License v3.0 or later", + "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "osiApproved": true + }, + "LGPLLR": { + "name": "Lesser General Public License For Linguistic Resources", + "url": "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html", + "osiApproved": false + }, + "LPL-1.0": { + "name": "Lucent Public License Version 1.0", + "url": "https://opensource.org/licenses/LPL-1.0", + "osiApproved": true + }, + "LPL-1.02": { + "name": "Lucent Public License v1.02", + "url": "http://plan9.bell-labs.com/plan9/license.html", + "osiApproved": true + }, + "LPPL-1.0": { + "name": "LaTeX Project Public License v1.0", + "url": "http://www.latex-project.org/lppl/lppl-1-0.txt", + "osiApproved": false + }, + "LPPL-1.1": { + "name": "LaTeX Project Public License v1.1", + "url": "http://www.latex-project.org/lppl/lppl-1-1.txt", + "osiApproved": false + }, + "LPPL-1.2": { + "name": "LaTeX Project Public License v1.2", + "url": "http://www.latex-project.org/lppl/lppl-1-2.txt", + "osiApproved": false + }, + "LPPL-1.3a": { + "name": "LaTeX Project Public License v1.3a", + "url": "http://www.latex-project.org/lppl/lppl-1-3a.txt", + "osiApproved": false + }, + "LPPL-1.3c": { + "name": "LaTeX Project Public License v1.3c", + "url": "http://www.latex-project.org/lppl/lppl-1-3c.txt", + "osiApproved": true + }, + "Latex2e": { + "name": "Latex2e License", + "url": "https://fedoraproject.org/wiki/Licensing/Latex2e", + "osiApproved": false + }, + "Leptonica": { + "name": "Leptonica License", + "url": "https://fedoraproject.org/wiki/Licensing/Leptonica", + "osiApproved": false + }, + "LiLiQ-P-1.1": { + "name": "Licence Libre du Québec – Permissive version 1.1", + "url": "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", + "osiApproved": true + }, + "LiLiQ-R-1.1": { + "name": "Licence Libre du Québec – Réciprocité version 1.1", + "url": "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", + "osiApproved": true + }, + "LiLiQ-Rplus-1.1": { + "name": "Licence Libre du Québec – Réciprocité forte version 1.1", + "url": "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", + "osiApproved": true + }, + "Libpng": { + "name": "libpng License", + "url": "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt", + "osiApproved": false + }, + "Linux-OpenIB": { + "name": "Linux Kernel Variant of OpenIB.org license", + "url": "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h", + "osiApproved": false + }, + "MIT": { + "name": "MIT License", + "url": "https://opensource.org/licenses/MIT", + "osiApproved": true + }, + "MIT-0": { + "name": "MIT No Attribution", + "url": "https://github.com/aws/mit-0", + "osiApproved": false + }, + "MIT-CMU": { + "name": "CMU License", + "url": "https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#CMU_Style", + "osiApproved": false + }, + "MIT-advertising": { + "name": "Enlightenment License (e16)", + "url": "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising", + "osiApproved": false + }, + "MIT-enna": { + "name": "enna License", + "url": "https://fedoraproject.org/wiki/Licensing/MIT#enna", + "osiApproved": false + }, + "MIT-feh": { + "name": "feh License", + "url": "https://fedoraproject.org/wiki/Licensing/MIT#feh", + "osiApproved": false + }, + "MITNFA": { + "name": "MIT +no-false-attribs license", + "url": "https://fedoraproject.org/wiki/Licensing/MITNFA", + "osiApproved": false + }, + "MPL-1.0": { + "name": "Mozilla Public License 1.0", + "url": "http://www.mozilla.org/MPL/MPL-1.0.html", + "osiApproved": true + }, + "MPL-1.1": { + "name": "Mozilla Public License 1.1", + "url": "http://www.mozilla.org/MPL/MPL-1.1.html", + "osiApproved": true + }, + "MPL-2.0": { + "name": "Mozilla Public License 2.0", + "url": "http://www.mozilla.org/MPL/2.0/", + "osiApproved": true + }, + "MPL-2.0-no-copyleft-exception": { + "name": "Mozilla Public License 2.0 (no copyleft exception)", + "url": "http://www.mozilla.org/MPL/2.0/", + "osiApproved": true + }, + "MS-PL": { + "name": "Microsoft Public License", + "url": "http://www.microsoft.com/opensource/licenses.mspx", + "osiApproved": true + }, + "MS-RL": { + "name": "Microsoft Reciprocal License", + "url": "http://www.microsoft.com/opensource/licenses.mspx", + "osiApproved": true + }, + "MTLL": { + "name": "Matrix Template Library License", + "url": "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License", + "osiApproved": false + }, + "MakeIndex": { + "name": "MakeIndex License", + "url": "https://fedoraproject.org/wiki/Licensing/MakeIndex", + "osiApproved": false + }, + "MirOS": { + "name": "The MirOS Licence", + "url": "https://opensource.org/licenses/MirOS", + "osiApproved": true + }, + "Motosoto": { + "name": "Motosoto License", + "url": "https://opensource.org/licenses/Motosoto", + "osiApproved": true + }, + "MulanPSL-1.0": { + "name": "Mulan Permissive Software License, Version 1", + "url": "https://license.coscl.org.cn/MulanPSL/", + "osiApproved": false + }, + "Multics": { + "name": "Multics License", + "url": "https://opensource.org/licenses/Multics", + "osiApproved": true + }, + "Mup": { + "name": "Mup License", + "url": "https://fedoraproject.org/wiki/Licensing/Mup", + "osiApproved": false + }, + "NASA-1.3": { + "name": "NASA Open Source Agreement 1.3", + "url": "http://ti.arc.nasa.gov/opensource/nosa/", + "osiApproved": true + }, + "NBPL-1.0": { + "name": "Net Boolean Public License v1", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=37b4b3f6cc4bf34e1d3dec61e69914b9819d8894", + "osiApproved": false + }, + "NCSA": { + "name": "University of Illinois/NCSA Open Source License", + "url": "http://otm.illinois.edu/uiuc_openSource", + "osiApproved": true + }, + "NGPL": { + "name": "Nethack General Public License", + "url": "https://opensource.org/licenses/NGPL", + "osiApproved": true + }, + "NLOD-1.0": { + "name": "Norwegian Licence for Open Government Data", + "url": "http://data.norge.no/nlod/en/1.0", + "osiApproved": false + }, + "NLPL": { + "name": "No Limit Public License", + "url": "https://fedoraproject.org/wiki/Licensing/NLPL", + "osiApproved": false + }, + "NOSL": { + "name": "Netizen Open Source License", + "url": "http://bits.netizen.com.au/licenses/NOSL/nosl.txt", + "osiApproved": false + }, + "NPL-1.0": { + "name": "Netscape Public License v1.0", + "url": "http://www.mozilla.org/MPL/NPL/1.0/", + "osiApproved": false + }, + "NPL-1.1": { + "name": "Netscape Public License v1.1", + "url": "http://www.mozilla.org/MPL/NPL/1.1/", + "osiApproved": false + }, + "NPOSL-3.0": { + "name": "Non-Profit Open Software License 3.0", + "url": "https://opensource.org/licenses/NOSL3.0", + "osiApproved": true + }, + "NRL": { + "name": "NRL License", + "url": "http://web.mit.edu/network/isakmp/nrllicense.html", + "osiApproved": false + }, + "NTP": { + "name": "NTP License", + "url": "https://opensource.org/licenses/NTP", + "osiApproved": true + }, + "NTP-0": { + "name": "NTP No Attribution", + "url": "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c", + "osiApproved": false + }, + "Naumen": { + "name": "Naumen Public License", + "url": "https://opensource.org/licenses/Naumen", + "osiApproved": true + }, + "Net-SNMP": { + "name": "Net-SNMP License", + "url": "http://net-snmp.sourceforge.net/about/license.html", + "osiApproved": false + }, + "NetCDF": { + "name": "NetCDF license", + "url": "http://www.unidata.ucar.edu/software/netcdf/copyright.html", + "osiApproved": false + }, + "Newsletr": { + "name": "Newsletr License", + "url": "https://fedoraproject.org/wiki/Licensing/Newsletr", + "osiApproved": false + }, + "Nokia": { + "name": "Nokia Open Source License", + "url": "https://opensource.org/licenses/nokia", + "osiApproved": true + }, + "Noweb": { + "name": "Noweb License", + "url": "https://fedoraproject.org/wiki/Licensing/Noweb", + "osiApproved": false + }, + "Nunit": { + "name": "Nunit License", + "url": "https://fedoraproject.org/wiki/Licensing/Nunit", + "osiApproved": false + }, + "OCCT-PL": { + "name": "Open CASCADE Technology Public License", + "url": "http://www.opencascade.com/content/occt-public-license", + "osiApproved": false + }, + "OCLC-2.0": { + "name": "OCLC Research Public License 2.0", + "url": "http://www.oclc.org/research/activities/software/license/v2final.htm", + "osiApproved": true + }, + "ODC-By-1.0": { + "name": "Open Data Commons Attribution License v1.0", + "url": "https://opendatacommons.org/licenses/by/1.0/", + "osiApproved": false + }, + "ODbL-1.0": { + "name": "ODC Open Database License v1.0", + "url": "http://www.opendatacommons.org/licenses/odbl/1.0/", + "osiApproved": false + }, + "OFL-1.0": { + "name": "SIL Open Font License 1.0", + "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web", + "osiApproved": false + }, + "OFL-1.0-RFN": { + "name": "SIL Open Font License 1.0 with Reserved Font Name", + "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web", + "osiApproved": false + }, + "OFL-1.0-no-RFN": { + "name": "SIL Open Font License 1.0 with no Reserved Font Name", + "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web", + "osiApproved": false + }, + "OFL-1.1": { + "name": "SIL Open Font License 1.1", + "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", + "osiApproved": true + }, + "OFL-1.1-RFN": { + "name": "SIL Open Font License 1.1 with Reserved Font Name", + "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", + "osiApproved": true + }, + "OFL-1.1-no-RFN": { + "name": "SIL Open Font License 1.1 with no Reserved Font Name", + "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", + "osiApproved": true + }, + "OGL-Canada-2.0": { + "name": "Open Government Licence - Canada", + "url": "https://open.canada.ca/en/open-government-licence-canada", + "osiApproved": false + }, + "OGL-UK-1.0": { + "name": "Open Government Licence v1.0", + "url": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/", + "osiApproved": false + }, + "OGL-UK-2.0": { + "name": "Open Government Licence v2.0", + "url": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/", + "osiApproved": false + }, + "OGL-UK-3.0": { + "name": "Open Government Licence v3.0", + "url": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/", + "osiApproved": false + }, + "OGTSL": { + "name": "Open Group Test Suite License", + "url": "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", + "osiApproved": true + }, + "OLDAP-1.1": { + "name": "Open LDAP Public License v1.1", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=806557a5ad59804ef3a44d5abfbe91d706b0791f", + "osiApproved": false + }, + "OLDAP-1.2": { + "name": "Open LDAP Public License v1.2", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=42b0383c50c299977b5893ee695cf4e486fb0dc7", + "osiApproved": false + }, + "OLDAP-1.3": { + "name": "Open LDAP Public License v1.3", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=e5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1", + "osiApproved": false + }, + "OLDAP-1.4": { + "name": "Open LDAP Public License v1.4", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=c9f95c2f3f2ffb5e0ae55fe7388af75547660941", + "osiApproved": false + }, + "OLDAP-2.0": { + "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cbf50f4e1185a21abd4c0a54d3f4341fe28f36ea", + "osiApproved": false + }, + "OLDAP-2.0.1": { + "name": "Open LDAP Public License v2.0.1", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b6d68acd14e51ca3aab4428bf26522aa74873f0e", + "osiApproved": false + }, + "OLDAP-2.1": { + "name": "Open LDAP Public License v2.1", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b0d176738e96a0d3b9f85cb51e140a86f21be715", + "osiApproved": false + }, + "OLDAP-2.2": { + "name": "Open LDAP Public License v2.2", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=470b0c18ec67621c85881b2733057fecf4a1acc3", + "osiApproved": false + }, + "OLDAP-2.2.1": { + "name": "Open LDAP Public License v2.2.1", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=4bc786f34b50aa301be6f5600f58a980070f481e", + "osiApproved": false + }, + "OLDAP-2.2.2": { + "name": "Open LDAP Public License 2.2.2", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=df2cc1e21eb7c160695f5b7cffd6296c151ba188", + "osiApproved": false + }, + "OLDAP-2.3": { + "name": "Open LDAP Public License v2.3", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=d32cf54a32d581ab475d23c810b0a7fbaf8d63c3", + "osiApproved": false + }, + "OLDAP-2.4": { + "name": "Open LDAP Public License v2.4", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cd1284c4a91a8a380d904eee68d1583f989ed386", + "osiApproved": false + }, + "OLDAP-2.5": { + "name": "Open LDAP Public License v2.5", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=6852b9d90022e8593c98205413380536b1b5a7cf", + "osiApproved": false + }, + "OLDAP-2.6": { + "name": "Open LDAP Public License v2.6", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=1cae062821881f41b73012ba816434897abf4205", + "osiApproved": false + }, + "OLDAP-2.7": { + "name": "Open LDAP Public License v2.7", + "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=47c2415c1df81556eeb39be6cad458ef87c534a2", + "osiApproved": false + }, + "OLDAP-2.8": { + "name": "Open LDAP Public License v2.8", + "url": "http://www.openldap.org/software/release/license.html", + "osiApproved": false + }, + "OML": { + "name": "Open Market License", + "url": "https://fedoraproject.org/wiki/Licensing/Open_Market_License", + "osiApproved": false + }, + "OPL-1.0": { + "name": "Open Public License v1.0", + "url": "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", + "osiApproved": false + }, + "OSET-PL-2.1": { + "name": "OSET Public License version 2.1", + "url": "http://www.osetfoundation.org/public-license", + "osiApproved": true + }, + "OSL-1.0": { + "name": "Open Software License 1.0", + "url": "https://opensource.org/licenses/OSL-1.0", + "osiApproved": true + }, + "OSL-1.1": { + "name": "Open Software License 1.1", + "url": "https://fedoraproject.org/wiki/Licensing/OSL1.1", + "osiApproved": false + }, + "OSL-2.0": { + "name": "Open Software License 2.0", + "url": "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html", + "osiApproved": true + }, + "OSL-2.1": { + "name": "Open Software License 2.1", + "url": "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", + "osiApproved": true + }, + "OSL-3.0": { + "name": "Open Software License 3.0", + "url": "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", + "osiApproved": true + }, + "OpenSSL": { + "name": "OpenSSL License", + "url": "http://www.openssl.org/source/license.html", + "osiApproved": false + }, + "PDDL-1.0": { + "name": "ODC Public Domain Dedication & License 1.0", + "url": "http://opendatacommons.org/licenses/pddl/1.0/", + "osiApproved": false + }, + "PHP-3.0": { + "name": "PHP License v3.0", + "url": "http://www.php.net/license/3_0.txt", + "osiApproved": true + }, + "PHP-3.01": { + "name": "PHP License v3.01", + "url": "http://www.php.net/license/3_01.txt", + "osiApproved": false + }, + "PSF-2.0": { + "name": "Python Software Foundation License 2.0", + "url": "https://opensource.org/licenses/Python-2.0", + "osiApproved": false + }, + "Parity-6.0.0": { + "name": "The Parity Public License 6.0.0", + "url": "https://paritylicense.com/versions/6.0.0.html", + "osiApproved": false + }, + "Plexus": { + "name": "Plexus Classworlds License", + "url": "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License", + "osiApproved": false + }, + "PostgreSQL": { + "name": "PostgreSQL License", + "url": "http://www.postgresql.org/about/licence", + "osiApproved": true + }, + "Python-2.0": { + "name": "Python License 2.0", + "url": "https://opensource.org/licenses/Python-2.0", + "osiApproved": true + }, + "QPL-1.0": { + "name": "Q Public License 1.0", + "url": "http://doc.qt.nokia.com/3.3/license.html", + "osiApproved": true + }, + "Qhull": { + "name": "Qhull License", + "url": "https://fedoraproject.org/wiki/Licensing/Qhull", + "osiApproved": false + }, + "RHeCos-1.1": { + "name": "Red Hat eCos Public License v1.1", + "url": "http://ecos.sourceware.org/old-license.html", + "osiApproved": false + }, + "RPL-1.1": { + "name": "Reciprocal Public License 1.1", + "url": "https://opensource.org/licenses/RPL-1.1", + "osiApproved": true + }, + "RPL-1.5": { + "name": "Reciprocal Public License 1.5", + "url": "https://opensource.org/licenses/RPL-1.5", + "osiApproved": true + }, + "RPSL-1.0": { + "name": "RealNetworks Public Source License v1.0", + "url": "https://helixcommunity.org/content/rpsl", + "osiApproved": true + }, + "RSA-MD": { + "name": "RSA Message-Digest License ", + "url": "http://www.faqs.org/rfcs/rfc1321.html", + "osiApproved": false + }, + "RSCPL": { + "name": "Ricoh Source Code Public License", + "url": "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", + "osiApproved": true + }, + "Rdisc": { + "name": "Rdisc License", + "url": "https://fedoraproject.org/wiki/Licensing/Rdisc_License", + "osiApproved": false + }, + "Ruby": { + "name": "Ruby License", + "url": "http://www.ruby-lang.org/en/LICENSE.txt", + "osiApproved": false + }, + "SAX-PD": { + "name": "Sax Public Domain Notice", + "url": "http://www.saxproject.org/copying.html", + "osiApproved": false + }, + "SCEA": { + "name": "SCEA Shared Source License", + "url": "http://research.scea.com/scea_shared_source_license.html", + "osiApproved": false + }, + "SGI-B-1.0": { + "name": "SGI Free Software License B v1.0", + "url": "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html", + "osiApproved": false + }, + "SGI-B-1.1": { + "name": "SGI Free Software License B v1.1", + "url": "http://oss.sgi.com/projects/FreeB/", + "osiApproved": false + }, + "SGI-B-2.0": { + "name": "SGI Free Software License B v2.0", + "url": "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf", + "osiApproved": false + }, + "SHL-0.5": { + "name": "Solderpad Hardware License v0.5", + "url": "https://solderpad.org/licenses/SHL-0.5/", + "osiApproved": false + }, + "SHL-0.51": { + "name": "Solderpad Hardware License, Version 0.51", + "url": "https://solderpad.org/licenses/SHL-0.51/", + "osiApproved": false + }, + "SISSL": { + "name": "Sun Industry Standards Source License v1.1", + "url": "http://www.openoffice.org/licenses/sissl_license.html", + "osiApproved": true + }, + "SISSL-1.2": { + "name": "Sun Industry Standards Source License v1.2", + "url": "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html", + "osiApproved": false + }, + "SMLNJ": { + "name": "Standard ML of New Jersey License", + "url": "https://www.smlnj.org/license.html", + "osiApproved": false + }, + "SMPPL": { + "name": "Secure Messaging Protocol Public License", + "url": "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt", + "osiApproved": false + }, + "SNIA": { + "name": "SNIA Public License 1.1", + "url": "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License", + "osiApproved": false + }, + "SPL-1.0": { + "name": "Sun Public License v1.0", + "url": "https://opensource.org/licenses/SPL-1.0", + "osiApproved": true + }, + "SSH-OpenSSH": { + "name": "SSH OpenSSH license", + "url": "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10", + "osiApproved": false + }, + "SSH-short": { + "name": "SSH short notice", + "url": "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", + "osiApproved": false + }, + "SSPL-1.0": { + "name": "Server Side Public License, v 1", + "url": "https://www.mongodb.com/licensing/server-side-public-license", + "osiApproved": false + }, + "SWL": { + "name": "Scheme Widget Library (SWL) Software License Agreement", + "url": "https://fedoraproject.org/wiki/Licensing/SWL", + "osiApproved": false + }, + "Saxpath": { + "name": "Saxpath License", + "url": "https://fedoraproject.org/wiki/Licensing/Saxpath_License", + "osiApproved": false + }, + "Sendmail": { + "name": "Sendmail License", + "url": "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", + "osiApproved": false + }, + "Sendmail-8.23": { + "name": "Sendmail License 8.23", + "url": "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", + "osiApproved": false + }, + "SimPL-2.0": { + "name": "Simple Public License 2.0", + "url": "https://opensource.org/licenses/SimPL-2.0", + "osiApproved": true + }, + "Sleepycat": { + "name": "Sleepycat License", + "url": "https://opensource.org/licenses/Sleepycat", + "osiApproved": true + }, + "Spencer-86": { + "name": "Spencer License 86", + "url": "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", + "osiApproved": false + }, + "Spencer-94": { + "name": "Spencer License 94", + "url": "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", + "osiApproved": false + }, + "Spencer-99": { + "name": "Spencer License 99", + "url": "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c", + "osiApproved": false + }, + "StandardML-NJ": { + "name": "Standard ML of New Jersey License", + "url": "http://www.smlnj.org//license.html", + "osiApproved": false + }, + "SugarCRM-1.1.3": { + "name": "SugarCRM Public License v1.1.3", + "url": "http://www.sugarcrm.com/crm/SPL", + "osiApproved": false + }, + "TAPR-OHL-1.0": { + "name": "TAPR Open Hardware License v1.0", + "url": "https://www.tapr.org/OHL", + "osiApproved": false + }, + "TCL": { + "name": "TCL/TK License", + "url": "http://www.tcl.tk/software/tcltk/license.html", + "osiApproved": false + }, + "TCP-wrappers": { + "name": "TCP Wrappers License", + "url": "http://rc.quest.com/topics/openssh/license.php#tcpwrappers", + "osiApproved": false + }, + "TMate": { + "name": "TMate Open Source License", + "url": "http://svnkit.com/license.html", + "osiApproved": false + }, + "TORQUE-1.1": { + "name": "TORQUE v2.5+ Software License v1.1", + "url": "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1", + "osiApproved": false + }, + "TOSL": { + "name": "Trusster Open Source License", + "url": "https://fedoraproject.org/wiki/Licensing/TOSL", + "osiApproved": false + }, + "TU-Berlin-1.0": { + "name": "Technische Universitaet Berlin License 1.0", + "url": "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT", + "osiApproved": false + }, + "TU-Berlin-2.0": { + "name": "Technische Universitaet Berlin License 2.0", + "url": "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt", + "osiApproved": false + }, + "UCL-1.0": { + "name": "Upstream Compatibility License v1.0", + "url": "https://opensource.org/licenses/UCL-1.0", + "osiApproved": true + }, + "UPL-1.0": { + "name": "Universal Permissive License v1.0", + "url": "https://opensource.org/licenses/UPL", + "osiApproved": true + }, + "Unicode-DFS-2015": { + "name": "Unicode License Agreement - Data Files and Software (2015)", + "url": "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html", + "osiApproved": false + }, + "Unicode-DFS-2016": { + "name": "Unicode License Agreement - Data Files and Software (2016)", + "url": "http://www.unicode.org/copyright.html", + "osiApproved": false + }, + "Unicode-TOU": { + "name": "Unicode Terms of Use", + "url": "http://www.unicode.org/copyright.html", + "osiApproved": false + }, + "Unlicense": { + "name": "The Unlicense", + "url": "https://unlicense.org/", + "osiApproved": false + }, + "VOSTROM": { + "name": "VOSTROM Public License for Open Source", + "url": "https://fedoraproject.org/wiki/Licensing/VOSTROM", + "osiApproved": false + }, + "VSL-1.0": { + "name": "Vovida Software License v1.0", + "url": "https://opensource.org/licenses/VSL-1.0", + "osiApproved": true + }, + "Vim": { + "name": "Vim License", + "url": "http://vimdoc.sourceforge.net/htmldoc/uganda.html", + "osiApproved": false + }, + "W3C": { + "name": "W3C Software Notice and License (2002-12-31)", + "url": "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", + "osiApproved": true + }, + "W3C-19980720": { + "name": "W3C Software Notice and License (1998-07-20)", + "url": "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html", + "osiApproved": false + }, + "W3C-20150513": { + "name": "W3C Software Notice and Document License (2015-05-13)", + "url": "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document", + "osiApproved": false + }, + "WTFPL": { + "name": "Do What The F*ck You Want To Public License", + "url": "http://sam.zoy.org/wtfpl/COPYING", + "osiApproved": false + }, + "Watcom-1.0": { + "name": "Sybase Open Watcom Public License 1.0", + "url": "https://opensource.org/licenses/Watcom-1.0", + "osiApproved": true + }, + "Wsuipa": { + "name": "Wsuipa License", + "url": "https://fedoraproject.org/wiki/Licensing/Wsuipa", + "osiApproved": false + }, + "X11": { + "name": "X11 License", + "url": "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3", + "osiApproved": false + }, + "XFree86-1.1": { + "name": "XFree86 License 1.1", + "url": "http://www.xfree86.org/current/LICENSE4.html", + "osiApproved": false + }, + "XSkat": { + "name": "XSkat License", + "url": "https://fedoraproject.org/wiki/Licensing/XSkat_License", + "osiApproved": false + }, + "Xerox": { + "name": "Xerox License", + "url": "https://fedoraproject.org/wiki/Licensing/Xerox", + "osiApproved": false + }, + "Xnet": { + "name": "X.Net License", + "url": "https://opensource.org/licenses/Xnet", + "osiApproved": true + }, + "YPL-1.0": { + "name": "Yahoo! Public License v1.0", + "url": "http://www.zimbra.com/license/yahoo_public_license_1.0.html", + "osiApproved": false + }, + "YPL-1.1": { + "name": "Yahoo! Public License v1.1", + "url": "http://www.zimbra.com/license/yahoo_public_license_1.1.html", + "osiApproved": false + }, + "ZPL-1.1": { + "name": "Zope Public License 1.1", + "url": "http://old.zope.org/Resources/License/ZPL-1.1", + "osiApproved": false + }, + "ZPL-2.0": { + "name": "Zope Public License 2.0", + "url": "http://old.zope.org/Resources/License/ZPL-2.0", + "osiApproved": true + }, + "ZPL-2.1": { + "name": "Zope Public License 2.1", + "url": "http://old.zope.org/Resources/ZPL/", + "osiApproved": false + }, + "Zed": { + "name": "Zed License", + "url": "https://fedoraproject.org/wiki/Licensing/Zed", + "osiApproved": false + }, + "Zend-2.0": { + "name": "Zend License v2.0", + "url": "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt", + "osiApproved": false + }, + "Zimbra-1.3": { + "name": "Zimbra Public License v1.3", + "url": "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html", + "osiApproved": false + }, + "Zimbra-1.4": { + "name": "Zimbra Public License v1.4", + "url": "http://www.zimbra.com/legal/zimbra-public-license-1-4", + "osiApproved": false + }, + "Zlib": { + "name": "zlib License", + "url": "http://www.zlib.net/zlib_license.html", + "osiApproved": true + }, + "blessing": { + "name": "SQLite Blessing", + "url": "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln=4-9", + "osiApproved": false + }, + "bzip2-1.0.5": { + "name": "bzip2 and libbzip2 License v1.0.5", + "url": "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html", + "osiApproved": false + }, + "bzip2-1.0.6": { + "name": "bzip2 and libbzip2 License v1.0.6", + "url": "https://github.com/asimonov-im/bzip2/blob/master/LICENSE", + "osiApproved": false + }, + "copyleft-next-0.3.0": { + "name": "copyleft-next 0.3.0", + "url": "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0", + "osiApproved": false + }, + "copyleft-next-0.3.1": { + "name": "copyleft-next 0.3.1", + "url": "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1", + "osiApproved": false + }, + "curl": { + "name": "curl License", + "url": "https://github.com/bagder/curl/blob/master/COPYING", + "osiApproved": false + }, + "diffmark": { + "name": "diffmark license", + "url": "https://fedoraproject.org/wiki/Licensing/diffmark", + "osiApproved": false + }, + "dvipdfm": { + "name": "dvipdfm License", + "url": "https://fedoraproject.org/wiki/Licensing/dvipdfm", + "osiApproved": false + }, + "eCos-2.0": { + "name": "eCos license version 2.0", + "url": "https://www.gnu.org/licenses/ecos-license.html", + "osiApproved": false + }, + "eGenix": { + "name": "eGenix.com Public License 1.1.0", + "url": "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", + "osiApproved": false + }, + "etalab-2.0": { + "name": "Etalab Open License 2.0", + "url": "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", + "osiApproved": false + }, + "gSOAP-1.3b": { + "name": "gSOAP Public License v1.3b", + "url": "http://www.cs.fsu.edu/~engelen/license.html", + "osiApproved": false + }, + "gnuplot": { + "name": "gnuplot License", + "url": "https://fedoraproject.org/wiki/Licensing/Gnuplot", + "osiApproved": false + }, + "iMatix": { + "name": "iMatix Standard Function Library Agreement", + "url": "http://legacy.imatix.com/html/sfl/sfl4.htm#license", + "osiApproved": false + }, + "libpng-2.0": { + "name": "PNG Reference Library version 2", + "url": "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt", + "osiApproved": false + }, + "libselinux-1.0": { + "name": "libselinux public domain notice", + "url": "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE", + "osiApproved": false + }, + "libtiff": { + "name": "libtiff License", + "url": "https://fedoraproject.org/wiki/Licensing/libtiff", + "osiApproved": false + }, + "mpich2": { + "name": "mpich2 License", + "url": "https://fedoraproject.org/wiki/Licensing/MIT", + "osiApproved": false + }, + "psfrag": { + "name": "psfrag License", + "url": "https://fedoraproject.org/wiki/Licensing/psfrag", + "osiApproved": false + }, + "psutils": { + "name": "psutils License", + "url": "https://fedoraproject.org/wiki/Licensing/psutils", + "osiApproved": false + }, + "wxWindows": { + "name": "wxWindows Library License", + "url": "https://opensource.org/licenses/WXwindows", + "osiApproved": false + }, + "xinetd": { + "name": "xinetd License", + "url": "https://fedoraproject.org/wiki/Licensing/Xinetd_License", + "osiApproved": false + }, + "xpp": { + "name": "XPP License", + "url": "https://fedoraproject.org/wiki/Licensing/xpp", + "osiApproved": false + }, + "zlib-acknowledgement": { + "name": "zlib/libpng License with Acknowledgement", + "url": "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement", + "osiApproved": false + } +} \ No newline at end of file From 998ab162d4a0f2ef91299141d6db684aaad4f9eb Mon Sep 17 00:00:00 2001 From: lionellloh Date: Sat, 13 Jun 2020 03:43:02 +0800 Subject: [PATCH 005/149] brew audit: Included json gem, does conditional check on github --- Library/Homebrew/Gemfile | 2 ++ Library/Homebrew/Gemfile.lock | 1 + Library/Homebrew/dev-cmd/audit.rb | 33 ++++++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile index 7335e0ffc4..e879491837 100644 --- a/Library/Homebrew/Gemfile +++ b/Library/Homebrew/Gemfile @@ -13,6 +13,8 @@ gem "rspec-retry", require: false gem "rspec-wait", require: false gem "rubocop" gem "simplecov", require: false +gem "json", require: false + if ENV["HOMEBREW_SORBET"] gem "sorbet" gem "sorbet-runtime" diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock index ab77ab5f47..970e3340a2 100644 --- a/Library/Homebrew/Gemfile.lock +++ b/Library/Homebrew/Gemfile.lock @@ -128,6 +128,7 @@ DEPENDENCIES byebug concurrent-ruby coveralls (~> 0.8) + json mechanize parallel_tests plist diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index f890cc9772..bfd570a4e2 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -347,13 +347,37 @@ module Homebrew file = File.open(File.expand_path(path)) valid_licenses = JSON.load(file) unless formula.license.nil? - return if valid_licenses.key?(formula.license) - problem "#{formula.license} is not an SPDX license." + if valid_licenses.key?(formula.license) + return unless @online + user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}, false) + return if user.nil? + github_license = get_repo_license_data(user, repo) + if github_license && (github_license == formula.license) + return + else + problem "License mismatch - Github license is: #{github_license}, but Formulae license states: #{formula.license}" + end + else + problem "#{formula.license} is not an SPDX license." + end else problem "No license specified for package." end end + + + def get_repo_license_data(user, repo) + return unless @online + begin + res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") + return nil unless res.key?("license") + return res["license"]["spdx_id"] || nil + rescue GitHub::HTTPNotFoundError + nil + end + end + def audit_deps @specs.each do |spec| # Check for things we don't like to depend on. @@ -558,11 +582,10 @@ module Homebrew new_formula_problem warning end - def get_repo_data(regex) + def get_repo_data(regex, new_formula_only=true) return unless @core_tap return unless @online - return unless @new_formula - + return unless @new_formula if new_formula_only _, user, repo = *regex.match(formula.stable.url) if formula.stable _, user, repo = *regex.match(formula.homepage) unless user return if !user || !repo From ff1016b72997c3f6f33d39d48b335c08c734df24 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 16 Jun 2020 00:19:32 +0800 Subject: [PATCH 006/149] Modify code to load spdx data once --- Library/Homebrew/dev-cmd/audit.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index bfd570a4e2..c6120e8838 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -110,7 +110,9 @@ module Homebrew # Check style in a single batch run up front for performance style_results = Style.check_style_json(style_files, options) if style_files - + # load licenses + path = File.join(File.dirname(__FILE__),"spdx.json") + spdx_ids = JSON.load( File.open(File.expand_path(path))) new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only @@ -121,6 +123,7 @@ module Homebrew git: git, only: only, except: args.except, + spdx_ids: spdx_ids } options[:style_offenses] = style_results.file_offenses(f.path) if style_results options[:display_cop_names] = args.display_cop_names? @@ -224,6 +227,7 @@ module Homebrew @new_formula_problems = [] @text = FormulaText.new(formula.path) @specs = %w[stable devel head].map { |s| formula.send(s) }.compact + @spdx_ids = options[:spdx_ids] end def audit_style @@ -343,11 +347,8 @@ module Homebrew ].freeze def audit_licenses - path = File.join(File.dirname(__FILE__),"spdx.json") - file = File.open(File.expand_path(path)) - valid_licenses = JSON.load(file) unless formula.license.nil? - if valid_licenses.key?(formula.license) + if @spdx_ids.key?(formula.license) return unless @online user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}, false) return if user.nil? From 52c6e5de76322452f634cbcea7a7408370f5becf Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 16 Jun 2020 01:00:36 +0800 Subject: [PATCH 007/149] Fixed brew style offences --- Library/Homebrew/Gemfile | 2 +- Library/Homebrew/dev-cmd/audit.rb | 43 +++++++++++++++++-------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile index e879491837..61b165c14f 100644 --- a/Library/Homebrew/Gemfile +++ b/Library/Homebrew/Gemfile @@ -5,6 +5,7 @@ source "https://rubygems.org" # installed gems gem "byebug" gem "coveralls", "~> 0.8", require: false +gem "json", require: false gem "parallel_tests" gem "ronn", require: false gem "rspec" @@ -13,7 +14,6 @@ gem "rspec-retry", require: false gem "rspec-wait", require: false gem "rubocop" gem "simplecov", require: false -gem "json", require: false if ENV["HOMEBREW_SORBET"] gem "sorbet" diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index c6120e8838..e15404b7db 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -12,7 +12,7 @@ require "date" require "missing_formula" require "digest" require "cli/parser" -require 'json' +require "json" module Homebrew module_function @@ -111,8 +111,8 @@ module Homebrew # Check style in a single batch run up front for performance style_results = Style.check_style_json(style_files, options) if style_files # load licenses - path = File.join(File.dirname(__FILE__),"spdx.json") - spdx_ids = JSON.load( File.open(File.expand_path(path))) + path = File.join(File.dirname(__FILE__), "spdx.json") + spdx_ids = JSON.parse(File.open(File.expand_path(path)).read) new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only @@ -123,7 +123,7 @@ module Homebrew git: git, only: only, except: args.except, - spdx_ids: spdx_ids + spdx_ids: spdx_ids, } options[:style_offenses] = style_results.file_offenses(f.path) if style_results options[:display_cop_names] = args.display_cop_names? @@ -347,33 +347,34 @@ module Homebrew ].freeze def audit_licenses - unless formula.license.nil? + if formula.license if @spdx_ids.key?(formula.license) return unless @online - user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}, false) - return if user.nil? - github_license = get_repo_license_data(user, repo) - if github_license && (github_license == formula.license) - return - else - problem "License mismatch - Github license is: #{github_license}, but Formulae license states: #{formula.license}" - end + + user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}, false) + return if user.nil? + + github_license = get_repo_license_data(user, repo) + return if github_license && (github_license == formula.license) + + problem "License mismatch - Github license is: #{github_license}, \ +but Formulae license states: #{formula.license}" else problem "#{formula.license} is not an SPDX license." end else problem "No license specified for package." end - end - - + end def get_repo_license_data(user, repo) return unless @online + begin res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") - return nil unless res.key?("license") - return res["license"]["spdx_id"] || nil + return unless res.key?("license") + + res["license"]["spdx_id"] || nil rescue GitHub::HTTPNotFoundError nil end @@ -583,10 +584,12 @@ module Homebrew new_formula_problem warning end - def get_repo_data(regex, new_formula_only=true) + def get_repo_data(regex, new_formula_only = true) return unless @core_tap return unless @online - return unless @new_formula if new_formula_only + + return unless @new_formula || !new_formula_only + _, user, repo = *regex.match(formula.stable.url) if formula.stable _, user, repo = *regex.match(formula.homepage) unless user return if !user || !repo From 51fb414517234ff0000663663a23561da28602c1 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 16 Jun 2020 01:18:40 +0800 Subject: [PATCH 008/149] create: include license field automatically --- Library/Homebrew/formula_creator.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb index caa1d81891..65ff9bc1a8 100644 --- a/Library/Homebrew/formula_creator.rb +++ b/Library/Homebrew/formula_creator.rb @@ -5,7 +5,7 @@ require "erb" module Homebrew class FormulaCreator - attr_reader :url, :sha256, :desc, :homepage + attr_reader :url, :sha256, :desc, :homepage, :license attr_accessor :name, :version, :tap, :path, :mode def url=(url) @@ -100,6 +100,7 @@ module Homebrew <% end %> sha256 "#{sha256}" <% end %> + license "#{license}" <% if mode == :cmake %> depends_on "cmake" => :build From ac6ea4de4625c7bd0c750ffb16f550edc97f6900 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 17 Jun 2020 03:38:06 +0800 Subject: [PATCH 009/149] audit: check if a license field is empty --- Library/Homebrew/dev-cmd/audit.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index e15404b7db..023974d635 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -206,7 +206,7 @@ module Homebrew class FormulaAuditor include FormulaCellarChecks - attr_reader :formula, :text, :problems, :new_formula_problems + attr_reader :formula, :text, :problems, :new_formula_problems, :spdx_ids def initialize(formula, options = {}) @formula = formula @@ -346,8 +346,8 @@ module Homebrew openssl@1.1 ].freeze - def audit_licenses - if formula.license + def audit_license + if ! formula.license.blank? if @spdx_ids.key?(formula.license) return unless @online @@ -360,7 +360,7 @@ module Homebrew problem "License mismatch - Github license is: #{github_license}, \ but Formulae license states: #{formula.license}" else - problem "#{formula.license} is not an SPDX license." + problem "#{formula.license} is not a standard SPDX license id." end else problem "No license specified for package." From 44aac2474e0e8b5deb2a31e06a97a75ef1db7591 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 17 Jun 2020 03:39:00 +0800 Subject: [PATCH 010/149] dev-cmd/audit_spec: check if license info exists and if it is a standard spdx-id --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 0a437b20d6..9137359c4f 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -95,6 +95,52 @@ module Homebrew end end + describe "#audit_license" do + let(:spdx_ids) { + full_path = File.join(File.expand_path(File.dirname(__FILE__) + "../../../dev-cmd/"), "spdx.json") + JSON.parse(File.open(full_path).read) + } + + let(:custom_spdx_id) { "zzz" } + + it "detects no license info" do + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + license "" + end + RUBY + + fa.audit_license + p fa.problems + expect(fa.problems.first).to match ("No license specified for package.") + end + + it "detects if license is not a standard spdx-id" do + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + license "#{custom_spdx_id}" + end + RUBY + + fa.audit_license + expect(fa.problems.first).to match ("#{custom_spdx_id} is not a standard SPDX license id.") + end + + it "verifies that a license info is a standard spdx id" do + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + license "0BSD" + end + RUBY + + fa.audit_license + expect(fa.problems).to be_empty + end + end + describe "#audit_file" do specify "DATA but no __END__" do fa = formula_auditor "foo", <<~RUBY From ba824d9488de3ad4e8efd58478f3ba3d9aaf1684 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 17 Jun 2020 04:14:57 +0800 Subject: [PATCH 011/149] audit: remove spdx-id as a attr_reader attribute --- Library/Homebrew/dev-cmd/audit.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 023974d635..94be995ff2 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -206,7 +206,7 @@ module Homebrew class FormulaAuditor include FormulaCellarChecks - attr_reader :formula, :text, :problems, :new_formula_problems, :spdx_ids + attr_reader :formula, :text, :problems, :new_formula_problems def initialize(formula, options = {}) @formula = formula @@ -358,7 +358,7 @@ module Homebrew return if github_license && (github_license == formula.license) problem "License mismatch - Github license is: #{github_license}, \ -but Formulae license states: #{formula.license}" +but Formulae license states: #{formula.license}." else problem "#{formula.license} is not a standard SPDX license id." end From e8f6e651d1354aeeeab5214b7d533db1e4cc6c24 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 17 Jun 2020 04:16:01 +0800 Subject: [PATCH 012/149] dev-cmd/audit_spec: WIP: online mismatch does not return any problems in test environment --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 50 +++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 9137359c4f..f9692a7b1b 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -102,6 +102,7 @@ module Homebrew } let(:custom_spdx_id) { "zzz" } + let(:standard_mismatch_spdx_id) { "0BSD" } it "detects no license info" do fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids @@ -113,7 +114,7 @@ module Homebrew fa.audit_license p fa.problems - expect(fa.problems.first).to match ("No license specified for package.") + expect(fa.problems.first).to match "No license specified for package." end it "detects if license is not a standard spdx-id" do @@ -125,21 +126,54 @@ module Homebrew RUBY fa.audit_license - expect(fa.problems.first).to match ("#{custom_spdx_id} is not a standard SPDX license id.") + expect(fa.problems.first).to match "#{custom_spdx_id} is not a standard SPDX license id." end - it "verifies that a license info is a standard spdx id" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + it "verifies that a license info is a standard spdx id" do + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "0BSD" end - RUBY + RUBY - fa.audit_license - expect(fa.problems).to be_empty + fa.audit_license + expect(fa.problems).to be_empty + end + + it "checks online and verifies that a standard license id is the same as what is indicated on its Github repo" do + fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true + class Cask < Formula + url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" + sha256 "02f8bb20b33b23fb11e7d2a1d282519dfdb8b3090b9672448b8c2c2cacd3e478" + head "https://github.com/cask/cask.git" + license "GPL-3.0" + end + RUBY + + fa.audit_license + expect(fa.problems).to be_empty + end + + # TODO: fix this test + it "checks online and detects that a formula-specified license is not the same as what is indicated on its Github repository" do + fa = formula_auditor "cask", <<~RUBY, strict: true, online: true, spdx_ids: spdx_ids + class Cask < Formula + desc "Emacs dependency management" + homepage "https://cask.readthedocs.org/" + url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" + sha256 "02f8bb20b33b23fb11e7d2a1d282519dfdb8b3090b9672448b8c2c2cacd3e478" + head "https://github.com/cask/cask.git" + license "0BSD" + end + RUBY + + fa.audit_license + expect(fa.problems).to be_empty + # match "License mismatch - Github license is: GPL-3.0, \ + # but Formulae license states: #{standard_mismatch_spdx_id}." + end end - end describe "#audit_file" do specify "DATA but no __END__" do From 03fc6b2c157a20389a0be829562f8a44aeb2a393 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Wed, 17 Jun 2020 05:19:38 +0800 Subject: [PATCH 013/149] audit_spec: override core-tap attribute in online test --- Library/Homebrew/dev-cmd/audit.rb | 4 +-- Library/Homebrew/test/dev-cmd/audit_spec.rb | 27 +++++++++------------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 94be995ff2..cebaa0766d 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -357,8 +357,8 @@ module Homebrew github_license = get_repo_license_data(user, repo) return if github_license && (github_license == formula.license) - problem "License mismatch - Github license is: #{github_license}, \ -but Formulae license states: #{formula.license}." + problem "License mismatch - Github license is: #{github_license}, "\ + "but Formulae license states: #{formula.license}." else problem "#{formula.license} is not a standard SPDX license id." end diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index f9692a7b1b..09ca81f4f1 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -141,11 +141,11 @@ module Homebrew expect(fa.problems).to be_empty end - it "checks online and verifies that a standard license id is the same as what is indicated on its Github repo" do - fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true + it "checks online and verifies that a standard license id is the same "\ + "as what is indicated on its Github repo" do + fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true, core_tap: true class Cask < Formula url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" - sha256 "02f8bb20b33b23fb11e7d2a1d282519dfdb8b3090b9672448b8c2c2cacd3e478" head "https://github.com/cask/cask.git" license "GPL-3.0" end @@ -155,23 +155,20 @@ module Homebrew expect(fa.problems).to be_empty end - # TODO: fix this test - it "checks online and detects that a formula-specified license is not the same as what is indicated on its Github repository" do - fa = formula_auditor "cask", <<~RUBY, strict: true, online: true, spdx_ids: spdx_ids + it "checks online and detects that a formula-specified license is not "\ + "the same as what is indicated on its Github repository" do + # odie "lol" + fa = formula_auditor "cask", <<~RUBY, online: true, spdx_ids: spdx_ids, core_tap: true class Cask < Formula - desc "Emacs dependency management" - homepage "https://cask.readthedocs.org/" - url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" - sha256 "02f8bb20b33b23fb11e7d2a1d282519dfdb8b3090b9672448b8c2c2cacd3e478" - head "https://github.com/cask/cask.git" - license "0BSD" + url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" + head "https://github.com/cask/cask.git" + license "#{standard_mismatch_spdx_id}" end RUBY fa.audit_license - expect(fa.problems).to be_empty - # match "License mismatch - Github license is: GPL-3.0, \ - # but Formulae license states: #{standard_mismatch_spdx_id}." + expect(fa.problems.first).to match "License mismatch - Github license is: GPL-3.0, "\ + "but Formulae license states: #{standard_mismatch_spdx_id}." end end From 3bfca5bcee54846e4e378e53b5783f50edb1ff1a Mon Sep 17 00:00:00 2001 From: lionellloh Date: Wed, 17 Jun 2020 21:45:51 +0800 Subject: [PATCH 014/149] audit: change location of spdx.json file --- Library/Homebrew/{dev-cmd => data}/spdx.json | 0 Library/Homebrew/dev-cmd/audit.rb | 4 ++-- Library/Homebrew/test/dev-cmd/audit_spec.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename Library/Homebrew/{dev-cmd => data}/spdx.json (100%) diff --git a/Library/Homebrew/dev-cmd/spdx.json b/Library/Homebrew/data/spdx.json similarity index 100% rename from Library/Homebrew/dev-cmd/spdx.json rename to Library/Homebrew/data/spdx.json diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index cebaa0766d..f2482be03a 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -111,8 +111,8 @@ module Homebrew # Check style in a single batch run up front for performance style_results = Style.check_style_json(style_files, options) if style_files # load licenses - path = File.join(File.dirname(__FILE__), "spdx.json") - spdx_ids = JSON.parse(File.open(File.expand_path(path)).read) + full_path = File.join(File.dirname(__FILE__), "../data/spdx.json") + spdx_ids = JSON.parse(File.open(full_path).read) new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 09ca81f4f1..91b1cc77ff 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -97,7 +97,7 @@ module Homebrew describe "#audit_license" do let(:spdx_ids) { - full_path = File.join(File.expand_path(File.dirname(__FILE__) + "../../../dev-cmd/"), "spdx.json") + full_path = File.join(File.expand_path(File.dirname(__FILE__) + "../../../data/"), "spdx.json") JSON.parse(File.open(full_path).read) } From 0b95f030fd7984ed4b073ed6fb9c8c2b092b7327 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Wed, 17 Jun 2020 22:13:04 +0800 Subject: [PATCH 015/149] audit: fix code review changes --- Library/Homebrew/dev-cmd/audit.rb | 6 ++++-- Library/Homebrew/test/dev-cmd/audit_spec.rb | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index f2482be03a..002c9d637d 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -112,7 +112,9 @@ module Homebrew style_results = Style.check_style_json(style_files, options) if style_files # load licenses full_path = File.join(File.dirname(__FILE__), "../data/spdx.json") - spdx_ids = JSON.parse(File.open(full_path).read) + spdx_ids = File.open(full_path, "r") do |f| + JSON.parse(f.read) + end new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only @@ -347,7 +349,7 @@ module Homebrew ].freeze def audit_license - if ! formula.license.blank? + if !formula.license.blank? if @spdx_ids.key?(formula.license) return unless @online diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 91b1cc77ff..215d711845 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -97,8 +97,12 @@ module Homebrew describe "#audit_license" do let(:spdx_ids) { - full_path = File.join(File.expand_path(File.dirname(__FILE__) + "../../../data/"), "spdx.json") - JSON.parse(File.open(full_path).read) + # full_path = File.join(File.expand_path(File.dirname(__FILE__) + "../../../data/"), "spdx.json") + full_path = File.join(File.dirname(__FILE__), "../../data/spdx.json") + p full_path + File.open(full_path, "r") do |f| + JSON.parse(f.read) + end } let(:custom_spdx_id) { "zzz" } @@ -145,9 +149,9 @@ module Homebrew "as what is indicated on its Github repo" do fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true, core_tap: true class Cask < Formula - url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" - head "https://github.com/cask/cask.git" - license "GPL-3.0" + url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" + head "https://github.com/cask/cask.git" + license "GPL-3.0" end RUBY @@ -157,12 +161,11 @@ module Homebrew it "checks online and detects that a formula-specified license is not "\ "the same as what is indicated on its Github repository" do - # odie "lol" fa = formula_auditor "cask", <<~RUBY, online: true, spdx_ids: spdx_ids, core_tap: true class Cask < Formula - url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" - head "https://github.com/cask/cask.git" - license "#{standard_mismatch_spdx_id}" + url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" + head "https://github.com/cask/cask.git" + license "#{standard_mismatch_spdx_id}" end RUBY From d92f747b1e1ac9e4fdc4f839174cf36d89aab879 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 17 Jun 2020 22:52:25 +0800 Subject: [PATCH 016/149] create: add license field as parsable arg --- Library/Homebrew/dev-cmd/create.rb | 5 +++++ Library/Homebrew/formula_creator.rb | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb index 3fe90865c6..fd519ba0d3 100644 --- a/Library/Homebrew/dev-cmd/create.rb +++ b/Library/Homebrew/dev-cmd/create.rb @@ -45,8 +45,11 @@ module Homebrew description: "Explicitly set the of the new formula." flag "--set-version=", description: "Explicitly set the of the new formula." + flag "--set-license=", + description: "Explicitly set the of the new formula." flag "--tap=", description: "Generate the new formula within the given tap, specified as `/`." + switch :force switch :verbose switch :debug @@ -66,11 +69,13 @@ module Homebrew version = args.set_version name = args.set_name + license = args.set_license tap = args.tap fc = FormulaCreator.new fc.name = name fc.version = version + fc.license = license fc.tap = Tap.fetch(tap || "homebrew/core") raise TapUnavailableError, tap unless fc.tap.installed? diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb index 65ff9bc1a8..251eddf113 100644 --- a/Library/Homebrew/formula_creator.rb +++ b/Library/Homebrew/formula_creator.rb @@ -5,8 +5,8 @@ require "erb" module Homebrew class FormulaCreator - attr_reader :url, :sha256, :desc, :homepage, :license - attr_accessor :name, :version, :tap, :path, :mode + attr_reader :url, :sha256, :desc, :homepage + attr_accessor :name, :version, :tap, :path, :mode, :license def url=(url) @url = url @@ -49,6 +49,7 @@ module Homebrew end def generate! + p "generate" raise "#{path} already exists" if path.exist? if version.nil? || version.null? From 2b669685054531ba369601a2a6f21fd3f20d0e27 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Wed, 17 Jun 2020 22:55:02 +0800 Subject: [PATCH 017/149] audit: cosmetic changes --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 215d711845..9802f40bd4 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -97,9 +97,7 @@ module Homebrew describe "#audit_license" do let(:spdx_ids) { - # full_path = File.join(File.expand_path(File.dirname(__FILE__) + "../../../data/"), "spdx.json") full_path = File.join(File.dirname(__FILE__), "../../data/spdx.json") - p full_path File.open(full_path, "r") do |f| JSON.parse(f.read) end From 610dfe0fc2ae77527c08785e23c006f0c9736142 Mon Sep 17 00:00:00 2001 From: Lionell Date: Thu, 18 Jun 2020 00:44:33 +0800 Subject: [PATCH 018/149] audit: fixed with PR comments. Refactored get_repo_license api call and audit_license only new_formula --- Library/Homebrew/dev-cmd/audit.rb | 28 +++++++++++++++------------- Library/Homebrew/utils/github.rb | 9 +++++++++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index ed78509607..007a91409f 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -349,6 +349,8 @@ module Homebrew ].freeze def audit_license + return unless @new_formula + if !formula.license.blank? if @spdx_ids.key?(formula.license) return unless @online @@ -356,7 +358,7 @@ module Homebrew user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}, false) return if user.nil? - github_license = get_repo_license_data(user, repo) + github_license = GitHub.get_repo_license(user, repo) return if github_license && (github_license == formula.license) problem "License mismatch - Github license is: #{github_license}, "\ @@ -369,18 +371,18 @@ module Homebrew end end - def get_repo_license_data(user, repo) - return unless @online - - begin - res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") - return unless res.key?("license") - - res["license"]["spdx_id"] || nil - rescue GitHub::HTTPNotFoundError - nil - end - end + # def get_github_repo_license_data(user, repo) + # return unless @online + # + # begin + # res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") + # return unless res.key?("license") + # + # res["license"]["spdx_id"] || nil + # rescue GitHub::HTTPNotFoundError + # nil + # end + # end def audit_deps @specs.each do |spec| diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 556089c091..244bb397f2 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -476,6 +476,15 @@ module GitHub open_api(url, scopes: ["admin:org", "user"], data: data, request_method: "POST") end + def get_repo_license(user, repo) + res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") + return unless res.key?("license") + + res["license"]["spdx_id"] || nil + rescue GitHub::HTTPNotFoundError + nil + end + def api_errors [GitHub::AuthenticationFailedError, GitHub::HTTPNotFoundError, GitHub::RateLimitExceededError, GitHub::Error, JSON::ParserError].freeze From f78d4f41a08a8392559ed521f4ae5c771fb2c18b Mon Sep 17 00:00:00 2001 From: Lionell Date: Thu, 18 Jun 2020 00:45:13 +0800 Subject: [PATCH 019/149] audit spec: include cases for new formula --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 23 ++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 9802f40bd4..6878142d3a 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -106,8 +106,21 @@ module Homebrew let(:custom_spdx_id) { "zzz" } let(:standard_mismatch_spdx_id) { "0BSD" } + it "does not check if the formula is not a new formula" do + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: false + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + license "" + end + RUBY + + fa.audit_license + p fa.problems + expect(fa.problems).to be_empty + end + it "detects no license info" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: true class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "" @@ -120,7 +133,7 @@ module Homebrew end it "detects if license is not a standard spdx-id" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: true class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "#{custom_spdx_id}" @@ -132,7 +145,7 @@ module Homebrew end it "verifies that a license info is a standard spdx id" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids + fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: true class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "0BSD" @@ -145,7 +158,7 @@ module Homebrew it "checks online and verifies that a standard license id is the same "\ "as what is indicated on its Github repo" do - fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true, core_tap: true + fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true, core_tap: true, new_formula: true class Cask < Formula url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" head "https://github.com/cask/cask.git" @@ -159,7 +172,7 @@ module Homebrew it "checks online and detects that a formula-specified license is not "\ "the same as what is indicated on its Github repository" do - fa = formula_auditor "cask", <<~RUBY, online: true, spdx_ids: spdx_ids, core_tap: true + fa = formula_auditor "cask", <<~RUBY, online: true, spdx_ids: spdx_ids, core_tap: true, new_formula: true class Cask < Formula url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" head "https://github.com/cask/cask.git" From d084356959b0f8b5ba1b2ba99d20be8632c2042f Mon Sep 17 00:00:00 2001 From: Lionell Date: Thu, 18 Jun 2020 00:48:22 +0800 Subject: [PATCH 020/149] create: removed print statement --- Library/Homebrew/formula_creator.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb index 251eddf113..c040d8f1bd 100644 --- a/Library/Homebrew/formula_creator.rb +++ b/Library/Homebrew/formula_creator.rb @@ -49,7 +49,6 @@ module Homebrew end def generate! - p "generate" raise "#{path} already exists" if path.exist? if version.nil? || version.null? From 3f6d3e5cf0abea0c10c4efbdc245e76131fd7ebd Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Tue, 16 Jun 2020 20:35:40 +0200 Subject: [PATCH 021/149] Support casks in readall --- Library/Homebrew/cmd/readall.rb | 8 ++--- Library/Homebrew/extend/os/linux/readall.rb | 9 ++++++ Library/Homebrew/extend/os/readall.rb | 3 ++ Library/Homebrew/readall.rb | 34 ++++++++++++++++----- docs/Manpage.md | 8 ++--- manpages/brew.1 | 2 +- 6 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 Library/Homebrew/extend/os/linux/readall.rb create mode 100644 Library/Homebrew/extend/os/readall.rb diff --git a/Library/Homebrew/cmd/readall.rb b/Library/Homebrew/cmd/readall.rb index 410ce894bd..2eedf9cb59 100644 --- a/Library/Homebrew/cmd/readall.rb +++ b/Library/Homebrew/cmd/readall.rb @@ -11,10 +11,10 @@ module Homebrew usage_banner <<~EOS `readall` [] [] - Import all formulae from the specified , or from all installed taps if none is provided. - This can be useful for debugging issues across all formulae when making + Import all items from the specified , or from all installed taps if none is provided. + This can be useful for debugging issues across all items when making significant changes to `formula.rb`, testing the performance of loading - all formulae or checking if any current formulae have Ruby issues. + all items or checking if any current formulae/casks have Ruby issues. EOS switch "--aliases", description: "Verify any alias symlinks in each tap." @@ -30,7 +30,7 @@ module Homebrew if args.syntax? scan_files = "#{HOMEBREW_LIBRARY_PATH}/**/*.rb" - ruby_files = Dir.glob(scan_files).reject { |file| file =~ %r{/(vendor|cask)/} } + ruby_files = Dir.glob(scan_files).reject { |file| file =~ %r{/(vendor)/} } Homebrew.failed = true unless Readall.valid_ruby_syntax?(ruby_files) end diff --git a/Library/Homebrew/extend/os/linux/readall.rb b/Library/Homebrew/extend/os/linux/readall.rb new file mode 100644 index 0000000000..e9278821e0 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/readall.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module Readall + class << self + def valid_casks?(*) + true + end + end +end diff --git a/Library/Homebrew/extend/os/readall.rb b/Library/Homebrew/extend/os/readall.rb new file mode 100644 index 0000000000..6ddbc3e6d7 --- /dev/null +++ b/Library/Homebrew/extend/os/readall.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "extend/os/linux/readall" if OS.linux? diff --git a/Library/Homebrew/readall.rb b/Library/Homebrew/readall.rb index 54c74c01aa..491c406cbb 100644 --- a/Library/Homebrew/readall.rb +++ b/Library/Homebrew/readall.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "formula" +require "cask/cask_loader" module Readall class << self @@ -35,28 +36,43 @@ module Readall end def valid_formulae?(formulae) - failed = false + success = true formulae.each do |file| Formulary.factory(file) rescue Interrupt raise rescue Exception => e # rubocop:disable Lint/RescueException onoe "Invalid formula: #{file}" - puts e - failed = true + $stderr.puts e + success = false end - !failed + success + end + + def valid_casks?(casks) + success = true + casks.each do |file| + Cask::CaskLoader.load(file) + rescue Interrupt + raise + rescue Exception => e # rubocop:disable Lint/RescueException + onoe "Invalid cask: #{file}" + $stderr.puts e + success = false + end + success end def valid_tap?(tap, options = {}) - failed = false + success = true if options[:aliases] valid_aliases = valid_aliases?(tap.alias_dir, tap.formula_dir) - failed = true unless valid_aliases + success = false unless valid_aliases end valid_formulae = valid_formulae?(tap.formula_files) - failed = true unless valid_formulae - !failed + valid_casks = valid_casks?(tap.cask_files) + success = false if !valid_formulae || !valid_casks + success end private @@ -79,3 +95,5 @@ module Readall end end end + +require "extend/os/readall" diff --git a/docs/Manpage.md b/docs/Manpage.md index 0b746685a1..e242f36fc7 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -367,10 +367,10 @@ Rerun the post-install steps for *`formula`*. ### `readall` [*`options`*] [*`tap`*] -Import all formulae from the specified *`tap`*, or from all installed taps if none -is provided. This can be useful for debugging issues across all formulae when -making significant changes to `formula.rb`, testing the performance of loading -all formulae or checking if any current formulae have Ruby issues. +Import all items from the specified *`tap`*, or from all installed taps if none is +provided. This can be useful for debugging issues across all items when making +significant changes to `formula.rb`, testing the performance of loading all +items or checking if any current formulae/casks have Ruby issues. * `--aliases`: Verify any alias symlinks in each tap. diff --git a/manpages/brew.1 b/manpages/brew.1 index 49bf5bd86e..768ffb6b4d 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -482,7 +482,7 @@ Pin the specified \fIformula\fR, preventing them from being upgraded when issuin Rerun the post\-install steps for \fIformula\fR\. . .SS "\fBreadall\fR [\fIoptions\fR] [\fItap\fR]" -Import all formulae from the specified \fItap\fR, or from all installed taps if none is provided\. This can be useful for debugging issues across all formulae when making significant changes to \fBformula\.rb\fR, testing the performance of loading all formulae or checking if any current formulae have Ruby issues\. +Import all items from the specified \fItap\fR, or from all installed taps if none is provided\. This can be useful for debugging issues across all items when making significant changes to \fBformula\.rb\fR, testing the performance of loading all items or checking if any current formulae/casks have Ruby issues\. . .TP \fB\-\-aliases\fR From 7744f181b96726d491ad875dc5720b7e0a861fd9 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Fri, 19 Jun 2020 03:37:31 +0800 Subject: [PATCH 022/149] Update Library/Homebrew/dev-cmd/audit.rb Formatting change Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/audit.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 007a91409f..af2589ce52 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -361,8 +361,8 @@ module Homebrew github_license = GitHub.get_repo_license(user, repo) return if github_license && (github_license == formula.license) - problem "License mismatch - Github license is: #{github_license}, "\ - "but Formulae license states: #{formula.license}." + problem "License mismatch - GitHub license is: #{github_license}, "\ + "but Formulae license states: #{formula.license}." else problem "#{formula.license} is not a standard SPDX license id." end From eca528ccccf2c73c6059fc821f756de7630c6251 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Fri, 19 Jun 2020 03:38:36 +0800 Subject: [PATCH 023/149] util github: remove nil as that is already expected behaviour Co-authored-by: Mike McQuaid --- Library/Homebrew/utils/github.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 244bb397f2..2a6a67e913 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -480,7 +480,7 @@ module GitHub res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") return unless res.key?("license") - res["license"]["spdx_id"] || nil + res["license"]["spdx_id"] rescue GitHub::HTTPNotFoundError nil end From b08d958064b3384d6616af814162b91acc020244 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Fri, 19 Jun 2020 03:39:05 +0800 Subject: [PATCH 024/149] "license id" -> "license" Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/audit.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index af2589ce52..3bdaabb3f8 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -364,7 +364,7 @@ module Homebrew problem "License mismatch - GitHub license is: #{github_license}, "\ "but Formulae license states: #{formula.license}." else - problem "#{formula.license} is not a standard SPDX license id." + problem "#{formula.license} is not a standard SPDX license." end else problem "No license specified for package." From a0b0c77ee8c6cf326535cc1a02eb5f53fccfda5c Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Fri, 19 Jun 2020 03:58:34 +0800 Subject: [PATCH 025/149] audit license: use present instead of blank Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/audit.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 3bdaabb3f8..1e65db97aa 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -349,9 +349,7 @@ module Homebrew ].freeze def audit_license - return unless @new_formula - - if !formula.license.blank? + if formula.license.present? if @spdx_ids.key?(formula.license) return unless @online From b2cccfcf68b131d2eab734b1e105a5b0407a06ba Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Fri, 19 Jun 2020 04:00:08 +0800 Subject: [PATCH 026/149] Apply suggestions from code review Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/audit.rb | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 1e65db97aa..ac68e2957f 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -353,7 +353,7 @@ module Homebrew if @spdx_ids.key?(formula.license) return unless @online - user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}, false) + user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) return if user.nil? github_license = GitHub.get_repo_license(user, repo) @@ -369,19 +369,6 @@ module Homebrew end end - # def get_github_repo_license_data(user, repo) - # return unless @online - # - # begin - # res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") - # return unless res.key?("license") - # - # res["license"]["spdx_id"] || nil - # rescue GitHub::HTTPNotFoundError - # nil - # end - # end - def audit_deps @specs.each do |spec| # Check for things we don't like to depend on. @@ -590,8 +577,6 @@ module Homebrew return unless @core_tap return unless @online - return unless @new_formula || !new_formula_only - _, user, repo = *regex.match(formula.stable.url) if formula.stable _, user, repo = *regex.match(formula.homepage) unless user return if !user || !repo From 4cb22ca899b2bb9cfa512573b01af5c0b57d8ee1 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Fri, 19 Jun 2020 04:08:50 +0800 Subject: [PATCH 027/149] license: update manpages --- docs/Manpage.md | 2 ++ manpages/brew.1 | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/docs/Manpage.md b/docs/Manpage.md index 0b746685a1..ab6236778a 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -785,6 +785,8 @@ a simple example. For the complete API, see: Explicitly set the *`name`* of the new formula. * `--set-version`: Explicitly set the *`version`* of the new formula. +* `--set-license`: + Explicitly set the *`license`* of the new formula. * `--tap`: Generate the new formula within the given tap, specified as *`user`*`/`*`repo`*. diff --git a/manpages/brew.1 b/manpages/brew.1 index 49bf5bd86e..fd47c1a362 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -1031,6 +1031,10 @@ Explicitly set the \fIname\fR of the new formula\. Explicitly set the \fIversion\fR of the new formula\. . .TP +\fB\-\-set\-license\fR +Explicitly set the \fIlicense\fR of the new formula\. +. +.TP \fB\-\-tap\fR Generate the new formula within the given tap, specified as \fIuser\fR\fB/\fR\fIrepo\fR\. . From a58905000c25f0a6bb6c38d757290017510ed571 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Fri, 19 Jun 2020 04:17:35 +0800 Subject: [PATCH 028/149] Update Library/Homebrew/dev-cmd/audit.rb audit license: suppress missing license problem unless it is a new_formula Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/audit.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index ac68e2957f..58483b41ff 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -364,7 +364,7 @@ module Homebrew else problem "#{formula.license} is not a standard SPDX license." end - else + elsif @new_formula problem "No license specified for package." end end From 4287ea74d1549b0060f951aeeb8de51490b96498 Mon Sep 17 00:00:00 2001 From: Lionell Date: Fri, 19 Jun 2020 04:20:19 +0800 Subject: [PATCH 029/149] remove json from gemfile and modified get_repo_data --- Library/Homebrew/Gemfile | 1 - Library/Homebrew/dev-cmd/audit.rb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile index 458f288aad..917787658d 100644 --- a/Library/Homebrew/Gemfile +++ b/Library/Homebrew/Gemfile @@ -5,7 +5,6 @@ source "https://rubygems.org" # installed gems gem "byebug" gem "coveralls", "~> 0.8", require: false -gem "json", require: false gem "parallel_tests" gem "ronn", require: false gem "rspec" diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index ac68e2957f..dc4d9c9e04 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -573,7 +573,7 @@ module Homebrew new_formula_problem warning end - def get_repo_data(regex, new_formula_only = true) + def get_repo_data(regex) return unless @core_tap return unless @online From fa412f9bb4838901ebd16b15144e68b97cb5463a Mon Sep 17 00:00:00 2001 From: Lionell Date: Fri, 19 Jun 2020 04:24:36 +0800 Subject: [PATCH 030/149] audit spec: editted strings to matach audit problem strings --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 6878142d3a..eaef7af113 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -115,7 +115,6 @@ module Homebrew RUBY fa.audit_license - p fa.problems expect(fa.problems).to be_empty end @@ -141,7 +140,7 @@ module Homebrew RUBY fa.audit_license - expect(fa.problems.first).to match "#{custom_spdx_id} is not a standard SPDX license id." + expect(fa.problems.first).to match "#{custom_spdx_id} is not a standard SPDX license." end it "verifies that a license info is a standard spdx id" do @@ -181,7 +180,7 @@ module Homebrew RUBY fa.audit_license - expect(fa.problems.first).to match "License mismatch - Github license is: GPL-3.0, "\ + expect(fa.problems.first).to match "License mismatch - GitHub license is: GPL-3.0, "\ "but Formulae license states: #{standard_mismatch_spdx_id}." end end From bc28ee0f6dc24f17369ec11e2d0e6ba4f893364a Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 23 Jun 2020 01:38:21 +0800 Subject: [PATCH 031/149] license: update to new license format --- Library/Homebrew/data/spdx.json | 7341 ++++++++++++++++++++++--------- 1 file changed, 5296 insertions(+), 2045 deletions(-) diff --git a/Library/Homebrew/data/spdx.json b/Library/Homebrew/data/spdx.json index d09c5647e5..530b2796f1 100644 --- a/Library/Homebrew/data/spdx.json +++ b/Library/Homebrew/data/spdx.json @@ -1,2047 +1,5298 @@ { - "0BSD": { - "name": "BSD Zero Clause License", - "url": "http://landley.net/toybox/license.html", - "osiApproved": true - }, - "AAL": { - "name": "Attribution Assurance License", - "url": "https://opensource.org/licenses/attribution", - "osiApproved": true - }, - "ADSL": { - "name": "Amazon Digital Services License", - "url": "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense", - "osiApproved": false - }, - "AFL-1.1": { - "name": "Academic Free License v1.1", - "url": "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", - "osiApproved": true - }, - "AFL-1.2": { - "name": "Academic Free License v1.2", - "url": "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", - "osiApproved": true - }, - "AFL-2.0": { - "name": "Academic Free License v2.0", - "url": "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt", - "osiApproved": true - }, - "AFL-2.1": { - "name": "Academic Free License v2.1", - "url": "http://opensource.linux-mirror.org/licenses/afl-2.1.txt", - "osiApproved": true - }, - "AFL-3.0": { - "name": "Academic Free License v3.0", - "url": "http://www.rosenlaw.com/AFL3.0.htm", - "osiApproved": true - }, - "AGPL-1.0": { - "name": "Affero General Public License v1.0", - "url": "http://www.affero.org/oagpl.html", - "osiApproved": false - }, - "AGPL-1.0-only": { - "name": "Affero General Public License v1.0 only", - "url": "http://www.affero.org/oagpl.html", - "osiApproved": false - }, - "AGPL-1.0-or-later": { - "name": "Affero General Public License v1.0 or later", - "url": "http://www.affero.org/oagpl.html", - "osiApproved": false - }, - "AGPL-3.0": { - "name": "GNU Affero General Public License v3.0", - "url": "https://www.gnu.org/licenses/agpl.txt", - "osiApproved": true - }, - "AGPL-3.0-only": { - "name": "GNU Affero General Public License v3.0 only", - "url": "https://www.gnu.org/licenses/agpl.txt", - "osiApproved": true - }, - "AGPL-3.0-or-later": { - "name": "GNU Affero General Public License v3.0 or later", - "url": "https://www.gnu.org/licenses/agpl.txt", - "osiApproved": true - }, - "AMDPLPA": { - "name": "AMD's plpa_map.c License", - "url": "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License", - "osiApproved": false - }, - "AML": { - "name": "Apple MIT License", - "url": "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License", - "osiApproved": false - }, - "AMPAS": { - "name": "Academy of Motion Picture Arts and Sciences BSD", - "url": "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD", - "osiApproved": false - }, - "ANTLR-PD": { - "name": "ANTLR Software Rights Notice", - "url": "http://www.antlr2.org/license.html", - "osiApproved": false - }, - "APAFML": { - "name": "Adobe Postscript AFM License", - "url": "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM", - "osiApproved": false - }, - "APL-1.0": { - "name": "Adaptive Public License 1.0", - "url": "https://opensource.org/licenses/APL-1.0", - "osiApproved": true - }, - "APSL-1.0": { - "name": "Apple Public Source License 1.0", - "url": "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0", - "osiApproved": true - }, - "APSL-1.1": { - "name": "Apple Public Source License 1.1", - "url": "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE", - "osiApproved": true - }, - "APSL-1.2": { - "name": "Apple Public Source License 1.2", - "url": "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php", - "osiApproved": true - }, - "APSL-2.0": { - "name": "Apple Public Source License 2.0", - "url": "http://www.opensource.apple.com/license/apsl/", - "osiApproved": true - }, - "Abstyles": { - "name": "Abstyles License", - "url": "https://fedoraproject.org/wiki/Licensing/Abstyles", - "osiApproved": false - }, - "Adobe-2006": { - "name": "Adobe Systems Incorporated Source Code License Agreement", - "url": "https://fedoraproject.org/wiki/Licensing/AdobeLicense", - "osiApproved": false - }, - "Adobe-Glyph": { - "name": "Adobe Glyph List License", - "url": "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph", - "osiApproved": false - }, - "Afmparse": { - "name": "Afmparse License", - "url": "https://fedoraproject.org/wiki/Licensing/Afmparse", - "osiApproved": false - }, - "Aladdin": { - "name": "Aladdin Free Public License", - "url": "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm", - "osiApproved": false - }, - "Apache-1.0": { - "name": "Apache License 1.0", - "url": "http://www.apache.org/licenses/LICENSE-1.0", - "osiApproved": false - }, - "Apache-1.1": { - "name": "Apache License 1.1", - "url": "http://apache.org/licenses/LICENSE-1.1", - "osiApproved": true - }, - "Apache-2.0": { - "name": "Apache License 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0", - "osiApproved": true - }, - "Artistic-1.0": { - "name": "Artistic License 1.0", - "url": "https://opensource.org/licenses/Artistic-1.0", - "osiApproved": true - }, - "Artistic-1.0-Perl": { - "name": "Artistic License 1.0 (Perl)", - "url": "http://dev.perl.org/licenses/artistic.html", - "osiApproved": true - }, - "Artistic-1.0-cl8": { - "name": "Artistic License 1.0 w/clause 8", - "url": "https://opensource.org/licenses/Artistic-1.0", - "osiApproved": true - }, - "Artistic-2.0": { - "name": "Artistic License 2.0", - "url": "http://www.perlfoundation.org/artistic_license_2_0", - "osiApproved": true - }, - "BSD-1-Clause": { - "name": "BSD 1-Clause License", - "url": "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision=326823", - "osiApproved": false - }, - "BSD-2-Clause": { - "name": "BSD 2-Clause \"Simplified\" License", - "url": "https://opensource.org/licenses/BSD-2-Clause", - "osiApproved": true - }, - "BSD-2-Clause-FreeBSD": { - "name": "BSD 2-Clause FreeBSD License", - "url": "http://www.freebsd.org/copyright/freebsd-license.html", - "osiApproved": false - }, - "BSD-2-Clause-NetBSD": { - "name": "BSD 2-Clause NetBSD License", - "url": "http://www.netbsd.org/about/redistribution.html#default", - "osiApproved": false - }, - "BSD-2-Clause-Patent": { - "name": "BSD-2-Clause Plus Patent License", - "url": "https://opensource.org/licenses/BSDplusPatent", - "osiApproved": true - }, - "BSD-3-Clause": { - "name": "BSD 3-Clause \"New\" or \"Revised\" License", - "url": "https://opensource.org/licenses/BSD-3-Clause", - "osiApproved": true - }, - "BSD-3-Clause-Attribution": { - "name": "BSD with attribution", - "url": "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution", - "osiApproved": false - }, - "BSD-3-Clause-Clear": { - "name": "BSD 3-Clause Clear License", - "url": "http://labs.metacarta.com/license-explanation.html#license", - "osiApproved": false - }, - "BSD-3-Clause-LBNL": { - "name": "Lawrence Berkeley National Labs BSD variant license", - "url": "https://fedoraproject.org/wiki/Licensing/LBNLBSD", - "osiApproved": true - }, - "BSD-3-Clause-No-Nuclear-License": { - "name": "BSD 3-Clause No Nuclear License", - "url": "http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam=1467140197_43d516ce1776bd08a58235a7785be1cc", - "osiApproved": false - }, - "BSD-3-Clause-No-Nuclear-License-2014": { - "name": "BSD 3-Clause No Nuclear License 2014", - "url": "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense", - "osiApproved": false - }, - "BSD-3-Clause-No-Nuclear-Warranty": { - "name": "BSD 3-Clause No Nuclear Warranty", - "url": "https://jogamp.org/git/?p=gluegen.git;a=blob_plain;f=LICENSE.txt", - "osiApproved": false - }, - "BSD-3-Clause-Open-MPI": { - "name": "BSD 3-Clause Open MPI variant", - "url": "https://www.open-mpi.org/community/license.php", - "osiApproved": false - }, - "BSD-4-Clause": { - "name": "BSD 4-Clause \"Original\" or \"Old\" License", - "url": "http://directory.fsf.org/wiki/License:BSD_4Clause", - "osiApproved": false - }, - "BSD-4-Clause-UC": { - "name": "BSD-4-Clause (University of California-Specific)", - "url": "http://www.freebsd.org/copyright/license.html", - "osiApproved": false - }, - "BSD-Protection": { - "name": "BSD Protection License", - "url": "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License", - "osiApproved": false - }, - "BSD-Source-Code": { - "name": "BSD Source Code Attribution", - "url": "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt", - "osiApproved": false - }, - "BSL-1.0": { - "name": "Boost Software License 1.0", - "url": "http://www.boost.org/LICENSE_1_0.txt", - "osiApproved": true - }, - "Bahyph": { - "name": "Bahyph License", - "url": "https://fedoraproject.org/wiki/Licensing/Bahyph", - "osiApproved": false - }, - "Barr": { - "name": "Barr License", - "url": "https://fedoraproject.org/wiki/Licensing/Barr", - "osiApproved": false - }, - "Beerware": { - "name": "Beerware License", - "url": "https://fedoraproject.org/wiki/Licensing/Beerware", - "osiApproved": false - }, - "BitTorrent-1.0": { - "name": "BitTorrent Open Source License v1.0", - "url": "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1=1.1&r2=1.1.1.1&diff_format=s", - "osiApproved": false - }, - "BitTorrent-1.1": { - "name": "BitTorrent Open Source License v1.1", - "url": "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1", - "osiApproved": false - }, - "BlueOak-1.0.0": { - "name": "Blue Oak Model License 1.0.0", - "url": "https://blueoakcouncil.org/license/1.0.0", - "osiApproved": false - }, - "Borceux": { - "name": "Borceux license", - "url": "https://fedoraproject.org/wiki/Licensing/Borceux", - "osiApproved": false - }, - "CATOSL-1.1": { - "name": "Computer Associates Trusted Open Source License 1.1", - "url": "https://opensource.org/licenses/CATOSL-1.1", - "osiApproved": true - }, - "CC-BY-1.0": { - "name": "Creative Commons Attribution 1.0 Generic", - "url": "https://creativecommons.org/licenses/by/1.0/legalcode", - "osiApproved": false - }, - "CC-BY-2.0": { - "name": "Creative Commons Attribution 2.0 Generic", - "url": "https://creativecommons.org/licenses/by/2.0/legalcode", - "osiApproved": false - }, - "CC-BY-2.5": { - "name": "Creative Commons Attribution 2.5 Generic", - "url": "https://creativecommons.org/licenses/by/2.5/legalcode", - "osiApproved": false - }, - "CC-BY-3.0": { - "name": "Creative Commons Attribution 3.0 Unported", - "url": "https://creativecommons.org/licenses/by/3.0/legalcode", - "osiApproved": false - }, - "CC-BY-4.0": { - "name": "Creative Commons Attribution 4.0 International", - "url": "https://creativecommons.org/licenses/by/4.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-1.0": { - "name": "Creative Commons Attribution Non Commercial 1.0 Generic", - "url": "https://creativecommons.org/licenses/by-nc/1.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-2.0": { - "name": "Creative Commons Attribution Non Commercial 2.0 Generic", - "url": "https://creativecommons.org/licenses/by-nc/2.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-2.5": { - "name": "Creative Commons Attribution Non Commercial 2.5 Generic", - "url": "https://creativecommons.org/licenses/by-nc/2.5/legalcode", - "osiApproved": false - }, - "CC-BY-NC-3.0": { - "name": "Creative Commons Attribution Non Commercial 3.0 Unported", - "url": "https://creativecommons.org/licenses/by-nc/3.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-4.0": { - "name": "Creative Commons Attribution Non Commercial 4.0 International", - "url": "https://creativecommons.org/licenses/by-nc/4.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-ND-1.0": { - "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", - "url": "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-ND-2.0": { - "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", - "url": "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-ND-2.5": { - "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", - "url": "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode", - "osiApproved": false - }, - "CC-BY-NC-ND-3.0": { - "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", - "url": "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-ND-4.0": { - "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", - "url": "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-SA-1.0": { - "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", - "url": "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-SA-2.0": { - "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", - "url": "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-SA-2.5": { - "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", - "url": "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode", - "osiApproved": false - }, - "CC-BY-NC-SA-3.0": { - "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", - "url": "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode", - "osiApproved": false - }, - "CC-BY-NC-SA-4.0": { - "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", - "url": "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode", - "osiApproved": false - }, - "CC-BY-ND-1.0": { - "name": "Creative Commons Attribution No Derivatives 1.0 Generic", - "url": "https://creativecommons.org/licenses/by-nd/1.0/legalcode", - "osiApproved": false - }, - "CC-BY-ND-2.0": { - "name": "Creative Commons Attribution No Derivatives 2.0 Generic", - "url": "https://creativecommons.org/licenses/by-nd/2.0/legalcode", - "osiApproved": false - }, - "CC-BY-ND-2.5": { - "name": "Creative Commons Attribution No Derivatives 2.5 Generic", - "url": "https://creativecommons.org/licenses/by-nd/2.5/legalcode", - "osiApproved": false - }, - "CC-BY-ND-3.0": { - "name": "Creative Commons Attribution No Derivatives 3.0 Unported", - "url": "https://creativecommons.org/licenses/by-nd/3.0/legalcode", - "osiApproved": false - }, - "CC-BY-ND-4.0": { - "name": "Creative Commons Attribution No Derivatives 4.0 International", - "url": "https://creativecommons.org/licenses/by-nd/4.0/legalcode", - "osiApproved": false - }, - "CC-BY-SA-1.0": { - "name": "Creative Commons Attribution Share Alike 1.0 Generic", - "url": "https://creativecommons.org/licenses/by-sa/1.0/legalcode", - "osiApproved": false - }, - "CC-BY-SA-2.0": { - "name": "Creative Commons Attribution Share Alike 2.0 Generic", - "url": "https://creativecommons.org/licenses/by-sa/2.0/legalcode", - "osiApproved": false - }, - "CC-BY-SA-2.5": { - "name": "Creative Commons Attribution Share Alike 2.5 Generic", - "url": "https://creativecommons.org/licenses/by-sa/2.5/legalcode", - "osiApproved": false - }, - "CC-BY-SA-3.0": { - "name": "Creative Commons Attribution Share Alike 3.0 Unported", - "url": "https://creativecommons.org/licenses/by-sa/3.0/legalcode", - "osiApproved": false - }, - "CC-BY-SA-4.0": { - "name": "Creative Commons Attribution Share Alike 4.0 International", - "url": "https://creativecommons.org/licenses/by-sa/4.0/legalcode", - "osiApproved": false - }, - "CC-PDDC": { - "name": "Creative Commons Public Domain Dedication and Certification", - "url": "https://creativecommons.org/licenses/publicdomain/", - "osiApproved": false - }, - "CC0-1.0": { - "name": "Creative Commons Zero v1.0 Universal", - "url": "https://creativecommons.org/publicdomain/zero/1.0/legalcode", - "osiApproved": false - }, - "CDDL-1.0": { - "name": "Common Development and Distribution License 1.0", - "url": "https://opensource.org/licenses/cddl1", - "osiApproved": true - }, - "CDDL-1.1": { - "name": "Common Development and Distribution License 1.1", - "url": "http://glassfish.java.net/public/CDDL+GPL_1_1.html", - "osiApproved": false - }, - "CDLA-Permissive-1.0": { - "name": "Community Data License Agreement Permissive 1.0", - "url": "https://cdla.io/permissive-1-0", - "osiApproved": false - }, - "CDLA-Sharing-1.0": { - "name": "Community Data License Agreement Sharing 1.0", - "url": "https://cdla.io/sharing-1-0", - "osiApproved": false - }, - "CECILL-1.0": { - "name": "CeCILL Free Software License Agreement v1.0", - "url": "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html", - "osiApproved": false - }, - "CECILL-1.1": { - "name": "CeCILL Free Software License Agreement v1.1", - "url": "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html", - "osiApproved": false - }, - "CECILL-2.0": { - "name": "CeCILL Free Software License Agreement v2.0", - "url": "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html", - "osiApproved": false - }, - "CECILL-2.1": { - "name": "CeCILL Free Software License Agreement v2.1", - "url": "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html", - "osiApproved": true - }, - "CECILL-B": { - "name": "CeCILL-B Free Software License Agreement", - "url": "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html", - "osiApproved": false - }, - "CECILL-C": { - "name": "CeCILL-C Free Software License Agreement", - "url": "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html", - "osiApproved": false - }, - "CERN-OHL-1.1": { - "name": "CERN Open Hardware Licence v1.1", - "url": "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1", - "osiApproved": false - }, - "CERN-OHL-1.2": { - "name": "CERN Open Hardware Licence v1.2", - "url": "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2", - "osiApproved": false - }, - "CNRI-Jython": { - "name": "CNRI Jython License", - "url": "http://www.jython.org/license.html", - "osiApproved": false - }, - "CNRI-Python": { - "name": "CNRI Python License", - "url": "https://opensource.org/licenses/CNRI-Python", - "osiApproved": true - }, - "CNRI-Python-GPL-Compatible": { - "name": "CNRI Python Open Source GPL Compatible License Agreement", - "url": "http://www.python.org/download/releases/1.6.1/download_win/", - "osiApproved": false - }, - "CPAL-1.0": { - "name": "Common Public Attribution License 1.0", - "url": "https://opensource.org/licenses/CPAL-1.0", - "osiApproved": true - }, - "CPL-1.0": { - "name": "Common Public License 1.0", - "url": "https://opensource.org/licenses/CPL-1.0", - "osiApproved": true - }, - "CPOL-1.02": { - "name": "Code Project Open License 1.02", - "url": "http://www.codeproject.com/info/cpol10.aspx", - "osiApproved": false - }, - "CUA-OPL-1.0": { - "name": "CUA Office Public License v1.0", - "url": "https://opensource.org/licenses/CUA-OPL-1.0", - "osiApproved": true - }, - "Caldera": { - "name": "Caldera License", - "url": "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf", - "osiApproved": false - }, - "ClArtistic": { - "name": "Clarified Artistic License", - "url": "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", - "osiApproved": false - }, - "Condor-1.1": { - "name": "Condor Public License v1.1", - "url": "http://research.cs.wisc.edu/condor/license.html#condor", - "osiApproved": false - }, - "Crossword": { - "name": "Crossword License", - "url": "https://fedoraproject.org/wiki/Licensing/Crossword", - "osiApproved": false - }, - "CrystalStacker": { - "name": "CrystalStacker License", - "url": "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd=Licensing/CrystalStacker", - "osiApproved": false - }, - "Cube": { - "name": "Cube License", - "url": "https://fedoraproject.org/wiki/Licensing/Cube", - "osiApproved": false - }, - "D-FSL-1.0": { - "name": "Deutsche Freie Software Lizenz", - "url": "http://www.dipp.nrw.de/d-fsl/lizenzen/", - "osiApproved": false - }, - "DOC": { - "name": "DOC License", - "url": "http://www.cs.wustl.edu/~schmidt/ACE-copying.html", - "osiApproved": false - }, - "DSDP": { - "name": "DSDP License", - "url": "https://fedoraproject.org/wiki/Licensing/DSDP", - "osiApproved": false - }, - "Dotseqn": { - "name": "Dotseqn License", - "url": "https://fedoraproject.org/wiki/Licensing/Dotseqn", - "osiApproved": false - }, - "ECL-1.0": { - "name": "Educational Community License v1.0", - "url": "https://opensource.org/licenses/ECL-1.0", - "osiApproved": true - }, - "ECL-2.0": { - "name": "Educational Community License v2.0", - "url": "https://opensource.org/licenses/ECL-2.0", - "osiApproved": true - }, - "EFL-1.0": { - "name": "Eiffel Forum License v1.0", - "url": "http://www.eiffel-nice.org/license/forum.txt", - "osiApproved": true - }, - "EFL-2.0": { - "name": "Eiffel Forum License v2.0", - "url": "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", - "osiApproved": true - }, - "EPL-1.0": { - "name": "Eclipse Public License 1.0", - "url": "http://www.eclipse.org/legal/epl-v10.html", - "osiApproved": true - }, - "EPL-2.0": { - "name": "Eclipse Public License 2.0", - "url": "https://www.eclipse.org/legal/epl-2.0", - "osiApproved": true - }, - "EUDatagrid": { - "name": "EU DataGrid Software License", - "url": "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", - "osiApproved": true - }, - "EUPL-1.0": { - "name": "European Union Public License 1.0", - "url": "http://ec.europa.eu/idabc/en/document/7330.html", - "osiApproved": false - }, - "EUPL-1.1": { - "name": "European Union Public License 1.1", - "url": "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", - "osiApproved": true - }, - "EUPL-1.2": { - "name": "European Union Public License 1.2", - "url": "https://joinup.ec.europa.eu/page/eupl-text-11-12", - "osiApproved": true - }, - "Entessa": { - "name": "Entessa Public License v1.0", - "url": "https://opensource.org/licenses/Entessa", - "osiApproved": true - }, - "ErlPL-1.1": { - "name": "Erlang Public License v1.1", - "url": "http://www.erlang.org/EPLICENSE", - "osiApproved": false - }, - "Eurosym": { - "name": "Eurosym License", - "url": "https://fedoraproject.org/wiki/Licensing/Eurosym", - "osiApproved": false - }, - "FSFAP": { - "name": "FSF All Permissive License", - "url": "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html", - "osiApproved": false - }, - "FSFUL": { - "name": "FSF Unlimited License", - "url": "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License", - "osiApproved": false - }, - "FSFULLR": { - "name": "FSF Unlimited License (with License Retention)", - "url": "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant", - "osiApproved": false - }, - "FTL": { - "name": "Freetype Project License", - "url": "http://freetype.fis.uniroma2.it/FTL.TXT", - "osiApproved": false - }, - "Fair": { - "name": "Fair License", - "url": "http://fairlicense.org/", - "osiApproved": true - }, - "Frameworx-1.0": { - "name": "Frameworx Open License 1.0", - "url": "https://opensource.org/licenses/Frameworx-1.0", - "osiApproved": true - }, - "FreeImage": { - "name": "FreeImage Public License v1.0", - "url": "http://freeimage.sourceforge.net/freeimage-license.txt", - "osiApproved": false - }, - "GFDL-1.1": { - "name": "GNU Free Documentation License v1.1", - "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt", - "osiApproved": false - }, - "GFDL-1.1-only": { - "name": "GNU Free Documentation License v1.1 only", - "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt", - "osiApproved": false - }, - "GFDL-1.1-or-later": { - "name": "GNU Free Documentation License v1.1 or later", - "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt", - "osiApproved": false - }, - "GFDL-1.2": { - "name": "GNU Free Documentation License v1.2", - "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt", - "osiApproved": false - }, - "GFDL-1.2-only": { - "name": "GNU Free Documentation License v1.2 only", - "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt", - "osiApproved": false - }, - "GFDL-1.2-or-later": { - "name": "GNU Free Documentation License v1.2 or later", - "url": "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt", - "osiApproved": false - }, - "GFDL-1.3": { - "name": "GNU Free Documentation License v1.3", - "url": "https://www.gnu.org/licenses/fdl-1.3.txt", - "osiApproved": false - }, - "GFDL-1.3-only": { - "name": "GNU Free Documentation License v1.3 only", - "url": "https://www.gnu.org/licenses/fdl-1.3.txt", - "osiApproved": false - }, - "GFDL-1.3-or-later": { - "name": "GNU Free Documentation License v1.3 or later", - "url": "https://www.gnu.org/licenses/fdl-1.3.txt", - "osiApproved": false - }, - "GL2PS": { - "name": "GL2PS License", - "url": "http://www.geuz.org/gl2ps/COPYING.GL2PS", - "osiApproved": false - }, - "GPL-1.0": { - "name": "GNU General Public License v1.0 only", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", - "osiApproved": false - }, - "GPL-1.0+": { - "name": "GNU General Public License v1.0 or later", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", - "osiApproved": false - }, - "GPL-1.0-only": { - "name": "GNU General Public License v1.0 only", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", - "osiApproved": false - }, - "GPL-1.0-or-later": { - "name": "GNU General Public License v1.0 or later", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html", - "osiApproved": false - }, - "GPL-2.0": { - "name": "GNU General Public License v2.0 only", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "osiApproved": true - }, - "GPL-2.0+": { - "name": "GNU General Public License v2.0 or later", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "osiApproved": true - }, - "GPL-2.0-only": { - "name": "GNU General Public License v2.0 only", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "osiApproved": true - }, - "GPL-2.0-or-later": { - "name": "GNU General Public License v2.0 or later", - "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "osiApproved": true - }, - "GPL-2.0-with-GCC-exception": { - "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", - "url": "https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/libgcc1.c;h=762f5143fc6eed57b6797c82710f3538aa52b40b;hb=cb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10", - "osiApproved": false - }, - "GPL-2.0-with-autoconf-exception": { - "name": "GNU General Public License v2.0 w/Autoconf exception", - "url": "http://ac-archive.sourceforge.net/doc/copyright.html", - "osiApproved": false - }, - "GPL-2.0-with-bison-exception": { - "name": "GNU General Public License v2.0 w/Bison exception", - "url": "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id=193d7c7054ba7197b0789e14965b739162319b5e#n141", - "osiApproved": false - }, - "GPL-2.0-with-classpath-exception": { - "name": "GNU General Public License v2.0 w/Classpath exception", - "url": "https://www.gnu.org/software/classpath/license.html", - "osiApproved": false - }, - "GPL-2.0-with-font-exception": { - "name": "GNU General Public License v2.0 w/Font exception", - "url": "https://www.gnu.org/licenses/gpl-faq.html#FontException", - "osiApproved": false - }, - "GPL-3.0": { - "name": "GNU General Public License v3.0 only", - "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "osiApproved": true - }, - "GPL-3.0+": { - "name": "GNU General Public License v3.0 or later", - "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "osiApproved": true - }, - "GPL-3.0-only": { - "name": "GNU General Public License v3.0 only", - "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "osiApproved": true - }, - "GPL-3.0-or-later": { - "name": "GNU General Public License v3.0 or later", - "url": "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "osiApproved": true - }, - "GPL-3.0-with-GCC-exception": { - "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", - "url": "https://www.gnu.org/licenses/gcc-exception-3.1.html", - "osiApproved": true - }, - "GPL-3.0-with-autoconf-exception": { - "name": "GNU General Public License v3.0 w/Autoconf exception", - "url": "https://www.gnu.org/licenses/autoconf-exception-3.0.html", - "osiApproved": false - }, - "Giftware": { - "name": "Giftware License", - "url": "http://liballeg.org/license.html#allegro-4-the-giftware-license", - "osiApproved": false - }, - "Glide": { - "name": "3dfx Glide License", - "url": "http://www.users.on.net/~triforce/glidexp/COPYING.txt", - "osiApproved": false - }, - "Glulxe": { - "name": "Glulxe License", - "url": "https://fedoraproject.org/wiki/Licensing/Glulxe", - "osiApproved": false - }, - "HPND": { - "name": "Historical Permission Notice and Disclaimer", - "url": "https://opensource.org/licenses/HPND", - "osiApproved": true - }, - "HPND-sell-variant": { - "name": "Historical Permission Notice and Disclaimer - sell variant", - "url": "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h=v4.19", - "osiApproved": false - }, - "HaskellReport": { - "name": "Haskell Language Report License", - "url": "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License", - "osiApproved": false - }, - "IBM-pibs": { - "name": "IBM PowerPC Initialization and Boot Software", - "url": "http://git.denx.de/?p=u-boot.git;a=blob;f=arch/powerpc/cpu/ppc4xx/miiphy.c;h=297155fdafa064b955e53e9832de93bfb0cfb85b;hb=9fab4bf4cc077c21e43941866f3f2c196f28670d", - "osiApproved": false - }, - "ICU": { - "name": "ICU License", - "url": "http://source.icu-project.org/repos/icu/icu/trunk/license.html", - "osiApproved": false - }, - "IJG": { - "name": "Independent JPEG Group License", - "url": "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev=1.2", - "osiApproved": false - }, - "IPA": { - "name": "IPA Font License", - "url": "https://opensource.org/licenses/IPA", - "osiApproved": true - }, - "IPL-1.0": { - "name": "IBM Public License v1.0", - "url": "https://opensource.org/licenses/IPL-1.0", - "osiApproved": true - }, - "ISC": { - "name": "ISC License", - "url": "https://www.isc.org/downloads/software-support-policy/isc-license/", - "osiApproved": true - }, - "ImageMagick": { - "name": "ImageMagick License", - "url": "http://www.imagemagick.org/script/license.php", - "osiApproved": false - }, - "Imlib2": { - "name": "Imlib2 License", - "url": "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", - "osiApproved": false - }, - "Info-ZIP": { - "name": "Info-ZIP License", - "url": "http://www.info-zip.org/license.html", - "osiApproved": false - }, - "Intel": { - "name": "Intel Open Source License", - "url": "https://opensource.org/licenses/Intel", - "osiApproved": true - }, - "Intel-ACPI": { - "name": "Intel ACPI Software License Agreement", - "url": "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement", - "osiApproved": false - }, - "Interbase-1.0": { - "name": "Interbase Public License v1.0", - "url": "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html", - "osiApproved": false - }, - "JPNIC": { - "name": "Japan Network Information Center License", - "url": "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366", - "osiApproved": false - }, - "JSON": { - "name": "JSON License", - "url": "http://www.json.org/license.html", - "osiApproved": false - }, - "JasPer-2.0": { - "name": "JasPer License", - "url": "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE", - "osiApproved": false - }, - "LAL-1.2": { - "name": "Licence Art Libre 1.2", - "url": "http://artlibre.org/licence/lal/licence-art-libre-12/", - "osiApproved": false - }, - "LAL-1.3": { - "name": "Licence Art Libre 1.3", - "url": "https://artlibre.org/", - "osiApproved": false - }, - "LGPL-2.0": { - "name": "GNU Library General Public License v2 only", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", - "osiApproved": true - }, - "LGPL-2.0+": { - "name": "GNU Library General Public License v2 or later", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", - "osiApproved": true - }, - "LGPL-2.0-only": { - "name": "GNU Library General Public License v2 only", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", - "osiApproved": true - }, - "LGPL-2.0-or-later": { - "name": "GNU Library General Public License v2 or later", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html", - "osiApproved": true - }, - "LGPL-2.1": { - "name": "GNU Lesser General Public License v2.1 only", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "osiApproved": true - }, - "LGPL-2.1+": { - "name": "GNU Library General Public License v2.1 or later", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "osiApproved": true - }, - "LGPL-2.1-only": { - "name": "GNU Lesser General Public License v2.1 only", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "osiApproved": true - }, - "LGPL-2.1-or-later": { - "name": "GNU Lesser General Public License v2.1 or later", - "url": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "osiApproved": true - }, - "LGPL-3.0": { - "name": "GNU Lesser General Public License v3.0 only", - "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "osiApproved": true - }, - "LGPL-3.0+": { - "name": "GNU Lesser General Public License v3.0 or later", - "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "osiApproved": true - }, - "LGPL-3.0-only": { - "name": "GNU Lesser General Public License v3.0 only", - "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "osiApproved": true - }, - "LGPL-3.0-or-later": { - "name": "GNU Lesser General Public License v3.0 or later", - "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "osiApproved": true - }, - "LGPLLR": { - "name": "Lesser General Public License For Linguistic Resources", - "url": "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html", - "osiApproved": false - }, - "LPL-1.0": { - "name": "Lucent Public License Version 1.0", - "url": "https://opensource.org/licenses/LPL-1.0", - "osiApproved": true - }, - "LPL-1.02": { - "name": "Lucent Public License v1.02", - "url": "http://plan9.bell-labs.com/plan9/license.html", - "osiApproved": true - }, - "LPPL-1.0": { - "name": "LaTeX Project Public License v1.0", - "url": "http://www.latex-project.org/lppl/lppl-1-0.txt", - "osiApproved": false - }, - "LPPL-1.1": { - "name": "LaTeX Project Public License v1.1", - "url": "http://www.latex-project.org/lppl/lppl-1-1.txt", - "osiApproved": false - }, - "LPPL-1.2": { - "name": "LaTeX Project Public License v1.2", - "url": "http://www.latex-project.org/lppl/lppl-1-2.txt", - "osiApproved": false - }, - "LPPL-1.3a": { - "name": "LaTeX Project Public License v1.3a", - "url": "http://www.latex-project.org/lppl/lppl-1-3a.txt", - "osiApproved": false - }, - "LPPL-1.3c": { - "name": "LaTeX Project Public License v1.3c", - "url": "http://www.latex-project.org/lppl/lppl-1-3c.txt", - "osiApproved": true - }, - "Latex2e": { - "name": "Latex2e License", - "url": "https://fedoraproject.org/wiki/Licensing/Latex2e", - "osiApproved": false - }, - "Leptonica": { - "name": "Leptonica License", - "url": "https://fedoraproject.org/wiki/Licensing/Leptonica", - "osiApproved": false - }, - "LiLiQ-P-1.1": { - "name": "Licence Libre du Québec – Permissive version 1.1", - "url": "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", - "osiApproved": true - }, - "LiLiQ-R-1.1": { - "name": "Licence Libre du Québec – Réciprocité version 1.1", - "url": "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", - "osiApproved": true - }, - "LiLiQ-Rplus-1.1": { - "name": "Licence Libre du Québec – Réciprocité forte version 1.1", - "url": "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", - "osiApproved": true - }, - "Libpng": { - "name": "libpng License", - "url": "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt", - "osiApproved": false - }, - "Linux-OpenIB": { - "name": "Linux Kernel Variant of OpenIB.org license", - "url": "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h", - "osiApproved": false - }, - "MIT": { - "name": "MIT License", - "url": "https://opensource.org/licenses/MIT", - "osiApproved": true - }, - "MIT-0": { - "name": "MIT No Attribution", - "url": "https://github.com/aws/mit-0", - "osiApproved": false - }, - "MIT-CMU": { - "name": "CMU License", - "url": "https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#CMU_Style", - "osiApproved": false - }, - "MIT-advertising": { - "name": "Enlightenment License (e16)", - "url": "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising", - "osiApproved": false - }, - "MIT-enna": { - "name": "enna License", - "url": "https://fedoraproject.org/wiki/Licensing/MIT#enna", - "osiApproved": false - }, - "MIT-feh": { - "name": "feh License", - "url": "https://fedoraproject.org/wiki/Licensing/MIT#feh", - "osiApproved": false - }, - "MITNFA": { - "name": "MIT +no-false-attribs license", - "url": "https://fedoraproject.org/wiki/Licensing/MITNFA", - "osiApproved": false - }, - "MPL-1.0": { - "name": "Mozilla Public License 1.0", - "url": "http://www.mozilla.org/MPL/MPL-1.0.html", - "osiApproved": true - }, - "MPL-1.1": { - "name": "Mozilla Public License 1.1", - "url": "http://www.mozilla.org/MPL/MPL-1.1.html", - "osiApproved": true - }, - "MPL-2.0": { - "name": "Mozilla Public License 2.0", - "url": "http://www.mozilla.org/MPL/2.0/", - "osiApproved": true - }, - "MPL-2.0-no-copyleft-exception": { - "name": "Mozilla Public License 2.0 (no copyleft exception)", - "url": "http://www.mozilla.org/MPL/2.0/", - "osiApproved": true - }, - "MS-PL": { - "name": "Microsoft Public License", - "url": "http://www.microsoft.com/opensource/licenses.mspx", - "osiApproved": true - }, - "MS-RL": { - "name": "Microsoft Reciprocal License", - "url": "http://www.microsoft.com/opensource/licenses.mspx", - "osiApproved": true - }, - "MTLL": { - "name": "Matrix Template Library License", - "url": "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License", - "osiApproved": false - }, - "MakeIndex": { - "name": "MakeIndex License", - "url": "https://fedoraproject.org/wiki/Licensing/MakeIndex", - "osiApproved": false - }, - "MirOS": { - "name": "The MirOS Licence", - "url": "https://opensource.org/licenses/MirOS", - "osiApproved": true - }, - "Motosoto": { - "name": "Motosoto License", - "url": "https://opensource.org/licenses/Motosoto", - "osiApproved": true - }, - "MulanPSL-1.0": { - "name": "Mulan Permissive Software License, Version 1", - "url": "https://license.coscl.org.cn/MulanPSL/", - "osiApproved": false - }, - "Multics": { - "name": "Multics License", - "url": "https://opensource.org/licenses/Multics", - "osiApproved": true - }, - "Mup": { - "name": "Mup License", - "url": "https://fedoraproject.org/wiki/Licensing/Mup", - "osiApproved": false - }, - "NASA-1.3": { - "name": "NASA Open Source Agreement 1.3", - "url": "http://ti.arc.nasa.gov/opensource/nosa/", - "osiApproved": true - }, - "NBPL-1.0": { - "name": "Net Boolean Public License v1", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=37b4b3f6cc4bf34e1d3dec61e69914b9819d8894", - "osiApproved": false - }, - "NCSA": { - "name": "University of Illinois/NCSA Open Source License", - "url": "http://otm.illinois.edu/uiuc_openSource", - "osiApproved": true - }, - "NGPL": { - "name": "Nethack General Public License", - "url": "https://opensource.org/licenses/NGPL", - "osiApproved": true - }, - "NLOD-1.0": { - "name": "Norwegian Licence for Open Government Data", - "url": "http://data.norge.no/nlod/en/1.0", - "osiApproved": false - }, - "NLPL": { - "name": "No Limit Public License", - "url": "https://fedoraproject.org/wiki/Licensing/NLPL", - "osiApproved": false - }, - "NOSL": { - "name": "Netizen Open Source License", - "url": "http://bits.netizen.com.au/licenses/NOSL/nosl.txt", - "osiApproved": false - }, - "NPL-1.0": { - "name": "Netscape Public License v1.0", - "url": "http://www.mozilla.org/MPL/NPL/1.0/", - "osiApproved": false - }, - "NPL-1.1": { - "name": "Netscape Public License v1.1", - "url": "http://www.mozilla.org/MPL/NPL/1.1/", - "osiApproved": false - }, - "NPOSL-3.0": { - "name": "Non-Profit Open Software License 3.0", - "url": "https://opensource.org/licenses/NOSL3.0", - "osiApproved": true - }, - "NRL": { - "name": "NRL License", - "url": "http://web.mit.edu/network/isakmp/nrllicense.html", - "osiApproved": false - }, - "NTP": { - "name": "NTP License", - "url": "https://opensource.org/licenses/NTP", - "osiApproved": true - }, - "NTP-0": { - "name": "NTP No Attribution", - "url": "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c", - "osiApproved": false - }, - "Naumen": { - "name": "Naumen Public License", - "url": "https://opensource.org/licenses/Naumen", - "osiApproved": true - }, - "Net-SNMP": { - "name": "Net-SNMP License", - "url": "http://net-snmp.sourceforge.net/about/license.html", - "osiApproved": false - }, - "NetCDF": { - "name": "NetCDF license", - "url": "http://www.unidata.ucar.edu/software/netcdf/copyright.html", - "osiApproved": false - }, - "Newsletr": { - "name": "Newsletr License", - "url": "https://fedoraproject.org/wiki/Licensing/Newsletr", - "osiApproved": false - }, - "Nokia": { - "name": "Nokia Open Source License", - "url": "https://opensource.org/licenses/nokia", - "osiApproved": true - }, - "Noweb": { - "name": "Noweb License", - "url": "https://fedoraproject.org/wiki/Licensing/Noweb", - "osiApproved": false - }, - "Nunit": { - "name": "Nunit License", - "url": "https://fedoraproject.org/wiki/Licensing/Nunit", - "osiApproved": false - }, - "OCCT-PL": { - "name": "Open CASCADE Technology Public License", - "url": "http://www.opencascade.com/content/occt-public-license", - "osiApproved": false - }, - "OCLC-2.0": { - "name": "OCLC Research Public License 2.0", - "url": "http://www.oclc.org/research/activities/software/license/v2final.htm", - "osiApproved": true - }, - "ODC-By-1.0": { - "name": "Open Data Commons Attribution License v1.0", - "url": "https://opendatacommons.org/licenses/by/1.0/", - "osiApproved": false - }, - "ODbL-1.0": { - "name": "ODC Open Database License v1.0", - "url": "http://www.opendatacommons.org/licenses/odbl/1.0/", - "osiApproved": false - }, - "OFL-1.0": { - "name": "SIL Open Font License 1.0", - "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web", - "osiApproved": false - }, - "OFL-1.0-RFN": { - "name": "SIL Open Font License 1.0 with Reserved Font Name", - "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web", - "osiApproved": false - }, - "OFL-1.0-no-RFN": { - "name": "SIL Open Font License 1.0 with no Reserved Font Name", - "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web", - "osiApproved": false - }, - "OFL-1.1": { - "name": "SIL Open Font License 1.1", - "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", - "osiApproved": true - }, - "OFL-1.1-RFN": { - "name": "SIL Open Font License 1.1 with Reserved Font Name", - "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", - "osiApproved": true - }, - "OFL-1.1-no-RFN": { - "name": "SIL Open Font License 1.1 with no Reserved Font Name", - "url": "http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", - "osiApproved": true - }, - "OGL-Canada-2.0": { - "name": "Open Government Licence - Canada", - "url": "https://open.canada.ca/en/open-government-licence-canada", - "osiApproved": false - }, - "OGL-UK-1.0": { - "name": "Open Government Licence v1.0", - "url": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/", - "osiApproved": false - }, - "OGL-UK-2.0": { - "name": "Open Government Licence v2.0", - "url": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/", - "osiApproved": false - }, - "OGL-UK-3.0": { - "name": "Open Government Licence v3.0", - "url": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/", - "osiApproved": false - }, - "OGTSL": { - "name": "Open Group Test Suite License", - "url": "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", - "osiApproved": true - }, - "OLDAP-1.1": { - "name": "Open LDAP Public License v1.1", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=806557a5ad59804ef3a44d5abfbe91d706b0791f", - "osiApproved": false - }, - "OLDAP-1.2": { - "name": "Open LDAP Public License v1.2", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=42b0383c50c299977b5893ee695cf4e486fb0dc7", - "osiApproved": false - }, - "OLDAP-1.3": { - "name": "Open LDAP Public License v1.3", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=e5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1", - "osiApproved": false - }, - "OLDAP-1.4": { - "name": "Open LDAP Public License v1.4", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=c9f95c2f3f2ffb5e0ae55fe7388af75547660941", - "osiApproved": false - }, - "OLDAP-2.0": { - "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cbf50f4e1185a21abd4c0a54d3f4341fe28f36ea", - "osiApproved": false - }, - "OLDAP-2.0.1": { - "name": "Open LDAP Public License v2.0.1", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b6d68acd14e51ca3aab4428bf26522aa74873f0e", - "osiApproved": false - }, - "OLDAP-2.1": { - "name": "Open LDAP Public License v2.1", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b0d176738e96a0d3b9f85cb51e140a86f21be715", - "osiApproved": false - }, - "OLDAP-2.2": { - "name": "Open LDAP Public License v2.2", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=470b0c18ec67621c85881b2733057fecf4a1acc3", - "osiApproved": false - }, - "OLDAP-2.2.1": { - "name": "Open LDAP Public License v2.2.1", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=4bc786f34b50aa301be6f5600f58a980070f481e", - "osiApproved": false - }, - "OLDAP-2.2.2": { - "name": "Open LDAP Public License 2.2.2", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=df2cc1e21eb7c160695f5b7cffd6296c151ba188", - "osiApproved": false - }, - "OLDAP-2.3": { - "name": "Open LDAP Public License v2.3", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=d32cf54a32d581ab475d23c810b0a7fbaf8d63c3", - "osiApproved": false - }, - "OLDAP-2.4": { - "name": "Open LDAP Public License v2.4", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cd1284c4a91a8a380d904eee68d1583f989ed386", - "osiApproved": false - }, - "OLDAP-2.5": { - "name": "Open LDAP Public License v2.5", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=6852b9d90022e8593c98205413380536b1b5a7cf", - "osiApproved": false - }, - "OLDAP-2.6": { - "name": "Open LDAP Public License v2.6", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=1cae062821881f41b73012ba816434897abf4205", - "osiApproved": false - }, - "OLDAP-2.7": { - "name": "Open LDAP Public License v2.7", - "url": "http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=47c2415c1df81556eeb39be6cad458ef87c534a2", - "osiApproved": false - }, - "OLDAP-2.8": { - "name": "Open LDAP Public License v2.8", - "url": "http://www.openldap.org/software/release/license.html", - "osiApproved": false - }, - "OML": { - "name": "Open Market License", - "url": "https://fedoraproject.org/wiki/Licensing/Open_Market_License", - "osiApproved": false - }, - "OPL-1.0": { - "name": "Open Public License v1.0", - "url": "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", - "osiApproved": false - }, - "OSET-PL-2.1": { - "name": "OSET Public License version 2.1", - "url": "http://www.osetfoundation.org/public-license", - "osiApproved": true - }, - "OSL-1.0": { - "name": "Open Software License 1.0", - "url": "https://opensource.org/licenses/OSL-1.0", - "osiApproved": true - }, - "OSL-1.1": { - "name": "Open Software License 1.1", - "url": "https://fedoraproject.org/wiki/Licensing/OSL1.1", - "osiApproved": false - }, - "OSL-2.0": { - "name": "Open Software License 2.0", - "url": "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html", - "osiApproved": true - }, - "OSL-2.1": { - "name": "Open Software License 2.1", - "url": "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", - "osiApproved": true - }, - "OSL-3.0": { - "name": "Open Software License 3.0", - "url": "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", - "osiApproved": true - }, - "OpenSSL": { - "name": "OpenSSL License", - "url": "http://www.openssl.org/source/license.html", - "osiApproved": false - }, - "PDDL-1.0": { - "name": "ODC Public Domain Dedication & License 1.0", - "url": "http://opendatacommons.org/licenses/pddl/1.0/", - "osiApproved": false - }, - "PHP-3.0": { - "name": "PHP License v3.0", - "url": "http://www.php.net/license/3_0.txt", - "osiApproved": true - }, - "PHP-3.01": { - "name": "PHP License v3.01", - "url": "http://www.php.net/license/3_01.txt", - "osiApproved": false - }, - "PSF-2.0": { - "name": "Python Software Foundation License 2.0", - "url": "https://opensource.org/licenses/Python-2.0", - "osiApproved": false - }, - "Parity-6.0.0": { - "name": "The Parity Public License 6.0.0", - "url": "https://paritylicense.com/versions/6.0.0.html", - "osiApproved": false - }, - "Plexus": { - "name": "Plexus Classworlds License", - "url": "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License", - "osiApproved": false - }, - "PostgreSQL": { - "name": "PostgreSQL License", - "url": "http://www.postgresql.org/about/licence", - "osiApproved": true - }, - "Python-2.0": { - "name": "Python License 2.0", - "url": "https://opensource.org/licenses/Python-2.0", - "osiApproved": true - }, - "QPL-1.0": { - "name": "Q Public License 1.0", - "url": "http://doc.qt.nokia.com/3.3/license.html", - "osiApproved": true - }, - "Qhull": { - "name": "Qhull License", - "url": "https://fedoraproject.org/wiki/Licensing/Qhull", - "osiApproved": false - }, - "RHeCos-1.1": { - "name": "Red Hat eCos Public License v1.1", - "url": "http://ecos.sourceware.org/old-license.html", - "osiApproved": false - }, - "RPL-1.1": { - "name": "Reciprocal Public License 1.1", - "url": "https://opensource.org/licenses/RPL-1.1", - "osiApproved": true - }, - "RPL-1.5": { - "name": "Reciprocal Public License 1.5", - "url": "https://opensource.org/licenses/RPL-1.5", - "osiApproved": true - }, - "RPSL-1.0": { - "name": "RealNetworks Public Source License v1.0", - "url": "https://helixcommunity.org/content/rpsl", - "osiApproved": true - }, - "RSA-MD": { - "name": "RSA Message-Digest License ", - "url": "http://www.faqs.org/rfcs/rfc1321.html", - "osiApproved": false - }, - "RSCPL": { - "name": "Ricoh Source Code Public License", - "url": "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", - "osiApproved": true - }, - "Rdisc": { - "name": "Rdisc License", - "url": "https://fedoraproject.org/wiki/Licensing/Rdisc_License", - "osiApproved": false - }, - "Ruby": { - "name": "Ruby License", - "url": "http://www.ruby-lang.org/en/LICENSE.txt", - "osiApproved": false - }, - "SAX-PD": { - "name": "Sax Public Domain Notice", - "url": "http://www.saxproject.org/copying.html", - "osiApproved": false - }, - "SCEA": { - "name": "SCEA Shared Source License", - "url": "http://research.scea.com/scea_shared_source_license.html", - "osiApproved": false - }, - "SGI-B-1.0": { - "name": "SGI Free Software License B v1.0", - "url": "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html", - "osiApproved": false - }, - "SGI-B-1.1": { - "name": "SGI Free Software License B v1.1", - "url": "http://oss.sgi.com/projects/FreeB/", - "osiApproved": false - }, - "SGI-B-2.0": { - "name": "SGI Free Software License B v2.0", - "url": "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf", - "osiApproved": false - }, - "SHL-0.5": { - "name": "Solderpad Hardware License v0.5", - "url": "https://solderpad.org/licenses/SHL-0.5/", - "osiApproved": false - }, - "SHL-0.51": { - "name": "Solderpad Hardware License, Version 0.51", - "url": "https://solderpad.org/licenses/SHL-0.51/", - "osiApproved": false - }, - "SISSL": { - "name": "Sun Industry Standards Source License v1.1", - "url": "http://www.openoffice.org/licenses/sissl_license.html", - "osiApproved": true - }, - "SISSL-1.2": { - "name": "Sun Industry Standards Source License v1.2", - "url": "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html", - "osiApproved": false - }, - "SMLNJ": { - "name": "Standard ML of New Jersey License", - "url": "https://www.smlnj.org/license.html", - "osiApproved": false - }, - "SMPPL": { - "name": "Secure Messaging Protocol Public License", - "url": "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt", - "osiApproved": false - }, - "SNIA": { - "name": "SNIA Public License 1.1", - "url": "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License", - "osiApproved": false - }, - "SPL-1.0": { - "name": "Sun Public License v1.0", - "url": "https://opensource.org/licenses/SPL-1.0", - "osiApproved": true - }, - "SSH-OpenSSH": { - "name": "SSH OpenSSH license", - "url": "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10", - "osiApproved": false - }, - "SSH-short": { - "name": "SSH short notice", - "url": "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", - "osiApproved": false - }, - "SSPL-1.0": { - "name": "Server Side Public License, v 1", - "url": "https://www.mongodb.com/licensing/server-side-public-license", - "osiApproved": false - }, - "SWL": { - "name": "Scheme Widget Library (SWL) Software License Agreement", - "url": "https://fedoraproject.org/wiki/Licensing/SWL", - "osiApproved": false - }, - "Saxpath": { - "name": "Saxpath License", - "url": "https://fedoraproject.org/wiki/Licensing/Saxpath_License", - "osiApproved": false - }, - "Sendmail": { - "name": "Sendmail License", - "url": "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", - "osiApproved": false - }, - "Sendmail-8.23": { - "name": "Sendmail License 8.23", - "url": "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", - "osiApproved": false - }, - "SimPL-2.0": { - "name": "Simple Public License 2.0", - "url": "https://opensource.org/licenses/SimPL-2.0", - "osiApproved": true - }, - "Sleepycat": { - "name": "Sleepycat License", - "url": "https://opensource.org/licenses/Sleepycat", - "osiApproved": true - }, - "Spencer-86": { - "name": "Spencer License 86", - "url": "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", - "osiApproved": false - }, - "Spencer-94": { - "name": "Spencer License 94", - "url": "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", - "osiApproved": false - }, - "Spencer-99": { - "name": "Spencer License 99", - "url": "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c", - "osiApproved": false - }, - "StandardML-NJ": { - "name": "Standard ML of New Jersey License", - "url": "http://www.smlnj.org//license.html", - "osiApproved": false - }, - "SugarCRM-1.1.3": { - "name": "SugarCRM Public License v1.1.3", - "url": "http://www.sugarcrm.com/crm/SPL", - "osiApproved": false - }, - "TAPR-OHL-1.0": { - "name": "TAPR Open Hardware License v1.0", - "url": "https://www.tapr.org/OHL", - "osiApproved": false - }, - "TCL": { - "name": "TCL/TK License", - "url": "http://www.tcl.tk/software/tcltk/license.html", - "osiApproved": false - }, - "TCP-wrappers": { - "name": "TCP Wrappers License", - "url": "http://rc.quest.com/topics/openssh/license.php#tcpwrappers", - "osiApproved": false - }, - "TMate": { - "name": "TMate Open Source License", - "url": "http://svnkit.com/license.html", - "osiApproved": false - }, - "TORQUE-1.1": { - "name": "TORQUE v2.5+ Software License v1.1", - "url": "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1", - "osiApproved": false - }, - "TOSL": { - "name": "Trusster Open Source License", - "url": "https://fedoraproject.org/wiki/Licensing/TOSL", - "osiApproved": false - }, - "TU-Berlin-1.0": { - "name": "Technische Universitaet Berlin License 1.0", - "url": "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT", - "osiApproved": false - }, - "TU-Berlin-2.0": { - "name": "Technische Universitaet Berlin License 2.0", - "url": "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt", - "osiApproved": false - }, - "UCL-1.0": { - "name": "Upstream Compatibility License v1.0", - "url": "https://opensource.org/licenses/UCL-1.0", - "osiApproved": true - }, - "UPL-1.0": { - "name": "Universal Permissive License v1.0", - "url": "https://opensource.org/licenses/UPL", - "osiApproved": true - }, - "Unicode-DFS-2015": { - "name": "Unicode License Agreement - Data Files and Software (2015)", - "url": "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html", - "osiApproved": false - }, - "Unicode-DFS-2016": { - "name": "Unicode License Agreement - Data Files and Software (2016)", - "url": "http://www.unicode.org/copyright.html", - "osiApproved": false - }, - "Unicode-TOU": { - "name": "Unicode Terms of Use", - "url": "http://www.unicode.org/copyright.html", - "osiApproved": false - }, - "Unlicense": { - "name": "The Unlicense", - "url": "https://unlicense.org/", - "osiApproved": false - }, - "VOSTROM": { - "name": "VOSTROM Public License for Open Source", - "url": "https://fedoraproject.org/wiki/Licensing/VOSTROM", - "osiApproved": false - }, - "VSL-1.0": { - "name": "Vovida Software License v1.0", - "url": "https://opensource.org/licenses/VSL-1.0", - "osiApproved": true - }, - "Vim": { - "name": "Vim License", - "url": "http://vimdoc.sourceforge.net/htmldoc/uganda.html", - "osiApproved": false - }, - "W3C": { - "name": "W3C Software Notice and License (2002-12-31)", - "url": "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", - "osiApproved": true - }, - "W3C-19980720": { - "name": "W3C Software Notice and License (1998-07-20)", - "url": "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html", - "osiApproved": false - }, - "W3C-20150513": { - "name": "W3C Software Notice and Document License (2015-05-13)", - "url": "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document", - "osiApproved": false - }, - "WTFPL": { - "name": "Do What The F*ck You Want To Public License", - "url": "http://sam.zoy.org/wtfpl/COPYING", - "osiApproved": false - }, - "Watcom-1.0": { - "name": "Sybase Open Watcom Public License 1.0", - "url": "https://opensource.org/licenses/Watcom-1.0", - "osiApproved": true - }, - "Wsuipa": { - "name": "Wsuipa License", - "url": "https://fedoraproject.org/wiki/Licensing/Wsuipa", - "osiApproved": false - }, - "X11": { - "name": "X11 License", - "url": "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3", - "osiApproved": false - }, - "XFree86-1.1": { - "name": "XFree86 License 1.1", - "url": "http://www.xfree86.org/current/LICENSE4.html", - "osiApproved": false - }, - "XSkat": { - "name": "XSkat License", - "url": "https://fedoraproject.org/wiki/Licensing/XSkat_License", - "osiApproved": false - }, - "Xerox": { - "name": "Xerox License", - "url": "https://fedoraproject.org/wiki/Licensing/Xerox", - "osiApproved": false - }, - "Xnet": { - "name": "X.Net License", - "url": "https://opensource.org/licenses/Xnet", - "osiApproved": true - }, - "YPL-1.0": { - "name": "Yahoo! Public License v1.0", - "url": "http://www.zimbra.com/license/yahoo_public_license_1.0.html", - "osiApproved": false - }, - "YPL-1.1": { - "name": "Yahoo! Public License v1.1", - "url": "http://www.zimbra.com/license/yahoo_public_license_1.1.html", - "osiApproved": false - }, - "ZPL-1.1": { - "name": "Zope Public License 1.1", - "url": "http://old.zope.org/Resources/License/ZPL-1.1", - "osiApproved": false - }, - "ZPL-2.0": { - "name": "Zope Public License 2.0", - "url": "http://old.zope.org/Resources/License/ZPL-2.0", - "osiApproved": true - }, - "ZPL-2.1": { - "name": "Zope Public License 2.1", - "url": "http://old.zope.org/Resources/ZPL/", - "osiApproved": false - }, - "Zed": { - "name": "Zed License", - "url": "https://fedoraproject.org/wiki/Licensing/Zed", - "osiApproved": false - }, - "Zend-2.0": { - "name": "Zend License v2.0", - "url": "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt", - "osiApproved": false - }, - "Zimbra-1.3": { - "name": "Zimbra Public License v1.3", - "url": "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html", - "osiApproved": false - }, - "Zimbra-1.4": { - "name": "Zimbra Public License v1.4", - "url": "http://www.zimbra.com/legal/zimbra-public-license-1-4", - "osiApproved": false - }, - "Zlib": { - "name": "zlib License", - "url": "http://www.zlib.net/zlib_license.html", - "osiApproved": true - }, - "blessing": { - "name": "SQLite Blessing", - "url": "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln=4-9", - "osiApproved": false - }, - "bzip2-1.0.5": { - "name": "bzip2 and libbzip2 License v1.0.5", - "url": "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html", - "osiApproved": false - }, - "bzip2-1.0.6": { - "name": "bzip2 and libbzip2 License v1.0.6", - "url": "https://github.com/asimonov-im/bzip2/blob/master/LICENSE", - "osiApproved": false - }, - "copyleft-next-0.3.0": { - "name": "copyleft-next 0.3.0", - "url": "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0", - "osiApproved": false - }, - "copyleft-next-0.3.1": { - "name": "copyleft-next 0.3.1", - "url": "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1", - "osiApproved": false - }, - "curl": { - "name": "curl License", - "url": "https://github.com/bagder/curl/blob/master/COPYING", - "osiApproved": false - }, - "diffmark": { - "name": "diffmark license", - "url": "https://fedoraproject.org/wiki/Licensing/diffmark", - "osiApproved": false - }, - "dvipdfm": { - "name": "dvipdfm License", - "url": "https://fedoraproject.org/wiki/Licensing/dvipdfm", - "osiApproved": false - }, - "eCos-2.0": { - "name": "eCos license version 2.0", - "url": "https://www.gnu.org/licenses/ecos-license.html", - "osiApproved": false - }, - "eGenix": { - "name": "eGenix.com Public License 1.1.0", - "url": "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", - "osiApproved": false - }, - "etalab-2.0": { - "name": "Etalab Open License 2.0", - "url": "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", - "osiApproved": false - }, - "gSOAP-1.3b": { - "name": "gSOAP Public License v1.3b", - "url": "http://www.cs.fsu.edu/~engelen/license.html", - "osiApproved": false - }, - "gnuplot": { - "name": "gnuplot License", - "url": "https://fedoraproject.org/wiki/Licensing/Gnuplot", - "osiApproved": false - }, - "iMatix": { - "name": "iMatix Standard Function Library Agreement", - "url": "http://legacy.imatix.com/html/sfl/sfl4.htm#license", - "osiApproved": false - }, - "libpng-2.0": { - "name": "PNG Reference Library version 2", - "url": "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt", - "osiApproved": false - }, - "libselinux-1.0": { - "name": "libselinux public domain notice", - "url": "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE", - "osiApproved": false - }, - "libtiff": { - "name": "libtiff License", - "url": "https://fedoraproject.org/wiki/Licensing/libtiff", - "osiApproved": false - }, - "mpich2": { - "name": "mpich2 License", - "url": "https://fedoraproject.org/wiki/Licensing/MIT", - "osiApproved": false - }, - "psfrag": { - "name": "psfrag License", - "url": "https://fedoraproject.org/wiki/Licensing/psfrag", - "osiApproved": false - }, - "psutils": { - "name": "psutils License", - "url": "https://fedoraproject.org/wiki/Licensing/psutils", - "osiApproved": false - }, - "wxWindows": { - "name": "wxWindows Library License", - "url": "https://opensource.org/licenses/WXwindows", - "osiApproved": false - }, - "xinetd": { - "name": "xinetd License", - "url": "https://fedoraproject.org/wiki/Licensing/Xinetd_License", - "osiApproved": false - }, - "xpp": { - "name": "XPP License", - "url": "https://fedoraproject.org/wiki/Licensing/xpp", - "osiApproved": false - }, - "zlib-acknowledgement": { - "name": "zlib/libpng License with Acknowledgement", - "url": "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement", - "osiApproved": false - } + "licenseListVersion": "3.9-4-g1a3102c", + "licenses": [ + { + "reference": "./0BSD.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/0BSD.json", + "referenceNumber": "239", + "name": "BSD Zero Clause License", + "licenseId": "0BSD", + "seeAlso": [ + "http://landley.net/toybox/license.html" + ], + "isOsiApproved": true + }, + { + "reference": "./AAL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/AAL.json", + "referenceNumber": "60", + "name": "Attribution Assurance License", + "licenseId": "AAL", + "seeAlso": [ + "https://opensource.org/licenses/attribution" + ], + "isOsiApproved": true + }, + { + "reference": "./ADSL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ADSL.json", + "referenceNumber": "217", + "name": "Amazon Digital Services License", + "licenseId": "ADSL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense" + ], + "isOsiApproved": false + }, + { + "reference": "./AFL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AFL-1.1.json", + "referenceNumber": "28", + "name": "Academic Free License v1.1", + "licenseId": "AFL-1.1", + "seeAlso": [ + "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", + "http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php" + ], + "isOsiApproved": true + }, + { + "reference": "./AFL-1.2.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AFL-1.2.json", + "referenceNumber": "222", + "name": "Academic Free License v1.2", + "licenseId": "AFL-1.2", + "seeAlso": [ + "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", + "http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php" + ], + "isOsiApproved": true + }, + { + "reference": "./AFL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AFL-2.0.json", + "referenceNumber": "341", + "name": "Academic Free License v2.0", + "licenseId": "AFL-2.0", + "seeAlso": [ + "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt" + ], + "isOsiApproved": true + }, + { + "reference": "./AFL-2.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AFL-2.1.json", + "referenceNumber": "249", + "name": "Academic Free License v2.1", + "licenseId": "AFL-2.1", + "seeAlso": [ + "http://opensource.linux-mirror.org/licenses/afl-2.1.txt" + ], + "isOsiApproved": true + }, + { + "reference": "./AFL-3.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AFL-3.0.json", + "referenceNumber": "361", + "name": "Academic Free License v3.0", + "licenseId": "AFL-3.0", + "seeAlso": [ + "http://www.rosenlaw.com/AFL3.0.htm", + "https://opensource.org/licenses/afl-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./AGPL-1.0.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AGPL-1.0.json", + "referenceNumber": "175", + "name": "Affero General Public License v1.0", + "licenseId": "AGPL-1.0", + "seeAlso": [ + "http://www.affero.org/oagpl.html" + ], + "isOsiApproved": false + }, + { + "reference": "./AGPL-1.0-only.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/AGPL-1.0-only.json", + "referenceNumber": "71", + "name": "Affero General Public License v1.0 only", + "licenseId": "AGPL-1.0-only", + "seeAlso": [ + "http://www.affero.org/oagpl.html" + ], + "isOsiApproved": false + }, + { + "reference": "./AGPL-1.0-or-later.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/AGPL-1.0-or-later.json", + "referenceNumber": "168", + "name": "Affero General Public License v1.0 or later", + "licenseId": "AGPL-1.0-or-later", + "seeAlso": [ + "http://www.affero.org/oagpl.html" + ], + "isOsiApproved": false + }, + { + "reference": "./AGPL-3.0.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AGPL-3.0.json", + "referenceNumber": "148", + "name": "GNU Affero General Public License v3.0", + "licenseId": "AGPL-3.0", + "seeAlso": [ + "https://www.gnu.org/licenses/agpl.txt", + "https://opensource.org/licenses/AGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./AGPL-3.0-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AGPL-3.0-only.json", + "referenceNumber": "298", + "name": "GNU Affero General Public License v3.0 only", + "licenseId": "AGPL-3.0-only", + "seeAlso": [ + "https://www.gnu.org/licenses/agpl.txt", + "https://opensource.org/licenses/AGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./AGPL-3.0-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/AGPL-3.0-or-later.json", + "referenceNumber": "160", + "name": "GNU Affero General Public License v3.0 or later", + "licenseId": "AGPL-3.0-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/agpl.txt", + "https://opensource.org/licenses/AGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./AMDPLPA.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/AMDPLPA.json", + "referenceNumber": "133", + "name": "AMD\u0027s plpa_map.c License", + "licenseId": "AMDPLPA", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License" + ], + "isOsiApproved": false + }, + { + "reference": "./AML.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/AML.json", + "referenceNumber": "157", + "name": "Apple MIT License", + "licenseId": "AML", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License" + ], + "isOsiApproved": false + }, + { + "reference": "./AMPAS.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/AMPAS.json", + "referenceNumber": "136", + "name": "Academy of Motion Picture Arts and Sciences BSD", + "licenseId": "AMPAS", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD" + ], + "isOsiApproved": false + }, + { + "reference": "./ANTLR-PD.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ANTLR-PD.json", + "referenceNumber": "44", + "name": "ANTLR Software Rights Notice", + "licenseId": "ANTLR-PD", + "seeAlso": [ + "http://www.antlr2.org/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./APAFML.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/APAFML.json", + "referenceNumber": "248", + "name": "Adobe Postscript AFM License", + "licenseId": "APAFML", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM" + ], + "isOsiApproved": false + }, + { + "reference": "./APL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/APL-1.0.json", + "referenceNumber": "278", + "name": "Adaptive Public License 1.0", + "licenseId": "APL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/APL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./APSL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/APSL-1.0.json", + "referenceNumber": "387", + "name": "Apple Public Source License 1.0", + "licenseId": "APSL-1.0", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./APSL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/APSL-1.1.json", + "referenceNumber": "338", + "name": "Apple Public Source License 1.1", + "licenseId": "APSL-1.1", + "seeAlso": [ + "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE" + ], + "isOsiApproved": true + }, + { + "reference": "./APSL-1.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/APSL-1.2.json", + "referenceNumber": "201", + "name": "Apple Public Source License 1.2", + "licenseId": "APSL-1.2", + "seeAlso": [ + "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php" + ], + "isOsiApproved": true + }, + { + "reference": "./APSL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/APSL-2.0.json", + "referenceNumber": "141", + "name": "Apple Public Source License 2.0", + "licenseId": "APSL-2.0", + "seeAlso": [ + "http://www.opensource.apple.com/license/apsl/" + ], + "isOsiApproved": true + }, + { + "reference": "./Abstyles.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Abstyles.json", + "referenceNumber": "75", + "name": "Abstyles License", + "licenseId": "Abstyles", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Abstyles" + ], + "isOsiApproved": false + }, + { + "reference": "./Adobe-2006.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Adobe-2006.json", + "referenceNumber": "310", + "name": "Adobe Systems Incorporated Source Code License Agreement", + "licenseId": "Adobe-2006", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/AdobeLicense" + ], + "isOsiApproved": false + }, + { + "reference": "./Adobe-Glyph.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Adobe-Glyph.json", + "referenceNumber": "343", + "name": "Adobe Glyph List License", + "licenseId": "Adobe-Glyph", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph" + ], + "isOsiApproved": false + }, + { + "reference": "./Afmparse.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Afmparse.json", + "referenceNumber": "332", + "name": "Afmparse License", + "licenseId": "Afmparse", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Afmparse" + ], + "isOsiApproved": false + }, + { + "reference": "./Aladdin.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Aladdin.json", + "referenceNumber": "315", + "name": "Aladdin Free Public License", + "licenseId": "Aladdin", + "seeAlso": [ + "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm" + ], + "isOsiApproved": false + }, + { + "reference": "./Apache-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Apache-1.0.json", + "referenceNumber": "32", + "name": "Apache License 1.0", + "licenseId": "Apache-1.0", + "seeAlso": [ + "http://www.apache.org/licenses/LICENSE-1.0" + ], + "isOsiApproved": false + }, + { + "reference": "./Apache-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Apache-1.1.json", + "referenceNumber": "274", + "name": "Apache License 1.1", + "licenseId": "Apache-1.1", + "seeAlso": [ + "http://apache.org/licenses/LICENSE-1.1", + "https://opensource.org/licenses/Apache-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./Apache-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Apache-2.0.json", + "referenceNumber": "366", + "name": "Apache License 2.0", + "licenseId": "Apache-2.0", + "seeAlso": [ + "http://www.apache.org/licenses/LICENSE-2.0", + "https://opensource.org/licenses/Apache-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Artistic-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Artistic-1.0.json", + "referenceNumber": "273", + "name": "Artistic License 1.0", + "licenseId": "Artistic-1.0", + "seeAlso": [ + "https://opensource.org/licenses/Artistic-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Artistic-1.0-Perl.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Artistic-1.0-Perl.json", + "referenceNumber": "306", + "name": "Artistic License 1.0 (Perl)", + "licenseId": "Artistic-1.0-Perl", + "seeAlso": [ + "http://dev.perl.org/licenses/artistic.html" + ], + "isOsiApproved": true + }, + { + "reference": "./Artistic-1.0-cl8.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Artistic-1.0-cl8.json", + "referenceNumber": "229", + "name": "Artistic License 1.0 w/clause 8", + "licenseId": "Artistic-1.0-cl8", + "seeAlso": [ + "https://opensource.org/licenses/Artistic-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Artistic-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Artistic-2.0.json", + "referenceNumber": "78", + "name": "Artistic License 2.0", + "licenseId": "Artistic-2.0", + "seeAlso": [ + "http://www.perlfoundation.org/artistic_license_2_0", + "https://opensource.org/licenses/artistic-license-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./BSD-1-Clause.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-1-Clause.json", + "referenceNumber": "389", + "name": "BSD 1-Clause License", + "licenseId": "BSD-1-Clause", + "seeAlso": [ + "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision\u003d326823" + ], + "isOsiApproved": true + }, + { + "reference": "./BSD-2-Clause.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause.json", + "referenceNumber": "307", + "name": "BSD 2-Clause \"Simplified\" License", + "licenseId": "BSD-2-Clause", + "seeAlso": [ + "https://opensource.org/licenses/BSD-2-Clause" + ], + "isOsiApproved": true + }, + { + "reference": "./BSD-2-Clause-FreeBSD.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", + "referenceNumber": "281", + "name": "BSD 2-Clause FreeBSD License", + "licenseId": "BSD-2-Clause-FreeBSD", + "seeAlso": [ + "http://www.freebsd.org/copyright/freebsd-license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-2-Clause-NetBSD.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause-NetBSD.json", + "referenceNumber": "186", + "name": "BSD 2-Clause NetBSD License", + "licenseId": "BSD-2-Clause-NetBSD", + "seeAlso": [ + "http://www.netbsd.org/about/redistribution.html#default" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-2-Clause-Patent.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause-Patent.json", + "referenceNumber": "362", + "name": "BSD-2-Clause Plus Patent License", + "licenseId": "BSD-2-Clause-Patent", + "seeAlso": [ + "https://opensource.org/licenses/BSDplusPatent" + ], + "isOsiApproved": true + }, + { + "reference": "./BSD-3-Clause.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause.json", + "referenceNumber": "202", + "name": "BSD 3-Clause \"New\" or \"Revised\" License", + "licenseId": "BSD-3-Clause", + "seeAlso": [ + "https://opensource.org/licenses/BSD-3-Clause" + ], + "isOsiApproved": true + }, + { + "reference": "./BSD-3-Clause-Attribution.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-Attribution.json", + "referenceNumber": "39", + "name": "BSD with attribution", + "licenseId": "BSD-3-Clause-Attribution", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-3-Clause-Clear.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-Clear.json", + "referenceNumber": "88", + "name": "BSD 3-Clause Clear License", + "licenseId": "BSD-3-Clause-Clear", + "seeAlso": [ + "http://labs.metacarta.com/license-explanation.html#license" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-3-Clause-LBNL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-LBNL.json", + "referenceNumber": "147", + "name": "Lawrence Berkeley National Labs BSD variant license", + "licenseId": "BSD-3-Clause-LBNL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/LBNLBSD" + ], + "isOsiApproved": true + }, + { + "reference": "./BSD-3-Clause-No-Nuclear-License.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json", + "referenceNumber": "62", + "name": "BSD 3-Clause No Nuclear License", + "licenseId": "BSD-3-Clause-No-Nuclear-License", + "seeAlso": [ + "http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam\u003d1467140197_43d516ce1776bd08a58235a7785be1cc" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-3-Clause-No-Nuclear-License-2014.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json", + "referenceNumber": "342", + "name": "BSD 3-Clause No Nuclear License 2014", + "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", + "seeAlso": [ + "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-3-Clause-No-Nuclear-Warranty.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json", + "referenceNumber": "117", + "name": "BSD 3-Clause No Nuclear Warranty", + "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", + "seeAlso": [ + "https://jogamp.org/git/?p\u003dgluegen.git;a\u003dblob_plain;f\u003dLICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-3-Clause-Open-MPI.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-Open-MPI.json", + "referenceNumber": "214", + "name": "BSD 3-Clause Open MPI variant", + "licenseId": "BSD-3-Clause-Open-MPI", + "seeAlso": [ + "https://www.open-mpi.org/community/license.php", + "http://www.netlib.org/lapack/LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-4-Clause.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/BSD-4-Clause.json", + "referenceNumber": "69", + "name": "BSD 4-Clause \"Original\" or \"Old\" License", + "licenseId": "BSD-4-Clause", + "seeAlso": [ + "http://directory.fsf.org/wiki/License:BSD_4Clause" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-4-Clause-UC.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-4-Clause-UC.json", + "referenceNumber": "372", + "name": "BSD-4-Clause (University of California-Specific)", + "licenseId": "BSD-4-Clause-UC", + "seeAlso": [ + "http://www.freebsd.org/copyright/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-Protection.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-Protection.json", + "referenceNumber": "400", + "name": "BSD Protection License", + "licenseId": "BSD-Protection", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License" + ], + "isOsiApproved": false + }, + { + "reference": "./BSD-Source-Code.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BSD-Source-Code.json", + "referenceNumber": "169", + "name": "BSD Source Code Attribution", + "licenseId": "BSD-Source-Code", + "seeAlso": [ + "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./BSL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/BSL-1.0.json", + "referenceNumber": "295", + "name": "Boost Software License 1.0", + "licenseId": "BSL-1.0", + "seeAlso": [ + "http://www.boost.org/LICENSE_1_0.txt", + "https://opensource.org/licenses/BSL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Bahyph.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Bahyph.json", + "referenceNumber": "151", + "name": "Bahyph License", + "licenseId": "Bahyph", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Bahyph" + ], + "isOsiApproved": false + }, + { + "reference": "./Barr.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Barr.json", + "referenceNumber": "128", + "name": "Barr License", + "licenseId": "Barr", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Barr" + ], + "isOsiApproved": false + }, + { + "reference": "./Beerware.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Beerware.json", + "referenceNumber": "251", + "name": "Beerware License", + "licenseId": "Beerware", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Beerware", + "https://people.freebsd.org/~phk/" + ], + "isOsiApproved": false + }, + { + "reference": "./BitTorrent-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BitTorrent-1.0.json", + "referenceNumber": "207", + "name": "BitTorrent Open Source License v1.0", + "licenseId": "BitTorrent-1.0", + "seeAlso": [ + "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1\u003d1.1\u0026r2\u003d1.1.1.1\u0026diff_format\u003ds" + ], + "isOsiApproved": false + }, + { + "reference": "./BitTorrent-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/BitTorrent-1.1.json", + "referenceNumber": "188", + "name": "BitTorrent Open Source License v1.1", + "licenseId": "BitTorrent-1.1", + "seeAlso": [ + "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1" + ], + "isOsiApproved": false + }, + { + "reference": "./BlueOak-1.0.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/BlueOak-1.0.0.json", + "referenceNumber": "211", + "name": "Blue Oak Model License 1.0.0", + "licenseId": "BlueOak-1.0.0", + "seeAlso": [ + "https://blueoakcouncil.org/license/1.0.0" + ], + "isOsiApproved": false + }, + { + "reference": "./Borceux.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Borceux.json", + "referenceNumber": "305", + "name": "Borceux license", + "licenseId": "Borceux", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Borceux" + ], + "isOsiApproved": false + }, + { + "reference": "./CAL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CAL-1.0.json", + "referenceNumber": "59", + "name": "Cryptographic Autonomy License 1.0", + "licenseId": "CAL-1.0", + "seeAlso": [ + "http://cryptographicautonomylicense.com/license-text.html", + "https://opensource.org/licenses/CAL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./CAL-1.0-Combined-Work-Exception.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json", + "referenceNumber": "80", + "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", + "licenseId": "CAL-1.0-Combined-Work-Exception", + "seeAlso": [ + "http://cryptographicautonomylicense.com/license-text.html", + "https://opensource.org/licenses/CAL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./CATOSL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CATOSL-1.1.json", + "referenceNumber": "234", + "name": "Computer Associates Trusted Open Source License 1.1", + "licenseId": "CATOSL-1.1", + "seeAlso": [ + "https://opensource.org/licenses/CATOSL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./CC-BY-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-1.0.json", + "referenceNumber": "23", + "name": "Creative Commons Attribution 1.0 Generic", + "licenseId": "CC-BY-1.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-2.0.json", + "referenceNumber": "61", + "name": "Creative Commons Attribution 2.0 Generic", + "licenseId": "CC-BY-2.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by/2.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-2.5.json", + "referenceNumber": "187", + "name": "Creative Commons Attribution 2.5 Generic", + "licenseId": "CC-BY-2.5", + "seeAlso": [ + "https://creativecommons.org/licenses/by/2.5/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-3.0.json", + "referenceNumber": "344", + "name": "Creative Commons Attribution 3.0 Unported", + "licenseId": "CC-BY-3.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by/3.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-4.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CC-BY-4.0.json", + "referenceNumber": "218", + "name": "Creative Commons Attribution 4.0 International", + "licenseId": "CC-BY-4.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by/4.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-1.0.json", + "referenceNumber": "231", + "name": "Creative Commons Attribution Non Commercial 1.0 Generic", + "licenseId": "CC-BY-NC-1.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-2.0.json", + "referenceNumber": "326", + "name": "Creative Commons Attribution Non Commercial 2.0 Generic", + "licenseId": "CC-BY-NC-2.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc/2.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-2.5.json", + "referenceNumber": "398", + "name": "Creative Commons Attribution Non Commercial 2.5 Generic", + "licenseId": "CC-BY-NC-2.5", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc/2.5/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-3.0.json", + "referenceNumber": "336", + "name": "Creative Commons Attribution Non Commercial 3.0 Unported", + "licenseId": "CC-BY-NC-3.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc/3.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-4.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-4.0.json", + "referenceNumber": "272", + "name": "Creative Commons Attribution Non Commercial 4.0 International", + "licenseId": "CC-BY-NC-4.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc/4.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-ND-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-1.0.json", + "referenceNumber": "102", + "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", + "licenseId": "CC-BY-NC-ND-1.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-ND-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-2.0.json", + "referenceNumber": "138", + "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", + "licenseId": "CC-BY-NC-ND-2.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-ND-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-2.5.json", + "referenceNumber": "30", + "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", + "licenseId": "CC-BY-NC-ND-2.5", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-ND-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-3.0.json", + "referenceNumber": "41", + "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", + "licenseId": "CC-BY-NC-ND-3.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-ND-4.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-4.0.json", + "referenceNumber": "172", + "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "licenseId": "CC-BY-NC-ND-4.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-SA-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-1.0.json", + "referenceNumber": "120", + "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", + "licenseId": "CC-BY-NC-SA-1.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-SA-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-2.0.json", + "referenceNumber": "411", + "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", + "licenseId": "CC-BY-NC-SA-2.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-SA-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-2.5.json", + "referenceNumber": "215", + "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", + "licenseId": "CC-BY-NC-SA-2.5", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-SA-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-3.0.json", + "referenceNumber": "360", + "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", + "licenseId": "CC-BY-NC-SA-3.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-NC-SA-4.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-4.0.json", + "referenceNumber": "331", + "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", + "licenseId": "CC-BY-NC-SA-4.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-ND-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-1.0.json", + "referenceNumber": "94", + "name": "Creative Commons Attribution No Derivatives 1.0 Generic", + "licenseId": "CC-BY-ND-1.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nd/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-ND-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-2.0.json", + "referenceNumber": "46", + "name": "Creative Commons Attribution No Derivatives 2.0 Generic", + "licenseId": "CC-BY-ND-2.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nd/2.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-ND-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-2.5.json", + "referenceNumber": "27", + "name": "Creative Commons Attribution No Derivatives 2.5 Generic", + "licenseId": "CC-BY-ND-2.5", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nd/2.5/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-ND-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-3.0.json", + "referenceNumber": "284", + "name": "Creative Commons Attribution No Derivatives 3.0 Unported", + "licenseId": "CC-BY-ND-3.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nd/3.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-ND-4.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-4.0.json", + "referenceNumber": "318", + "name": "Creative Commons Attribution No Derivatives 4.0 International", + "licenseId": "CC-BY-ND-4.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-nd/4.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-SA-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-1.0.json", + "referenceNumber": "403", + "name": "Creative Commons Attribution Share Alike 1.0 Generic", + "licenseId": "CC-BY-SA-1.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-sa/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-SA-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-2.0.json", + "referenceNumber": "367", + "name": "Creative Commons Attribution Share Alike 2.0 Generic", + "licenseId": "CC-BY-SA-2.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-sa/2.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-SA-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-2.5.json", + "referenceNumber": "203", + "name": "Creative Commons Attribution Share Alike 2.5 Generic", + "licenseId": "CC-BY-SA-2.5", + "seeAlso": [ + "https://creativecommons.org/licenses/by-sa/2.5/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-SA-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-3.0.json", + "referenceNumber": "233", + "name": "Creative Commons Attribution Share Alike 3.0 Unported", + "licenseId": "CC-BY-SA-3.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-sa/3.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-BY-SA-4.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-4.0.json", + "referenceNumber": "297", + "name": "Creative Commons Attribution Share Alike 4.0 International", + "licenseId": "CC-BY-SA-4.0", + "seeAlso": [ + "https://creativecommons.org/licenses/by-sa/4.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CC-PDDC.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CC-PDDC.json", + "referenceNumber": "92", + "name": "Creative Commons Public Domain Dedication and Certification", + "licenseId": "CC-PDDC", + "seeAlso": [ + "https://creativecommons.org/licenses/publicdomain/" + ], + "isOsiApproved": false + }, + { + "reference": "./CC0-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CC0-1.0.json", + "referenceNumber": "66", + "name": "Creative Commons Zero v1.0 Universal", + "licenseId": "CC0-1.0", + "seeAlso": [ + "https://creativecommons.org/publicdomain/zero/1.0/legalcode" + ], + "isOsiApproved": false + }, + { + "reference": "./CDDL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CDDL-1.0.json", + "referenceNumber": "335", + "name": "Common Development and Distribution License 1.0", + "licenseId": "CDDL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/cddl1" + ], + "isOsiApproved": true + }, + { + "reference": "./CDDL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CDDL-1.1.json", + "referenceNumber": "283", + "name": "Common Development and Distribution License 1.1", + "licenseId": "CDDL-1.1", + "seeAlso": [ + "http://glassfish.java.net/public/CDDL+GPL_1_1.html", + "https://javaee.github.io/glassfish/LICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./CDLA-Permissive-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CDLA-Permissive-1.0.json", + "referenceNumber": "108", + "name": "Community Data License Agreement Permissive 1.0", + "licenseId": "CDLA-Permissive-1.0", + "seeAlso": [ + "https://cdla.io/permissive-1-0" + ], + "isOsiApproved": false + }, + { + "reference": "./CDLA-Sharing-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CDLA-Sharing-1.0.json", + "referenceNumber": "178", + "name": "Community Data License Agreement Sharing 1.0", + "licenseId": "CDLA-Sharing-1.0", + "seeAlso": [ + "https://cdla.io/sharing-1-0" + ], + "isOsiApproved": false + }, + { + "reference": "./CECILL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CECILL-1.0.json", + "referenceNumber": "10", + "name": "CeCILL Free Software License Agreement v1.0", + "licenseId": "CECILL-1.0", + "seeAlso": [ + "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html" + ], + "isOsiApproved": false + }, + { + "reference": "./CECILL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CECILL-1.1.json", + "referenceNumber": "135", + "name": "CeCILL Free Software License Agreement v1.1", + "licenseId": "CECILL-1.1", + "seeAlso": [ + "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html" + ], + "isOsiApproved": false + }, + { + "reference": "./CECILL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CECILL-2.0.json", + "referenceNumber": "5", + "name": "CeCILL Free Software License Agreement v2.0", + "licenseId": "CECILL-2.0", + "seeAlso": [ + "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html" + ], + "isOsiApproved": false + }, + { + "reference": "./CECILL-2.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CECILL-2.1.json", + "referenceNumber": "145", + "name": "CeCILL Free Software License Agreement v2.1", + "licenseId": "CECILL-2.1", + "seeAlso": [ + "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html" + ], + "isOsiApproved": true + }, + { + "reference": "./CECILL-B.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CECILL-B.json", + "referenceNumber": "93", + "name": "CeCILL-B Free Software License Agreement", + "licenseId": "CECILL-B", + "seeAlso": [ + "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html" + ], + "isOsiApproved": false + }, + { + "reference": "./CECILL-C.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CECILL-C.json", + "referenceNumber": "240", + "name": "CeCILL-C Free Software License Agreement", + "licenseId": "CECILL-C", + "seeAlso": [ + "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html" + ], + "isOsiApproved": false + }, + { + "reference": "./CERN-OHL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CERN-OHL-1.1.json", + "referenceNumber": "123", + "name": "CERN Open Hardware Licence v1.1", + "licenseId": "CERN-OHL-1.1", + "seeAlso": [ + "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1" + ], + "isOsiApproved": false + }, + { + "reference": "./CERN-OHL-1.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CERN-OHL-1.2.json", + "referenceNumber": "167", + "name": "CERN Open Hardware Licence v1.2", + "licenseId": "CERN-OHL-1.2", + "seeAlso": [ + "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2" + ], + "isOsiApproved": false + }, + { + "reference": "./CERN-OHL-P-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CERN-OHL-P-2.0.json", + "referenceNumber": "255", + "name": "CERN Open Hardware Licence Version 2 - Permissive", + "licenseId": "CERN-OHL-P-2.0", + "seeAlso": [ + "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" + ], + "isOsiApproved": false + }, + { + "reference": "./CERN-OHL-S-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CERN-OHL-S-2.0.json", + "referenceNumber": "47", + "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", + "licenseId": "CERN-OHL-S-2.0", + "seeAlso": [ + "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" + ], + "isOsiApproved": false + }, + { + "reference": "./CERN-OHL-W-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CERN-OHL-W-2.0.json", + "referenceNumber": "267", + "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", + "licenseId": "CERN-OHL-W-2.0", + "seeAlso": [ + "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" + ], + "isOsiApproved": false + }, + { + "reference": "./CNRI-Jython.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CNRI-Jython.json", + "referenceNumber": "77", + "name": "CNRI Jython License", + "licenseId": "CNRI-Jython", + "seeAlso": [ + "http://www.jython.org/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./CNRI-Python.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CNRI-Python.json", + "referenceNumber": "96", + "name": "CNRI Python License", + "licenseId": "CNRI-Python", + "seeAlso": [ + "https://opensource.org/licenses/CNRI-Python" + ], + "isOsiApproved": true + }, + { + "reference": "./CNRI-Python-GPL-Compatible.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", + "referenceNumber": "348", + "name": "CNRI Python Open Source GPL Compatible License Agreement", + "licenseId": "CNRI-Python-GPL-Compatible", + "seeAlso": [ + "http://www.python.org/download/releases/1.6.1/download_win/" + ], + "isOsiApproved": false + }, + { + "reference": "./CPAL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CPAL-1.0.json", + "referenceNumber": "285", + "name": "Common Public Attribution License 1.0", + "licenseId": "CPAL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/CPAL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./CPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/CPL-1.0.json", + "referenceNumber": "236", + "name": "Common Public License 1.0", + "licenseId": "CPL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/CPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./CPOL-1.02.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CPOL-1.02.json", + "referenceNumber": "230", + "name": "Code Project Open License 1.02", + "licenseId": "CPOL-1.02", + "seeAlso": [ + "http://www.codeproject.com/info/cpol10.aspx" + ], + "isOsiApproved": false + }, + { + "reference": "./CUA-OPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CUA-OPL-1.0.json", + "referenceNumber": "165", + "name": "CUA Office Public License v1.0", + "licenseId": "CUA-OPL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/CUA-OPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Caldera.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Caldera.json", + "referenceNumber": "250", + "name": "Caldera License", + "licenseId": "Caldera", + "seeAlso": [ + "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf" + ], + "isOsiApproved": false + }, + { + "reference": "./ClArtistic.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/ClArtistic.json", + "referenceNumber": "245", + "name": "Clarified Artistic License", + "licenseId": "ClArtistic", + "seeAlso": [ + "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", + "http://www.ncftp.com/ncftp/doc/LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./Condor-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Condor-1.1.json", + "referenceNumber": "150", + "name": "Condor Public License v1.1", + "licenseId": "Condor-1.1", + "seeAlso": [ + "http://research.cs.wisc.edu/condor/license.html#condor", + "http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor" + ], + "isOsiApproved": false + }, + { + "reference": "./Crossword.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Crossword.json", + "referenceNumber": "101", + "name": "Crossword License", + "licenseId": "Crossword", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Crossword" + ], + "isOsiApproved": false + }, + { + "reference": "./CrystalStacker.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/CrystalStacker.json", + "referenceNumber": "38", + "name": "CrystalStacker License", + "licenseId": "CrystalStacker", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd\u003dLicensing/CrystalStacker" + ], + "isOsiApproved": false + }, + { + "reference": "./Cube.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Cube.json", + "referenceNumber": "391", + "name": "Cube License", + "licenseId": "Cube", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Cube" + ], + "isOsiApproved": false + }, + { + "reference": "./D-FSL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/D-FSL-1.0.json", + "referenceNumber": "358", + "name": "Deutsche Freie Software Lizenz", + "licenseId": "D-FSL-1.0", + "seeAlso": [ + "http://www.dipp.nrw.de/d-fsl/lizenzen/", + "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt", + "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt", + "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl", + "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz", + "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license", + "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file", + "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file" + ], + "isOsiApproved": false + }, + { + "reference": "./DOC.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/DOC.json", + "referenceNumber": "275", + "name": "DOC License", + "licenseId": "DOC", + "seeAlso": [ + "http://www.cs.wustl.edu/~schmidt/ACE-copying.html" + ], + "isOsiApproved": false + }, + { + "reference": "./DSDP.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/DSDP.json", + "referenceNumber": "266", + "name": "DSDP License", + "licenseId": "DSDP", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/DSDP" + ], + "isOsiApproved": false + }, + { + "reference": "./Dotseqn.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Dotseqn.json", + "referenceNumber": "33", + "name": "Dotseqn License", + "licenseId": "Dotseqn", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Dotseqn" + ], + "isOsiApproved": false + }, + { + "reference": "./ECL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ECL-1.0.json", + "referenceNumber": "418", + "name": "Educational Community License v1.0", + "licenseId": "ECL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/ECL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./ECL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/ECL-2.0.json", + "referenceNumber": "1", + "name": "Educational Community License v2.0", + "licenseId": "ECL-2.0", + "seeAlso": [ + "https://opensource.org/licenses/ECL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./EFL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/EFL-1.0.json", + "referenceNumber": "76", + "name": "Eiffel Forum License v1.0", + "licenseId": "EFL-1.0", + "seeAlso": [ + "http://www.eiffel-nice.org/license/forum.txt", + "https://opensource.org/licenses/EFL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./EFL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/EFL-2.0.json", + "referenceNumber": "7", + "name": "Eiffel Forum License v2.0", + "licenseId": "EFL-2.0", + "seeAlso": [ + "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", + "https://opensource.org/licenses/EFL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./EPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/EPL-1.0.json", + "referenceNumber": "277", + "name": "Eclipse Public License 1.0", + "licenseId": "EPL-1.0", + "seeAlso": [ + "http://www.eclipse.org/legal/epl-v10.html", + "https://opensource.org/licenses/EPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./EPL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/EPL-2.0.json", + "referenceNumber": "416", + "name": "Eclipse Public License 2.0", + "licenseId": "EPL-2.0", + "seeAlso": [ + "https://www.eclipse.org/legal/epl-2.0", + "https://www.opensource.org/licenses/EPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./EUDatagrid.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/EUDatagrid.json", + "referenceNumber": "263", + "name": "EU DataGrid Software License", + "licenseId": "EUDatagrid", + "seeAlso": [ + "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", + "https://opensource.org/licenses/EUDatagrid" + ], + "isOsiApproved": true + }, + { + "reference": "./EUPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/EUPL-1.0.json", + "referenceNumber": "98", + "name": "European Union Public License 1.0", + "licenseId": "EUPL-1.0", + "seeAlso": [ + "http://ec.europa.eu/idabc/en/document/7330.html", + "http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id\u003d31096" + ], + "isOsiApproved": false + }, + { + "reference": "./EUPL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/EUPL-1.1.json", + "referenceNumber": "409", + "name": "European Union Public License 1.1", + "licenseId": "EUPL-1.1", + "seeAlso": [ + "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", + "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf", + "https://opensource.org/licenses/EUPL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./EUPL-1.2.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/EUPL-1.2.json", + "referenceNumber": "271", + "name": "European Union Public License 1.2", + "licenseId": "EUPL-1.2", + "seeAlso": [ + "https://joinup.ec.europa.eu/page/eupl-text-11-12", + "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf", + "https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt", + "http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri\u003dCELEX:32017D0863", + "https://opensource.org/licenses/EUPL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./Entessa.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Entessa.json", + "referenceNumber": "386", + "name": "Entessa Public License v1.0", + "licenseId": "Entessa", + "seeAlso": [ + "https://opensource.org/licenses/Entessa" + ], + "isOsiApproved": true + }, + { + "reference": "./ErlPL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ErlPL-1.1.json", + "referenceNumber": "408", + "name": "Erlang Public License v1.1", + "licenseId": "ErlPL-1.1", + "seeAlso": [ + "http://www.erlang.org/EPLICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./Eurosym.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Eurosym.json", + "referenceNumber": "171", + "name": "Eurosym License", + "licenseId": "Eurosym", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Eurosym" + ], + "isOsiApproved": false + }, + { + "reference": "./FSFAP.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/FSFAP.json", + "referenceNumber": "394", + "name": "FSF All Permissive License", + "licenseId": "FSFAP", + "seeAlso": [ + "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html" + ], + "isOsiApproved": false + }, + { + "reference": "./FSFUL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/FSFUL.json", + "referenceNumber": "2", + "name": "FSF Unlimited License", + "licenseId": "FSFUL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License" + ], + "isOsiApproved": false + }, + { + "reference": "./FSFULLR.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/FSFULLR.json", + "referenceNumber": "308", + "name": "FSF Unlimited License (with License Retention)", + "licenseId": "FSFULLR", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant" + ], + "isOsiApproved": false + }, + { + "reference": "./FTL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/FTL.json", + "referenceNumber": "374", + "name": "Freetype Project License", + "licenseId": "FTL", + "seeAlso": [ + "http://freetype.fis.uniroma2.it/FTL.TXT", + "http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT" + ], + "isOsiApproved": false + }, + { + "reference": "./Fair.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Fair.json", + "referenceNumber": "262", + "name": "Fair License", + "licenseId": "Fair", + "seeAlso": [ + "http://fairlicense.org/", + "https://opensource.org/licenses/Fair" + ], + "isOsiApproved": true + }, + { + "reference": "./Frameworx-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Frameworx-1.0.json", + "referenceNumber": "373", + "name": "Frameworx Open License 1.0", + "licenseId": "Frameworx-1.0", + "seeAlso": [ + "https://opensource.org/licenses/Frameworx-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./FreeImage.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/FreeImage.json", + "referenceNumber": "370", + "name": "FreeImage Public License v1.0", + "licenseId": "FreeImage", + "seeAlso": [ + "http://freeimage.sourceforge.net/freeimage-license.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.1.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.1.json", + "referenceNumber": "257", + "name": "GNU Free Documentation License v1.1", + "licenseId": "GFDL-1.1", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.1-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-only.json", + "referenceNumber": "104", + "name": "GNU Free Documentation License v1.1 only", + "licenseId": "GFDL-1.1-only", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.1-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-or-later.json", + "referenceNumber": "124", + "name": "GNU Free Documentation License v1.1 or later", + "licenseId": "GFDL-1.1-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.2.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.2.json", + "referenceNumber": "197", + "name": "GNU Free Documentation License v1.2", + "licenseId": "GFDL-1.2", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.2-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-only.json", + "referenceNumber": "90", + "name": "GNU Free Documentation License v1.2 only", + "licenseId": "GFDL-1.2-only", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.2-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-or-later.json", + "referenceNumber": "132", + "name": "GNU Free Documentation License v1.2 or later", + "licenseId": "GFDL-1.2-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.3.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.3.json", + "referenceNumber": "365", + "name": "GNU Free Documentation License v1.3", + "licenseId": "GFDL-1.3", + "seeAlso": [ + "https://www.gnu.org/licenses/fdl-1.3.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.3-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-only.json", + "referenceNumber": "200", + "name": "GNU Free Documentation License v1.3 only", + "licenseId": "GFDL-1.3-only", + "seeAlso": [ + "https://www.gnu.org/licenses/fdl-1.3.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GFDL-1.3-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-or-later.json", + "referenceNumber": "53", + "name": "GNU Free Documentation License v1.3 or later", + "licenseId": "GFDL-1.3-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/fdl-1.3.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./GL2PS.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/GL2PS.json", + "referenceNumber": "314", + "name": "GL2PS License", + "licenseId": "GL2PS", + "seeAlso": [ + "http://www.geuz.org/gl2ps/COPYING.GL2PS" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-1.0.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-1.0.json", + "referenceNumber": "330", + "name": "GNU General Public License v1.0 only", + "licenseId": "GPL-1.0", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-1.0+.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-1.0+.json", + "referenceNumber": "205", + "name": "GNU General Public License v1.0 or later", + "licenseId": "GPL-1.0+", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-1.0-only.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/GPL-1.0-only.json", + "referenceNumber": "15", + "name": "GNU General Public License v1.0 only", + "licenseId": "GPL-1.0-only", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-1.0-or-later.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/GPL-1.0-or-later.json", + "referenceNumber": "134", + "name": "GNU General Public License v1.0 or later", + "licenseId": "GPL-1.0-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-2.0.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0.json", + "referenceNumber": "356", + "name": "GNU General Public License v2.0 only", + "licenseId": "GPL-2.0", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "https://opensource.org/licenses/GPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-2.0+.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0+.json", + "referenceNumber": "401", + "name": "GNU General Public License v2.0 or later", + "licenseId": "GPL-2.0+", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "https://opensource.org/licenses/GPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-2.0-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-only.json", + "referenceNumber": "235", + "name": "GNU General Public License v2.0 only", + "licenseId": "GPL-2.0-only", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "https://opensource.org/licenses/GPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-2.0-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-or-later.json", + "referenceNumber": "258", + "name": "GNU General Public License v2.0 or later", + "licenseId": "GPL-2.0-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "https://opensource.org/licenses/GPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-2.0-with-GCC-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-GCC-exception.json", + "referenceNumber": "340", + "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", + "licenseId": "GPL-2.0-with-GCC-exception", + "seeAlso": [ + "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-2.0-with-autoconf-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json", + "referenceNumber": "36", + "name": "GNU General Public License v2.0 w/Autoconf exception", + "licenseId": "GPL-2.0-with-autoconf-exception", + "seeAlso": [ + "http://ac-archive.sourceforge.net/doc/copyright.html" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-2.0-with-bison-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-bison-exception.json", + "referenceNumber": "371", + "name": "GNU General Public License v2.0 w/Bison exception", + "licenseId": "GPL-2.0-with-bison-exception", + "seeAlso": [ + "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-2.0-with-classpath-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-classpath-exception.json", + "referenceNumber": "227", + "name": "GNU General Public License v2.0 w/Classpath exception", + "licenseId": "GPL-2.0-with-classpath-exception", + "seeAlso": [ + "https://www.gnu.org/software/classpath/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-2.0-with-font-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-font-exception.json", + "referenceNumber": "24", + "name": "GNU General Public License v2.0 w/Font exception", + "licenseId": "GPL-2.0-with-font-exception", + "seeAlso": [ + "https://www.gnu.org/licenses/gpl-faq.html#FontException" + ], + "isOsiApproved": false + }, + { + "reference": "./GPL-3.0.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-3.0.json", + "referenceNumber": "414", + "name": "GNU General Public License v3.0 only", + "licenseId": "GPL-3.0", + "seeAlso": [ + "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "https://opensource.org/licenses/GPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-3.0+.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-3.0+.json", + "referenceNumber": "152", + "name": "GNU General Public License v3.0 or later", + "licenseId": "GPL-3.0+", + "seeAlso": [ + "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "https://opensource.org/licenses/GPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-3.0-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-3.0-only.json", + "referenceNumber": "127", + "name": "GNU General Public License v3.0 only", + "licenseId": "GPL-3.0-only", + "seeAlso": [ + "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "https://opensource.org/licenses/GPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-3.0-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/GPL-3.0-or-later.json", + "referenceNumber": "399", + "name": "GNU General Public License v3.0 or later", + "licenseId": "GPL-3.0-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/gpl-3.0-standalone.html", + "https://opensource.org/licenses/GPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-3.0-with-GCC-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-3.0-with-GCC-exception.json", + "referenceNumber": "6", + "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", + "licenseId": "GPL-3.0-with-GCC-exception", + "seeAlso": [ + "https://www.gnu.org/licenses/gcc-exception-3.1.html" + ], + "isOsiApproved": true + }, + { + "reference": "./GPL-3.0-with-autoconf-exception.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json", + "referenceNumber": "8", + "name": "GNU General Public License v3.0 w/Autoconf exception", + "licenseId": "GPL-3.0-with-autoconf-exception", + "seeAlso": [ + "https://www.gnu.org/licenses/autoconf-exception-3.0.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Giftware.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Giftware.json", + "referenceNumber": "379", + "name": "Giftware License", + "licenseId": "Giftware", + "seeAlso": [ + "http://liballeg.org/license.html#allegro-4-the-giftware-license" + ], + "isOsiApproved": false + }, + { + "reference": "./Glide.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Glide.json", + "referenceNumber": "121", + "name": "3dfx Glide License", + "licenseId": "Glide", + "seeAlso": [ + "http://www.users.on.net/~triforce/glidexp/COPYING.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./Glulxe.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Glulxe.json", + "referenceNumber": "206", + "name": "Glulxe License", + "licenseId": "Glulxe", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Glulxe" + ], + "isOsiApproved": false + }, + { + "reference": "./HPND.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/HPND.json", + "referenceNumber": "154", + "name": "Historical Permission Notice and Disclaimer", + "licenseId": "HPND", + "seeAlso": [ + "https://opensource.org/licenses/HPND" + ], + "isOsiApproved": true + }, + { + "reference": "./HPND-sell-variant.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/HPND-sell-variant.json", + "referenceNumber": "164", + "name": "Historical Permission Notice and Disclaimer - sell variant", + "licenseId": "HPND-sell-variant", + "seeAlso": [ + "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h\u003dv4.19" + ], + "isOsiApproved": false + }, + { + "reference": "./HaskellReport.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/HaskellReport.json", + "referenceNumber": "212", + "name": "Haskell Language Report License", + "licenseId": "HaskellReport", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License" + ], + "isOsiApproved": false + }, + { + "reference": "./Hippocratic-2.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Hippocratic-2.1.json", + "referenceNumber": "185", + "name": "Hippocratic License 2.1", + "licenseId": "Hippocratic-2.1", + "seeAlso": [ + "https://firstdonoharm.dev/version/2/1/license.html", + "https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./IBM-pibs.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/IBM-pibs.json", + "referenceNumber": "241", + "name": "IBM PowerPC Initialization and Boot Software", + "licenseId": "IBM-pibs", + "seeAlso": [ + "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003darch/powerpc/cpu/ppc4xx/miiphy.c;h\u003d297155fdafa064b955e53e9832de93bfb0cfb85b;hb\u003d9fab4bf4cc077c21e43941866f3f2c196f28670d" + ], + "isOsiApproved": false + }, + { + "reference": "./ICU.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ICU.json", + "referenceNumber": "180", + "name": "ICU License", + "licenseId": "ICU", + "seeAlso": [ + "http://source.icu-project.org/repos/icu/icu/trunk/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./IJG.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/IJG.json", + "referenceNumber": "244", + "name": "Independent JPEG Group License", + "licenseId": "IJG", + "seeAlso": [ + "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev\u003d1.2" + ], + "isOsiApproved": false + }, + { + "reference": "./IPA.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/IPA.json", + "referenceNumber": "321", + "name": "IPA Font License", + "licenseId": "IPA", + "seeAlso": [ + "https://opensource.org/licenses/IPA" + ], + "isOsiApproved": true + }, + { + "reference": "./IPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/IPL-1.0.json", + "referenceNumber": "320", + "name": "IBM Public License v1.0", + "licenseId": "IPL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/IPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./ISC.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/ISC.json", + "referenceNumber": "364", + "name": "ISC License", + "licenseId": "ISC", + "seeAlso": [ + "https://www.isc.org/downloads/software-support-policy/isc-license/", + "https://opensource.org/licenses/ISC" + ], + "isOsiApproved": true + }, + { + "reference": "./ImageMagick.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ImageMagick.json", + "referenceNumber": "337", + "name": "ImageMagick License", + "licenseId": "ImageMagick", + "seeAlso": [ + "http://www.imagemagick.org/script/license.php" + ], + "isOsiApproved": false + }, + { + "reference": "./Imlib2.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Imlib2.json", + "referenceNumber": "140", + "name": "Imlib2 License", + "licenseId": "Imlib2", + "seeAlso": [ + "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", + "https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING" + ], + "isOsiApproved": false + }, + { + "reference": "./Info-ZIP.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Info-ZIP.json", + "referenceNumber": "294", + "name": "Info-ZIP License", + "licenseId": "Info-ZIP", + "seeAlso": [ + "http://www.info-zip.org/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Intel.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Intel.json", + "referenceNumber": "29", + "name": "Intel Open Source License", + "licenseId": "Intel", + "seeAlso": [ + "https://opensource.org/licenses/Intel" + ], + "isOsiApproved": true + }, + { + "reference": "./Intel-ACPI.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Intel-ACPI.json", + "referenceNumber": "243", + "name": "Intel ACPI Software License Agreement", + "licenseId": "Intel-ACPI", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement" + ], + "isOsiApproved": false + }, + { + "reference": "./Interbase-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Interbase-1.0.json", + "referenceNumber": "334", + "name": "Interbase Public License v1.0", + "licenseId": "Interbase-1.0", + "seeAlso": [ + "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html" + ], + "isOsiApproved": false + }, + { + "reference": "./JPNIC.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/JPNIC.json", + "referenceNumber": "327", + "name": "Japan Network Information Center License", + "licenseId": "JPNIC", + "seeAlso": [ + "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366" + ], + "isOsiApproved": false + }, + { + "reference": "./JSON.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/JSON.json", + "referenceNumber": "204", + "name": "JSON License", + "licenseId": "JSON", + "seeAlso": [ + "http://www.json.org/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./JasPer-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/JasPer-2.0.json", + "referenceNumber": "81", + "name": "JasPer License", + "licenseId": "JasPer-2.0", + "seeAlso": [ + "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./LAL-1.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LAL-1.2.json", + "referenceNumber": "159", + "name": "Licence Art Libre 1.2", + "licenseId": "LAL-1.2", + "seeAlso": [ + "http://artlibre.org/licence/lal/licence-art-libre-12/" + ], + "isOsiApproved": false + }, + { + "reference": "./LAL-1.3.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LAL-1.3.json", + "referenceNumber": "368", + "name": "Licence Art Libre 1.3", + "licenseId": "LAL-1.3", + "seeAlso": [ + "https://artlibre.org/" + ], + "isOsiApproved": false + }, + { + "reference": "./LGPL-2.0.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.0.json", + "referenceNumber": "286", + "name": "GNU Library General Public License v2 only", + "licenseId": "LGPL-2.0", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.0+.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.0+.json", + "referenceNumber": "144", + "name": "GNU Library General Public License v2 or later", + "licenseId": "LGPL-2.0+", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.0-only.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.0-only.json", + "referenceNumber": "339", + "name": "GNU Library General Public License v2 only", + "licenseId": "LGPL-2.0-only", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.0-or-later.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.0-or-later.json", + "referenceNumber": "35", + "name": "GNU Library General Public License v2 or later", + "licenseId": "LGPL-2.0-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.1.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.1.json", + "referenceNumber": "189", + "name": "GNU Lesser General Public License v2.1 only", + "licenseId": "LGPL-2.1", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "https://opensource.org/licenses/LGPL-2.1" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.1+.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.1+.json", + "referenceNumber": "209", + "name": "GNU Library General Public License v2.1 or later", + "licenseId": "LGPL-2.1+", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "https://opensource.org/licenses/LGPL-2.1" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.1-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.1-only.json", + "referenceNumber": "143", + "name": "GNU Lesser General Public License v2.1 only", + "licenseId": "LGPL-2.1-only", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "https://opensource.org/licenses/LGPL-2.1" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-2.1-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-2.1-or-later.json", + "referenceNumber": "279", + "name": "GNU Lesser General Public License v2.1 or later", + "licenseId": "LGPL-2.1-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", + "https://opensource.org/licenses/LGPL-2.1" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-3.0.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-3.0.json", + "referenceNumber": "216", + "name": "GNU Lesser General Public License v3.0 only", + "licenseId": "LGPL-3.0", + "seeAlso": [ + "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "https://opensource.org/licenses/LGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-3.0+.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-3.0+.json", + "referenceNumber": "228", + "name": "GNU Lesser General Public License v3.0 or later", + "licenseId": "LGPL-3.0+", + "seeAlso": [ + "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "https://opensource.org/licenses/LGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-3.0-only.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-3.0-only.json", + "referenceNumber": "49", + "name": "GNU Lesser General Public License v3.0 only", + "licenseId": "LGPL-3.0-only", + "seeAlso": [ + "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "https://opensource.org/licenses/LGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPL-3.0-or-later.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LGPL-3.0-or-later.json", + "referenceNumber": "328", + "name": "GNU Lesser General Public License v3.0 or later", + "licenseId": "LGPL-3.0-or-later", + "seeAlso": [ + "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", + "https://opensource.org/licenses/LGPL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./LGPLLR.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LGPLLR.json", + "referenceNumber": "417", + "name": "Lesser General Public License For Linguistic Resources", + "licenseId": "LGPLLR", + "seeAlso": [ + "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html" + ], + "isOsiApproved": false + }, + { + "reference": "./LPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LPL-1.0.json", + "referenceNumber": "383", + "name": "Lucent Public License Version 1.0", + "licenseId": "LPL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/LPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./LPL-1.02.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LPL-1.02.json", + "referenceNumber": "125", + "name": "Lucent Public License v1.02", + "licenseId": "LPL-1.02", + "seeAlso": [ + "http://plan9.bell-labs.com/plan9/license.html", + "https://opensource.org/licenses/LPL-1.02" + ], + "isOsiApproved": true + }, + { + "reference": "./LPPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LPPL-1.0.json", + "referenceNumber": "86", + "name": "LaTeX Project Public License v1.0", + "licenseId": "LPPL-1.0", + "seeAlso": [ + "http://www.latex-project.org/lppl/lppl-1-0.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./LPPL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LPPL-1.1.json", + "referenceNumber": "174", + "name": "LaTeX Project Public License v1.1", + "licenseId": "LPPL-1.1", + "seeAlso": [ + "http://www.latex-project.org/lppl/lppl-1-1.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./LPPL-1.2.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LPPL-1.2.json", + "referenceNumber": "166", + "name": "LaTeX Project Public License v1.2", + "licenseId": "LPPL-1.2", + "seeAlso": [ + "http://www.latex-project.org/lppl/lppl-1-2.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./LPPL-1.3a.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/LPPL-1.3a.json", + "referenceNumber": "280", + "name": "LaTeX Project Public License v1.3a", + "licenseId": "LPPL-1.3a", + "seeAlso": [ + "http://www.latex-project.org/lppl/lppl-1-3a.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./LPPL-1.3c.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LPPL-1.3c.json", + "referenceNumber": "131", + "name": "LaTeX Project Public License v1.3c", + "licenseId": "LPPL-1.3c", + "seeAlso": [ + "http://www.latex-project.org/lppl/lppl-1-3c.txt", + "https://opensource.org/licenses/LPPL-1.3c" + ], + "isOsiApproved": true + }, + { + "reference": "./Latex2e.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Latex2e.json", + "referenceNumber": "37", + "name": "Latex2e License", + "licenseId": "Latex2e", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Latex2e" + ], + "isOsiApproved": false + }, + { + "reference": "./Leptonica.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Leptonica.json", + "referenceNumber": "311", + "name": "Leptonica License", + "licenseId": "Leptonica", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Leptonica" + ], + "isOsiApproved": false + }, + { + "reference": "./LiLiQ-P-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LiLiQ-P-1.1.json", + "referenceNumber": "83", + "name": "Licence Libre du Québec – Permissive version 1.1", + "licenseId": "LiLiQ-P-1.1", + "seeAlso": [ + "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", + "http://opensource.org/licenses/LiLiQ-P-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./LiLiQ-R-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LiLiQ-R-1.1.json", + "referenceNumber": "301", + "name": "Licence Libre du Québec – Réciprocité version 1.1", + "licenseId": "LiLiQ-R-1.1", + "seeAlso": [ + "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", + "http://opensource.org/licenses/LiLiQ-R-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./LiLiQ-Rplus-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/LiLiQ-Rplus-1.1.json", + "referenceNumber": "346", + "name": "Licence Libre du Québec – Réciprocité forte version 1.1", + "licenseId": "LiLiQ-Rplus-1.1", + "seeAlso": [ + "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", + "http://opensource.org/licenses/LiLiQ-Rplus-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./Libpng.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Libpng.json", + "referenceNumber": "388", + "name": "libpng License", + "licenseId": "Libpng", + "seeAlso": [ + "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./Linux-OpenIB.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Linux-OpenIB.json", + "referenceNumber": "224", + "name": "Linux Kernel Variant of OpenIB.org license", + "licenseId": "Linux-OpenIB", + "seeAlso": [ + "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h" + ], + "isOsiApproved": false + }, + { + "reference": "./MIT.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/MIT.json", + "referenceNumber": "265", + "name": "MIT License", + "licenseId": "MIT", + "seeAlso": [ + "https://opensource.org/licenses/MIT" + ], + "isOsiApproved": true + }, + { + "reference": "./MIT-0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MIT-0.json", + "referenceNumber": "79", + "name": "MIT No Attribution", + "licenseId": "MIT-0", + "seeAlso": [ + "https://github.com/aws/mit-0", + "https://romanrm.net/mit-zero", + "https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE" + ], + "isOsiApproved": false + }, + { + "reference": "./MIT-CMU.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MIT-CMU.json", + "referenceNumber": "355", + "name": "CMU License", + "licenseId": "MIT-CMU", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing:MIT?rd\u003dLicensing/MIT#CMU_Style", + "https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./MIT-advertising.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MIT-advertising.json", + "referenceNumber": "199", + "name": "Enlightenment License (e16)", + "licenseId": "MIT-advertising", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising" + ], + "isOsiApproved": false + }, + { + "reference": "./MIT-enna.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MIT-enna.json", + "referenceNumber": "54", + "name": "enna License", + "licenseId": "MIT-enna", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MIT#enna" + ], + "isOsiApproved": false + }, + { + "reference": "./MIT-feh.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MIT-feh.json", + "referenceNumber": "376", + "name": "feh License", + "licenseId": "MIT-feh", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MIT#feh" + ], + "isOsiApproved": false + }, + { + "reference": "./MITNFA.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MITNFA.json", + "referenceNumber": "347", + "name": "MIT +no-false-attribs license", + "licenseId": "MITNFA", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MITNFA" + ], + "isOsiApproved": false + }, + { + "reference": "./MPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MPL-1.0.json", + "referenceNumber": "247", + "name": "Mozilla Public License 1.0", + "licenseId": "MPL-1.0", + "seeAlso": [ + "http://www.mozilla.org/MPL/MPL-1.0.html", + "https://opensource.org/licenses/MPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./MPL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/MPL-1.1.json", + "referenceNumber": "407", + "name": "Mozilla Public License 1.1", + "licenseId": "MPL-1.1", + "seeAlso": [ + "http://www.mozilla.org/MPL/MPL-1.1.html", + "https://opensource.org/licenses/MPL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./MPL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/MPL-2.0.json", + "referenceNumber": "126", + "name": "Mozilla Public License 2.0", + "licenseId": "MPL-2.0", + "seeAlso": [ + "http://www.mozilla.org/MPL/2.0/", + "https://opensource.org/licenses/MPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./MPL-2.0-no-copyleft-exception.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json", + "referenceNumber": "190", + "name": "Mozilla Public License 2.0 (no copyleft exception)", + "licenseId": "MPL-2.0-no-copyleft-exception", + "seeAlso": [ + "http://www.mozilla.org/MPL/2.0/", + "https://opensource.org/licenses/MPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./MS-PL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/MS-PL.json", + "referenceNumber": "377", + "name": "Microsoft Public License", + "licenseId": "MS-PL", + "seeAlso": [ + "http://www.microsoft.com/opensource/licenses.mspx", + "https://opensource.org/licenses/MS-PL" + ], + "isOsiApproved": true + }, + { + "reference": "./MS-RL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/MS-RL.json", + "referenceNumber": "4", + "name": "Microsoft Reciprocal License", + "licenseId": "MS-RL", + "seeAlso": [ + "http://www.microsoft.com/opensource/licenses.mspx", + "https://opensource.org/licenses/MS-RL" + ], + "isOsiApproved": true + }, + { + "reference": "./MTLL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MTLL.json", + "referenceNumber": "106", + "name": "Matrix Template Library License", + "licenseId": "MTLL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License" + ], + "isOsiApproved": false + }, + { + "reference": "./MakeIndex.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MakeIndex.json", + "referenceNumber": "354", + "name": "MakeIndex License", + "licenseId": "MakeIndex", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MakeIndex" + ], + "isOsiApproved": false + }, + { + "reference": "./MirOS.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MirOS.json", + "referenceNumber": "381", + "name": "The MirOS Licence", + "licenseId": "MirOS", + "seeAlso": [ + "https://opensource.org/licenses/MirOS" + ], + "isOsiApproved": true + }, + { + "reference": "./Motosoto.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Motosoto.json", + "referenceNumber": "12", + "name": "Motosoto License", + "licenseId": "Motosoto", + "seeAlso": [ + "https://opensource.org/licenses/Motosoto" + ], + "isOsiApproved": true + }, + { + "reference": "./MulanPSL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MulanPSL-1.0.json", + "referenceNumber": "208", + "name": "Mulan Permissive Software License, Version 1", + "licenseId": "MulanPSL-1.0", + "seeAlso": [ + "https://license.coscl.org.cn/MulanPSL/", + "https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./MulanPSL-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/MulanPSL-2.0.json", + "referenceNumber": "153", + "name": "Mulan Permissive Software License, Version 2", + "licenseId": "MulanPSL-2.0", + "seeAlso": [ + "https://license.coscl.org.cn/MulanPSL2/" + ], + "isOsiApproved": true + }, + { + "reference": "./Multics.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Multics.json", + "referenceNumber": "170", + "name": "Multics License", + "licenseId": "Multics", + "seeAlso": [ + "https://opensource.org/licenses/Multics" + ], + "isOsiApproved": true + }, + { + "reference": "./Mup.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Mup.json", + "referenceNumber": "316", + "name": "Mup License", + "licenseId": "Mup", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Mup" + ], + "isOsiApproved": false + }, + { + "reference": "./NASA-1.3.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NASA-1.3.json", + "referenceNumber": "114", + "name": "NASA Open Source Agreement 1.3", + "licenseId": "NASA-1.3", + "seeAlso": [ + "http://ti.arc.nasa.gov/opensource/nosa/", + "https://opensource.org/licenses/NASA-1.3" + ], + "isOsiApproved": true + }, + { + "reference": "./NBPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NBPL-1.0.json", + "referenceNumber": "17", + "name": "Net Boolean Public License v1", + "licenseId": "NBPL-1.0", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d37b4b3f6cc4bf34e1d3dec61e69914b9819d8894" + ], + "isOsiApproved": false + }, + { + "reference": "./NCGL-UK-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NCGL-UK-2.0.json", + "referenceNumber": "225", + "name": "Non-Commercial Government Licence", + "licenseId": "NCGL-UK-2.0", + "seeAlso": [ + "https://github.com/spdx/license-list-XML/blob/master/src/Apache-2.0.xml" + ], + "isOsiApproved": false + }, + { + "reference": "./NCSA.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/NCSA.json", + "referenceNumber": "194", + "name": "University of Illinois/NCSA Open Source License", + "licenseId": "NCSA", + "seeAlso": [ + "http://otm.illinois.edu/uiuc_openSource", + "https://opensource.org/licenses/NCSA" + ], + "isOsiApproved": true + }, + { + "reference": "./NGPL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NGPL.json", + "referenceNumber": "319", + "name": "Nethack General Public License", + "licenseId": "NGPL", + "seeAlso": [ + "https://opensource.org/licenses/NGPL" + ], + "isOsiApproved": true + }, + { + "reference": "./NLOD-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NLOD-1.0.json", + "referenceNumber": "139", + "name": "Norwegian Licence for Open Government Data", + "licenseId": "NLOD-1.0", + "seeAlso": [ + "http://data.norge.no/nlod/en/1.0" + ], + "isOsiApproved": false + }, + { + "reference": "./NLPL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NLPL.json", + "referenceNumber": "317", + "name": "No Limit Public License", + "licenseId": "NLPL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/NLPL" + ], + "isOsiApproved": false + }, + { + "reference": "./NOSL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/NOSL.json", + "referenceNumber": "392", + "name": "Netizen Open Source License", + "licenseId": "NOSL", + "seeAlso": [ + "http://bits.netizen.com.au/licenses/NOSL/nosl.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./NPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/NPL-1.0.json", + "referenceNumber": "253", + "name": "Netscape Public License v1.0", + "licenseId": "NPL-1.0", + "seeAlso": [ + "http://www.mozilla.org/MPL/NPL/1.0/" + ], + "isOsiApproved": false + }, + { + "reference": "./NPL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/NPL-1.1.json", + "referenceNumber": "422", + "name": "Netscape Public License v1.1", + "licenseId": "NPL-1.1", + "seeAlso": [ + "http://www.mozilla.org/MPL/NPL/1.1/" + ], + "isOsiApproved": false + }, + { + "reference": "./NPOSL-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NPOSL-3.0.json", + "referenceNumber": "156", + "name": "Non-Profit Open Software License 3.0", + "licenseId": "NPOSL-3.0", + "seeAlso": [ + "https://opensource.org/licenses/NOSL3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./NRL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NRL.json", + "referenceNumber": "105", + "name": "NRL License", + "licenseId": "NRL", + "seeAlso": [ + "http://web.mit.edu/network/isakmp/nrllicense.html" + ], + "isOsiApproved": false + }, + { + "reference": "./NTP.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NTP.json", + "referenceNumber": "268", + "name": "NTP License", + "licenseId": "NTP", + "seeAlso": [ + "https://opensource.org/licenses/NTP" + ], + "isOsiApproved": true + }, + { + "reference": "./NTP-0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NTP-0.json", + "referenceNumber": "192", + "name": "NTP No Attribution", + "licenseId": "NTP-0", + "seeAlso": [ + "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c" + ], + "isOsiApproved": false + }, + { + "reference": "./Naumen.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Naumen.json", + "referenceNumber": "293", + "name": "Naumen Public License", + "licenseId": "Naumen", + "seeAlso": [ + "https://opensource.org/licenses/Naumen" + ], + "isOsiApproved": true + }, + { + "reference": "./Net-SNMP.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Net-SNMP.json", + "referenceNumber": "288", + "name": "Net-SNMP License", + "licenseId": "Net-SNMP", + "seeAlso": [ + "http://net-snmp.sourceforge.net/about/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./NetCDF.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/NetCDF.json", + "referenceNumber": "219", + "name": "NetCDF license", + "licenseId": "NetCDF", + "seeAlso": [ + "http://www.unidata.ucar.edu/software/netcdf/copyright.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Newsletr.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Newsletr.json", + "referenceNumber": "369", + "name": "Newsletr License", + "licenseId": "Newsletr", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Newsletr" + ], + "isOsiApproved": false + }, + { + "reference": "./Nokia.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Nokia.json", + "referenceNumber": "130", + "name": "Nokia Open Source License", + "licenseId": "Nokia", + "seeAlso": [ + "https://opensource.org/licenses/nokia" + ], + "isOsiApproved": true + }, + { + "reference": "./Noweb.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Noweb.json", + "referenceNumber": "73", + "name": "Noweb License", + "licenseId": "Noweb", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Noweb" + ], + "isOsiApproved": false + }, + { + "reference": "./Nunit.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Nunit.json", + "referenceNumber": "91", + "name": "Nunit License", + "licenseId": "Nunit", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Nunit" + ], + "isOsiApproved": false + }, + { + "reference": "./O-UDA-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/O-UDA-1.0.json", + "referenceNumber": "48", + "name": "Open Use of Data Agreement v1.0", + "licenseId": "O-UDA-1.0", + "seeAlso": [ + "https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md" + ], + "isOsiApproved": false + }, + { + "reference": "./OCCT-PL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OCCT-PL.json", + "referenceNumber": "68", + "name": "Open CASCADE Technology Public License", + "licenseId": "OCCT-PL", + "seeAlso": [ + "http://www.opencascade.com/content/occt-public-license" + ], + "isOsiApproved": false + }, + { + "reference": "./OCLC-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OCLC-2.0.json", + "referenceNumber": "352", + "name": "OCLC Research Public License 2.0", + "licenseId": "OCLC-2.0", + "seeAlso": [ + "http://www.oclc.org/research/activities/software/license/v2final.htm", + "https://opensource.org/licenses/OCLC-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./ODC-By-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ODC-By-1.0.json", + "referenceNumber": "393", + "name": "Open Data Commons Attribution License v1.0", + "licenseId": "ODC-By-1.0", + "seeAlso": [ + "https://opendatacommons.org/licenses/by/1.0/" + ], + "isOsiApproved": false + }, + { + "reference": "./ODbL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/ODbL-1.0.json", + "referenceNumber": "351", + "name": "ODC Open Database License v1.0", + "licenseId": "ODbL-1.0", + "seeAlso": [ + "http://www.opendatacommons.org/licenses/odbl/1.0/" + ], + "isOsiApproved": false + }, + { + "reference": "./OFL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OFL-1.0.json", + "referenceNumber": "84", + "name": "SIL Open Font License 1.0", + "licenseId": "OFL-1.0", + "seeAlso": [ + "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" + ], + "isOsiApproved": false + }, + { + "reference": "./OFL-1.0-RFN.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OFL-1.0-RFN.json", + "referenceNumber": "309", + "name": "SIL Open Font License 1.0 with Reserved Font Name", + "licenseId": "OFL-1.0-RFN", + "seeAlso": [ + "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" + ], + "isOsiApproved": false + }, + { + "reference": "./OFL-1.0-no-RFN.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OFL-1.0-no-RFN.json", + "referenceNumber": "74", + "name": "SIL Open Font License 1.0 with no Reserved Font Name", + "licenseId": "OFL-1.0-no-RFN", + "seeAlso": [ + "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" + ], + "isOsiApproved": false + }, + { + "reference": "./OFL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OFL-1.1.json", + "referenceNumber": "322", + "name": "SIL Open Font License 1.1", + "licenseId": "OFL-1.1", + "seeAlso": [ + "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", + "https://opensource.org/licenses/OFL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./OFL-1.1-RFN.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OFL-1.1-RFN.json", + "referenceNumber": "43", + "name": "SIL Open Font License 1.1 with Reserved Font Name", + "licenseId": "OFL-1.1-RFN", + "seeAlso": [ + "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", + "https://opensource.org/licenses/OFL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./OFL-1.1-no-RFN.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OFL-1.1-no-RFN.json", + "referenceNumber": "246", + "name": "SIL Open Font License 1.1 with no Reserved Font Name", + "licenseId": "OFL-1.1-no-RFN", + "seeAlso": [ + "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", + "https://opensource.org/licenses/OFL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./OGC-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OGC-1.0.json", + "referenceNumber": "378", + "name": "OGC Software License, Version 1.0", + "licenseId": "OGC-1.0", + "seeAlso": [ + "https://www.ogc.org/ogc/software/1.0" + ], + "isOsiApproved": false + }, + { + "reference": "./OGL-Canada-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OGL-Canada-2.0.json", + "referenceNumber": "357", + "name": "Open Government Licence - Canada", + "licenseId": "OGL-Canada-2.0", + "seeAlso": [ + "https://open.canada.ca/en/open-government-licence-canada" + ], + "isOsiApproved": false + }, + { + "reference": "./OGL-UK-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OGL-UK-1.0.json", + "referenceNumber": "359", + "name": "Open Government Licence v1.0", + "licenseId": "OGL-UK-1.0", + "seeAlso": [ + "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/" + ], + "isOsiApproved": false + }, + { + "reference": "./OGL-UK-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OGL-UK-2.0.json", + "referenceNumber": "13", + "name": "Open Government Licence v2.0", + "licenseId": "OGL-UK-2.0", + "seeAlso": [ + "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/" + ], + "isOsiApproved": false + }, + { + "reference": "./OGL-UK-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OGL-UK-3.0.json", + "referenceNumber": "21", + "name": "Open Government Licence v3.0", + "licenseId": "OGL-UK-3.0", + "seeAlso": [ + "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" + ], + "isOsiApproved": false + }, + { + "reference": "./OGTSL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OGTSL.json", + "referenceNumber": "26", + "name": "Open Group Test Suite License", + "licenseId": "OGTSL", + "seeAlso": [ + "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", + "https://opensource.org/licenses/OGTSL" + ], + "isOsiApproved": true + }, + { + "reference": "./OLDAP-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-1.1.json", + "referenceNumber": "57", + "name": "Open LDAP Public License v1.1", + "licenseId": "OLDAP-1.1", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d806557a5ad59804ef3a44d5abfbe91d706b0791f" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-1.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-1.2.json", + "referenceNumber": "50", + "name": "Open LDAP Public License v1.2", + "licenseId": "OLDAP-1.2", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d42b0383c50c299977b5893ee695cf4e486fb0dc7" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-1.3.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-1.3.json", + "referenceNumber": "42", + "name": "Open LDAP Public License v1.3", + "licenseId": "OLDAP-1.3", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003de5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-1.4.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-1.4.json", + "referenceNumber": "52", + "name": "Open LDAP Public License v1.4", + "licenseId": "OLDAP-1.4", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dc9f95c2f3f2ffb5e0ae55fe7388af75547660941" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.0.json", + "referenceNumber": "25", + "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", + "licenseId": "OLDAP-2.0", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcbf50f4e1185a21abd4c0a54d3f4341fe28f36ea" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.0.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.0.1.json", + "referenceNumber": "290", + "name": "Open LDAP Public License v2.0.1", + "licenseId": "OLDAP-2.0.1", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db6d68acd14e51ca3aab4428bf26522aa74873f0e" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.1.json", + "referenceNumber": "413", + "name": "Open LDAP Public License v2.1", + "licenseId": "OLDAP-2.1", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db0d176738e96a0d3b9f85cb51e140a86f21be715" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.2.json", + "referenceNumber": "329", + "name": "Open LDAP Public License v2.2", + "licenseId": "OLDAP-2.2", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d470b0c18ec67621c85881b2733057fecf4a1acc3" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.2.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.2.1.json", + "referenceNumber": "396", + "name": "Open LDAP Public License v2.2.1", + "licenseId": "OLDAP-2.2.1", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d4bc786f34b50aa301be6f5600f58a980070f481e" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.2.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.2.2.json", + "referenceNumber": "176", + "name": "Open LDAP Public License 2.2.2", + "licenseId": "OLDAP-2.2.2", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003ddf2cc1e21eb7c160695f5b7cffd6296c151ba188" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.3.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.3.json", + "referenceNumber": "238", + "name": "Open LDAP Public License v2.3", + "licenseId": "OLDAP-2.3", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dd32cf54a32d581ab475d23c810b0a7fbaf8d63c3" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.4.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.4.json", + "referenceNumber": "119", + "name": "Open LDAP Public License v2.4", + "licenseId": "OLDAP-2.4", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcd1284c4a91a8a380d904eee68d1583f989ed386" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.5.json", + "referenceNumber": "112", + "name": "Open LDAP Public License v2.5", + "licenseId": "OLDAP-2.5", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d6852b9d90022e8593c98205413380536b1b5a7cf" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.6.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.6.json", + "referenceNumber": "113", + "name": "Open LDAP Public License v2.6", + "licenseId": "OLDAP-2.6", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d1cae062821881f41b73012ba816434897abf4205" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.7.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.7.json", + "referenceNumber": "237", + "name": "Open LDAP Public License v2.7", + "licenseId": "OLDAP-2.7", + "seeAlso": [ + "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d47c2415c1df81556eeb39be6cad458ef87c534a2" + ], + "isOsiApproved": false + }, + { + "reference": "./OLDAP-2.8.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OLDAP-2.8.json", + "referenceNumber": "261", + "name": "Open LDAP Public License v2.8", + "licenseId": "OLDAP-2.8", + "seeAlso": [ + "http://www.openldap.org/software/release/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./OML.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OML.json", + "referenceNumber": "177", + "name": "Open Market License", + "licenseId": "OML", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Open_Market_License" + ], + "isOsiApproved": false + }, + { + "reference": "./OPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OPL-1.0.json", + "referenceNumber": "349", + "name": "Open Public License v1.0", + "licenseId": "OPL-1.0", + "seeAlso": [ + "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", + "https://fedoraproject.org/wiki/Licensing/Open_Public_License" + ], + "isOsiApproved": false + }, + { + "reference": "./OSET-PL-2.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/OSET-PL-2.1.json", + "referenceNumber": "210", + "name": "OSET Public License version 2.1", + "licenseId": "OSET-PL-2.1", + "seeAlso": [ + "http://www.osetfoundation.org/public-license", + "https://opensource.org/licenses/OPL-2.1" + ], + "isOsiApproved": true + }, + { + "reference": "./OSL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OSL-1.0.json", + "referenceNumber": "99", + "name": "Open Software License 1.0", + "licenseId": "OSL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/OSL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./OSL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OSL-1.1.json", + "referenceNumber": "184", + "name": "Open Software License 1.1", + "licenseId": "OSL-1.1", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/OSL1.1" + ], + "isOsiApproved": false + }, + { + "reference": "./OSL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OSL-2.0.json", + "referenceNumber": "375", + "name": "Open Software License 2.0", + "licenseId": "OSL-2.0", + "seeAlso": [ + "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html" + ], + "isOsiApproved": true + }, + { + "reference": "./OSL-2.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OSL-2.1.json", + "referenceNumber": "163", + "name": "Open Software License 2.1", + "licenseId": "OSL-2.1", + "seeAlso": [ + "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", + "https://opensource.org/licenses/OSL-2.1" + ], + "isOsiApproved": true + }, + { + "reference": "./OSL-3.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OSL-3.0.json", + "referenceNumber": "155", + "name": "Open Software License 3.0", + "licenseId": "OSL-3.0", + "seeAlso": [ + "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", + "https://opensource.org/licenses/OSL-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./OpenSSL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/OpenSSL.json", + "referenceNumber": "87", + "name": "OpenSSL License", + "licenseId": "OpenSSL", + "seeAlso": [ + "http://www.openssl.org/source/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./PDDL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/PDDL-1.0.json", + "referenceNumber": "137", + "name": "ODC Public Domain Dedication \u0026 License 1.0", + "licenseId": "PDDL-1.0", + "seeAlso": [ + "http://opendatacommons.org/licenses/pddl/1.0/" + ], + "isOsiApproved": false + }, + { + "reference": "./PHP-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/PHP-3.0.json", + "referenceNumber": "198", + "name": "PHP License v3.0", + "licenseId": "PHP-3.0", + "seeAlso": [ + "http://www.php.net/license/3_0.txt", + "https://opensource.org/licenses/PHP-3.0" + ], + "isOsiApproved": true + }, + { + "reference": "./PHP-3.01.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/PHP-3.01.json", + "referenceNumber": "3", + "name": "PHP License v3.01", + "licenseId": "PHP-3.01", + "seeAlso": [ + "http://www.php.net/license/3_01.txt" + ], + "isOsiApproved": true + }, + { + "reference": "./PSF-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/PSF-2.0.json", + "referenceNumber": "95", + "name": "Python Software Foundation License 2.0", + "licenseId": "PSF-2.0", + "seeAlso": [ + "https://opensource.org/licenses/Python-2.0" + ], + "isOsiApproved": false + }, + { + "reference": "./Parity-6.0.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Parity-6.0.0.json", + "referenceNumber": "419", + "name": "The Parity Public License 6.0.0", + "licenseId": "Parity-6.0.0", + "seeAlso": [ + "https://paritylicense.com/versions/6.0.0.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Parity-7.0.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Parity-7.0.0.json", + "referenceNumber": "404", + "name": "The Parity Public License 7.0.0", + "licenseId": "Parity-7.0.0", + "seeAlso": [ + "https://paritylicense.com/versions/7.0.0.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Plexus.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Plexus.json", + "referenceNumber": "162", + "name": "Plexus Classworlds License", + "licenseId": "Plexus", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License" + ], + "isOsiApproved": false + }, + { + "reference": "./PolyForm-Noncommercial-1.0.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json", + "referenceNumber": "292", + "name": "PolyForm Noncommercial License 1.0.0", + "licenseId": "PolyForm-Noncommercial-1.0.0", + "seeAlso": [ + "https://polyformproject.org/licenses/noncommercial/1.0.0" + ], + "isOsiApproved": false + }, + { + "reference": "./PolyForm-Small-Business-1.0.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json", + "referenceNumber": "122", + "name": "PolyForm Small Business License 1.0.0", + "licenseId": "PolyForm-Small-Business-1.0.0", + "seeAlso": [ + "https://polyformproject.org/licenses/small-business/1.0.0" + ], + "isOsiApproved": false + }, + { + "reference": "./PostgreSQL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/PostgreSQL.json", + "referenceNumber": "11", + "name": "PostgreSQL License", + "licenseId": "PostgreSQL", + "seeAlso": [ + "http://www.postgresql.org/about/licence", + "https://opensource.org/licenses/PostgreSQL" + ], + "isOsiApproved": true + }, + { + "reference": "./Python-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Python-2.0.json", + "referenceNumber": "406", + "name": "Python License 2.0", + "licenseId": "Python-2.0", + "seeAlso": [ + "https://opensource.org/licenses/Python-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./QPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/QPL-1.0.json", + "referenceNumber": "300", + "name": "Q Public License 1.0", + "licenseId": "QPL-1.0", + "seeAlso": [ + "http://doc.qt.nokia.com/3.3/license.html", + "https://opensource.org/licenses/QPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Qhull.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Qhull.json", + "referenceNumber": "129", + "name": "Qhull License", + "licenseId": "Qhull", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Qhull" + ], + "isOsiApproved": false + }, + { + "reference": "./RHeCos-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/RHeCos-1.1.json", + "referenceNumber": "64", + "name": "Red Hat eCos Public License v1.1", + "licenseId": "RHeCos-1.1", + "seeAlso": [ + "http://ecos.sourceware.org/old-license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./RPL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/RPL-1.1.json", + "referenceNumber": "223", + "name": "Reciprocal Public License 1.1", + "licenseId": "RPL-1.1", + "seeAlso": [ + "https://opensource.org/licenses/RPL-1.1" + ], + "isOsiApproved": true + }, + { + "reference": "./RPL-1.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/RPL-1.5.json", + "referenceNumber": "109", + "name": "Reciprocal Public License 1.5", + "licenseId": "RPL-1.5", + "seeAlso": [ + "https://opensource.org/licenses/RPL-1.5" + ], + "isOsiApproved": true + }, + { + "reference": "./RPSL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/RPSL-1.0.json", + "referenceNumber": "55", + "name": "RealNetworks Public Source License v1.0", + "licenseId": "RPSL-1.0", + "seeAlso": [ + "https://helixcommunity.org/content/rpsl", + "https://opensource.org/licenses/RPSL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./RSA-MD.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/RSA-MD.json", + "referenceNumber": "289", + "name": "RSA Message-Digest License ", + "licenseId": "RSA-MD", + "seeAlso": [ + "http://www.faqs.org/rfcs/rfc1321.html" + ], + "isOsiApproved": false + }, + { + "reference": "./RSCPL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/RSCPL.json", + "referenceNumber": "350", + "name": "Ricoh Source Code Public License", + "licenseId": "RSCPL", + "seeAlso": [ + "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", + "https://opensource.org/licenses/RSCPL" + ], + "isOsiApproved": true + }, + { + "reference": "./Rdisc.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Rdisc.json", + "referenceNumber": "333", + "name": "Rdisc License", + "licenseId": "Rdisc", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Rdisc_License" + ], + "isOsiApproved": false + }, + { + "reference": "./Ruby.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Ruby.json", + "referenceNumber": "14", + "name": "Ruby License", + "licenseId": "Ruby", + "seeAlso": [ + "http://www.ruby-lang.org/en/LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./SAX-PD.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SAX-PD.json", + "referenceNumber": "158", + "name": "Sax Public Domain Notice", + "licenseId": "SAX-PD", + "seeAlso": [ + "http://www.saxproject.org/copying.html" + ], + "isOsiApproved": false + }, + { + "reference": "./SCEA.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SCEA.json", + "referenceNumber": "142", + "name": "SCEA Shared Source License", + "licenseId": "SCEA", + "seeAlso": [ + "http://research.scea.com/scea_shared_source_license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./SGI-B-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SGI-B-1.0.json", + "referenceNumber": "196", + "name": "SGI Free Software License B v1.0", + "licenseId": "SGI-B-1.0", + "seeAlso": [ + "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html" + ], + "isOsiApproved": false + }, + { + "reference": "./SGI-B-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SGI-B-1.1.json", + "referenceNumber": "299", + "name": "SGI Free Software License B v1.1", + "licenseId": "SGI-B-1.1", + "seeAlso": [ + "http://oss.sgi.com/projects/FreeB/" + ], + "isOsiApproved": false + }, + { + "reference": "./SGI-B-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/SGI-B-2.0.json", + "referenceNumber": "31", + "name": "SGI Free Software License B v2.0", + "licenseId": "SGI-B-2.0", + "seeAlso": [ + "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf" + ], + "isOsiApproved": false + }, + { + "reference": "./SHL-0.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SHL-0.5.json", + "referenceNumber": "51", + "name": "Solderpad Hardware License v0.5", + "licenseId": "SHL-0.5", + "seeAlso": [ + "https://solderpad.org/licenses/SHL-0.5/" + ], + "isOsiApproved": false + }, + { + "reference": "./SHL-0.51.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SHL-0.51.json", + "referenceNumber": "291", + "name": "Solderpad Hardware License, Version 0.51", + "licenseId": "SHL-0.51", + "seeAlso": [ + "https://solderpad.org/licenses/SHL-0.51/" + ], + "isOsiApproved": false + }, + { + "reference": "./SISSL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/SISSL.json", + "referenceNumber": "82", + "name": "Sun Industry Standards Source License v1.1", + "licenseId": "SISSL", + "seeAlso": [ + "http://www.openoffice.org/licenses/sissl_license.html", + "https://opensource.org/licenses/SISSL" + ], + "isOsiApproved": true + }, + { + "reference": "./SISSL-1.2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SISSL-1.2.json", + "referenceNumber": "65", + "name": "Sun Industry Standards Source License v1.2", + "licenseId": "SISSL-1.2", + "seeAlso": [ + "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./SMLNJ.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/SMLNJ.json", + "referenceNumber": "226", + "name": "Standard ML of New Jersey License", + "licenseId": "SMLNJ", + "seeAlso": [ + "https://www.smlnj.org/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./SMPPL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SMPPL.json", + "referenceNumber": "110", + "name": "Secure Messaging Protocol Public License", + "licenseId": "SMPPL", + "seeAlso": [ + "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./SNIA.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SNIA.json", + "referenceNumber": "313", + "name": "SNIA Public License 1.1", + "licenseId": "SNIA", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License" + ], + "isOsiApproved": false + }, + { + "reference": "./SPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/SPL-1.0.json", + "referenceNumber": "256", + "name": "Sun Public License v1.0", + "licenseId": "SPL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/SPL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./SSH-OpenSSH.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SSH-OpenSSH.json", + "referenceNumber": "22", + "name": "SSH OpenSSH license", + "licenseId": "SSH-OpenSSH", + "seeAlso": [ + "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10" + ], + "isOsiApproved": false + }, + { + "reference": "./SSH-short.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SSH-short.json", + "referenceNumber": "70", + "name": "SSH short notice", + "licenseId": "SSH-short", + "seeAlso": [ + "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", + "http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1", + "https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp" + ], + "isOsiApproved": false + }, + { + "reference": "./SSPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SSPL-1.0.json", + "referenceNumber": "345", + "name": "Server Side Public License, v 1", + "licenseId": "SSPL-1.0", + "seeAlso": [ + "https://www.mongodb.com/licensing/server-side-public-license" + ], + "isOsiApproved": false + }, + { + "reference": "./SWL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SWL.json", + "referenceNumber": "97", + "name": "Scheme Widget Library (SWL) Software License Agreement", + "licenseId": "SWL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/SWL" + ], + "isOsiApproved": false + }, + { + "reference": "./Saxpath.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Saxpath.json", + "referenceNumber": "34", + "name": "Saxpath License", + "licenseId": "Saxpath", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Saxpath_License" + ], + "isOsiApproved": false + }, + { + "reference": "./Sendmail.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Sendmail.json", + "referenceNumber": "304", + "name": "Sendmail License", + "licenseId": "Sendmail", + "seeAlso": [ + "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", + "https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf" + ], + "isOsiApproved": false + }, + { + "reference": "./Sendmail-8.23.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Sendmail-8.23.json", + "referenceNumber": "182", + "name": "Sendmail License 8.23", + "licenseId": "Sendmail-8.23", + "seeAlso": [ + "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", + "https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf" + ], + "isOsiApproved": false + }, + { + "reference": "./SimPL-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SimPL-2.0.json", + "referenceNumber": "259", + "name": "Simple Public License 2.0", + "licenseId": "SimPL-2.0", + "seeAlso": [ + "https://opensource.org/licenses/SimPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Sleepycat.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Sleepycat.json", + "referenceNumber": "58", + "name": "Sleepycat License", + "licenseId": "Sleepycat", + "seeAlso": [ + "https://opensource.org/licenses/Sleepycat" + ], + "isOsiApproved": true + }, + { + "reference": "./Spencer-86.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Spencer-86.json", + "referenceNumber": "191", + "name": "Spencer License 86", + "licenseId": "Spencer-86", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" + ], + "isOsiApproved": false + }, + { + "reference": "./Spencer-94.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Spencer-94.json", + "referenceNumber": "220", + "name": "Spencer License 94", + "licenseId": "Spencer-94", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" + ], + "isOsiApproved": false + }, + { + "reference": "./Spencer-99.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Spencer-99.json", + "referenceNumber": "67", + "name": "Spencer License 99", + "licenseId": "Spencer-99", + "seeAlso": [ + "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c" + ], + "isOsiApproved": false + }, + { + "reference": "./StandardML-NJ.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/StandardML-NJ.json", + "referenceNumber": "296", + "name": "Standard ML of New Jersey License", + "licenseId": "StandardML-NJ", + "seeAlso": [ + "http://www.smlnj.org//license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./SugarCRM-1.1.3.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/SugarCRM-1.1.3.json", + "referenceNumber": "353", + "name": "SugarCRM Public License v1.1.3", + "licenseId": "SugarCRM-1.1.3", + "seeAlso": [ + "http://www.sugarcrm.com/crm/SPL" + ], + "isOsiApproved": false + }, + { + "reference": "./TAPR-OHL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TAPR-OHL-1.0.json", + "referenceNumber": "9", + "name": "TAPR Open Hardware License v1.0", + "licenseId": "TAPR-OHL-1.0", + "seeAlso": [ + "https://www.tapr.org/OHL" + ], + "isOsiApproved": false + }, + { + "reference": "./TCL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TCL.json", + "referenceNumber": "56", + "name": "TCL/TK License", + "licenseId": "TCL", + "seeAlso": [ + "http://www.tcl.tk/software/tcltk/license.html", + "https://fedoraproject.org/wiki/Licensing/TCL" + ], + "isOsiApproved": false + }, + { + "reference": "./TCP-wrappers.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TCP-wrappers.json", + "referenceNumber": "242", + "name": "TCP Wrappers License", + "licenseId": "TCP-wrappers", + "seeAlso": [ + "http://rc.quest.com/topics/openssh/license.php#tcpwrappers" + ], + "isOsiApproved": false + }, + { + "reference": "./TMate.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TMate.json", + "referenceNumber": "415", + "name": "TMate Open Source License", + "licenseId": "TMate", + "seeAlso": [ + "http://svnkit.com/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./TORQUE-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TORQUE-1.1.json", + "referenceNumber": "195", + "name": "TORQUE v2.5+ Software License v1.1", + "licenseId": "TORQUE-1.1", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1" + ], + "isOsiApproved": false + }, + { + "reference": "./TOSL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TOSL.json", + "referenceNumber": "260", + "name": "Trusster Open Source License", + "licenseId": "TOSL", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/TOSL" + ], + "isOsiApproved": false + }, + { + "reference": "./TU-Berlin-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TU-Berlin-1.0.json", + "referenceNumber": "384", + "name": "Technische Universitaet Berlin License 1.0", + "licenseId": "TU-Berlin-1.0", + "seeAlso": [ + "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT" + ], + "isOsiApproved": false + }, + { + "reference": "./TU-Berlin-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/TU-Berlin-2.0.json", + "referenceNumber": "405", + "name": "Technische Universitaet Berlin License 2.0", + "licenseId": "TU-Berlin-2.0", + "seeAlso": [ + "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./UCL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/UCL-1.0.json", + "referenceNumber": "302", + "name": "Upstream Compatibility License v1.0", + "licenseId": "UCL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/UCL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./UPL-1.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/UPL-1.0.json", + "referenceNumber": "149", + "name": "Universal Permissive License v1.0", + "licenseId": "UPL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/UPL" + ], + "isOsiApproved": true + }, + { + "reference": "./Unicode-DFS-2015.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Unicode-DFS-2015.json", + "referenceNumber": "270", + "name": "Unicode License Agreement - Data Files and Software (2015)", + "licenseId": "Unicode-DFS-2015", + "seeAlso": [ + "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Unicode-DFS-2016.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Unicode-DFS-2016.json", + "referenceNumber": "382", + "name": "Unicode License Agreement - Data Files and Software (2016)", + "licenseId": "Unicode-DFS-2016", + "seeAlso": [ + "http://www.unicode.org/copyright.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Unicode-TOU.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Unicode-TOU.json", + "referenceNumber": "16", + "name": "Unicode Terms of Use", + "licenseId": "Unicode-TOU", + "seeAlso": [ + "http://www.unicode.org/copyright.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Unlicense.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Unlicense.json", + "referenceNumber": "179", + "name": "The Unlicense", + "licenseId": "Unlicense", + "seeAlso": [ + "https://unlicense.org/" + ], + "isOsiApproved": false + }, + { + "reference": "./VOSTROM.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/VOSTROM.json", + "referenceNumber": "363", + "name": "VOSTROM Public License for Open Source", + "licenseId": "VOSTROM", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/VOSTROM" + ], + "isOsiApproved": false + }, + { + "reference": "./VSL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/VSL-1.0.json", + "referenceNumber": "402", + "name": "Vovida Software License v1.0", + "licenseId": "VSL-1.0", + "seeAlso": [ + "https://opensource.org/licenses/VSL-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Vim.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Vim.json", + "referenceNumber": "213", + "name": "Vim License", + "licenseId": "Vim", + "seeAlso": [ + "http://vimdoc.sourceforge.net/htmldoc/uganda.html" + ], + "isOsiApproved": false + }, + { + "reference": "./W3C.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/W3C.json", + "referenceNumber": "111", + "name": "W3C Software Notice and License (2002-12-31)", + "licenseId": "W3C", + "seeAlso": [ + "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", + "https://opensource.org/licenses/W3C" + ], + "isOsiApproved": true + }, + { + "reference": "./W3C-19980720.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/W3C-19980720.json", + "referenceNumber": "276", + "name": "W3C Software Notice and License (1998-07-20)", + "licenseId": "W3C-19980720", + "seeAlso": [ + "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html" + ], + "isOsiApproved": false + }, + { + "reference": "./W3C-20150513.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/W3C-20150513.json", + "referenceNumber": "115", + "name": "W3C Software Notice and Document License (2015-05-13)", + "licenseId": "W3C-20150513", + "seeAlso": [ + "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document" + ], + "isOsiApproved": false + }, + { + "reference": "./WTFPL.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/WTFPL.json", + "referenceNumber": "20", + "name": "Do What The F*ck You Want To Public License", + "licenseId": "WTFPL", + "seeAlso": [ + "http://www.wtfpl.net/about/", + "http://sam.zoy.org/wtfpl/COPYING" + ], + "isOsiApproved": false + }, + { + "reference": "./Watcom-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Watcom-1.0.json", + "referenceNumber": "146", + "name": "Sybase Open Watcom Public License 1.0", + "licenseId": "Watcom-1.0", + "seeAlso": [ + "https://opensource.org/licenses/Watcom-1.0" + ], + "isOsiApproved": true + }, + { + "reference": "./Wsuipa.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Wsuipa.json", + "referenceNumber": "264", + "name": "Wsuipa License", + "licenseId": "Wsuipa", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Wsuipa" + ], + "isOsiApproved": false + }, + { + "reference": "./X11.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/X11.json", + "referenceNumber": "103", + "name": "X11 License", + "licenseId": "X11", + "seeAlso": [ + "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3" + ], + "isOsiApproved": false + }, + { + "reference": "./XFree86-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/XFree86-1.1.json", + "referenceNumber": "161", + "name": "XFree86 License 1.1", + "licenseId": "XFree86-1.1", + "seeAlso": [ + "http://www.xfree86.org/current/LICENSE4.html" + ], + "isOsiApproved": false + }, + { + "reference": "./XSkat.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/XSkat.json", + "referenceNumber": "85", + "name": "XSkat License", + "licenseId": "XSkat", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/XSkat_License" + ], + "isOsiApproved": false + }, + { + "reference": "./Xerox.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Xerox.json", + "referenceNumber": "232", + "name": "Xerox License", + "licenseId": "Xerox", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Xerox" + ], + "isOsiApproved": false + }, + { + "reference": "./Xnet.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Xnet.json", + "referenceNumber": "324", + "name": "X.Net License", + "licenseId": "Xnet", + "seeAlso": [ + "https://opensource.org/licenses/Xnet" + ], + "isOsiApproved": true + }, + { + "reference": "./YPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/YPL-1.0.json", + "referenceNumber": "303", + "name": "Yahoo! Public License v1.0", + "licenseId": "YPL-1.0", + "seeAlso": [ + "http://www.zimbra.com/license/yahoo_public_license_1.0.html" + ], + "isOsiApproved": false + }, + { + "reference": "./YPL-1.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/YPL-1.1.json", + "referenceNumber": "40", + "name": "Yahoo! Public License v1.1", + "licenseId": "YPL-1.1", + "seeAlso": [ + "http://www.zimbra.com/license/yahoo_public_license_1.1.html" + ], + "isOsiApproved": false + }, + { + "reference": "./ZPL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/ZPL-1.1.json", + "referenceNumber": "89", + "name": "Zope Public License 1.1", + "licenseId": "ZPL-1.1", + "seeAlso": [ + "http://old.zope.org/Resources/License/ZPL-1.1" + ], + "isOsiApproved": false + }, + { + "reference": "./ZPL-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/ZPL-2.0.json", + "referenceNumber": "116", + "name": "Zope Public License 2.0", + "licenseId": "ZPL-2.0", + "seeAlso": [ + "http://old.zope.org/Resources/License/ZPL-2.0", + "https://opensource.org/licenses/ZPL-2.0" + ], + "isOsiApproved": true + }, + { + "reference": "./ZPL-2.1.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/ZPL-2.1.json", + "referenceNumber": "380", + "name": "Zope Public License 2.1", + "licenseId": "ZPL-2.1", + "seeAlso": [ + "http://old.zope.org/Resources/ZPL/" + ], + "isOsiApproved": false + }, + { + "reference": "./Zed.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Zed.json", + "referenceNumber": "118", + "name": "Zed License", + "licenseId": "Zed", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Zed" + ], + "isOsiApproved": false + }, + { + "reference": "./Zend-2.0.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Zend-2.0.json", + "referenceNumber": "385", + "name": "Zend License v2.0", + "licenseId": "Zend-2.0", + "seeAlso": [ + "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./Zimbra-1.3.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Zimbra-1.3.json", + "referenceNumber": "181", + "name": "Zimbra Public License v1.3", + "licenseId": "Zimbra-1.3", + "seeAlso": [ + "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html" + ], + "isOsiApproved": false + }, + { + "reference": "./Zimbra-1.4.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/Zimbra-1.4.json", + "referenceNumber": "397", + "name": "Zimbra Public License v1.4", + "licenseId": "Zimbra-1.4", + "seeAlso": [ + "http://www.zimbra.com/legal/zimbra-public-license-1-4" + ], + "isOsiApproved": false + }, + { + "reference": "./Zlib.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/Zlib.json", + "referenceNumber": "45", + "name": "zlib License", + "licenseId": "Zlib", + "seeAlso": [ + "http://www.zlib.net/zlib_license.html", + "https://opensource.org/licenses/Zlib" + ], + "isOsiApproved": true + }, + { + "reference": "./blessing.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/blessing.json", + "referenceNumber": "312", + "name": "SQLite Blessing", + "licenseId": "blessing", + "seeAlso": [ + "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln\u003d4-9", + "https://sqlite.org/src/artifact/df5091916dbb40e6" + ], + "isOsiApproved": false + }, + { + "reference": "./bzip2-1.0.5.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/bzip2-1.0.5.json", + "referenceNumber": "193", + "name": "bzip2 and libbzip2 License v1.0.5", + "licenseId": "bzip2-1.0.5", + "seeAlso": [ + "https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html", + "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" + ], + "isOsiApproved": false + }, + { + "reference": "./bzip2-1.0.6.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/bzip2-1.0.6.json", + "referenceNumber": "72", + "name": "bzip2 and libbzip2 License v1.0.6", + "licenseId": "bzip2-1.0.6", + "seeAlso": [ + "https://sourceware.org/git/?p\u003dbzip2.git;a\u003dblob;f\u003dLICENSE;hb\u003dbzip2-1.0.6", + "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" + ], + "isOsiApproved": false + }, + { + "reference": "./copyleft-next-0.3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/copyleft-next-0.3.0.json", + "referenceNumber": "323", + "name": "copyleft-next 0.3.0", + "licenseId": "copyleft-next-0.3.0", + "seeAlso": [ + "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0" + ], + "isOsiApproved": false + }, + { + "reference": "./copyleft-next-0.3.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/copyleft-next-0.3.1.json", + "referenceNumber": "390", + "name": "copyleft-next 0.3.1", + "licenseId": "copyleft-next-0.3.1", + "seeAlso": [ + "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1" + ], + "isOsiApproved": false + }, + { + "reference": "./curl.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/curl.json", + "referenceNumber": "325", + "name": "curl License", + "licenseId": "curl", + "seeAlso": [ + "https://github.com/bagder/curl/blob/master/COPYING" + ], + "isOsiApproved": false + }, + { + "reference": "./diffmark.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/diffmark.json", + "referenceNumber": "410", + "name": "diffmark license", + "licenseId": "diffmark", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/diffmark" + ], + "isOsiApproved": false + }, + { + "reference": "./dvipdfm.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/dvipdfm.json", + "referenceNumber": "19", + "name": "dvipdfm License", + "licenseId": "dvipdfm", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/dvipdfm" + ], + "isOsiApproved": false + }, + { + "reference": "./eCos-2.0.html", + "isDeprecatedLicenseId": true, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/eCos-2.0.json", + "referenceNumber": "282", + "name": "eCos license version 2.0", + "licenseId": "eCos-2.0", + "seeAlso": [ + "https://www.gnu.org/licenses/ecos-license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./eGenix.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/eGenix.json", + "referenceNumber": "221", + "name": "eGenix.com Public License 1.1.0", + "licenseId": "eGenix", + "seeAlso": [ + "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", + "https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0" + ], + "isOsiApproved": false + }, + { + "reference": "./etalab-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/etalab-2.0.json", + "referenceNumber": "269", + "name": "Etalab Open License 2.0", + "licenseId": "etalab-2.0", + "seeAlso": [ + "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", + "https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./gSOAP-1.3b.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/gSOAP-1.3b.json", + "referenceNumber": "173", + "name": "gSOAP Public License v1.3b", + "licenseId": "gSOAP-1.3b", + "seeAlso": [ + "http://www.cs.fsu.edu/~engelen/license.html" + ], + "isOsiApproved": false + }, + { + "reference": "./gnuplot.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/gnuplot.json", + "referenceNumber": "395", + "name": "gnuplot License", + "licenseId": "gnuplot", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Gnuplot" + ], + "isOsiApproved": false + }, + { + "reference": "./iMatix.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/iMatix.json", + "referenceNumber": "183", + "name": "iMatix Standard Function Library Agreement", + "licenseId": "iMatix", + "seeAlso": [ + "http://legacy.imatix.com/html/sfl/sfl4.htm#license" + ], + "isOsiApproved": false + }, + { + "reference": "./libpng-2.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/libpng-2.0.json", + "referenceNumber": "107", + "name": "PNG Reference Library version 2", + "licenseId": "libpng-2.0", + "seeAlso": [ + "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" + ], + "isOsiApproved": false + }, + { + "reference": "./libselinux-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/libselinux-1.0.json", + "referenceNumber": "18", + "name": "libselinux public domain notice", + "licenseId": "libselinux-1.0", + "seeAlso": [ + "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE" + ], + "isOsiApproved": false + }, + { + "reference": "./libtiff.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/libtiff.json", + "referenceNumber": "420", + "name": "libtiff License", + "licenseId": "libtiff", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/libtiff" + ], + "isOsiApproved": false + }, + { + "reference": "./mpich2.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/mpich2.json", + "referenceNumber": "63", + "name": "mpich2 License", + "licenseId": "mpich2", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/MIT" + ], + "isOsiApproved": false + }, + { + "reference": "./psfrag.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/psfrag.json", + "referenceNumber": "421", + "name": "psfrag License", + "licenseId": "psfrag", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/psfrag" + ], + "isOsiApproved": false + }, + { + "reference": "./psutils.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/psutils.json", + "referenceNumber": "287", + "name": "psutils License", + "licenseId": "psutils", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/psutils" + ], + "isOsiApproved": false + }, + { + "reference": "./wxWindows.html", + "isDeprecatedLicenseId": true, + "detailsUrl": "http://spdx.org/licenses/wxWindows.json", + "referenceNumber": "252", + "name": "wxWindows Library License", + "licenseId": "wxWindows", + "seeAlso": [ + "https://opensource.org/licenses/WXwindows" + ], + "isOsiApproved": false + }, + { + "reference": "./xinetd.html", + "isDeprecatedLicenseId": false, + "isFsfLibre": true, + "detailsUrl": "http://spdx.org/licenses/xinetd.json", + "referenceNumber": "412", + "name": "xinetd License", + "licenseId": "xinetd", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Xinetd_License" + ], + "isOsiApproved": false + }, + { + "reference": "./xpp.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/xpp.json", + "referenceNumber": "100", + "name": "XPP License", + "licenseId": "xpp", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/xpp" + ], + "isOsiApproved": false + }, + { + "reference": "./zlib-acknowledgement.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "http://spdx.org/licenses/zlib-acknowledgement.json", + "referenceNumber": "254", + "name": "zlib/libpng License with Acknowledgement", + "licenseId": "zlib-acknowledgement", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement" + ], + "isOsiApproved": false + } + ], + "releaseDate": "2020-06-18" } \ No newline at end of file From de7edd403db516c46dc95d056061885554369cad Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 23 Jun 2020 01:39:10 +0800 Subject: [PATCH 032/149] brew update-license-data: checks if it is outdated. If so, save new ver --- .../Homebrew/dev-cmd/update-license-data.rb | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Library/Homebrew/dev-cmd/update-license-data.rb diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb new file mode 100644 index 0000000000..afcca90291 --- /dev/null +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require "commands" +require "cli/parser" +require "open-uri" +require "json" + +module Homebrew + module_function + SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze + FILE_NAME = "spdx.json".freeze + NEW_FILE_NAME = "spdx_new.json".freeze + SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" + + def update_license_data_args + Homebrew::CLI::Parser.new do + usage_banner <<~EOS + `update_license_data` + + Update SPDX license data in the Homebrew repository. + EOS + switch "--fail-if-outdated", + description: "Return a failing status code if current license data's version is different from the upstream. This "\ + "can be used to notify CI when the SPDX license data is out of date." + end + end + + def update_license_data + update_license_data_args.parse + p args + curr_spdx_hash = File.open(SPDX_FOLDER_PATH/FILE_NAME, 'r') do |f| + JSON.parse(f.read) + end + puts "Fetching newest version of SPDX License data..." + updated_spdx_string = open(SPDX_DATA_URL) do |json| + json.read + end + + updated_spdx_hash = JSON.parse(updated_spdx_string) + if curr_spdx_hash["licenseListVersion"] != updated_spdx_hash["licenseListVersion"] + + puts "Current version is #{curr_spdx_hash["licenseListVersion"]} but newest version is #{updated_spdx_hash["licenseListVersion"]}\n"\ + "Updating existing licences data file..." + File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| + file.write(updated_spdx_string) + end + if args.fail_if_outdated + Homebrew.failed = true + end + end + else + puts "Current version of license data is updated. No change required" + end + end From 8d7a9d51d33b9bab04e499b60e83323a2e9b5e4e Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 23 Jun 2020 01:42:24 +0800 Subject: [PATCH 033/149] audit: rename spdx_id to spdx_data --- Library/Homebrew/dev-cmd/audit.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index de54bbdc89..d5538ac0ef 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -112,20 +112,20 @@ module Homebrew style_results = Style.check_style_json(style_files, options) if style_files # load licenses full_path = File.join(File.dirname(__FILE__), "../data/spdx.json") - spdx_ids = File.open(full_path, "r") do |f| - JSON.parse(f.read) + spdx_data = File.open(full_path, "r") do |file| + JSON.parse(file.read) end new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only options = { - new_formula: new_formula, - strict: strict, - online: online, - git: git, - only: only, - except: args.except, - spdx_ids: spdx_ids, + new_formula: new_formula, + strict: strict, + online: online, + git: git, + only: only, + except: args.except, + spdx_data: spdx_data, } options[:style_offenses] = style_results.file_offenses(f.path) if style_results options[:display_cop_names] = args.display_cop_names? @@ -229,7 +229,7 @@ module Homebrew @new_formula_problems = [] @text = FormulaText.new(formula.path) @specs = %w[stable devel head].map { |s| formula.send(s) }.compact - @spdx_ids = options[:spdx_ids] + @spdx_data = options[:spdx_data] end def audit_style @@ -350,7 +350,7 @@ module Homebrew def audit_license if formula.license.present? - if @spdx_ids.key?(formula.license) + if @spdx_data.key?(formula.license) return unless @online user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) From e4e55c5cb38f468d1c01c0f8b938d96cd0b313b2 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 23 Jun 2020 02:25:46 +0800 Subject: [PATCH 034/149] update-license-data: wrote rspec test and added one more parseable arg --- .../Homebrew/dev-cmd/update-license-data.rb | 21 ++++++++++++------- .../test/dev-cmd/update_license_data_spec.rb | 9 ++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 Library/Homebrew/test/dev-cmd/update_license_data_spec.rb diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index afcca90291..c2f9f45d29 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -22,6 +22,11 @@ module Homebrew switch "--fail-if-outdated", description: "Return a failing status code if current license data's version is different from the upstream. This "\ "can be used to notify CI when the SPDX license data is out of date." + + switch "--do-not-replace", + description: "Flags out discrepancy between local and upstream versions, but does not replace" + + max_named 0 end end @@ -39,16 +44,16 @@ module Homebrew updated_spdx_hash = JSON.parse(updated_spdx_string) if curr_spdx_hash["licenseListVersion"] != updated_spdx_hash["licenseListVersion"] - puts "Current version is #{curr_spdx_hash["licenseListVersion"]} but newest version is #{updated_spdx_hash["licenseListVersion"]}\n"\ - "Updating existing licences data file..." - File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| - file.write(updated_spdx_string) - end - if args.fail_if_outdated - Homebrew.failed = true - end + puts "Current version is #{curr_spdx_hash["licenseListVersion"]} but newest version is #{updated_spdx_hash["licenseListVersion"]}" + unless args.do_not_replace? + puts "Updating existing licences data file..." + File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| + file.write(updated_spdx_string) + end end + Homebrew.failed = !!args.fail_if_outdated else puts "Current version of license data is updated. No change required" end end + end diff --git a/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb b/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb new file mode 100644 index 0000000000..279332f87e --- /dev/null +++ b/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb @@ -0,0 +1,9 @@ +require 'rspec' + +describe 'My behaviour' do + + it 'should do something' do + + true.should == false + end +end \ No newline at end of file From 127d67e745676c7d966b944b7212717b28eafd96 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 23 Jun 2020 02:59:55 +0800 Subject: [PATCH 035/149] license: update tests and license checking logic --- Library/Homebrew/dev-cmd/audit.rb | 2 +- Library/Homebrew/test/dev-cmd/audit_spec.rb | 16 ++++++++-------- .../test/dev-cmd/update_license_data_spec.rb | 12 +++++------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index d5538ac0ef..9516d7c8f8 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -350,7 +350,7 @@ module Homebrew def audit_license if formula.license.present? - if @spdx_data.key?(formula.license) + if @spdx_data["licenses"].any?{|lic| lic["licenseId"] == formula.license} return unless @online user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index eaef7af113..353aa9b785 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -96,7 +96,7 @@ module Homebrew end describe "#audit_license" do - let(:spdx_ids) { + let(:spdx_data) { full_path = File.join(File.dirname(__FILE__), "../../data/spdx.json") File.open(full_path, "r") do |f| JSON.parse(f.read) @@ -107,7 +107,7 @@ module Homebrew let(:standard_mismatch_spdx_id) { "0BSD" } it "does not check if the formula is not a new formula" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: false + fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: false class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "" @@ -119,7 +119,7 @@ module Homebrew end it "detects no license info" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: true + fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "" @@ -132,7 +132,7 @@ module Homebrew end it "detects if license is not a standard spdx-id" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: true + fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "#{custom_spdx_id}" @@ -144,7 +144,7 @@ module Homebrew end it "verifies that a license info is a standard spdx id" do - fa = formula_auditor "foo", <<~RUBY, spdx_ids: spdx_ids, new_formula: true + fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true class Foo < Formula url "https://brew.sh/foo-1.0.tgz" license "0BSD" @@ -157,7 +157,7 @@ module Homebrew it "checks online and verifies that a standard license id is the same "\ "as what is indicated on its Github repo" do - fa = formula_auditor "cask", <<~RUBY, spdx_ids: spdx_ids, online: true, core_tap: true, new_formula: true + fa = formula_auditor "cask", <<~RUBY, spdx_data: spdx_data, online: true, core_tap: true, new_formula: true class Cask < Formula url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" head "https://github.com/cask/cask.git" @@ -166,12 +166,12 @@ module Homebrew RUBY fa.audit_license - expect(fa.problems).to be_empty + expect(fa.problems).to be_empty end it "checks online and detects that a formula-specified license is not "\ "the same as what is indicated on its Github repository" do - fa = formula_auditor "cask", <<~RUBY, online: true, spdx_ids: spdx_ids, core_tap: true, new_formula: true + fa = formula_auditor "cask", <<~RUBY, online: true, spdx_data: spdx_data, core_tap: true, new_formula: true class Cask < Formula url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" head "https://github.com/cask/cask.git" diff --git a/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb b/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb index 279332f87e..d9be457801 100644 --- a/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb +++ b/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb @@ -1,9 +1,7 @@ -require 'rspec' +# frozen_string_literal: true -describe 'My behaviour' do +require "cmd/shared_examples/args_parse" - it 'should do something' do - - true.should == false - end -end \ No newline at end of file +describe "Homebrew.update_license_data_args" do + it_behaves_like "parseable arguments" +end From 9845091f4d20e449dcafd420953e538137580f47 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Wed, 24 Jun 2020 18:32:53 +0800 Subject: [PATCH 036/149] Apply suggestions from code review license: code review changes Co-authored-by: Mike McQuaid --- Library/Homebrew/Gemfile | 1 - Library/Homebrew/Gemfile.lock | 1 - Library/Homebrew/dev-cmd/audit.rb | 26 +++++++++---------- Library/Homebrew/dev-cmd/create.rb | 1 - .../Homebrew/dev-cmd/update-license-data.rb | 2 +- Library/Homebrew/formula.rb | 2 +- 6 files changed, 14 insertions(+), 19 deletions(-) diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile index 917787658d..3024597c27 100644 --- a/Library/Homebrew/Gemfile +++ b/Library/Homebrew/Gemfile @@ -13,7 +13,6 @@ gem "rspec-retry", require: false gem "rspec-wait", require: false gem "rubocop" gem "simplecov", require: false - if ENV["HOMEBREW_SORBET"] gem "sorbet" gem "sorbet-runtime" diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock index 2b4bdf763f..6c51d2f77e 100644 --- a/Library/Homebrew/Gemfile.lock +++ b/Library/Homebrew/Gemfile.lock @@ -128,7 +128,6 @@ DEPENDENCIES byebug concurrent-ruby coveralls (~> 0.8) - json mechanize parallel_tests plist diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 9516d7c8f8..4f2b40971e 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -111,21 +111,19 @@ module Homebrew # Check style in a single batch run up front for performance style_results = Style.check_style_json(style_files, options) if style_files # load licenses - full_path = File.join(File.dirname(__FILE__), "../data/spdx.json") - spdx_data = File.open(full_path, "r") do |file| - JSON.parse(file.read) - end + spdx = HOMEBREW_LIBRARY_PATH/"data/spdx.json" + JSON.parse(spdx.read) new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only options = { - new_formula: new_formula, - strict: strict, - online: online, - git: git, - only: only, - except: args.except, - spdx_data: spdx_data, + new_formula: new_formula, + strict: strict, + online: online, + git: git, + only: only, + except: args.except, + spdx_data: spdx_data, } options[:style_offenses] = style_results.file_offenses(f.path) if style_results options[:display_cop_names] = args.display_cop_names? @@ -350,7 +348,7 @@ module Homebrew def audit_license if formula.license.present? - if @spdx_data["licenses"].any?{|lic| lic["licenseId"] == formula.license} + if @spdx_data["licenses"].any? { |lic| lic["licenseId"] == formula.license } return unless @online user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) @@ -360,9 +358,9 @@ module Homebrew return if github_license && (github_license == formula.license) problem "License mismatch - GitHub license is: #{github_license}, "\ - "but Formulae license states: #{formula.license}." + "but formula license states: #{formula.license}." else - problem "#{formula.license} is not a standard SPDX license." + problem "#{formula.license} is not a SPDX license." end elsif @new_formula problem "No license specified for package." diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb index fd519ba0d3..40f9d28da2 100644 --- a/Library/Homebrew/dev-cmd/create.rb +++ b/Library/Homebrew/dev-cmd/create.rb @@ -49,7 +49,6 @@ module Homebrew description: "Explicitly set the of the new formula." flag "--tap=", description: "Generate the new formula within the given tap, specified as `/`." - switch :force switch :verbose switch :debug diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index c2f9f45d29..c93b732a42 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -19,7 +19,7 @@ module Homebrew Update SPDX license data in the Homebrew repository. EOS - switch "--fail-if-outdated", + switch "--fail-if-changed", description: "Return a failing status code if current license data's version is different from the upstream. This "\ "can be used to notify CI when the SPDX license data is out of date." diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index b401f2f1cc..6af0284f99 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -2207,7 +2207,7 @@ class Formula # The SPDX ID of the open-source license that the formula uses. # Shows when running `brew info`. # - #
license " BSD-2-Clause"
+ #
license "BSD-2-Clause"
attr_rw :license # @!attribute [w] homepage From ac818ec556470d29f524cc0f77debb84f10dd0ac Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 24 Jun 2020 18:50:46 +0800 Subject: [PATCH 037/149] commit older version to test git command --- Library/Homebrew/data/spdx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/data/spdx.json b/Library/Homebrew/data/spdx.json index 530b2796f1..5000b73938 100644 --- a/Library/Homebrew/data/spdx.json +++ b/Library/Homebrew/data/spdx.json @@ -1,5 +1,5 @@ { - "licenseListVersion": "3.9-4-g1a3102c", + "licenseListVersion": "3.8-4-g1a3102c", "licenses": [ { "reference": "./0BSD.html", From 4832a5aa05966fcfd1979613107401b5bf55bca8 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 24 Jun 2020 20:43:33 +0800 Subject: [PATCH 038/149] audit: modified problem statement to match --- Library/Homebrew/dev-cmd/audit.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 4f2b40971e..e6ce4c6f82 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -123,7 +123,7 @@ module Homebrew git: git, only: only, except: args.except, - spdx_data: spdx_data, + spdx_data: spdx_data, } options[:style_offenses] = style_results.file_offenses(f.path) if style_results options[:display_cop_names] = args.display_cop_names? @@ -358,9 +358,9 @@ module Homebrew return if github_license && (github_license == formula.license) problem "License mismatch - GitHub license is: #{github_license}, "\ - "but formula license states: #{formula.license}." + "but Formulae license states: #{formula.license}." else - problem "#{formula.license} is not a SPDX license." + problem "#{formula.license} is not a standard SPDX license." end elsif @new_formula problem "No license specified for package." From 992a30d02a9acfcbd527532b0f7812800d15ee48 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 24 Jun 2020 21:06:45 +0800 Subject: [PATCH 039/149] spdx: commit correct version of license data to test exit code --- Library/Homebrew/data/spdx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/data/spdx.json b/Library/Homebrew/data/spdx.json index 5000b73938..530b2796f1 100644 --- a/Library/Homebrew/data/spdx.json +++ b/Library/Homebrew/data/spdx.json @@ -1,5 +1,5 @@ { - "licenseListVersion": "3.8-4-g1a3102c", + "licenseListVersion": "3.9-4-g1a3102c", "licenses": [ { "reference": "./0BSD.html", From 221fd4f7c641beba1211080a6c417b093a4a9ed6 Mon Sep 17 00:00:00 2001 From: Lionell Date: Wed, 24 Jun 2020 21:12:10 +0800 Subject: [PATCH 040/149] wrong spdx to test exit code output --- Library/Homebrew/data/spdx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/data/spdx.json b/Library/Homebrew/data/spdx.json index 530b2796f1..95920c43ca 100644 --- a/Library/Homebrew/data/spdx.json +++ b/Library/Homebrew/data/spdx.json @@ -1,5 +1,5 @@ { - "licenseListVersion": "3.9-4-g1a3102c", + "licenseListVersion": "3.9-4-g1a3102cd", "licenses": [ { "reference": "./0BSD.html", From cbfea6c125247fa302b11c3062df570d5847501a Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 11:59:07 -0400 Subject: [PATCH 041/149] args: Add field for kegs and unknowns --- Library/Homebrew/cli/args.rb | 93 ++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index ac5fd1875b..90e5f4a11d 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -39,6 +39,7 @@ module Homebrew @formulae_paths = nil @casks = nil @kegs = nil + @kegs_and_unknowns = nil self[:named_args] = named_args self[:named_args].freeze @@ -108,55 +109,73 @@ module Homebrew end def kegs + @kegs ||= downcased_unique_named.map do |name| + resolve_keg name + rescue NoSuchKegError => e + if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall")) + $stderr.puts reason + end + raise e + end.freeze + end + + def kegs_and_unknowns + return @kegs_and_unknowns if @kegs_and_unknowns + + kegs = [] + unknowns = [] + downcased_unique_named.each do |name| + kegs << resolve_keg(name) + rescue NoSuchKegError + unknowns << name + end + + @kegs_and_unknowns = [kegs, unknowns] + end + + def resolve_keg(name) require "keg" require "formula" require "missing_formula" - @kegs ||= downcased_unique_named.map do |name| - raise UsageError if name.empty? + raise UsageError if name.empty? - rack = Formulary.to_rack(name.downcase) + rack = Formulary.to_rack(name.downcase) - dirs = rack.directory? ? rack.subdirs : [] + dirs = rack.directory? ? rack.subdirs : [] - if dirs.empty? - if (reason = Homebrew::MissingFormula.suggest_command(name, "uninstall")) - $stderr.puts reason - end - raise NoSuchKegError, rack.basename - end + raise NoSuchKegError, rack.basename if dirs.empty? - linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename - opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" + linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename + opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" - begin - if opt_prefix.symlink? && opt_prefix.directory? - Keg.new(opt_prefix.resolved_path) - elsif linked_keg_ref.symlink? && linked_keg_ref.directory? - Keg.new(linked_keg_ref.resolved_path) - elsif dirs.length == 1 - Keg.new(dirs.first) + begin + if opt_prefix.symlink? && opt_prefix.directory? + Keg.new(opt_prefix.resolved_path) + elsif linked_keg_ref.symlink? && linked_keg_ref.directory? + Keg.new(linked_keg_ref.resolved_path) + elsif dirs.length == 1 + Keg.new(dirs.first) + else + f = if name.include?("/") || File.exist?(name) + Formulary.factory(name) else - f = if name.include?("/") || File.exist?(name) - Formulary.factory(name) - else - Formulary.from_rack(rack) - end - - unless (prefix = f.installed_prefix).directory? - raise MultipleVersionsInstalledError, rack.basename - end - - Keg.new(prefix) + Formulary.from_rack(rack) end - rescue FormulaUnavailableError - raise <<~EOS - Multiple kegs installed to #{rack} - However we don't know which one you refer to. - Please delete (with rm -rf!) all but one and then try again. - EOS + + unless (prefix = f.installed_prefix).directory? + raise MultipleVersionsInstalledError, rack.basename + end + + Keg.new(prefix) end - end.freeze + rescue FormulaUnavailableError + raise <<~EOS + Multiple kegs installed to #{rack} + However we don't know which one you refer to. + Please delete (with rm -rf!) all but one and then try again. + EOS + end end def build_stable? From 90c26dadc7ec5021716fc0674b4b8b8dd8965293 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 11:59:55 -0400 Subject: [PATCH 042/149] uninstall: Add ability to reference casks from brew uninstall --- Library/Homebrew/cask/cmd/uninstall.rb | 38 ++++++++++++++------------ Library/Homebrew/cmd/uninstall.rb | 24 +++++++++++++--- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/Library/Homebrew/cask/cmd/uninstall.rb b/Library/Homebrew/cask/cmd/uninstall.rb index dfa8bbfb77..389fdb2792 100644 --- a/Library/Homebrew/cask/cmd/uninstall.rb +++ b/Library/Homebrew/cask/cmd/uninstall.rb @@ -12,26 +12,30 @@ module Cask def run casks.each do |cask| - odebug "Uninstalling Cask #{cask}" - - raise CaskNotInstalledError, cask unless cask.installed? || force? - - if cask.installed? && !cask.installed_caskfile.nil? - # use the same cask file that was used for installation, if possible - cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? - end - - Installer.new(cask, binaries: binaries?, verbose: verbose?, force: force?).uninstall - - next if (versions = cask.versions).empty? - - puts <<~EOS - #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. - Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. - EOS + uninstall_cask cask, binaries?, verbose?, force? end end + def self.uninstall_cask(cask, binaries, verbose, force) + odebug "Uninstalling Cask #{cask}" + + raise CaskNotInstalledError, cask unless cask.installed? || force + + if cask.installed? && !cask.installed_caskfile.nil? + # use the same cask file that was used for installation, if possible + cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? + end + + Installer.new(cask, binaries: binaries, verbose: verbose, force: force).uninstall + + return if (versions = cask.versions).empty? + + puts <<~EOS + #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. + Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. + EOS + end + def self.help "uninstalls the given Cask" end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index af66c9ac1e..7da4306b7a 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -5,6 +5,9 @@ require "formula" require "diagnostic" require "migrator" require "cli/parser" +require "cask/all" +require "cask/cmd" +require "cask/cask_loader" module Homebrew module_function @@ -29,15 +32,21 @@ module Homebrew def uninstall uninstall_args.parse - kegs_by_rack = if args.force? - Hash[args.named.map do |name| + if args.force? + possible_casks = [] + kegs_by_rack = Hash[args.named.map do |name| rack = Formulary.to_rack(name) - next unless rack.directory? + + unless rack.directory? + possible_casks << name + next + end [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - args.kegs.group_by(&:rack) + kegs_, possible_casks = args.kegs_and_unknowns + kegs_by_rack = kegs_.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) @@ -108,6 +117,13 @@ module Homebrew end end end + + possible_casks.each do |name| + cask = Cask::CaskLoader.load name + Cask::Cmd::Uninstall.uninstall_cask(cask, true, args.verbose, args.force?) + rescue Cask::CaskUnavailableError + ofail "No installed keg or cask with the name \"#{name}\"" + end rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions." From 16f16f3a383b8094c25ec97441c5944c7aee735a Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 14:10:49 -0400 Subject: [PATCH 043/149] uninstall: Add test for uninstalling cask --- Library/Homebrew/cask/cmd/uninstall.rb | 2 +- Library/Homebrew/test/cmd/uninstall_spec.rb | 47 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cask/cmd/uninstall.rb b/Library/Homebrew/cask/cmd/uninstall.rb index 389fdb2792..d554b6853d 100644 --- a/Library/Homebrew/cask/cmd/uninstall.rb +++ b/Library/Homebrew/cask/cmd/uninstall.rb @@ -12,7 +12,7 @@ module Cask def run casks.each do |cask| - uninstall_cask cask, binaries?, verbose?, force? + self.class.uninstall_cask cask, binaries?, verbose?, force? end end diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 696be790e3..247f1df374 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -17,6 +17,53 @@ describe "brew uninstall", :integration_test do .and not_to_output.to_stderr .and be_a_success end + + it "uninstalls a given Cask" do + caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) + Cask::Installer.new(caffeine).install + + expect { brew "uninstall", "local-caffeine" } + .to output(/Uninstalling Cask local-caffeine/).to_stdout + .and not_to_output.to_stderr + .and be_a_success + + expect(caffeine).not_to be_installed + + # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it + expect( + Find.find(TEST_TMPDIR) + .reject { |f| File.basename(f) == ".DS_Store" } + .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, + ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) + + rm_r "#{TEST_TMPDIR}/cask-appdir" + end + + it "uninstalls given Formulae and Casks" do + install_test_formula "testball" + + caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) + Cask::Installer.new(caffeine).install + + expect { brew "uninstall", "testball", "local-caffeine" } + .to output(%r{ + Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n + ==>\sUninstalling\sCask\slocal-caffeine + }x).to_stdout + .and not_to_output.to_stderr + .and be_a_success + + expect(caffeine).not_to be_installed + + # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it + expect( + Find.find(TEST_TMPDIR) + .reject { |f| File.basename(f) == ".DS_Store" } + .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, + ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) + + rm_r "#{TEST_TMPDIR}/cask-appdir" + end end describe Homebrew do From 5900263cabb8cb653ea698ea89990cf134afb3d1 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 14:53:03 -0400 Subject: [PATCH 044/149] args: Add resolved_formulae_and_unknowns --- Library/Homebrew/cli/args.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 90e5f4a11d..987ab61946 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -36,6 +36,7 @@ module Homebrew # Reset cache values reliant on named_args @formulae = nil @resolved_formulae = nil + @resolved_formulae_and_unknowns = nil @formulae_paths = nil @casks = nil @kegs = nil @@ -97,6 +98,19 @@ module Homebrew end.uniq(&:name).freeze end + def resolved_formulae_and_unknowns + return @resolved_formulae_and_unknowns if @resolved_formulae_and_unknowns + + resolved_formulae = [] + unknowns = [] + downcased_unique_named.each do |name| + resolved_formulae << Formulary.resolve(name, spec: spec(nil)) + rescue FormulaUnavailableError + unknowns << name + end + @resolved_formulae_and_unknowns = [resolved_formulae.freeze, unknowns.freeze].freeze + end + def formulae_paths @formulae_paths ||= (downcased_unique_named - casks).map do |name| Formulary.path(name) @@ -130,7 +144,7 @@ module Homebrew unknowns << name end - @kegs_and_unknowns = [kegs, unknowns] + @kegs_and_unknowns = [kegs.freeze, unknowns.freeze].freeze end def resolve_keg(name) From d1004c81430d6b893ff487a32b9c4fe70131a943 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 15:03:35 -0400 Subject: [PATCH 045/149] reinstall: Add ability to reference casks from brew reinstall --- Library/Homebrew/cmd/reinstall.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index c6abc8fa36..3f47614ddc 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -6,6 +6,7 @@ require "messages" require "reinstall" require "cli/parser" require "cleanup" +require "cask/all" module Homebrew module_function @@ -56,7 +57,8 @@ module Homebrew Install.perform_preinstall_checks - args.resolved_formulae.each do |f| + resolved_formulae, possible_casks = args.resolved_formulae_and_unknowns + resolved_formulae.each do |f| if f.pinned? onoe "#{f.full_name} is pinned. You must unpin it to reinstall." next @@ -66,5 +68,14 @@ module Homebrew Cleanup.install_formula_clean!(f) end Homebrew.messages.display_messages + + possible_casks.each do |name| + reinstall_cmd = Cask::Cmd::Reinstall.new(name) + reinstall_cmd.verbose = args.verbose? + reinstall_cmd.force = args.force? + reinstall_cmd.run + rescue Cask::CaskUnavailableError + ofail "No installed keg or cask with the name \"#{name}\"" + end end end From e733fa16a2365003d94d1fa7eccaa1f2adfcf324 Mon Sep 17 00:00:00 2001 From: William Ma Date: Wed, 24 Jun 2020 15:08:42 -0400 Subject: [PATCH 046/149] uninstall: Refactor to use AbstractCommand instead of declaring a class method --- Library/Homebrew/cask/cmd/uninstall.rb | 38 ++++++++++++-------------- Library/Homebrew/cmd/uninstall.rb | 6 ++-- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Library/Homebrew/cask/cmd/uninstall.rb b/Library/Homebrew/cask/cmd/uninstall.rb index d554b6853d..dfa8bbfb77 100644 --- a/Library/Homebrew/cask/cmd/uninstall.rb +++ b/Library/Homebrew/cask/cmd/uninstall.rb @@ -12,30 +12,26 @@ module Cask def run casks.each do |cask| - self.class.uninstall_cask cask, binaries?, verbose?, force? + odebug "Uninstalling Cask #{cask}" + + raise CaskNotInstalledError, cask unless cask.installed? || force? + + if cask.installed? && !cask.installed_caskfile.nil? + # use the same cask file that was used for installation, if possible + cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? + end + + Installer.new(cask, binaries: binaries?, verbose: verbose?, force: force?).uninstall + + next if (versions = cask.versions).empty? + + puts <<~EOS + #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. + Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. + EOS end end - def self.uninstall_cask(cask, binaries, verbose, force) - odebug "Uninstalling Cask #{cask}" - - raise CaskNotInstalledError, cask unless cask.installed? || force - - if cask.installed? && !cask.installed_caskfile.nil? - # use the same cask file that was used for installation, if possible - cask = CaskLoader.load(cask.installed_caskfile) if cask.installed_caskfile.exist? - end - - Installer.new(cask, binaries: binaries, verbose: verbose, force: force).uninstall - - return if (versions = cask.versions).empty? - - puts <<~EOS - #{cask} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed. - Remove #{(versions.count == 1) ? "it" : "them all"} with `brew cask uninstall --force #{cask}`. - EOS - end - def self.help "uninstalls the given Cask" end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 7da4306b7a..3d16ec70f5 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -119,8 +119,10 @@ module Homebrew end possible_casks.each do |name| - cask = Cask::CaskLoader.load name - Cask::Cmd::Uninstall.uninstall_cask(cask, true, args.verbose, args.force?) + cmd = Cask::Cmd::Uninstall.new(name) + cmd.force = args.force? + cmd.verbose = args.verbose? + cmd.run rescue Cask::CaskUnavailableError ofail "No installed keg or cask with the name \"#{name}\"" end From 3f267a8fc9409dcffd5e016990c74a63e874c053 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 05:09:56 +0800 Subject: [PATCH 047/149] audit: fix callers to call get_repo_data only if @new_formula --- Library/Homebrew/dev-cmd/audit.rb | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index e6ce4c6f82..0742b49b10 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -112,7 +112,9 @@ module Homebrew style_results = Style.check_style_json(style_files, options) if style_files # load licenses spdx = HOMEBREW_LIBRARY_PATH/"data/spdx.json" - JSON.parse(spdx.read) + spdx_data = open(spdx, "r") do |file| + JSON.parse(file.read) + end new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only @@ -351,7 +353,9 @@ module Homebrew if @spdx_data["licenses"].any? { |lic| lic["licenseId"] == formula.license } return unless @online - user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) + user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula + user ||= nil + repo ||= nil return if user.nil? github_license = GitHub.get_repo_license(user, repo) @@ -542,7 +546,9 @@ module Homebrew end def audit_github_repository - user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) + user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula + user ||=nil + repo ||=nil return if user.nil? warning = SharedAudits.github(user, repo) @@ -552,7 +558,9 @@ module Homebrew end def audit_gitlab_repository - user, repo = get_repo_data(%r{https?://gitlab\.com/([^/]+)/([^/]+)/?.*}) + user, repo = get_repo_data(%r{https?://gitlab\.com/([^/]+)/([^/]+)/?.*}) if @new_formula + user ||= nil + repo ||=nil return if user.nil? warning = SharedAudits.gitlab(user, repo) @@ -562,7 +570,9 @@ module Homebrew end def audit_bitbucket_repository - user, repo = get_repo_data(%r{https?://bitbucket\.org/([^/]+)/([^/]+)/?.*}) + user, repo = get_repo_data(%r{https?://bitbucket\.org/([^/]+)/([^/]+)/?.*}) if @new_formula + user ||= nil + repo ||= nil return if user.nil? warning = SharedAudits.bitbucket(user, repo) From 37541704b8b5a1ee54dec196c94735f9f50aabef Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 05:10:29 +0800 Subject: [PATCH 048/149] update-license-data: style fixes --- .../Homebrew/dev-cmd/update-license-data.rb | 63 +++++++------------ 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index c93b732a42..e198a25683 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -7,53 +7,38 @@ require "json" module Homebrew module_function - SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze - FILE_NAME = "spdx.json".freeze - NEW_FILE_NAME = "spdx_new.json".freeze - SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" - def update_license_data_args - Homebrew::CLI::Parser.new do - usage_banner <<~EOS - `update_license_data` + SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze + FILE_NAME = "spdx.json" + SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" - Update SPDX license data in the Homebrew repository. + def update_license_data_args + Homebrew::CLI::Parser.new do + usage_banner <<~EOS + `update_license_data` + + Update SPDX license data in the Homebrew repository. EOS - switch "--fail-if-changed", - description: "Return a failing status code if current license data's version is different from the upstream. This "\ - "can be used to notify CI when the SPDX license data is out of date." + switch "--fail-if-changed", + description: "Return a failing status code if current license data's version is different from the upstream. This "\ + "can be used to notify CI when the SPDX license data is out of date." - switch "--do-not-replace", - description: "Flags out discrepancy between local and upstream versions, but does not replace" - - max_named 0 - end - end - - def update_license_data - update_license_data_args.parse - p args - curr_spdx_hash = File.open(SPDX_FOLDER_PATH/FILE_NAME, 'r') do |f| - JSON.parse(f.read) - end - puts "Fetching newest version of SPDX License data..." - updated_spdx_string = open(SPDX_DATA_URL) do |json| - json.read + max_named 0 + end end - updated_spdx_hash = JSON.parse(updated_spdx_string) - if curr_spdx_hash["licenseListVersion"] != updated_spdx_hash["licenseListVersion"] - - puts "Current version is #{curr_spdx_hash["licenseListVersion"]} but newest version is #{updated_spdx_hash["licenseListVersion"]}" - unless args.do_not_replace? - puts "Updating existing licences data file..." + def update_license_data + update_license_data_args.parse + puts "Fetching newest version of SPDX License data..." + open(SPDX_DATA_URL) do |json| File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| - file.write(updated_spdx_string) + file.write(json.read) end end - Homebrew.failed = !!args.fail_if_outdated - else - puts "Current version of license data is updated. No change required" + + if args.fail_if_changed? + Homebrew.failed = true + system("git diff --stat --exit-code #{FILE_NAME}") + end end end - end From 2970abdc73c89313b353d3a1e9c57ec34d6a73ef Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 05:10:42 +0800 Subject: [PATCH 049/149] spdx.json: new version --- Library/Homebrew/data/spdx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/data/spdx.json b/Library/Homebrew/data/spdx.json index 95920c43ca..530b2796f1 100644 --- a/Library/Homebrew/data/spdx.json +++ b/Library/Homebrew/data/spdx.json @@ -1,5 +1,5 @@ { - "licenseListVersion": "3.9-4-g1a3102cd", + "licenseListVersion": "3.9-4-g1a3102c", "licenses": [ { "reference": "./0BSD.html", From fbd5c32d22d64b3be24224ebccfa28a42675f653 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 05:46:18 +0800 Subject: [PATCH 050/149] bunch of style fixes --- .../Homebrew/dev-cmd/update-license-data.rb | 54 +++++++++---------- Library/Homebrew/test/dev-cmd/audit_spec.rb | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index e198a25683..615df330e5 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -8,37 +8,37 @@ require "json" module Homebrew module_function - SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze - FILE_NAME = "spdx.json" - SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" + SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze + FILE_NAME = "spdx.json" + SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" - def update_license_data_args - Homebrew::CLI::Parser.new do - usage_banner <<~EOS - `update_license_data` + def update_license_data_args + Homebrew::CLI::Parser.new do + usage_banner <<~EOS + `update_license_data` Update SPDX license data in the Homebrew repository. EOS - switch "--fail-if-changed", - description: "Return a failing status code if current license data's version is different from the upstream. This "\ - "can be used to notify CI when the SPDX license data is out of date." + switch "--fail-if-changed", + description: "Return a failing status code if current license data's version is different from"\ + "the upstream. This can be used to notify CI when the SPDX license data is out of date." - max_named 0 - end - end - - def update_license_data - update_license_data_args.parse - puts "Fetching newest version of SPDX License data..." - open(SPDX_DATA_URL) do |json| - File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| - file.write(json.read) - end - end - - if args.fail_if_changed? - Homebrew.failed = true - system("git diff --stat --exit-code #{FILE_NAME}") - end + max_named 0 end end + + def update_license_data + update_license_data_args.parse + puts "Fetching newest version of SPDX License data..." + File.open(SPDX_DATA_URL) do |json| + File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| + file.write(json.read) + end + end + + return unless args.fail_if_changed? + + Homebrew.failed = true + system("git diff --stat --exit-code #{FILE_NAME}") + end +end diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 353aa9b785..12605668a3 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -166,7 +166,7 @@ module Homebrew RUBY fa.audit_license - expect(fa.problems).to be_empty + expect(fa.problems).to be_empty end it "checks online and detects that a formula-specified license is not "\ From 0304545d0cb334c5f24be63e1c639ff8989f7226 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 05:46:33 +0800 Subject: [PATCH 051/149] use File.open instead of Kernel.open --- Library/Homebrew/dev-cmd/audit.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 0742b49b10..52aa1f00e2 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -112,7 +112,7 @@ module Homebrew style_results = Style.check_style_json(style_files, options) if style_files # load licenses spdx = HOMEBREW_LIBRARY_PATH/"data/spdx.json" - spdx_data = open(spdx, "r") do |file| + spdx_data = File.open(spdx, "r") do |file| JSON.parse(file.read) end new_formula_problem_lines = [] From cc994b5c656344fa6e2773eb6e310ce7ad7b2d65 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 05:52:08 +0800 Subject: [PATCH 052/149] Commit man pages --- docs/Manpage.md | 7 +++++++ manpages/brew.1 | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/docs/Manpage.md b/docs/Manpage.md index ab6236778a..d497f06338 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -1018,6 +1018,13 @@ directory. * `-g`, `--git`: Initialise a Git repository in the unpacked source. This is useful for creating patches for the software. +### `update_license_data` *`cmd`* + + Update SPDX license data in the Homebrew repository. + +* `--fail-if-changed`: + Return a failing status code if current license data's version is different fromthe upstream. This can be used to notify CI when the SPDX license data is out of date. + ### `update-test` [*`options`*] Run a test of `brew update` with a new repository clone. If no options are diff --git a/manpages/brew.1 b/manpages/brew.1 index fd47c1a362..74779ac665 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -1311,6 +1311,13 @@ Patches for \fIformula\fR will be applied to the unpacked source\. \fB\-g\fR, \fB\-\-git\fR Initialise a Git repository in the unpacked source\. This is useful for creating patches for the software\. . +.SS "\fBupdate_license_data\fR \fIcmd\fR" +Update SPDX license data in the Homebrew repository\. +. +.TP +\fB\-\-fail\-if\-changed\fR +Return a failing status code if current license data\'s version is different fromthe upstream\. This can be used to notify CI when the SPDX license data is out of date\. +. .SS "\fBupdate\-test\fR [\fIoptions\fR]" Run a test of \fBbrew update\fR with a new repository clone\. If no options are passed, use \fBorigin/master\fR as the start commit\. . From 97ae608890cafe7e271976e18d6674fa4676b42d Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 13:44:26 +0800 Subject: [PATCH 053/149] update internal commands list --- completions/internal_commands_list.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/completions/internal_commands_list.txt b/completions/internal_commands_list.txt index ba9cceffdf..69f6c41c2a 100644 --- a/completions/internal_commands_list.txt +++ b/completions/internal_commands_list.txt @@ -86,6 +86,7 @@ unpin untap up update +update-license-data update-report update-reset update-test From 22baff39bc1433bfdd26139d2d18bd34c902c7fc Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Thu, 25 Jun 2020 15:36:55 +0800 Subject: [PATCH 054/149] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applying style-related suggestions from code review Co-authored-by: Dario Vladović --- Library/Homebrew/dev-cmd/audit.rb | 6 +++--- docs/Manpage.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 52aa1f00e2..d8fa4528a4 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -547,8 +547,8 @@ module Homebrew def audit_github_repository user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula - user ||=nil - repo ||=nil + user ||= nil + repo ||= nil return if user.nil? warning = SharedAudits.github(user, repo) @@ -560,7 +560,7 @@ module Homebrew def audit_gitlab_repository user, repo = get_repo_data(%r{https?://gitlab\.com/([^/]+)/([^/]+)/?.*}) if @new_formula user ||= nil - repo ||=nil + repo ||= nil return if user.nil? warning = SharedAudits.gitlab(user, repo) diff --git a/docs/Manpage.md b/docs/Manpage.md index 4762e5d12c..0be49ffe2d 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -1031,7 +1031,7 @@ directory. Update SPDX license data in the Homebrew repository. * `--fail-if-changed`: - Return a failing status code if current license data's version is different fromthe upstream. This can be used to notify CI when the SPDX license data is out of date. + Return a failing status code if the current license data's version is different from the upstream. This can be used to notify CI when the SPDX license data is out of date. ### `update-test` [*`options`*] From 62ffc26140f8d5b2e9bc82fa43b377045455250f Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 17:21:00 +0800 Subject: [PATCH 055/149] Update man page --- docs/Manpage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Manpage.md b/docs/Manpage.md index 0be49ffe2d..4762e5d12c 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -1031,7 +1031,7 @@ directory. Update SPDX license data in the Homebrew repository. * `--fail-if-changed`: - Return a failing status code if the current license data's version is different from the upstream. This can be used to notify CI when the SPDX license data is out of date. + Return a failing status code if current license data's version is different fromthe upstream. This can be used to notify CI when the SPDX license data is out of date. ### `update-test` [*`options`*] From eb38890f3c262130a3d33b6ebecd15202dd9ca3d Mon Sep 17 00:00:00 2001 From: Lionell Date: Thu, 25 Jun 2020 17:46:28 +0800 Subject: [PATCH 056/149] change back to open because File.open does not work on URLs --- .github/workflows/tests.yml | 3 +++ Library/Homebrew/dev-cmd/update-license-data.rb | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8b273bede7..f2d1663fde 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -114,6 +114,9 @@ jobs: - name: Run brew man run: brew man --fail-if-changed + - name: Check for outdated license data + run: brew update-license-data --fail-if-changed + - name: Run brew tests run: | # brew tests doesn't like world writable directories diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index 615df330e5..ee09174237 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -30,7 +30,7 @@ module Homebrew def update_license_data update_license_data_args.parse puts "Fetching newest version of SPDX License data..." - File.open(SPDX_DATA_URL) do |json| + open(SPDX_DATA_URL) do |json| File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| file.write(json.read) end From 5aa0eb487e72776d3f347c73a0dedcf79606fa74 Mon Sep 17 00:00:00 2001 From: Lionell Date: Thu, 25 Jun 2020 17:51:47 +0800 Subject: [PATCH 057/149] rename spec file --- .../{update_license_data_spec.rb => update-license-data_spec.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Library/Homebrew/test/dev-cmd/{update_license_data_spec.rb => update-license-data_spec.rb} (100%) diff --git a/Library/Homebrew/test/dev-cmd/update_license_data_spec.rb b/Library/Homebrew/test/dev-cmd/update-license-data_spec.rb similarity index 100% rename from Library/Homebrew/test/dev-cmd/update_license_data_spec.rb rename to Library/Homebrew/test/dev-cmd/update-license-data_spec.rb From 1b9cbf1bf1ae14cc386587504f3a6b8edbeac7c2 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 19:05:41 +0800 Subject: [PATCH 058/149] changed method of fetching license data --- Library/Homebrew/dev-cmd/update-license-data.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index ee09174237..e5985d456d 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -2,8 +2,9 @@ require "commands" require "cli/parser" -require "open-uri" require "json" +require 'net/http' +require "open-uri" module Homebrew module_function @@ -30,10 +31,10 @@ module Homebrew def update_license_data update_license_data_args.parse puts "Fetching newest version of SPDX License data..." - open(SPDX_DATA_URL) do |json| - File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| - file.write(json.read) - end + resp = Net::HTTP.get_response(URI.parse(SPDX_DATA_URL)) + + File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| + file.write(resp.body) end return unless args.fail_if_changed? From 77a8ff51da20ed08c4dcc2815c1d0da75e83e922 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 19:20:26 +0800 Subject: [PATCH 059/149] single quotes -> double quotes --- Library/Homebrew/dev-cmd/update-license-data.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index e5985d456d..a785db12ba 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -3,7 +3,7 @@ require "commands" require "cli/parser" require "json" -require 'net/http' +require "net/http" require "open-uri" module Homebrew From 2cf0ac9ed5c429aa61c2bbf52eab5be70d2b8f14 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 20:34:06 +0800 Subject: [PATCH 060/149] update-spdx-data: use a more specific file path --- Library/Homebrew/dev-cmd/update-license-data.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index a785db12ba..c118c1c5ce 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -40,6 +40,6 @@ module Homebrew return unless args.fail_if_changed? Homebrew.failed = true - system("git diff --stat --exit-code #{FILE_NAME}") + system("git diff --stat --exit-code #{SPDX_FOLDER_PATH/FILE_NAME}") end end From 6a05e3663a824e4d92949541a62112003fa897b7 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Thu, 25 Jun 2020 21:06:29 +0800 Subject: [PATCH 061/149] Remove Homebrew.failed=true --- Library/Homebrew/dev-cmd/update-license-data.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index c118c1c5ce..7d5c5fdeb9 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -39,7 +39,6 @@ module Homebrew return unless args.fail_if_changed? - Homebrew.failed = true system("git diff --stat --exit-code #{SPDX_FOLDER_PATH/FILE_NAME}") end end From f03336bb4077f5dd0c71f44088ed29ec638749e4 Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 25 Jun 2020 09:13:02 -0400 Subject: [PATCH 062/149] uninstall: Clean up cask-appdir after tests --- Library/Homebrew/test/cmd/uninstall_spec.rb | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 247f1df374..9d0e5590d7 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -29,14 +29,7 @@ describe "brew uninstall", :integration_test do expect(caffeine).not_to be_installed - # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it - expect( - Find.find(TEST_TMPDIR) - .reject { |f| File.basename(f) == ".DS_Store" } - .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, - ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) - - rm_r "#{TEST_TMPDIR}/cask-appdir" + rm_r(TEST_TMPDIR + "/cask-appdir") end it "uninstalls given Formulae and Casks" do @@ -55,14 +48,7 @@ describe "brew uninstall", :integration_test do expect(caffeine).not_to be_installed - # expect TEST_TMPDIR/cask-appdir to exist and be empty, then delete it - expect( - Find.find(TEST_TMPDIR) - .reject { |f| File.basename(f) == ".DS_Store" } - .filter { |f| File.path(f).start_with?("#{TEST_TMPDIR}/cask-appdir") }, - ).to eq(["#{TEST_TMPDIR}/cask-appdir"]) - - rm_r "#{TEST_TMPDIR}/cask-appdir" + rm_r(TEST_TMPDIR + "/cask-appdir") end end From 759708fae7dd3c9e5867ae42be34631dfe535964 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Sun, 28 Jun 2020 01:54:41 +0800 Subject: [PATCH 063/149] Apply suggestions from code review Code Review Changes Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/audit.rb | 6 ++---- Library/Homebrew/dev-cmd/update-license-data.rb | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index d8fa4528a4..d4727d34e1 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -112,9 +112,7 @@ module Homebrew style_results = Style.check_style_json(style_files, options) if style_files # load licenses spdx = HOMEBREW_LIBRARY_PATH/"data/spdx.json" - spdx_data = File.open(spdx, "r") do |file| - JSON.parse(file.read) - end + spdx_data = JSON.parse(spdx.read) new_formula_problem_lines = [] audit_formulae.sort.each do |f| only = only_cops ? ["style"] : args.only @@ -356,7 +354,7 @@ module Homebrew user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula user ||= nil repo ||= nil - return if user.nil? + return if user.blank? github_license = GitHub.get_repo_license(user, repo) return if github_license && (github_license == formula.license) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index 7d5c5fdeb9..dde7ed29df 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -11,7 +11,7 @@ module Homebrew SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze FILE_NAME = "spdx.json" - SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" + SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/HEAD/json/licenses.json" def update_license_data_args Homebrew::CLI::Parser.new do From 4d4f6a8facd5eaf8668d74ddb7a575b0a792a498 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Sun, 28 Jun 2020 02:07:32 +0800 Subject: [PATCH 064/149] audit: remove unnecessary nil assignment --- Library/Homebrew/dev-cmd/audit.rb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index d4727d34e1..24f1116cde 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -352,8 +352,6 @@ module Homebrew return unless @online user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula - user ||= nil - repo ||= nil return if user.blank? github_license = GitHub.get_repo_license(user, repo) @@ -545,8 +543,7 @@ module Homebrew def audit_github_repository user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula - user ||= nil - repo ||= nil + return if user.nil? warning = SharedAudits.github(user, repo) @@ -557,8 +554,6 @@ module Homebrew def audit_gitlab_repository user, repo = get_repo_data(%r{https?://gitlab\.com/([^/]+)/([^/]+)/?.*}) if @new_formula - user ||= nil - repo ||= nil return if user.nil? warning = SharedAudits.gitlab(user, repo) @@ -569,8 +564,6 @@ module Homebrew def audit_bitbucket_repository user, repo = get_repo_data(%r{https?://bitbucket\.org/([^/]+)/([^/]+)/?.*}) if @new_formula - user ||= nil - repo ||= nil return if user.nil? warning = SharedAudits.bitbucket(user, repo) From 90309e5f42a9c60c6040d9d4ee0401fa413d1c7e Mon Sep 17 00:00:00 2001 From: Jonathan Chang Date: Sat, 27 Jun 2020 22:01:51 +1000 Subject: [PATCH 065/149] github: fetch approved reviews for a pull request --- Library/Homebrew/test/utils/github_spec.rb | 7 ++++ Library/Homebrew/utils/github.rb | 46 ++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/Library/Homebrew/test/utils/github_spec.rb b/Library/Homebrew/test/utils/github_spec.rb index 939ac6de5b..354c2585c4 100644 --- a/Library/Homebrew/test/utils/github_spec.rb +++ b/Library/Homebrew/test/utils/github_spec.rb @@ -42,6 +42,13 @@ describe GitHub do end end + describe "::approved_reviews", :needs_network do + it "can get reviews for a pull request" do + reviews = subject.approved_reviews("Homebrew", "homebrew-core", 1, commit: "deadbeef") + expect(reviews).to eq([]) + end + end + describe "::get_artifact_url", :needs_network do it "fails to find a nonexistant workflow" do expect { diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 556089c091..eae33a8eaf 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -394,6 +394,52 @@ module GitHub open_api(uri) { |json| json.fetch("items", []) } end + def approved_reviews(user, repo, pr, commit: nil) + url = "https://api.github.com/graphql" + data = { + query: <<~EOS, + { repository(name: "#{repo}", owner: "#{user}") { + pullRequest(number: #{pr}) { + reviews(states: APPROVED, first: 100) { + nodes { + author { + ... on User { email login name databaseId } + ... on Organization { email login name databaseId } + } + authorAssociation + commit { oid } + } + } + } + } + } + EOS + } + result = open_api(url, data: data, request_method: "POST") + raise Error, result["errors"] if result["errors"].present? + + reviews = result["data"]["repository"]["pullRequest"]["reviews"]["nodes"] + + reviews.map do |r| + next if commit.present? && commit != r["commit"]["oid"] + next unless %w[MEMBER OWNER].include? r["authorAssociation"] + + email = if r["author"]["email"].empty? + "#{r["author"]["databaseId"]}+#{r["author"]["login"]}@users.noreply.github.com" + else + r["author"]["email"] + end + + name = r["author"]["name"] || r["author"]["login"] + + { + "email" => email, + "name" => name, + "login" => r["author"]["login"], + } + end.compact + end + def dispatch_event(user, repo, event, **payload) url = "#{API_URL}/repos/#{user}/#{repo}/dispatches" open_api(url, data: { event_type: event, client_payload: payload }, From bada8dd7597ddaae8c2b88d1b5debc5cf4898422 Mon Sep 17 00:00:00 2001 From: Jonathan Chang Date: Sat, 27 Jun 2020 23:00:05 +1000 Subject: [PATCH 066/149] pr-pull: add review approval trailers on signoff --- Library/Homebrew/dev-cmd/pr-pull.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/dev-cmd/pr-pull.rb b/Library/Homebrew/dev-cmd/pr-pull.rb index c5f82ec116..24d7e4e0f9 100644 --- a/Library/Homebrew/dev-cmd/pr-pull.rb +++ b/Library/Homebrew/dev-cmd/pr-pull.rb @@ -73,13 +73,18 @@ module Homebrew end end - def signoff!(pr, path: ".") - message = Utils.popen_read "git", "-C", path, "log", "-1", "--pretty=%B" + def signoff!(pr, tap:) + message = Utils.popen_read "git", "-C", tap.path, "log", "-1", "--pretty=%B" subject = message.lines.first.strip # Skip the subject and separate lines that look like trailers (e.g. "Co-authored-by") # from lines that look like regular body text. trailers, body = message.lines.drop(1).partition { |s| s.match?(/^[a-z-]+-by:/i) } + + # Approving reviewers also sign-off on merge + trailers += GitHub.approved_reviews(tap.user, "homebrew-#{tap.repo}", pr).map do |r| + "Signed-off-by: #{r["name"]} <#{r["email"]}>\n" + end trailers = trailers.uniq.join.strip body = body.join.strip.gsub(/\n{3,}/, "\n\n") @@ -90,7 +95,7 @@ module Homebrew if Homebrew.args.dry_run? puts "git commit --amend --signoff -m $message" else - safe_system "git", "-C", path, "commit", "--amend", "--signoff", "--allow-empty", "-q", "-m", new_message + safe_system "git", "-C", tap.path, "commit", "--amend", "--signoff", "--allow-empty", "-q", "-m", new_message end end @@ -232,7 +237,7 @@ module Homebrew cd dir do original_commit = Utils.popen_read("git", "-C", tap.path, "rev-parse", "HEAD").chomp cherry_pick_pr! pr, path: tap.path - signoff! pr, path: tap.path unless args.clean? + signoff! pr, tap: tap unless args.clean? unless args.no_upload? mirror_formulae(tap, original_commit, org: bintray_org, repo: mirror_repo, publish: !args.no_publish?) From 688a9ade0dd47bc83568253cab349c3bad2abe63 Mon Sep 17 00:00:00 2001 From: Lionell Date: Mon, 29 Jun 2020 16:12:05 +0800 Subject: [PATCH 067/149] change .nil? to .blank? --- Library/Homebrew/dev-cmd/audit.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 095d0bcef0..c6469d1f98 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -530,7 +530,7 @@ module Homebrew def audit_github_repository user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula - return if user.nil? + return if user.blank? warning = SharedAudits.github(user, repo) return if warning.nil? @@ -540,7 +540,7 @@ module Homebrew def audit_gitlab_repository user, repo = get_repo_data(%r{https?://gitlab\.com/([^/]+)/([^/]+)/?.*}) if @new_formula - return if user.nil? + return if user.blank? warning = SharedAudits.gitlab(user, repo) return if warning.nil? @@ -550,7 +550,7 @@ module Homebrew def audit_bitbucket_repository user, repo = get_repo_data(%r{https?://bitbucket\.org/([^/]+)/([^/]+)/?.*}) if @new_formula - return if user.nil? + return if user.blank? warning = SharedAudits.bitbucket(user, repo) return if warning.nil? From da007134c4f6ee37643752c662165d8da475c067 Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Mon, 29 Jun 2020 16:20:07 +0800 Subject: [PATCH 068/149] Apply suggestions from code review Code review changes Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/update-license-data.rb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index dde7ed29df..f7579cafe2 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -18,11 +18,11 @@ module Homebrew usage_banner <<~EOS `update_license_data` - Update SPDX license data in the Homebrew repository. + Update SPDX license data in the Homebrew repository. EOS switch "--fail-if-changed", - description: "Return a failing status code if current license data's version is different from"\ - "the upstream. This can be used to notify CI when the SPDX license data is out of date." + description: "Return a failing status code if current license data's version is different from " \ + "the upstream. This can be used to notify CI when the SPDX license data is out of date." max_named 0 end @@ -30,15 +30,12 @@ module Homebrew def update_license_data update_license_data_args.parse - puts "Fetching newest version of SPDX License data..." - resp = Net::HTTP.get_response(URI.parse(SPDX_DATA_URL)) - - File.open(SPDX_FOLDER_PATH/FILE_NAME, "wb") do |file| - file.write(resp.body) - end + ohai "Updating SPDX license data..." + spdx_data = curl(SPDX_DATA_URL) + SPDX_PATH.write(spdx_data) return unless args.fail_if_changed? - system("git diff --stat --exit-code #{SPDX_FOLDER_PATH/FILE_NAME}") + system("git diff --stat --exit-code #{SPDX_PATH}") end end From 9cab9b7f39cb2c9d306c0dfcf33d7e1aa50c2ce3 Mon Sep 17 00:00:00 2001 From: Jonathan Chang Date: Mon, 29 Jun 2020 18:55:47 +1000 Subject: [PATCH 069/149] pr-pull: handle empty string cases Co-authored-by: Mike McQuaid --- Library/Homebrew/utils/github.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index eae33a8eaf..217332c733 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -424,13 +424,13 @@ module GitHub next if commit.present? && commit != r["commit"]["oid"] next unless %w[MEMBER OWNER].include? r["authorAssociation"] - email = if r["author"]["email"].empty? + email = if r["author"]["email"].blank? "#{r["author"]["databaseId"]}+#{r["author"]["login"]}@users.noreply.github.com" else r["author"]["email"] end - name = r["author"]["name"] || r["author"]["login"] + name = r["author"]["name"].presence || r["author"]["login"] { "email" => email, From 4dc2df6e6a8c69365a0990bba707bf81c8e2eb7f Mon Sep 17 00:00:00 2001 From: William Ma Date: Mon, 29 Jun 2020 10:13:29 -0400 Subject: [PATCH 070/149] uninstall: Run cask uninstall tests only on macos --- Library/Homebrew/test/cmd/uninstall_spec.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 9d0e5590d7..7edabe911e 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -17,15 +17,17 @@ describe "brew uninstall", :integration_test do .and not_to_output.to_stderr .and be_a_success end +end +describe "brew uninstall cask", :integration_test, :needs_macos do it "uninstalls a given Cask" do caffeine = Cask::CaskLoader.load(cask_path("local-caffeine")) Cask::Installer.new(caffeine).install expect { brew "uninstall", "local-caffeine" } .to output(/Uninstalling Cask local-caffeine/).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed @@ -43,8 +45,8 @@ describe "brew uninstall", :integration_test do Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n ==>\sUninstalling\sCask\slocal-caffeine }x).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed From 7d4fadc2bbd50f7ea5e2eeef8f846b6f32fc6cf1 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:06:59 +0800 Subject: [PATCH 071/149] Update man pages --- docs/Manpage.md | 4 ++-- manpages/brew.1 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Manpage.md b/docs/Manpage.md index e75a8540b5..60b165e940 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -1030,10 +1030,10 @@ directory. ### `update_license_data` *`cmd`* - Update SPDX license data in the Homebrew repository. + Update SPDX license data in the Homebrew repository. * `--fail-if-changed`: - Return a failing status code if current license data's version is different fromthe upstream. This can be used to notify CI when the SPDX license data is out of date. + Return a failing status code if current license data's version is different from the upstream. This can be used to notify CI when the SPDX license data is out of date. ### `update-test` [*`options`*] diff --git a/manpages/brew.1 b/manpages/brew.1 index b0c5112e79..4ce59d62e8 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -1336,7 +1336,7 @@ Update SPDX license data in the Homebrew repository\. . .TP \fB\-\-fail\-if\-changed\fR -Return a failing status code if current license data\'s version is different fromthe upstream\. This can be used to notify CI when the SPDX license data is out of date\. +Return a failing status code if current license data\'s version is different from the upstream\. This can be used to notify CI when the SPDX license data is out of date\. . .SS "\fBupdate\-test\fR [\fIoptions\fR]" Run a test of \fBbrew update\fR with a new repository clone\. If no options are passed, use \fBorigin/master\fR as the start commit\. From 93d46c6d6c69d5279404bce211cb2f48120076f9 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:08:09 +0800 Subject: [PATCH 072/149] Pathname::write: allow optional override --- Library/Homebrew/extend/pathname.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index 33a937b5d7..e97302084e 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -150,8 +150,8 @@ class Pathname alias old_write write # We assume this pathname object is a file, obviously - def write(content, *open_args) - raise "Will not overwrite #{self}" if exist? + def write(content, overwrite = false, *open_args) + raise "Will not overwrite #{self}" if exist? && !overwrite dirname.mkpath open("w", *open_args) { |f| f.write(content) } From 074f66f91287fa40a4df8921f4f8a9b0d68ca776 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:08:29 +0800 Subject: [PATCH 073/149] write .stdout instead of SystemCommand::Result --- Library/Homebrew/dev-cmd/update-license-data.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index f7579cafe2..9e35cf33b3 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -9,8 +9,7 @@ require "open-uri" module Homebrew module_function - SPDX_FOLDER_PATH = (HOMEBREW_LIBRARY_PATH/"data").freeze - FILE_NAME = "spdx.json" + SPDX_PATH = (HOMEBREW_LIBRARY_PATH/"data/spdx.json").freeze SPDX_DATA_URL = "https://raw.githubusercontent.com/spdx/license-list-data/HEAD/json/licenses.json" def update_license_data_args @@ -31,9 +30,8 @@ module Homebrew def update_license_data update_license_data_args.parse ohai "Updating SPDX license data..." - spdx_data = curl(SPDX_DATA_URL) - SPDX_PATH.write(spdx_data) - + spdx_download_result = curl(SPDX_DATA_URL) + SPDX_PATH.write(spdx_download_result.stdout, true) return unless args.fail_if_changed? system("git diff --stat --exit-code #{SPDX_PATH}") From 02bc870e915f88145761b11d2065d8f2964c50ba Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:13:02 +0800 Subject: [PATCH 074/149] curl: modified curl to allow optional print_stdout --- Library/Homebrew/utils/curl.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/utils/curl.rb b/Library/Homebrew/utils/curl.rb index 7503e16822..09948e6a45 100644 --- a/Library/Homebrew/utils/curl.rb +++ b/Library/Homebrew/utils/curl.rb @@ -44,12 +44,12 @@ def curl_args(*extra_args, show_output: false, user_agent: :default) args + extra_args end -def curl(*args, secrets: [], **options) +def curl(*args, print_stdout: true, secrets: [], **options) # SSL_CERT_FILE can be incorrectly set by users or portable-ruby and screw # with SSL downloads so unset it here. system_command! curl_executable, args: curl_args(*args, **options), - print_stdout: true, + print_stdout: print_stdout, env: { "SSL_CERT_FILE" => nil }, secrets: secrets end From 5b3ac1fcb2d4fdfecaa37184fb1c76f10b2eabe5 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:14:05 +0800 Subject: [PATCH 075/149] update-license-data: modify arguments when calling methods --- Library/Homebrew/dev-cmd/update-license-data.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index 9e35cf33b3..713694619e 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -30,8 +30,8 @@ module Homebrew def update_license_data update_license_data_args.parse ohai "Updating SPDX license data..." - spdx_download_result = curl(SPDX_DATA_URL) - SPDX_PATH.write(spdx_download_result.stdout, true) + spdx_download_result = curl(SPDX_DATA_URL, print_stdout: false) + SPDX_PATH.write(spdx_download_result.stdout, overwrite: true) return unless args.fail_if_changed? system("git diff --stat --exit-code #{SPDX_PATH}") From d921e94a2b72aaa6b6232a13c045d62578e29dfe Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Fri, 5 Jun 2020 17:53:23 -0400 Subject: [PATCH 076/149] rubocop: separate args for shell commands Use `system "foo", "bar"` instead of `system "foo bar"`. Also applies to `Utils.popen_read` and `Utils.popen_write` commands. RuboCop can automatically fix these problems. --- Library/Homebrew/dev-cmd/audit.rb | 9 -- Library/Homebrew/rubocops/lines.rb | 49 +++++++ Library/Homebrew/test/rubocops/lines_spec.rb | 144 +++++++++++++++++++ 3 files changed, 193 insertions(+), 9 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 9210c975f9..084fdbab74 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -844,15 +844,6 @@ module Homebrew # TODO: check could be in RuboCop problem "`env :userpaths` in formulae is deprecated" if line.include?("env :userpaths") - if line =~ /system ((["'])[^"' ]*(?:\s[^"' ]*)+\2)/ - bad_system = Regexp.last_match(1) - unless %w[| < > & ; *].any? { |c| bad_system.include? c } - good_system = bad_system.gsub(" ", "\", \"") - # TODO: check could be in RuboCop - problem "Use `system #{good_system}` instead of `system #{bad_system}` " - end - end - # TODO: check could be in RuboCop problem "`#{Regexp.last_match(1)}` is now unnecessary" if line =~ /(require ["']formula["'])/ diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb index faa5f6ff80..d8708c2362 100644 --- a/Library/Homebrew/rubocops/lines.rb +++ b/Library/Homebrew/rubocops/lines.rb @@ -252,6 +252,55 @@ module RuboCop end end + class ShellCommands < FormulaCop + def audit_formula(_node, _class_node, _parent_class_node, body_node) + # Match shell commands separated by spaces in the same string + shell_cmd_with_spaces_regex = /[^"' ]*(?:\s[^"' ]*)+/ + + popen_commands = [ + :popen_read, + :safe_popen_read, + :popen_write, + :safe_popen_write, + ] + + shell_metacharacters = %w[> >> < << | ; & && || *] + + find_every_method_call_by_name(body_node, :system).each do |method| + # Continue if a shell metacharacter is present + next if shell_metacharacters.any? { |meta| string_content(parameters(method).first).include?(meta) } + + next unless match = regex_match_group(parameters(method).first, shell_cmd_with_spaces_regex) + + good_args = match[0].gsub(" ", "\", \"") + offending_node(parameters(method).first) + problem "Separate `system` commands into `\"#{good_args}\"`" + end + + popen_commands.each do |command| + find_instance_method_call(body_node, "Utils", command) do |method| + index = parameters(method).first.hash_type? ? 1 : 0 + + # Continue if a shell metacharacter is present + next if shell_metacharacters.any? { |meta| string_content(parameters(method)[index]).include?(meta) } + + next unless match = regex_match_group(parameters(method)[index], shell_cmd_with_spaces_regex) + + good_args = match[0].gsub(" ", "\", \"") + offending_node(parameters(method)[index]) + problem "Separate `Utils.#{command}` commands into `\"#{good_args}\"`" + end + end + end + + def autocorrect(node) + lambda do |corrector| + good_args = node.source.gsub(" ", "\", \"") + corrector.replace(node.source_range, good_args) + end + end + end + class Miscellaneous < FormulaCop def audit_formula(_node, _class_node, _parent_class_node, body_node) # FileUtils is included in Formula diff --git a/Library/Homebrew/test/rubocops/lines_spec.rb b/Library/Homebrew/test/rubocops/lines_spec.rb index 9c92e47850..395c3de540 100644 --- a/Library/Homebrew/test/rubocops/lines_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_spec.rb @@ -574,6 +574,150 @@ describe RuboCop::Cop::FormulaAudit::ShellVariables do end end +describe RuboCop::Cop::FormulaAudit::ShellCommands do + subject(:cop) { described_class.new } + + context "When auditing shell commands" do + it "system arguments should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + system "foo bar" + ^^^^^^^^^ Separate `system` commands into `\"foo\", \"bar\"` + end + end + RUBY + end + + it "system arguments with string interpolation should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + system "\#{bin}/foo bar" + ^^^^^^^^^^^^^^^^ Separate `system` commands into `\"\#{bin}/foo\", \"bar\"` + end + end + RUBY + end + + it "system arguments with metacharacters should not be separated" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + def install + system "foo bar > baz" + end + end + RUBY + end + + it "only the first system argument should be separated" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + def install + system "foo", "bar baz" + end + end + RUBY + end + + it "Utils.popen arguments should not be separated" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + def install + Utils.popen("foo bar") + end + end + RUBY + end + + it "Utils.popen_read arguments should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + Utils.popen_read("foo bar") + ^^^^^^^^^ Separate `Utils.popen_read` commands into `\"foo\", \"bar\"` + end + end + RUBY + end + + it "Utils.safe_popen_read arguments should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + Utils.safe_popen_read("foo bar") + ^^^^^^^^^ Separate `Utils.safe_popen_read` commands into `\"foo\", \"bar\"` + end + end + RUBY + end + + it "Utils.popen_write arguments should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + Utils.popen_write("foo bar") + ^^^^^^^^^ Separate `Utils.popen_write` commands into `\"foo\", \"bar\"` + end + end + RUBY + end + + it "Utils.safe_popen_write arguments should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + Utils.safe_popen_write("foo bar") + ^^^^^^^^^ Separate `Utils.safe_popen_write` commands into `\"foo\", \"bar\"` + end + end + RUBY + end + + it "Utils.popen_read arguments with string interpolation should be separated" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + Utils.popen_read("\#{bin}/foo bar") + ^^^^^^^^^^^^^^^^ Separate `Utils.popen_read` commands into `\"\#{bin}/foo\", \"bar\"` + end + end + RUBY + end + + it "Utils.popen_read arguments with metacharacters should not be separated" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + def install + Utils.popen_read("foo bar > baz") + end + end + RUBY + end + + it "only the first Utils.popen_read argument should be separated" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + def install + Utils.popen_read("foo", "bar baz") + end + end + RUBY + end + + it "Utils.popen_read arguments should be separated following a shell variable" do + expect_offense(<<~RUBY) + class Foo < Formula + def install + Utils.popen_read({ "SHELL" => "bash"}, "foo bar") + ^^^^^^^^^ Separate `Utils.popen_read` commands into `\"foo\", \"bar\"` + end + end + RUBY + end + end +end + describe RuboCop::Cop::FormulaAudit::Miscellaneous do subject(:cop) { described_class.new } From 0ea6245094673beb6022c3f1482a461a3b59bb30 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:08:09 +0800 Subject: [PATCH 077/149] Revert "Pathname::write: allow optional override" This reverts commit 93d46c6d6c69d5279404bce211cb2f48120076f9. --- Library/Homebrew/extend/pathname.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index e97302084e..33a937b5d7 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -150,8 +150,8 @@ class Pathname alias old_write write # We assume this pathname object is a file, obviously - def write(content, overwrite = false, *open_args) - raise "Will not overwrite #{self}" if exist? && !overwrite + def write(content, *open_args) + raise "Will not overwrite #{self}" if exist? dirname.mkpath open("w", *open_args) { |f| f.write(content) } From 4dcbe8790fa5ab63d9a45222134793bc5b3c22f2 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:29:45 +0800 Subject: [PATCH 078/149] update-license-data: use of unlink to remove existing file --- Library/Homebrew/dev-cmd/update-license-data.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index 713694619e..76c1397054 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -31,7 +31,8 @@ module Homebrew update_license_data_args.parse ohai "Updating SPDX license data..." spdx_download_result = curl(SPDX_DATA_URL, print_stdout: false) - SPDX_PATH.write(spdx_download_result.stdout, overwrite: true) + SPDX_PATH.unlink if SPDX_PATH.exist? + SPDX_PATH.write(spdx_download_result.stdout) return unless args.fail_if_changed? system("git diff --stat --exit-code #{SPDX_PATH}") From da2a426ec83bbe637040b9981bff68852ece8dc0 Mon Sep 17 00:00:00 2001 From: Lionell Date: Tue, 30 Jun 2020 15:18:10 +0800 Subject: [PATCH 079/149] update-license-data: use curl_download instead of curl --- Library/Homebrew/dev-cmd/update-license-data.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb index 76c1397054..22e73db9a8 100644 --- a/Library/Homebrew/dev-cmd/update-license-data.rb +++ b/Library/Homebrew/dev-cmd/update-license-data.rb @@ -30,9 +30,8 @@ module Homebrew def update_license_data update_license_data_args.parse ohai "Updating SPDX license data..." - spdx_download_result = curl(SPDX_DATA_URL, print_stdout: false) - SPDX_PATH.unlink if SPDX_PATH.exist? - SPDX_PATH.write(spdx_download_result.stdout) + curl_download(SPDX_DATA_URL, to: SPDX_PATH) + return unless args.fail_if_changed? system("git diff --stat --exit-code #{SPDX_PATH}") From adcb2fb82312da01e8a4b1d9d9d7ea7c954836c0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2020 12:35:12 +0000 Subject: [PATCH 080/149] build(deps): bump json from 2.3.0 to 2.3.1 in /Library/Homebrew Bumps [json](https://github.com/flori/json) from 2.3.0 to 2.3.1. - [Release notes](https://github.com/flori/json/releases) - [Changelog](https://github.com/flori/json/blob/master/CHANGES.md) - [Commits](https://github.com/flori/json/compare/v2.3.0...v2.3.1) Signed-off-by: dependabot-preview[bot] --- Library/Homebrew/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock index 2034c676a8..6867d78d9b 100644 --- a/Library/Homebrew/Gemfile.lock +++ b/Library/Homebrew/Gemfile.lock @@ -26,7 +26,7 @@ GEM domain_name (~> 0.5) i18n (1.8.3) concurrent-ruby (~> 1.0) - json (2.3.0) + json (2.3.1) mechanize (2.7.6) domain_name (~> 0.5, >= 0.5.1) http-cookie (~> 1.0) From c50f7b8951343d41e5fc8c0f6c4422566f43e40d Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 01:13:02 +0800 Subject: [PATCH 081/149] Revert "curl: modified curl to allow optional print_stdout" This reverts commit 02bc870e915f88145761b11d2065d8f2964c50ba. --- Library/Homebrew/utils/curl.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/utils/curl.rb b/Library/Homebrew/utils/curl.rb index 09948e6a45..7503e16822 100644 --- a/Library/Homebrew/utils/curl.rb +++ b/Library/Homebrew/utils/curl.rb @@ -44,12 +44,12 @@ def curl_args(*extra_args, show_output: false, user_agent: :default) args + extra_args end -def curl(*args, print_stdout: true, secrets: [], **options) +def curl(*args, secrets: [], **options) # SSL_CERT_FILE can be incorrectly set by users or portable-ruby and screw # with SSL downloads so unset it here. system_command! curl_executable, args: curl_args(*args, **options), - print_stdout: print_stdout, + print_stdout: true, env: { "SSL_CERT_FILE" => nil }, secrets: secrets end From ff95f085912b1ba60931286788acfadf8b7aa0b7 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 22:08:36 +0800 Subject: [PATCH 082/149] audit test: modified code for reading json file --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 54ead437d0..0cce4cbf92 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -81,12 +81,9 @@ module Homebrew describe "#audit_license" do let(:spdx_data) { - full_path = File.join(File.dirname(__FILE__), "../../data/spdx.json") - File.open(full_path, "r") do |f| - JSON.parse(f.read) - end + JSON.parse Pathname(File.join(File.dirname(__FILE__), "../../data/spdx.json")).read } - + let(:custom_spdx_id) { "zzz" } let(:standard_mismatch_spdx_id) { "0BSD" } From 5b3530b23de9beff1eb8bf68ab77832b9a219aaa Mon Sep 17 00:00:00 2001 From: Lionell Loh Jian An Date: Tue, 30 Jun 2020 22:11:36 +0800 Subject: [PATCH 083/149] Apply suggestions from code review Code review changes Co-authored-by: Mike McQuaid --- Library/Homebrew/test/dev-cmd/audit_spec.rb | 1 - Library/Homebrew/utils/github.rb | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 54ead437d0..64f87cdac1 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -111,7 +111,6 @@ module Homebrew RUBY fa.audit_license - p fa.problems expect(fa.problems.first).to match "No license specified for package." end diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 2a6a67e913..6c963fe665 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -477,8 +477,8 @@ module GitHub end def get_repo_license(user, repo) - res = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") - return unless res.key?("license") + response = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") + return unless response.key?("license") res["license"]["spdx_id"] rescue GitHub::HTTPNotFoundError From 35a8c336902d9a18be81d16981da35724e94e19b Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Tue, 30 Jun 2020 10:18:49 -0400 Subject: [PATCH 084/149] Update shell metacharacter list --- Library/Homebrew/rubocops/lines.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb index d8708c2362..ca62165b9d 100644 --- a/Library/Homebrew/rubocops/lines.rb +++ b/Library/Homebrew/rubocops/lines.rb @@ -264,7 +264,7 @@ module RuboCop :safe_popen_write, ] - shell_metacharacters = %w[> >> < << | ; & && || *] + shell_metacharacters = %w[> < < | ; : & * $ ? : ~ + @ !` ( ) [ ]] find_every_method_call_by_name(body_node, :system).each do |method| # Continue if a shell metacharacter is present From 1422542a07a6f47f87be7b2a0826f4237f75d737 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 23:18:04 +0800 Subject: [PATCH 085/149] components_order and test --- Library/Homebrew/rubocops/components_order.rb | 1 + .../Homebrew/test/rubocops/components_order_spec.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Library/Homebrew/rubocops/components_order.rb b/Library/Homebrew/rubocops/components_order.rb index 45153d7c92..f4fd15f7df 100644 --- a/Library/Homebrew/rubocops/components_order.rb +++ b/Library/Homebrew/rubocops/components_order.rb @@ -24,6 +24,7 @@ module RuboCop [{ name: :mirror, type: :method_call }], [{ name: :version, type: :method_call }], [{ name: :sha256, type: :method_call }], + [{ name: :license, type: :method_call }], [{ name: :revision, type: :method_call }], [{ name: :version_scheme, type: :method_call }], [{ name: :head, type: :method_call }], diff --git a/Library/Homebrew/test/rubocops/components_order_spec.rb b/Library/Homebrew/test/rubocops/components_order_spec.rb index 31f6cd5938..2f70f5ce21 100644 --- a/Library/Homebrew/test/rubocops/components_order_spec.rb +++ b/Library/Homebrew/test/rubocops/components_order_spec.rb @@ -19,6 +19,19 @@ describe RuboCop::Cop::FormulaAudit::ComponentsOrder do RUBY end + it "When license precedes sha256" do + expect_offense(<<~RUBY) + class Foo < Formula + homepage "https://brew.sh" + url "https://brew.sh/foo-1.0.tgz" + license "0BSD" + sha256 "samplesha256" + ^^^^^^^^^^^^^^^^^^^^^ `sha256` (line 5) should be put before `license` (line 4) + end + RUBY + end + + it "When `bottle` precedes `livecheck`" do expect_offense(<<~RUBY) class Foo < Formula From 57e7e7d60e69463c23865f3db499da2f9714c227 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 23:23:19 +0800 Subject: [PATCH 086/149] small fix: res -> response --- Library/Homebrew/utils/github.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 74afca74be..296059cca8 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -478,7 +478,7 @@ module GitHub response = GitHub.open_api("#{GitHub::API_URL}/repos/#{user}/#{repo}/license") return unless response.key?("license") - res["license"]["spdx_id"] + response["license"]["spdx_id"] rescue GitHub::HTTPNotFoundError nil end From 7358dd7bba062992fd0a1dc5d33f809580ebc537 Mon Sep 17 00:00:00 2001 From: lionellloh Date: Tue, 30 Jun 2020 23:25:51 +0800 Subject: [PATCH 087/149] style fixes --- Library/Homebrew/rubocops/components_order.rb | 4 ++-- Library/Homebrew/test/dev-cmd/audit_spec.rb | 2 +- Library/Homebrew/test/rubocops/components_order_spec.rb | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/rubocops/components_order.rb b/Library/Homebrew/rubocops/components_order.rb index f4fd15f7df..c688368f24 100644 --- a/Library/Homebrew/rubocops/components_order.rb +++ b/Library/Homebrew/rubocops/components_order.rb @@ -24,8 +24,8 @@ module RuboCop [{ name: :mirror, type: :method_call }], [{ name: :version, type: :method_call }], [{ name: :sha256, type: :method_call }], - [{ name: :license, type: :method_call }], - [{ name: :revision, type: :method_call }], + [{ name: :license, type: :method_call }], + [{ name: :revision, type: :method_call }], [{ name: :version_scheme, type: :method_call }], [{ name: :head, type: :method_call }], [{ name: :stable, type: :block_call }], diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 76225bce52..c1418223c5 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -83,7 +83,7 @@ module Homebrew let(:spdx_data) { JSON.parse Pathname(File.join(File.dirname(__FILE__), "../../data/spdx.json")).read } - + let(:custom_spdx_id) { "zzz" } let(:standard_mismatch_spdx_id) { "0BSD" } diff --git a/Library/Homebrew/test/rubocops/components_order_spec.rb b/Library/Homebrew/test/rubocops/components_order_spec.rb index 2f70f5ce21..0afde2310e 100644 --- a/Library/Homebrew/test/rubocops/components_order_spec.rb +++ b/Library/Homebrew/test/rubocops/components_order_spec.rb @@ -31,7 +31,6 @@ describe RuboCop::Cop::FormulaAudit::ComponentsOrder do RUBY end - it "When `bottle` precedes `livecheck`" do expect_offense(<<~RUBY) class Foo < Formula From 8a05b5258a23125bd4cbadb8a8c8bb15f8ff3e96 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 12:08:03 -0400 Subject: [PATCH 088/149] args: Refactor to load casks directly --- Library/Homebrew/cli/args.rb | 139 ++++++++++++++++-------------- Library/Homebrew/cmd/reinstall.rb | 8 +- Library/Homebrew/cmd/uninstall.rb | 25 +++--- 3 files changed, 92 insertions(+), 80 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index 987ab61946..de2d784a2b 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -36,11 +36,11 @@ module Homebrew # Reset cache values reliant on named_args @formulae = nil @resolved_formulae = nil - @resolved_formulae_and_unknowns = nil + @resolved_formulae_casks = nil @formulae_paths = nil @casks = nil @kegs = nil - @kegs_and_unknowns = nil + @kegs_casks = nil self[:named_args] = named_args self[:named_args].freeze @@ -98,17 +98,23 @@ module Homebrew end.uniq(&:name).freeze end - def resolved_formulae_and_unknowns - return @resolved_formulae_and_unknowns if @resolved_formulae_and_unknowns + def resolved_formulae_casks + @resolved_formulae_casks ||= begin + resolved_formulae = [] + casks = [] - resolved_formulae = [] - unknowns = [] - downcased_unique_named.each do |name| - resolved_formulae << Formulary.resolve(name, spec: spec(nil)) - rescue FormulaUnavailableError - unknowns << name + downcased_unique_named.each do |name| + resolved_formulae << Formulary.resolve(name, spec: spec(nil)) + rescue FormulaUnavailableError + begin + casks << Cask::CaskLoader.load(name) + rescue Cask::CaskUnavailableError + raise "No available formula or cask with the name \"#{name}\"" + end + end + + [resolved_formulae.freeze, casks.freeze].freeze end - @resolved_formulae_and_unknowns = [resolved_formulae.freeze, unknowns.freeze].freeze end def formulae_paths @@ -133,62 +139,22 @@ module Homebrew end.freeze end - def kegs_and_unknowns - return @kegs_and_unknowns if @kegs_and_unknowns + def kegs_casks + @kegs_casks ||= begin + kegs = [] + casks = [] - kegs = [] - unknowns = [] - downcased_unique_named.each do |name| - kegs << resolve_keg(name) - rescue NoSuchKegError - unknowns << name - end - - @kegs_and_unknowns = [kegs.freeze, unknowns.freeze].freeze - end - - def resolve_keg(name) - require "keg" - require "formula" - require "missing_formula" - - raise UsageError if name.empty? - - rack = Formulary.to_rack(name.downcase) - - dirs = rack.directory? ? rack.subdirs : [] - - raise NoSuchKegError, rack.basename if dirs.empty? - - linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename - opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" - - begin - if opt_prefix.symlink? && opt_prefix.directory? - Keg.new(opt_prefix.resolved_path) - elsif linked_keg_ref.symlink? && linked_keg_ref.directory? - Keg.new(linked_keg_ref.resolved_path) - elsif dirs.length == 1 - Keg.new(dirs.first) - else - f = if name.include?("/") || File.exist?(name) - Formulary.factory(name) - else - Formulary.from_rack(rack) + downcased_unique_named.each do |name| + kegs << resolve_keg(name) + rescue NoSuchKegError + begin + casks << Cask::CaskLoader.load(name) + rescue Cask::CaskUnavailableError + raise "No installed keg or cask with the name \"#{name}\"" end - - unless (prefix = f.installed_prefix).directory? - raise MultipleVersionsInstalledError, rack.basename - end - - Keg.new(prefix) end - rescue FormulaUnavailableError - raise <<~EOS - Multiple kegs installed to #{rack} - However we don't know which one you refer to. - Please delete (with rm -rf!) all but one and then try again. - EOS + + [kegs.freeze, casks.freeze].freeze end end @@ -274,6 +240,51 @@ module Homebrew default end end + + def resolve_keg(name) + require "keg" + require "formula" + require "missing_formula" + + raise UsageError if name.empty? + + rack = Formulary.to_rack(name.downcase) + + dirs = rack.directory? ? rack.subdirs : [] + + raise NoSuchKegError, rack.basename if dirs.empty? + + linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename + opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}" + + begin + if opt_prefix.symlink? && opt_prefix.directory? + Keg.new(opt_prefix.resolved_path) + elsif linked_keg_ref.symlink? && linked_keg_ref.directory? + Keg.new(linked_keg_ref.resolved_path) + elsif dirs.length == 1 + Keg.new(dirs.first) + else + f = if name.include?("/") || File.exist?(name) + Formulary.factory(name) + else + Formulary.from_rack(rack) + end + + unless (prefix = f.installed_prefix).directory? + raise MultipleVersionsInstalledError, rack.basename + end + + Keg.new(prefix) + end + rescue FormulaUnavailableError + raise <<~EOS + Multiple kegs installed to #{rack} + However we don't know which one you refer to. + Please delete (with rm -rf!) all but one and then try again. + EOS + end + end end end end diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 3f47614ddc..87fdfd577d 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -57,7 +57,7 @@ module Homebrew Install.perform_preinstall_checks - resolved_formulae, possible_casks = args.resolved_formulae_and_unknowns + resolved_formulae, casks = args.resolved_formulae_casks resolved_formulae.each do |f| if f.pinned? onoe "#{f.full_name} is pinned. You must unpin it to reinstall." @@ -69,13 +69,11 @@ module Homebrew end Homebrew.messages.display_messages - possible_casks.each do |name| - reinstall_cmd = Cask::Cmd::Reinstall.new(name) + unless casks.empty? + reinstall_cmd = Cask::Cmd::Reinstall.new(casks) reinstall_cmd.verbose = args.verbose? reinstall_cmd.force = args.force? reinstall_cmd.run - rescue Cask::CaskUnavailableError - ofail "No installed keg or cask with the name \"#{name}\"" end end end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 3d16ec70f5..1ee0616681 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -33,20 +33,24 @@ module Homebrew uninstall_args.parse if args.force? - possible_casks = [] + casks = [] kegs_by_rack = Hash[args.named.map do |name| rack = Formulary.to_rack(name) unless rack.directory? - possible_casks << name + begin + casks << Cask::CaskLoader.load(name) + rescue Cask::CaskUnavailableError + # Since the uninstall was forced, ignore any unavailable casks + end next end [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - kegs_, possible_casks = args.kegs_and_unknowns - kegs_by_rack = kegs_.group_by(&:rack) + _kegs, casks = args.kegs_casks + kegs_by_rack = _kegs.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) @@ -118,14 +122,13 @@ module Homebrew end end - possible_casks.each do |name| - cmd = Cask::Cmd::Uninstall.new(name) - cmd.force = args.force? - cmd.verbose = args.verbose? - cmd.run - rescue Cask::CaskUnavailableError - ofail "No installed keg or cask with the name \"#{name}\"" + unless casks.empty? + cask_uninstall = Cask::Cmd::Uninstall.new(casks) + cask_uninstall.force = args.force? + cask_uninstall.verbose = args.verbose? + cask_uninstall.run end + rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions." From dff61c9eab54f21329e537b8d7c34a9671805db7 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 12:21:21 -0400 Subject: [PATCH 089/149] style: Fix style issues --- Library/Homebrew/cli/args.rb | 8 ++++---- Library/Homebrew/cmd/reinstall.rb | 12 ++++++------ Library/Homebrew/cmd/uninstall.rb | 5 ++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index de2d784a2b..7f76690df7 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -266,10 +266,10 @@ module Homebrew Keg.new(dirs.first) else f = if name.include?("/") || File.exist?(name) - Formulary.factory(name) - else - Formulary.from_rack(rack) - end + Formulary.factory(name) + else + Formulary.from_rack(rack) + end unless (prefix = f.installed_prefix).directory? raise MultipleVersionsInstalledError, rack.basename diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 87fdfd577d..7d6a566af8 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -69,11 +69,11 @@ module Homebrew end Homebrew.messages.display_messages - unless casks.empty? - reinstall_cmd = Cask::Cmd::Reinstall.new(casks) - reinstall_cmd.verbose = args.verbose? - reinstall_cmd.force = args.force? - reinstall_cmd.run - end + return if casks.empty? + + reinstall_cmd = Cask::Cmd::Reinstall.new(casks) + reinstall_cmd.verbose = args.verbose? + reinstall_cmd.force = args.force? + reinstall_cmd.run end end diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 1ee0616681..55b70fb16c 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -49,8 +49,8 @@ module Homebrew [rack, rack.subdirs.map { |d| Keg.new(d) }] end] else - _kegs, casks = args.kegs_casks - kegs_by_rack = _kegs.group_by(&:rack) + all_kegs, casks = args.kegs_casks + kegs_by_rack = all_kegs.group_by(&:rack) end handle_unsatisfied_dependents(kegs_by_rack) @@ -128,7 +128,6 @@ module Homebrew cask_uninstall.verbose = args.verbose? cask_uninstall.run end - rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions." From f3ae2fdfdc6adf14285f99d55af5592810cacd55 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 13:22:21 -0400 Subject: [PATCH 090/149] reinstall: Replace with more specific imports --- Library/Homebrew/cmd/reinstall.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 7d6a566af8..6286d6bef0 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -6,7 +6,9 @@ require "messages" require "reinstall" require "cli/parser" require "cleanup" -require "cask/all" +require "cask/cmd" +require "cask/utils" +require "cask/macos" module Homebrew module_function From 72dcbd6fda2c884f54edd0ded42bcfed2f276342 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 13:43:45 -0400 Subject: [PATCH 091/149] style: Dedent cask uninstall block --- Library/Homebrew/cmd/uninstall.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 55b70fb16c..1764b6eb69 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -122,12 +122,12 @@ module Homebrew end end - unless casks.empty? - cask_uninstall = Cask::Cmd::Uninstall.new(casks) - cask_uninstall.force = args.force? - cask_uninstall.verbose = args.verbose? - cask_uninstall.run - end + return if casks.empty? + + cask_uninstall = Cask::Cmd::Uninstall.new(casks) + cask_uninstall.force = args.force? + cask_uninstall.verbose = args.verbose? + cask_uninstall.run rescue MultipleVersionsInstalledError => e ofail e puts "Run `brew uninstall --force #{e.name}` to remove all versions." From ac5f0c10e5a4fa9ab0397f58d2a9cf683e22ef27 Mon Sep 17 00:00:00 2001 From: William Ma Date: Tue, 30 Jun 2020 13:48:27 -0400 Subject: [PATCH 092/149] style: Dedent some autoformatted code in uninstall test case --- Library/Homebrew/test/cmd/uninstall_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 7edabe911e..bc29f1be99 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -26,8 +26,8 @@ describe "brew uninstall cask", :integration_test, :needs_macos do expect { brew "uninstall", "local-caffeine" } .to output(/Uninstalling Cask local-caffeine/).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed @@ -45,8 +45,8 @@ describe "brew uninstall cask", :integration_test, :needs_macos do Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n ==>\sUninstalling\sCask\slocal-caffeine }x).to_stdout - .and not_to_output.to_stderr - .and be_a_success + .and not_to_output.to_stderr + .and be_a_success expect(caffeine).not_to be_installed From a721d7bc8f3012deff33ec1fb1e59e5574b52540 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Tue, 30 Jun 2020 16:41:20 +0200 Subject: [PATCH 093/149] Remove outdated suggestions from Formula#test doc --- Library/Homebrew/formula.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 1e319b53e7..5ed047c98a 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -2648,9 +2648,13 @@ class Formula # # The block will create, run in and delete a temporary directory. # - # We are fine if the executable does not error out, so we know linking - # and building the software was OK. - #
system bin/"foobar", "--version"
+ # We want tests that don't require any user input + # and test the basic functionality of the application. + # For example foo build-foo input.foo is a good test + # and foo --version and foo --help are bad tests. + # However, a bad test is better than no test at all. + # + # See: https://docs.brew.sh/Formula-Cookbook#add-a-test-to-the-formula # #
(testpath/"test.file").write <<~EOS
     #   writing some test file, if you need to

From 7d53104c4680dc24a0f1398e79ce296052ea85e1 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Wed, 1 Jul 2020 11:55:25 +0100
Subject: [PATCH 094/149] cmd/search_spec: split Linux/macOS tests.

---
 Library/Homebrew/test/cmd/search_spec.rb | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/Library/Homebrew/test/cmd/search_spec.rb b/Library/Homebrew/test/cmd/search_spec.rb
index 40932a5c43..43b1cf9a39 100644
--- a/Library/Homebrew/test/cmd/search_spec.rb
+++ b/Library/Homebrew/test/cmd/search_spec.rb
@@ -8,7 +8,7 @@ describe "Homebrew.search_args" do
 end
 
 describe "brew search", :integration_test do
-  it "falls back to a GitHub tap search when no formula is found", :needs_network do
+  it "falls back to a GitHub tap search when no formula is found", :needs_macos, :needs_network do
     setup_test_formula "testball"
     setup_remote_tap "homebrew/cask"
 
@@ -16,4 +16,13 @@ describe "brew search", :integration_test do
       .to output(/firefox/).to_stdout
       .and be_a_success
   end
+
+  # doesn't actually need Linux but only want one integration test per-OS.
+  it "finds formula in search", :need_linux do
+    setup_test_formula "testball"
+
+    expect { brew "search", "testball" }
+      .to output(/testball/).to_stdout
+      .and be_a_success
+  end
 end

From 0166211ffdbea6c333d73f4fc71bb1df29373976 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Wed, 1 Jul 2020 11:55:42 +0100
Subject: [PATCH 095/149] integration_test: don't error on missing bin.

---
 .../test/support/helper/spec/shared_context/integration_test.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb
index cbc933817d..7ecb936ec8 100644
--- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb
+++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb
@@ -46,7 +46,7 @@ RSpec.shared_context "integration test" do
 
     example.run
   ensure
-    FileUtils.rm_r HOMEBREW_PREFIX/"bin"
+    FileUtils.rm_rf HOMEBREW_PREFIX/"bin"
   end
 
   # Generate unique ID to be able to

From d16e699ed7a2d6f6cbd53b2a75c2dd1b15c6bfde Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Wed, 1 Jul 2020 22:25:53 +1000
Subject: [PATCH 096/149] github: need read-only email scope to see emails

---
 Library/Homebrew/utils/github.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb
index dd89ac4ccd..cc7fa75cd7 100644
--- a/Library/Homebrew/utils/github.rb
+++ b/Library/Homebrew/utils/github.rb
@@ -413,7 +413,7 @@ module GitHub
         }
       EOS
     }
-    result = open_api(url, data: data, request_method: "POST")
+    result = open_api(url, scopes: ["user:email"], data: data, request_method: "POST")
     raise Error, result["errors"] if result["errors"].present?
 
     reviews = result["data"]["repository"]["pullRequest"]["reviews"]["nodes"]

From 21c903c133bffca1204766d108d808f34358bb78 Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Wed, 1 Jul 2020 23:59:07 +1000
Subject: [PATCH 097/149] pr-pull, pr-upload: use safe_system to call brew

---
 Library/Homebrew/dev-cmd/pr-pull.rb   | 2 +-
 Library/Homebrew/dev-cmd/pr-upload.rb | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Library/Homebrew/dev-cmd/pr-pull.rb b/Library/Homebrew/dev-cmd/pr-pull.rb
index 24d7e4e0f9..db24c2c1f6 100644
--- a/Library/Homebrew/dev-cmd/pr-pull.rb
+++ b/Library/Homebrew/dev-cmd/pr-pull.rb
@@ -260,7 +260,7 @@ module Homebrew
           upload_args << "--dry-run" if args.dry_run?
           upload_args << "--root_url=#{args.root_url}" if args.root_url
           upload_args << "--bintray-org=#{bintray_org}"
-          system HOMEBREW_BREW_FILE, *upload_args
+          safe_system HOMEBREW_BREW_FILE, *upload_args
         end
       end
     end
diff --git a/Library/Homebrew/dev-cmd/pr-upload.rb b/Library/Homebrew/dev-cmd/pr-upload.rb
index f591bf77dd..276f6071b7 100644
--- a/Library/Homebrew/dev-cmd/pr-upload.rb
+++ b/Library/Homebrew/dev-cmd/pr-upload.rb
@@ -42,7 +42,7 @@ module Homebrew
     if args.dry_run?
       puts "brew #{bottle_args.join " "}"
     else
-      system HOMEBREW_BREW_FILE, *bottle_args
+      safe_system HOMEBREW_BREW_FILE, *bottle_args
     end
 
     if args.dry_run?

From bd59b66c25b03049714155961d9f147ea978616b Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Thu, 2 Jul 2020 00:11:12 +1000
Subject: [PATCH 098/149] bintray: fail on upload and publish curl problems

---
 Library/Homebrew/bintray.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Library/Homebrew/bintray.rb b/Library/Homebrew/bintray.rb
index 09b7a60e79..1800316c4c 100644
--- a/Library/Homebrew/bintray.rb
+++ b/Library/Homebrew/bintray.rb
@@ -41,7 +41,7 @@ class Bintray
 
   def upload(local_file, repo:, package:, version:, remote_file:, sha256: nil)
     url = "#{API_URL}/content/#{@bintray_org}/#{repo}/#{package}/#{version}/#{remote_file}"
-    args = ["--upload-file", local_file]
+    args = ["--fail", "--upload-file", local_file]
     args += ["--header", "X-Checksum-Sha2: #{sha256}"] unless sha256.blank?
     result = open_api url, *args
     json = JSON.parse(result.stdout)
@@ -52,7 +52,7 @@ class Bintray
 
   def publish(repo:, package:, version:, file_count:)
     url = "#{API_URL}/content/#{@bintray_org}/#{repo}/#{package}/#{version}/publish"
-    result = open_api url, "--request", "POST"
+    result = open_api url, "--request", "POST", "--fail"
     json = JSON.parse(result.stdout)
     if file_count.present? && json["files"] != file_count
       raise "Bottle publish failed: expected #{file_count} bottles, but published #{json["files"]} instead."

From 204e56d01ec309be343f8d1185fb3ade77496ec8 Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Thu, 2 Jul 2020 00:11:55 +1000
Subject: [PATCH 099/149] pr-pull, pr-upload: add --warn-on-upload-failure

---
 Library/Homebrew/bintray.rb           | 24 ++++++++++++++++++------
 Library/Homebrew/dev-cmd/pr-pull.rb   |  4 ++++
 Library/Homebrew/dev-cmd/pr-upload.rb |  7 ++++++-
 docs/Manpage.md                       |  4 ++++
 manpages/brew-cask.1                  |  2 +-
 manpages/brew.1                       | 10 +++++++++-
 6 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/Library/Homebrew/bintray.rb b/Library/Homebrew/bintray.rb
index 1800316c4c..cb2966ca0d 100644
--- a/Library/Homebrew/bintray.rb
+++ b/Library/Homebrew/bintray.rb
@@ -50,12 +50,15 @@ class Bintray
     result
   end
 
-  def publish(repo:, package:, version:, file_count:)
+  def publish(repo:, package:, version:, file_count:, warn_on_error: false)
     url = "#{API_URL}/content/#{@bintray_org}/#{repo}/#{package}/#{version}/publish"
     result = open_api url, "--request", "POST", "--fail"
     json = JSON.parse(result.stdout)
     if file_count.present? && json["files"] != file_count
-      raise "Bottle publish failed: expected #{file_count} bottles, but published #{json["files"]} instead."
+      message = "Bottle publish failed: expected #{file_count} bottles, but published #{json["files"]} instead."
+      raise message unless warn_on_error
+
+      opoo message
     end
 
     odebug "Published #{json["files"]} bottles"
@@ -143,7 +146,7 @@ class Bintray
     end
   end
 
-  def upload_bottle_json(json_files, publish_package: false)
+  def upload_bottle_json(json_files, publish_package: false, warn_on_error: false)
     bottles_hash = json_files.reduce({}) do |hash, json_file|
       hash.deep_merge(JSON.parse(IO.read(json_file)))
     end
@@ -161,14 +164,19 @@ class Bintray
 
         odebug "Checking remote file #{@bintray_org}/#{bintray_repo}/#{filename}"
         if file_published? repo: bintray_repo, remote_file: filename
-          raise Error, <<~EOS
-            #{filename} is already published.
+          already_published = "#{filename} is already published."
+          failed_message = <<~EOS
+            #{already_published}
             Please remove it manually from:
               https://bintray.com/#{@bintray_org}/#{bintray_repo}/#{bintray_package}/view#files
             Or run:
               curl -X DELETE -u $HOMEBREW_BINTRAY_USER:$HOMEBREW_BINTRAY_KEY \\
               https://api.bintray.com/content/#{@bintray_org}/#{bintray_repo}/#{filename}
           EOS
+          raise Error, failed_message unless warn_on_error
+
+          opoo already_published
+          next
         end
 
         if !formula_packaged[formula_name] && !package_exists?(repo: bintray_repo, package: bintray_package)
@@ -189,7 +197,11 @@ class Bintray
 
       bottle_count = bottle_hash["bottle"]["tags"].length
       odebug "Publishing #{@bintray_org}/#{bintray_repo}/#{bintray_package}/#{version}"
-      publish repo: bintray_repo, package: bintray_package, version: version, file_count: bottle_count
+      publish(repo:          bintray_repo,
+              package:       bintray_package,
+              version:       version,
+              file_count:    bottle_count,
+              warn_on_error: warn_on_error)
     end
   end
 end
diff --git a/Library/Homebrew/dev-cmd/pr-pull.rb b/Library/Homebrew/dev-cmd/pr-pull.rb
index db24c2c1f6..8d7c783e3c 100644
--- a/Library/Homebrew/dev-cmd/pr-pull.rb
+++ b/Library/Homebrew/dev-cmd/pr-pull.rb
@@ -33,6 +33,9 @@ module Homebrew
       switch "--resolve",
              description: "When a patch fails to apply, leave in progress and allow user to resolve, "\
                           "instead of aborting."
+      switch "--warn-on-upload-failure",
+             description: "Warn instead of raising an error if the bottle upload fails. "\
+                          "Useful for repairing bottle uploads that previously failed."
       flag   "--workflow=",
              description: "Retrieve artifacts from the specified workflow (default: `tests.yml`)."
       flag   "--artifact=",
@@ -258,6 +261,7 @@ module Homebrew
           upload_args << "--verbose" if Homebrew.args.verbose?
           upload_args << "--no-publish" if args.no_publish?
           upload_args << "--dry-run" if args.dry_run?
+          upload_args << "--warn-on-upload-failure" if args.warn_on_upload_failure?
           upload_args << "--root_url=#{args.root_url}" if args.root_url
           upload_args << "--bintray-org=#{bintray_org}"
           safe_system HOMEBREW_BREW_FILE, *upload_args
diff --git a/Library/Homebrew/dev-cmd/pr-upload.rb b/Library/Homebrew/dev-cmd/pr-upload.rb
index 276f6071b7..39dfd145ba 100644
--- a/Library/Homebrew/dev-cmd/pr-upload.rb
+++ b/Library/Homebrew/dev-cmd/pr-upload.rb
@@ -17,6 +17,9 @@ module Homebrew
              description: "Apply the bottle commit and upload the bottles, but don't publish them."
       switch "-n", "--dry-run",
              description: "Print what would be done rather than doing it."
+      switch "--warn-on-upload-failure",
+             description: "Warn instead of raising an error if the bottle upload fails. "\
+                          "Useful for repairing bottle uploads that previously failed."
       flag   "--bintray-org=",
              description: "Upload to the specified Bintray organisation (default: `homebrew`)."
       flag   "--root-url=",
@@ -48,7 +51,9 @@ module Homebrew
     if args.dry_run?
       puts "Upload bottles described by these JSON files to Bintray:\n  #{Dir["*.json"].join("\n  ")}"
     else
-      bintray.upload_bottle_json Dir["*.json"], publish_package: !args.no_publish?
+      bintray.upload_bottle_json(Dir["*.json"],
+                                 publish_package: !args.no_publish?,
+                                 warn_on_error:   args.warn_on_upload_failure?)
     end
   end
 end
diff --git a/docs/Manpage.md b/docs/Manpage.md
index a95886ff5e..2709a17839 100644
--- a/docs/Manpage.md
+++ b/docs/Manpage.md
@@ -903,6 +903,8 @@ repository.
   Do not warn if pulling to a branch besides master (useful for testing).
 * `--resolve`:
   When a patch fails to apply, leave in progress and allow user to resolve, instead of aborting.
+* `--warn-on-upload-failure`:
+  Warn instead of raising an error if the bottle upload fails. Useful for repairing bottle uploads that previously failed.
 * `--workflow`:
   Retrieve artifacts from the specified workflow (default: `tests.yml`).
 * `--artifact`:
@@ -924,6 +926,8 @@ Apply the bottle commit and publish bottles to Bintray.
   Apply the bottle commit and upload the bottles, but don't publish them.
 * `-n`, `--dry-run`:
   Print what would be done rather than doing it.
+* `--warn-on-upload-failure`:
+  Warn instead of raising an error if the bottle upload fails. Useful for repairing bottle uploads that previously failed.
 * `--bintray-org`:
   Upload to the specified Bintray organisation (default: `homebrew`).
 * `--root-url`:
diff --git a/manpages/brew-cask.1 b/manpages/brew-cask.1
index f250696a66..f00c80f3ed 100644
--- a/manpages/brew-cask.1
+++ b/manpages/brew-cask.1
@@ -1,7 +1,7 @@
 .\" generated with Ronn/v0.7.3
 .\" http://github.com/rtomayko/ronn/tree/0.7.3
 .
-.TH "BREW\-CASK" "1" "June 2020" "Homebrew" "brew-cask"
+.TH "BREW\-CASK" "1" "July 2020" "Homebrew" "brew-cask"
 .
 .SH "NAME"
 \fBbrew\-cask\fR \- a friendly binary installer for macOS
diff --git a/manpages/brew.1 b/manpages/brew.1
index c65e7cf4ed..a653c4df12 100644
--- a/manpages/brew.1
+++ b/manpages/brew.1
@@ -1,7 +1,7 @@
 .\" generated with Ronn/v0.7.3
 .\" http://github.com/rtomayko/ronn/tree/0.7.3
 .
-.TH "BREW" "1" "June 2020" "Homebrew" "brew"
+.TH "BREW" "1" "July 2020" "Homebrew" "brew"
 .
 .SH "NAME"
 \fBbrew\fR \- The Missing Package Manager for macOS
@@ -1176,6 +1176,10 @@ Do not warn if pulling to a branch besides master (useful for testing)\.
 When a patch fails to apply, leave in progress and allow user to resolve, instead of aborting\.
 .
 .TP
+\fB\-\-warn\-on\-upload\-failure\fR
+Warn instead of raising an error if the bottle upload fails\. Useful for repairing bottle uploads that previously failed\.
+.
+.TP
 \fB\-\-workflow\fR
 Retrieve artifacts from the specified workflow (default: \fBtests\.yml\fR)\.
 .
@@ -1211,6 +1215,10 @@ Apply the bottle commit and upload the bottles, but don\'t publish them\.
 Print what would be done rather than doing it\.
 .
 .TP
+\fB\-\-warn\-on\-upload\-failure\fR
+Warn instead of raising an error if the bottle upload fails\. Useful for repairing bottle uploads that previously failed\.
+.
+.TP
 \fB\-\-bintray\-org\fR
 Upload to the specified Bintray organisation (default: \fBhomebrew\fR)\.
 .

From 9297b18aa61f3794972a49c541f9a8ad4707c1c9 Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Wed, 1 Jul 2020 16:02:29 +0100
Subject: [PATCH 100/149] Add SDK availability diagnostic

---
 Library/Homebrew/extend/os/mac/diagnostic.rb | 29 ++++++++++++++++++++
 Library/Homebrew/os/mac.rb                   | 12 ++++----
 Library/Homebrew/os/mac/sdk.rb               | 22 +++++----------
 Library/Homebrew/os/mac/xcode.rb             | 16 +++++++----
 4 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/Library/Homebrew/extend/os/mac/diagnostic.rb b/Library/Homebrew/extend/os/mac/diagnostic.rb
index fe0bf0d5be..843196de9a 100644
--- a/Library/Homebrew/extend/os/mac/diagnostic.rb
+++ b/Library/Homebrew/extend/os/mac/diagnostic.rb
@@ -12,6 +12,7 @@ module Homebrew
           check_xcode_minimum_version
           check_clt_minimum_version
           check_if_xcode_needs_clt_installed
+          check_if_supported_sdk_available
         ].freeze
       end
 
@@ -357,6 +358,34 @@ module Homebrew
           Untap them with `brew untap`.
         EOS
       end
+
+      def check_if_supported_sdk_available
+        return unless MacOS.sdk_root_needed?
+        return if MacOS.sdk
+
+        locator = MacOS.sdk_locator
+
+        source = if locator.source == :clt
+          "CLT"
+        else
+          "Xcode"
+        end
+
+        all_sdks = locator.all_sdks
+        sdks_found_msg = unless all_sdks.empty?
+          <<~EOS
+            Homebrew found the following SDKs in the #{source} install:
+              #{locator.all_sdks.map(&:version).join("\n  ")}
+          EOS
+        end
+
+        <<~EOS
+          Could not find an SDK that supports macOS #{MacOS.version}.
+          You may have have an outdated or incompatible #{source}.
+          #{sdks_found_msg}
+          Please update #{source} or uninstall it if no updates are available.
+        EOS
+      end
     end
   end
 end
diff --git a/Library/Homebrew/os/mac.rb b/Library/Homebrew/os/mac.rb
index 27749cf0c8..fe658e924d 100644
--- a/Library/Homebrew/os/mac.rb
+++ b/Library/Homebrew/os/mac.rb
@@ -97,14 +97,16 @@ module OS
     # If no specific SDK is requested, the SDK matching the OS version is returned,
     # if available. Otherwise, the latest SDK is returned.
 
-    def sdk(v = nil)
-      @locator ||= if CLT.installed? && CLT.provides_sdk?
-        CLTSDKLocator.new
+    def sdk_locator
+      if CLT.installed? && CLT.provides_sdk?
+        CLT.sdk_locator
       else
-        XcodeSDKLocator.new
+        Xcode.sdk_locator
       end
+    end
 
-      @locator.sdk_if_applicable(v)
+    def sdk(v = nil)
+      sdk_locator.sdk_if_applicable(v)
     end
 
     def sdk_for_formula(f, v = nil)
diff --git a/Library/Homebrew/os/mac/sdk.rb b/Library/Homebrew/os/mac/sdk.rb
index 156c41812d..f6061c3712 100644
--- a/Library/Homebrew/os/mac/sdk.rb
+++ b/Library/Homebrew/os/mac/sdk.rb
@@ -31,6 +31,10 @@ module OS
         SDK.new v, path, source
       end
 
+      def all_sdks
+        sdk_paths.map { |v, p| SDK.new v, p, source }
+      end
+
       def sdk_if_applicable(v = nil)
         sdk = begin
           if v.nil?
@@ -47,15 +51,11 @@ module OS
         sdk
       end
 
-      private
-
       def source
         nil
       end
 
-      def source_version
-        OS::Mac::Version::NULL
-      end
+      private
 
       def sdk_prefix
         ""
@@ -81,15 +81,11 @@ module OS
     end
 
     class XcodeSDKLocator < BaseSDKLocator
-      private
-
       def source
         :xcode
       end
 
-      def source_version
-        OS::Mac::Xcode.version
-      end
+      private
 
       def sdk_prefix
         @sdk_prefix ||= begin
@@ -105,15 +101,11 @@ module OS
     end
 
     class CLTSDKLocator < BaseSDKLocator
-      private
-
       def source
         :clt
       end
 
-      def source_version
-        OS::Mac::CLT.version
-      end
+      private
 
       # While CLT SDKs existed prior to Xcode 10, those packages also
       # installed a traditional Unix-style header layout and we prefer
diff --git a/Library/Homebrew/os/mac/xcode.rb b/Library/Homebrew/os/mac/xcode.rb
index 1e852b412c..6190e267f4 100644
--- a/Library/Homebrew/os/mac/xcode.rb
+++ b/Library/Homebrew/os/mac/xcode.rb
@@ -107,10 +107,12 @@ module OS
         !prefix.nil?
       end
 
-      def sdk(v = nil)
-        @locator ||= XcodeSDKLocator.new
+      def sdk_locator
+        @sdk_locator ||= XcodeSDKLocator.new
+      end
 
-        @locator.sdk_if_applicable(v)
+      def sdk(v = nil)
+        sdk_locator.sdk_if_applicable(v)
       end
 
       def sdk_path(v = nil)
@@ -219,10 +221,12 @@ module OS
         version >= "8"
       end
 
-      def sdk(v = nil)
-        @locator ||= CLTSDKLocator.new
+      def sdk_locator
+        @sdk_locator ||= CLTSDKLocator.new
+      end
 
-        @locator.sdk_if_applicable(v)
+      def sdk(v = nil)
+        sdk_locator.sdk_if_applicable(v)
       end
 
       def sdk_path(v = nil)

From 433d3a327b60408c1eb1363168a3748deeec9045 Mon Sep 17 00:00:00 2001
From: Thierry Moisan 
Date: Wed, 1 Jul 2020 10:31:56 -0400
Subject: [PATCH 101/149] docs/Common-Issues-for-Core-Contributors: add steps
 to fix failed bottle publish

---
 docs/Common-Issues-for-Core-Contributors.md | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/docs/Common-Issues-for-Core-Contributors.md b/docs/Common-Issues-for-Core-Contributors.md
index a06052faba..bf88e8126a 100644
--- a/docs/Common-Issues-for-Core-Contributors.md
+++ b/docs/Common-Issues-for-Core-Contributors.md
@@ -6,6 +6,13 @@ This is a page for maintainers to diagnose certain build errors.
 
 ## Issues
 
+### Bottle publishes failed but the commits are correct in the git history
+
+Follow these steps to fix this issue:
+* `git reset --hard ` in homebrew/core to reset to the commit before before all the commits created by `brew pr-pull`.
+* `brew pr-pull ` to upload the right bottles. Add the `--warn-on-upload-failure` flag if the bottles have been partially uploaded and you're certain that the bottle checksums will match the checksums already present in the `bottle do` block of the formula.
+* `git reset --hard origin/master` to return to the latest commit and discard the commits made by `brew pr-pull`.
+
 ### `ld: internal error: atom not found in symbolIndex(__ZN10SQInstance3GetERK11SQObjectPtrRS0_) for architecture x86_64`
 
 The exact atom may be different.

From e84b3614580bf25d2b9799f682eecf94cec437ac Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
 <27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Wed, 1 Jul 2020 18:31:53 +0000
Subject: [PATCH 102/149] build(deps): bump diff-lcs from 1.4.3 to 1.4.4 in
 /Library/Homebrew

Bumps [diff-lcs](https://github.com/halostatue/diff-lcs) from 1.4.3 to 1.4.4.
- [Release notes](https://github.com/halostatue/diff-lcs/releases)
- [Changelog](https://github.com/halostatue/diff-lcs/blob/master/History.md)
- [Commits](https://github.com/halostatue/diff-lcs/compare/v1.4.3...v1.4.4)

Signed-off-by: dependabot-preview[bot] 
---
 Library/Homebrew/Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock
index 6867d78d9b..c8f1632b02 100644
--- a/Library/Homebrew/Gemfile.lock
+++ b/Library/Homebrew/Gemfile.lock
@@ -17,7 +17,7 @@ GEM
       term-ansicolor (~> 1.3)
       thor (>= 0.19.4, < 2.0)
       tins (~> 1.6)
-    diff-lcs (1.4.3)
+    diff-lcs (1.4.4)
     docile (1.3.2)
     domain_name (0.5.20190701)
       unf (>= 0.0.5, < 1.0.0)

From 8ff1ca644da58a7fef4463646a13695102f840ff Mon Sep 17 00:00:00 2001
From: Rui Chen 
Date: Wed, 1 Jul 2020 16:48:45 -0400
Subject: [PATCH 103/149] disable license check for new formulae

return when license is blank

Co-authored-by: Bo Anderson 
---
 Library/Homebrew/dev-cmd/audit.rb           | 26 ++++++++++-----------
 Library/Homebrew/test/dev-cmd/audit_spec.rb | 12 ----------
 2 files changed, 12 insertions(+), 26 deletions(-)

diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index 8c2beedfca..ec7a3a6e37 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -333,23 +333,21 @@ module Homebrew
     ].freeze
 
     def audit_license
-      if formula.license.present?
-        if @spdx_data["licenses"].any? { |lic| lic["licenseId"] == formula.license }
-          return unless @online
+      return if formula.license.blank?
 
-          user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula
-          return if user.blank?
+      if @spdx_data["licenses"].any? { |lic| lic["licenseId"] == formula.license }
+        return unless @online
 
-          github_license = GitHub.get_repo_license(user, repo)
-          return if github_license && (github_license == formula.license)
+        user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula
+        return if user.blank?
 
-          problem "License mismatch - GitHub license is: #{github_license}, "\
-                  "but Formulae license states: #{formula.license}."
-        else
-          problem "#{formula.license} is not a standard SPDX license."
-        end
-      elsif @new_formula
-        problem "No license specified for package."
+        github_license = GitHub.get_repo_license(user, repo)
+        return if github_license && (github_license == formula.license)
+
+        problem "License mismatch - GitHub license is: #{github_license}, "\
+                "but Formulae license states: #{formula.license}."
+      else
+        problem "#{formula.license} is not a standard SPDX license."
       end
     end
 
diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb
index c1418223c5..26978b5069 100644
--- a/Library/Homebrew/test/dev-cmd/audit_spec.rb
+++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb
@@ -99,18 +99,6 @@ module Homebrew
         expect(fa.problems).to be_empty
       end
 
-      it "detects no license info" do
-        fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true
-          class Foo < Formula
-            url "https://brew.sh/foo-1.0.tgz"
-            license ""
-          end
-        RUBY
-
-        fa.audit_license
-        expect(fa.problems.first).to match "No license specified for package."
-      end
-
       it "detects if license is not a standard spdx-id" do
         fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true
           class Foo < Formula

From 0e3f22e1df8d32e2ac4f2bb07dfef8efc22f3cbf Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Wed, 1 Jul 2020 22:08:12 +0100
Subject: [PATCH 104/149] dev-cmd/bottle: fix positioning of bottle block in
 some cases

---
 Library/Homebrew/dev-cmd/bottle.rb | 34 +++++++++++++-----------------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/Library/Homebrew/dev-cmd/bottle.rb b/Library/Homebrew/dev-cmd/bottle.rb
index 20fc41ed2a..b2f510583d 100644
--- a/Library/Homebrew/dev-cmd/bottle.rb
+++ b/Library/Homebrew/dev-cmd/bottle.rb
@@ -531,25 +531,21 @@ module Homebrew
             odie "--keep-old was passed but there was no existing bottle block!" if args.keep_old?
             puts output
             update_or_add = "add"
-            if s.include? "stable do"
-              indent = s.slice(/^( +)stable do/, 1).length
-              string = s.sub!(/^ {#{indent}}stable do(.|\n)+?^ {#{indent}}end\n/m, '\0' + output + "\n")
-            else
-              pattern = /(
-                  (\ {2}\#[^\n]*\n)*                                             # comments
-                  \ {2}(                                                         # two spaces at the beginning
-                    (url|head)\ ['"][\S\ ]+['"]                                  # url or head with a string
-                    (
-                      ,[\S\ ]*$                                                  # url may have options
-                      (\n^\ {3}[\S\ ]+$)*                                        # options can be in multiple lines
-                    )?|
-                    (homepage|desc|sha1|sha256|version|mirror)\ ['"][\S\ ]+['"]| # specs with a string
-                    (revision|version_scheme)\ \d+                               # revision with a number
-                  )\n+                                                           # multiple empty lines
-                 )+
-               /mx
-              string = s.sub!(pattern, '\0' + output + "\n")
-            end
+            pattern = /(
+                (\ {2}\#[^\n]*\n)*                                                # comments
+                \ {2}(                                                            # two spaces at the beginning
+                  (url|head)\ ['"][\S\ ]+['"]                                     # url or head with a string
+                  (
+                    ,[\S\ ]*$                                                     # url may have options
+                    (\n^\ {3}[\S\ ]+$)*                                           # options can be in multiple lines
+                  )?|
+                  (homepage|desc|sha256|version|mirror|license)\ ['"][\S\ ]+['"]| # specs with a string
+                  (revision|version_scheme)\ \d+|                                 # revision with a number
+                  (stable|livecheck)\ do(\n+^\ {4}[\S\ ]+$)*\n+^\ {2}end          # components with blocks
+                )\n+                                                              # multiple empty lines
+               )+
+             /mx
+            string = s.sub!(pattern, '\0' + output + "\n")
             odie "Bottle block addition failed!" unless string
           end
         end

From 97f68e6a3a5fb13f34f87c364687f0145d8ff3d1 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Thu, 2 Jul 2020 09:04:58 +0100
Subject: [PATCH 105/149] Revert "disable license check for new formulae"

---
 Library/Homebrew/dev-cmd/audit.rb           | 26 +++++++++++----------
 Library/Homebrew/test/dev-cmd/audit_spec.rb | 12 ++++++++++
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index ec7a3a6e37..8c2beedfca 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -333,21 +333,23 @@ module Homebrew
     ].freeze
 
     def audit_license
-      return if formula.license.blank?
+      if formula.license.present?
+        if @spdx_data["licenses"].any? { |lic| lic["licenseId"] == formula.license }
+          return unless @online
 
-      if @spdx_data["licenses"].any? { |lic| lic["licenseId"] == formula.license }
-        return unless @online
+          user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula
+          return if user.blank?
 
-        user, repo = get_repo_data(%r{https?://github\.com/([^/]+)/([^/]+)/?.*}) if @new_formula
-        return if user.blank?
+          github_license = GitHub.get_repo_license(user, repo)
+          return if github_license && (github_license == formula.license)
 
-        github_license = GitHub.get_repo_license(user, repo)
-        return if github_license && (github_license == formula.license)
-
-        problem "License mismatch - GitHub license is: #{github_license}, "\
-                "but Formulae license states: #{formula.license}."
-      else
-        problem "#{formula.license} is not a standard SPDX license."
+          problem "License mismatch - GitHub license is: #{github_license}, "\
+                  "but Formulae license states: #{formula.license}."
+        else
+          problem "#{formula.license} is not a standard SPDX license."
+        end
+      elsif @new_formula
+        problem "No license specified for package."
       end
     end
 
diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb
index 26978b5069..c1418223c5 100644
--- a/Library/Homebrew/test/dev-cmd/audit_spec.rb
+++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb
@@ -99,6 +99,18 @@ module Homebrew
         expect(fa.problems).to be_empty
       end
 
+      it "detects no license info" do
+        fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true
+          class Foo < Formula
+            url "https://brew.sh/foo-1.0.tgz"
+            license ""
+          end
+        RUBY
+
+        fa.audit_license
+        expect(fa.problems.first).to match "No license specified for package."
+      end
+
       it "detects if license is not a standard spdx-id" do
         fa = formula_auditor "foo", <<~RUBY, spdx_data: spdx_data, new_formula: true
           class Foo < Formula

From 170b38892a4e15cf2fadfd173814954a53c97fb4 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Thu, 2 Jul 2020 10:22:54 +0100
Subject: [PATCH 106/149] Use CodeCov for coverage reporting.

---
 .github/workflows/tests.yml          |  3 +--
 .gitignore                           |  7 ++-----
 Library/Homebrew/.simplecov          |  8 +++++---
 Library/Homebrew/Gemfile             |  2 +-
 Library/Homebrew/Gemfile.lock        | 28 ++++++++++------------------
 Library/Homebrew/test/spec_helper.rb | 19 ++++---------------
 6 files changed, 23 insertions(+), 44 deletions(-)

diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index f2d1663fde..67fc51c363 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -139,8 +139,7 @@ jobs:
         HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 
         # set variables for coverage reporting
-        HOMEBREW_CI_NAME: github-actions
-        HOMEBREW_COVERALLS_REPO_TOKEN: 3F6U6ZqctoNJwKyREremsqMgpU3qYgxFk
+        HOMEBREW_CODECOV_TOKEN: 3ea0364c-80ce-47a3-9fba-93a940d4b5d7
 
         # These cannot be queried at the macOS level on GitHub Actions.
         HOMEBREW_LANGUAGES: en-GB
diff --git a/.gitignore b/.gitignore
index 962dfd140e..d666489d95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -86,7 +86,7 @@
 **/vendor/bundle/ruby/*/gems/byebug-*/
 **/vendor/bundle/ruby/*/gems/coderay-*/
 **/vendor/bundle/ruby/*/gems/connection_pool-*/
-**/vendor/bundle/ruby/*/gems/coveralls-*/
+**/vendor/bundle/ruby/*/gems/codecov-*/
 **/vendor/bundle/ruby/*/gems/diff-lcs-*/
 **/vendor/bundle/ruby/*/gems/docile-*/
 **/vendor/bundle/ruby/*/gems/domain_name-*/
@@ -127,11 +127,8 @@
 **/vendor/bundle/ruby/*/gems/ruby-prof-*/
 **/vendor/bundle/ruby/*/gems/ruby-progressbar-*/
 **/vendor/bundle/ruby/*/gems/simplecov-*/
-**/vendor/bundle/ruby/*/gems/simplecov-cobertura-*/
 **/vendor/bundle/ruby/*/gems/simplecov-html-*/
-**/vendor/bundle/ruby/*/gems/term-ansicolor-*/
-**/vendor/bundle/ruby/*/gems/thor-*/
-**/vendor/bundle/ruby/*/gems/tins-*/
+**/vendor/bundle/ruby/*/gems/url-*/
 **/vendor/bundle/ruby/*/gems/unf_ext-*/
 **/vendor/bundle/ruby/*/gems/unf-*/
 **/vendor/bundle/ruby/*/gems/unicode-display_width-*/
diff --git a/Library/Homebrew/.simplecov b/Library/Homebrew/.simplecov
index 38c7d530e1..2ed96ecf48 100755
--- a/Library/Homebrew/.simplecov
+++ b/Library/Homebrew/.simplecov
@@ -1,4 +1,5 @@
 #!/usr/bin/env ruby
+# frozen_string_literal: true
 
 require "English"
 
@@ -20,7 +21,8 @@ SimpleCov.start do
 
       # Just save result, but don't write formatted output.
       coverage_result = Coverage.result
-      SimpleCov.add_not_loaded_files(coverage_result)
+      # TODO: this method is private, find a better way.
+      SimpleCov.send(:add_not_loaded_files, coverage_result)
       simplecov_result = SimpleCov::Result.new(coverage_result)
       SimpleCov::ResultMerger.store_result(simplecov_result)
 
@@ -50,8 +52,8 @@ SimpleCov.start do
 
   require "rbconfig"
   host_os = RbConfig::CONFIG["host_os"]
-  add_filter %r{/os/mac} if host_os !~ /darwin/
-  add_filter %r{/os/linux} if host_os !~ /linux/
+  add_filter %r{/os/mac} unless /darwin/.match?(host_os)
+  add_filter %r{/os/linux} unless /linux/.match?(host_os)
 
   # Add groups and the proper project name to the output.
   project_name "Homebrew"
diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile
index 657bf5bd54..e6a4fdb19b 100644
--- a/Library/Homebrew/Gemfile
+++ b/Library/Homebrew/Gemfile
@@ -4,7 +4,7 @@ source "https://rubygems.org"
 
 # installed gems
 gem "byebug"
-gem "coveralls", "~> 0.8", require: false
+gem "codecov", require: false
 gem "parallel_tests"
 gem "ronn", require: false
 gem "rspec"
diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock
index c8f1632b02..e5aecfc14b 100644
--- a/Library/Homebrew/Gemfile.lock
+++ b/Library/Homebrew/Gemfile.lock
@@ -9,14 +9,12 @@ GEM
       zeitwerk (~> 2.2, >= 2.2.2)
     ast (2.4.1)
     byebug (11.1.3)
+    codecov (0.1.17)
+      json
+      simplecov
+      url
     concurrent-ruby (1.1.6)
     connection_pool (2.2.3)
-    coveralls (0.8.23)
-      json (>= 1.8, < 3)
-      simplecov (~> 0.16.1)
-      term-ansicolor (~> 1.3)
-      thor (>= 0.19.4, < 2.0)
-      tins (~> 1.6)
     diff-lcs (1.4.4)
     docile (1.3.2)
     domain_name (0.5.20190701)
@@ -99,24 +97,18 @@ GEM
       rubocop (>= 0.68.1)
     ruby-macho (2.2.0)
     ruby-progressbar (1.10.1)
-    simplecov (0.16.1)
+    simplecov (0.18.5)
       docile (~> 1.1)
-      json (>= 1.8, < 3)
-      simplecov-html (~> 0.10.0)
-    simplecov-html (0.10.2)
-    sync (0.5.0)
-    term-ansicolor (1.7.1)
-      tins (~> 1.0)
-    thor (1.0.1)
+      simplecov-html (~> 0.11)
+    simplecov-html (0.12.2)
     thread_safe (0.3.6)
-    tins (1.25.0)
-      sync
     tzinfo (1.2.7)
       thread_safe (~> 0.1)
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.7)
     unicode-display_width (1.7.0)
+    url (0.3.2)
     webrobots (0.1.2)
     zeitwerk (2.3.1)
 
@@ -126,8 +118,8 @@ PLATFORMS
 DEPENDENCIES
   activesupport
   byebug
+  codecov
   concurrent-ruby
-  coveralls (~> 0.8)
   mechanize
   parallel_tests
   plist
@@ -143,4 +135,4 @@ DEPENDENCIES
   simplecov
 
 BUNDLED WITH
-   1.17.2
+   1.17.3
diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb
index 7ac1062bdd..355c223257 100644
--- a/Library/Homebrew/test/spec_helper.rb
+++ b/Library/Homebrew/test/spec_helper.rb
@@ -4,12 +4,10 @@ if ENV["HOMEBREW_TESTS_COVERAGE"]
   require "simplecov"
 
   formatters = [SimpleCov::Formatter::HTMLFormatter]
-  if ENV["HOMEBREW_COVERALLS_REPO_TOKEN"] && RUBY_PLATFORM[/darwin/]
-    require "coveralls"
+  if ENV["HOMEBREW_CODECOV_TOKEN"] && RUBY_PLATFORM[/darwin/]
+    require "codecov"
 
-    Coveralls::Output.no_color if !ENV["HOMEBREW_COLOR"] && (ENV["HOMEBREW_NO_COLOR"] || !$stdout.tty?)
-
-    formatters << Coveralls::SimpleCov::Formatter
+    formatters << SimpleCov::Formatter::Codecov
 
     if ENV["TEST_ENV_NUMBER"]
       SimpleCov.at_exit do
@@ -18,16 +16,7 @@ if ENV["HOMEBREW_TESTS_COVERAGE"]
       end
     end
 
-    ENV["CI_NAME"] = ENV["HOMEBREW_CI_NAME"]
-    ENV["COVERALLS_REPO_TOKEN"] = ENV["HOMEBREW_COVERALLS_REPO_TOKEN"]
-
-    ENV["CI_BUILD_NUMBER"] = ENV["HOMEBREW_CI_BUILD_NUMBER"]
-    ENV["CI_BRANCH"] = ENV["HOMEBREW_CI_BRANCH"]
-    %r{refs/pull/(?\d+)/merge} =~ ENV["HOMEBREW_CI_BUILD_NUMBER"]
-    ENV["CI_PULL_REQUEST"] = pr
-    ENV["CI_BUILD_URL"] = "https://github.com/#{ENV["HOMEBREW_GITHUB_REPOSITORY"]}/pull/#{pr}/checks"
-
-    ENV["CI_JOB_ID"] = ENV["TEST_ENV_NUMBER"] || "1"
+    ENV["CODECOV_TOKEN"] = ENV["HOMEBREW_CODECOV_TOKEN"]
   end
 
   SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new(formatters)

From 89605d2c6f5a52e533d09ce5c618505bd005cb05 Mon Sep 17 00:00:00 2001
From: vidusheeamoli 
Date: Thu, 2 Jul 2020 16:05:54 +0530
Subject: [PATCH 107/149] sorbet/files.yaml: set utils/tty.rb to true

---
 Library/Homebrew/sorbet/files.yaml        |  2 +-
 Library/Homebrew/sorbet/rbi/utils/tty.rbi | 36 +++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 Library/Homebrew/sorbet/rbi/utils/tty.rbi

diff --git a/Library/Homebrew/sorbet/files.yaml b/Library/Homebrew/sorbet/files.yaml
index 66a79e6c3b..50900c4005 100644
--- a/Library/Homebrew/sorbet/files.yaml
+++ b/Library/Homebrew/sorbet/files.yaml
@@ -453,7 +453,6 @@ false:
   - ./utils/github.rb
   - ./utils/notability.rb
   - ./utils/popen.rb
-  - ./utils/tty.rb
   - ./utils/user.rb
 
 false:
@@ -889,6 +888,7 @@ true:
   - ./tap_constants.rb
   - ./test/support/helper/fixtures.rb
   - ./test/support/lib/config.rb
+  - ./utils/tty.rb
   - ./version/null.rb
 
 strict:
diff --git a/Library/Homebrew/sorbet/rbi/utils/tty.rbi b/Library/Homebrew/sorbet/rbi/utils/tty.rbi
new file mode 100644
index 0000000000..67b8a68ee8
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/utils/tty.rbi
@@ -0,0 +1,36 @@
+# typed: strict
+
+module Tty
+  include Kernel
+
+  sig{ params(string: String).returns(String) }
+  def strip_ansi(string)
+  end
+
+  sig{ returns(Integer) }
+  def width()
+  end
+
+  sig{ params(string: String).returns(T.nilable(String)) }
+  def truncate(string)
+  end
+
+  def append_to_escape_sequence(code)
+  end
+
+  sig{ returns(String) }
+  def current_escape_sequence()
+  end
+
+  sig{ void }
+  def reset_escape_sequence!()
+  end
+
+  sig{ returns(String) }
+  def to_s
+  end
+
+  sig { returns(T::Boolean) }
+  def color?
+  end
+end

From 7596108bd249ce3878cc8f6fb35138640be701cd Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Thu, 2 Jul 2020 11:57:11 +0100
Subject: [PATCH 108/149] Bottle extract and fetch fixes

- Make `brew extract` strip out bottle blocks
- Make `brew extract` output the path in a readable fashion
- Warn about building from source before fetching (not installing)
- If fetching a bottle fails, refetch and build from source.
---
 Library/Homebrew/dev-cmd/extract.rb   |  8 ++++++--
 Library/Homebrew/formula_installer.rb | 23 ++++++++++++++++++-----
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/Library/Homebrew/dev-cmd/extract.rb b/Library/Homebrew/dev-cmd/extract.rb
index 0d4b20b9e0..d7d11b0233 100644
--- a/Library/Homebrew/dev-cmd/extract.rb
+++ b/Library/Homebrew/dev-cmd/extract.rb
@@ -191,7 +191,10 @@ module Homebrew
     # Remove any existing version suffixes, as a new one will be added later
     name.sub!(/\b@(.*)\z\b/i, "")
     versioned_name = Formulary.class_s("#{name}@#{version}")
-    result.gsub!("class #{class_name} < Formula", "class #{versioned_name} < Formula")
+    result.sub!("class #{class_name} < Formula", "class #{versioned_name} < Formula")
+
+    # Remove bottle blocks, they won't work.
+    result.sub!(/  bottle do.+?end\n\n/m, "") if destination_tap != source_tap
 
     path = destination_tap.path/"Formula/#{name}@#{version}.rb"
     if path.exist?
@@ -205,7 +208,8 @@ module Homebrew
       odebug "Overwriting existing formula at #{path}"
       path.delete
     end
-    ohai "Writing formula for #{name} from revision #{rev} to #{path}"
+    ohai "Writing formula for #{name} from revision #{rev} to:"
+    puts path
     path.write result
   end
 
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index 41298db9e3..de51741306 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -292,7 +292,7 @@ class FormulaInstaller
 
     self.class.attempted << formula
 
-    if pour_bottle?(warn: true)
+    if pour_bottle?
       begin
         pour
       rescue Exception => e # rubocop:disable Lint/RescueException
@@ -983,11 +983,24 @@ class FormulaInstaller
 
     return if only_deps?
 
-    unless pour_bottle?
-      formula.fetch_patches
-      formula.resources.each(&:fetch)
-    end
+    if pour_bottle?(warn: true)
+      begin
+        downloader.fetch
+      rescue Exception => e # rubocop:disable Lint/RescueException
+        raise if Homebrew::EnvConfig.developer? ||
+                 Homebrew::EnvConfig.no_bottle_source_fallback? ||
+                 e.is_a?(Interrupt)
 
+        @pour_failed = true
+        onoe e.message
+        opoo "Bottle installation failed: building from source."
+        fetch_dependencies
+      end
+    end
+    return if pour_bottle?
+
+    formula.fetch_patches
+    formula.resources.each(&:fetch)
     downloader.fetch
   end
 

From 14ed1adb6c071568ba5ada21e1a9719951f46bb1 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Thu, 2 Jul 2020 12:50:56 +0100
Subject: [PATCH 109/149] Add CodeCov YAML file.

This should make the output and statuses a bit more friendly.
---
 Library/Homebrew/test/.codecov.yml | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 Library/Homebrew/test/.codecov.yml

diff --git a/Library/Homebrew/test/.codecov.yml b/Library/Homebrew/test/.codecov.yml
new file mode 100644
index 0000000000..27b6f08432
--- /dev/null
+++ b/Library/Homebrew/test/.codecov.yml
@@ -0,0 +1,9 @@
+codecov:
+  fixes:
+   - "::Library/Homebrew/"
+  coverage:
+    round: nearest
+    status:
+      project:
+        default:
+          threshold: 0.05%

From 2c133a3d45366a503c99a02e7e255e4387e8bff7 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Thu, 2 Jul 2020 12:53:52 +0100
Subject: [PATCH 110/149] Check installed dependents on install and reinstall

It's not sufficient to do this merely on `brew upgrade` because
`brew install` and `brew reinstall` can also result in formulae being
upgraded.

This requires moving logic from `cmd/upgrade.rb` to `upgrade.rb`. To
save you searching the diff the changes that resulted from doing that:

- Query the installed formulae from class state in `FormulaInstaller`
  rather than the (incomplete) list that we passed into it.
- Don't output the "Checking dependents" message. It was there for
  systems and configurations where this is slow but for most users
  and most installations this will be a (annoying, noisy) no-op.

Fixes https://github.com/Homebrew/brew/issues/7860
---
 Library/Homebrew/cmd/install.rb       |   4 +
 Library/Homebrew/cmd/reinstall.rb     |   4 +
 Library/Homebrew/cmd/upgrade.rb       | 244 +-------------------------
 Library/Homebrew/formula_installer.rb |  10 ++
 Library/Homebrew/test/spec_helper.rb  |   1 +
 Library/Homebrew/upgrade.rb           | 242 +++++++++++++++++++++++++
 6 files changed, 265 insertions(+), 240 deletions(-)
 create mode 100644 Library/Homebrew/upgrade.rb

diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb
index d6ad01feef..a608b72ea9 100644
--- a/Library/Homebrew/cmd/install.rb
+++ b/Library/Homebrew/cmd/install.rb
@@ -7,6 +7,7 @@ require "install"
 require "search"
 require "cleanup"
 require "cli/parser"
+require "upgrade"
 
 module Homebrew
   module_function
@@ -261,6 +262,9 @@ module Homebrew
       install_formula(f)
       Cleanup.install_formula_clean!(f)
     end
+
+    check_installed_dependents
+
     Homebrew.messages.display_messages
   rescue FormulaUnreadableError, FormulaClassUnavailableError,
          TapFormulaUnreadableError, TapFormulaClassUnavailableError => e
diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb
index c6abc8fa36..bc85d52f13 100644
--- a/Library/Homebrew/cmd/reinstall.rb
+++ b/Library/Homebrew/cmd/reinstall.rb
@@ -6,6 +6,7 @@ require "messages"
 require "reinstall"
 require "cli/parser"
 require "cleanup"
+require "upgrade"
 
 module Homebrew
   module_function
@@ -65,6 +66,9 @@ module Homebrew
       reinstall_formula(f)
       Cleanup.install_formula_clean!(f)
     end
+
+    check_installed_dependents
+
     Homebrew.messages.display_messages
   end
 end
diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb
index 11efd5be00..66a8049165 100644
--- a/Library/Homebrew/cmd/upgrade.rb
+++ b/Library/Homebrew/cmd/upgrade.rb
@@ -1,12 +1,9 @@
 # frozen_string_literal: true
 
-require "install"
-require "reinstall"
-require "formula_installer"
-require "development_tools"
-require "messages"
-require "cleanup"
 require "cli/parser"
+require "formula_installer"
+require "install"
+require "upgrade"
 
 module Homebrew
   module_function
@@ -114,241 +111,8 @@ module Homebrew
 
     upgrade_formulae(formulae_to_install)
 
-    check_dependents(formulae_to_install)
+    check_installed_dependents
 
     Homebrew.messages.display_messages
   end
-
-  def upgrade_formulae(formulae_to_install)
-    return if formulae_to_install.empty?
-    return if args.dry_run?
-
-    # Sort keg-only before non-keg-only formulae to avoid any needless conflicts
-    # with outdated, non-keg-only versions of formulae being upgraded.
-    formulae_to_install.sort! do |a, b|
-      if !a.keg_only? && b.keg_only?
-        1
-      elsif a.keg_only? && !b.keg_only?
-        -1
-      else
-        0
-      end
-    end
-
-    formulae_to_install.each do |f|
-      Migrator.migrate_if_needed(f)
-      begin
-        upgrade_formula(f)
-        Cleanup.install_formula_clean!(f)
-      rescue UnsatisfiedRequirements => e
-        Homebrew.failed = true
-        onoe "#{f}: #{e}"
-      end
-    end
-  end
-
-  def upgrade_formula(f)
-    return if args.dry_run?
-
-    if f.opt_prefix.directory?
-      keg = Keg.new(f.opt_prefix.resolved_path)
-      keg_had_linked_opt = true
-      keg_was_linked = keg.linked?
-    end
-
-    formulae_maybe_with_kegs = [f] + f.old_installed_formulae
-    outdated_kegs = formulae_maybe_with_kegs
-                    .map(&:linked_keg)
-                    .select(&:directory?)
-                    .map { |k| Keg.new(k.resolved_path) }
-    linked_kegs = outdated_kegs.select(&:linked?)
-
-    if f.opt_prefix.directory?
-      keg = Keg.new(f.opt_prefix.resolved_path)
-      tab = Tab.for_keg(keg)
-    end
-
-    build_options = BuildOptions.new(Options.create(args.flags_only), f.options)
-    options = build_options.used_options
-    options |= f.build.used_options
-    options &= f.options
-
-    fi = FormulaInstaller.new(f)
-    fi.options = options
-    fi.build_bottle = args.build_bottle?
-    fi.installed_on_request = args.named.present?
-    fi.link_keg           ||= keg_was_linked if keg_had_linked_opt
-    if tab
-      fi.build_bottle          ||= tab.built_bottle?
-      fi.installed_as_dependency = tab.installed_as_dependency
-      fi.installed_on_request  ||= tab.installed_on_request
-    end
-
-    upgrade_version = if f.optlinked?
-      "#{Keg.new(f.opt_prefix).version} -> #{f.pkg_version}"
-    else
-      "-> #{f.pkg_version}"
-    end
-    oh1 "Upgrading #{Formatter.identifier(f.full_specified_name)} #{upgrade_version} #{fi.options.to_a.join(" ")}"
-
-    fi.prelude
-    fi.fetch
-
-    # first we unlink the currently active keg for this formula otherwise it is
-    # possible for the existing build to interfere with the build we are about to
-    # do! Seriously, it happens!
-    outdated_kegs.each(&:unlink)
-
-    fi.install
-    fi.finish
-  rescue FormulaInstallationAlreadyAttemptedError
-    # We already attempted to upgrade f as part of the dependency tree of
-    # another formula. In that case, don't generate an error, just move on.
-    nil
-  rescue CannotInstallFormulaError => e
-    ofail e
-  rescue BuildError => e
-    e.dump
-    puts
-    Homebrew.failed = true
-  rescue DownloadError => e
-    ofail e
-  ensure
-    # restore previous installation state if build failed
-    begin
-      linked_kegs.each(&:link) unless f.latest_version_installed?
-    rescue
-      nil
-    end
-  end
-
-  # @private
-  def depends_on(a, b)
-    if a.opt_or_installed_prefix_keg
-       &.runtime_dependencies
-       &.any? { |d| d["full_name"] == b.full_name }
-      1
-    else
-      a <=> b
-    end
-  end
-
-  def check_dependents(formulae_to_install)
-    return if formulae_to_install.empty?
-
-    oh1 "Checking for dependents of upgraded formulae..." unless args.dry_run?
-    outdated_dependents =
-      formulae_to_install.flat_map(&:runtime_installed_formula_dependents)
-                         .select(&:outdated?)
-    if outdated_dependents.blank?
-      ohai "No dependents found!" unless args.dry_run?
-      return
-    end
-    outdated_dependents -= formulae_to_install if args.dry_run?
-
-    upgradeable_dependents =
-      outdated_dependents.reject(&:pinned?)
-                         .sort { |a, b| depends_on(a, b) }
-    pinned_dependents =
-      outdated_dependents.select(&:pinned?)
-                         .sort { |a, b| depends_on(a, b) }
-
-    if pinned_dependents.present?
-      plural = "dependent".pluralize(pinned_dependents.count)
-      ohai "Not upgrading #{pinned_dependents.count} pinned #{plural}:"
-      puts(pinned_dependents.map do |f|
-        "#{f.full_specified_name} #{f.pkg_version}"
-      end.join(", "))
-    end
-
-    # Print the upgradable dependents.
-    if upgradeable_dependents.blank?
-      ohai "No outdated dependents to upgrade!" unless args.dry_run?
-    else
-      plural = "dependent".pluralize(upgradeable_dependents.count)
-      verb = args.dry_run? ? "Would upgrade" : "Upgrading"
-      ohai "#{verb} #{upgradeable_dependents.count} #{plural}:"
-      formulae_upgrades = upgradeable_dependents.map do |f|
-        name = f.full_specified_name
-        if f.optlinked?
-          "#{name} #{Keg.new(f.opt_prefix).version} -> #{f.pkg_version}"
-        else
-          "#{name} #{f.pkg_version}"
-        end
-      end
-      puts formulae_upgrades.join(", ")
-    end
-
-    upgrade_formulae(upgradeable_dependents)
-
-    # Assess the dependents tree again now we've upgraded.
-    oh1 "Checking for dependents of upgraded formulae..." unless args.dry_run?
-    broken_dependents = CacheStoreDatabase.use(:linkage) do |db|
-      formulae_to_install.flat_map(&:runtime_installed_formula_dependents)
-                         .select do |f|
-        keg = f.opt_or_installed_prefix_keg
-        next unless keg
-
-        LinkageChecker.new(keg, cache_db: db)
-                      .broken_library_linkage?
-      end.compact
-    end
-    if broken_dependents.blank?
-      if args.dry_run?
-        ohai "No currently broken dependents found!"
-        opoo "If they are broken by the upgrade they will also be upgraded or reinstalled."
-      else
-        ohai "No broken dependents found!"
-      end
-      return
-    end
-
-    reinstallable_broken_dependents =
-      broken_dependents.reject(&:outdated?)
-                       .reject(&:pinned?)
-                       .sort { |a, b| depends_on(a, b) }
-    outdated_pinned_broken_dependents =
-      broken_dependents.select(&:outdated?)
-                       .select(&:pinned?)
-                       .sort { |a, b| depends_on(a, b) }
-
-    # Print the pinned dependents.
-    if outdated_pinned_broken_dependents.present?
-      count = outdated_pinned_broken_dependents.count
-      plural = "dependent".pluralize(outdated_pinned_broken_dependents.count)
-      onoe "Not reinstalling #{count} broken and outdated, but pinned #{plural}:"
-      $stderr.puts(outdated_pinned_broken_dependents.map do |f|
-        "#{f.full_specified_name} #{f.pkg_version}"
-      end.join(", "))
-    end
-
-    # Print the broken dependents.
-    if reinstallable_broken_dependents.blank?
-      ohai "No broken dependents to reinstall!"
-    else
-      count = reinstallable_broken_dependents.count
-      plural = "dependent".pluralize(reinstallable_broken_dependents.count)
-      ohai "Reinstalling #{count} broken #{plural} from source:"
-      puts reinstallable_broken_dependents.map(&:full_specified_name)
-                                          .join(", ")
-    end
-
-    return if args.dry_run?
-
-    reinstallable_broken_dependents.each do |f|
-      reinstall_formula(f, build_from_source: true)
-    rescue FormulaInstallationAlreadyAttemptedError
-      # We already attempted to reinstall f as part of the dependency tree of
-      # another formula. In that case, don't generate an error, just move on.
-      nil
-    rescue CannotInstallFormulaError => e
-      ofail e
-    rescue BuildError => e
-      e.dump
-      puts
-      Homebrew.failed = true
-    rescue DownloadError => e
-      ofail e
-    end
-  end
 end
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index 41298db9e3..30876d2fa9 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -77,6 +77,14 @@ class FormulaInstaller
     @attempted = Set.new
   end
 
+  def self.installed
+    @installed ||= Set.new
+  end
+
+  def self.clear_installed
+    @installed = Set.new
+  end
+
   # When no build tools are available and build flags are passed through ARGV,
   # it's necessary to interrupt the user before any sort of installation
   # can proceed. Only invoked when the user has no developer tools.
@@ -700,6 +708,8 @@ class FormulaInstaller
 
     ohai "Summary" if verbose? || show_summary_heading?
     puts summary
+
+    self.class.installed << formula
   ensure
     unlock
   end
diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb
index 355c223257..337569b431 100644
--- a/Library/Homebrew/test/spec_helper.rb
+++ b/Library/Homebrew/test/spec_helper.rb
@@ -163,6 +163,7 @@ RSpec.configure do |config|
       Keg.clear_cache
       Tab.clear_cache
       FormulaInstaller.clear_attempted
+      FormulaInstaller.clear_installed
 
       TEST_DIRECTORIES.each(&:mkpath)
 
diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb
new file mode 100644
index 0000000000..a875bfef83
--- /dev/null
+++ b/Library/Homebrew/upgrade.rb
@@ -0,0 +1,242 @@
+# frozen_string_literal: true
+
+require "reinstall"
+require "formula_installer"
+require "development_tools"
+require "messages"
+require "cleanup"
+
+module Homebrew
+  module_function
+
+  def upgrade_formulae(formulae_to_install)
+    return if formulae_to_install.empty?
+    return if args.dry_run?
+
+    # Sort keg-only before non-keg-only formulae to avoid any needless conflicts
+    # with outdated, non-keg-only versions of formulae being upgraded.
+    formulae_to_install.sort! do |a, b|
+      if !a.keg_only? && b.keg_only?
+        1
+      elsif a.keg_only? && !b.keg_only?
+        -1
+      else
+        0
+      end
+    end
+
+    formulae_to_install.each do |f|
+      Migrator.migrate_if_needed(f)
+      begin
+        upgrade_formula(f)
+        Cleanup.install_formula_clean!(f)
+      rescue UnsatisfiedRequirements => e
+        Homebrew.failed = true
+        onoe "#{f}: #{e}"
+      end
+    end
+  end
+
+  def upgrade_formula(f)
+    return if args.dry_run?
+
+    if f.opt_prefix.directory?
+      keg = Keg.new(f.opt_prefix.resolved_path)
+      keg_had_linked_opt = true
+      keg_was_linked = keg.linked?
+    end
+
+    formulae_maybe_with_kegs = [f] + f.old_installed_formulae
+    outdated_kegs = formulae_maybe_with_kegs
+                    .map(&:linked_keg)
+                    .select(&:directory?)
+                    .map { |k| Keg.new(k.resolved_path) }
+    linked_kegs = outdated_kegs.select(&:linked?)
+
+    if f.opt_prefix.directory?
+      keg = Keg.new(f.opt_prefix.resolved_path)
+      tab = Tab.for_keg(keg)
+    end
+
+    build_options = BuildOptions.new(Options.create(args.flags_only), f.options)
+    options = build_options.used_options
+    options |= f.build.used_options
+    options &= f.options
+
+    fi = FormulaInstaller.new(f)
+    fi.options = options
+    fi.build_bottle = args.build_bottle?
+    fi.installed_on_request = args.named.present?
+    fi.link_keg           ||= keg_was_linked if keg_had_linked_opt
+    if tab
+      fi.build_bottle          ||= tab.built_bottle?
+      fi.installed_as_dependency = tab.installed_as_dependency
+      fi.installed_on_request  ||= tab.installed_on_request
+    end
+
+    upgrade_version = if f.optlinked?
+      "#{Keg.new(f.opt_prefix).version} -> #{f.pkg_version}"
+    else
+      "-> #{f.pkg_version}"
+    end
+    oh1 "Upgrading #{Formatter.identifier(f.full_specified_name)} #{upgrade_version} #{fi.options.to_a.join(" ")}"
+
+    fi.prelude
+    fi.fetch
+
+    # first we unlink the currently active keg for this formula otherwise it is
+    # possible for the existing build to interfere with the build we are about to
+    # do! Seriously, it happens!
+    outdated_kegs.each(&:unlink)
+
+    fi.install
+    fi.finish
+  rescue FormulaInstallationAlreadyAttemptedError
+    # We already attempted to upgrade f as part of the dependency tree of
+    # another formula. In that case, don't generate an error, just move on.
+    nil
+  rescue CannotInstallFormulaError => e
+    ofail e
+  rescue BuildError => e
+    e.dump
+    puts
+    Homebrew.failed = true
+  rescue DownloadError => e
+    ofail e
+  ensure
+    # restore previous installation state if build failed
+    begin
+      linked_kegs.each(&:link) unless f.latest_version_installed?
+    rescue
+      nil
+    end
+  end
+
+  def check_installed_dependents
+    installed_formulae = FormulaInstaller.installed.to_a
+    return if installed_formulae.empty?
+
+    outdated_dependents =
+      installed_formulae.flat_map(&:runtime_installed_formula_dependents)
+                        .select(&:outdated?)
+    return if outdated_dependents.blank?
+
+    outdated_dependents -= installed_formulae if args.dry_run?
+
+    upgradeable_dependents =
+      outdated_dependents.reject(&:pinned?)
+                         .sort { |a, b| depends_on(a, b) }
+    pinned_dependents =
+      outdated_dependents.select(&:pinned?)
+                         .sort { |a, b| depends_on(a, b) }
+
+    if pinned_dependents.present?
+      plural = "dependent".pluralize(pinned_dependents.count)
+      ohai "Not upgrading #{pinned_dependents.count} pinned #{plural}:"
+      puts(pinned_dependents.map do |f|
+        "#{f.full_specified_name} #{f.pkg_version}"
+      end.join(", "))
+    end
+
+    # Print the upgradable dependents.
+    if upgradeable_dependents.blank?
+      ohai "No outdated dependents to upgrade!" unless args.dry_run?
+    else
+      plural = "dependent".pluralize(upgradeable_dependents.count)
+      verb = args.dry_run? ? "Would upgrade" : "Upgrading"
+      ohai "#{verb} #{upgradeable_dependents.count} #{plural}:"
+      formulae_upgrades = upgradeable_dependents.map do |f|
+        name = f.full_specified_name
+        if f.optlinked?
+          "#{name} #{Keg.new(f.opt_prefix).version} -> #{f.pkg_version}"
+        else
+          "#{name} #{f.pkg_version}"
+        end
+      end
+      puts formulae_upgrades.join(", ")
+    end
+
+    upgrade_formulae(upgradeable_dependents)
+
+    # Assess the dependents tree again now we've upgraded.
+    oh1 "Checking for dependents of upgraded formulae..." unless args.dry_run?
+    broken_dependents = CacheStoreDatabase.use(:linkage) do |db|
+      formulae_to_install.flat_map(&:runtime_installed_formula_dependents)
+                         .select do |f|
+        keg = f.opt_or_installed_prefix_keg
+        next unless keg
+
+        LinkageChecker.new(keg, cache_db: db)
+                      .broken_library_linkage?
+      end.compact
+    end
+    if broken_dependents.blank?
+      if args.dry_run?
+        ohai "No currently broken dependents found!"
+        opoo "If they are broken by the upgrade they will also be upgraded or reinstalled."
+      else
+        ohai "No broken dependents found!"
+      end
+      return
+    end
+
+    reinstallable_broken_dependents =
+      broken_dependents.reject(&:outdated?)
+                       .reject(&:pinned?)
+                       .sort { |a, b| depends_on(a, b) }
+    outdated_pinned_broken_dependents =
+      broken_dependents.select(&:outdated?)
+                       .select(&:pinned?)
+                       .sort { |a, b| depends_on(a, b) }
+
+    # Print the pinned dependents.
+    if outdated_pinned_broken_dependents.present?
+      count = outdated_pinned_broken_dependents.count
+      plural = "dependent".pluralize(outdated_pinned_broken_dependents.count)
+      onoe "Not reinstalling #{count} broken and outdated, but pinned #{plural}:"
+      $stderr.puts(outdated_pinned_broken_dependents.map do |f|
+        "#{f.full_specified_name} #{f.pkg_version}"
+      end.join(", "))
+    end
+
+    # Print the broken dependents.
+    if reinstallable_broken_dependents.blank?
+      ohai "No broken dependents to reinstall!"
+    else
+      count = reinstallable_broken_dependents.count
+      plural = "dependent".pluralize(reinstallable_broken_dependents.count)
+      ohai "Reinstalling #{count} broken #{plural} from source:"
+      puts reinstallable_broken_dependents.map(&:full_specified_name)
+                                          .join(", ")
+    end
+
+    return if args.dry_run?
+
+    reinstallable_broken_dependents.each do |f|
+      reinstall_formula(f, build_from_source: true)
+    rescue FormulaInstallationAlreadyAttemptedError
+      # We already attempted to reinstall f as part of the dependency tree of
+      # another formula. In that case, don't generate an error, just move on.
+      nil
+    rescue CannotInstallFormulaError => e
+      ofail e
+    rescue BuildError => e
+      e.dump
+      puts
+      Homebrew.failed = true
+    rescue DownloadError => e
+      ofail e
+    end
+  end
+
+  # @private
+  def depends_on(a, b)
+    if a.opt_or_installed_prefix_keg
+       &.runtime_dependencies
+       &.any? { |d| d["full_name"] == b.full_name }
+      1
+    else
+      a <=> b
+    end
+  end
+end

From 2970d2e4f9dafad8ef90ebf439a6f0b31b317be7 Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Thu, 2 Jul 2020 18:58:00 +0100
Subject: [PATCH 111/149] dev-cmd/update-license-data: fix --fail-if-changed

---
 Library/Homebrew/dev-cmd/update-license-data.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb
index 22e73db9a8..1e17106499 100644
--- a/Library/Homebrew/dev-cmd/update-license-data.rb
+++ b/Library/Homebrew/dev-cmd/update-license-data.rb
@@ -34,6 +34,6 @@ module Homebrew
 
     return unless args.fail_if_changed?
 
-    system("git diff --stat --exit-code #{SPDX_PATH}")
+    safe_system "git", "diff", "--stat", "--exit-code", SPDX_PATH
   end
 end

From 997ba42a4b67363adc9c32e13beb4130177aee1a Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Thu, 2 Jul 2020 18:58:32 +0100
Subject: [PATCH 112/149] utils/curl: support disabling partial downloads in
 curl_download

---
 Library/Homebrew/utils/curl.rb | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/Library/Homebrew/utils/curl.rb b/Library/Homebrew/utils/curl.rb
index 7503e16822..f767fdb0e3 100644
--- a/Library/Homebrew/utils/curl.rb
+++ b/Library/Homebrew/utils/curl.rb
@@ -54,21 +54,25 @@ def curl(*args, secrets: [], **options)
                   secrets:      secrets
 end
 
-def curl_download(*args, to: nil, **options)
+def curl_download(*args, to: nil, partial: true, **options)
   destination = Pathname(to)
   destination.dirname.mkpath
 
-  range_stdout = curl_output("--location", "--range", "0-1",
-                             "--dump-header", "-",
-                             "--write-out", "%\{http_code}",
-                             "--output", "/dev/null", *args, **options).stdout
-  headers, _, http_status = range_stdout.partition("\r\n\r\n")
+  if partial
+    range_stdout = curl_output("--location", "--range", "0-1",
+                               "--dump-header", "-",
+                               "--write-out", "%\{http_code}",
+                               "--output", "/dev/null", *args, **options).stdout
+    headers, _, http_status = range_stdout.partition("\r\n\r\n")
 
-  supports_partial_download = http_status.to_i == 206 # Partial Content
-  if supports_partial_download &&
-     destination.exist? &&
-     destination.size == %r{^.*Content-Range: bytes \d+-\d+/(\d+)\r\n.*$}m.match(headers)&.[](1)&.to_i
-    return # We've already downloaded all the bytes
+    supports_partial_download = http_status.to_i == 206 # Partial Content
+    if supports_partial_download &&
+       destination.exist? &&
+       destination.size == %r{^.*Content-Range: bytes \d+-\d+/(\d+)\r\n.*$}m.match(headers)&.[](1)&.to_i
+      return # We've already downloaded all the bytes
+    end
+  else
+    supports_partial_download = false
   end
 
   continue_at = if destination.exist? && supports_partial_download

From 4411764aa10ef4eaf0dafb845d6fcae34d54b809 Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Thu, 2 Jul 2020 18:59:10 +0100
Subject: [PATCH 113/149] dev-cmd/update-license-data: don't use partial
 downloading

---
 Library/Homebrew/dev-cmd/update-license-data.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/dev-cmd/update-license-data.rb b/Library/Homebrew/dev-cmd/update-license-data.rb
index 1e17106499..aa05702186 100644
--- a/Library/Homebrew/dev-cmd/update-license-data.rb
+++ b/Library/Homebrew/dev-cmd/update-license-data.rb
@@ -30,7 +30,7 @@ module Homebrew
   def update_license_data
     update_license_data_args.parse
     ohai "Updating SPDX license data..."
-    curl_download(SPDX_DATA_URL, to: SPDX_PATH)
+    curl_download(SPDX_DATA_URL, to: SPDX_PATH, partial: false)
 
     return unless args.fail_if_changed?
 

From 76e328f21a270a8338e9ca47110f3626767c7bff Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Thu, 2 Jul 2020 18:59:22 +0100
Subject: [PATCH 114/149] data/spdx.json: update

---
 Library/Homebrew/data/spdx.json | 992 ++++++++++++++++++--------------
 1 file changed, 574 insertions(+), 418 deletions(-)

diff --git a/Library/Homebrew/data/spdx.json b/Library/Homebrew/data/spdx.json
index 530b2796f1..2cf9e3f864 100644
--- a/Library/Homebrew/data/spdx.json
+++ b/Library/Homebrew/data/spdx.json
@@ -1,11 +1,11 @@
 {
-  "licenseListVersion": "3.9-4-g1a3102c",
+  "licenseListVersion": "3.9-10-gb19922e",
   "licenses": [
     {
       "reference": "./0BSD.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/0BSD.json",
-      "referenceNumber": "239",
+      "referenceNumber": "247",
       "name": "BSD Zero Clause License",
       "licenseId": "0BSD",
       "seeAlso": [
@@ -17,7 +17,7 @@
       "reference": "./AAL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/AAL.json",
-      "referenceNumber": "60",
+      "referenceNumber": "61",
       "name": "Attribution Assurance License",
       "licenseId": "AAL",
       "seeAlso": [
@@ -29,7 +29,7 @@
       "reference": "./ADSL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ADSL.json",
-      "referenceNumber": "217",
+      "referenceNumber": "225",
       "name": "Amazon Digital Services License",
       "licenseId": "ADSL",
       "seeAlso": [
@@ -42,7 +42,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AFL-1.1.json",
-      "referenceNumber": "28",
+      "referenceNumber": "29",
       "name": "Academic Free License v1.1",
       "licenseId": "AFL-1.1",
       "seeAlso": [
@@ -56,7 +56,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AFL-1.2.json",
-      "referenceNumber": "222",
+      "referenceNumber": "230",
       "name": "Academic Free License v1.2",
       "licenseId": "AFL-1.2",
       "seeAlso": [
@@ -70,7 +70,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AFL-2.0.json",
-      "referenceNumber": "341",
+      "referenceNumber": "352",
       "name": "Academic Free License v2.0",
       "licenseId": "AFL-2.0",
       "seeAlso": [
@@ -83,7 +83,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AFL-2.1.json",
-      "referenceNumber": "249",
+      "referenceNumber": "258",
       "name": "Academic Free License v2.1",
       "licenseId": "AFL-2.1",
       "seeAlso": [
@@ -96,7 +96,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AFL-3.0.json",
-      "referenceNumber": "361",
+      "referenceNumber": "373",
       "name": "Academic Free License v3.0",
       "licenseId": "AFL-3.0",
       "seeAlso": [
@@ -110,7 +110,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AGPL-1.0.json",
-      "referenceNumber": "175",
+      "referenceNumber": "178",
       "name": "Affero General Public License v1.0",
       "licenseId": "AGPL-1.0",
       "seeAlso": [
@@ -122,7 +122,7 @@
       "reference": "./AGPL-1.0-only.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/AGPL-1.0-only.json",
-      "referenceNumber": "71",
+      "referenceNumber": "72",
       "name": "Affero General Public License v1.0 only",
       "licenseId": "AGPL-1.0-only",
       "seeAlso": [
@@ -134,7 +134,7 @@
       "reference": "./AGPL-1.0-or-later.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/AGPL-1.0-or-later.json",
-      "referenceNumber": "168",
+      "referenceNumber": "171",
       "name": "Affero General Public License v1.0 or later",
       "licenseId": "AGPL-1.0-or-later",
       "seeAlso": [
@@ -147,7 +147,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AGPL-3.0.json",
-      "referenceNumber": "148",
+      "referenceNumber": "150",
       "name": "GNU Affero General Public License v3.0",
       "licenseId": "AGPL-3.0",
       "seeAlso": [
@@ -161,7 +161,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AGPL-3.0-only.json",
-      "referenceNumber": "298",
+      "referenceNumber": "307",
       "name": "GNU Affero General Public License v3.0 only",
       "licenseId": "AGPL-3.0-only",
       "seeAlso": [
@@ -175,7 +175,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/AGPL-3.0-or-later.json",
-      "referenceNumber": "160",
+      "referenceNumber": "162",
       "name": "GNU Affero General Public License v3.0 or later",
       "licenseId": "AGPL-3.0-or-later",
       "seeAlso": [
@@ -188,7 +188,7 @@
       "reference": "./AMDPLPA.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/AMDPLPA.json",
-      "referenceNumber": "133",
+      "referenceNumber": "135",
       "name": "AMD\u0027s plpa_map.c License",
       "licenseId": "AMDPLPA",
       "seeAlso": [
@@ -200,7 +200,7 @@
       "reference": "./AML.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/AML.json",
-      "referenceNumber": "157",
+      "referenceNumber": "159",
       "name": "Apple MIT License",
       "licenseId": "AML",
       "seeAlso": [
@@ -212,7 +212,7 @@
       "reference": "./AMPAS.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/AMPAS.json",
-      "referenceNumber": "136",
+      "referenceNumber": "138",
       "name": "Academy of Motion Picture Arts and Sciences BSD",
       "licenseId": "AMPAS",
       "seeAlso": [
@@ -224,7 +224,7 @@
       "reference": "./ANTLR-PD.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ANTLR-PD.json",
-      "referenceNumber": "44",
+      "referenceNumber": "45",
       "name": "ANTLR Software Rights Notice",
       "licenseId": "ANTLR-PD",
       "seeAlso": [
@@ -236,7 +236,7 @@
       "reference": "./APAFML.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/APAFML.json",
-      "referenceNumber": "248",
+      "referenceNumber": "257",
       "name": "Adobe Postscript AFM License",
       "licenseId": "APAFML",
       "seeAlso": [
@@ -248,7 +248,7 @@
       "reference": "./APL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/APL-1.0.json",
-      "referenceNumber": "278",
+      "referenceNumber": "287",
       "name": "Adaptive Public License 1.0",
       "licenseId": "APL-1.0",
       "seeAlso": [
@@ -260,7 +260,7 @@
       "reference": "./APSL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/APSL-1.0.json",
-      "referenceNumber": "387",
+      "referenceNumber": "399",
       "name": "Apple Public Source License 1.0",
       "licenseId": "APSL-1.0",
       "seeAlso": [
@@ -272,7 +272,7 @@
       "reference": "./APSL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/APSL-1.1.json",
-      "referenceNumber": "338",
+      "referenceNumber": "349",
       "name": "Apple Public Source License 1.1",
       "licenseId": "APSL-1.1",
       "seeAlso": [
@@ -284,7 +284,7 @@
       "reference": "./APSL-1.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/APSL-1.2.json",
-      "referenceNumber": "201",
+      "referenceNumber": "209",
       "name": "Apple Public Source License 1.2",
       "licenseId": "APSL-1.2",
       "seeAlso": [
@@ -297,7 +297,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/APSL-2.0.json",
-      "referenceNumber": "141",
+      "referenceNumber": "143",
       "name": "Apple Public Source License 2.0",
       "licenseId": "APSL-2.0",
       "seeAlso": [
@@ -309,7 +309,7 @@
       "reference": "./Abstyles.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Abstyles.json",
-      "referenceNumber": "75",
+      "referenceNumber": "76",
       "name": "Abstyles License",
       "licenseId": "Abstyles",
       "seeAlso": [
@@ -321,7 +321,7 @@
       "reference": "./Adobe-2006.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Adobe-2006.json",
-      "referenceNumber": "310",
+      "referenceNumber": "321",
       "name": "Adobe Systems Incorporated Source Code License Agreement",
       "licenseId": "Adobe-2006",
       "seeAlso": [
@@ -333,7 +333,7 @@
       "reference": "./Adobe-Glyph.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Adobe-Glyph.json",
-      "referenceNumber": "343",
+      "referenceNumber": "354",
       "name": "Adobe Glyph List License",
       "licenseId": "Adobe-Glyph",
       "seeAlso": [
@@ -345,7 +345,7 @@
       "reference": "./Afmparse.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Afmparse.json",
-      "referenceNumber": "332",
+      "referenceNumber": "343",
       "name": "Afmparse License",
       "licenseId": "Afmparse",
       "seeAlso": [
@@ -357,7 +357,7 @@
       "reference": "./Aladdin.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Aladdin.json",
-      "referenceNumber": "315",
+      "referenceNumber": "326",
       "name": "Aladdin Free Public License",
       "licenseId": "Aladdin",
       "seeAlso": [
@@ -370,7 +370,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Apache-1.0.json",
-      "referenceNumber": "32",
+      "referenceNumber": "33",
       "name": "Apache License 1.0",
       "licenseId": "Apache-1.0",
       "seeAlso": [
@@ -383,7 +383,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Apache-1.1.json",
-      "referenceNumber": "274",
+      "referenceNumber": "283",
       "name": "Apache License 1.1",
       "licenseId": "Apache-1.1",
       "seeAlso": [
@@ -397,7 +397,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Apache-2.0.json",
-      "referenceNumber": "366",
+      "referenceNumber": "378",
       "name": "Apache License 2.0",
       "licenseId": "Apache-2.0",
       "seeAlso": [
@@ -410,7 +410,7 @@
       "reference": "./Artistic-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Artistic-1.0.json",
-      "referenceNumber": "273",
+      "referenceNumber": "282",
       "name": "Artistic License 1.0",
       "licenseId": "Artistic-1.0",
       "seeAlso": [
@@ -422,7 +422,7 @@
       "reference": "./Artistic-1.0-Perl.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Artistic-1.0-Perl.json",
-      "referenceNumber": "306",
+      "referenceNumber": "316",
       "name": "Artistic License 1.0 (Perl)",
       "licenseId": "Artistic-1.0-Perl",
       "seeAlso": [
@@ -434,7 +434,7 @@
       "reference": "./Artistic-1.0-cl8.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Artistic-1.0-cl8.json",
-      "referenceNumber": "229",
+      "referenceNumber": "237",
       "name": "Artistic License 1.0 w/clause 8",
       "licenseId": "Artistic-1.0-cl8",
       "seeAlso": [
@@ -447,7 +447,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Artistic-2.0.json",
-      "referenceNumber": "78",
+      "referenceNumber": "79",
       "name": "Artistic License 2.0",
       "licenseId": "Artistic-2.0",
       "seeAlso": [
@@ -460,7 +460,7 @@
       "reference": "./BSD-1-Clause.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-1-Clause.json",
-      "referenceNumber": "389",
+      "referenceNumber": "401",
       "name": "BSD 1-Clause License",
       "licenseId": "BSD-1-Clause",
       "seeAlso": [
@@ -472,7 +472,7 @@
       "reference": "./BSD-2-Clause.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause.json",
-      "referenceNumber": "307",
+      "referenceNumber": "317",
       "name": "BSD 2-Clause \"Simplified\" License",
       "licenseId": "BSD-2-Clause",
       "seeAlso": [
@@ -485,7 +485,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause-FreeBSD.json",
-      "referenceNumber": "281",
+      "referenceNumber": "290",
       "name": "BSD 2-Clause FreeBSD License",
       "licenseId": "BSD-2-Clause-FreeBSD",
       "seeAlso": [
@@ -497,7 +497,7 @@
       "reference": "./BSD-2-Clause-NetBSD.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause-NetBSD.json",
-      "referenceNumber": "186",
+      "referenceNumber": "191",
       "name": "BSD 2-Clause NetBSD License",
       "licenseId": "BSD-2-Clause-NetBSD",
       "seeAlso": [
@@ -509,7 +509,7 @@
       "reference": "./BSD-2-Clause-Patent.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-2-Clause-Patent.json",
-      "referenceNumber": "362",
+      "referenceNumber": "374",
       "name": "BSD-2-Clause Plus Patent License",
       "licenseId": "BSD-2-Clause-Patent",
       "seeAlso": [
@@ -522,7 +522,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause.json",
-      "referenceNumber": "202",
+      "referenceNumber": "210",
       "name": "BSD 3-Clause \"New\" or \"Revised\" License",
       "licenseId": "BSD-3-Clause",
       "seeAlso": [
@@ -534,7 +534,7 @@
       "reference": "./BSD-3-Clause-Attribution.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-Attribution.json",
-      "referenceNumber": "39",
+      "referenceNumber": "40",
       "name": "BSD with attribution",
       "licenseId": "BSD-3-Clause-Attribution",
       "seeAlso": [
@@ -547,7 +547,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-Clear.json",
-      "referenceNumber": "88",
+      "referenceNumber": "90",
       "name": "BSD 3-Clause Clear License",
       "licenseId": "BSD-3-Clause-Clear",
       "seeAlso": [
@@ -559,7 +559,7 @@
       "reference": "./BSD-3-Clause-LBNL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-LBNL.json",
-      "referenceNumber": "147",
+      "referenceNumber": "149",
       "name": "Lawrence Berkeley National Labs BSD variant license",
       "licenseId": "BSD-3-Clause-LBNL",
       "seeAlso": [
@@ -571,7 +571,7 @@
       "reference": "./BSD-3-Clause-No-Nuclear-License.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json",
-      "referenceNumber": "62",
+      "referenceNumber": "63",
       "name": "BSD 3-Clause No Nuclear License",
       "licenseId": "BSD-3-Clause-No-Nuclear-License",
       "seeAlso": [
@@ -583,7 +583,7 @@
       "reference": "./BSD-3-Clause-No-Nuclear-License-2014.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json",
-      "referenceNumber": "342",
+      "referenceNumber": "353",
       "name": "BSD 3-Clause No Nuclear License 2014",
       "licenseId": "BSD-3-Clause-No-Nuclear-License-2014",
       "seeAlso": [
@@ -595,7 +595,7 @@
       "reference": "./BSD-3-Clause-No-Nuclear-Warranty.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json",
-      "referenceNumber": "117",
+      "referenceNumber": "119",
       "name": "BSD 3-Clause No Nuclear Warranty",
       "licenseId": "BSD-3-Clause-No-Nuclear-Warranty",
       "seeAlso": [
@@ -607,7 +607,7 @@
       "reference": "./BSD-3-Clause-Open-MPI.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-3-Clause-Open-MPI.json",
-      "referenceNumber": "214",
+      "referenceNumber": "222",
       "name": "BSD 3-Clause Open MPI variant",
       "licenseId": "BSD-3-Clause-Open-MPI",
       "seeAlso": [
@@ -621,7 +621,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/BSD-4-Clause.json",
-      "referenceNumber": "69",
+      "referenceNumber": "70",
       "name": "BSD 4-Clause \"Original\" or \"Old\" License",
       "licenseId": "BSD-4-Clause",
       "seeAlso": [
@@ -633,7 +633,7 @@
       "reference": "./BSD-4-Clause-UC.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-4-Clause-UC.json",
-      "referenceNumber": "372",
+      "referenceNumber": "384",
       "name": "BSD-4-Clause (University of California-Specific)",
       "licenseId": "BSD-4-Clause-UC",
       "seeAlso": [
@@ -645,7 +645,7 @@
       "reference": "./BSD-Protection.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-Protection.json",
-      "referenceNumber": "400",
+      "referenceNumber": "412",
       "name": "BSD Protection License",
       "licenseId": "BSD-Protection",
       "seeAlso": [
@@ -657,7 +657,7 @@
       "reference": "./BSD-Source-Code.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BSD-Source-Code.json",
-      "referenceNumber": "169",
+      "referenceNumber": "172",
       "name": "BSD Source Code Attribution",
       "licenseId": "BSD-Source-Code",
       "seeAlso": [
@@ -670,7 +670,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/BSL-1.0.json",
-      "referenceNumber": "295",
+      "referenceNumber": "304",
       "name": "Boost Software License 1.0",
       "licenseId": "BSL-1.0",
       "seeAlso": [
@@ -683,7 +683,7 @@
       "reference": "./Bahyph.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Bahyph.json",
-      "referenceNumber": "151",
+      "referenceNumber": "153",
       "name": "Bahyph License",
       "licenseId": "Bahyph",
       "seeAlso": [
@@ -695,7 +695,7 @@
       "reference": "./Barr.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Barr.json",
-      "referenceNumber": "128",
+      "referenceNumber": "130",
       "name": "Barr License",
       "licenseId": "Barr",
       "seeAlso": [
@@ -707,7 +707,7 @@
       "reference": "./Beerware.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Beerware.json",
-      "referenceNumber": "251",
+      "referenceNumber": "260",
       "name": "Beerware License",
       "licenseId": "Beerware",
       "seeAlso": [
@@ -720,7 +720,7 @@
       "reference": "./BitTorrent-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BitTorrent-1.0.json",
-      "referenceNumber": "207",
+      "referenceNumber": "215",
       "name": "BitTorrent Open Source License v1.0",
       "licenseId": "BitTorrent-1.0",
       "seeAlso": [
@@ -733,7 +733,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/BitTorrent-1.1.json",
-      "referenceNumber": "188",
+      "referenceNumber": "194",
       "name": "BitTorrent Open Source License v1.1",
       "licenseId": "BitTorrent-1.1",
       "seeAlso": [
@@ -745,7 +745,7 @@
       "reference": "./BlueOak-1.0.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/BlueOak-1.0.0.json",
-      "referenceNumber": "211",
+      "referenceNumber": "219",
       "name": "Blue Oak Model License 1.0.0",
       "licenseId": "BlueOak-1.0.0",
       "seeAlso": [
@@ -757,7 +757,7 @@
       "reference": "./Borceux.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Borceux.json",
-      "referenceNumber": "305",
+      "referenceNumber": "315",
       "name": "Borceux license",
       "licenseId": "Borceux",
       "seeAlso": [
@@ -769,7 +769,7 @@
       "reference": "./CAL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CAL-1.0.json",
-      "referenceNumber": "59",
+      "referenceNumber": "60",
       "name": "Cryptographic Autonomy License 1.0",
       "licenseId": "CAL-1.0",
       "seeAlso": [
@@ -782,7 +782,7 @@
       "reference": "./CAL-1.0-Combined-Work-Exception.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json",
-      "referenceNumber": "80",
+      "referenceNumber": "81",
       "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)",
       "licenseId": "CAL-1.0-Combined-Work-Exception",
       "seeAlso": [
@@ -795,7 +795,7 @@
       "reference": "./CATOSL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CATOSL-1.1.json",
-      "referenceNumber": "234",
+      "referenceNumber": "242",
       "name": "Computer Associates Trusted Open Source License 1.1",
       "licenseId": "CATOSL-1.1",
       "seeAlso": [
@@ -807,7 +807,7 @@
       "reference": "./CC-BY-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-1.0.json",
-      "referenceNumber": "23",
+      "referenceNumber": "24",
       "name": "Creative Commons Attribution 1.0 Generic",
       "licenseId": "CC-BY-1.0",
       "seeAlso": [
@@ -819,7 +819,7 @@
       "reference": "./CC-BY-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-2.0.json",
-      "referenceNumber": "61",
+      "referenceNumber": "62",
       "name": "Creative Commons Attribution 2.0 Generic",
       "licenseId": "CC-BY-2.0",
       "seeAlso": [
@@ -831,7 +831,7 @@
       "reference": "./CC-BY-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-2.5.json",
-      "referenceNumber": "187",
+      "referenceNumber": "192",
       "name": "Creative Commons Attribution 2.5 Generic",
       "licenseId": "CC-BY-2.5",
       "seeAlso": [
@@ -843,7 +843,7 @@
       "reference": "./CC-BY-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-3.0.json",
-      "referenceNumber": "344",
+      "referenceNumber": "355",
       "name": "Creative Commons Attribution 3.0 Unported",
       "licenseId": "CC-BY-3.0",
       "seeAlso": [
@@ -856,7 +856,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-4.0.json",
-      "referenceNumber": "218",
+      "referenceNumber": "226",
       "name": "Creative Commons Attribution 4.0 International",
       "licenseId": "CC-BY-4.0",
       "seeAlso": [
@@ -868,7 +868,7 @@
       "reference": "./CC-BY-NC-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-1.0.json",
-      "referenceNumber": "231",
+      "referenceNumber": "239",
       "name": "Creative Commons Attribution Non Commercial 1.0 Generic",
       "licenseId": "CC-BY-NC-1.0",
       "seeAlso": [
@@ -880,7 +880,7 @@
       "reference": "./CC-BY-NC-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-2.0.json",
-      "referenceNumber": "326",
+      "referenceNumber": "337",
       "name": "Creative Commons Attribution Non Commercial 2.0 Generic",
       "licenseId": "CC-BY-NC-2.0",
       "seeAlso": [
@@ -892,7 +892,7 @@
       "reference": "./CC-BY-NC-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-2.5.json",
-      "referenceNumber": "398",
+      "referenceNumber": "410",
       "name": "Creative Commons Attribution Non Commercial 2.5 Generic",
       "licenseId": "CC-BY-NC-2.5",
       "seeAlso": [
@@ -904,7 +904,7 @@
       "reference": "./CC-BY-NC-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-3.0.json",
-      "referenceNumber": "336",
+      "referenceNumber": "347",
       "name": "Creative Commons Attribution Non Commercial 3.0 Unported",
       "licenseId": "CC-BY-NC-3.0",
       "seeAlso": [
@@ -916,7 +916,7 @@
       "reference": "./CC-BY-NC-4.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-4.0.json",
-      "referenceNumber": "272",
+      "referenceNumber": "281",
       "name": "Creative Commons Attribution Non Commercial 4.0 International",
       "licenseId": "CC-BY-NC-4.0",
       "seeAlso": [
@@ -928,7 +928,7 @@
       "reference": "./CC-BY-NC-ND-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-1.0.json",
-      "referenceNumber": "102",
+      "referenceNumber": "104",
       "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic",
       "licenseId": "CC-BY-NC-ND-1.0",
       "seeAlso": [
@@ -940,7 +940,7 @@
       "reference": "./CC-BY-NC-ND-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-2.0.json",
-      "referenceNumber": "138",
+      "referenceNumber": "140",
       "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic",
       "licenseId": "CC-BY-NC-ND-2.0",
       "seeAlso": [
@@ -952,7 +952,7 @@
       "reference": "./CC-BY-NC-ND-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-2.5.json",
-      "referenceNumber": "30",
+      "referenceNumber": "31",
       "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic",
       "licenseId": "CC-BY-NC-ND-2.5",
       "seeAlso": [
@@ -964,7 +964,7 @@
       "reference": "./CC-BY-NC-ND-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-3.0.json",
-      "referenceNumber": "41",
+      "referenceNumber": "42",
       "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported",
       "licenseId": "CC-BY-NC-ND-3.0",
       "seeAlso": [
@@ -976,7 +976,7 @@
       "reference": "./CC-BY-NC-ND-4.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-ND-4.0.json",
-      "referenceNumber": "172",
+      "referenceNumber": "175",
       "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International",
       "licenseId": "CC-BY-NC-ND-4.0",
       "seeAlso": [
@@ -988,7 +988,7 @@
       "reference": "./CC-BY-NC-SA-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-1.0.json",
-      "referenceNumber": "120",
+      "referenceNumber": "122",
       "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic",
       "licenseId": "CC-BY-NC-SA-1.0",
       "seeAlso": [
@@ -1000,7 +1000,7 @@
       "reference": "./CC-BY-NC-SA-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-2.0.json",
-      "referenceNumber": "411",
+      "referenceNumber": "424",
       "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic",
       "licenseId": "CC-BY-NC-SA-2.0",
       "seeAlso": [
@@ -1012,7 +1012,7 @@
       "reference": "./CC-BY-NC-SA-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-2.5.json",
-      "referenceNumber": "215",
+      "referenceNumber": "223",
       "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic",
       "licenseId": "CC-BY-NC-SA-2.5",
       "seeAlso": [
@@ -1024,7 +1024,7 @@
       "reference": "./CC-BY-NC-SA-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-3.0.json",
-      "referenceNumber": "360",
+      "referenceNumber": "372",
       "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported",
       "licenseId": "CC-BY-NC-SA-3.0",
       "seeAlso": [
@@ -1036,7 +1036,7 @@
       "reference": "./CC-BY-NC-SA-4.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-NC-SA-4.0.json",
-      "referenceNumber": "331",
+      "referenceNumber": "342",
       "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International",
       "licenseId": "CC-BY-NC-SA-4.0",
       "seeAlso": [
@@ -1048,7 +1048,7 @@
       "reference": "./CC-BY-ND-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-1.0.json",
-      "referenceNumber": "94",
+      "referenceNumber": "96",
       "name": "Creative Commons Attribution No Derivatives 1.0 Generic",
       "licenseId": "CC-BY-ND-1.0",
       "seeAlso": [
@@ -1060,7 +1060,7 @@
       "reference": "./CC-BY-ND-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-2.0.json",
-      "referenceNumber": "46",
+      "referenceNumber": "47",
       "name": "Creative Commons Attribution No Derivatives 2.0 Generic",
       "licenseId": "CC-BY-ND-2.0",
       "seeAlso": [
@@ -1072,7 +1072,7 @@
       "reference": "./CC-BY-ND-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-2.5.json",
-      "referenceNumber": "27",
+      "referenceNumber": "28",
       "name": "Creative Commons Attribution No Derivatives 2.5 Generic",
       "licenseId": "CC-BY-ND-2.5",
       "seeAlso": [
@@ -1084,7 +1084,7 @@
       "reference": "./CC-BY-ND-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-3.0.json",
-      "referenceNumber": "284",
+      "referenceNumber": "293",
       "name": "Creative Commons Attribution No Derivatives 3.0 Unported",
       "licenseId": "CC-BY-ND-3.0",
       "seeAlso": [
@@ -1096,7 +1096,7 @@
       "reference": "./CC-BY-ND-4.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-ND-4.0.json",
-      "referenceNumber": "318",
+      "referenceNumber": "329",
       "name": "Creative Commons Attribution No Derivatives 4.0 International",
       "licenseId": "CC-BY-ND-4.0",
       "seeAlso": [
@@ -1108,7 +1108,7 @@
       "reference": "./CC-BY-SA-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-1.0.json",
-      "referenceNumber": "403",
+      "referenceNumber": "415",
       "name": "Creative Commons Attribution Share Alike 1.0 Generic",
       "licenseId": "CC-BY-SA-1.0",
       "seeAlso": [
@@ -1120,7 +1120,7 @@
       "reference": "./CC-BY-SA-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-2.0.json",
-      "referenceNumber": "367",
+      "referenceNumber": "379",
       "name": "Creative Commons Attribution Share Alike 2.0 Generic",
       "licenseId": "CC-BY-SA-2.0",
       "seeAlso": [
@@ -1132,7 +1132,7 @@
       "reference": "./CC-BY-SA-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-2.5.json",
-      "referenceNumber": "203",
+      "referenceNumber": "211",
       "name": "Creative Commons Attribution Share Alike 2.5 Generic",
       "licenseId": "CC-BY-SA-2.5",
       "seeAlso": [
@@ -1144,7 +1144,7 @@
       "reference": "./CC-BY-SA-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-3.0.json",
-      "referenceNumber": "233",
+      "referenceNumber": "241",
       "name": "Creative Commons Attribution Share Alike 3.0 Unported",
       "licenseId": "CC-BY-SA-3.0",
       "seeAlso": [
@@ -1157,7 +1157,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CC-BY-SA-4.0.json",
-      "referenceNumber": "297",
+      "referenceNumber": "306",
       "name": "Creative Commons Attribution Share Alike 4.0 International",
       "licenseId": "CC-BY-SA-4.0",
       "seeAlso": [
@@ -1169,7 +1169,7 @@
       "reference": "./CC-PDDC.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CC-PDDC.json",
-      "referenceNumber": "92",
+      "referenceNumber": "94",
       "name": "Creative Commons Public Domain Dedication and Certification",
       "licenseId": "CC-PDDC",
       "seeAlso": [
@@ -1182,7 +1182,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CC0-1.0.json",
-      "referenceNumber": "66",
+      "referenceNumber": "67",
       "name": "Creative Commons Zero v1.0 Universal",
       "licenseId": "CC0-1.0",
       "seeAlso": [
@@ -1195,7 +1195,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CDDL-1.0.json",
-      "referenceNumber": "335",
+      "referenceNumber": "346",
       "name": "Common Development and Distribution License 1.0",
       "licenseId": "CDDL-1.0",
       "seeAlso": [
@@ -1207,7 +1207,7 @@
       "reference": "./CDDL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CDDL-1.1.json",
-      "referenceNumber": "283",
+      "referenceNumber": "292",
       "name": "Common Development and Distribution License 1.1",
       "licenseId": "CDDL-1.1",
       "seeAlso": [
@@ -1220,7 +1220,7 @@
       "reference": "./CDLA-Permissive-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CDLA-Permissive-1.0.json",
-      "referenceNumber": "108",
+      "referenceNumber": "110",
       "name": "Community Data License Agreement Permissive 1.0",
       "licenseId": "CDLA-Permissive-1.0",
       "seeAlso": [
@@ -1232,7 +1232,7 @@
       "reference": "./CDLA-Sharing-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CDLA-Sharing-1.0.json",
-      "referenceNumber": "178",
+      "referenceNumber": "182",
       "name": "Community Data License Agreement Sharing 1.0",
       "licenseId": "CDLA-Sharing-1.0",
       "seeAlso": [
@@ -1244,7 +1244,7 @@
       "reference": "./CECILL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CECILL-1.0.json",
-      "referenceNumber": "10",
+      "referenceNumber": "11",
       "name": "CeCILL Free Software License Agreement v1.0",
       "licenseId": "CECILL-1.0",
       "seeAlso": [
@@ -1256,7 +1256,7 @@
       "reference": "./CECILL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CECILL-1.1.json",
-      "referenceNumber": "135",
+      "referenceNumber": "137",
       "name": "CeCILL Free Software License Agreement v1.1",
       "licenseId": "CECILL-1.1",
       "seeAlso": [
@@ -1281,7 +1281,7 @@
       "reference": "./CECILL-2.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CECILL-2.1.json",
-      "referenceNumber": "145",
+      "referenceNumber": "147",
       "name": "CeCILL Free Software License Agreement v2.1",
       "licenseId": "CECILL-2.1",
       "seeAlso": [
@@ -1294,7 +1294,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CECILL-B.json",
-      "referenceNumber": "93",
+      "referenceNumber": "95",
       "name": "CeCILL-B Free Software License Agreement",
       "licenseId": "CECILL-B",
       "seeAlso": [
@@ -1307,7 +1307,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CECILL-C.json",
-      "referenceNumber": "240",
+      "referenceNumber": "248",
       "name": "CeCILL-C Free Software License Agreement",
       "licenseId": "CECILL-C",
       "seeAlso": [
@@ -1319,7 +1319,7 @@
       "reference": "./CERN-OHL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CERN-OHL-1.1.json",
-      "referenceNumber": "123",
+      "referenceNumber": "125",
       "name": "CERN Open Hardware Licence v1.1",
       "licenseId": "CERN-OHL-1.1",
       "seeAlso": [
@@ -1331,7 +1331,7 @@
       "reference": "./CERN-OHL-1.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CERN-OHL-1.2.json",
-      "referenceNumber": "167",
+      "referenceNumber": "170",
       "name": "CERN Open Hardware Licence v1.2",
       "licenseId": "CERN-OHL-1.2",
       "seeAlso": [
@@ -1343,7 +1343,7 @@
       "reference": "./CERN-OHL-P-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CERN-OHL-P-2.0.json",
-      "referenceNumber": "255",
+      "referenceNumber": "264",
       "name": "CERN Open Hardware Licence Version 2 - Permissive",
       "licenseId": "CERN-OHL-P-2.0",
       "seeAlso": [
@@ -1355,7 +1355,7 @@
       "reference": "./CERN-OHL-S-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CERN-OHL-S-2.0.json",
-      "referenceNumber": "47",
+      "referenceNumber": "48",
       "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal",
       "licenseId": "CERN-OHL-S-2.0",
       "seeAlso": [
@@ -1367,7 +1367,7 @@
       "reference": "./CERN-OHL-W-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CERN-OHL-W-2.0.json",
-      "referenceNumber": "267",
+      "referenceNumber": "276",
       "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal",
       "licenseId": "CERN-OHL-W-2.0",
       "seeAlso": [
@@ -1379,7 +1379,7 @@
       "reference": "./CNRI-Jython.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CNRI-Jython.json",
-      "referenceNumber": "77",
+      "referenceNumber": "78",
       "name": "CNRI Jython License",
       "licenseId": "CNRI-Jython",
       "seeAlso": [
@@ -1391,7 +1391,7 @@
       "reference": "./CNRI-Python.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CNRI-Python.json",
-      "referenceNumber": "96",
+      "referenceNumber": "98",
       "name": "CNRI Python License",
       "licenseId": "CNRI-Python",
       "seeAlso": [
@@ -1403,7 +1403,7 @@
       "reference": "./CNRI-Python-GPL-Compatible.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CNRI-Python-GPL-Compatible.json",
-      "referenceNumber": "348",
+      "referenceNumber": "359",
       "name": "CNRI Python Open Source GPL Compatible License Agreement",
       "licenseId": "CNRI-Python-GPL-Compatible",
       "seeAlso": [
@@ -1416,7 +1416,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CPAL-1.0.json",
-      "referenceNumber": "285",
+      "referenceNumber": "294",
       "name": "Common Public Attribution License 1.0",
       "licenseId": "CPAL-1.0",
       "seeAlso": [
@@ -1429,7 +1429,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/CPL-1.0.json",
-      "referenceNumber": "236",
+      "referenceNumber": "244",
       "name": "Common Public License 1.0",
       "licenseId": "CPL-1.0",
       "seeAlso": [
@@ -1441,7 +1441,7 @@
       "reference": "./CPOL-1.02.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CPOL-1.02.json",
-      "referenceNumber": "230",
+      "referenceNumber": "238",
       "name": "Code Project Open License 1.02",
       "licenseId": "CPOL-1.02",
       "seeAlso": [
@@ -1453,7 +1453,7 @@
       "reference": "./CUA-OPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CUA-OPL-1.0.json",
-      "referenceNumber": "165",
+      "referenceNumber": "168",
       "name": "CUA Office Public License v1.0",
       "licenseId": "CUA-OPL-1.0",
       "seeAlso": [
@@ -1465,7 +1465,7 @@
       "reference": "./Caldera.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Caldera.json",
-      "referenceNumber": "250",
+      "referenceNumber": "259",
       "name": "Caldera License",
       "licenseId": "Caldera",
       "seeAlso": [
@@ -1478,7 +1478,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/ClArtistic.json",
-      "referenceNumber": "245",
+      "referenceNumber": "254",
       "name": "Clarified Artistic License",
       "licenseId": "ClArtistic",
       "seeAlso": [
@@ -1492,7 +1492,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Condor-1.1.json",
-      "referenceNumber": "150",
+      "referenceNumber": "152",
       "name": "Condor Public License v1.1",
       "licenseId": "Condor-1.1",
       "seeAlso": [
@@ -1505,7 +1505,7 @@
       "reference": "./Crossword.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Crossword.json",
-      "referenceNumber": "101",
+      "referenceNumber": "103",
       "name": "Crossword License",
       "licenseId": "Crossword",
       "seeAlso": [
@@ -1517,7 +1517,7 @@
       "reference": "./CrystalStacker.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/CrystalStacker.json",
-      "referenceNumber": "38",
+      "referenceNumber": "39",
       "name": "CrystalStacker License",
       "licenseId": "CrystalStacker",
       "seeAlso": [
@@ -1529,7 +1529,7 @@
       "reference": "./Cube.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Cube.json",
-      "referenceNumber": "391",
+      "referenceNumber": "403",
       "name": "Cube License",
       "licenseId": "Cube",
       "seeAlso": [
@@ -1541,7 +1541,7 @@
       "reference": "./D-FSL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/D-FSL-1.0.json",
-      "referenceNumber": "358",
+      "referenceNumber": "369",
       "name": "Deutsche Freie Software Lizenz",
       "licenseId": "D-FSL-1.0",
       "seeAlso": [
@@ -1560,7 +1560,7 @@
       "reference": "./DOC.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/DOC.json",
-      "referenceNumber": "275",
+      "referenceNumber": "284",
       "name": "DOC License",
       "licenseId": "DOC",
       "seeAlso": [
@@ -1572,7 +1572,7 @@
       "reference": "./DSDP.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/DSDP.json",
-      "referenceNumber": "266",
+      "referenceNumber": "275",
       "name": "DSDP License",
       "licenseId": "DSDP",
       "seeAlso": [
@@ -1584,7 +1584,7 @@
       "reference": "./Dotseqn.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Dotseqn.json",
-      "referenceNumber": "33",
+      "referenceNumber": "34",
       "name": "Dotseqn License",
       "licenseId": "Dotseqn",
       "seeAlso": [
@@ -1596,7 +1596,7 @@
       "reference": "./ECL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ECL-1.0.json",
-      "referenceNumber": "418",
+      "referenceNumber": "431",
       "name": "Educational Community License v1.0",
       "licenseId": "ECL-1.0",
       "seeAlso": [
@@ -1621,7 +1621,7 @@
       "reference": "./EFL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/EFL-1.0.json",
-      "referenceNumber": "76",
+      "referenceNumber": "77",
       "name": "Eiffel Forum License v1.0",
       "licenseId": "EFL-1.0",
       "seeAlso": [
@@ -1635,7 +1635,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/EFL-2.0.json",
-      "referenceNumber": "7",
+      "referenceNumber": "8",
       "name": "Eiffel Forum License v2.0",
       "licenseId": "EFL-2.0",
       "seeAlso": [
@@ -1644,12 +1644,24 @@
       ],
       "isOsiApproved": true
     },
+    {
+      "reference": "./EPICS.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/EPICS.json",
+      "referenceNumber": "370",
+      "name": "EPICS Open License",
+      "licenseId": "EPICS",
+      "seeAlso": [
+        "https://epics.anl.gov/license/open.php"
+      ],
+      "isOsiApproved": false
+    },
     {
       "reference": "./EPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/EPL-1.0.json",
-      "referenceNumber": "277",
+      "referenceNumber": "286",
       "name": "Eclipse Public License 1.0",
       "licenseId": "EPL-1.0",
       "seeAlso": [
@@ -1663,7 +1675,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/EPL-2.0.json",
-      "referenceNumber": "416",
+      "referenceNumber": "429",
       "name": "Eclipse Public License 2.0",
       "licenseId": "EPL-2.0",
       "seeAlso": [
@@ -1677,7 +1689,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/EUDatagrid.json",
-      "referenceNumber": "263",
+      "referenceNumber": "272",
       "name": "EU DataGrid Software License",
       "licenseId": "EUDatagrid",
       "seeAlso": [
@@ -1690,7 +1702,7 @@
       "reference": "./EUPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/EUPL-1.0.json",
-      "referenceNumber": "98",
+      "referenceNumber": "100",
       "name": "European Union Public License 1.0",
       "licenseId": "EUPL-1.0",
       "seeAlso": [
@@ -1704,7 +1716,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/EUPL-1.1.json",
-      "referenceNumber": "409",
+      "referenceNumber": "422",
       "name": "European Union Public License 1.1",
       "licenseId": "EUPL-1.1",
       "seeAlso": [
@@ -1719,7 +1731,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/EUPL-1.2.json",
-      "referenceNumber": "271",
+      "referenceNumber": "280",
       "name": "European Union Public License 1.2",
       "licenseId": "EUPL-1.2",
       "seeAlso": [
@@ -1735,7 +1747,7 @@
       "reference": "./Entessa.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Entessa.json",
-      "referenceNumber": "386",
+      "referenceNumber": "398",
       "name": "Entessa Public License v1.0",
       "licenseId": "Entessa",
       "seeAlso": [
@@ -1747,7 +1759,7 @@
       "reference": "./ErlPL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ErlPL-1.1.json",
-      "referenceNumber": "408",
+      "referenceNumber": "420",
       "name": "Erlang Public License v1.1",
       "licenseId": "ErlPL-1.1",
       "seeAlso": [
@@ -1759,7 +1771,7 @@
       "reference": "./Eurosym.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Eurosym.json",
-      "referenceNumber": "171",
+      "referenceNumber": "174",
       "name": "Eurosym License",
       "licenseId": "Eurosym",
       "seeAlso": [
@@ -1772,7 +1784,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/FSFAP.json",
-      "referenceNumber": "394",
+      "referenceNumber": "406",
       "name": "FSF All Permissive License",
       "licenseId": "FSFAP",
       "seeAlso": [
@@ -1796,7 +1808,7 @@
       "reference": "./FSFULLR.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/FSFULLR.json",
-      "referenceNumber": "308",
+      "referenceNumber": "319",
       "name": "FSF Unlimited License (with License Retention)",
       "licenseId": "FSFULLR",
       "seeAlso": [
@@ -1809,7 +1821,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/FTL.json",
-      "referenceNumber": "374",
+      "referenceNumber": "386",
       "name": "Freetype Project License",
       "licenseId": "FTL",
       "seeAlso": [
@@ -1822,7 +1834,7 @@
       "reference": "./Fair.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Fair.json",
-      "referenceNumber": "262",
+      "referenceNumber": "271",
       "name": "Fair License",
       "licenseId": "Fair",
       "seeAlso": [
@@ -1835,7 +1847,7 @@
       "reference": "./Frameworx-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Frameworx-1.0.json",
-      "referenceNumber": "373",
+      "referenceNumber": "385",
       "name": "Frameworx Open License 1.0",
       "licenseId": "Frameworx-1.0",
       "seeAlso": [
@@ -1847,7 +1859,7 @@
       "reference": "./FreeImage.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/FreeImage.json",
-      "referenceNumber": "370",
+      "referenceNumber": "382",
       "name": "FreeImage Public License v1.0",
       "licenseId": "FreeImage",
       "seeAlso": [
@@ -1860,7 +1872,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.1.json",
-      "referenceNumber": "257",
+      "referenceNumber": "266",
       "name": "GNU Free Documentation License v1.1",
       "licenseId": "GFDL-1.1",
       "seeAlso": [
@@ -1868,12 +1880,60 @@
       ],
       "isOsiApproved": false
     },
+    {
+      "reference": "./GFDL-1.1-invariants-only.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-invariants-only.json",
+      "referenceNumber": "203",
+      "name": "GNU Free Documentation License v1.1 only - invariants",
+      "licenseId": "GFDL-1.1-invariants-only",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.1-invariants-or-later.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-invariants-or-later.json",
+      "referenceNumber": "83",
+      "name": "GNU Free Documentation License v1.1 or later - invariants",
+      "licenseId": "GFDL-1.1-invariants-or-later",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.1-no-invariants-only.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-no-invariants-only.json",
+      "referenceNumber": "7",
+      "name": "GNU Free Documentation License v1.1 only - no invariants",
+      "licenseId": "GFDL-1.1-no-invariants-only",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.1-no-invariants-or-later.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json",
+      "referenceNumber": "251",
+      "name": "GNU Free Documentation License v1.1 or later - no invariants",
+      "licenseId": "GFDL-1.1-no-invariants-or-later",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"
+      ],
+      "isOsiApproved": false
+    },
     {
       "reference": "./GFDL-1.1-only.html",
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-only.json",
-      "referenceNumber": "104",
+      "referenceNumber": "106",
       "name": "GNU Free Documentation License v1.1 only",
       "licenseId": "GFDL-1.1-only",
       "seeAlso": [
@@ -1886,7 +1946,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.1-or-later.json",
-      "referenceNumber": "124",
+      "referenceNumber": "126",
       "name": "GNU Free Documentation License v1.1 or later",
       "licenseId": "GFDL-1.1-or-later",
       "seeAlso": [
@@ -1899,7 +1959,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.2.json",
-      "referenceNumber": "197",
+      "referenceNumber": "204",
       "name": "GNU Free Documentation License v1.2",
       "licenseId": "GFDL-1.2",
       "seeAlso": [
@@ -1907,12 +1967,60 @@
       ],
       "isOsiApproved": false
     },
+    {
+      "reference": "./GFDL-1.2-invariants-only.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-invariants-only.json",
+      "referenceNumber": "206",
+      "name": "GNU Free Documentation License v1.2 only - invariants",
+      "licenseId": "GFDL-1.2-invariants-only",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.2-invariants-or-later.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-invariants-or-later.json",
+      "referenceNumber": "421",
+      "name": "GNU Free Documentation License v1.2 or later - invariants",
+      "licenseId": "GFDL-1.2-invariants-or-later",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.2-no-invariants-only.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-no-invariants-only.json",
+      "referenceNumber": "318",
+      "name": "GNU Free Documentation License v1.2 only - no invariants",
+      "licenseId": "GFDL-1.2-no-invariants-only",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.2-no-invariants-or-later.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json",
+      "referenceNumber": "193",
+      "name": "GNU Free Documentation License v1.2 or later - no invariants",
+      "licenseId": "GFDL-1.2-no-invariants-or-later",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"
+      ],
+      "isOsiApproved": false
+    },
     {
       "reference": "./GFDL-1.2-only.html",
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-only.json",
-      "referenceNumber": "90",
+      "referenceNumber": "92",
       "name": "GNU Free Documentation License v1.2 only",
       "licenseId": "GFDL-1.2-only",
       "seeAlso": [
@@ -1925,7 +2033,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.2-or-later.json",
-      "referenceNumber": "132",
+      "referenceNumber": "134",
       "name": "GNU Free Documentation License v1.2 or later",
       "licenseId": "GFDL-1.2-or-later",
       "seeAlso": [
@@ -1938,7 +2046,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.3.json",
-      "referenceNumber": "365",
+      "referenceNumber": "377",
       "name": "GNU Free Documentation License v1.3",
       "licenseId": "GFDL-1.3",
       "seeAlso": [
@@ -1946,12 +2054,60 @@
       ],
       "isOsiApproved": false
     },
+    {
+      "reference": "./GFDL-1.3-invariants-only.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-invariants-only.json",
+      "referenceNumber": "185",
+      "name": "GNU Free Documentation License v1.3 only - invariants",
+      "licenseId": "GFDL-1.3-invariants-only",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/fdl-1.3.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.3-invariants-or-later.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-invariants-or-later.json",
+      "referenceNumber": "314",
+      "name": "GNU Free Documentation License v1.3 or later - invariants",
+      "licenseId": "GFDL-1.3-invariants-or-later",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/fdl-1.3.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.3-no-invariants-only.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-no-invariants-only.json",
+      "referenceNumber": "181",
+      "name": "GNU Free Documentation License v1.3 only - no invariants",
+      "licenseId": "GFDL-1.3-no-invariants-only",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/fdl-1.3.txt"
+      ],
+      "isOsiApproved": false
+    },
+    {
+      "reference": "./GFDL-1.3-no-invariants-or-later.html",
+      "isDeprecatedLicenseId": false,
+      "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json",
+      "referenceNumber": "165",
+      "name": "GNU Free Documentation License v1.3 or later - no invariants",
+      "licenseId": "GFDL-1.3-no-invariants-or-later",
+      "seeAlso": [
+        "https://www.gnu.org/licenses/fdl-1.3.txt"
+      ],
+      "isOsiApproved": false
+    },
     {
       "reference": "./GFDL-1.3-only.html",
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-only.json",
-      "referenceNumber": "200",
+      "referenceNumber": "208",
       "name": "GNU Free Documentation License v1.3 only",
       "licenseId": "GFDL-1.3-only",
       "seeAlso": [
@@ -1964,7 +2120,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GFDL-1.3-or-later.json",
-      "referenceNumber": "53",
+      "referenceNumber": "54",
       "name": "GNU Free Documentation License v1.3 or later",
       "licenseId": "GFDL-1.3-or-later",
       "seeAlso": [
@@ -1976,7 +2132,7 @@
       "reference": "./GL2PS.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/GL2PS.json",
-      "referenceNumber": "314",
+      "referenceNumber": "325",
       "name": "GL2PS License",
       "licenseId": "GL2PS",
       "seeAlso": [
@@ -1988,7 +2144,7 @@
       "reference": "./GPL-1.0.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-1.0.json",
-      "referenceNumber": "330",
+      "referenceNumber": "341",
       "name": "GNU General Public License v1.0 only",
       "licenseId": "GPL-1.0",
       "seeAlso": [
@@ -2000,7 +2156,7 @@
       "reference": "./GPL-1.0+.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-1.0+.json",
-      "referenceNumber": "205",
+      "referenceNumber": "213",
       "name": "GNU General Public License v1.0 or later",
       "licenseId": "GPL-1.0+",
       "seeAlso": [
@@ -2012,7 +2168,7 @@
       "reference": "./GPL-1.0-only.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/GPL-1.0-only.json",
-      "referenceNumber": "15",
+      "referenceNumber": "16",
       "name": "GNU General Public License v1.0 only",
       "licenseId": "GPL-1.0-only",
       "seeAlso": [
@@ -2024,7 +2180,7 @@
       "reference": "./GPL-1.0-or-later.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/GPL-1.0-or-later.json",
-      "referenceNumber": "134",
+      "referenceNumber": "136",
       "name": "GNU General Public License v1.0 or later",
       "licenseId": "GPL-1.0-or-later",
       "seeAlso": [
@@ -2037,7 +2193,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0.json",
-      "referenceNumber": "356",
+      "referenceNumber": "367",
       "name": "GNU General Public License v2.0 only",
       "licenseId": "GPL-2.0",
       "seeAlso": [
@@ -2051,7 +2207,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0+.json",
-      "referenceNumber": "401",
+      "referenceNumber": "413",
       "name": "GNU General Public License v2.0 or later",
       "licenseId": "GPL-2.0+",
       "seeAlso": [
@@ -2065,7 +2221,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-only.json",
-      "referenceNumber": "235",
+      "referenceNumber": "243",
       "name": "GNU General Public License v2.0 only",
       "licenseId": "GPL-2.0-only",
       "seeAlso": [
@@ -2079,7 +2235,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-or-later.json",
-      "referenceNumber": "258",
+      "referenceNumber": "267",
       "name": "GNU General Public License v2.0 or later",
       "licenseId": "GPL-2.0-or-later",
       "seeAlso": [
@@ -2092,7 +2248,7 @@
       "reference": "./GPL-2.0-with-GCC-exception.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-GCC-exception.json",
-      "referenceNumber": "340",
+      "referenceNumber": "351",
       "name": "GNU General Public License v2.0 w/GCC Runtime Library exception",
       "licenseId": "GPL-2.0-with-GCC-exception",
       "seeAlso": [
@@ -2104,7 +2260,7 @@
       "reference": "./GPL-2.0-with-autoconf-exception.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json",
-      "referenceNumber": "36",
+      "referenceNumber": "37",
       "name": "GNU General Public License v2.0 w/Autoconf exception",
       "licenseId": "GPL-2.0-with-autoconf-exception",
       "seeAlso": [
@@ -2116,7 +2272,7 @@
       "reference": "./GPL-2.0-with-bison-exception.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-bison-exception.json",
-      "referenceNumber": "371",
+      "referenceNumber": "383",
       "name": "GNU General Public License v2.0 w/Bison exception",
       "licenseId": "GPL-2.0-with-bison-exception",
       "seeAlso": [
@@ -2128,7 +2284,7 @@
       "reference": "./GPL-2.0-with-classpath-exception.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-classpath-exception.json",
-      "referenceNumber": "227",
+      "referenceNumber": "235",
       "name": "GNU General Public License v2.0 w/Classpath exception",
       "licenseId": "GPL-2.0-with-classpath-exception",
       "seeAlso": [
@@ -2140,7 +2296,7 @@
       "reference": "./GPL-2.0-with-font-exception.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-2.0-with-font-exception.json",
-      "referenceNumber": "24",
+      "referenceNumber": "25",
       "name": "GNU General Public License v2.0 w/Font exception",
       "licenseId": "GPL-2.0-with-font-exception",
       "seeAlso": [
@@ -2153,7 +2309,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-3.0.json",
-      "referenceNumber": "414",
+      "referenceNumber": "427",
       "name": "GNU General Public License v3.0 only",
       "licenseId": "GPL-3.0",
       "seeAlso": [
@@ -2167,7 +2323,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-3.0+.json",
-      "referenceNumber": "152",
+      "referenceNumber": "154",
       "name": "GNU General Public License v3.0 or later",
       "licenseId": "GPL-3.0+",
       "seeAlso": [
@@ -2181,7 +2337,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-3.0-only.json",
-      "referenceNumber": "127",
+      "referenceNumber": "129",
       "name": "GNU General Public License v3.0 only",
       "licenseId": "GPL-3.0-only",
       "seeAlso": [
@@ -2195,7 +2351,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-3.0-or-later.json",
-      "referenceNumber": "399",
+      "referenceNumber": "411",
       "name": "GNU General Public License v3.0 or later",
       "licenseId": "GPL-3.0-or-later",
       "seeAlso": [
@@ -2220,7 +2376,7 @@
       "reference": "./GPL-3.0-with-autoconf-exception.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json",
-      "referenceNumber": "8",
+      "referenceNumber": "9",
       "name": "GNU General Public License v3.0 w/Autoconf exception",
       "licenseId": "GPL-3.0-with-autoconf-exception",
       "seeAlso": [
@@ -2232,7 +2388,7 @@
       "reference": "./Giftware.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Giftware.json",
-      "referenceNumber": "379",
+      "referenceNumber": "391",
       "name": "Giftware License",
       "licenseId": "Giftware",
       "seeAlso": [
@@ -2244,7 +2400,7 @@
       "reference": "./Glide.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Glide.json",
-      "referenceNumber": "121",
+      "referenceNumber": "123",
       "name": "3dfx Glide License",
       "licenseId": "Glide",
       "seeAlso": [
@@ -2256,7 +2412,7 @@
       "reference": "./Glulxe.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Glulxe.json",
-      "referenceNumber": "206",
+      "referenceNumber": "214",
       "name": "Glulxe License",
       "licenseId": "Glulxe",
       "seeAlso": [
@@ -2269,7 +2425,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/HPND.json",
-      "referenceNumber": "154",
+      "referenceNumber": "156",
       "name": "Historical Permission Notice and Disclaimer",
       "licenseId": "HPND",
       "seeAlso": [
@@ -2281,7 +2437,7 @@
       "reference": "./HPND-sell-variant.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/HPND-sell-variant.json",
-      "referenceNumber": "164",
+      "referenceNumber": "167",
       "name": "Historical Permission Notice and Disclaimer - sell variant",
       "licenseId": "HPND-sell-variant",
       "seeAlso": [
@@ -2293,7 +2449,7 @@
       "reference": "./HaskellReport.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/HaskellReport.json",
-      "referenceNumber": "212",
+      "referenceNumber": "220",
       "name": "Haskell Language Report License",
       "licenseId": "HaskellReport",
       "seeAlso": [
@@ -2305,7 +2461,7 @@
       "reference": "./Hippocratic-2.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Hippocratic-2.1.json",
-      "referenceNumber": "185",
+      "referenceNumber": "190",
       "name": "Hippocratic License 2.1",
       "licenseId": "Hippocratic-2.1",
       "seeAlso": [
@@ -2318,7 +2474,7 @@
       "reference": "./IBM-pibs.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/IBM-pibs.json",
-      "referenceNumber": "241",
+      "referenceNumber": "249",
       "name": "IBM PowerPC Initialization and Boot Software",
       "licenseId": "IBM-pibs",
       "seeAlso": [
@@ -2330,7 +2486,7 @@
       "reference": "./ICU.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ICU.json",
-      "referenceNumber": "180",
+      "referenceNumber": "184",
       "name": "ICU License",
       "licenseId": "ICU",
       "seeAlso": [
@@ -2343,7 +2499,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/IJG.json",
-      "referenceNumber": "244",
+      "referenceNumber": "253",
       "name": "Independent JPEG Group License",
       "licenseId": "IJG",
       "seeAlso": [
@@ -2356,7 +2512,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/IPA.json",
-      "referenceNumber": "321",
+      "referenceNumber": "332",
       "name": "IPA Font License",
       "licenseId": "IPA",
       "seeAlso": [
@@ -2369,7 +2525,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/IPL-1.0.json",
-      "referenceNumber": "320",
+      "referenceNumber": "331",
       "name": "IBM Public License v1.0",
       "licenseId": "IPL-1.0",
       "seeAlso": [
@@ -2382,7 +2538,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/ISC.json",
-      "referenceNumber": "364",
+      "referenceNumber": "376",
       "name": "ISC License",
       "licenseId": "ISC",
       "seeAlso": [
@@ -2395,7 +2551,7 @@
       "reference": "./ImageMagick.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ImageMagick.json",
-      "referenceNumber": "337",
+      "referenceNumber": "348",
       "name": "ImageMagick License",
       "licenseId": "ImageMagick",
       "seeAlso": [
@@ -2408,7 +2564,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Imlib2.json",
-      "referenceNumber": "140",
+      "referenceNumber": "142",
       "name": "Imlib2 License",
       "licenseId": "Imlib2",
       "seeAlso": [
@@ -2421,7 +2577,7 @@
       "reference": "./Info-ZIP.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Info-ZIP.json",
-      "referenceNumber": "294",
+      "referenceNumber": "303",
       "name": "Info-ZIP License",
       "licenseId": "Info-ZIP",
       "seeAlso": [
@@ -2434,7 +2590,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Intel.json",
-      "referenceNumber": "29",
+      "referenceNumber": "30",
       "name": "Intel Open Source License",
       "licenseId": "Intel",
       "seeAlso": [
@@ -2446,7 +2602,7 @@
       "reference": "./Intel-ACPI.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Intel-ACPI.json",
-      "referenceNumber": "243",
+      "referenceNumber": "252",
       "name": "Intel ACPI Software License Agreement",
       "licenseId": "Intel-ACPI",
       "seeAlso": [
@@ -2458,7 +2614,7 @@
       "reference": "./Interbase-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Interbase-1.0.json",
-      "referenceNumber": "334",
+      "referenceNumber": "345",
       "name": "Interbase Public License v1.0",
       "licenseId": "Interbase-1.0",
       "seeAlso": [
@@ -2470,7 +2626,7 @@
       "reference": "./JPNIC.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/JPNIC.json",
-      "referenceNumber": "327",
+      "referenceNumber": "338",
       "name": "Japan Network Information Center License",
       "licenseId": "JPNIC",
       "seeAlso": [
@@ -2482,7 +2638,7 @@
       "reference": "./JSON.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/JSON.json",
-      "referenceNumber": "204",
+      "referenceNumber": "212",
       "name": "JSON License",
       "licenseId": "JSON",
       "seeAlso": [
@@ -2494,7 +2650,7 @@
       "reference": "./JasPer-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/JasPer-2.0.json",
-      "referenceNumber": "81",
+      "referenceNumber": "82",
       "name": "JasPer License",
       "licenseId": "JasPer-2.0",
       "seeAlso": [
@@ -2506,7 +2662,7 @@
       "reference": "./LAL-1.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LAL-1.2.json",
-      "referenceNumber": "159",
+      "referenceNumber": "161",
       "name": "Licence Art Libre 1.2",
       "licenseId": "LAL-1.2",
       "seeAlso": [
@@ -2518,7 +2674,7 @@
       "reference": "./LAL-1.3.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LAL-1.3.json",
-      "referenceNumber": "368",
+      "referenceNumber": "380",
       "name": "Licence Art Libre 1.3",
       "licenseId": "LAL-1.3",
       "seeAlso": [
@@ -2530,7 +2686,7 @@
       "reference": "./LGPL-2.0.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.0.json",
-      "referenceNumber": "286",
+      "referenceNumber": "295",
       "name": "GNU Library General Public License v2 only",
       "licenseId": "LGPL-2.0",
       "seeAlso": [
@@ -2542,7 +2698,7 @@
       "reference": "./LGPL-2.0+.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.0+.json",
-      "referenceNumber": "144",
+      "referenceNumber": "146",
       "name": "GNU Library General Public License v2 or later",
       "licenseId": "LGPL-2.0+",
       "seeAlso": [
@@ -2554,7 +2710,7 @@
       "reference": "./LGPL-2.0-only.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.0-only.json",
-      "referenceNumber": "339",
+      "referenceNumber": "350",
       "name": "GNU Library General Public License v2 only",
       "licenseId": "LGPL-2.0-only",
       "seeAlso": [
@@ -2566,7 +2722,7 @@
       "reference": "./LGPL-2.0-or-later.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.0-or-later.json",
-      "referenceNumber": "35",
+      "referenceNumber": "36",
       "name": "GNU Library General Public License v2 or later",
       "licenseId": "LGPL-2.0-or-later",
       "seeAlso": [
@@ -2579,7 +2735,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.1.json",
-      "referenceNumber": "189",
+      "referenceNumber": "195",
       "name": "GNU Lesser General Public License v2.1 only",
       "licenseId": "LGPL-2.1",
       "seeAlso": [
@@ -2593,7 +2749,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.1+.json",
-      "referenceNumber": "209",
+      "referenceNumber": "217",
       "name": "GNU Library General Public License v2.1 or later",
       "licenseId": "LGPL-2.1+",
       "seeAlso": [
@@ -2607,7 +2763,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.1-only.json",
-      "referenceNumber": "143",
+      "referenceNumber": "145",
       "name": "GNU Lesser General Public License v2.1 only",
       "licenseId": "LGPL-2.1-only",
       "seeAlso": [
@@ -2621,7 +2777,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-2.1-or-later.json",
-      "referenceNumber": "279",
+      "referenceNumber": "288",
       "name": "GNU Lesser General Public License v2.1 or later",
       "licenseId": "LGPL-2.1-or-later",
       "seeAlso": [
@@ -2635,7 +2791,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-3.0.json",
-      "referenceNumber": "216",
+      "referenceNumber": "224",
       "name": "GNU Lesser General Public License v3.0 only",
       "licenseId": "LGPL-3.0",
       "seeAlso": [
@@ -2649,7 +2805,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-3.0+.json",
-      "referenceNumber": "228",
+      "referenceNumber": "236",
       "name": "GNU Lesser General Public License v3.0 or later",
       "licenseId": "LGPL-3.0+",
       "seeAlso": [
@@ -2663,7 +2819,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-3.0-only.json",
-      "referenceNumber": "49",
+      "referenceNumber": "50",
       "name": "GNU Lesser General Public License v3.0 only",
       "licenseId": "LGPL-3.0-only",
       "seeAlso": [
@@ -2677,7 +2833,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LGPL-3.0-or-later.json",
-      "referenceNumber": "328",
+      "referenceNumber": "339",
       "name": "GNU Lesser General Public License v3.0 or later",
       "licenseId": "LGPL-3.0-or-later",
       "seeAlso": [
@@ -2690,7 +2846,7 @@
       "reference": "./LGPLLR.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LGPLLR.json",
-      "referenceNumber": "417",
+      "referenceNumber": "430",
       "name": "Lesser General Public License For Linguistic Resources",
       "licenseId": "LGPLLR",
       "seeAlso": [
@@ -2702,7 +2858,7 @@
       "reference": "./LPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LPL-1.0.json",
-      "referenceNumber": "383",
+      "referenceNumber": "395",
       "name": "Lucent Public License Version 1.0",
       "licenseId": "LPL-1.0",
       "seeAlso": [
@@ -2715,7 +2871,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LPL-1.02.json",
-      "referenceNumber": "125",
+      "referenceNumber": "127",
       "name": "Lucent Public License v1.02",
       "licenseId": "LPL-1.02",
       "seeAlso": [
@@ -2728,7 +2884,7 @@
       "reference": "./LPPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LPPL-1.0.json",
-      "referenceNumber": "86",
+      "referenceNumber": "88",
       "name": "LaTeX Project Public License v1.0",
       "licenseId": "LPPL-1.0",
       "seeAlso": [
@@ -2740,7 +2896,7 @@
       "reference": "./LPPL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LPPL-1.1.json",
-      "referenceNumber": "174",
+      "referenceNumber": "177",
       "name": "LaTeX Project Public License v1.1",
       "licenseId": "LPPL-1.1",
       "seeAlso": [
@@ -2753,7 +2909,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LPPL-1.2.json",
-      "referenceNumber": "166",
+      "referenceNumber": "169",
       "name": "LaTeX Project Public License v1.2",
       "licenseId": "LPPL-1.2",
       "seeAlso": [
@@ -2766,7 +2922,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/LPPL-1.3a.json",
-      "referenceNumber": "280",
+      "referenceNumber": "289",
       "name": "LaTeX Project Public License v1.3a",
       "licenseId": "LPPL-1.3a",
       "seeAlso": [
@@ -2778,7 +2934,7 @@
       "reference": "./LPPL-1.3c.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LPPL-1.3c.json",
-      "referenceNumber": "131",
+      "referenceNumber": "133",
       "name": "LaTeX Project Public License v1.3c",
       "licenseId": "LPPL-1.3c",
       "seeAlso": [
@@ -2791,7 +2947,7 @@
       "reference": "./Latex2e.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Latex2e.json",
-      "referenceNumber": "37",
+      "referenceNumber": "38",
       "name": "Latex2e License",
       "licenseId": "Latex2e",
       "seeAlso": [
@@ -2803,7 +2959,7 @@
       "reference": "./Leptonica.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Leptonica.json",
-      "referenceNumber": "311",
+      "referenceNumber": "322",
       "name": "Leptonica License",
       "licenseId": "Leptonica",
       "seeAlso": [
@@ -2815,7 +2971,7 @@
       "reference": "./LiLiQ-P-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LiLiQ-P-1.1.json",
-      "referenceNumber": "83",
+      "referenceNumber": "85",
       "name": "Licence Libre du Québec – Permissive version 1.1",
       "licenseId": "LiLiQ-P-1.1",
       "seeAlso": [
@@ -2828,7 +2984,7 @@
       "reference": "./LiLiQ-R-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LiLiQ-R-1.1.json",
-      "referenceNumber": "301",
+      "referenceNumber": "310",
       "name": "Licence Libre du Québec – Réciprocité version 1.1",
       "licenseId": "LiLiQ-R-1.1",
       "seeAlso": [
@@ -2841,7 +2997,7 @@
       "reference": "./LiLiQ-Rplus-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/LiLiQ-Rplus-1.1.json",
-      "referenceNumber": "346",
+      "referenceNumber": "357",
       "name": "Licence Libre du Québec – Réciprocité forte version 1.1",
       "licenseId": "LiLiQ-Rplus-1.1",
       "seeAlso": [
@@ -2854,7 +3010,7 @@
       "reference": "./Libpng.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Libpng.json",
-      "referenceNumber": "388",
+      "referenceNumber": "400",
       "name": "libpng License",
       "licenseId": "Libpng",
       "seeAlso": [
@@ -2866,7 +3022,7 @@
       "reference": "./Linux-OpenIB.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Linux-OpenIB.json",
-      "referenceNumber": "224",
+      "referenceNumber": "232",
       "name": "Linux Kernel Variant of OpenIB.org license",
       "licenseId": "Linux-OpenIB",
       "seeAlso": [
@@ -2879,7 +3035,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/MIT.json",
-      "referenceNumber": "265",
+      "referenceNumber": "274",
       "name": "MIT License",
       "licenseId": "MIT",
       "seeAlso": [
@@ -2891,7 +3047,7 @@
       "reference": "./MIT-0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MIT-0.json",
-      "referenceNumber": "79",
+      "referenceNumber": "80",
       "name": "MIT No Attribution",
       "licenseId": "MIT-0",
       "seeAlso": [
@@ -2905,7 +3061,7 @@
       "reference": "./MIT-CMU.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MIT-CMU.json",
-      "referenceNumber": "355",
+      "referenceNumber": "366",
       "name": "CMU License",
       "licenseId": "MIT-CMU",
       "seeAlso": [
@@ -2918,7 +3074,7 @@
       "reference": "./MIT-advertising.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MIT-advertising.json",
-      "referenceNumber": "199",
+      "referenceNumber": "207",
       "name": "Enlightenment License (e16)",
       "licenseId": "MIT-advertising",
       "seeAlso": [
@@ -2930,7 +3086,7 @@
       "reference": "./MIT-enna.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MIT-enna.json",
-      "referenceNumber": "54",
+      "referenceNumber": "55",
       "name": "enna License",
       "licenseId": "MIT-enna",
       "seeAlso": [
@@ -2942,7 +3098,7 @@
       "reference": "./MIT-feh.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MIT-feh.json",
-      "referenceNumber": "376",
+      "referenceNumber": "388",
       "name": "feh License",
       "licenseId": "MIT-feh",
       "seeAlso": [
@@ -2954,7 +3110,7 @@
       "reference": "./MITNFA.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MITNFA.json",
-      "referenceNumber": "347",
+      "referenceNumber": "358",
       "name": "MIT +no-false-attribs license",
       "licenseId": "MITNFA",
       "seeAlso": [
@@ -2966,7 +3122,7 @@
       "reference": "./MPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MPL-1.0.json",
-      "referenceNumber": "247",
+      "referenceNumber": "256",
       "name": "Mozilla Public License 1.0",
       "licenseId": "MPL-1.0",
       "seeAlso": [
@@ -2980,7 +3136,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/MPL-1.1.json",
-      "referenceNumber": "407",
+      "referenceNumber": "419",
       "name": "Mozilla Public License 1.1",
       "licenseId": "MPL-1.1",
       "seeAlso": [
@@ -2994,7 +3150,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/MPL-2.0.json",
-      "referenceNumber": "126",
+      "referenceNumber": "128",
       "name": "Mozilla Public License 2.0",
       "licenseId": "MPL-2.0",
       "seeAlso": [
@@ -3007,7 +3163,7 @@
       "reference": "./MPL-2.0-no-copyleft-exception.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json",
-      "referenceNumber": "190",
+      "referenceNumber": "196",
       "name": "Mozilla Public License 2.0 (no copyleft exception)",
       "licenseId": "MPL-2.0-no-copyleft-exception",
       "seeAlso": [
@@ -3021,7 +3177,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/MS-PL.json",
-      "referenceNumber": "377",
+      "referenceNumber": "389",
       "name": "Microsoft Public License",
       "licenseId": "MS-PL",
       "seeAlso": [
@@ -3048,7 +3204,7 @@
       "reference": "./MTLL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MTLL.json",
-      "referenceNumber": "106",
+      "referenceNumber": "108",
       "name": "Matrix Template Library License",
       "licenseId": "MTLL",
       "seeAlso": [
@@ -3060,7 +3216,7 @@
       "reference": "./MakeIndex.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MakeIndex.json",
-      "referenceNumber": "354",
+      "referenceNumber": "365",
       "name": "MakeIndex License",
       "licenseId": "MakeIndex",
       "seeAlso": [
@@ -3072,7 +3228,7 @@
       "reference": "./MirOS.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MirOS.json",
-      "referenceNumber": "381",
+      "referenceNumber": "393",
       "name": "The MirOS Licence",
       "licenseId": "MirOS",
       "seeAlso": [
@@ -3084,7 +3240,7 @@
       "reference": "./Motosoto.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Motosoto.json",
-      "referenceNumber": "12",
+      "referenceNumber": "13",
       "name": "Motosoto License",
       "licenseId": "Motosoto",
       "seeAlso": [
@@ -3096,7 +3252,7 @@
       "reference": "./MulanPSL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MulanPSL-1.0.json",
-      "referenceNumber": "208",
+      "referenceNumber": "216",
       "name": "Mulan Permissive Software License, Version 1",
       "licenseId": "MulanPSL-1.0",
       "seeAlso": [
@@ -3109,7 +3265,7 @@
       "reference": "./MulanPSL-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/MulanPSL-2.0.json",
-      "referenceNumber": "153",
+      "referenceNumber": "155",
       "name": "Mulan Permissive Software License, Version 2",
       "licenseId": "MulanPSL-2.0",
       "seeAlso": [
@@ -3121,7 +3277,7 @@
       "reference": "./Multics.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Multics.json",
-      "referenceNumber": "170",
+      "referenceNumber": "173",
       "name": "Multics License",
       "licenseId": "Multics",
       "seeAlso": [
@@ -3133,7 +3289,7 @@
       "reference": "./Mup.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Mup.json",
-      "referenceNumber": "316",
+      "referenceNumber": "327",
       "name": "Mup License",
       "licenseId": "Mup",
       "seeAlso": [
@@ -3145,7 +3301,7 @@
       "reference": "./NASA-1.3.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NASA-1.3.json",
-      "referenceNumber": "114",
+      "referenceNumber": "116",
       "name": "NASA Open Source Agreement 1.3",
       "licenseId": "NASA-1.3",
       "seeAlso": [
@@ -3158,7 +3314,7 @@
       "reference": "./NBPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NBPL-1.0.json",
-      "referenceNumber": "17",
+      "referenceNumber": "18",
       "name": "Net Boolean Public License v1",
       "licenseId": "NBPL-1.0",
       "seeAlso": [
@@ -3170,7 +3326,7 @@
       "reference": "./NCGL-UK-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NCGL-UK-2.0.json",
-      "referenceNumber": "225",
+      "referenceNumber": "233",
       "name": "Non-Commercial Government Licence",
       "licenseId": "NCGL-UK-2.0",
       "seeAlso": [
@@ -3183,7 +3339,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/NCSA.json",
-      "referenceNumber": "194",
+      "referenceNumber": "200",
       "name": "University of Illinois/NCSA Open Source License",
       "licenseId": "NCSA",
       "seeAlso": [
@@ -3196,7 +3352,7 @@
       "reference": "./NGPL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NGPL.json",
-      "referenceNumber": "319",
+      "referenceNumber": "330",
       "name": "Nethack General Public License",
       "licenseId": "NGPL",
       "seeAlso": [
@@ -3208,7 +3364,7 @@
       "reference": "./NLOD-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NLOD-1.0.json",
-      "referenceNumber": "139",
+      "referenceNumber": "141",
       "name": "Norwegian Licence for Open Government Data",
       "licenseId": "NLOD-1.0",
       "seeAlso": [
@@ -3220,7 +3376,7 @@
       "reference": "./NLPL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NLPL.json",
-      "referenceNumber": "317",
+      "referenceNumber": "328",
       "name": "No Limit Public License",
       "licenseId": "NLPL",
       "seeAlso": [
@@ -3233,7 +3389,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/NOSL.json",
-      "referenceNumber": "392",
+      "referenceNumber": "404",
       "name": "Netizen Open Source License",
       "licenseId": "NOSL",
       "seeAlso": [
@@ -3246,7 +3402,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/NPL-1.0.json",
-      "referenceNumber": "253",
+      "referenceNumber": "262",
       "name": "Netscape Public License v1.0",
       "licenseId": "NPL-1.0",
       "seeAlso": [
@@ -3259,7 +3415,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/NPL-1.1.json",
-      "referenceNumber": "422",
+      "referenceNumber": "435",
       "name": "Netscape Public License v1.1",
       "licenseId": "NPL-1.1",
       "seeAlso": [
@@ -3271,7 +3427,7 @@
       "reference": "./NPOSL-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NPOSL-3.0.json",
-      "referenceNumber": "156",
+      "referenceNumber": "158",
       "name": "Non-Profit Open Software License 3.0",
       "licenseId": "NPOSL-3.0",
       "seeAlso": [
@@ -3283,7 +3439,7 @@
       "reference": "./NRL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NRL.json",
-      "referenceNumber": "105",
+      "referenceNumber": "107",
       "name": "NRL License",
       "licenseId": "NRL",
       "seeAlso": [
@@ -3295,7 +3451,7 @@
       "reference": "./NTP.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NTP.json",
-      "referenceNumber": "268",
+      "referenceNumber": "277",
       "name": "NTP License",
       "licenseId": "NTP",
       "seeAlso": [
@@ -3307,7 +3463,7 @@
       "reference": "./NTP-0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NTP-0.json",
-      "referenceNumber": "192",
+      "referenceNumber": "198",
       "name": "NTP No Attribution",
       "licenseId": "NTP-0",
       "seeAlso": [
@@ -3319,7 +3475,7 @@
       "reference": "./Naumen.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Naumen.json",
-      "referenceNumber": "293",
+      "referenceNumber": "302",
       "name": "Naumen Public License",
       "licenseId": "Naumen",
       "seeAlso": [
@@ -3331,7 +3487,7 @@
       "reference": "./Net-SNMP.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Net-SNMP.json",
-      "referenceNumber": "288",
+      "referenceNumber": "297",
       "name": "Net-SNMP License",
       "licenseId": "Net-SNMP",
       "seeAlso": [
@@ -3343,7 +3499,7 @@
       "reference": "./NetCDF.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/NetCDF.json",
-      "referenceNumber": "219",
+      "referenceNumber": "227",
       "name": "NetCDF license",
       "licenseId": "NetCDF",
       "seeAlso": [
@@ -3355,7 +3511,7 @@
       "reference": "./Newsletr.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Newsletr.json",
-      "referenceNumber": "369",
+      "referenceNumber": "381",
       "name": "Newsletr License",
       "licenseId": "Newsletr",
       "seeAlso": [
@@ -3368,7 +3524,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Nokia.json",
-      "referenceNumber": "130",
+      "referenceNumber": "132",
       "name": "Nokia Open Source License",
       "licenseId": "Nokia",
       "seeAlso": [
@@ -3380,7 +3536,7 @@
       "reference": "./Noweb.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Noweb.json",
-      "referenceNumber": "73",
+      "referenceNumber": "74",
       "name": "Noweb License",
       "licenseId": "Noweb",
       "seeAlso": [
@@ -3393,7 +3549,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Nunit.json",
-      "referenceNumber": "91",
+      "referenceNumber": "93",
       "name": "Nunit License",
       "licenseId": "Nunit",
       "seeAlso": [
@@ -3405,7 +3561,7 @@
       "reference": "./O-UDA-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/O-UDA-1.0.json",
-      "referenceNumber": "48",
+      "referenceNumber": "49",
       "name": "Open Use of Data Agreement v1.0",
       "licenseId": "O-UDA-1.0",
       "seeAlso": [
@@ -3417,7 +3573,7 @@
       "reference": "./OCCT-PL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OCCT-PL.json",
-      "referenceNumber": "68",
+      "referenceNumber": "69",
       "name": "Open CASCADE Technology Public License",
       "licenseId": "OCCT-PL",
       "seeAlso": [
@@ -3429,7 +3585,7 @@
       "reference": "./OCLC-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OCLC-2.0.json",
-      "referenceNumber": "352",
+      "referenceNumber": "363",
       "name": "OCLC Research Public License 2.0",
       "licenseId": "OCLC-2.0",
       "seeAlso": [
@@ -3442,7 +3598,7 @@
       "reference": "./ODC-By-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ODC-By-1.0.json",
-      "referenceNumber": "393",
+      "referenceNumber": "405",
       "name": "Open Data Commons Attribution License v1.0",
       "licenseId": "ODC-By-1.0",
       "seeAlso": [
@@ -3455,7 +3611,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/ODbL-1.0.json",
-      "referenceNumber": "351",
+      "referenceNumber": "362",
       "name": "ODC Open Database License v1.0",
       "licenseId": "ODbL-1.0",
       "seeAlso": [
@@ -3468,7 +3624,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OFL-1.0.json",
-      "referenceNumber": "84",
+      "referenceNumber": "86",
       "name": "SIL Open Font License 1.0",
       "licenseId": "OFL-1.0",
       "seeAlso": [
@@ -3480,7 +3636,7 @@
       "reference": "./OFL-1.0-RFN.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OFL-1.0-RFN.json",
-      "referenceNumber": "309",
+      "referenceNumber": "320",
       "name": "SIL Open Font License 1.0 with Reserved Font Name",
       "licenseId": "OFL-1.0-RFN",
       "seeAlso": [
@@ -3492,7 +3648,7 @@
       "reference": "./OFL-1.0-no-RFN.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OFL-1.0-no-RFN.json",
-      "referenceNumber": "74",
+      "referenceNumber": "75",
       "name": "SIL Open Font License 1.0 with no Reserved Font Name",
       "licenseId": "OFL-1.0-no-RFN",
       "seeAlso": [
@@ -3505,7 +3661,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OFL-1.1.json",
-      "referenceNumber": "322",
+      "referenceNumber": "333",
       "name": "SIL Open Font License 1.1",
       "licenseId": "OFL-1.1",
       "seeAlso": [
@@ -3518,7 +3674,7 @@
       "reference": "./OFL-1.1-RFN.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OFL-1.1-RFN.json",
-      "referenceNumber": "43",
+      "referenceNumber": "44",
       "name": "SIL Open Font License 1.1 with Reserved Font Name",
       "licenseId": "OFL-1.1-RFN",
       "seeAlso": [
@@ -3531,7 +3687,7 @@
       "reference": "./OFL-1.1-no-RFN.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OFL-1.1-no-RFN.json",
-      "referenceNumber": "246",
+      "referenceNumber": "255",
       "name": "SIL Open Font License 1.1 with no Reserved Font Name",
       "licenseId": "OFL-1.1-no-RFN",
       "seeAlso": [
@@ -3544,7 +3700,7 @@
       "reference": "./OGC-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OGC-1.0.json",
-      "referenceNumber": "378",
+      "referenceNumber": "390",
       "name": "OGC Software License, Version 1.0",
       "licenseId": "OGC-1.0",
       "seeAlso": [
@@ -3556,7 +3712,7 @@
       "reference": "./OGL-Canada-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OGL-Canada-2.0.json",
-      "referenceNumber": "357",
+      "referenceNumber": "368",
       "name": "Open Government Licence - Canada",
       "licenseId": "OGL-Canada-2.0",
       "seeAlso": [
@@ -3568,7 +3724,7 @@
       "reference": "./OGL-UK-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OGL-UK-1.0.json",
-      "referenceNumber": "359",
+      "referenceNumber": "371",
       "name": "Open Government Licence v1.0",
       "licenseId": "OGL-UK-1.0",
       "seeAlso": [
@@ -3580,7 +3736,7 @@
       "reference": "./OGL-UK-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OGL-UK-2.0.json",
-      "referenceNumber": "13",
+      "referenceNumber": "14",
       "name": "Open Government Licence v2.0",
       "licenseId": "OGL-UK-2.0",
       "seeAlso": [
@@ -3592,7 +3748,7 @@
       "reference": "./OGL-UK-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OGL-UK-3.0.json",
-      "referenceNumber": "21",
+      "referenceNumber": "22",
       "name": "Open Government Licence v3.0",
       "licenseId": "OGL-UK-3.0",
       "seeAlso": [
@@ -3604,7 +3760,7 @@
       "reference": "./OGTSL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OGTSL.json",
-      "referenceNumber": "26",
+      "referenceNumber": "27",
       "name": "Open Group Test Suite License",
       "licenseId": "OGTSL",
       "seeAlso": [
@@ -3617,7 +3773,7 @@
       "reference": "./OLDAP-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-1.1.json",
-      "referenceNumber": "57",
+      "referenceNumber": "58",
       "name": "Open LDAP Public License v1.1",
       "licenseId": "OLDAP-1.1",
       "seeAlso": [
@@ -3629,7 +3785,7 @@
       "reference": "./OLDAP-1.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-1.2.json",
-      "referenceNumber": "50",
+      "referenceNumber": "51",
       "name": "Open LDAP Public License v1.2",
       "licenseId": "OLDAP-1.2",
       "seeAlso": [
@@ -3641,7 +3797,7 @@
       "reference": "./OLDAP-1.3.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-1.3.json",
-      "referenceNumber": "42",
+      "referenceNumber": "43",
       "name": "Open LDAP Public License v1.3",
       "licenseId": "OLDAP-1.3",
       "seeAlso": [
@@ -3653,7 +3809,7 @@
       "reference": "./OLDAP-1.4.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-1.4.json",
-      "referenceNumber": "52",
+      "referenceNumber": "53",
       "name": "Open LDAP Public License v1.4",
       "licenseId": "OLDAP-1.4",
       "seeAlso": [
@@ -3665,7 +3821,7 @@
       "reference": "./OLDAP-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.0.json",
-      "referenceNumber": "25",
+      "referenceNumber": "26",
       "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)",
       "licenseId": "OLDAP-2.0",
       "seeAlso": [
@@ -3677,7 +3833,7 @@
       "reference": "./OLDAP-2.0.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.0.1.json",
-      "referenceNumber": "290",
+      "referenceNumber": "299",
       "name": "Open LDAP Public License v2.0.1",
       "licenseId": "OLDAP-2.0.1",
       "seeAlso": [
@@ -3689,7 +3845,7 @@
       "reference": "./OLDAP-2.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.1.json",
-      "referenceNumber": "413",
+      "referenceNumber": "426",
       "name": "Open LDAP Public License v2.1",
       "licenseId": "OLDAP-2.1",
       "seeAlso": [
@@ -3701,7 +3857,7 @@
       "reference": "./OLDAP-2.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.2.json",
-      "referenceNumber": "329",
+      "referenceNumber": "340",
       "name": "Open LDAP Public License v2.2",
       "licenseId": "OLDAP-2.2",
       "seeAlso": [
@@ -3713,7 +3869,7 @@
       "reference": "./OLDAP-2.2.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.2.1.json",
-      "referenceNumber": "396",
+      "referenceNumber": "408",
       "name": "Open LDAP Public License v2.2.1",
       "licenseId": "OLDAP-2.2.1",
       "seeAlso": [
@@ -3725,7 +3881,7 @@
       "reference": "./OLDAP-2.2.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.2.2.json",
-      "referenceNumber": "176",
+      "referenceNumber": "179",
       "name": "Open LDAP Public License 2.2.2",
       "licenseId": "OLDAP-2.2.2",
       "seeAlso": [
@@ -3738,7 +3894,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.3.json",
-      "referenceNumber": "238",
+      "referenceNumber": "246",
       "name": "Open LDAP Public License v2.3",
       "licenseId": "OLDAP-2.3",
       "seeAlso": [
@@ -3750,7 +3906,7 @@
       "reference": "./OLDAP-2.4.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.4.json",
-      "referenceNumber": "119",
+      "referenceNumber": "121",
       "name": "Open LDAP Public License v2.4",
       "licenseId": "OLDAP-2.4",
       "seeAlso": [
@@ -3762,7 +3918,7 @@
       "reference": "./OLDAP-2.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.5.json",
-      "referenceNumber": "112",
+      "referenceNumber": "114",
       "name": "Open LDAP Public License v2.5",
       "licenseId": "OLDAP-2.5",
       "seeAlso": [
@@ -3774,7 +3930,7 @@
       "reference": "./OLDAP-2.6.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.6.json",
-      "referenceNumber": "113",
+      "referenceNumber": "115",
       "name": "Open LDAP Public License v2.6",
       "licenseId": "OLDAP-2.6",
       "seeAlso": [
@@ -3787,7 +3943,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.7.json",
-      "referenceNumber": "237",
+      "referenceNumber": "245",
       "name": "Open LDAP Public License v2.7",
       "licenseId": "OLDAP-2.7",
       "seeAlso": [
@@ -3799,7 +3955,7 @@
       "reference": "./OLDAP-2.8.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OLDAP-2.8.json",
-      "referenceNumber": "261",
+      "referenceNumber": "270",
       "name": "Open LDAP Public License v2.8",
       "licenseId": "OLDAP-2.8",
       "seeAlso": [
@@ -3811,7 +3967,7 @@
       "reference": "./OML.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OML.json",
-      "referenceNumber": "177",
+      "referenceNumber": "180",
       "name": "Open Market License",
       "licenseId": "OML",
       "seeAlso": [
@@ -3823,7 +3979,7 @@
       "reference": "./OPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OPL-1.0.json",
-      "referenceNumber": "349",
+      "referenceNumber": "360",
       "name": "Open Public License v1.0",
       "licenseId": "OPL-1.0",
       "seeAlso": [
@@ -3836,7 +3992,7 @@
       "reference": "./OSET-PL-2.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/OSET-PL-2.1.json",
-      "referenceNumber": "210",
+      "referenceNumber": "218",
       "name": "OSET Public License version 2.1",
       "licenseId": "OSET-PL-2.1",
       "seeAlso": [
@@ -3850,7 +4006,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OSL-1.0.json",
-      "referenceNumber": "99",
+      "referenceNumber": "101",
       "name": "Open Software License 1.0",
       "licenseId": "OSL-1.0",
       "seeAlso": [
@@ -3863,7 +4019,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OSL-1.1.json",
-      "referenceNumber": "184",
+      "referenceNumber": "189",
       "name": "Open Software License 1.1",
       "licenseId": "OSL-1.1",
       "seeAlso": [
@@ -3876,7 +4032,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OSL-2.0.json",
-      "referenceNumber": "375",
+      "referenceNumber": "387",
       "name": "Open Software License 2.0",
       "licenseId": "OSL-2.0",
       "seeAlso": [
@@ -3889,7 +4045,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OSL-2.1.json",
-      "referenceNumber": "163",
+      "referenceNumber": "166",
       "name": "Open Software License 2.1",
       "licenseId": "OSL-2.1",
       "seeAlso": [
@@ -3903,7 +4059,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OSL-3.0.json",
-      "referenceNumber": "155",
+      "referenceNumber": "157",
       "name": "Open Software License 3.0",
       "licenseId": "OSL-3.0",
       "seeAlso": [
@@ -3917,7 +4073,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/OpenSSL.json",
-      "referenceNumber": "87",
+      "referenceNumber": "89",
       "name": "OpenSSL License",
       "licenseId": "OpenSSL",
       "seeAlso": [
@@ -3929,7 +4085,7 @@
       "reference": "./PDDL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/PDDL-1.0.json",
-      "referenceNumber": "137",
+      "referenceNumber": "139",
       "name": "ODC Public Domain Dedication \u0026 License 1.0",
       "licenseId": "PDDL-1.0",
       "seeAlso": [
@@ -3941,7 +4097,7 @@
       "reference": "./PHP-3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/PHP-3.0.json",
-      "referenceNumber": "198",
+      "referenceNumber": "205",
       "name": "PHP License v3.0",
       "licenseId": "PHP-3.0",
       "seeAlso": [
@@ -3967,7 +4123,7 @@
       "reference": "./PSF-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/PSF-2.0.json",
-      "referenceNumber": "95",
+      "referenceNumber": "97",
       "name": "Python Software Foundation License 2.0",
       "licenseId": "PSF-2.0",
       "seeAlso": [
@@ -3979,7 +4135,7 @@
       "reference": "./Parity-6.0.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Parity-6.0.0.json",
-      "referenceNumber": "419",
+      "referenceNumber": "432",
       "name": "The Parity Public License 6.0.0",
       "licenseId": "Parity-6.0.0",
       "seeAlso": [
@@ -3991,7 +4147,7 @@
       "reference": "./Parity-7.0.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Parity-7.0.0.json",
-      "referenceNumber": "404",
+      "referenceNumber": "416",
       "name": "The Parity Public License 7.0.0",
       "licenseId": "Parity-7.0.0",
       "seeAlso": [
@@ -4003,7 +4159,7 @@
       "reference": "./Plexus.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Plexus.json",
-      "referenceNumber": "162",
+      "referenceNumber": "164",
       "name": "Plexus Classworlds License",
       "licenseId": "Plexus",
       "seeAlso": [
@@ -4015,7 +4171,7 @@
       "reference": "./PolyForm-Noncommercial-1.0.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json",
-      "referenceNumber": "292",
+      "referenceNumber": "301",
       "name": "PolyForm Noncommercial License 1.0.0",
       "licenseId": "PolyForm-Noncommercial-1.0.0",
       "seeAlso": [
@@ -4027,7 +4183,7 @@
       "reference": "./PolyForm-Small-Business-1.0.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json",
-      "referenceNumber": "122",
+      "referenceNumber": "124",
       "name": "PolyForm Small Business License 1.0.0",
       "licenseId": "PolyForm-Small-Business-1.0.0",
       "seeAlso": [
@@ -4039,7 +4195,7 @@
       "reference": "./PostgreSQL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/PostgreSQL.json",
-      "referenceNumber": "11",
+      "referenceNumber": "12",
       "name": "PostgreSQL License",
       "licenseId": "PostgreSQL",
       "seeAlso": [
@@ -4053,7 +4209,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Python-2.0.json",
-      "referenceNumber": "406",
+      "referenceNumber": "418",
       "name": "Python License 2.0",
       "licenseId": "Python-2.0",
       "seeAlso": [
@@ -4066,7 +4222,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/QPL-1.0.json",
-      "referenceNumber": "300",
+      "referenceNumber": "309",
       "name": "Q Public License 1.0",
       "licenseId": "QPL-1.0",
       "seeAlso": [
@@ -4079,7 +4235,7 @@
       "reference": "./Qhull.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Qhull.json",
-      "referenceNumber": "129",
+      "referenceNumber": "131",
       "name": "Qhull License",
       "licenseId": "Qhull",
       "seeAlso": [
@@ -4091,7 +4247,7 @@
       "reference": "./RHeCos-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/RHeCos-1.1.json",
-      "referenceNumber": "64",
+      "referenceNumber": "65",
       "name": "Red Hat eCos Public License v1.1",
       "licenseId": "RHeCos-1.1",
       "seeAlso": [
@@ -4103,7 +4259,7 @@
       "reference": "./RPL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/RPL-1.1.json",
-      "referenceNumber": "223",
+      "referenceNumber": "231",
       "name": "Reciprocal Public License 1.1",
       "licenseId": "RPL-1.1",
       "seeAlso": [
@@ -4115,7 +4271,7 @@
       "reference": "./RPL-1.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/RPL-1.5.json",
-      "referenceNumber": "109",
+      "referenceNumber": "111",
       "name": "Reciprocal Public License 1.5",
       "licenseId": "RPL-1.5",
       "seeAlso": [
@@ -4128,7 +4284,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/RPSL-1.0.json",
-      "referenceNumber": "55",
+      "referenceNumber": "56",
       "name": "RealNetworks Public Source License v1.0",
       "licenseId": "RPSL-1.0",
       "seeAlso": [
@@ -4141,7 +4297,7 @@
       "reference": "./RSA-MD.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/RSA-MD.json",
-      "referenceNumber": "289",
+      "referenceNumber": "298",
       "name": "RSA Message-Digest License ",
       "licenseId": "RSA-MD",
       "seeAlso": [
@@ -4153,7 +4309,7 @@
       "reference": "./RSCPL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/RSCPL.json",
-      "referenceNumber": "350",
+      "referenceNumber": "361",
       "name": "Ricoh Source Code Public License",
       "licenseId": "RSCPL",
       "seeAlso": [
@@ -4166,7 +4322,7 @@
       "reference": "./Rdisc.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Rdisc.json",
-      "referenceNumber": "333",
+      "referenceNumber": "344",
       "name": "Rdisc License",
       "licenseId": "Rdisc",
       "seeAlso": [
@@ -4179,7 +4335,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Ruby.json",
-      "referenceNumber": "14",
+      "referenceNumber": "15",
       "name": "Ruby License",
       "licenseId": "Ruby",
       "seeAlso": [
@@ -4191,7 +4347,7 @@
       "reference": "./SAX-PD.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SAX-PD.json",
-      "referenceNumber": "158",
+      "referenceNumber": "160",
       "name": "Sax Public Domain Notice",
       "licenseId": "SAX-PD",
       "seeAlso": [
@@ -4203,7 +4359,7 @@
       "reference": "./SCEA.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SCEA.json",
-      "referenceNumber": "142",
+      "referenceNumber": "144",
       "name": "SCEA Shared Source License",
       "licenseId": "SCEA",
       "seeAlso": [
@@ -4215,7 +4371,7 @@
       "reference": "./SGI-B-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SGI-B-1.0.json",
-      "referenceNumber": "196",
+      "referenceNumber": "202",
       "name": "SGI Free Software License B v1.0",
       "licenseId": "SGI-B-1.0",
       "seeAlso": [
@@ -4227,7 +4383,7 @@
       "reference": "./SGI-B-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SGI-B-1.1.json",
-      "referenceNumber": "299",
+      "referenceNumber": "308",
       "name": "SGI Free Software License B v1.1",
       "licenseId": "SGI-B-1.1",
       "seeAlso": [
@@ -4240,7 +4396,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/SGI-B-2.0.json",
-      "referenceNumber": "31",
+      "referenceNumber": "32",
       "name": "SGI Free Software License B v2.0",
       "licenseId": "SGI-B-2.0",
       "seeAlso": [
@@ -4252,7 +4408,7 @@
       "reference": "./SHL-0.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SHL-0.5.json",
-      "referenceNumber": "51",
+      "referenceNumber": "52",
       "name": "Solderpad Hardware License v0.5",
       "licenseId": "SHL-0.5",
       "seeAlso": [
@@ -4264,7 +4420,7 @@
       "reference": "./SHL-0.51.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SHL-0.51.json",
-      "referenceNumber": "291",
+      "referenceNumber": "300",
       "name": "Solderpad Hardware License, Version 0.51",
       "licenseId": "SHL-0.51",
       "seeAlso": [
@@ -4277,7 +4433,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/SISSL.json",
-      "referenceNumber": "82",
+      "referenceNumber": "84",
       "name": "Sun Industry Standards Source License v1.1",
       "licenseId": "SISSL",
       "seeAlso": [
@@ -4290,7 +4446,7 @@
       "reference": "./SISSL-1.2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SISSL-1.2.json",
-      "referenceNumber": "65",
+      "referenceNumber": "66",
       "name": "Sun Industry Standards Source License v1.2",
       "licenseId": "SISSL-1.2",
       "seeAlso": [
@@ -4303,7 +4459,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/SMLNJ.json",
-      "referenceNumber": "226",
+      "referenceNumber": "234",
       "name": "Standard ML of New Jersey License",
       "licenseId": "SMLNJ",
       "seeAlso": [
@@ -4315,7 +4471,7 @@
       "reference": "./SMPPL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SMPPL.json",
-      "referenceNumber": "110",
+      "referenceNumber": "112",
       "name": "Secure Messaging Protocol Public License",
       "licenseId": "SMPPL",
       "seeAlso": [
@@ -4327,7 +4483,7 @@
       "reference": "./SNIA.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SNIA.json",
-      "referenceNumber": "313",
+      "referenceNumber": "324",
       "name": "SNIA Public License 1.1",
       "licenseId": "SNIA",
       "seeAlso": [
@@ -4340,7 +4496,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/SPL-1.0.json",
-      "referenceNumber": "256",
+      "referenceNumber": "265",
       "name": "Sun Public License v1.0",
       "licenseId": "SPL-1.0",
       "seeAlso": [
@@ -4352,7 +4508,7 @@
       "reference": "./SSH-OpenSSH.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SSH-OpenSSH.json",
-      "referenceNumber": "22",
+      "referenceNumber": "23",
       "name": "SSH OpenSSH license",
       "licenseId": "SSH-OpenSSH",
       "seeAlso": [
@@ -4364,7 +4520,7 @@
       "reference": "./SSH-short.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SSH-short.json",
-      "referenceNumber": "70",
+      "referenceNumber": "71",
       "name": "SSH short notice",
       "licenseId": "SSH-short",
       "seeAlso": [
@@ -4378,7 +4534,7 @@
       "reference": "./SSPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SSPL-1.0.json",
-      "referenceNumber": "345",
+      "referenceNumber": "356",
       "name": "Server Side Public License, v 1",
       "licenseId": "SSPL-1.0",
       "seeAlso": [
@@ -4390,7 +4546,7 @@
       "reference": "./SWL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SWL.json",
-      "referenceNumber": "97",
+      "referenceNumber": "99",
       "name": "Scheme Widget Library (SWL) Software License Agreement",
       "licenseId": "SWL",
       "seeAlso": [
@@ -4402,7 +4558,7 @@
       "reference": "./Saxpath.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Saxpath.json",
-      "referenceNumber": "34",
+      "referenceNumber": "35",
       "name": "Saxpath License",
       "licenseId": "Saxpath",
       "seeAlso": [
@@ -4414,7 +4570,7 @@
       "reference": "./Sendmail.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Sendmail.json",
-      "referenceNumber": "304",
+      "referenceNumber": "313",
       "name": "Sendmail License",
       "licenseId": "Sendmail",
       "seeAlso": [
@@ -4427,7 +4583,7 @@
       "reference": "./Sendmail-8.23.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Sendmail-8.23.json",
-      "referenceNumber": "182",
+      "referenceNumber": "187",
       "name": "Sendmail License 8.23",
       "licenseId": "Sendmail-8.23",
       "seeAlso": [
@@ -4440,7 +4596,7 @@
       "reference": "./SimPL-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SimPL-2.0.json",
-      "referenceNumber": "259",
+      "referenceNumber": "268",
       "name": "Simple Public License 2.0",
       "licenseId": "SimPL-2.0",
       "seeAlso": [
@@ -4453,7 +4609,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Sleepycat.json",
-      "referenceNumber": "58",
+      "referenceNumber": "59",
       "name": "Sleepycat License",
       "licenseId": "Sleepycat",
       "seeAlso": [
@@ -4465,7 +4621,7 @@
       "reference": "./Spencer-86.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Spencer-86.json",
-      "referenceNumber": "191",
+      "referenceNumber": "197",
       "name": "Spencer License 86",
       "licenseId": "Spencer-86",
       "seeAlso": [
@@ -4477,7 +4633,7 @@
       "reference": "./Spencer-94.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Spencer-94.json",
-      "referenceNumber": "220",
+      "referenceNumber": "228",
       "name": "Spencer License 94",
       "licenseId": "Spencer-94",
       "seeAlso": [
@@ -4489,7 +4645,7 @@
       "reference": "./Spencer-99.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Spencer-99.json",
-      "referenceNumber": "67",
+      "referenceNumber": "68",
       "name": "Spencer License 99",
       "licenseId": "Spencer-99",
       "seeAlso": [
@@ -4502,7 +4658,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/StandardML-NJ.json",
-      "referenceNumber": "296",
+      "referenceNumber": "305",
       "name": "Standard ML of New Jersey License",
       "licenseId": "StandardML-NJ",
       "seeAlso": [
@@ -4514,7 +4670,7 @@
       "reference": "./SugarCRM-1.1.3.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/SugarCRM-1.1.3.json",
-      "referenceNumber": "353",
+      "referenceNumber": "364",
       "name": "SugarCRM Public License v1.1.3",
       "licenseId": "SugarCRM-1.1.3",
       "seeAlso": [
@@ -4526,7 +4682,7 @@
       "reference": "./TAPR-OHL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TAPR-OHL-1.0.json",
-      "referenceNumber": "9",
+      "referenceNumber": "10",
       "name": "TAPR Open Hardware License v1.0",
       "licenseId": "TAPR-OHL-1.0",
       "seeAlso": [
@@ -4538,7 +4694,7 @@
       "reference": "./TCL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TCL.json",
-      "referenceNumber": "56",
+      "referenceNumber": "57",
       "name": "TCL/TK License",
       "licenseId": "TCL",
       "seeAlso": [
@@ -4551,7 +4707,7 @@
       "reference": "./TCP-wrappers.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TCP-wrappers.json",
-      "referenceNumber": "242",
+      "referenceNumber": "250",
       "name": "TCP Wrappers License",
       "licenseId": "TCP-wrappers",
       "seeAlso": [
@@ -4563,7 +4719,7 @@
       "reference": "./TMate.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TMate.json",
-      "referenceNumber": "415",
+      "referenceNumber": "428",
       "name": "TMate Open Source License",
       "licenseId": "TMate",
       "seeAlso": [
@@ -4575,7 +4731,7 @@
       "reference": "./TORQUE-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TORQUE-1.1.json",
-      "referenceNumber": "195",
+      "referenceNumber": "201",
       "name": "TORQUE v2.5+ Software License v1.1",
       "licenseId": "TORQUE-1.1",
       "seeAlso": [
@@ -4587,7 +4743,7 @@
       "reference": "./TOSL.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TOSL.json",
-      "referenceNumber": "260",
+      "referenceNumber": "269",
       "name": "Trusster Open Source License",
       "licenseId": "TOSL",
       "seeAlso": [
@@ -4599,7 +4755,7 @@
       "reference": "./TU-Berlin-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TU-Berlin-1.0.json",
-      "referenceNumber": "384",
+      "referenceNumber": "396",
       "name": "Technische Universitaet Berlin License 1.0",
       "licenseId": "TU-Berlin-1.0",
       "seeAlso": [
@@ -4611,7 +4767,7 @@
       "reference": "./TU-Berlin-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/TU-Berlin-2.0.json",
-      "referenceNumber": "405",
+      "referenceNumber": "417",
       "name": "Technische Universitaet Berlin License 2.0",
       "licenseId": "TU-Berlin-2.0",
       "seeAlso": [
@@ -4623,7 +4779,7 @@
       "reference": "./UCL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/UCL-1.0.json",
-      "referenceNumber": "302",
+      "referenceNumber": "311",
       "name": "Upstream Compatibility License v1.0",
       "licenseId": "UCL-1.0",
       "seeAlso": [
@@ -4636,7 +4792,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/UPL-1.0.json",
-      "referenceNumber": "149",
+      "referenceNumber": "151",
       "name": "Universal Permissive License v1.0",
       "licenseId": "UPL-1.0",
       "seeAlso": [
@@ -4648,7 +4804,7 @@
       "reference": "./Unicode-DFS-2015.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Unicode-DFS-2015.json",
-      "referenceNumber": "270",
+      "referenceNumber": "279",
       "name": "Unicode License Agreement - Data Files and Software (2015)",
       "licenseId": "Unicode-DFS-2015",
       "seeAlso": [
@@ -4660,7 +4816,7 @@
       "reference": "./Unicode-DFS-2016.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Unicode-DFS-2016.json",
-      "referenceNumber": "382",
+      "referenceNumber": "394",
       "name": "Unicode License Agreement - Data Files and Software (2016)",
       "licenseId": "Unicode-DFS-2016",
       "seeAlso": [
@@ -4672,7 +4828,7 @@
       "reference": "./Unicode-TOU.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Unicode-TOU.json",
-      "referenceNumber": "16",
+      "referenceNumber": "17",
       "name": "Unicode Terms of Use",
       "licenseId": "Unicode-TOU",
       "seeAlso": [
@@ -4685,7 +4841,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Unlicense.json",
-      "referenceNumber": "179",
+      "referenceNumber": "183",
       "name": "The Unlicense",
       "licenseId": "Unlicense",
       "seeAlso": [
@@ -4697,7 +4853,7 @@
       "reference": "./VOSTROM.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/VOSTROM.json",
-      "referenceNumber": "363",
+      "referenceNumber": "375",
       "name": "VOSTROM Public License for Open Source",
       "licenseId": "VOSTROM",
       "seeAlso": [
@@ -4709,7 +4865,7 @@
       "reference": "./VSL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/VSL-1.0.json",
-      "referenceNumber": "402",
+      "referenceNumber": "414",
       "name": "Vovida Software License v1.0",
       "licenseId": "VSL-1.0",
       "seeAlso": [
@@ -4722,7 +4878,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Vim.json",
-      "referenceNumber": "213",
+      "referenceNumber": "221",
       "name": "Vim License",
       "licenseId": "Vim",
       "seeAlso": [
@@ -4735,7 +4891,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/W3C.json",
-      "referenceNumber": "111",
+      "referenceNumber": "113",
       "name": "W3C Software Notice and License (2002-12-31)",
       "licenseId": "W3C",
       "seeAlso": [
@@ -4748,7 +4904,7 @@
       "reference": "./W3C-19980720.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/W3C-19980720.json",
-      "referenceNumber": "276",
+      "referenceNumber": "285",
       "name": "W3C Software Notice and License (1998-07-20)",
       "licenseId": "W3C-19980720",
       "seeAlso": [
@@ -4760,7 +4916,7 @@
       "reference": "./W3C-20150513.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/W3C-20150513.json",
-      "referenceNumber": "115",
+      "referenceNumber": "117",
       "name": "W3C Software Notice and Document License (2015-05-13)",
       "licenseId": "W3C-20150513",
       "seeAlso": [
@@ -4773,7 +4929,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/WTFPL.json",
-      "referenceNumber": "20",
+      "referenceNumber": "21",
       "name": "Do What The F*ck You Want To Public License",
       "licenseId": "WTFPL",
       "seeAlso": [
@@ -4786,7 +4942,7 @@
       "reference": "./Watcom-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Watcom-1.0.json",
-      "referenceNumber": "146",
+      "referenceNumber": "148",
       "name": "Sybase Open Watcom Public License 1.0",
       "licenseId": "Watcom-1.0",
       "seeAlso": [
@@ -4798,7 +4954,7 @@
       "reference": "./Wsuipa.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Wsuipa.json",
-      "referenceNumber": "264",
+      "referenceNumber": "273",
       "name": "Wsuipa License",
       "licenseId": "Wsuipa",
       "seeAlso": [
@@ -4811,7 +4967,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/X11.json",
-      "referenceNumber": "103",
+      "referenceNumber": "105",
       "name": "X11 License",
       "licenseId": "X11",
       "seeAlso": [
@@ -4824,7 +4980,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/XFree86-1.1.json",
-      "referenceNumber": "161",
+      "referenceNumber": "163",
       "name": "XFree86 License 1.1",
       "licenseId": "XFree86-1.1",
       "seeAlso": [
@@ -4836,7 +4992,7 @@
       "reference": "./XSkat.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/XSkat.json",
-      "referenceNumber": "85",
+      "referenceNumber": "87",
       "name": "XSkat License",
       "licenseId": "XSkat",
       "seeAlso": [
@@ -4848,7 +5004,7 @@
       "reference": "./Xerox.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Xerox.json",
-      "referenceNumber": "232",
+      "referenceNumber": "240",
       "name": "Xerox License",
       "licenseId": "Xerox",
       "seeAlso": [
@@ -4860,7 +5016,7 @@
       "reference": "./Xnet.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Xnet.json",
-      "referenceNumber": "324",
+      "referenceNumber": "335",
       "name": "X.Net License",
       "licenseId": "Xnet",
       "seeAlso": [
@@ -4872,7 +5028,7 @@
       "reference": "./YPL-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/YPL-1.0.json",
-      "referenceNumber": "303",
+      "referenceNumber": "312",
       "name": "Yahoo! Public License v1.0",
       "licenseId": "YPL-1.0",
       "seeAlso": [
@@ -4885,7 +5041,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/YPL-1.1.json",
-      "referenceNumber": "40",
+      "referenceNumber": "41",
       "name": "Yahoo! Public License v1.1",
       "licenseId": "YPL-1.1",
       "seeAlso": [
@@ -4897,7 +5053,7 @@
       "reference": "./ZPL-1.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/ZPL-1.1.json",
-      "referenceNumber": "89",
+      "referenceNumber": "91",
       "name": "Zope Public License 1.1",
       "licenseId": "ZPL-1.1",
       "seeAlso": [
@@ -4910,7 +5066,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/ZPL-2.0.json",
-      "referenceNumber": "116",
+      "referenceNumber": "118",
       "name": "Zope Public License 2.0",
       "licenseId": "ZPL-2.0",
       "seeAlso": [
@@ -4924,7 +5080,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/ZPL-2.1.json",
-      "referenceNumber": "380",
+      "referenceNumber": "392",
       "name": "Zope Public License 2.1",
       "licenseId": "ZPL-2.1",
       "seeAlso": [
@@ -4936,7 +5092,7 @@
       "reference": "./Zed.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Zed.json",
-      "referenceNumber": "118",
+      "referenceNumber": "120",
       "name": "Zed License",
       "licenseId": "Zed",
       "seeAlso": [
@@ -4949,7 +5105,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Zend-2.0.json",
-      "referenceNumber": "385",
+      "referenceNumber": "397",
       "name": "Zend License v2.0",
       "licenseId": "Zend-2.0",
       "seeAlso": [
@@ -4962,7 +5118,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Zimbra-1.3.json",
-      "referenceNumber": "181",
+      "referenceNumber": "186",
       "name": "Zimbra Public License v1.3",
       "licenseId": "Zimbra-1.3",
       "seeAlso": [
@@ -4974,7 +5130,7 @@
       "reference": "./Zimbra-1.4.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/Zimbra-1.4.json",
-      "referenceNumber": "397",
+      "referenceNumber": "409",
       "name": "Zimbra Public License v1.4",
       "licenseId": "Zimbra-1.4",
       "seeAlso": [
@@ -4987,7 +5143,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/Zlib.json",
-      "referenceNumber": "45",
+      "referenceNumber": "46",
       "name": "zlib License",
       "licenseId": "Zlib",
       "seeAlso": [
@@ -5000,7 +5156,7 @@
       "reference": "./blessing.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/blessing.json",
-      "referenceNumber": "312",
+      "referenceNumber": "323",
       "name": "SQLite Blessing",
       "licenseId": "blessing",
       "seeAlso": [
@@ -5013,7 +5169,7 @@
       "reference": "./bzip2-1.0.5.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/bzip2-1.0.5.json",
-      "referenceNumber": "193",
+      "referenceNumber": "199",
       "name": "bzip2 and libbzip2 License v1.0.5",
       "licenseId": "bzip2-1.0.5",
       "seeAlso": [
@@ -5026,7 +5182,7 @@
       "reference": "./bzip2-1.0.6.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/bzip2-1.0.6.json",
-      "referenceNumber": "72",
+      "referenceNumber": "73",
       "name": "bzip2 and libbzip2 License v1.0.6",
       "licenseId": "bzip2-1.0.6",
       "seeAlso": [
@@ -5039,7 +5195,7 @@
       "reference": "./copyleft-next-0.3.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/copyleft-next-0.3.0.json",
-      "referenceNumber": "323",
+      "referenceNumber": "334",
       "name": "copyleft-next 0.3.0",
       "licenseId": "copyleft-next-0.3.0",
       "seeAlso": [
@@ -5051,7 +5207,7 @@
       "reference": "./copyleft-next-0.3.1.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/copyleft-next-0.3.1.json",
-      "referenceNumber": "390",
+      "referenceNumber": "402",
       "name": "copyleft-next 0.3.1",
       "licenseId": "copyleft-next-0.3.1",
       "seeAlso": [
@@ -5063,7 +5219,7 @@
       "reference": "./curl.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/curl.json",
-      "referenceNumber": "325",
+      "referenceNumber": "336",
       "name": "curl License",
       "licenseId": "curl",
       "seeAlso": [
@@ -5075,7 +5231,7 @@
       "reference": "./diffmark.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/diffmark.json",
-      "referenceNumber": "410",
+      "referenceNumber": "423",
       "name": "diffmark license",
       "licenseId": "diffmark",
       "seeAlso": [
@@ -5087,7 +5243,7 @@
       "reference": "./dvipdfm.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/dvipdfm.json",
-      "referenceNumber": "19",
+      "referenceNumber": "20",
       "name": "dvipdfm License",
       "licenseId": "dvipdfm",
       "seeAlso": [
@@ -5100,7 +5256,7 @@
       "isDeprecatedLicenseId": true,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/eCos-2.0.json",
-      "referenceNumber": "282",
+      "referenceNumber": "291",
       "name": "eCos license version 2.0",
       "licenseId": "eCos-2.0",
       "seeAlso": [
@@ -5112,7 +5268,7 @@
       "reference": "./eGenix.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/eGenix.json",
-      "referenceNumber": "221",
+      "referenceNumber": "229",
       "name": "eGenix.com Public License 1.1.0",
       "licenseId": "eGenix",
       "seeAlso": [
@@ -5125,7 +5281,7 @@
       "reference": "./etalab-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/etalab-2.0.json",
-      "referenceNumber": "269",
+      "referenceNumber": "278",
       "name": "Etalab Open License 2.0",
       "licenseId": "etalab-2.0",
       "seeAlso": [
@@ -5138,7 +5294,7 @@
       "reference": "./gSOAP-1.3b.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/gSOAP-1.3b.json",
-      "referenceNumber": "173",
+      "referenceNumber": "176",
       "name": "gSOAP Public License v1.3b",
       "licenseId": "gSOAP-1.3b",
       "seeAlso": [
@@ -5151,7 +5307,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/gnuplot.json",
-      "referenceNumber": "395",
+      "referenceNumber": "407",
       "name": "gnuplot License",
       "licenseId": "gnuplot",
       "seeAlso": [
@@ -5164,7 +5320,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/iMatix.json",
-      "referenceNumber": "183",
+      "referenceNumber": "188",
       "name": "iMatix Standard Function Library Agreement",
       "licenseId": "iMatix",
       "seeAlso": [
@@ -5176,7 +5332,7 @@
       "reference": "./libpng-2.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/libpng-2.0.json",
-      "referenceNumber": "107",
+      "referenceNumber": "109",
       "name": "PNG Reference Library version 2",
       "licenseId": "libpng-2.0",
       "seeAlso": [
@@ -5188,7 +5344,7 @@
       "reference": "./libselinux-1.0.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/libselinux-1.0.json",
-      "referenceNumber": "18",
+      "referenceNumber": "19",
       "name": "libselinux public domain notice",
       "licenseId": "libselinux-1.0",
       "seeAlso": [
@@ -5200,7 +5356,7 @@
       "reference": "./libtiff.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/libtiff.json",
-      "referenceNumber": "420",
+      "referenceNumber": "433",
       "name": "libtiff License",
       "licenseId": "libtiff",
       "seeAlso": [
@@ -5212,7 +5368,7 @@
       "reference": "./mpich2.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/mpich2.json",
-      "referenceNumber": "63",
+      "referenceNumber": "64",
       "name": "mpich2 License",
       "licenseId": "mpich2",
       "seeAlso": [
@@ -5224,7 +5380,7 @@
       "reference": "./psfrag.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/psfrag.json",
-      "referenceNumber": "421",
+      "referenceNumber": "434",
       "name": "psfrag License",
       "licenseId": "psfrag",
       "seeAlso": [
@@ -5236,7 +5392,7 @@
       "reference": "./psutils.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/psutils.json",
-      "referenceNumber": "287",
+      "referenceNumber": "296",
       "name": "psutils License",
       "licenseId": "psutils",
       "seeAlso": [
@@ -5248,7 +5404,7 @@
       "reference": "./wxWindows.html",
       "isDeprecatedLicenseId": true,
       "detailsUrl": "http://spdx.org/licenses/wxWindows.json",
-      "referenceNumber": "252",
+      "referenceNumber": "261",
       "name": "wxWindows Library License",
       "licenseId": "wxWindows",
       "seeAlso": [
@@ -5261,7 +5417,7 @@
       "isDeprecatedLicenseId": false,
       "isFsfLibre": true,
       "detailsUrl": "http://spdx.org/licenses/xinetd.json",
-      "referenceNumber": "412",
+      "referenceNumber": "425",
       "name": "xinetd License",
       "licenseId": "xinetd",
       "seeAlso": [
@@ -5273,7 +5429,7 @@
       "reference": "./xpp.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/xpp.json",
-      "referenceNumber": "100",
+      "referenceNumber": "102",
       "name": "XPP License",
       "licenseId": "xpp",
       "seeAlso": [
@@ -5285,7 +5441,7 @@
       "reference": "./zlib-acknowledgement.html",
       "isDeprecatedLicenseId": false,
       "detailsUrl": "http://spdx.org/licenses/zlib-acknowledgement.json",
-      "referenceNumber": "254",
+      "referenceNumber": "263",
       "name": "zlib/libpng License with Acknowledgement",
       "licenseId": "zlib-acknowledgement",
       "seeAlso": [
@@ -5294,5 +5450,5 @@
       "isOsiApproved": false
     }
   ],
-  "releaseDate": "2020-06-18"
+  "releaseDate": "2020-07-02"
 }
\ No newline at end of file

From 26d7dd7c186b46a5253dd98d82ecbcd061bf5113 Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Thu, 2 Jul 2020 15:04:55 -0400
Subject: [PATCH 115/149] uninstall: remove tests

---
 Library/Homebrew/test/cmd/uninstall_spec.rb | 35 ---------------------
 1 file changed, 35 deletions(-)

diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb
index bc29f1be99..696be790e3 100644
--- a/Library/Homebrew/test/cmd/uninstall_spec.rb
+++ b/Library/Homebrew/test/cmd/uninstall_spec.rb
@@ -19,41 +19,6 @@ describe "brew uninstall", :integration_test do
   end
 end
 
-describe "brew uninstall cask", :integration_test, :needs_macos do
-  it "uninstalls a given Cask" do
-    caffeine = Cask::CaskLoader.load(cask_path("local-caffeine"))
-    Cask::Installer.new(caffeine).install
-
-    expect { brew "uninstall", "local-caffeine" }
-      .to output(/Uninstalling Cask local-caffeine/).to_stdout
-      .and not_to_output.to_stderr
-      .and be_a_success
-
-    expect(caffeine).not_to be_installed
-
-    rm_r(TEST_TMPDIR + "/cask-appdir")
-  end
-
-  it "uninstalls given Formulae and Casks" do
-    install_test_formula "testball"
-
-    caffeine = Cask::CaskLoader.load(cask_path("local-caffeine"))
-    Cask::Installer.new(caffeine).install
-
-    expect { brew "uninstall", "testball", "local-caffeine" }
-      .to output(%r{
-        Uninstalling\s#{TEST_TMPDIR}/cellar/testball/.*\n
-        ==>\sUninstalling\sCask\slocal-caffeine
-      }x).to_stdout
-      .and not_to_output.to_stderr
-      .and be_a_success
-
-    expect(caffeine).not_to be_installed
-
-    rm_r(TEST_TMPDIR + "/cask-appdir")
-  end
-end
-
 describe Homebrew do
   let(:dependency) { formula("dependency") { url "f-1" } }
   let(:dependent) do

From 5fe38ad7a0d8ff49701d418c45e71f08b158de1b Mon Sep 17 00:00:00 2001
From: vidusheeamoli 
Date: Fri, 3 Jul 2020 00:44:54 +0530
Subject: [PATCH 116/149] srb: set utils files to true

Set utils/bottles.rb, utils/shell.rb and utils/svn.rb to true so that
type errors in these files may be reported by Sorbet

(cherry picked from commit fd3db131b0da78169fdff2031180a2bebe3cbb84)
---
 Library/Homebrew/sorbet/files.yaml          |  6 ++--
 Library/Homebrew/sorbet/rbi/utils/shell.rbi | 38 +++++++++++++++++++++
 Library/Homebrew/sorbet/rbi/utils/utils.rbi |  8 +++++
 3 files changed, 49 insertions(+), 3 deletions(-)
 create mode 100644 Library/Homebrew/sorbet/rbi/utils/shell.rbi
 create mode 100644 Library/Homebrew/sorbet/rbi/utils/utils.rbi

diff --git a/Library/Homebrew/sorbet/files.yaml b/Library/Homebrew/sorbet/files.yaml
index 50900c4005..73b633f293 100644
--- a/Library/Homebrew/sorbet/files.yaml
+++ b/Library/Homebrew/sorbet/files.yaml
@@ -445,7 +445,6 @@ false:
   - ./unpack_strategy/zip.rb
   - ./utils.rb
   - ./utils/analytics.rb
-  - ./utils/bottles.rb
   - ./utils/curl.rb
   - ./utils/fork.rb
   - ./utils/formatter.rb
@@ -847,8 +846,6 @@ false:
   - ./utils/inreplace.rb
   - ./utils/link.rb
   - ./utils/shebang.rb
-  - ./utils/shell.rb
-  - ./utils/svn.rb
   - ./version.rb
 
 true:
@@ -888,6 +885,9 @@ true:
   - ./tap_constants.rb
   - ./test/support/helper/fixtures.rb
   - ./test/support/lib/config.rb
+  - ./utils/bottles.rb
+  - ./utils/shell.rb
+  - ./utils/svn.rb
   - ./utils/tty.rb
   - ./version/null.rb
 
diff --git a/Library/Homebrew/sorbet/rbi/utils/shell.rbi b/Library/Homebrew/sorbet/rbi/utils/shell.rbi
new file mode 100644
index 0000000000..f4a3507bd8
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/utils/shell.rbi
@@ -0,0 +1,38 @@
+# typed: strict
+
+module Utils::Shell
+  include Kernel
+
+  sig{ params(path: String).returns(T.nilable(Symbol)) }
+  def from_path(path)
+  end
+
+  sig{ returns(T.nilable(Symbol)) }
+  def preferred
+  end
+
+  def parent
+  end
+
+  def export_value(key, value, shell = preferred)
+  end
+
+  sig{ returns(String) }
+  def profile
+  end
+
+  def set_variable_in_profile(variable, value)
+  end
+
+  sig{ params(path: String).returns(T.nilable(String)) }
+  def prepend_path_in_profile(path)
+  end
+
+  sig{ params(str: String).returns(T.nilable(String)) }
+  def csh_quote(str)
+  end
+
+  sig{ params(str: String).returns(T.nilable(String)) }
+  def sh_quote(str)
+  end
+end
diff --git a/Library/Homebrew/sorbet/rbi/utils/utils.rbi b/Library/Homebrew/sorbet/rbi/utils/utils.rbi
new file mode 100644
index 0000000000..f015d7204d
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/utils/utils.rbi
@@ -0,0 +1,8 @@
+# typed: strict
+
+module Utils
+  include Kernel
+
+  class Bottles
+  end
+end

From eb1ea006f2551b4fb562608e96debf5fb287e5b6 Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Thu, 2 Jul 2020 15:28:41 -0400
Subject: [PATCH 117/149] uninstall: Refactor  when using --force

---
 Library/Homebrew/cmd/uninstall.rb | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb
index 1764b6eb69..a4a81a4421 100644
--- a/Library/Homebrew/cmd/uninstall.rb
+++ b/Library/Homebrew/cmd/uninstall.rb
@@ -34,20 +34,21 @@ module Homebrew
 
     if args.force?
       casks = []
-      kegs_by_rack = Hash[args.named.map do |name|
+      kegs_by_rack = Hash.new
+
+      args.named.each do |name|
         rack = Formulary.to_rack(name)
 
-        unless rack.directory?
+        if rack.directory?
+          kegs_by_rack[rack] = rack.subdirs.map { |d| Keg.new(d) }
+        else
           begin
             casks << Cask::CaskLoader.load(name)
           rescue Cask::CaskUnavailableError
             # Since the uninstall was forced, ignore any unavailable casks
           end
-          next
         end
-
-        [rack, rack.subdirs.map { |d| Keg.new(d) }]
-      end]
+      end
     else
       all_kegs, casks = args.kegs_casks
       kegs_by_rack = all_kegs.group_by(&:rack)

From 1826be81f2202fddfe51846a0639f7ddd88ea258 Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Thu, 2 Jul 2020 15:29:58 -0400
Subject: [PATCH 118/149] style: Replace Hash.new with {}

---
 Library/Homebrew/.idea/.gitignore             |    8 +
 Library/Homebrew/.idea/Homebrew.iml           | 1087 +++++++++++++++++
 .../.idea/codeStyles/codeStyleConfig.xml      |    5 +
 .../inspectionProfiles/Project_Default.xml    |    6 +
 Library/Homebrew/.idea/misc.xml               |    7 +
 Library/Homebrew/.idea/modules.xml            |    8 +
 Library/Homebrew/.idea/vcs.xml                |    6 +
 Library/Homebrew/cmd/uninstall.rb             |    2 +-
 8 files changed, 1128 insertions(+), 1 deletion(-)
 create mode 100644 Library/Homebrew/.idea/.gitignore
 create mode 100644 Library/Homebrew/.idea/Homebrew.iml
 create mode 100644 Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml
 create mode 100644 Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml
 create mode 100644 Library/Homebrew/.idea/misc.xml
 create mode 100644 Library/Homebrew/.idea/modules.xml
 create mode 100644 Library/Homebrew/.idea/vcs.xml

diff --git a/Library/Homebrew/.idea/.gitignore b/Library/Homebrew/.idea/.gitignore
new file mode 100644
index 0000000000..73f69e0958
--- /dev/null
+++ b/Library/Homebrew/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/Library/Homebrew/.idea/Homebrew.iml b/Library/Homebrew/.idea/Homebrew.iml
new file mode 100644
index 0000000000..ff55e88eb7
--- /dev/null
+++ b/Library/Homebrew/.idea/Homebrew.iml
@@ -0,0 +1,1087 @@
+
+
+  
+    
+  
+  
+    
+      
+      
+      
+      
+    
+    
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+          
+        
+        
+          
+          
+          
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+          
+        
+        
+          
+          
+          
+        
+        
+          
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+          
+        
+        
+          
+          
+        
+        
+          
+        
+      
+    
+    
+      
+        
+          
+        
+          
+        
+        
+          
+        
+      
+    
+    
+  
+
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml b/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000000..a55e7a179b
--- /dev/null
+++ b/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+  
+    
+
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml b/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000..b0db9b0fca
--- /dev/null
+++ b/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+  
+    
+
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/misc.xml b/Library/Homebrew/.idea/misc.xml
new file mode 100644
index 0000000000..da55c2a4c8
--- /dev/null
+++ b/Library/Homebrew/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+  
+    
+  
+
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/modules.xml b/Library/Homebrew/.idea/modules.xml
new file mode 100644
index 0000000000..d6b4e03f57
--- /dev/null
+++ b/Library/Homebrew/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+  
+    
+      
+    
+  
+
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/vcs.xml b/Library/Homebrew/.idea/vcs.xml
new file mode 100644
index 0000000000..b2bdec2d71
--- /dev/null
+++ b/Library/Homebrew/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+  
+    
+  
+
\ No newline at end of file
diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb
index a4a81a4421..ad5f823dbf 100644
--- a/Library/Homebrew/cmd/uninstall.rb
+++ b/Library/Homebrew/cmd/uninstall.rb
@@ -34,7 +34,7 @@ module Homebrew
 
     if args.force?
       casks = []
-      kegs_by_rack = Hash.new
+      kegs_by_rack = {}
 
       args.named.each do |name|
         rack = Formulary.to_rack(name)

From 71171f9cb0e3a63bdf104dde77b1bf3f0e96dd05 Mon Sep 17 00:00:00 2001
From: Markus Reiter 
Date: Fri, 3 Jul 2020 04:35:42 +0200
Subject: [PATCH 119/149] Use `atomic_write` instead of deleting and writing
 file.

---
 Library/Homebrew/commands.rb | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/Library/Homebrew/commands.rb b/Library/Homebrew/commands.rb
index cf91bafa60..02fc3d5e05 100644
--- a/Library/Homebrew/commands.rb
+++ b/Library/Homebrew/commands.rb
@@ -148,8 +148,7 @@ module Commands
     cmds = internal_commands + internal_developer_commands + internal_commands_aliases
 
     file = HOMEBREW_REPOSITORY/"completions/internal_commands_list.txt"
-    file.delete if file.exist?
-    file.write(cmds.sort.join("\n") + "\n")
+    file.atomic_write(cmds.sort.join("\n") + "\n")
   end
 
   def rebuild_commands_completion_list
@@ -157,7 +156,6 @@ module Commands
     HOMEBREW_CACHE.mkpath
 
     file = HOMEBREW_CACHE/"all_commands_list.txt"
-    file.delete if file.exist?
-    file.write(commands(aliases: true).sort.join("\n") + "\n")
+    file.atomic_write(commands(aliases: true).sort.join("\n") + "\n")
   end
 end

From 3fb00315e7d15fac496c2922c49bab885f65a521 Mon Sep 17 00:00:00 2001
From: vidusheeamoli 
Date: Thu, 2 Jul 2020 20:06:47 +0530
Subject: [PATCH 120/149] sorbet/files.yaml: add new files

---
 Library/Homebrew/sorbet/files.yaml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/Library/Homebrew/sorbet/files.yaml b/Library/Homebrew/sorbet/files.yaml
index 73b633f293..5e77ba3aca 100644
--- a/Library/Homebrew/sorbet/files.yaml
+++ b/Library/Homebrew/sorbet/files.yaml
@@ -168,6 +168,7 @@ false:
   - ./dev-cmd/test.rb
   - ./dev-cmd/tests.rb
   - ./dev-cmd/unpack.rb
+  - ./dev-cmd/update-license-data.rb
   - ./dev-cmd/update-test.rb
   - ./dev-cmd/vendor-gems.rb
   - ./development_tools.rb
@@ -185,6 +186,7 @@ false:
   - ./extend/os/linux/hardware/cpu.rb
   - ./extend/os/linux/install.rb
   - ./extend/os/linux/keg_relocate.rb
+  - ./extend/os/linux/readall.rb
   - ./extend/os/linux/requirements/osxfuse_requirement.rb
   - ./extend/os/linux/system_config.rb
   - ./extend/os/linux/tap.rb
@@ -348,6 +350,7 @@ false:
   - ./test/dev-cmd/audit_spec.rb
   - ./test/dev-cmd/create_spec.rb
   - ./test/dev-cmd/extract_spec.rb
+  - ./test/dev-cmd/update-license-data_spec.rb
   - ./test/diagnostic_checks_spec.rb
   - ./test/download_strategies_spec.rb
   - ./test/error_during_execution_spec.rb
@@ -443,6 +446,7 @@ false:
   - ./unpack_strategy/xar.rb
   - ./unpack_strategy/xz.rb
   - ./unpack_strategy/zip.rb
+  - ./upgrade.rb
   - ./utils.rb
   - ./utils/analytics.rb
   - ./utils/curl.rb
@@ -920,6 +924,7 @@ strict:
   - ./extend/os/mac/formula_support.rb
   - ./extend/os/missing_formula.rb
   - ./extend/os/pathname.rb
+  - ./extend/os/readall.rb
   - ./extend/os/requirements/java_requirement.rb
   - ./extend/os/requirements/osxfuse_requirement.rb
   - ./extend/os/requirements/x11_requirement.rb

From 59abfed56d65aac8d7d028a8431a1c5a5f3cfd47 Mon Sep 17 00:00:00 2001
From: vidusheeamoli 
Date: Thu, 2 Jul 2020 22:52:25 +0530
Subject: [PATCH 121/149] srb/tapioca: update rbi of recently bumped gems

---
 .gitignore                                                  | 1 +
 .../rbi/gems/{diff-lcs@1.4.2.rbi => codecov@0.1.17.rbi}     | 0
 .../rbi/gems/{coveralls@0.8.23.rbi => diff-lcs@1.4.4.rbi}   | 2 +-
 ...{simplecov-html@0.10.2.rbi => simplecov-html@0.12.2.rbi} | 2 +-
 .../rbi/gems/{simplecov@0.16.1.rbi => simplecov@0.18.5.rbi} | 2 +-
 Library/Homebrew/sorbet/rbi/gems/term-ansicolor@1.7.1.rbi   | 6 ------
 Library/Homebrew/sorbet/rbi/gems/tins@1.25.0.rbi            | 6 ------
 .../sorbet/rbi/gems/{sync@0.5.0.rbi => url@0.3.2.rbi}       | 2 +-
 8 files changed, 5 insertions(+), 16 deletions(-)
 rename Library/Homebrew/sorbet/rbi/gems/{diff-lcs@1.4.2.rbi => codecov@0.1.17.rbi} (100%)
 rename Library/Homebrew/sorbet/rbi/gems/{coveralls@0.8.23.rbi => diff-lcs@1.4.4.rbi} (73%)
 rename Library/Homebrew/sorbet/rbi/gems/{simplecov-html@0.10.2.rbi => simplecov-html@0.12.2.rbi} (73%)
 rename Library/Homebrew/sorbet/rbi/gems/{simplecov@0.16.1.rbi => simplecov@0.18.5.rbi} (73%)
 delete mode 100644 Library/Homebrew/sorbet/rbi/gems/term-ansicolor@1.7.1.rbi
 delete mode 100644 Library/Homebrew/sorbet/rbi/gems/tins@1.25.0.rbi
 rename Library/Homebrew/sorbet/rbi/gems/{sync@0.5.0.rbi => url@0.3.2.rbi} (73%)

diff --git a/.gitignore b/.gitignore
index d666489d95..f89cb97537 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,6 +128,7 @@
 **/vendor/bundle/ruby/*/gems/ruby-progressbar-*/
 **/vendor/bundle/ruby/*/gems/simplecov-*/
 **/vendor/bundle/ruby/*/gems/simplecov-html-*/
+**/vendor/bundle/ruby/*/gems/thor-*/
 **/vendor/bundle/ruby/*/gems/url-*/
 **/vendor/bundle/ruby/*/gems/unf_ext-*/
 **/vendor/bundle/ruby/*/gems/unf-*/
diff --git a/Library/Homebrew/sorbet/rbi/gems/diff-lcs@1.4.2.rbi b/Library/Homebrew/sorbet/rbi/gems/codecov@0.1.17.rbi
similarity index 100%
rename from Library/Homebrew/sorbet/rbi/gems/diff-lcs@1.4.2.rbi
rename to Library/Homebrew/sorbet/rbi/gems/codecov@0.1.17.rbi
diff --git a/Library/Homebrew/sorbet/rbi/gems/coveralls@0.8.23.rbi b/Library/Homebrew/sorbet/rbi/gems/diff-lcs@1.4.4.rbi
similarity index 73%
rename from Library/Homebrew/sorbet/rbi/gems/coveralls@0.8.23.rbi
rename to Library/Homebrew/sorbet/rbi/gems/diff-lcs@1.4.4.rbi
index 27b1fb4bc6..198c6b42fc 100644
--- a/Library/Homebrew/sorbet/rbi/gems/coveralls@0.8.23.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/diff-lcs@1.4.4.rbi
@@ -1,5 +1,5 @@
 # This file is autogenerated. Do not edit it by hand. Regenerate it with:
-#   tapioca sync
+#   tapioca sync --exclude json
 
 # typed: true
 
diff --git a/Library/Homebrew/sorbet/rbi/gems/simplecov-html@0.10.2.rbi b/Library/Homebrew/sorbet/rbi/gems/simplecov-html@0.12.2.rbi
similarity index 73%
rename from Library/Homebrew/sorbet/rbi/gems/simplecov-html@0.10.2.rbi
rename to Library/Homebrew/sorbet/rbi/gems/simplecov-html@0.12.2.rbi
index 27b1fb4bc6..198c6b42fc 100644
--- a/Library/Homebrew/sorbet/rbi/gems/simplecov-html@0.10.2.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/simplecov-html@0.12.2.rbi
@@ -1,5 +1,5 @@
 # This file is autogenerated. Do not edit it by hand. Regenerate it with:
-#   tapioca sync
+#   tapioca sync --exclude json
 
 # typed: true
 
diff --git a/Library/Homebrew/sorbet/rbi/gems/simplecov@0.16.1.rbi b/Library/Homebrew/sorbet/rbi/gems/simplecov@0.18.5.rbi
similarity index 73%
rename from Library/Homebrew/sorbet/rbi/gems/simplecov@0.16.1.rbi
rename to Library/Homebrew/sorbet/rbi/gems/simplecov@0.18.5.rbi
index 27b1fb4bc6..198c6b42fc 100644
--- a/Library/Homebrew/sorbet/rbi/gems/simplecov@0.16.1.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/simplecov@0.18.5.rbi
@@ -1,5 +1,5 @@
 # This file is autogenerated. Do not edit it by hand. Regenerate it with:
-#   tapioca sync
+#   tapioca sync --exclude json
 
 # typed: true
 
diff --git a/Library/Homebrew/sorbet/rbi/gems/term-ansicolor@1.7.1.rbi b/Library/Homebrew/sorbet/rbi/gems/term-ansicolor@1.7.1.rbi
deleted file mode 100644
index 27b1fb4bc6..0000000000
--- a/Library/Homebrew/sorbet/rbi/gems/term-ansicolor@1.7.1.rbi
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is autogenerated. Do not edit it by hand. Regenerate it with:
-#   tapioca sync
-
-# typed: true
-
-
diff --git a/Library/Homebrew/sorbet/rbi/gems/tins@1.25.0.rbi b/Library/Homebrew/sorbet/rbi/gems/tins@1.25.0.rbi
deleted file mode 100644
index 27b1fb4bc6..0000000000
--- a/Library/Homebrew/sorbet/rbi/gems/tins@1.25.0.rbi
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is autogenerated. Do not edit it by hand. Regenerate it with:
-#   tapioca sync
-
-# typed: true
-
-
diff --git a/Library/Homebrew/sorbet/rbi/gems/sync@0.5.0.rbi b/Library/Homebrew/sorbet/rbi/gems/url@0.3.2.rbi
similarity index 73%
rename from Library/Homebrew/sorbet/rbi/gems/sync@0.5.0.rbi
rename to Library/Homebrew/sorbet/rbi/gems/url@0.3.2.rbi
index 27b1fb4bc6..198c6b42fc 100644
--- a/Library/Homebrew/sorbet/rbi/gems/sync@0.5.0.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/url@0.3.2.rbi
@@ -1,5 +1,5 @@
 # This file is autogenerated. Do not edit it by hand. Regenerate it with:
-#   tapioca sync
+#   tapioca sync --exclude json
 
 # typed: true
 

From eef039ff419337b3cfd3f879d938482d193777d1 Mon Sep 17 00:00:00 2001
From: vidusheeamoli 
Date: Thu, 2 Jul 2020 22:54:44 +0530
Subject: [PATCH 122/149] sorbet: update hidden definitions

---
 .../sorbet/rbi/hidden-definitions/hidden.rbi  | 2396 +++--------------
 1 file changed, 436 insertions(+), 1960 deletions(-)

diff --git a/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi b/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi
index 0d2d80448f..ba8e394202 100644
--- a/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi
+++ b/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi
@@ -6272,165 +6272,6 @@ module CopHelper
   extend ::RSpec::Its
 end
 
-module Coveralls
-  def noisy(); end
-
-  def noisy=(noisy); end
-
-  def noisy?(); end
-
-  def push!(); end
-
-  def run_locally(); end
-
-  def run_locally=(run_locally); end
-
-  def setup!(); end
-
-  def should_run?(); end
-
-  def start!(simplecov_setting=T.unsafe(nil), &block); end
-
-  def testing(); end
-
-  def testing=(testing); end
-
-  def wear!(simplecov_setting=T.unsafe(nil), &block); end
-
-  def wear_merged!(simplecov_setting=T.unsafe(nil), &block); end
-
-  def will_run?(); end
-  VERSION = ::T.let(nil, ::T.untyped)
-end
-
-class Coveralls::API
-  API_BASE = ::T.let(nil, ::T.untyped)
-  API_DOMAIN = ::T.let(nil, ::T.untyped)
-  API_HOST = ::T.let(nil, ::T.untyped)
-  API_PROTOCOL = ::T.let(nil, ::T.untyped)
-end
-
-class Coveralls::API
-  def self.apified_hash(hash); end
-
-  def self.build_client(uri); end
-
-  def self.build_request(path, hash); end
-
-  def self.build_request_body(hash, boundary); end
-
-  def self.disable_net_blockers!(); end
-
-  def self.endpoint_to_uri(endpoint); end
-
-  def self.hash_to_file(hash); end
-
-  def self.post_json(endpoint, hash); end
-end
-
-module Coveralls::Configuration
-end
-
-module Coveralls::Configuration
-  def self.configuration(); end
-
-  def self.configuration_path(); end
-
-  def self.git(); end
-
-  def self.pwd(); end
-
-  def self.rails_root(); end
-
-  def self.relevant_env(); end
-
-  def self.root(); end
-
-  def self.set_service_params_for_appveyor(config); end
-
-  def self.set_service_params_for_circleci(config); end
-
-  def self.set_service_params_for_coveralls_local(config); end
-
-  def self.set_service_params_for_gitlab(config); end
-
-  def self.set_service_params_for_jenkins(config); end
-
-  def self.set_service_params_for_semaphore(config); end
-
-  def self.set_service_params_for_tddium(config); end
-
-  def self.set_service_params_for_travis(config, service_name); end
-
-  def self.set_standard_service_params_for_generic_ci(config); end
-
-  def self.simplecov_root(); end
-
-  def self.yaml_config(); end
-end
-
-class Coveralls::NilFormatter
-  def format(result); end
-end
-
-class Coveralls::NilFormatter
-end
-
-module Coveralls::Output
-  def format(string, options=T.unsafe(nil)); end
-
-  def no_color(); end
-
-  def no_color=(no_color); end
-
-  def no_color?(); end
-
-  def output(); end
-
-  def output=(output); end
-
-  def print(string, options=T.unsafe(nil)); end
-
-  def puts(string, options=T.unsafe(nil)); end
-
-  def silent(); end
-
-  def silent=(silent); end
-
-  def silent?(); end
-end
-
-module Coveralls::Output
-  extend ::Coveralls::Output
-end
-
-module Coveralls::SimpleCov
-end
-
-class Coveralls::SimpleCov::Formatter
-  def display_error(e); end
-
-  def display_result(result); end
-
-  def format(result); end
-
-  def get_source_files(result); end
-
-  def output_message(result); end
-
-  def short_filename(filename); end
-end
-
-class Coveralls::SimpleCov::Formatter
-end
-
-module Coveralls::SimpleCov
-end
-
-module Coveralls
-  extend ::Coveralls
-end
-
 class DRb::DRbArray
   def _dump(lv); end
 end
@@ -6620,8 +6461,6 @@ DRbObject = DRb::DRbObject
 
 DRbUndumped = DRb::DRbUndumped
 
-DSLKit = Tins
-
 class Date
   include ::DateAndTime::Zones
   include ::DateAndTime::Calculations
@@ -7034,10 +6873,6 @@ class Enumerator::Generator
   def initialize(*_); end
 end
 
-class Errno::EACCES
-  include ::Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
 class Errno::EAUTH
   Errno = ::T.let(nil, ::T.untyped)
 end
@@ -7102,14 +6937,6 @@ end
 class Errno::ELAST
 end
 
-class Errno::ELOOP
-  include ::Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
-class Errno::ENAMETOOLONG
-  include ::Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
 class Errno::ENEEDAUTH
   Errno = ::T.let(nil, ::T.untyped)
 end
@@ -7124,10 +6951,6 @@ end
 class Errno::ENOATTR
 end
 
-class Errno::ENOENT
-  include ::Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
 class Errno::ENOPOLICY
   Errno = ::T.let(nil, ::T.untyped)
 end
@@ -7137,10 +6960,6 @@ end
 
 Errno::ENOTCAPABLE = Errno::NOERROR
 
-class Errno::ENOTDIR
-  include ::Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
 class Errno::ENOTSUP
   Errno = ::T.let(nil, ::T.untyped)
 end
@@ -12529,7 +12348,6 @@ end
 
 class Module
   include ::ActiveSupport::Dependencies::ModuleConstMissing
-  include ::Tins::Memoize::CacheMethods
   def alias_attribute(new_name, old_name); end
 
   def anonymous?(); end
@@ -12564,10 +12382,6 @@ class Module
 
   def mattr_writer(*syms, instance_writer: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil)); end
 
-  def memoize_function(*function_ids); end
-
-  def memoize_method(*method_ids); end
-
   def method_visibility(method); end
 
   def module_parent(); end
@@ -13133,8 +12947,6 @@ end
 class Net::HTTPAlreadyReported
 end
 
-Net::HTTPClientError::EXCEPTION_TYPE = Net::HTTPServerException
-
 Net::HTTPClientErrorCode = Net::HTTPClientError
 
 Net::HTTPClientException = Net::HTTPServerException
@@ -13205,8 +13017,6 @@ end
 class Net::HTTPRangeNotSatisfiable
 end
 
-Net::HTTPRedirection::EXCEPTION_TYPE = Net::HTTPRetriableError
-
 Net::HTTPRedirectionCode = Net::HTTPRedirection
 
 class Net::HTTPRequestTimeout
@@ -13222,15 +13032,17 @@ Net::HTTPResponceReceiver = Net::HTTPResponse
 
 Net::HTTPRetriableCode = Net::HTTPRedirection
 
-Net::HTTPServerError::EXCEPTION_TYPE = Net::HTTPFatalError
-
 Net::HTTPServerErrorCode = Net::HTTPServerError
 
 Net::HTTPSession = Net::HTTP
 
-Net::HTTPSuccess::EXCEPTION_TYPE = Net::HTTPError
+class Net::HTTPSuccess
+end
 
-Net::HTTPSuccessCode = Net::HTTPSuccess
+Net::HTTPSuccessCode::EXCEPTION_TYPE = Net::HTTPError
+
+class Net::HTTPSuccess
+end
 
 class Net::HTTPURITooLong
   HAS_BODY = ::T.let(nil, ::T.untyped)
@@ -13346,7 +13158,6 @@ class Object
   include ::ActiveSupport::Dependencies::Loadable
   include ::ActiveSupport::Tryable
   include ::Minitest::Expectations
-  include ::Tins::Full
   include ::ActiveSupport::ToJsonWithActiveSupportEncoder
   def acts_like?(duck); end
 
@@ -20697,6 +20508,51 @@ end
 class SimpleCov::BlockFilter
 end
 
+module SimpleCov::Combine
+end
+
+module SimpleCov::Combine::BranchesCombiner
+end
+
+module SimpleCov::Combine::BranchesCombiner
+  def self.combine(coverage_a, coverage_b); end
+end
+
+module SimpleCov::Combine::FilesCombiner
+end
+
+module SimpleCov::Combine::FilesCombiner
+  def self.combine(coverage_a, coverage_b); end
+end
+
+module SimpleCov::Combine::LinesCombiner
+end
+
+module SimpleCov::Combine::LinesCombiner
+  def self.combine(coverage_a, coverage_b); end
+
+  def self.merge_line_coverage(first_val, second_val); end
+end
+
+module SimpleCov::Combine::ResultsCombiner
+end
+
+module SimpleCov::Combine::ResultsCombiner
+  def self.combine(*results); end
+
+  def self.combine_file_coverage(coverage_a, coverage_b); end
+
+  def self.combine_result_sets(combined_results, result); end
+end
+
+module SimpleCov::Combine
+  def self.combine(combiner_module, coverage_a, coverage_b); end
+
+  def self.empty_coverage?(coverage_a, coverage_b); end
+
+  def self.existing_coverage(coverage_a, coverage_b); end
+end
+
 module SimpleCov::CommandGuesser
 end
 
@@ -20717,14 +20573,30 @@ module SimpleCov::Configuration
 
   def at_exit(&block); end
 
+  def branch_coverage?(); end
+
+  def branch_coverage_supported?(); end
+
+  def clear_coverage_criteria(); end
+
   def command_name(name=T.unsafe(nil)); end
 
   def configure(&block); end
 
+  def coverage_criteria(); end
+
+  def coverage_criterion(criterion=T.unsafe(nil)); end
+
+  def coverage_criterion_enabled?(criterion); end
+
   def coverage_dir(dir=T.unsafe(nil)); end
 
   def coverage_path(); end
 
+  def coverage_start_arguments_supported?(); end
+
+  def enable_coverage(criterion); end
+
   def filters(); end
 
   def filters=(filters); end
@@ -20751,6 +20623,10 @@ module SimpleCov::Configuration
 
   def nocov_token(nocov_token=T.unsafe(nil)); end
 
+  def print_error_status(); end
+
+  def print_error_status=(print_error_status); end
+
   def profiles(); end
 
   def project_name(new_name=T.unsafe(nil)); end
@@ -20766,11 +20642,31 @@ module SimpleCov::Configuration
   def tracked_files(); end
 
   def use_merging(use=T.unsafe(nil)); end
+  DEFAULT_COVERAGE_CRITERION = ::T.let(nil, ::T.untyped)
+  SUPPORTED_COVERAGE_CRITERIA = ::T.let(nil, ::T.untyped)
 end
 
 module SimpleCov::Configuration
 end
 
+class SimpleCov::CoverageStatistics
+  def covered(); end
+
+  def initialize(covered:, missed:, total_strength: T.unsafe(nil)); end
+
+  def missed(); end
+
+  def percent(); end
+
+  def strength(); end
+
+  def total(); end
+end
+
+class SimpleCov::CoverageStatistics
+  def self.from(coverage_statistics); end
+end
+
 module SimpleCov::ExitCodes
   EXCEPTION = ::T.let(nil, ::T.untyped)
   MAXIMUM_COVERAGE_DROP = ::T.let(nil, ::T.untyped)
@@ -20782,6 +20678,15 @@ module SimpleCov::ExitCodes
 end
 
 class SimpleCov::FileList
+  include ::Enumerable
+  def branch_covered_percent(); end
+
+  def count(*args, &block); end
+
+  def coverage_statistics(); end
+
+  def covered_branches(); end
+
   def covered_lines(); end
 
   def covered_percent(); end
@@ -20790,18 +20695,39 @@ class SimpleCov::FileList
 
   def covered_strength(); end
 
+  def each(*args, &block); end
+
+  def empty?(*args, &block); end
+
+  def initialize(files); end
+
   def least_covered_file(); end
 
+  def length(*args, &block); end
+
   def lines_of_code(); end
 
+  def map(*args, &block); end
+
+  def missed_branches(); end
+
   def missed_lines(); end
 
   def never_lines(); end
 
+  def size(*args, &block); end
+
   def skipped_lines(); end
+
+  def to_a(*args, &block); end
+
+  def to_ary(*args, &block); end
+
+  def total_branches(); end
 end
 
 class SimpleCov::FileList
+  extend ::Forwardable
 end
 
 class SimpleCov::Filter
@@ -20809,7 +20735,7 @@ class SimpleCov::Filter
 
   def initialize(filter_argument); end
 
-  def matches?(_); end
+  def matches?(_source_file); end
 
   def passes?(source_file); end
 end
@@ -20823,9 +20749,47 @@ end
 module SimpleCov::Formatter
 end
 
-class SimpleCov::Formatter::HTMLFormatter
+class SimpleCov::Formatter::Codecov
+  def build_params(ci); end
+
+  def detect_ci(); end
+
+  def display_header(); end
+
   def format(result); end
 
+  def upload_to_codecov(req, https); end
+  APPVEYOR = ::T.let(nil, ::T.untyped)
+  AZUREPIPELINES = ::T.let(nil, ::T.untyped)
+  BITBUCKET = ::T.let(nil, ::T.untyped)
+  BITRISE = ::T.let(nil, ::T.untyped)
+  BUILDKITE = ::T.let(nil, ::T.untyped)
+  CIRCLE = ::T.let(nil, ::T.untyped)
+  CODESHIP = ::T.let(nil, ::T.untyped)
+  DRONEIO = ::T.let(nil, ::T.untyped)
+  GITLAB = ::T.let(nil, ::T.untyped)
+  HEROKU = ::T.let(nil, ::T.untyped)
+  JENKINS = ::T.let(nil, ::T.untyped)
+  RECOGNIZED_CIS = ::T.let(nil, ::T.untyped)
+  SEMAPHORE = ::T.let(nil, ::T.untyped)
+  SHIPPABLE = ::T.let(nil, ::T.untyped)
+  SOLANO = ::T.let(nil, ::T.untyped)
+  TEAMCITY = ::T.let(nil, ::T.untyped)
+  TRAVIS = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+  WERCKER = ::T.let(nil, ::T.untyped)
+end
+
+class SimpleCov::Formatter::Codecov
+end
+
+class SimpleCov::Formatter::HTMLFormatter
+  def branchable_result?(); end
+
+  def format(result); end
+
+  def line_status?(source_file, line); end
+
   def output_message(result); end
   VERSION = ::T.let(nil, ::T.untyped)
 end
@@ -20896,19 +20860,6 @@ end
 class SimpleCov::Profiles
 end
 
-module SimpleCov::RawCoverage
-end
-
-module SimpleCov::RawCoverage
-  def self.merge_file_coverage(file1, file2); end
-
-  def self.merge_line_coverage(count1, count2); end
-
-  def self.merge_results(*results); end
-
-  def self.merge_resultsets(result1, result2); end
-end
-
 class SimpleCov::RegexFilter
   def matches?(source_file); end
 end
@@ -20921,6 +20872,10 @@ class SimpleCov::Result
 
   def command_name=(command_name); end
 
+  def coverage_statistics(*args, &block); end
+
+  def covered_branches(*args, &block); end
+
   def covered_lines(*args, &block); end
 
   def covered_percent(*args, &block); end
@@ -20945,6 +20900,8 @@ class SimpleCov::Result
 
   def least_covered_file(*args, &block); end
 
+  def missed_branches(*args, &block); end
+
   def missed_lines(*args, &block); end
 
   def original_result(); end
@@ -20953,6 +20910,8 @@ class SimpleCov::Result
 
   def to_hash(); end
 
+  def total_branches(*args, &block); end
+
   def total_lines(*args, &block); end
 end
 
@@ -20961,12 +20920,26 @@ class SimpleCov::Result
   def self.from_hash(hash); end
 end
 
+class SimpleCov::ResultAdapter
+  def adapt(); end
+
+  def initialize(result); end
+
+  def result(); end
+end
+
+class SimpleCov::ResultAdapter
+  def self.call(*args); end
+end
+
 module SimpleCov::ResultMerger
 end
 
 module SimpleCov::ResultMerger
   def self.clear_resultset(); end
 
+  def self.merge_and_store(*results); end
+
   def self.merge_results(*results); end
 
   def self.merged_result(); end
@@ -20986,12 +20959,27 @@ module SimpleCov::ResultMerger
   def self.synchronize_resultset(); end
 end
 
+module SimpleCov::SimulateCoverage
+end
+
+module SimpleCov::SimulateCoverage
+  def self.call(absolute_path); end
+end
+
 class SimpleCov::SourceFile
-  def build_lines(); end
+  def branches(); end
 
-  def coverage(); end
+  def branches_coverage_percent(); end
 
-  def coverage_exceeding_source_warn(); end
+  def branches_for_line(line_number); end
+
+  def branches_report(); end
+
+  def coverage_data(); end
+
+  def coverage_statistics(); end
+
+  def covered_branches(); end
 
   def covered_lines(); end
 
@@ -21001,23 +20989,25 @@ class SimpleCov::SourceFile
 
   def filename(); end
 
-  def initialize(filename, coverage); end
+  def initialize(filename, coverage_data); end
 
   def line(number); end
 
+  def line_with_missed_branch?(line_number); end
+
   def lines(); end
 
   def lines_of_code(); end
 
-  def lines_strength(); end
+  def missed_branches(); end
 
   def missed_lines(); end
 
   def never_lines(); end
 
-  def no_lines?(); end
+  def no_branches?(); end
 
-  def process_skipped_lines(lines); end
+  def no_lines?(); end
 
   def project_filename(); end
 
@@ -21030,6 +21020,41 @@ class SimpleCov::SourceFile
   def source_lines(); end
 
   def src(); end
+
+  def total_branches(); end
+  RUBY_FILE_ENCODING_MAGIC_COMMENT_REGEX = ::T.let(nil, ::T.untyped)
+  SHEBANG_REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class SimpleCov::SourceFile::Branch
+  def coverage(); end
+
+  def covered?(); end
+
+  def end_line(); end
+
+  def initialize(start_line:, end_line:, coverage:, inline:, type:); end
+
+  def inline?(); end
+
+  def missed?(); end
+
+  def overlaps_with?(line_range); end
+
+  def report(); end
+
+  def report_line(); end
+
+  def skipped!(); end
+
+  def skipped?(); end
+
+  def start_line(); end
+
+  def type(); end
+end
+
+class SimpleCov::SourceFile::Branch
 end
 
 class SimpleCov::SourceFile::Line
@@ -21075,18 +21100,36 @@ end
 class SimpleCov::StringFilter
 end
 
+module SimpleCov::UselessResultsRemover
+  ROOT_REGX = ::T.let(nil, ::T.untyped)
+end
+
+module SimpleCov::UselessResultsRemover
+  def self.call(coverage_result); end
+end
+
 module SimpleCov
   extend ::SimpleCov::Configuration
-  def self.add_not_loaded_files(result); end
+  def self.at_exit_behavior(); end
 
   def self.clear_result(); end
 
+  def self.collate(result_filenames, profile=T.unsafe(nil), &block); end
+
   def self.exit_exception(); end
 
   def self.exit_status_from_exception(); end
 
+  def self.external_at_exit(); end
+
+  def self.external_at_exit=(external_at_exit); end
+
+  def self.external_at_exit?(); end
+
   def self.filtered(files); end
 
+  def self.final_result_process?(); end
+
   def self.grouped(files); end
 
   def self.load_adapter(name); end
@@ -21115,7 +21158,7 @@ module SimpleCov
 
   def self.start(profile=T.unsafe(nil), &block); end
 
-  def self.usable?(); end
+  def self.wait_for_other_processes(); end
 
   def self.write_last_run(covered_percent); end
 end
@@ -21328,8 +21371,6 @@ class SortedSet
   def self.setup(); end
 end
 
-Spruz = Tins
-
 module Stdenv
   def O0(); end
 
@@ -21559,14 +21600,6 @@ module Superenv
 
 end
 
-class Sync
-  VERSION = ::T.let(nil, ::T.untyped)
-end
-
-module Sync_m
-  def initialize(*args); end
-end
-
 class SynchronizedDelegator
   def method_missing(method, *args, &block); end
 
@@ -22473,501 +22506,6 @@ end
 class Tempfile::Remover
 end
 
-module Term
-end
-
-module Term::ANSIColor
-  include ::Term::ANSIColor::Movement
-  def attributes(); end
-
-  def black(string=T.unsafe(nil), &block); end
-
-  def blink(string=T.unsafe(nil), &block); end
-
-  def blue(string=T.unsafe(nil), &block); end
-
-  def bold(string=T.unsafe(nil), &block); end
-
-  def bright_black(string=T.unsafe(nil), &block); end
-
-  def bright_blue(string=T.unsafe(nil), &block); end
-
-  def bright_cyan(string=T.unsafe(nil), &block); end
-
-  def bright_green(string=T.unsafe(nil), &block); end
-
-  def bright_magenta(string=T.unsafe(nil), &block); end
-
-  def bright_red(string=T.unsafe(nil), &block); end
-
-  def bright_white(string=T.unsafe(nil), &block); end
-
-  def bright_yellow(string=T.unsafe(nil), &block); end
-
-  def clear(string=T.unsafe(nil), &block); end
-
-  def color(name, string=T.unsafe(nil), &block); end
-
-  def conceal(string=T.unsafe(nil), &block); end
-
-  def concealed(string=T.unsafe(nil), &block); end
-
-  def cyan(string=T.unsafe(nil), &block); end
-
-  def dark(string=T.unsafe(nil), &block); end
-
-  def faint(string=T.unsafe(nil), &block); end
-
-  def green(string=T.unsafe(nil), &block); end
-
-  def intense_black(string=T.unsafe(nil), &block); end
-
-  def intense_blue(string=T.unsafe(nil), &block); end
-
-  def intense_cyan(string=T.unsafe(nil), &block); end
-
-  def intense_green(string=T.unsafe(nil), &block); end
-
-  def intense_magenta(string=T.unsafe(nil), &block); end
-
-  def intense_red(string=T.unsafe(nil), &block); end
-
-  def intense_white(string=T.unsafe(nil), &block); end
-
-  def intense_yellow(string=T.unsafe(nil), &block); end
-
-  def italic(string=T.unsafe(nil), &block); end
-
-  def magenta(string=T.unsafe(nil), &block); end
-
-  def negative(string=T.unsafe(nil), &block); end
-
-  def on_black(string=T.unsafe(nil), &block); end
-
-  def on_blue(string=T.unsafe(nil), &block); end
-
-  def on_bright_black(string=T.unsafe(nil), &block); end
-
-  def on_bright_blue(string=T.unsafe(nil), &block); end
-
-  def on_bright_cyan(string=T.unsafe(nil), &block); end
-
-  def on_bright_green(string=T.unsafe(nil), &block); end
-
-  def on_bright_magenta(string=T.unsafe(nil), &block); end
-
-  def on_bright_red(string=T.unsafe(nil), &block); end
-
-  def on_bright_white(string=T.unsafe(nil), &block); end
-
-  def on_bright_yellow(string=T.unsafe(nil), &block); end
-
-  def on_color(name, string=T.unsafe(nil), &block); end
-
-  def on_cyan(string=T.unsafe(nil), &block); end
-
-  def on_green(string=T.unsafe(nil), &block); end
-
-  def on_intense_black(string=T.unsafe(nil), &block); end
-
-  def on_intense_blue(string=T.unsafe(nil), &block); end
-
-  def on_intense_cyan(string=T.unsafe(nil), &block); end
-
-  def on_intense_green(string=T.unsafe(nil), &block); end
-
-  def on_intense_magenta(string=T.unsafe(nil), &block); end
-
-  def on_intense_red(string=T.unsafe(nil), &block); end
-
-  def on_intense_white(string=T.unsafe(nil), &block); end
-
-  def on_intense_yellow(string=T.unsafe(nil), &block); end
-
-  def on_magenta(string=T.unsafe(nil), &block); end
-
-  def on_red(string=T.unsafe(nil), &block); end
-
-  def on_white(string=T.unsafe(nil), &block); end
-
-  def on_yellow(string=T.unsafe(nil), &block); end
-
-  def rapid_blink(string=T.unsafe(nil), &block); end
-
-  def red(string=T.unsafe(nil), &block); end
-
-  def reset(string=T.unsafe(nil), &block); end
-
-  def reverse(string=T.unsafe(nil), &block); end
-
-  def strikethrough(string=T.unsafe(nil), &block); end
-
-  def support?(feature); end
-
-  def term_ansicolor_attributes(); end
-
-  def uncolor(string=T.unsafe(nil)); end
-
-  def uncolored(string=T.unsafe(nil)); end
-
-  def underline(string=T.unsafe(nil), &block); end
-
-  def underscore(string=T.unsafe(nil), &block); end
-
-  def white(string=T.unsafe(nil), &block); end
-
-  def yellow(string=T.unsafe(nil), &block); end
-  ATTRIBUTE_NAMES = ::T.let(nil, ::T.untyped)
-  COLORED_REGEXP = ::T.let(nil, ::T.untyped)
-  VERSION = ::T.let(nil, ::T.untyped)
-  VERSION_ARRAY = ::T.let(nil, ::T.untyped)
-  VERSION_BUILD = ::T.let(nil, ::T.untyped)
-  VERSION_MAJOR = ::T.let(nil, ::T.untyped)
-  VERSION_MINOR = ::T.let(nil, ::T.untyped)
-end
-
-class Term::ANSIColor::Attribute
-  def apply(string=T.unsafe(nil), &block); end
-
-  def background?(); end
-
-  def code(); end
-
-  def distance_to(other, options=T.unsafe(nil)); end
-
-  def gradient_to(other, options=T.unsafe(nil)); end
-
-  def gray?(); end
-
-  def initialize(name, code, options=T.unsafe(nil)); end
-
-  def name(); end
-
-  def rgb(); end
-
-  def rgb_color?(); end
-
-  def to_rgb_triple(); end
-end
-
-class Term::ANSIColor::Attribute::Color256
-end
-
-class Term::ANSIColor::Attribute::Color256
-end
-
-class Term::ANSIColor::Attribute::Color8
-end
-
-class Term::ANSIColor::Attribute::Color8
-end
-
-class Term::ANSIColor::Attribute::IntenseColor8
-end
-
-class Term::ANSIColor::Attribute::IntenseColor8
-end
-
-class Term::ANSIColor::Attribute::Text
-end
-
-class Term::ANSIColor::Attribute::Text
-end
-
-class Term::ANSIColor::Attribute
-  def self.[](name); end
-
-  def self.attributes(&block); end
-
-  def self.get(name); end
-
-  def self.named_attributes(&block); end
-
-  def self.nearest_rgb_color(color, options=T.unsafe(nil)); end
-
-  def self.nearest_rgb_on_color(color, options=T.unsafe(nil)); end
-
-  def self.rgb_colors(options=T.unsafe(nil), &block); end
-
-  def self.set(name, code, options=T.unsafe(nil)); end
-end
-
-class Term::ANSIColor::HSLTriple
-  def ==(other); end
-
-  def adjust_hue(degree); end
-
-  def complement(); end
-
-  def css(); end
-
-  def darken(percentage); end
-
-  def desaturate(percentage); end
-
-  def grayscale(); end
-
-  def hue(); end
-
-  def initialize(hue, saturation, lightness); end
-
-  def lighten(percentage); end
-
-  def lightness(); end
-
-  def method_missing(name, *args, &block); end
-
-  def saturate(percentage); end
-
-  def saturation(); end
-
-  def to_hsl_triple(); end
-
-  def to_rgb_triple(); end
-end
-
-class Term::ANSIColor::HSLTriple
-  def self.[](thing); end
-
-  def self.from_css(css); end
-
-  def self.from_hash(options); end
-
-  def self.from_rgb_triple(rgb); end
-end
-
-module Term::ANSIColor::Movement
-  def clear_screen(string=T.unsafe(nil), &block); end
-
-  def erase_in_display(n=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def erase_in_line(n=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def hide_cursor(string=T.unsafe(nil), &block); end
-
-  def move_backward(columns=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_down(lines=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_forward(columns=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_home(string=T.unsafe(nil), &block); end
-
-  def move_to(line=T.unsafe(nil), column=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_to_column(column=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_to_line(line=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_to_next_line(lines=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_to_previous_line(lines=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def move_up(lines=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def restore_position(string=T.unsafe(nil), &block); end
-
-  def return_to_position(string=T.unsafe(nil), &block); end
-
-  def save_position(string=T.unsafe(nil), &block); end
-
-  def scroll_down(pages=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def scroll_up(pages=T.unsafe(nil), string=T.unsafe(nil), &block); end
-
-  def show_cursor(string=T.unsafe(nil), &block); end
-
-  def terminal_columns(); end
-
-  def terminal_lines(); end
-end
-
-module Term::ANSIColor::Movement
-end
-
-class Term::ANSIColor::PPMReader
-  include ::Term::ANSIColor
-  include ::Term::ANSIColor::Movement
-  def each_row(); end
-
-  def initialize(io, options=T.unsafe(nil)); end
-
-  def reset_io(); end
-
-  def to_a(); end
-end
-
-class Term::ANSIColor::PPMReader
-end
-
-module Term::ANSIColor::RGBColorMetrics
-end
-
-module Term::ANSIColor::RGBColorMetrics::CIELab
-end
-
-class Term::ANSIColor::RGBColorMetrics::CIELab::CIELabTriple
-  include ::Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
-end
-
-class Term::ANSIColor::RGBColorMetrics::CIELab::CIELabTriple
-  extend ::Term::ANSIColor::RGBColorMetricsHelpers::NormalizeRGBTriple
-  def self.from_rgb_triple(rgb_triple); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::CIELab
-  def self.distance(rgb1, rgb2); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::CIEXYZ
-end
-
-class Term::ANSIColor::RGBColorMetrics::CIEXYZ::CIEXYZTriple
-  include ::Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
-end
-
-class Term::ANSIColor::RGBColorMetrics::CIEXYZ::CIEXYZTriple
-  extend ::Term::ANSIColor::RGBColorMetricsHelpers::NormalizeRGBTriple
-  def self.from_rgb_triple(rgb_triple); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::CIEXYZ
-  def self.distance(rgb1, rgb2); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::CompuPhase
-end
-
-module Term::ANSIColor::RGBColorMetrics::CompuPhase
-  def self.distance(rgb1, rgb2); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::Euclidean
-end
-
-module Term::ANSIColor::RGBColorMetrics::Euclidean
-  def self.distance(rgb1, rgb2); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::NTSC
-end
-
-module Term::ANSIColor::RGBColorMetrics::NTSC
-  def self.distance(rgb1, rgb2); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::YUV
-end
-
-class Term::ANSIColor::RGBColorMetrics::YUV::YUVTriple
-  include ::Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
-end
-
-class Term::ANSIColor::RGBColorMetrics::YUV::YUVTriple
-  def self.from_rgb_triple(rgb_triple); end
-end
-
-module Term::ANSIColor::RGBColorMetrics::YUV
-  def self.distance(rgb1, rgb2); end
-end
-
-module Term::ANSIColor::RGBColorMetrics
-  def self.metric(name); end
-
-  def self.metric?(name); end
-
-  def self.metrics(); end
-end
-
-module Term::ANSIColor::RGBColorMetricsHelpers
-end
-
-module Term::ANSIColor::RGBColorMetricsHelpers::NormalizeRGBTriple
-end
-
-module Term::ANSIColor::RGBColorMetricsHelpers::NormalizeRGBTriple
-end
-
-module Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
-  def weighted_euclidean_distance_to(other, weights=T.unsafe(nil)); end
-end
-
-module Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
-end
-
-module Term::ANSIColor::RGBColorMetricsHelpers
-end
-
-class Term::ANSIColor::RGBTriple
-  include ::Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
-  def ==(other); end
-
-  def blue(); end
-
-  def blue_p(); end
-
-  def color(string); end
-
-  def css(percentage: T.unsafe(nil)); end
-
-  def distance_to(other, options=T.unsafe(nil)); end
-
-  def gradient_to(other, options=T.unsafe(nil)); end
-
-  def gray?(); end
-
-  def green(); end
-
-  def green_p(); end
-
-  def html(); end
-
-  def initialize(red, green, blue); end
-
-  def invert(); end
-
-  def method_missing(name, *args, &block); end
-
-  def percentages(); end
-
-  def red(); end
-
-  def red_p(); end
-
-  def to_a(); end
-
-  def to_hsl_triple(); end
-
-  def to_rgb_triple(); end
-
-  def values(); end
-end
-
-class Term::ANSIColor::RGBTriple
-  def self.[](thing); end
-
-  def self.from_array(array); end
-
-  def self.from_css(css); end
-
-  def self.from_hash(options); end
-
-  def self.from_html(html); end
-end
-
-module Term::ANSIColor
-  extend ::Term::ANSIColor
-  extend ::Term::ANSIColor::Movement
-  def self.coloring=(val); end
-
-  def self.coloring?(); end
-
-  def self.create_color_method(color_name, color_value); end
-end
-
-module Term
-end
-
 class Thor::Group
   def self.banner(); end
 
@@ -23484,1242 +23022,6 @@ class Time
 
 end
 
-module Tins
-  VERSION = ::T.let(nil, ::T.untyped)
-  VERSION_ARRAY = ::T.let(nil, ::T.untyped)
-  VERSION_BUILD = ::T.let(nil, ::T.untyped)
-  VERSION_MAJOR = ::T.let(nil, ::T.untyped)
-  VERSION_MINOR = ::T.let(nil, ::T.untyped)
-end
-
-module Tins::Annotate
-  def annotate(name); end
-end
-
-module Tins::Annotate
-end
-
-module Tins::Attempt
-  def attempt(opts=T.unsafe(nil), &block); end
-end
-
-module Tins::Attempt
-end
-
-class Tins::Bijection
-  def []=(key, value); end
-
-  def fill(); end
-
-  def initialize(inverted=T.unsafe(nil)); end
-
-  def inverted(); end
-end
-
-class Tins::Bijection
-  def self.[](*pairs); end
-end
-
-module Tins::Blank
-end
-
-module Tins::Blank::Array
-end
-
-module Tins::Blank::Array
-  def self.included(modul); end
-end
-
-module Tins::Blank::FalseClass
-  def blank?(); end
-end
-
-module Tins::Blank::FalseClass
-end
-
-module Tins::Blank::Hash
-end
-
-module Tins::Blank::Hash
-  def self.included(modul); end
-end
-
-module Tins::Blank::NilClass
-  def blank?(); end
-end
-
-module Tins::Blank::NilClass
-end
-
-module Tins::Blank::Numeric
-  def blank?(); end
-end
-
-module Tins::Blank::Numeric
-end
-
-module Tins::Blank::Object
-  def blank?(); end
-
-  def present?(); end
-end
-
-module Tins::Blank::Object
-end
-
-module Tins::Blank::String
-  def blank?(); end
-end
-
-module Tins::Blank::String
-end
-
-module Tins::Blank::TrueClass
-  def blank?(); end
-end
-
-module Tins::Blank::TrueClass
-end
-
-module Tins::Blank
-end
-
-module Tins::BlankSlate
-end
-
-module Tins::BlankSlate
-  def self.with(*ids); end
-end
-
-module Tins::BlockSelf
-end
-
-module Tins::BlockSelf
-  def self.block_self(&block); end
-end
-
-module Tins::CasePredicate
-  def case?(*args); end
-end
-
-module Tins::CasePredicate
-end
-
-module Tins::ClassMethod
-  include ::Tins::Eigenclass
-  def class_attr_accessor(*ids); end
-
-  def class_attr_reader(*ids); end
-
-  def class_attr_writer(*ids); end
-
-  def class_define_method(name, &block); end
-end
-
-module Tins::ClassMethod
-end
-
-module Tins::Complete
-end
-
-module Tins::Complete
-  def self.complete(prompt: T.unsafe(nil), add_hist: T.unsafe(nil), &block); end
-end
-
-module Tins::Concern
-  def append_features(base); end
-
-  def included(base=T.unsafe(nil), &block); end
-end
-
-module Tins::Concern
-  def self.extended(base); end
-end
-
-module Tins::Constant
-  def constant(name, value=T.unsafe(nil)); end
-end
-
-module Tins::Constant
-end
-
-module Tins::ConstantMaker
-  def const_missing(id); end
-end
-
-module Tins::ConstantMaker
-end
-
-module Tins::CountBy
-  def count_by(&b); end
-end
-
-module Tins::CountBy
-end
-
-module Tins::DSLAccessor
-  def dsl_accessor(name, *default, &block); end
-
-  def dsl_reader(name, *default, &block); end
-end
-
-module Tins::DSLAccessor
-end
-
-module Tins::DateDummy
-end
-
-module Tins::DateDummy
-  def self.included(modul); end
-end
-
-module Tins::DateTimeDummy
-end
-
-module Tins::DateTimeDummy
-  def self.included(modul); end
-end
-
-module Tins::DeepConstGet
-  def deep_const_get(path, start_module=T.unsafe(nil)); end
-end
-
-module Tins::DeepConstGet
-  def self.const_defined_in?(modul, constant); end
-
-  def self.deep_const_get(path, start_module=T.unsafe(nil)); end
-end
-
-module Tins::DeepDup
-  def deep_dup(); end
-end
-
-module Tins::DeepDup
-end
-
-module Tins::Deflect
-  def deflect(from, id, deflector); end
-
-  def deflect?(from, id); end
-
-  def deflect_start(from, id, deflector); end
-
-  def deflect_stop(from, id); end
-end
-
-class Tins::Deflect::DeflectError
-end
-
-class Tins::Deflect::DeflectError
-end
-
-class Tins::Deflect::Deflector
-end
-
-class Tins::Deflect::Deflector
-end
-
-class Tins::Deflect::DeflectorCollection
-  def add(klass, id, deflector); end
-
-  def delete(klass, id); end
-
-  def find(klass, id); end
-
-  def member?(klass, id); end
-end
-
-class Tins::Deflect::DeflectorCollection
-end
-
-module Tins::Deflect
-  def self.deflect?(from, id); end
-
-  def self.deflecting(); end
-
-  def self.deflecting=(value); end
-end
-
-module Tins::Delegate
-  def delegate(method_name, opts=T.unsafe(nil)); end
-  UNSET = ::T.let(nil, ::T.untyped)
-end
-
-module Tins::Delegate
-end
-
-class Tins::Duration
-  include ::Comparable
-  def days?(); end
-
-  def format(template=T.unsafe(nil), precision: T.unsafe(nil)); end
-
-  def fractional_seconds?(); end
-
-  def hours?(); end
-
-  def initialize(seconds); end
-
-  def minutes?(); end
-
-  def negative?(); end
-
-  def seconds?(); end
-
-  def to_f(); end
-end
-
-class Tins::Duration
-end
-
-module Tins::DynamicScope
-  include ::Tins::Scope
-  def dynamic_defined?(id); end
-
-  def dynamic_scope(&block); end
-
-  def dynamic_scope_name(); end
-
-  def dynamic_scope_name=(dynamic_scope_name); end
-
-  def method_missing(id, *args); end
-end
-
-class Tins::DynamicScope::Context
-  def [](name); end
-
-  def []=(name, value); end
-end
-
-class Tins::DynamicScope::Context
-end
-
-module Tins::DynamicScope
-end
-
-module Tins::Eigenclass
-  def eigenclass(); end
-
-  def eigenclass_eval(&block); end
-end
-
-module Tins::Eigenclass
-end
-
-module Tins::Expose
-  def expose(method_name=T.unsafe(nil), *args, &block); end
-end
-
-module Tins::Expose
-end
-
-module Tins::ExtractLastArgumentOptions
-  def extract_last_argument_options(); end
-end
-
-module Tins::ExtractLastArgumentOptions
-end
-
-module Tins::FileBinary
-  def ascii?(options=T.unsafe(nil)); end
-
-  def binary?(options=T.unsafe(nil)); end
-end
-
-module Tins::FileBinary::ClassMethods
-  def ascii?(name, options=T.unsafe(nil)); end
-
-  def binary?(name, options=T.unsafe(nil)); end
-end
-
-module Tins::FileBinary::ClassMethods
-end
-
-module Tins::FileBinary::Constants
-  BINARY = ::T.let(nil, ::T.untyped)
-  SEEK_SET = ::T.let(nil, ::T.untyped)
-  ZERO = ::T.let(nil, ::T.untyped)
-end
-
-module Tins::FileBinary::Constants
-end
-
-module Tins::FileBinary
-  def self.default_options(); end
-
-  def self.default_options=(default_options); end
-
-  def self.included(modul); end
-end
-
-module Tins::Find
-end
-
-module Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
-module Tins::Find::EXPECTED_STANDARD_ERRORS
-end
-
-class Tins::Find::Finder
-  def find(*paths); end
-
-  def follow_symlinks(); end
-
-  def follow_symlinks=(follow_symlinks); end
-
-  def initialize(opts=T.unsafe(nil)); end
-
-  def prepare_path(path); end
-
-  def protect_from_errors(errors=T.unsafe(nil)); end
-
-  def raise_errors(); end
-
-  def raise_errors=(raise_errors); end
-
-  def show_hidden(); end
-
-  def show_hidden=(show_hidden); end
-
-  def suffix(); end
-
-  def suffix=(suffix); end
-
-  def visit_path?(path); end
-end
-
-module Tins::Find::Finder::PathExtension
-  def directory?(); end
-
-  def exist?(); end
-
-  def file(); end
-
-  def file?(); end
-
-  def finder(); end
-
-  def finder=(finder); end
-
-  def finder_stat(); end
-
-  def lstat(); end
-
-  def pathname(); end
-
-  def stat(); end
-
-  def suffix(); end
-end
-
-module Tins::Find::Finder::PathExtension
-end
-
-class Tins::Find::Finder
-end
-
-module Tins::Find
-  def self.find(*paths, &block); end
-
-  def self.prune(); end
-end
-
-module Tins::FromModule
-  include ::Tins::ParameterizedModule
-  def from(*args, &block); end
-
-  def parameterize(opts=T.unsafe(nil)); end
-end
-
-module Tins::FromModule
-end
-
-module Tins::Full
-  def all_full?(); end
-
-  def full?(dispatch=T.unsafe(nil), *args); end
-end
-
-module Tins::Full
-end
-
-module Tins::GO
-end
-
-module Tins::GO::EnumerableExtension
-  include ::Enumerable
-  include ::ActiveSupport::ToJsonWithActiveSupportEncoder
-  def <<(argument); end
-
-  def each(&block); end
-
-  def push(argument); end
-end
-
-module Tins::GO::EnumerableExtension
-end
-
-module Tins::GO
-  def self.go(s, args=T.unsafe(nil), defaults: T.unsafe(nil)); end
-end
-
-class Tins::Generator
-  include ::Enumerable
-  def add_dimension(enum, iterator=T.unsafe(nil)); end
-
-  def each(&block); end
-
-  def initialize(enums); end
-
-  def size(); end
-end
-
-class Tins::Generator
-  def self.[](*enums); end
-end
-
-module Tins::HashSymbolizeKeysRecursive
-  def seen(); end
-
-  def seen=(value); end
-
-  def symbolize_keys_recursive(circular: T.unsafe(nil)); end
-
-  def symbolize_keys_recursive!(circular: T.unsafe(nil)); end
-end
-
-module Tins::HashSymbolizeKeysRecursive
-  extend ::Tins::ThreadLocal
-end
-
-module Tins::HashUnion
-  def |(other); end
-end
-
-module Tins::HashUnion
-end
-
-module Tins::Implement
-  def implement(method_name, msg=T.unsafe(nil)); end
-
-  def implement_in_submodule(method_name); end
-  MESSAGES = ::T.let(nil, ::T.untyped)
-end
-
-module Tins::Implement
-end
-
-module Tins::InstanceExec
-end
-
-module Tins::InstanceExec
-  def self.included(*_); end
-end
-
-module Tins::Interpreter
-  def interpret(source, *args); end
-
-  def interpret_with_binding(source, my_binding, *args); end
-end
-
-module Tins::Interpreter
-end
-
-class Tins::Limited
-  def execute(); end
-
-  def initialize(maximum); end
-
-  def maximum(); end
-
-  def wait(); end
-end
-
-class Tins::Limited
-end
-
-class Tins::LinesFile
-  include ::Enumerable
-  def each(&block); end
-
-  def empty?(); end
-
-  def file_linenumber(); end
-
-  def filename(); end
-
-  def filename=(filename); end
-
-  def initialize(lines, line_number=T.unsafe(nil)); end
-
-  def last_line_number(); end
-
-  def line(); end
-
-  def line_number(); end
-
-  def line_number=(number); end
-
-  def match_backward(regexp, previous_after_match=T.unsafe(nil)); end
-
-  def match_forward(regexp, next_after_match=T.unsafe(nil)); end
-
-  def next!(); end
-
-  def previous!(); end
-
-  def rewind(); end
-end
-
-module Tins::LinesFile::LineExtension
-  def filename(); end
-
-  def line_number(); end
-end
-
-module Tins::LinesFile::LineExtension
-end
-
-class Tins::LinesFile
-  def self.for_file(file, line_number=T.unsafe(nil)); end
-
-  def self.for_filename(filename, line_number=T.unsafe(nil)); end
-
-  def self.for_lines(lines, line_number=T.unsafe(nil)); end
-end
-
-module Tins::Memoize
-end
-
-module Tins::Memoize::CacheMethods
-  def __memoize_cache__(); end
-
-  def memoize_apply_visibility(id); end
-
-  def memoize_cache_clear(); end
-end
-
-module Tins::Memoize::CacheMethods
-end
-
-module Tins::Memoize
-end
-
-module Tins::MethodDescription
-  def description(style: T.unsafe(nil)); end
-
-  def signature(); end
-end
-
-class Tins::MethodDescription::Parameters
-end
-
-class Tins::MethodDescription::Parameters::BlockParameter
-end
-
-class Tins::MethodDescription::Parameters::BlockParameter
-end
-
-class Tins::MethodDescription::Parameters::GenericParameter
-end
-
-class Tins::MethodDescription::Parameters::GenericParameter
-end
-
-class Tins::MethodDescription::Parameters::KeyParameter
-end
-
-class Tins::MethodDescription::Parameters::KeyParameter
-end
-
-class Tins::MethodDescription::Parameters::KeyreqParameter
-end
-
-class Tins::MethodDescription::Parameters::KeyreqParameter
-end
-
-class Tins::MethodDescription::Parameters::KeyrestParameter
-end
-
-class Tins::MethodDescription::Parameters::KeyrestParameter
-end
-
-class Tins::MethodDescription::Parameters::OptParameter
-end
-
-class Tins::MethodDescription::Parameters::OptParameter
-end
-
-class Tins::MethodDescription::Parameters::Parameter
-  def ==(other); end
-end
-
-class Tins::MethodDescription::Parameters::Parameter
-end
-
-class Tins::MethodDescription::Parameters::ReqParameter
-end
-
-class Tins::MethodDescription::Parameters::ReqParameter
-end
-
-class Tins::MethodDescription::Parameters::RestParameter
-end
-
-class Tins::MethodDescription::Parameters::RestParameter
-end
-
-class Tins::MethodDescription::Parameters
-  def self.build(type, name); end
-end
-
-class Tins::MethodDescription::Signature
-  def ==(other); end
-
-  def ===(method); end
-
-  def eql?(other); end
-
-  def initialize(*parameters); end
-
-  def parameters(); end
-end
-
-class Tins::MethodDescription::Signature
-end
-
-module Tins::MethodDescription
-end
-
-module Tins::MethodMissingDelegator
-  def method_missing(id, *a, &b); end
-
-  def method_missing_delegator(); end
-
-  def method_missing_delegator=(method_missing_delegator); end
-end
-
-class Tins::MethodMissingDelegator::DelegatorClass
-  include ::Tins::MethodMissingDelegator::DelegatorModule
-  include ::Tins::MethodMissingDelegator
-end
-
-class Tins::MethodMissingDelegator::DelegatorClass
-end
-
-module Tins::MethodMissingDelegator::DelegatorModule
-  include ::Tins::MethodMissingDelegator
-  def initialize(delegator, *a, &b); end
-end
-
-module Tins::MethodMissingDelegator::DelegatorModule
-end
-
-module Tins::MethodMissingDelegator
-end
-
-module Tins::Minimize
-  def minimize(); end
-
-  def minimize!(); end
-
-  def unminimize(); end
-
-  def unminimize!(); end
-end
-
-module Tins::Minimize
-end
-
-module Tins::ModuleGroup
-end
-
-module Tins::ModuleGroup
-  def self.[](*modules); end
-end
-
-module Tins::NULL
-end
-
-module Tins::NULL
-  extend ::Tins::Null
-end
-
-class Tins::NamedSet
-  def initialize(name); end
-
-  def name(); end
-
-  def name=(name); end
-end
-
-class Tins::NamedSet
-end
-
-module Tins::Null
-  def as_json(*_); end
-
-  def blank?(); end
-
-  def const_missing(*_); end
-
-  def inspect(); end
-
-  def method_missing(*_); end
-
-  def nil?(); end
-
-  def to_a(); end
-
-  def to_ary(); end
-
-  def to_f(); end
-
-  def to_i(); end
-
-  def to_int(); end
-
-  def to_json(*_); end
-
-  def to_s(); end
-
-  def to_str(); end
-end
-
-module Tins::Null::Kernel
-  def Null(value=T.unsafe(nil)); end
-
-  def NullPlus(opts=T.unsafe(nil)); end
-
-  def null(value=T.unsafe(nil)); end
-
-  def null_plus(opts=T.unsafe(nil)); end
-end
-
-module Tins::Null::Kernel
-end
-
-module Tins::Null
-end
-
-class Tins::NullClass
-  include ::Tins::Null
-end
-
-class Tins::NullClass
-end
-
-class Tins::NullPlus
-  include ::Tins::Null
-  def initialize(opts=T.unsafe(nil)); end
-end
-
-class Tins::NullPlus
-end
-
-module Tins::Once
-  include ::File::Constants
-end
-
-module Tins::Once
-  def self.only_once(lock_filename=T.unsafe(nil), locking_constant=T.unsafe(nil)); end
-
-  def self.try_only_once(lock_filename=T.unsafe(nil), locking_constant=T.unsafe(nil), &block); end
-end
-
-module Tins::P
-end
-
-module Tins::P
-end
-
-module Tins::ParameterizedModule
-  def parameterize_for(*args, &block); end
-end
-
-module Tins::ParameterizedModule
-end
-
-module Tins::PartialApplication
-  def partial(*args); end
-end
-
-module Tins::PartialApplication
-  def self.included(modul); end
-end
-
-module Tins::ProcCompose
-  def *(other); end
-
-  def compose(other); end
-end
-
-module Tins::ProcCompose
-end
-
-module Tins::ProcPrelude
-  def apply(&my_proc); end
-
-  def array(*args); end
-
-  def call(obj, &my_proc); end
-
-  def const(konst=T.unsafe(nil), &my_proc); end
-
-  def first(*args); end
-
-  def from(&block); end
-
-  def head(*args); end
-
-  def id1(*args); end
-
-  def last(*args); end
-
-  def map_apply(my_method, *args, &my_proc); end
-
-  def nth(n); end
-
-  def rotate(n=T.unsafe(nil)); end
-
-  def second(*args); end
-
-  def swap(n=T.unsafe(nil)); end
-
-  def tail(*args); end
-end
-
-module Tins::ProcPrelude
-end
-
-module Tins::RangePlus
-  def +(other); end
-end
-
-module Tins::RangePlus
-end
-
-module Tins::RequireMaybe
-  def require_maybe(library); end
-end
-
-module Tins::RequireMaybe
-end
-
-module Tins::Responding
-  def responding?(*method_names); end
-end
-
-module Tins::Responding
-end
-
-module Tins::Scope
-  def scope(name=T.unsafe(nil)); end
-
-  def scope_block(scope_frame, name=T.unsafe(nil)); end
-
-  def scope_get(name=T.unsafe(nil)); end
-
-  def scope_pop(name=T.unsafe(nil)); end
-
-  def scope_push(scope_frame, name=T.unsafe(nil)); end
-
-  def scope_reverse(name=T.unsafe(nil), &block); end
-
-  def scope_top(name=T.unsafe(nil)); end
-end
-
-module Tins::Scope
-end
-
-module Tins::SecureWrite
-  def secure_write(filename, content=T.unsafe(nil), mode=T.unsafe(nil)); end
-end
-
-module Tins::SecureWrite
-end
-
-module Tins::SexySingleton
-  def _dump(depth=T.unsafe(nil)); end
-
-  def clone(); end
-
-  def dup(); end
-end
-
-module Tins::SexySingleton
-  def self.__init__(klass); end
-
-  def self.included(klass); end
-end
-
-module Tins::StringByteOrderMark
-  def bom_encoding(); end
-end
-
-module Tins::StringByteOrderMark
-end
-
-module Tins::StringCamelize
-  def camelcase(first_letter=T.unsafe(nil)); end
-
-  def camelize(first_letter=T.unsafe(nil)); end
-end
-
-module Tins::StringCamelize
-end
-
-module Tins::StringUnderscore
-  def underscore(); end
-end
-
-module Tins::StringUnderscore
-end
-
-module Tins::StringVersion
-  def version(); end
-  LEVELS = ::T.let(nil, ::T.untyped)
-  SYMBOLS = ::T.let(nil, ::T.untyped)
-end
-
-class Tins::StringVersion::Version
-  include ::Comparable
-  def ==(other); end
-
-  def [](level); end
-
-  def []=(level, value); end
-
-  def array(); end
-
-  def build(); end
-
-  def build=(new_level); end
-
-  def bump(level=T.unsafe(nil)); end
-
-  def initialize(string); end
-
-  def level_of(specifier); end
-
-  def major(); end
-
-  def major=(new_level); end
-
-  def minor(); end
-
-  def minor=(new_level); end
-
-  def pred!(); end
-
-  def revision(); end
-
-  def revision=(new_level); end
-
-  def succ!(); end
-
-  def to_a(); end
-end
-
-class Tins::StringVersion::Version
-end
-
-module Tins::StringVersion
-end
-
-module Tins::Subhash
-  def subhash(*patterns); end
-end
-
-module Tins::Subhash
-end
-
-module Tins::SymbolMaker
-  def method_missing(id, *args); end
-end
-
-module Tins::SymbolMaker
-end
-
-module Tins::TempIO
-  def temp_io(content: T.unsafe(nil), name: T.unsafe(nil)); end
-end
-
-class Tins::TempIO::Enum
-  include ::Tins::TempIO
-  def initialize(chunk_size: T.unsafe(nil), filename: T.unsafe(nil), &content_proc); end
-end
-
-class Tins::TempIO::Enum
-end
-
-module Tins::TempIO
-end
-
-module Tins::Terminal
-end
-
-module Tins::Terminal
-  def self.cols(); end
-
-  def self.columns(); end
-
-  def self.lines(); end
-
-  def self.rows(); end
-
-  def self.winsize(); end
-end
-
-module Tins::ThreadGlobal
-  def instance_thread_global(name, value=T.unsafe(nil)); end
-
-  def thread_global(name, default_value=T.unsafe(nil), &default); end
-end
-
-module Tins::ThreadGlobal
-end
-
-module Tins::ThreadLocal
-  def instance_thread_local(name, default_value=T.unsafe(nil), &default); end
-
-  def thread_local(name, default_value=T.unsafe(nil), &default); end
-end
-
-module Tins::ThreadLocal
-end
-
-module Tins::TimeDummy
-end
-
-module Tins::TimeDummy
-  def self.included(modul); end
-end
-
-module Tins::To
-  def to(string); end
-end
-
-module Tins::To
-end
-
-module Tins::ToProc
-  def to_proc(); end
-end
-
-module Tins::ToProc
-end
-
-class Tins::Token
-  def bits(); end
-
-  def bits=(bits); end
-
-  def initialize(bits: T.unsafe(nil), length: T.unsafe(nil), alphabet: T.unsafe(nil), random: T.unsafe(nil)); end
-  BASE16_ALPHABET = ::T.let(nil, ::T.untyped)
-  BASE32_ALPHABET = ::T.let(nil, ::T.untyped)
-  BASE32_EXTENDED_HEX_ALPHABET = ::T.let(nil, ::T.untyped)
-  BASE64_ALPHABET = ::T.let(nil, ::T.untyped)
-  BASE64_URL_FILENAME_SAFE_ALPHABET = ::T.let(nil, ::T.untyped)
-  DEFAULT_ALPHABET = ::T.let(nil, ::T.untyped)
-end
-
-class Tins::Token
-end
-
-module Tins::UniqBy
-  def uniq_by(&b); end
-end
-
-module Tins::UniqBy
-end
-
-module Tins::Unit
-  PREFIX_F = ::T.let(nil, ::T.untyped)
-  PREFIX_LC = ::T.let(nil, ::T.untyped)
-  PREFIX_UC = ::T.let(nil, ::T.untyped)
-end
-
-class Tins::Unit::FormatParser
-  def initialize(format, unit_parser); end
-
-  def parse(); end
-end
-
-class Tins::Unit::FormatParser
-end
-
-class Tins::Unit::ParserError
-end
-
-class Tins::Unit::ParserError
-end
-
-class Tins::Unit::Prefix
-  def fraction(); end
-
-  def fraction=(_); end
-
-  def multiplier(); end
-
-  def multiplier=(_); end
-
-  def name(); end
-
-  def name=(_); end
-
-  def step(); end
-
-  def step=(_); end
-end
-
-class Tins::Unit::Prefix
-  def self.[](*_); end
-
-  def self.members(); end
-end
-
-class Tins::Unit::UnitParser
-  def initialize(source, unit, prefixes=T.unsafe(nil)); end
-
-  def number(); end
-
-  def parse(); end
-
-  def scan(re); end
-
-  def scan_char(char); end
-
-  def scan_number(); end
-
-  def scan_unit(); end
-  NUMBER = ::T.let(nil, ::T.untyped)
-end
-
-class Tins::Unit::UnitParser
-end
-
-module Tins::Unit
-  def self.format(value, format: T.unsafe(nil), prefix: T.unsafe(nil), unit: T.unsafe(nil)); end
-
-  def self.parse(string, format: T.unsafe(nil), unit: T.unsafe(nil), prefix: T.unsafe(nil)); end
-
-  def self.parse?(string, **options); end
-
-  def self.prefixes(identifier); end
-end
-
-module Tins::Write
-end
-
-module Tins::Write
-  def self.extended(modul); end
-end
-
-module Tins
-end
-
 class TracePoint
   def __enable(_, _1); end
 
@@ -24852,31 +23154,205 @@ module URI
 end
 
 class URL
+  def =~(reg); end
+
+  def [](*args, &block); end
+
+  def []=(*args, &block); end
+
+  def add_to_path(val); end
+
   def branch(); end
 
   def cookies(); end
 
   def data(); end
 
+  def delete(*args); end
+
+  def domain(); end
+
+  def domain=(domain); end
+
+  def format(); end
+
+  def format=(format); end
+
+  def get(*args); end
+
+  def hash=(hash); end
+
+  def host(); end
+
+  def host_with_port(); end
+
+  def params(); end
+
+  def params=(p); end
+
   def path(*args, &block); end
 
+  def path=(str); end
+
+  def port(); end
+
+  def port=(port); end
+
+  def post(*args); end
+
+  def put(*args); end
+
   def referer(); end
 
+  def req_handler(); end
+
+  def req_handler=(r); end
+
   def revision(); end
 
   def revisions(); end
 
   def scheme(*args, &block); end
 
+  def scheme=(scheme); end
+
+  def string(); end
+
+  def subdomain(); end
+
+  def subdomain=(s); end
+
+  def subdomains(); end
+
+  def subdomains=(s); end
+
   def tag(); end
 
   def to_s(*args, &block); end
 
+  def to_uri(); end
+
   def trust_cert(); end
 
   def user_agent(); end
 
   def using(); end
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class URL::ASJSONHandler
+end
+
+class URL::ASJSONHandler
+end
+
+class URL::BaseJSONHandler
+end
+
+class URL::BaseJSONHandler
+end
+
+class URL::JSONHandler
+  def initialize(str); end
+
+  def parse(); end
+
+  def str(); end
+end
+
+class URL::JSONHandler
+end
+
+class URL::Mash
+  def [](k); end
+
+  def []=(k, v); end
+end
+
+class URL::Mash
+end
+
+class URL::NetHandler
+end
+
+class URL::NetHandler
+end
+
+class URL::ParamsHash
+  def reverse_merge!(other); end
+
+  def to_s(questionmark=T.unsafe(nil)); end
+
+  def |(other); end
+end
+
+class URL::ParamsHash
+  def self.from_string(str); end
+end
+
+class URL::RequestHandler
+  def delete(args=T.unsafe(nil)); end
+
+  def get(args=T.unsafe(nil)); end
+
+  def initialize(url); end
+
+  def post(args=T.unsafe(nil)); end
+
+  def put(args=T.unsafe(nil)); end
+
+  def url(); end
+end
+
+class URL::RequestHandler
+end
+
+class URL::Response
+  def code(); end
+
+  def connection_refused(); end
+
+  def initialize(str, args=T.unsafe(nil)); end
+
+  def json(); end
+
+  def response(); end
+
+  def success?(); end
+
+  def successful?(); end
+
+  def time(); end
+
+  def url(); end
+
+  def url_obj(); end
+end
+
+class URL::Response
+end
+
+class URL::TyHandler
+  def head(args=T.unsafe(nil)); end
+end
+
+class URL::TyHandler
+end
+
+class URL::YajlHandler
+end
+
+class URL::YajlHandler
+end
+
+class URL
+  def self.json_handler(); end
+
+  def self.json_handler=(r); end
+
+  def self.req_handler(); end
+
+  def self.req_handler=(r); end
 end
 
 class UnboundMethod

From 6a7e5f2e9d47398ae63d699e1acc251202a824e0 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Fri, 3 Jul 2020 09:21:49 +0100
Subject: [PATCH 123/149] dev-cmd/audit: tweak checksum audit.

Compare against the latest `origin/master` checksum rather than
whatever the previous one was.
---
 Library/Homebrew/dev-cmd/audit.rb           |  5 +-
 Library/Homebrew/test/dev-cmd/audit_spec.rb | 68 +++++++++++++++------
 2 files changed, 52 insertions(+), 21 deletions(-)

diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index 8c2beedfca..6992748eb8 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -747,11 +747,11 @@ module Homebrew
       current_revision = formula.revision
 
       previous_version = nil
-      previous_checksum = nil
       previous_version_scheme = nil
       previous_revision = nil
 
       newest_committed_version = nil
+      newest_committed_checksum = nil
       newest_committed_revision = nil
 
       fv.rev_list("origin/master") do |rev|
@@ -765,6 +765,7 @@ module Homebrew
           previous_revision = f.revision
 
           newest_committed_version ||= previous_version
+          newest_committed_checksum ||= previous_checksum
           newest_committed_revision ||= previous_revision
         end
 
@@ -772,7 +773,7 @@ module Homebrew
       end
 
       if current_version == previous_version &&
-         current_checksum != previous_checksum
+         current_checksum != newest_committed_checksum
         problem(
           "stable sha256 changed without the version also changing; " \
           "please create an issue upstream to rule out malicious " \
diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb
index c1418223c5..a7b770592f 100644
--- a/Library/Homebrew/test/dev-cmd/audit_spec.rb
+++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb
@@ -363,6 +363,7 @@ module Homebrew
         origin_formula_path.write <<~RUBY
           class Foo#{foo_version} < Formula
             url "https://brew.sh/foo-1.0.tar.gz"
+            sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"
             revision 2
             version_scheme 1
           end
@@ -388,7 +389,7 @@ module Homebrew
         formula_path.write text
       end
 
-      def formula_gsub_commit(before, after = "")
+      def formula_gsub_origin_commit(before, after = "")
         text = origin_formula_path.read
         text.gsub!(before, after)
         origin_formula_path.unlink
@@ -404,19 +405,48 @@ module Homebrew
         end
       end
 
+      context "checksums" do
+        context "should not change with the same version" do
+          before do
+            formula_gsub(
+              'sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"',
+              'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"',
+            )
+          end
+
+          it { is_expected.to match("stable sha256 changed without the version also changing") }
+        end
+
+        context "can change with the different version" do
+          before do
+            formula_gsub_origin_commit(
+              'sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"',
+              'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"',
+            )
+            formula_gsub "foo-1.0.tar.gz", "foo-1.1.tar.gz"
+            formula_gsub_origin_commit(
+              'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"',
+              'sha256 "e048c5e6144f5932d8672c2fade81d9073d5b3ca1517b84df006de3d25414fc1"',
+            )
+          end
+
+          it { is_expected.to be_nil }
+        end
+      end
+
       context "revisions" do
         context "should not be removed when first committed above 0" do
           it { is_expected.to be_nil }
         end
 
         context "should not decrease with the same version" do
-          before { formula_gsub_commit "revision 2", "revision 1" }
+          before { formula_gsub_origin_commit "revision 2", "revision 1" }
 
           it { is_expected.to match("revision should not decrease (from 2 to 1)") }
         end
 
         context "should not be removed with the same version" do
-          before { formula_gsub_commit "revision 2" }
+          before { formula_gsub_origin_commit "revision 2" }
 
           it { is_expected.to match("revision should not decrease (from 2 to 0)") }
         end
@@ -428,15 +458,15 @@ module Homebrew
         end
 
         context "should be removed with a newer version" do
-          before { formula_gsub_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" }
+          before { formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" }
 
           it { is_expected.to match("'revision 2' should be removed") }
         end
 
         context "should not warn on an newer version revision removal" do
           before do
-            formula_gsub_commit "revision 2", ""
-            formula_gsub_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
+            formula_gsub_origin_commit "revision 2", ""
+            formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
           end
 
           it { is_expected.to be_nil }
@@ -453,9 +483,9 @@ module Homebrew
 
         context "should not warn on past increment by more than 1" do
           before do
-            formula_gsub_commit "revision 2", "# no revision"
-            formula_gsub_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
-            formula_gsub_commit "# no revision", "revision 3"
+            formula_gsub_origin_commit "revision 2", "# no revision"
+            formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
+            formula_gsub_origin_commit "# no revision", "revision 3"
           end
 
           it { is_expected.to be_nil }
@@ -464,16 +494,16 @@ module Homebrew
 
       context "version_schemes" do
         context "should not decrease with the same version" do
-          before { formula_gsub_commit "version_scheme 1" }
+          before { formula_gsub_origin_commit "version_scheme 1" }
 
           it { is_expected.to match("version_scheme should not decrease (from 1 to 0)") }
         end
 
         context "should not decrease with a new version" do
           before do
-            formula_gsub_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
-            formula_gsub_commit "version_scheme 1", ""
-            formula_gsub_commit "revision 2", ""
+            formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
+            formula_gsub_origin_commit "version_scheme 1", ""
+            formula_gsub_origin_commit "revision 2", ""
           end
 
           it { is_expected.to match("version_scheme should not decrease (from 1 to 0)") }
@@ -481,10 +511,10 @@ module Homebrew
 
         context "should only increment by 1" do
           before do
-            formula_gsub_commit "version_scheme 1", "# no version_scheme"
-            formula_gsub_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
-            formula_gsub_commit "revision 2", ""
-            formula_gsub_commit "# no version_scheme", "version_scheme 3"
+            formula_gsub_origin_commit "version_scheme 1", "# no version_scheme"
+            formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz"
+            formula_gsub_origin_commit "revision 2", ""
+            formula_gsub_origin_commit "# no version_scheme", "version_scheme 3"
           end
 
           it { is_expected.to match("version_schemes should only increment by 1") }
@@ -500,8 +530,8 @@ module Homebrew
 
         context "committed can decrease" do
           before do
-            formula_gsub_commit "revision 2"
-            formula_gsub_commit "foo-1.0.tar.gz", "foo-0.9.tar.gz"
+            formula_gsub_origin_commit "revision 2"
+            formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-0.9.tar.gz"
           end
 
           it { is_expected.to be_nil }

From f7c3f66eb1900ed2e57c0e125a55222080f4d535 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
 <27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Fri, 3 Jul 2020 09:43:26 +0000
Subject: [PATCH 124/149] build(deps): bump rubocop-rspec in /Library/Homebrew

Bumps [rubocop-rspec](https://github.com/rubocop-hq/rubocop-rspec) from 1.40.0 to 1.41.0.
- [Release notes](https://github.com/rubocop-hq/rubocop-rspec/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop-rspec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop-rspec/compare/v1.40.0...v1.41.0)

Signed-off-by: dependabot-preview[bot] 
---
 Library/Homebrew/Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock
index e5aecfc14b..3bf243b987 100644
--- a/Library/Homebrew/Gemfile.lock
+++ b/Library/Homebrew/Gemfile.lock
@@ -93,7 +93,7 @@ GEM
       parser (>= 2.7.0.1)
     rubocop-performance (1.6.1)
       rubocop (>= 0.71.0)
-    rubocop-rspec (1.40.0)
+    rubocop-rspec (1.41.0)
       rubocop (>= 0.68.1)
     ruby-macho (2.2.0)
     ruby-progressbar (1.10.1)

From 7f651de7befd2f447e3fdc9a9c13bff49ca4cb2d Mon Sep 17 00:00:00 2001
From: Adrian Ho 
Date: Fri, 3 Jul 2020 19:28:45 +0800
Subject: [PATCH 125/149] Add completion configuration for non-Homebrew fish

Tested on Ubuntu 18.04 LTS
---
 docs/Shell-Completion.md | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/docs/Shell-Completion.md b/docs/Shell-Completion.md
index 34a4c64f59..7d08471ace 100644
--- a/docs/Shell-Completion.md
+++ b/docs/Shell-Completion.md
@@ -54,4 +54,16 @@ Additionally, if you receive "zsh compinit: insecure directories" warnings when
 
 ## Configuring Completions in `fish`
 
-No configuration is needed in `fish`. Friendly!
+No configuration is needed if you're using Homebrew's `fish`. Friendly!
+
+If your `fish` is from somewhere else, add the following to your `~/.config/fish/config.fish`:
+
+```sh
+if test -d (brew --prefix)"/share/fish/completions"
+    set -g -x fish_complete_path $fish_complete_path (brew --prefix)/share/fish/completions
+end
+
+if test -d (brew --prefix)"/share/fish/vendor_completions.d"
+    set -g -x fish_complete_path $fish_complete_path (brew --prefix)/share/fish/vendor_completions.d
+end
+```

From 125ed8cf9381a0502741c0c74ca4ed253569853a Mon Sep 17 00:00:00 2001
From: Adrian Ho 
Date: Fri, 3 Jul 2020 20:24:50 +0800
Subject: [PATCH 126/149] Update Shell-Completion.md

---
 docs/Shell-Completion.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/Shell-Completion.md b/docs/Shell-Completion.md
index 7d08471ace..4ae778f446 100644
--- a/docs/Shell-Completion.md
+++ b/docs/Shell-Completion.md
@@ -60,10 +60,10 @@ If your `fish` is from somewhere else, add the following to your `~/.config/fish
 
 ```sh
 if test -d (brew --prefix)"/share/fish/completions"
-    set -g -x fish_complete_path $fish_complete_path (brew --prefix)/share/fish/completions
+    set -gx fish_complete_path $fish_complete_path (brew --prefix)/share/fish/completions
 end
 
 if test -d (brew --prefix)"/share/fish/vendor_completions.d"
-    set -g -x fish_complete_path $fish_complete_path (brew --prefix)/share/fish/vendor_completions.d
+    set -gx fish_complete_path $fish_complete_path (brew --prefix)/share/fish/vendor_completions.d
 end
 ```

From 23cb93ff1c8f4536924c11d16669d2a51247fa50 Mon Sep 17 00:00:00 2001
From: Claudia 
Date: Fri, 3 Jul 2020 15:39:41 +0200
Subject: [PATCH 127/149] sandbox: do not assume home is inside `/Users`
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

It’s not uncommon to use `/var/${USER}` as a home directory, especially
for shared or CLI-only users.

This fixes an issue where a formula that requires `xcodebuild` is
`brew install`ed from such a shared or CLI-only user account.
In that case, `xcodebuild` would fail because it is denied writing to
`/var/${USER}/Library/Developer/Xcode`.

For details, see: https://gist.github.com/claui/17cd89f8f6b4094ac704f142ea811fd8

Suggested-by: Bo Anderson 
---
 Library/Homebrew/sandbox.rb | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Library/Homebrew/sandbox.rb b/Library/Homebrew/sandbox.rb
index 6da3dc18c2..8e5d9bd384 100644
--- a/Library/Homebrew/sandbox.rb
+++ b/Library/Homebrew/sandbox.rb
@@ -47,12 +47,12 @@ class Sandbox
   end
 
   def allow_cvs
-    allow_write_path "/Users/#{ENV["USER"]}/.cvspass"
+    allow_write_path "#{ENV["HOME"]}/.cvspass"
   end
 
   def allow_fossil
-    allow_write_path "/Users/#{ENV["USER"]}/.fossil"
-    allow_write_path "/Users/#{ENV["USER"]}/.fossil-journal"
+    allow_write_path "#{ENV["HOME"]}/.fossil"
+    allow_write_path "#{ENV["HOME"]}/.fossil-journal"
   end
 
   def allow_write_cellar(formula)
@@ -63,7 +63,7 @@ class Sandbox
 
   # Xcode projects expect access to certain cache/archive dirs.
   def allow_write_xcode
-    allow_write_path "/Users/#{ENV["USER"]}/Library/Developer"
+    allow_write_path "#{ENV["HOME"]}/Library/Developer"
   end
 
   def allow_write_log(formula)

From 30121165d9680d04ff02628161ff4c85db384289 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Fri, 3 Jul 2020 14:55:01 +0100
Subject: [PATCH 128/149] brew vendor-gems: commit updates.

---
 .../Homebrew/vendor/bundle/bundler/setup.rb   | 21 ++---
 .../lib/rubocop/rspec/example_group.rb        | 87 -------------------
 .../config/default.yml                        |  0
 .../lib/rubocop-rspec.rb                      |  1 +
 .../rubocop/cop/rspec/align_left_let_brace.rb |  0
 .../cop/rspec/align_right_let_brace.rb        |  0
 .../lib/rubocop/cop/rspec/any_instance.rb     |  0
 .../lib/rubocop/cop/rspec/around_block.rb     |  0
 .../lib/rubocop/cop/rspec/be.rb               |  0
 .../lib/rubocop/cop/rspec/be_eql.rb           |  0
 .../lib/rubocop/cop/rspec/before_after_all.rb |  0
 .../capybara/current_path_expectation.rb      |  0
 .../cop/rspec/capybara/feature_methods.rb     |  0
 .../cop/rspec/capybara/visibility_matcher.rb  |  0
 .../lib/rubocop/cop/rspec/context_method.rb   |  0
 .../lib/rubocop/cop/rspec/context_wording.rb  |  0
 .../lib/rubocop/cop/rspec/cop.rb              |  0
 .../lib/rubocop/cop/rspec/describe_class.rb   |  8 +-
 .../lib/rubocop/cop/rspec/describe_method.rb  |  0
 .../lib/rubocop/cop/rspec/describe_symbol.rb  |  0
 .../lib/rubocop/cop/rspec/described_class.rb  |  0
 .../rspec/described_class_module_wrapping.rb  |  0
 .../lib/rubocop/cop/rspec/dialect.rb          |  0
 .../rubocop/cop/rspec/empty_example_group.rb  |  0
 .../lib/rubocop/cop/rspec/empty_hook.rb       |  0
 .../cop/rspec/empty_line_after_example.rb     |  0
 .../rspec/empty_line_after_example_group.rb   |  0
 .../cop/rspec/empty_line_after_final_let.rb   |  0
 .../cop/rspec/empty_line_after_hook.rb        |  0
 .../cop/rspec/empty_line_after_subject.rb     |  0
 .../lib/rubocop/cop/rspec/example_length.rb   |  0
 .../cop/rspec/example_without_description.rb  |  0
 .../lib/rubocop/cop/rspec/example_wording.rb  |  0
 .../lib/rubocop/cop/rspec/expect_actual.rb    |  0
 .../lib/rubocop/cop/rspec/expect_change.rb    |  0
 .../lib/rubocop/cop/rspec/expect_in_hook.rb   |  0
 .../lib/rubocop/cop/rspec/expect_output.rb    |  0
 .../attribute_defined_statically.rb           |  7 +-
 .../cop/rspec/factory_bot/create_list.rb      |  0
 .../rspec/factory_bot/factory_class_name.rb   |  0
 .../lib/rubocop/cop/rspec/file_path.rb        |  0
 .../lib/rubocop/cop/rspec/focus.rb            |  0
 .../lib/rubocop/cop/rspec/hook_argument.rb    |  0
 .../cop/rspec/hooks_before_examples.rb        |  0
 .../cop/rspec/implicit_block_expectation.rb   |  0
 .../lib/rubocop/cop/rspec/implicit_expect.rb  |  0
 .../lib/rubocop/cop/rspec/implicit_subject.rb |  0
 .../lib/rubocop/cop/rspec/instance_spy.rb     |  0
 .../rubocop/cop/rspec/instance_variable.rb    | 10 +--
 .../cop/rspec/invalid_predicate_matcher.rb    |  0
 .../lib/rubocop/cop/rspec/it_behaves_like.rb  |  0
 .../rubocop/cop/rspec/iterated_expectation.rb |  0
 .../lib/rubocop/cop/rspec/leading_subject.rb  |  0
 .../cop/rspec/leaky_constant_declaration.rb   |  5 +-
 .../rubocop/cop/rspec/let_before_examples.rb  |  0
 .../lib/rubocop/cop/rspec/let_setup.rb        | 18 +++-
 .../lib/rubocop/cop/rspec/message_chain.rb    |  0
 .../rubocop/cop/rspec/message_expectation.rb  |  0
 .../lib/rubocop/cop/rspec/message_spies.rb    |  0
 .../rspec/missing_example_group_argument.rb   |  0
 .../rubocop/cop/rspec/multiple_describes.rb   |  0
 .../cop/rspec/multiple_expectations.rb        |  0
 .../rubocop/cop/rspec/multiple_subjects.rb    |  0
 .../lib/rubocop/cop/rspec/named_subject.rb    |  0
 .../lib/rubocop/cop/rspec/nested_groups.rb    | 19 ++--
 .../lib/rubocop/cop/rspec/not_to_not.rb       |  0
 .../rubocop/cop/rspec/overwriting_setup.rb    |  0
 .../lib/rubocop/cop/rspec/pending.rb          |  0
 .../rubocop/cop/rspec/predicate_matcher.rb    |  4 +-
 .../rubocop/cop/rspec/rails/http_status.rb    |  0
 .../lib/rubocop/cop/rspec/receive_counts.rb   |  0
 .../lib/rubocop/cop/rspec/receive_never.rb    |  0
 .../rubocop/cop/rspec/repeated_description.rb |  0
 .../lib/rubocop/cop/rspec/repeated_example.rb |  0
 .../cop/rspec/repeated_example_group_body.rb  |  0
 .../repeated_example_group_description.rb     |  0
 .../lib/rubocop/cop/rspec/return_from_stub.rb |  5 +-
 .../lib/rubocop/cop/rspec/scattered_let.rb    |  0
 .../lib/rubocop/cop/rspec/scattered_setup.rb  |  0
 .../lib/rubocop/cop/rspec/shared_context.rb   |  0
 .../lib/rubocop/cop/rspec/shared_examples.rb  |  0
 .../rspec/single_argument_message_chain.rb    |  0
 .../lib/rubocop/cop/rspec/subject_stub.rb     | 12 +--
 .../cop/rspec/unspecified_exception.rb        |  0
 .../rubocop/cop/rspec/variable_definition.rb  |  0
 .../lib/rubocop/cop/rspec/variable_name.rb    |  0
 .../lib/rubocop/cop/rspec/verified_doubles.rb |  0
 .../lib/rubocop/cop/rspec/void_expect.rb      |  0
 .../lib/rubocop/cop/rspec/yield.rb            |  0
 .../lib/rubocop/cop/rspec_cops.rb             |  0
 .../lib/rubocop/rspec.rb                      |  0
 .../lib/rubocop/rspec/align_let_brace.rb      |  0
 .../rubocop/rspec/blank_line_separation.rb    |  0
 .../lib/rubocop/rspec/concept.rb              |  0
 .../lib/rubocop/rspec/config_formatter.rb     |  0
 .../lib/rubocop/rspec/corrector/move_node.rb  |  0
 .../rubocop/rspec/description_extractor.rb    |  0
 .../lib/rubocop/rspec/example.rb              |  0
 .../lib/rubocop/rspec/example_group.rb        | 59 +++++++++++++
 .../lib/rubocop/rspec/factory_bot.rb          |  8 +-
 .../lib/rubocop/rspec/final_end_location.rb   |  0
 .../lib/rubocop/rspec/hook.rb                 |  0
 .../lib/rubocop/rspec/inject.rb               |  0
 .../lib/rubocop/rspec/language.rb             |  0
 .../rubocop/rspec/language/node_pattern.rb    |  4 +
 .../lib/rubocop/rspec/node.rb                 |  0
 .../lib/rubocop/rspec/top_level_describe.rb   |  0
 .../lib/rubocop/rspec/top_level_group.rb      | 44 ++++++++++
 .../lib/rubocop/rspec/variable.rb             |  0
 .../lib/rubocop/rspec/version.rb              |  2 +-
 .../lib/rubocop/rspec/wording.rb              |  0
 111 files changed, 171 insertions(+), 143 deletions(-)
 delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/example_group.rb
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/config/default.yml (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop-rspec.rb (96%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/align_left_let_brace.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/align_right_let_brace.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/any_instance.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/around_block.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/be.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/be_eql.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/before_after_all.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/capybara/feature_methods.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/context_method.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/context_wording.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/cop.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/describe_class.rb (90%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/describe_method.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/describe_symbol.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/described_class.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/described_class_module_wrapping.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/dialect.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_example_group.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_hook.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_line_after_example.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_line_after_example_group.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_line_after_final_let.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_line_after_hook.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/empty_line_after_subject.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/example_length.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/example_without_description.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/example_wording.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/expect_actual.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/expect_change.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/expect_in_hook.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/expect_output.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb (93%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/factory_bot/create_list.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/file_path.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/focus.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/hook_argument.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/hooks_before_examples.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/implicit_block_expectation.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/implicit_expect.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/implicit_subject.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/instance_spy.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/instance_variable.rb (91%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/it_behaves_like.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/iterated_expectation.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/leading_subject.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/leaky_constant_declaration.rb (94%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/let_before_examples.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/let_setup.rb (66%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/message_chain.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/message_expectation.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/message_spies.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/missing_example_group_argument.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/multiple_describes.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/multiple_expectations.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/multiple_subjects.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/named_subject.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/nested_groups.rb (87%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/not_to_not.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/overwriting_setup.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/pending.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/predicate_matcher.rb (99%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/rails/http_status.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/receive_counts.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/receive_never.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/repeated_description.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/repeated_example.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/repeated_example_group_body.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/repeated_example_group_description.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/return_from_stub.rb (97%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/scattered_let.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/scattered_setup.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/shared_context.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/shared_examples.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/single_argument_message_chain.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/subject_stub.rb (92%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/unspecified_exception.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/variable_definition.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/variable_name.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/verified_doubles.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/void_expect.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec/yield.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/cop/rspec_cops.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/align_let_brace.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/blank_line_separation.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/concept.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/config_formatter.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/corrector/move_node.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/description_extractor.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/example.rb (100%)
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/example_group.rb
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/factory_bot.rb (88%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/final_end_location.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/hook.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/inject.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/language.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/language/node_pattern.rb (78%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/node.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/top_level_describe.rb (100%)
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/top_level_group.rb
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/variable.rb (100%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/version.rb (86%)
 rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{rubocop-rspec-1.40.0 => rubocop-rspec-1.41.0}/lib/rubocop/rspec/wording.rb (100%)

diff --git a/Library/Homebrew/vendor/bundle/bundler/setup.rb b/Library/Homebrew/vendor/bundle/bundler/setup.rb
index 9bafb8db70..9b1b09fede 100644
--- a/Library/Homebrew/vendor/bundle/bundler/setup.rb
+++ b/Library/Homebrew/vendor/bundle/bundler/setup.rb
@@ -14,18 +14,15 @@ $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ast-2.4.1/lib"
 $:.unshift "#{path}/"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/byebug-11.1.3"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/byebug-11.1.3/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/connection_pool-2.2.3/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/json-2.3.0"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/json-2.3.0/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/json-2.3.1"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/json-2.3.1/lib"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/docile-1.3.2/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/simplecov-html-0.10.2/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/simplecov-0.16.1/lib"
-$:.unshift "#{path}/../../../../../../../../Library/Ruby/Gems/2.6.0/gems/sync-0.5.0/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/tins-1.25.0/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/term-ansicolor-1.7.1/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/thor-1.0.1/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/coveralls-0.8.23/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/diff-lcs-1.4.2/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/simplecov-html-0.12.2/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/simplecov-0.18.5/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/url-0.3.2/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/codecov-0.1.17/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/connection_pool-2.2.3/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/diff-lcs-1.4.4/lib"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/unf_ext-0.0.7.7"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/unf_ext-0.0.7.7/lib"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/unf-0.1.4/lib"
@@ -67,5 +64,5 @@ $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ruby-progressbar-1.10
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/unicode-display_width-1.7.0/lib"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-0.86.0/lib"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-performance-1.6.1/lib"
-$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-rspec-1.40.0/lib"
+$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-rspec-1.41.0/lib"
 $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ruby-macho-2.2.0/lib"
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/example_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/example_group.rb
deleted file mode 100644
index 8a88ed3f07..0000000000
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/example_group.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-# frozen_string_literal: true
-
-module RuboCop
-  module RSpec
-    # Wrapper for RSpec example groups
-    class ExampleGroup < Concept
-      # @!method scope_change?(node)
-      #
-      #   Detect if the node is an example group or shared example
-      #
-      #   Selectors which indicate that we should stop searching
-      #
-      def_node_matcher :scope_change?, (
-        ExampleGroups::ALL + SharedGroups::ALL + Includes::ALL
-      ).block_pattern
-
-      def subjects
-        subjects_in_scope(node)
-      end
-
-      def examples
-        examples_in_scope(node).map(&Example.public_method(:new))
-      end
-
-      def hooks
-        hooks_in_scope(node).map(&Hook.public_method(:new))
-      end
-
-      private
-
-      def subjects_in_scope(node)
-        node.each_child_node.flat_map do |child|
-          find_subjects(child)
-        end
-      end
-
-      def find_subjects(node)
-        return [] if scope_change?(node)
-
-        if subject?(node)
-          [node]
-        else
-          subjects_in_scope(node)
-        end
-      end
-
-      def hooks_in_scope(node)
-        node.each_child_node.flat_map do |child|
-          find_hooks(child)
-        end
-      end
-
-      def find_hooks(node)
-        return [] if scope_change?(node) || example?(node)
-
-        if hook?(node)
-          [node]
-        else
-          hooks_in_scope(node)
-        end
-      end
-
-      def examples_in_scope(node, &blk)
-        node.each_child_node.flat_map do |child|
-          find_examples(child, &blk)
-        end
-      end
-
-      # Recursively search for examples within the current scope
-      #
-      # Searches node for examples and halts when a scope change is detected
-      #
-      # @param node [RuboCop::Node] node to recursively search for examples
-      #
-      # @return [Array] discovered example nodes
-      def find_examples(node)
-        return [] if scope_change?(node)
-
-        if example?(node)
-          [node]
-        else
-          examples_in_scope(node)
-        end
-      end
-    end
-  end
-end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/config/default.yml b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/config/default.yml
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/config/default.yml
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/config/default.yml
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop-rspec.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop-rspec.rb
similarity index 96%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop-rspec.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop-rspec.rb
index cf9231dd8f..93b5864498 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop-rspec.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop-rspec.rb
@@ -13,6 +13,7 @@ require_relative 'rubocop/rspec/top_level_describe'
 require_relative 'rubocop/rspec/wording'
 require_relative 'rubocop/rspec/language'
 require_relative 'rubocop/rspec/language/node_pattern'
+require_relative 'rubocop/rspec/top_level_group'
 require_relative 'rubocop/rspec/concept'
 require_relative 'rubocop/rspec/example_group'
 require_relative 'rubocop/rspec/example'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/align_left_let_brace.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/align_left_let_brace.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/align_left_let_brace.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/align_left_let_brace.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/align_right_let_brace.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/align_right_let_brace.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/align_right_let_brace.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/align_right_let_brace.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/any_instance.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/any_instance.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/any_instance.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/any_instance.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/around_block.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/around_block.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/around_block.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/around_block.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/be.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/be.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/be.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/be.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/be_eql.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/be_eql.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/be_eql.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/be_eql.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/before_after_all.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/before_after_all.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/before_after_all.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/before_after_all.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/capybara/feature_methods.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/capybara/feature_methods.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/capybara/feature_methods.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/capybara/feature_methods.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/context_method.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/context_method.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/context_method.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/context_method.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/context_wording.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/context_wording.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/context_wording.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/context_wording.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/cop.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/cop.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/cop.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/cop.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_class.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_class.rb
similarity index 90%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_class.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_class.rb
index a2f1aa06cd..6bdf4ffb9e 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_class.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_class.rb
@@ -43,12 +43,14 @@ module RuboCop
         def_node_matcher :rails_metadata?, <<-PATTERN
           (pair
             (sym :type)
-            (sym {:request :feature :system :routing :view})
+            (sym {
+                   :channel :controller :helper :job :mailer :model :request
+                   :routing :view :feature :system :mailbox
+                 }
+            )
           )
         PATTERN
 
-        def_node_matcher :shared_group?, SharedGroups::ALL.block_pattern
-
         def on_top_level_describe(node, (described_value, _))
           return if shared_group?(root_node)
           return if valid_describe?(node)
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_method.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_method.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_method.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_method.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_symbol.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_symbol.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/describe_symbol.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/describe_symbol.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/described_class.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/described_class.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/described_class.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/described_class.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/described_class_module_wrapping.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/described_class_module_wrapping.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/described_class_module_wrapping.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/described_class_module_wrapping.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/dialect.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/dialect.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/dialect.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/dialect.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_example_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_example_group.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_example_group.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_example_group.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_hook.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_hook.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_hook.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_hook.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_example.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_example.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_example.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_example.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_example_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_example_group.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_example_group.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_example_group.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_final_let.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_final_let.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_final_let.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_final_let.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_hook.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_hook.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_hook.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_hook.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_subject.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_subject.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/empty_line_after_subject.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/empty_line_after_subject.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/example_length.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/example_length.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/example_length.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/example_length.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/example_without_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/example_without_description.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/example_without_description.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/example_without_description.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/example_wording.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/example_wording.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/example_wording.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/example_wording.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_actual.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_actual.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_actual.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_actual.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_change.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_change.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_change.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_change.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_in_hook.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_in_hook.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_in_hook.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_in_hook.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_output.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_output.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/expect_output.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/expect_output.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
similarity index 93%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
index 863eb401f4..b081d0ff7f 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
@@ -31,12 +31,15 @@ module RuboCop
             (send _ !#reserved_method? $...)
           PATTERN
 
-          def_node_search :factory_attributes, <<-PATTERN
+          def_node_matcher :factory_attributes, <<-PATTERN
             (block (send _ #attribute_defining_method? ...) _ { (begin $...) $(send ...) } )
           PATTERN
 
           def on_block(node)
-            factory_attributes(node).to_a.flatten.each do |attribute|
+            attributes = factory_attributes(node) || []
+            attributes = [attributes] unless attributes.is_a?(Array)
+
+            attributes.each do |attribute|
               next unless offensive_receiver?(attribute.receiver, node)
               next if proc?(attribute) || association?(attribute.first_argument)
 
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/create_list.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/create_list.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/create_list.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/create_list.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/file_path.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/file_path.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/file_path.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/file_path.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/focus.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/focus.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/focus.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/focus.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/hook_argument.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/hook_argument.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/hook_argument.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/hook_argument.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/hooks_before_examples.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/hooks_before_examples.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/hooks_before_examples.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/hooks_before_examples.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/implicit_block_expectation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/implicit_block_expectation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/implicit_block_expectation.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/implicit_block_expectation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/implicit_expect.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/implicit_expect.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/implicit_expect.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/implicit_expect.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/implicit_subject.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/implicit_subject.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/implicit_subject.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/implicit_subject.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/instance_spy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/instance_spy.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/instance_spy.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/instance_spy.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/instance_variable.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/instance_variable.rb
similarity index 91%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/instance_variable.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/instance_variable.rb
index 3dfec98597..01eee1886f 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/instance_variable.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/instance_variable.rb
@@ -47,13 +47,11 @@ module RuboCop
       #   end
       #
       class InstanceVariable < Cop
+        include RuboCop::RSpec::TopLevelGroup
+
         MSG = 'Avoid instance variables – use let, ' \
               'a method call, or a local variable (if possible).'
 
-        EXAMPLE_GROUP_METHODS = ExampleGroups::ALL + SharedGroups::ALL
-
-        def_node_matcher :spec_group?, EXAMPLE_GROUP_METHODS.block_pattern
-
         def_node_matcher :dynamic_class?, <<-PATTERN
           (block (send (const nil? :Class) :new ...) ...)
         PATTERN
@@ -69,9 +67,7 @@ module RuboCop
 
         def_node_search :ivar_assigned?, '(ivasgn % ...)'
 
-        def on_block(node)
-          return unless spec_group?(node)
-
+        def on_top_level_group(node)
           ivar_usage(node) do |ivar, name|
             next if valid_usage?(ivar)
             next if assignment_only? && !ivar_assigned?(node, name)
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/it_behaves_like.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/it_behaves_like.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/it_behaves_like.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/it_behaves_like.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/iterated_expectation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/iterated_expectation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/iterated_expectation.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/iterated_expectation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/leading_subject.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/leading_subject.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/leading_subject.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/leading_subject.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/leaky_constant_declaration.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/leaky_constant_declaration.rb
similarity index 94%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/leaky_constant_declaration.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/leaky_constant_declaration.rb
index 155aef735a..6431eefbe5 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/leaky_constant_declaration.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/leaky_constant_declaration.rb
@@ -119,11 +119,8 @@ module RuboCop
         private
 
         def inside_describe_block?(node)
-          node.each_ancestor(:block).any?(&method(:in_example_or_shared_group?))
+          node.each_ancestor(:block).any?(&method(:spec_group?))
         end
-
-        def_node_matcher :in_example_or_shared_group?,
-                         (ExampleGroups::ALL + SharedGroups::ALL).block_pattern
       end
     end
   end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/let_before_examples.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/let_before_examples.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/let_before_examples.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/let_before_examples.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/let_setup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/let_setup.rb
similarity index 66%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/let_setup.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/let_setup.rb
index b98a675516..eee06dbe48 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/let_setup.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/let_setup.rb
@@ -28,14 +28,20 @@ module RuboCop
       class LetSetup < Cop
         MSG = 'Do not use `let!` to setup objects not referenced in tests.'
 
-        def_node_search :let_bang, <<-PATTERN
+        def_node_matcher :example_or_shared_group_or_including?,
+                         (
+                           ExampleGroups::ALL + SharedGroups::ALL +
+                           Includes::ALL
+                         ).block_pattern
+
+        def_node_matcher :let_bang, <<-PATTERN
           (block $(send nil? :let! (sym $_)) args ...)
         PATTERN
 
         def_node_search :method_called?, '(send nil? %)'
 
         def on_block(node)
-          return unless example_group?(node)
+          return unless example_or_shared_group_or_including?(node)
 
           unused_let_bang(node) do |let|
             add_offense(let)
@@ -45,10 +51,16 @@ module RuboCop
         private
 
         def unused_let_bang(node)
-          let_bang(node) do |method_send, method_name|
+          child_let_bang(node) do |method_send, method_name|
             yield(method_send) unless method_called?(node, method_name)
           end
         end
+
+        def child_let_bang(node, &block)
+          RuboCop::RSpec::ExampleGroup.new(node).lets.each do |let|
+            let_bang(let, &block)
+          end
+        end
       end
     end
   end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/message_chain.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/message_chain.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/message_chain.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/message_chain.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/message_expectation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/message_expectation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/message_expectation.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/message_expectation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/message_spies.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/message_spies.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/message_spies.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/message_spies.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/missing_example_group_argument.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/missing_example_group_argument.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/missing_example_group_argument.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/missing_example_group_argument.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/multiple_describes.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/multiple_describes.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/multiple_describes.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/multiple_describes.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/multiple_expectations.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/multiple_expectations.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/multiple_expectations.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/multiple_expectations.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/multiple_subjects.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/multiple_subjects.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/multiple_subjects.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/multiple_subjects.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/named_subject.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/named_subject.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/named_subject.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/named_subject.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/nested_groups.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/nested_groups.rb
similarity index 87%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/nested_groups.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/nested_groups.rb
index 87da087648..e626df5061 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/nested_groups.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/nested_groups.rb
@@ -97,13 +97,11 @@ module RuboCop
           "Configuration key `#{DEPRECATED_MAX_KEY}` for #{cop_name} is " \
           'deprecated in favor of `Max`. Please use that instead.'
 
-        def_node_search :find_contexts, ExampleGroups::ALL.block_pattern
-
         def on_top_level_describe(node, _args)
-          find_nested_contexts(node.parent) do |context, nesting|
+          find_nested_example_groups(node.parent) do |example_group, nesting|
             self.max = nesting
             add_offense(
-              context.send_node,
+              example_group.send_node,
               message: message(nesting)
             )
           end
@@ -111,13 +109,14 @@ module RuboCop
 
         private
 
-        def find_nested_contexts(node, nesting: 1, &block)
-          find_contexts(node) do |nested_context|
-            yield(nested_context, nesting) if nesting > max_nesting
+        def find_nested_example_groups(node, nesting: 1, &block)
+          example_group = example_group?(node)
+          yield node, nesting if example_group && nesting > max_nesting
 
-            nested_context.each_child_node do |child|
-              find_nested_contexts(child, nesting: nesting + 1, &block)
-            end
+          next_nesting = example_group ? nesting + 1 : nesting
+
+          node.each_child_node(:block, :begin) do |child|
+            find_nested_example_groups(child, nesting: next_nesting, &block)
           end
         end
 
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/not_to_not.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/not_to_not.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/not_to_not.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/not_to_not.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/overwriting_setup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/overwriting_setup.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/overwriting_setup.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/overwriting_setup.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/pending.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/pending.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/pending.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/pending.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/predicate_matcher.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/predicate_matcher.rb
similarity index 99%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/predicate_matcher.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/predicate_matcher.rb
index 65f1d7c15d..8c55458c21 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/predicate_matcher.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/predicate_matcher.rb
@@ -277,12 +277,12 @@ module RuboCop
       #   expect(foo).to be_something
       #
       #   # also good - It checks "true" strictly.
-      #   expect(foo).to be(true)
+      #   expect(foo.something?).to be(true)
       #
       # @example Strict: false, EnforcedStyle: inflected
       #   # bad
       #   expect(foo.something?).to be_truthy
-      #   expect(foo).to be(true)
+      #   expect(foo.something?).to be(true)
       #
       #   # good
       #   expect(foo).to be_something
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/rails/http_status.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/rails/http_status.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/rails/http_status.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/rails/http_status.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/receive_counts.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/receive_counts.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/receive_counts.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/receive_counts.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/receive_never.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/receive_never.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/receive_never.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/receive_never.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_description.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_description.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_description.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_example.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_example.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_example.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_example.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_example_group_body.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_example_group_body.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_example_group_body.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_example_group_body.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_example_group_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_example_group_description.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/repeated_example_group_description.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/repeated_example_group_description.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/return_from_stub.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/return_from_stub.rb
similarity index 97%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/return_from_stub.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/return_from_stub.rb
index 1888fc48f9..c7f1b5d64d 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/return_from_stub.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/return_from_stub.rb
@@ -40,20 +40,21 @@ module RuboCop
         MSG_BLOCK = 'Use block for static values.'
 
         def_node_search :contains_stub?, '(send nil? :receive (...))'
+        def_node_matcher :stub_with_block?, '(block #contains_stub? ...)'
         def_node_search :and_return_value, <<-PATTERN
           $(send _ :and_return $(...))
         PATTERN
 
         def on_send(node)
-          return unless contains_stub?(node)
           return unless style == :block
+          return unless contains_stub?(node)
 
           check_and_return_call(node)
         end
 
         def on_block(node)
-          return unless contains_stub?(node)
           return unless style == :and_return
+          return unless stub_with_block?(node)
 
           check_block_body(node)
         end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/scattered_let.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/scattered_let.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/scattered_let.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/scattered_let.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/scattered_setup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/scattered_setup.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/scattered_setup.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/scattered_setup.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/shared_context.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/shared_context.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/shared_context.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/shared_context.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/shared_examples.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/shared_examples.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/shared_examples.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/shared_examples.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/single_argument_message_chain.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/single_argument_message_chain.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/single_argument_message_chain.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/single_argument_message_chain.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/subject_stub.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/subject_stub.rb
similarity index 92%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/subject_stub.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/subject_stub.rb
index 9c8b3f3921..f51e419a0e 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/subject_stub.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/subject_stub.rb
@@ -22,6 +22,8 @@ module RuboCop
       #   end
       #
       class SubjectStub < Cop
+        include RuboCop::RSpec::TopLevelGroup
+
         MSG = 'Do not stub methods of the object under test.'
 
         # @!method subject(node)
@@ -75,11 +77,7 @@ module RuboCop
             } ...)
         PATTERN
 
-        def on_block(node)
-          return unless example_group?(node)
-          return if (processed_example_groups & node.ancestors).any?
-
-          processed_example_groups << node
+        def on_top_level_group(node)
           @explicit_subjects = find_all_explicit_subjects(node)
 
           find_subject_expectations(node) do |stub|
@@ -89,10 +87,6 @@ module RuboCop
 
         private
 
-        def processed_example_groups
-          @processed_example_groups ||= Set.new
-        end
-
         def find_all_explicit_subjects(node)
           node.each_descendant(:block).with_object({}) do |child, h|
             name = subject(child)
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/unspecified_exception.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/unspecified_exception.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/unspecified_exception.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/unspecified_exception.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/variable_definition.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/variable_definition.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/variable_definition.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/variable_definition.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/variable_name.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/variable_name.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/variable_name.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/variable_name.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/verified_doubles.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/verified_doubles.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/verified_doubles.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/verified_doubles.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/void_expect.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/void_expect.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/void_expect.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/void_expect.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/yield.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/yield.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec/yield.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec/yield.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec_cops.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec_cops.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/cop/rspec_cops.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/cop/rspec_cops.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/align_let_brace.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/align_let_brace.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/align_let_brace.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/align_let_brace.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/blank_line_separation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/blank_line_separation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/blank_line_separation.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/blank_line_separation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/concept.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/concept.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/concept.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/concept.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/config_formatter.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/config_formatter.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/config_formatter.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/config_formatter.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/corrector/move_node.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/corrector/move_node.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/corrector/move_node.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/corrector/move_node.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/description_extractor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/description_extractor.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/description_extractor.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/description_extractor.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/example.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/example.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/example.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/example.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/example_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/example_group.rb
new file mode 100644
index 0000000000..e5928fe8ad
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/example_group.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module RuboCop
+  module RSpec
+    # Wrapper for RSpec example groups
+    class ExampleGroup < Concept
+      # @!method scope_change?(node)
+      #
+      #   Detect if the node is an example group or shared example
+      #
+      #   Selectors which indicate that we should stop searching
+      #
+      def_node_matcher :scope_change?, (
+        ExampleGroups::ALL + SharedGroups::ALL + Includes::ALL
+      ).block_pattern
+
+      def lets
+        find_all_in_scope(node, :let?)
+      end
+
+      def subjects
+        find_all_in_scope(node, :subject?)
+      end
+
+      def examples
+        find_all_in_scope(node, :example?).map(&Example.public_method(:new))
+      end
+
+      def hooks
+        find_all_in_scope(node, :hook?).map(&Hook.public_method(:new))
+      end
+
+      private
+
+      # Recursively search for predicate within the current scope
+      #
+      # Searches node and halts when a scope change is detected
+      #
+      # @param node [RuboCop::Node] node to recursively search
+      #
+      # @return [Array] discovered nodes
+      def find_all_in_scope(node, predicate)
+        node.each_child_node.flat_map do |child|
+          find_all(child, predicate)
+        end
+      end
+
+      def find_all(node, predicate)
+        if public_send(predicate, node)
+          [node]
+        elsif scope_change?(node) || example?(node)
+          []
+        else
+          find_all_in_scope(node, predicate)
+        end
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/factory_bot.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/factory_bot.rb
similarity index 88%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/factory_bot.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/factory_bot.rb
index 539bcf70c3..9fbda437fd 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/factory_bot.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/factory_bot.rb
@@ -4,7 +4,13 @@ module RuboCop
   module RSpec
     # RuboCop FactoryBot project namespace
     module FactoryBot
-      ATTRIBUTE_DEFINING_METHODS = %i[factory trait transient ignore].freeze
+      ATTRIBUTE_DEFINING_METHODS = %i[
+        factory
+        ignore
+        trait
+        traits_for_enum
+        transient
+      ].freeze
 
       UNPROXIED_METHODS = %i[
         __send__
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/final_end_location.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/final_end_location.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/final_end_location.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/final_end_location.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/hook.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/hook.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/hook.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/hook.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/inject.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/inject.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/inject.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/inject.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/language.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/language.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/language.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/language.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/language/node_pattern.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/language/node_pattern.rb
similarity index 78%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/language/node_pattern.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/language/node_pattern.rb
index 665b7ad706..de4c1da270 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/language/node_pattern.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/language/node_pattern.rb
@@ -8,6 +8,10 @@ module RuboCop
         extend RuboCop::NodePattern::Macros
 
         def_node_matcher :example_group?, ExampleGroups::ALL.block_pattern
+        def_node_matcher :shared_group?, SharedGroups::ALL.block_pattern
+
+        spec_groups = ExampleGroups::ALL + SharedGroups::ALL
+        def_node_matcher :spec_group?, spec_groups.block_pattern
 
         def_node_matcher :example_group_with_body?, <<-PATTERN
           (block #{ExampleGroups::ALL.send_pattern} args [!nil?])
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/node.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/node.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/node.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/node.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/top_level_describe.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/top_level_describe.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/top_level_describe.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/top_level_describe.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/top_level_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/top_level_group.rb
new file mode 100644
index 0000000000..356b4f8b29
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/top_level_group.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module RuboCop
+  module RSpec
+    # Helper methods for top level example group cops
+    module TopLevelGroup
+      extend RuboCop::NodePattern::Macros
+      include RuboCop::RSpec::Language
+
+      def_node_matcher :example_or_shared_group?,
+                       (ExampleGroups::ALL + SharedGroups::ALL).block_pattern
+
+      def on_block(node)
+        return unless respond_to?(:on_top_level_group)
+        return unless top_level_group?(node)
+
+        on_top_level_group(node)
+      end
+
+      private
+
+      def top_level_group?(node)
+        top_level_groups.include?(node)
+      end
+
+      def top_level_groups
+        @top_level_groups ||=
+          top_level_nodes.select { |n| example_or_shared_group?(n) }
+      end
+
+      def top_level_nodes
+        if root_node.begin_type?
+          root_node.children
+        else
+          [root_node]
+        end
+      end
+
+      def root_node
+        processed_source.ast
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/variable.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/variable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/variable.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/variable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/version.rb
similarity index 86%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/version.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/version.rb
index 8fd49bb498..8bc560ebcc 100644
--- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/version.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/version.rb
@@ -4,7 +4,7 @@ module RuboCop
   module RSpec
     # Version information for the RSpec RuboCop plugin.
     module Version
-      STRING = '1.40.0'
+      STRING = '1.41.0'
     end
   end
 end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/wording.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/wording.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.40.0/lib/rubocop/rspec/wording.rb
rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/rubocop-rspec-1.41.0/lib/rubocop/rspec/wording.rb

From 31aac4dfbba99d6f37abfd7d24c9cab357a381e5 Mon Sep 17 00:00:00 2001
From: Rui Chen 
Date: Thu, 2 Jul 2020 12:43:24 -0400
Subject: [PATCH 129/149] throttle gatsby-cli to every 10 rel on multiple of 10

---
 Library/Homebrew/dev-cmd/audit.rb | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index 6992748eb8..95aa7e00c0 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -580,6 +580,7 @@ module Homebrew
       "aws-sdk-cpp" => "10",
       "awscli@1"    => "10",
       "balena-cli"  => "10",
+      "gatsby-cli"  => "10",
       "quicktype"   => "10",
       "vim"         => "50",
     }.freeze

From 1ae38fb2a42d8260cc05c70c8c08957019430357 Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Fri, 3 Jul 2020 10:19:44 -0400
Subject: [PATCH 130/149] Delete IDE files (oops)

---
 Library/Homebrew/.idea/.gitignore             |    8 -
 Library/Homebrew/.idea/Homebrew.iml           | 1087 -----------------
 .../.idea/codeStyles/codeStyleConfig.xml      |    5 -
 .../inspectionProfiles/Project_Default.xml    |    6 -
 Library/Homebrew/.idea/misc.xml               |    7 -
 Library/Homebrew/.idea/modules.xml            |    8 -
 Library/Homebrew/.idea/vcs.xml                |    6 -
 7 files changed, 1127 deletions(-)
 delete mode 100644 Library/Homebrew/.idea/.gitignore
 delete mode 100644 Library/Homebrew/.idea/Homebrew.iml
 delete mode 100644 Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml
 delete mode 100644 Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml
 delete mode 100644 Library/Homebrew/.idea/misc.xml
 delete mode 100644 Library/Homebrew/.idea/modules.xml
 delete mode 100644 Library/Homebrew/.idea/vcs.xml

diff --git a/Library/Homebrew/.idea/.gitignore b/Library/Homebrew/.idea/.gitignore
deleted file mode 100644
index 73f69e0958..0000000000
--- a/Library/Homebrew/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
diff --git a/Library/Homebrew/.idea/Homebrew.iml b/Library/Homebrew/.idea/Homebrew.iml
deleted file mode 100644
index ff55e88eb7..0000000000
--- a/Library/Homebrew/.idea/Homebrew.iml
+++ /dev/null
@@ -1,1087 +0,0 @@
-
-
-  
-    
-  
-  
-    
-      
-      
-      
-      
-    
-    
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-          
-        
-        
-          
-          
-          
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-          
-        
-        
-          
-          
-          
-        
-        
-          
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-          
-        
-        
-          
-          
-        
-        
-          
-        
-      
-    
-    
-      
-        
-          
-        
-          
-        
-        
-          
-        
-      
-    
-    
-  
-
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml b/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index a55e7a179b..0000000000
--- a/Library/Homebrew/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-  
-    
-
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml b/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index b0db9b0fca..0000000000
--- a/Library/Homebrew/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-  
-    
-
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/misc.xml b/Library/Homebrew/.idea/misc.xml
deleted file mode 100644
index da55c2a4c8..0000000000
--- a/Library/Homebrew/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-  
-    
-  
-
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/modules.xml b/Library/Homebrew/.idea/modules.xml
deleted file mode 100644
index d6b4e03f57..0000000000
--- a/Library/Homebrew/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-  
-    
-      
-    
-  
-
\ No newline at end of file
diff --git a/Library/Homebrew/.idea/vcs.xml b/Library/Homebrew/.idea/vcs.xml
deleted file mode 100644
index b2bdec2d71..0000000000
--- a/Library/Homebrew/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-  
-    
-  
-
\ No newline at end of file

From 525d1ac27da028d47c4a7aa41d88c70f18515a4f Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Fri, 3 Jul 2020 10:33:38 -0400
Subject: [PATCH 131/149] Fix PR issues

---
 Library/Homebrew/cli/args.rb      | 5 ++---
 Library/Homebrew/cmd/reinstall.rb | 2 +-
 Library/Homebrew/cmd/uninstall.rb | 2 +-
 3 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb
index 7f76690df7..927703327d 100644
--- a/Library/Homebrew/cli/args.rb
+++ b/Library/Homebrew/cli/args.rb
@@ -246,12 +246,11 @@ module Homebrew
         require "formula"
         require "missing_formula"
 
-        raise UsageError if name.empty?
+        raise UsageError if name.blank?
 
         rack = Formulary.to_rack(name.downcase)
 
         dirs = rack.directory? ? rack.subdirs : []
-
         raise NoSuchKegError, rack.basename if dirs.empty?
 
         linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename
@@ -278,7 +277,7 @@ module Homebrew
             Keg.new(prefix)
           end
         rescue FormulaUnavailableError
-          raise <<~EOS
+          raise MultipleVersionsInstalledError, <<~EOS
             Multiple kegs installed to #{rack}
             However we don't know which one you refer to.
             Please delete (with rm -rf!) all but one and then try again.
diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb
index d5e4a972ae..037260a2ea 100644
--- a/Library/Homebrew/cmd/reinstall.rb
+++ b/Library/Homebrew/cmd/reinstall.rb
@@ -75,7 +75,7 @@ module Homebrew
 
     Homebrew.messages.display_messages
 
-    return if casks.empty?
+    return if casks.blank?
 
     reinstall_cmd = Cask::Cmd::Reinstall.new(casks)
     reinstall_cmd.verbose = args.verbose?
diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb
index ad5f823dbf..2cb101b296 100644
--- a/Library/Homebrew/cmd/uninstall.rb
+++ b/Library/Homebrew/cmd/uninstall.rb
@@ -123,7 +123,7 @@ module Homebrew
       end
     end
 
-    return if casks.empty?
+    return if casks.blank?
 
     cask_uninstall = Cask::Cmd::Uninstall.new(casks)
     cask_uninstall.force = args.force?

From fea704b4546f0ed0489d45d03cdabb9c944e12f1 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Fri, 3 Jul 2020 17:03:29 +0100
Subject: [PATCH 132/149] Move .codecov.yml

>  the file must still be located in the root, dev/, or .github/ directories

https://docs.codecov.io/docs/codecov-yaml#can-i-name-the-file-codecovyml
---
 .github/codecov.yml                | 8 ++++++++
 Library/Homebrew/test/.codecov.yml | 9 ---------
 2 files changed, 8 insertions(+), 9 deletions(-)
 create mode 100644 .github/codecov.yml
 delete mode 100644 Library/Homebrew/test/.codecov.yml

diff --git a/.github/codecov.yml b/.github/codecov.yml
new file mode 100644
index 0000000000..ec60ef7970
--- /dev/null
+++ b/.github/codecov.yml
@@ -0,0 +1,8 @@
+fixes:
+  - "::Library/Homebrew/"
+coverage:
+  round: nearest
+  status:
+    project:
+      default:
+        threshold: 0.05%
diff --git a/Library/Homebrew/test/.codecov.yml b/Library/Homebrew/test/.codecov.yml
deleted file mode 100644
index 27b6f08432..0000000000
--- a/Library/Homebrew/test/.codecov.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-codecov:
-  fixes:
-   - "::Library/Homebrew/"
-  coverage:
-    round: nearest
-    status:
-      project:
-        default:
-          threshold: 0.05%

From e252de5295aa2991c1e0b21af0ce7975766ad742 Mon Sep 17 00:00:00 2001
From: Rylan Polster 
Date: Fri, 3 Jul 2020 14:35:32 -0400
Subject: [PATCH 133/149] style: improve keg_only style checks

---
 Library/Homebrew/rubocops/keg_only.rb         | 18 ++++++--
 .../Homebrew/test/rubocops/keg_only_spec.rb   | 46 ++++++++++++++++++-
 2 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/Library/Homebrew/rubocops/keg_only.rb b/Library/Homebrew/rubocops/keg_only.rb
index 0c3d76ff63..820bf79541 100644
--- a/Library/Homebrew/rubocops/keg_only.rb
+++ b/Library/Homebrew/rubocops/keg_only.rb
@@ -22,18 +22,28 @@ module RuboCop
             Firefox
           ].freeze
 
-          reason = string_content(parameters(keg_only_node).first)
+          reason = parameters(keg_only_node).first
+          offending_node(reason)
           name = Regexp.new(@formula_name, Regexp::IGNORECASE)
-          reason = reason.sub(name, "")
+          reason = string_content(reason).sub(name, "")
           first_word = reason.split.first
 
           if reason =~ /\A[A-Z]/ && !reason.start_with?(*allowlist)
-            problem "'#{first_word}' from the keg_only reason should be '#{first_word.downcase}'."
+            problem "'#{first_word}' from the `keg_only` reason should be '#{first_word.downcase}'."
           end
 
           return unless reason.end_with?(".")
 
-          problem "keg_only reason should not end with a period."
+          problem "`keg_only` reason should not end with a period."
+        end
+
+        def autocorrect(node)
+          lambda do |corrector|
+            reason = string_content(node)
+            reason[0] = reason[0].downcase
+            reason = reason.delete_suffix(".")
+            corrector.replace(node.source_range, "\"#{reason}\"")
+          end
         end
       end
     end
diff --git a/Library/Homebrew/test/rubocops/keg_only_spec.rb b/Library/Homebrew/test/rubocops/keg_only_spec.rb
index dd01dbb327..2f0af35aab 100644
--- a/Library/Homebrew/test/rubocops/keg_only_spec.rb
+++ b/Library/Homebrew/test/rubocops/keg_only_spec.rb
@@ -13,7 +13,7 @@ describe RuboCop::Cop::FormulaAudit::KegOnly do
         homepage "https://brew.sh"
 
         keg_only "Because why not"
-        ^^^^^^^^^^^^^^^^^^^^^^^^^^ 'Because' from the keg_only reason should be 'because'.
+                 ^^^^^^^^^^^^^^^^^ 'Because' from the `keg_only` reason should be 'because'.
       end
     RUBY
   end
@@ -25,11 +25,53 @@ describe RuboCop::Cop::FormulaAudit::KegOnly do
         homepage "https://brew.sh"
 
         keg_only "ending with a period."
-        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ keg_only reason should not end with a period.
+                 ^^^^^^^^^^^^^^^^^^^^^^^ `keg_only` reason should not end with a period.
       end
     RUBY
   end
 
+  specify "keg_only_autocorrects_downcasing" do
+    source = <<~RUBY
+      class Foo < Formula
+        url "https://brew.sh/foo-1.0.tgz"
+        homepage "https://brew.sh"
+        keg_only "Because why not"
+      end
+    RUBY
+
+    corrected_source = <<~RUBY
+      class Foo < Formula
+        url "https://brew.sh/foo-1.0.tgz"
+        homepage "https://brew.sh"
+        keg_only "because why not"
+      end
+    RUBY
+
+    new_source = autocorrect_source(source)
+    expect(new_source).to eq(corrected_source)
+  end
+
+  specify "keg_only_autocorrects_redundant_period" do
+    source = <<~RUBY
+      class Foo < Formula
+        url "https://brew.sh/foo-1.0.tgz"
+        homepage "https://brew.sh"
+        keg_only "ending with a period."
+      end
+    RUBY
+
+    corrected_source = <<~RUBY
+      class Foo < Formula
+        url "https://brew.sh/foo-1.0.tgz"
+        homepage "https://brew.sh"
+        keg_only "ending with a period"
+      end
+    RUBY
+
+    new_source = autocorrect_source(source)
+    expect(new_source).to eq(corrected_source)
+  end
+
   specify "keg_only_handles_block_correctly" do
     expect_no_offenses(<<~RUBY)
       class Foo < Formula

From a7a9793f9974c0f2b4535bef20f6cf02325f6f93 Mon Sep 17 00:00:00 2001
From: Rylan Polster 
Date: Fri, 3 Jul 2020 16:37:32 -0400
Subject: [PATCH 134/149] needs_python? separate formula name from tap name

---
 Library/Homebrew/language/python.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/language/python.rb b/Library/Homebrew/language/python.rb
index 581ee82ac0..a80dd1bd89 100644
--- a/Library/Homebrew/language/python.rb
+++ b/Library/Homebrew/language/python.rb
@@ -167,7 +167,7 @@ module Language
       def needs_python?(python)
         return true if build.with?(python)
 
-        (requirements.to_a | deps).any? { |r| r.name == python && r.required? }
+        (requirements.to_a | deps).any? { |r| r.name.split("/").last == python && r.required? }
       end
 
       # Helper method for the common case of installing a Python application.

From 6e8f5d0958247e4b4d629866099ed2836a0e0863 Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Fri, 3 Jul 2020 18:24:52 -0400
Subject: [PATCH 135/149] Modify MultipleVersionsInstalledError to have a
 generic message

---
 Library/Homebrew/cli/args.rb             | 7 ++++++-
 Library/Homebrew/exceptions.rb           | 9 +--------
 Library/Homebrew/test/exceptions_spec.rb | 2 +-
 3 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb
index 927703327d..167965d6ea 100644
--- a/Library/Homebrew/cli/args.rb
+++ b/Library/Homebrew/cli/args.rb
@@ -246,16 +246,21 @@ module Homebrew
         require "formula"
         require "missing_formula"
 
+        puts 1
         raise UsageError if name.blank?
 
+        puts 2
         rack = Formulary.to_rack(name.downcase)
 
+        puts 3
         dirs = rack.directory? ? rack.subdirs : []
         raise NoSuchKegError, rack.basename if dirs.empty?
 
+        puts 4
         linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename
         opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}"
 
+        puts 5
         begin
           if opt_prefix.symlink? && opt_prefix.directory?
             Keg.new(opt_prefix.resolved_path)
@@ -271,7 +276,7 @@ module Homebrew
             end
 
             unless (prefix = f.installed_prefix).directory?
-              raise MultipleVersionsInstalledError, rack.basename
+              raise MultipleVersionsInstalledError, "#{rack.basename} has multiple installed versions"
             end
 
             Keg.new(prefix)
diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb
index ba47d036b7..bc32524e61 100644
--- a/Library/Homebrew/exceptions.rb
+++ b/Library/Homebrew/exceptions.rb
@@ -29,14 +29,7 @@ class KegUnspecifiedError < UsageError
   end
 end
 
-class MultipleVersionsInstalledError < RuntimeError
-  attr_reader :name
-
-  def initialize(name)
-    @name = name
-    super "#{name} has multiple installed versions"
-  end
-end
+class MultipleVersionsInstalledError < RuntimeError; end
 
 class NotAKegError < RuntimeError; end
 
diff --git a/Library/Homebrew/test/exceptions_spec.rb b/Library/Homebrew/test/exceptions_spec.rb
index ee0aa4f370..79dba60a4e 100644
--- a/Library/Homebrew/test/exceptions_spec.rb
+++ b/Library/Homebrew/test/exceptions_spec.rb
@@ -3,7 +3,7 @@
 require "exceptions"
 
 describe MultipleVersionsInstalledError do
-  subject { described_class.new("foo") }
+  subject { described_class.new("foo has multiple installed versions") }
 
   its(:to_s) { is_expected.to eq("foo has multiple installed versions") }
 end

From df8d22a29b3dfb4313d0b983e92e6683f5df809f Mon Sep 17 00:00:00 2001
From: William Ma 
Date: Fri, 3 Jul 2020 18:27:19 -0400
Subject: [PATCH 136/149] Remove debugging markers (oops)

---
 Library/Homebrew/cli/args.rb | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb
index 167965d6ea..cc7a571764 100644
--- a/Library/Homebrew/cli/args.rb
+++ b/Library/Homebrew/cli/args.rb
@@ -246,21 +246,16 @@ module Homebrew
         require "formula"
         require "missing_formula"
 
-        puts 1
         raise UsageError if name.blank?
 
-        puts 2
         rack = Formulary.to_rack(name.downcase)
 
-        puts 3
         dirs = rack.directory? ? rack.subdirs : []
         raise NoSuchKegError, rack.basename if dirs.empty?
 
-        puts 4
         linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename
         opt_prefix = HOMEBREW_PREFIX/"opt/#{rack.basename}"
 
-        puts 5
         begin
           if opt_prefix.symlink? && opt_prefix.directory?
             Keg.new(opt_prefix.resolved_path)

From 8f59a5749e26680fc567621a001a5604333e34a7 Mon Sep 17 00:00:00 2001
From: Dawid Dziurla 
Date: Sat, 4 Jul 2020 13:12:30 +0200
Subject: [PATCH 137/149] dev-cmd/audit: don't error out if no license is
 detected by GitHub

---
 Library/Homebrew/dev-cmd/audit.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index 95aa7e00c0..fead7b02e6 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -341,7 +341,7 @@ module Homebrew
           return if user.blank?
 
           github_license = GitHub.get_repo_license(user, repo)
-          return if github_license && (github_license == formula.license)
+          return if github_license && [formula.license, "NOASSERTION"].include?(github_license)
 
           problem "License mismatch - GitHub license is: #{github_license}, "\
                   "but Formulae license states: #{formula.license}."

From 6a49d29b08897b471af3f0473da9c59b5527dccc Mon Sep 17 00:00:00 2001
From: Bo Anderson 
Date: Sat, 4 Jul 2020 18:05:31 +0100
Subject: [PATCH 138/149] upgrade: fix error checking dependents

---
 Library/Homebrew/upgrade.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb
index a875bfef83..3a730eccc8 100644
--- a/Library/Homebrew/upgrade.rb
+++ b/Library/Homebrew/upgrade.rb
@@ -161,8 +161,8 @@ module Homebrew
     # Assess the dependents tree again now we've upgraded.
     oh1 "Checking for dependents of upgraded formulae..." unless args.dry_run?
     broken_dependents = CacheStoreDatabase.use(:linkage) do |db|
-      formulae_to_install.flat_map(&:runtime_installed_formula_dependents)
-                         .select do |f|
+      installed_formulae.flat_map(&:runtime_installed_formula_dependents)
+                        .select do |f|
         keg = f.opt_or_installed_prefix_keg
         next unless keg
 

From b909fdd30f727b22bf030c4c3d3453402a4078ca Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Sat, 4 Jul 2020 14:07:40 +1000
Subject: [PATCH 139/149] github: refactor GraphQL APIs

---
 Library/Homebrew/utils/github.rb | 102 ++++++++++++++++++++-----------
 1 file changed, 67 insertions(+), 35 deletions(-)

diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb
index cc7fa75cd7..4ac886a188 100644
--- a/Library/Homebrew/utils/github.rb
+++ b/Library/Homebrew/utils/github.rb
@@ -231,6 +231,15 @@ module GitHub
     end
   end
 
+  def open_graphql(query, scopes: [].freeze)
+    data = { query: query }
+    result = open_api("https://api.github.com/graphql", scopes: scopes, data: data, request_method: "POST")
+
+    raise Error, result["errors"].map { |e| "#{e["type"]}: #{e["message"]}" }.join("\n") if result["errors"].present?
+
+    result["data"]
+  end
+
   def raise_api_error(output, errors, http_code, headers, scopes)
     json = begin
       JSON.parse(output)
@@ -393,30 +402,26 @@ module GitHub
   end
 
   def approved_reviews(user, repo, pr, commit: nil)
-    url = "https://api.github.com/graphql"
-    data = {
-      query: <<~EOS,
-        { repository(name: "#{repo}", owner: "#{user}") {
-            pullRequest(number: #{pr}) {
-              reviews(states: APPROVED, first: 100) {
-                nodes {
-                  author {
-                    ... on User { email login name databaseId }
-                    ... on Organization { email login name databaseId }
-                  }
-                  authorAssociation
-                  commit { oid }
+    query = <<~EOS
+      { repository(name: "#{repo}", owner: "#{user}") {
+          pullRequest(number: #{pr}) {
+            reviews(states: APPROVED, first: 100) {
+              nodes {
+                author {
+                  ... on User { email login name databaseId }
+                  ... on Organization { email login name databaseId }
                 }
+                authorAssociation
+                commit { oid }
               }
             }
           }
         }
-      EOS
-    }
-    result = open_api(url, scopes: ["user:email"], data: data, request_method: "POST")
-    raise Error, result["errors"] if result["errors"].present?
+      }
+    EOS
 
-    reviews = result["data"]["repository"]["pullRequest"]["reviews"]["nodes"]
+    result = open_graphql(query, scopes: ["user:email"])
+    reviews = result["repository"]["pullRequest"]["reviews"]["nodes"]
 
     reviews.map do |r|
       next if commit.present? && commit != r["commit"]["oid"]
@@ -493,20 +498,21 @@ module GitHub
   end
 
   def sponsors_by_tier(user)
-    url = "https://api.github.com/graphql"
-    data = {
-      query: <<~EOS,
-          {
-            organization(login: "#{user}") {
-              sponsorsListing {
-                tiers(first: 100) {
-                  nodes {
-                    monthlyPriceInDollars
-                    adminInfo {
-                    sponsorships(first: 100) {
-                      totalCount
-                      nodes {
-                        sponsor { login }
+    query = <<~EOS
+        { organization(login: "#{user}") {
+          sponsorsListing {
+            tiers(first: 10, orderBy: {field: MONTHLY_PRICE_IN_CENTS, direction: DESC}) {
+              nodes {
+                monthlyPriceInDollars
+                adminInfo {
+                  sponsorships(first: 100, includePrivate: true) {
+                    totalCount
+                    nodes {
+                      privacyLevel
+                      sponsorEntity {
+                        __typename
+                        ... on Organization { login name }
+                        ... on User { login name }
                       }
                     }
                   }
@@ -515,9 +521,35 @@ module GitHub
             }
           }
         }
-      EOS
-    }
-    open_api(url, scopes: ["admin:org", "user"], data: data, request_method: "POST")
+      }
+    EOS
+    result = open_graphql(query, scopes: ["admin:org", "user"])
+
+    tiers = result["organization"]["sponsorsListing"]["tiers"]["nodes"]
+
+    tiers.map do |t|
+      tier = t["monthlyPriceInDollars"]
+      raise Error, "Your token needs the 'admin:org' scope to access this API" if t["adminInfo"].nil?
+
+      sponsorships = t["adminInfo"]["sponsorships"]
+      count = sponsorships["totalCount"]
+      sponsors = sponsorships["nodes"].map do |sponsor|
+        next unless sponsor["privacyLevel"] == "PUBLIC"
+
+        se = sponsor["sponsorEntity"]
+        {
+          "name"  => se["name"].presence || sponsor["login"],
+          "login" => se["login"],
+          "type"  => se["__typename"].downcase,
+        }
+      end.compact
+
+      {
+        "tier"     => tier,
+        "count"    => count,
+        "sponsors" => sponsors,
+      }
+    end.compact
   end
 
   def get_repo_license(user, repo)

From c6e9cff12595e9d96b6f8ef08a798dee42e59478 Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Sat, 4 Jul 2020 15:03:17 +1000
Subject: [PATCH 140/149] dev-cmd: add brew-sponsors.rb

---
 Library/Homebrew/dev-cmd/sponsors.rb          | 59 +++++++++++++++++++
 .../Homebrew/test/dev-cmd/sponsors_spec.rb    |  7 +++
 Library/Homebrew/test/utils/github_spec.rb    |  8 +++
 completions/internal_commands_list.txt        |  1 +
 docs/Manpage.md                               |  5 ++
 manpages/brew.1                               |  3 +
 6 files changed, 83 insertions(+)
 create mode 100644 Library/Homebrew/dev-cmd/sponsors.rb
 create mode 100644 Library/Homebrew/test/dev-cmd/sponsors_spec.rb

diff --git a/Library/Homebrew/dev-cmd/sponsors.rb b/Library/Homebrew/dev-cmd/sponsors.rb
new file mode 100644
index 0000000000..568daa9452
--- /dev/null
+++ b/Library/Homebrew/dev-cmd/sponsors.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require "cli/parser"
+require "utils/github"
+
+module Homebrew
+  module_function
+
+  def sponsors_args
+    Homebrew::CLI::Parser.new do
+      usage_banner <<~EOS
+        `sponsors`
+
+        Print a Markdown summary of Homebrew's GitHub Sponsors, suitable for pasting into a README.
+      EOS
+    end
+  end
+
+  def sponsors
+    sponsors_args.parse
+
+    sponsors = {
+      "named" => [],
+      "users" => 0,
+      "orgs"  => 0,
+    }
+
+    GitHub.sponsors_by_tier("Homebrew").each do |tier|
+      sponsors["named"] += tier["sponsors"] if tier["tier"] >= 100
+      sponsors["users"] += tier["count"]
+      sponsors["orgs"] += tier["sponsors"].count { |s| s["type"] == "organization" }
+    end
+
+    items = []
+    items += sponsors["named"].map { |s| "[#{s["name"]}](https://github.com/#{s["login"]})" }
+
+    anon_users = sponsors["users"] - sponsors["named"].length - sponsors["orgs"]
+
+    items << if items.length > 1
+      "#{anon_users} other users"
+    else
+      "#{anon_users} users"
+    end
+
+    if sponsors["orgs"] == 1
+      items << "#{sponsors["orgs"]} organization"
+    elsif sponsors["orgs"] > 1
+      items << "#{sponsors["orgs"]} organizations"
+    end
+
+    sponsor_text = if items.length > 2
+      items[0..-2].join(", ") + " and #{items.last}"
+    else
+      items.join(" and ")
+    end
+
+    puts "Homebrew is generously supported by #{sponsor_text} via [GitHub Sponsors](https://github.com/sponsors/Homebrew)."
+  end
+end
diff --git a/Library/Homebrew/test/dev-cmd/sponsors_spec.rb b/Library/Homebrew/test/dev-cmd/sponsors_spec.rb
new file mode 100644
index 0000000000..667dff55b6
--- /dev/null
+++ b/Library/Homebrew/test/dev-cmd/sponsors_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require "cmd/shared_examples/args_parse"
+
+describe "Homebrew.sponsors_args" do
+  it_behaves_like "parseable arguments"
+end
diff --git a/Library/Homebrew/test/utils/github_spec.rb b/Library/Homebrew/test/utils/github_spec.rb
index 354c2585c4..37f2fd0483 100644
--- a/Library/Homebrew/test/utils/github_spec.rb
+++ b/Library/Homebrew/test/utils/github_spec.rb
@@ -49,6 +49,14 @@ describe GitHub do
     end
   end
 
+  describe "::sponsors_by_tier", :needs_network do
+    it "errors on an unauthenticated token" do
+      expect {
+        subject.sponsors_by_tier("Homebrew")
+      }.to raise_error(/INSUFFICIENT_SCOPES|FORBIDDEN/)
+    end
+  end
+
   describe "::get_artifact_url", :needs_network do
     it "fails to find a nonexistant workflow" do
       expect {
diff --git a/completions/internal_commands_list.txt b/completions/internal_commands_list.txt
index 69f6c41c2a..3beacf0b09 100644
--- a/completions/internal_commands_list.txt
+++ b/completions/internal_commands_list.txt
@@ -71,6 +71,7 @@ ruby
 search
 sh
 shellenv
+sponsors
 style
 switch
 tap
diff --git a/docs/Manpage.md b/docs/Manpage.md
index 2709a17839..aaabdb46e6 100644
--- a/docs/Manpage.md
+++ b/docs/Manpage.md
@@ -967,6 +967,11 @@ build systems would not find otherwise.
 * `--env`:
   Use the standard `PATH` instead of superenv's when `std` is passed.
 
+### `sponsors`
+
+Print a Markdown summary of Homebrew's GitHub Sponsors, suitable for pasting
+into a README.
+
 ### `style` [*`options`*] [*`file`*|*`tap`*|*`formula`*]
 
 Check formulae or files for conformance to Homebrew style guidelines.
diff --git a/manpages/brew.1 b/manpages/brew.1
index a653c4df12..4972791289 100644
--- a/manpages/brew.1
+++ b/manpages/brew.1
@@ -1254,6 +1254,9 @@ Start a Homebrew build environment shell\. Uses our years\-battle\-hardened Home
 \fB\-\-env\fR
 Use the standard \fBPATH\fR instead of superenv\'s when \fBstd\fR is passed\.
 .
+.SS "\fBsponsors\fR"
+Print a Markdown summary of Homebrew\'s GitHub Sponsors, suitable for pasting into a README\.
+.
 .SS "\fBstyle\fR [\fIoptions\fR] [\fIfile\fR|\fItap\fR|\fIformula\fR]"
 Check formulae or files for conformance to Homebrew style guidelines\.
 .

From 28168e923272c4147ca45805e1f8f03be70e677f Mon Sep 17 00:00:00 2001
From: Jonathan Chang 
Date: Sat, 4 Jul 2020 15:03:55 +1000
Subject: [PATCH 141/149] README: update sponsors

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 5270a44b8d..8ff7588354 100644
--- a/README.md
+++ b/README.md
@@ -88,3 +88,5 @@ Secure password storage and syncing is provided by [1Password for Teams](https:/
 Homebrew is a member of the [Software Freedom Conservancy](https://sfconservancy.org).
 
 [![Software Freedom Conservancy](https://sfconservancy.org/img/conservancy_64x64.png)](https://sfconservancy.org)
+
+Homebrew is generously supported by [Zeno R.R. Davatz](https://github.com/zdavatz), [Randy Reddig](https://github.com/ydnar) and 262 other users via [GitHub Sponsors](https://github.com/sponsors/Homebrew).

From 3bb2c06a087f09514fb318046fd2823e92190694 Mon Sep 17 00:00:00 2001
From: miccal 
Date: Sun, 5 Jul 2020 18:56:48 +0800
Subject: [PATCH 142/149] Update Homebrew-and-Python.md

---
 docs/Homebrew-and-Python.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/Homebrew-and-Python.md b/docs/Homebrew-and-Python.md
index a1994a3df1..cd987a98dd 100644
--- a/docs/Homebrew-and-Python.md
+++ b/docs/Homebrew-and-Python.md
@@ -24,13 +24,13 @@ The Python formulae install [pip](https://pip.pypa.io/) (as `pip3`) and [Setupto
 Setuptools can be updated via pip3, without having to re-brew Python:
 
 ```sh
-python3 -m pip3 install --upgrade setuptools
+python3 -m pip install --upgrade setuptools
 ```
 
 Similarly, pip3 can be used to upgrade itself via:
 
 ```sh
-python3 -m pip3 install --upgrade pip3
+python3 -m pip install --upgrade pip
 ```
 
 ## `site-packages` and the `PYTHONPATH`

From 0786003fe9d3aef49e62b329d2ed7795d5f871cc Mon Sep 17 00:00:00 2001
From: Rylan Polster 
Date: Sun, 5 Jul 2020 12:12:36 -0400
Subject: [PATCH 143/149] Add tests for autocorrect

---
 Library/Homebrew/rubocops/lines.rb           |   4 +-
 Library/Homebrew/test/rubocops/lines_spec.rb | 105 +++++++++++++++++++
 2 files changed, 107 insertions(+), 2 deletions(-)

diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb
index ca62165b9d..0626fc346b 100644
--- a/Library/Homebrew/rubocops/lines.rb
+++ b/Library/Homebrew/rubocops/lines.rb
@@ -267,7 +267,7 @@ module RuboCop
           shell_metacharacters = %w[> < < | ; : & * $ ? : ~ + @ !` ( ) [ ]]
 
           find_every_method_call_by_name(body_node, :system).each do |method|
-            # Continue if a shell metacharacter is present
+            # Only separate when no shell metacharacters are present
             next if shell_metacharacters.any? { |meta| string_content(parameters(method).first).include?(meta) }
 
             next unless match = regex_match_group(parameters(method).first, shell_cmd_with_spaces_regex)
@@ -281,7 +281,7 @@ module RuboCop
             find_instance_method_call(body_node, "Utils", command) do |method|
               index = parameters(method).first.hash_type? ? 1 : 0
 
-              # Continue if a shell metacharacter is present
+              # Only separate when no shell metacharacters are present
               next if shell_metacharacters.any? { |meta| string_content(parameters(method)[index]).include?(meta) }
 
               next unless match = regex_match_group(parameters(method)[index], shell_cmd_with_spaces_regex)
diff --git a/Library/Homebrew/test/rubocops/lines_spec.rb b/Library/Homebrew/test/rubocops/lines_spec.rb
index 395c3de540..370bea30a9 100644
--- a/Library/Homebrew/test/rubocops/lines_spec.rb
+++ b/Library/Homebrew/test/rubocops/lines_spec.rb
@@ -715,6 +715,111 @@ describe RuboCop::Cop::FormulaAudit::ShellCommands do
         end
       RUBY
     end
+
+    it "separates shell commands in system" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "foo bar"
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "foo", "bar"
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands with string interpolation in system" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "\#{foo}/bar baz"
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "\#{foo}/bar", "baz"
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands in Utils.popen_read" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo bar")
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo", "bar")
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands with string interpolation in Utils.popen_read" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("\#{foo}/bar baz")
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("\#{foo}/bar", "baz")
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands following a shell variable in Utils.popen_read" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read({ "SHELL" => "bash" }, "foo bar")
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read({ "SHELL" => "bash" }, "foo", "bar")
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
   end
 end
 

From 5cbdae75e7a2773f1abcb95bd4d105fcc9df9562 Mon Sep 17 00:00:00 2001
From: Rui Chen 
Date: Sun, 5 Jul 2020 12:47:15 -0400
Subject: [PATCH 144/149] Remove cargo-completion formula

relates to Homebrew/homebrew-core#57029, Homebrew/homebrew-core#57494
---
 Library/Homebrew/missing_formula.rb | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Library/Homebrew/missing_formula.rb b/Library/Homebrew/missing_formula.rb
index 43e2fdf7b3..8205a56634 100644
--- a/Library/Homebrew/missing_formula.rb
+++ b/Library/Homebrew/missing_formula.rb
@@ -85,6 +85,10 @@ module Homebrew
           cargo is part of the rust formula:
             brew install rust
         EOS
+        when "cargo-completion" then <<~EOS
+          cargo-completion is part of the rust formula:
+            brew install rust
+        EOS
         when "uconv" then <<~EOS
           uconv is part of the icu4c formula:
             brew install icu4c

From ae0d37e911f2ad0c97f9f9a1687304ce22664571 Mon Sep 17 00:00:00 2001
From: Rylan Polster 
Date: Sun, 5 Jul 2020 13:57:49 -0400
Subject: [PATCH 145/149] Transfer to FormulaAuditStrict

---
 Library/Homebrew/rubocops/lines.rb           |  98 ++--
 Library/Homebrew/test/rubocops/lines_spec.rb | 498 +++++++++----------
 2 files changed, 298 insertions(+), 298 deletions(-)

diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb
index 0626fc346b..93c9cd3ba9 100644
--- a/Library/Homebrew/rubocops/lines.rb
+++ b/Library/Homebrew/rubocops/lines.rb
@@ -252,55 +252,6 @@ module RuboCop
         end
       end
 
-      class ShellCommands < FormulaCop
-        def audit_formula(_node, _class_node, _parent_class_node, body_node)
-          # Match shell commands separated by spaces in the same string
-          shell_cmd_with_spaces_regex = /[^"' ]*(?:\s[^"' ]*)+/
-
-          popen_commands = [
-            :popen_read,
-            :safe_popen_read,
-            :popen_write,
-            :safe_popen_write,
-          ]
-
-          shell_metacharacters = %w[> < < | ; : & * $ ? : ~ + @ !` ( ) [ ]]
-
-          find_every_method_call_by_name(body_node, :system).each do |method|
-            # Only separate when no shell metacharacters are present
-            next if shell_metacharacters.any? { |meta| string_content(parameters(method).first).include?(meta) }
-
-            next unless match = regex_match_group(parameters(method).first, shell_cmd_with_spaces_regex)
-
-            good_args = match[0].gsub(" ", "\", \"")
-            offending_node(parameters(method).first)
-            problem "Separate `system` commands into `\"#{good_args}\"`"
-          end
-
-          popen_commands.each do |command|
-            find_instance_method_call(body_node, "Utils", command) do |method|
-              index = parameters(method).first.hash_type? ? 1 : 0
-
-              # Only separate when no shell metacharacters are present
-              next if shell_metacharacters.any? { |meta| string_content(parameters(method)[index]).include?(meta) }
-
-              next unless match = regex_match_group(parameters(method)[index], shell_cmd_with_spaces_regex)
-
-              good_args = match[0].gsub(" ", "\", \"")
-              offending_node(parameters(method)[index])
-              problem "Separate `Utils.#{command}` commands into `\"#{good_args}\"`"
-            end
-          end
-        end
-
-        def autocorrect(node)
-          lambda do |corrector|
-            good_args = node.source.gsub(" ", "\", \"")
-            corrector.replace(node.source_range, good_args)
-          end
-        end
-      end
-
       class Miscellaneous < FormulaCop
         def audit_formula(_node, _class_node, _parent_class_node, body_node)
           # FileUtils is included in Formula
@@ -604,6 +555,55 @@ module RuboCop
           end
         end
       end
+
+      class ShellCommands < FormulaCop
+        def audit_formula(_node, _class_node, _parent_class_node, body_node)
+          # Match shell commands separated by spaces in the same string
+          shell_cmd_with_spaces_regex = /[^"' ]*(?:\s[^"' ]*)+/
+
+          popen_commands = [
+            :popen_read,
+            :safe_popen_read,
+            :popen_write,
+            :safe_popen_write,
+          ]
+
+          shell_metacharacters = %w[> < < | ; : & * $ ? : ~ + @ !` ( ) [ ]]
+
+          find_every_method_call_by_name(body_node, :system).each do |method|
+            # Only separate when no shell metacharacters are present
+            next if shell_metacharacters.any? { |meta| string_content(parameters(method).first).include?(meta) }
+
+            next unless match = regex_match_group(parameters(method).first, shell_cmd_with_spaces_regex)
+
+            good_args = match[0].gsub(" ", "\", \"")
+            offending_node(parameters(method).first)
+            problem "Separate `system` commands into `\"#{good_args}\"`"
+          end
+
+          popen_commands.each do |command|
+            find_instance_method_call(body_node, "Utils", command) do |method|
+              index = parameters(method).first.hash_type? ? 1 : 0
+
+              # Only separate when no shell metacharacters are present
+              next if shell_metacharacters.any? { |meta| string_content(parameters(method)[index]).include?(meta) }
+
+              next unless match = regex_match_group(parameters(method)[index], shell_cmd_with_spaces_regex)
+
+              good_args = match[0].gsub(" ", "\", \"")
+              offending_node(parameters(method)[index])
+              problem "Separate `Utils.#{command}` commands into `\"#{good_args}\"`"
+            end
+          end
+        end
+
+        def autocorrect(node)
+          lambda do |corrector|
+            good_args = node.source.gsub(" ", "\", \"")
+            corrector.replace(node.source_range, good_args)
+          end
+        end
+      end
     end
   end
 end
diff --git a/Library/Homebrew/test/rubocops/lines_spec.rb b/Library/Homebrew/test/rubocops/lines_spec.rb
index 370bea30a9..95ad56c311 100644
--- a/Library/Homebrew/test/rubocops/lines_spec.rb
+++ b/Library/Homebrew/test/rubocops/lines_spec.rb
@@ -574,255 +574,6 @@ describe RuboCop::Cop::FormulaAudit::ShellVariables do
   end
 end
 
-describe RuboCop::Cop::FormulaAudit::ShellCommands do
-  subject(:cop) { described_class.new }
-
-  context "When auditing shell commands" do
-    it "system arguments should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            system "foo bar"
-                   ^^^^^^^^^ Separate `system` commands into `\"foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "system arguments with string interpolation should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            system "\#{bin}/foo bar"
-                   ^^^^^^^^^^^^^^^^ Separate `system` commands into `\"\#{bin}/foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "system arguments with metacharacters should not be separated" do
-      expect_no_offenses(<<~RUBY)
-        class Foo < Formula
-          def install
-            system "foo bar > baz"
-          end
-        end
-      RUBY
-    end
-
-    it "only the first system argument should be separated" do
-      expect_no_offenses(<<~RUBY)
-        class Foo < Formula
-          def install
-            system "foo", "bar baz"
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.popen arguments should not be separated" do
-      expect_no_offenses(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen("foo bar")
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.popen_read arguments should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen_read("foo bar")
-                             ^^^^^^^^^ Separate `Utils.popen_read` commands into `\"foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.safe_popen_read arguments should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.safe_popen_read("foo bar")
-                                  ^^^^^^^^^ Separate `Utils.safe_popen_read` commands into `\"foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.popen_write arguments should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen_write("foo bar")
-                              ^^^^^^^^^ Separate `Utils.popen_write` commands into `\"foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.safe_popen_write arguments should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.safe_popen_write("foo bar")
-                                   ^^^^^^^^^ Separate `Utils.safe_popen_write` commands into `\"foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.popen_read arguments with string interpolation should be separated" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen_read("\#{bin}/foo bar")
-                             ^^^^^^^^^^^^^^^^ Separate `Utils.popen_read` commands into `\"\#{bin}/foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.popen_read arguments with metacharacters should not be separated" do
-      expect_no_offenses(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen_read("foo bar > baz")
-          end
-        end
-      RUBY
-    end
-
-    it "only the first Utils.popen_read argument should be separated" do
-      expect_no_offenses(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen_read("foo", "bar baz")
-          end
-        end
-      RUBY
-    end
-
-    it "Utils.popen_read arguments should be separated following a shell variable" do
-      expect_offense(<<~RUBY)
-        class Foo < Formula
-          def install
-            Utils.popen_read({ "SHELL" => "bash"}, "foo bar")
-                                                   ^^^^^^^^^ Separate `Utils.popen_read` commands into `\"foo\", \"bar\"`
-          end
-        end
-      RUBY
-    end
-
-    it "separates shell commands in system" do
-      source = <<~RUBY
-        class Foo < Formula
-          def install
-            system "foo bar"
-          end
-        end
-      RUBY
-
-      corrected_source = <<~RUBY
-        class Foo < Formula
-          def install
-            system "foo", "bar"
-          end
-        end
-      RUBY
-
-      new_source = autocorrect_source(source)
-      expect(new_source).to eq(corrected_source)
-    end
-
-    it "separates shell commands with string interpolation in system" do
-      source = <<~RUBY
-        class Foo < Formula
-          def install
-            system "\#{foo}/bar baz"
-          end
-        end
-      RUBY
-
-      corrected_source = <<~RUBY
-        class Foo < Formula
-          def install
-            system "\#{foo}/bar", "baz"
-          end
-        end
-      RUBY
-
-      new_source = autocorrect_source(source)
-      expect(new_source).to eq(corrected_source)
-    end
-
-    it "separates shell commands in Utils.popen_read" do
-      source = <<~RUBY
-        class Foo < Formula
-          def install
-            Utils.popen_read("foo bar")
-          end
-        end
-      RUBY
-
-      corrected_source = <<~RUBY
-        class Foo < Formula
-          def install
-            Utils.popen_read("foo", "bar")
-          end
-        end
-      RUBY
-
-      new_source = autocorrect_source(source)
-      expect(new_source).to eq(corrected_source)
-    end
-
-    it "separates shell commands with string interpolation in Utils.popen_read" do
-      source = <<~RUBY
-        class Foo < Formula
-          def install
-            Utils.popen_read("\#{foo}/bar baz")
-          end
-        end
-      RUBY
-
-      corrected_source = <<~RUBY
-        class Foo < Formula
-          def install
-            Utils.popen_read("\#{foo}/bar", "baz")
-          end
-        end
-      RUBY
-
-      new_source = autocorrect_source(source)
-      expect(new_source).to eq(corrected_source)
-    end
-
-    it "separates shell commands following a shell variable in Utils.popen_read" do
-      source = <<~RUBY
-        class Foo < Formula
-          def install
-            Utils.popen_read({ "SHELL" => "bash" }, "foo bar")
-          end
-        end
-      RUBY
-
-      corrected_source = <<~RUBY
-        class Foo < Formula
-          def install
-            Utils.popen_read({ "SHELL" => "bash" }, "foo", "bar")
-          end
-        end
-      RUBY
-
-      new_source = autocorrect_source(source)
-      expect(new_source).to eq(corrected_source)
-    end
-  end
-end
-
 describe RuboCop::Cop::FormulaAudit::Miscellaneous do
   subject(:cop) { described_class.new }
 
@@ -1345,3 +1096,252 @@ describe RuboCop::Cop::FormulaAuditStrict::MakeCheck do
 
   include_examples "formulae exist", described_class::MAKE_CHECK_ALLOWLIST
 end
+
+describe RuboCop::Cop::FormulaAuditStrict::ShellCommands do
+  subject(:cop) { described_class.new }
+
+  context "When auditing shell commands" do
+    it "system arguments should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            system "foo bar"
+                   ^^^^^^^^^ Separate `system` commands into `\"foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "system arguments with string interpolation should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            system "\#{bin}/foo bar"
+                   ^^^^^^^^^^^^^^^^ Separate `system` commands into `\"\#{bin}/foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "system arguments with metacharacters should not be separated" do
+      expect_no_offenses(<<~RUBY)
+        class Foo < Formula
+          def install
+            system "foo bar > baz"
+          end
+        end
+      RUBY
+    end
+
+    it "only the first system argument should be separated" do
+      expect_no_offenses(<<~RUBY)
+        class Foo < Formula
+          def install
+            system "foo", "bar baz"
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.popen arguments should not be separated" do
+      expect_no_offenses(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen("foo bar")
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.popen_read arguments should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo bar")
+                             ^^^^^^^^^ Separate `Utils.popen_read` commands into `\"foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.safe_popen_read arguments should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.safe_popen_read("foo bar")
+                                  ^^^^^^^^^ Separate `Utils.safe_popen_read` commands into `\"foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.popen_write arguments should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen_write("foo bar")
+                              ^^^^^^^^^ Separate `Utils.popen_write` commands into `\"foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.safe_popen_write arguments should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.safe_popen_write("foo bar")
+                                   ^^^^^^^^^ Separate `Utils.safe_popen_write` commands into `\"foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.popen_read arguments with string interpolation should be separated" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen_read("\#{bin}/foo bar")
+                             ^^^^^^^^^^^^^^^^ Separate `Utils.popen_read` commands into `\"\#{bin}/foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.popen_read arguments with metacharacters should not be separated" do
+      expect_no_offenses(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo bar > baz")
+          end
+        end
+      RUBY
+    end
+
+    it "only the first Utils.popen_read argument should be separated" do
+      expect_no_offenses(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo", "bar baz")
+          end
+        end
+      RUBY
+    end
+
+    it "Utils.popen_read arguments should be separated following a shell variable" do
+      expect_offense(<<~RUBY)
+        class Foo < Formula
+          def install
+            Utils.popen_read({ "SHELL" => "bash"}, "foo bar")
+                                                   ^^^^^^^^^ Separate `Utils.popen_read` commands into `\"foo\", \"bar\"`
+          end
+        end
+      RUBY
+    end
+
+    it "separates shell commands in system" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "foo bar"
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "foo", "bar"
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands with string interpolation in system" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "\#{foo}/bar baz"
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            system "\#{foo}/bar", "baz"
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands in Utils.popen_read" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo bar")
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("foo", "bar")
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands with string interpolation in Utils.popen_read" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("\#{foo}/bar baz")
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read("\#{foo}/bar", "baz")
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+
+    it "separates shell commands following a shell variable in Utils.popen_read" do
+      source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read({ "SHELL" => "bash" }, "foo bar")
+          end
+        end
+      RUBY
+
+      corrected_source = <<~RUBY
+        class Foo < Formula
+          def install
+            Utils.popen_read({ "SHELL" => "bash" }, "foo", "bar")
+          end
+        end
+      RUBY
+
+      new_source = autocorrect_source(source)
+      expect(new_source).to eq(corrected_source)
+    end
+  end
+end

From 5eae33b59da181ff6f973aee19326f80c0d0fa2e Mon Sep 17 00:00:00 2001
From: Michka Popoff 
Date: Sun, 5 Jul 2020 22:24:03 +0200
Subject: [PATCH 146/149] link_overwrite: allow to overwrite files from alias

See https://github.com/Homebrew/homebrew-core/pull/54912#issuecomment-653893645
Formulary.factory("python") points to python@3.8, which breaks link_overwrite
for that case.

This changes checks if the formula is an alias, so that we can still override
the files during installation.
---
 Library/Homebrew/formula.rb | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index de5bd23054..b529758020 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -1112,13 +1112,15 @@ class Formula
       return false if tab_tap.nil?
 
       begin
-        Formulary.factory(keg.name)
+        f = Formulary.factory(keg.name)
       rescue FormulaUnavailableError
         # formula for this keg is deleted, so defer to allowlist
       rescue TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
         return false # this keg belongs to another formula
       else
-        return false # this keg belongs to another formula
+        # this keg belongs to another formula
+        # but it is not an alias
+        return false unless f.aliases.include? keg.name
       end
     end
     to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s

From 17ca7527f49f6f83ec57563a3f503cc81ea1cc50 Mon Sep 17 00:00:00 2001
From: Mike McQuaid 
Date: Mon, 6 Jul 2020 09:23:04 +0100
Subject: [PATCH 147/149] formula: allow link_overwrite for old name too.

---
 Library/Homebrew/formula.rb | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index b529758020..62d136b086 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -1118,9 +1118,8 @@ class Formula
       rescue TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
         return false # this keg belongs to another formula
       else
-        # this keg belongs to another formula
-        # but it is not an alias
-        return false unless f.aliases.include? keg.name
+        # this keg belongs to another unrelated formula
+        return false unless (f.aliases + f.oldname).include?(keg.name)
       end
     end
     to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s

From 891030227e1126d40510ed59d6e46ebd171b3307 Mon Sep 17 00:00:00 2001
From: Baffour Adu Boampong 
Date: Mon, 6 Jul 2020 13:54:08 +0000
Subject: [PATCH 148/149] Merge master

---
 .../gems/coveralls-0.8.23/lib/coveralls.rb    | 101 +++
 .../coveralls-0.8.23/lib/coveralls/api.rb     | 128 ++++
 .../coveralls-0.8.23/lib/coveralls/command.rb |  69 ++
 .../lib/coveralls/configuration.rb            | 233 +++++++
 .../coveralls-0.8.23/lib/coveralls/output.rb  | 114 ++++
 .../lib/coveralls/rake/task.rb                |  19 +
 .../lib/coveralls/simplecov.rb                | 101 +++
 .../coveralls-0.8.23/lib/coveralls/version.rb |   3 +
 .../lib/term/ansicolor.rb                     | 127 ++++
 .../lib/term/ansicolor/.keep                  |   0
 .../lib/term/ansicolor/attribute.rb           | 142 ++++
 .../lib/term/ansicolor/attribute/color256.rb  |  69 ++
 .../lib/term/ansicolor/attribute/color8.rb    |  25 +
 .../ansicolor/attribute/intense_color8.rb     |  43 ++
 .../lib/term/ansicolor/attribute/text.rb      |  23 +
 .../lib/term/ansicolor/hsl_triple.rb          | 169 +++++
 .../lib/term/ansicolor/movement.rb            | 108 +++
 .../lib/term/ansicolor/ppm_reader.rb          |  96 +++
 .../lib/term/ansicolor/rgb_color_metrics.rb   | 161 +++++
 .../lib/term/ansicolor/rgb_triple.rb          | 179 +++++
 .../lib/term/ansicolor/version.rb             |   8 +
 .../ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb |   2 +
 .../gems/tins-1.25.0/lib/dslkit/polite.rb     |   1 +
 .../2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb |   1 +
 .../ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb  |   2 +
 .../ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb   |  61 ++
 .../2.6.0/gems/tins-1.25.0/lib/tins/alias.rb  |   1 +
 .../gems/tins-1.25.0/lib/tins/annotate.rb     |  38 ++
 .../gems/tins-1.25.0/lib/tins/ask_and_send.rb |  31 +
 .../gems/tins-1.25.0/lib/tins/attempt.rb      | 111 +++
 .../gems/tins-1.25.0/lib/tins/bijection.rb    |  46 ++
 .../tins-1.25.0/lib/tins/case_predicate.rb    |   7 +
 .../gems/tins-1.25.0/lib/tins/complete.rb     |  18 +
 .../gems/tins-1.25.0/lib/tins/concern.rb      |  30 +
 .../gems/tins-1.25.0/lib/tins/count_by.rb     |   8 +
 .../gems/tins-1.25.0/lib/tins/date_dummy.rb   |  53 ++
 .../tins-1.25.0/lib/tins/date_time_dummy.rb   |  51 ++
 .../tins-1.25.0/lib/tins/deep_const_get.rb    |  42 ++
 .../gems/tins-1.25.0/lib/tins/deep_dup.rb     |  11 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb | 636 ++++++++++++++++++
 .../gems/tins-1.25.0/lib/tins/duration.rb     |  95 +++
 .../2.6.0/gems/tins-1.25.0/lib/tins/expose.rb |  27 +
 .../lib/tins/extract_last_argument_options.rb |  14 +
 .../gems/tins-1.25.0/lib/tins/file_binary.rb  |  83 +++
 .../2.6.0/gems/tins-1.25.0/lib/tins/find.rb   | 149 ++++
 .../gems/tins-1.25.0/lib/tins/generator.rb    |  68 ++
 .../2.6.0/gems/tins-1.25.0/lib/tins/go.rb     |  96 +++
 .../lib/tins/hash_symbolize_keys_recursive.rb |  48 ++
 .../gems/tins-1.25.0/lib/tins/hash_union.rb   |  15 +
 .../gems/tins-1.25.0/lib/tins/if_predicate.rb |   7 +
 .../gems/tins-1.25.0/lib/tins/implement.rb    |  40 ++
 .../gems/tins-1.25.0/lib/tins/limited.rb      |  44 ++
 .../gems/tins-1.25.0/lib/tins/lines_file.rb   | 123 ++++
 .../gems/tins-1.25.0/lib/tins/memoize.rb      |  91 +++
 .../lib/tins/method_description.rb            | 143 ++++
 .../gems/tins-1.25.0/lib/tins/minimize.rb     |  55 ++
 .../gems/tins-1.25.0/lib/tins/module_group.rb |  13 +
 .../gems/tins-1.25.0/lib/tins/named_set.rb    |  12 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/null.rb   | 101 +++
 .../2.6.0/gems/tins-1.25.0/lib/tins/once.rb   |  25 +
 .../ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb |  23 +
 .../lib/tins/partial_application.rb           |  31 +
 .../gems/tins-1.25.0/lib/tins/proc_compose.rb |  15 +
 .../gems/tins-1.25.0/lib/tins/proc_prelude.rb |  73 ++
 .../gems/tins-1.25.0/lib/tins/range_plus.rb   |   9 +
 .../tins-1.25.0/lib/tins/require_maybe.rb     |   9 +
 .../gems/tins-1.25.0/lib/tins/responding.rb   |  19 +
 .../gems/tins-1.25.0/lib/tins/secure_write.rb |  27 +
 .../tins-1.25.0/lib/tins/sexy_singleton.rb    |  39 ++
 .../lib/tins/string_byte_order_mark.rb        |  20 +
 .../tins-1.25.0/lib/tins/string_camelize.rb   |  16 +
 .../tins-1.25.0/lib/tins/string_underscore.rb |  15 +
 .../tins-1.25.0/lib/tins/string_version.rb    | 104 +++
 .../gems/tins-1.25.0/lib/tins/subhash.rb      |  42 ++
 .../gems/tins-1.25.0/lib/tins/temp_io.rb      |  26 +
 .../gems/tins-1.25.0/lib/tins/temp_io_enum.rb |  26 +
 .../gems/tins-1.25.0/lib/tins/terminal.rb     |  42 ++
 .../gems/tins-1.25.0/lib/tins/thread_local.rb |  57 ++
 .../gems/tins-1.25.0/lib/tins/time_dummy.rb   |  57 ++
 .../2.6.0/gems/tins-1.25.0/lib/tins/to.rb     |   8 +
 .../gems/tins-1.25.0/lib/tins/to_proc.rb      |  12 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/token.rb  |  36 +
 .../gems/tins-1.25.0/lib/tins/uniq_by.rb      |  10 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/unit.rb   | 179 +++++
 .../gems/tins-1.25.0/lib/tins/version.rb      |   8 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/write.rb  |  19 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/xt.rb     |  45 ++
 .../gems/tins-1.25.0/lib/tins/xt/annotate.rb  |   5 +
 .../tins-1.25.0/lib/tins/xt/ask_and_send.rb   |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/attempt.rb   |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/blank.rb     |  67 ++
 .../tins-1.25.0/lib/tins/xt/case_predicate.rb |   8 +
 .../gems/tins-1.25.0/lib/tins/xt/complete.rb  |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/concern.rb   |  20 +
 .../gems/tins-1.25.0/lib/tins/xt/count_by.rb  |  11 +
 .../tins-1.25.0/lib/tins/xt/date_dummy.rb     |   7 +
 .../lib/tins/xt/date_time_dummy.rb            |   7 +
 .../tins-1.25.0/lib/tins/xt/deep_const_get.rb |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/deep_dup.rb  |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/dslkit.rb    |  22 +
 .../gems/tins-1.25.0/lib/tins/xt/expose.rb    |   5 +
 .../tins/xt/extract_last_argument_options.rb  |   7 +
 .../tins-1.25.0/lib/tins/xt/file_binary.rb    |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/full.rb      |  39 ++
 .../tins/xt/hash_symbolize_keys_recursive.rb  |   7 +
 .../tins-1.25.0/lib/tins/xt/hash_union.rb     |  11 +
 .../tins-1.25.0/lib/tins/xt/if_predicate.rb   |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/implement.rb |   5 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb |  23 +
 .../lib/tins/xt/method_description.rb         |  23 +
 .../gems/tins-1.25.0/lib/tins/xt/named.rb     |  23 +
 .../gems/tins-1.25.0/lib/tins/xt/null.rb      |   9 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb   |   7 +
 .../lib/tins/xt/partial_application.rb        |  11 +
 .../tins-1.25.0/lib/tins/xt/proc_compose.rb   |   7 +
 .../tins-1.25.0/lib/tins/xt/proc_prelude.rb   |   7 +
 .../tins-1.25.0/lib/tins/xt/range_plus.rb     |  12 +
 .../tins-1.25.0/lib/tins/xt/require_maybe.rb  |   7 +
 .../tins-1.25.0/lib/tins/xt/responding.rb     |   7 +
 .../tins-1.25.0/lib/tins/xt/secure_write.rb   |  11 +
 .../tins-1.25.0/lib/tins/xt/sexy_singleton.rb |   3 +
 .../gems/tins-1.25.0/lib/tins/xt/string.rb    |   6 +
 .../lib/tins/xt/string_byte_order_mark.rb     |   7 +
 .../lib/tins/xt/string_camelize.rb            |   6 +
 .../lib/tins/xt/string_underscore.rb          |   6 +
 .../tins-1.25.0/lib/tins/xt/string_version.rb |   7 +
 .../gems/tins-1.25.0/lib/tins/xt/subhash.rb   |  11 +
 .../gems/tins-1.25.0/lib/tins/xt/temp_io.rb   |   5 +
 .../tins-1.25.0/lib/tins/xt/time_dummy.rb     |   7 +
 .../tins-1.25.0/lib/tins/xt/time_freezer.rb   |  15 +
 .../2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb  |   5 +
 .../gems/tins-1.25.0/lib/tins/xt/uniq_by.rb   |  15 +
 .../gems/tins-1.25.0/lib/tins/xt/write.rb     |  11 +
 133 files changed, 5805 insertions(+)
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/.keep
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb
 create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb

diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb
new file mode 100644
index 0000000000..b6d672e89d
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb
@@ -0,0 +1,101 @@
+require "coveralls/version"
+require "coveralls/configuration"
+require "coveralls/api"
+require "coveralls/output"
+require "coveralls/simplecov"
+
+module Coveralls
+  extend self
+
+  class NilFormatter
+    def format(result)
+    end
+  end
+
+  attr_accessor :testing, :noisy, :run_locally
+
+  def wear!(simplecov_setting=nil, &block)
+    setup!
+    start! simplecov_setting, &block
+  end
+
+  def wear_merged!(simplecov_setting=nil, &block)
+    require 'simplecov'
+    @@adapter = :simplecov
+    ::SimpleCov.formatter = NilFormatter
+    start! simplecov_setting, &block
+  end
+
+  def push!
+    require 'simplecov'
+    result = ::SimpleCov::ResultMerger.merged_result
+    Coveralls::SimpleCov::Formatter.new.format result
+  end
+
+  def setup!
+    # Try to load up SimpleCov.
+    @@adapter = nil
+    if defined?(::SimpleCov)
+      @@adapter = :simplecov
+    else
+      begin
+        require 'simplecov'
+        @@adapter = :simplecov if defined?(::SimpleCov)
+      rescue
+      end
+    end
+
+    # Load the appropriate adapter.
+    if @@adapter == :simplecov
+      ::SimpleCov.formatter = Coveralls::SimpleCov::Formatter
+      Coveralls::Output.puts("[Coveralls] Set up the SimpleCov formatter.", :color => "green")
+    else
+      Coveralls::Output.puts("[Coveralls] Couldn't find an appropriate adapter.", :color => "red")
+    end
+
+  end
+
+  def start!(simplecov_setting = 'test_frameworks', &block)
+    if @@adapter == :simplecov
+      ::SimpleCov.add_filter 'vendor'
+
+      if simplecov_setting
+        Coveralls::Output.puts("[Coveralls] Using SimpleCov's '#{simplecov_setting}' settings.", :color => "green")
+        if block_given?
+          ::SimpleCov.start(simplecov_setting) { instance_eval(&block)}
+        else
+          ::SimpleCov.start(simplecov_setting)
+        end
+      elsif block
+        Coveralls::Output.puts("[Coveralls] Using SimpleCov settings defined in block.", :color => "green")
+        ::SimpleCov.start { instance_eval(&block) }
+      else
+        Coveralls::Output.puts("[Coveralls] Using SimpleCov's default settings.", :color => "green")
+        ::SimpleCov.start
+      end
+    end
+  end
+
+  def should_run?
+    # Fail early if we're not on a CI
+    unless will_run?
+      Coveralls::Output.puts("[Coveralls] Outside the CI environment, not sending data.", :color => "yellow")
+      return false
+    end
+
+    if ENV["COVERALLS_RUN_LOCALLY"] || (defined?(@run_locally) && @run_locally)
+      Coveralls::Output.puts("[Coveralls] Creating a new job on Coveralls from local coverage results.", :color => "cyan")
+    end
+
+    true
+  end
+
+  def will_run?
+    ENV["CI"] || ENV["JENKINS_URL"] || ENV['TDDIUM'] ||
+      ENV["COVERALLS_RUN_LOCALLY"] || (defined?(@testing) && @testing)
+  end
+
+  def noisy?
+    ENV["COVERALLS_NOISY"] || (defined?(@noisy) && @noisy)
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb
new file mode 100644
index 0000000000..1b268db347
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb
@@ -0,0 +1,128 @@
+require 'json'
+require 'net/https'
+require 'tempfile'
+
+module Coveralls
+  class API
+    if ENV['COVERALLS_ENDPOINT']
+      API_HOST = ENV['COVERALLS_ENDPOINT']
+      API_DOMAIN = ENV['COVERALLS_ENDPOINT']
+    else
+      API_HOST = ENV['COVERALLS_DEVELOPMENT'] ? "localhost:3000" : "coveralls.io"
+      API_PROTOCOL = ENV['COVERALLS_DEVELOPMENT'] ? "http" : "https"
+      API_DOMAIN = "#{API_PROTOCOL}://#{API_HOST}"
+    end
+
+    API_BASE = "#{API_DOMAIN}/api/v1"
+
+    def self.post_json(endpoint, hash)
+      disable_net_blockers!
+
+      uri = endpoint_to_uri(endpoint)
+
+      Coveralls::Output.puts("#{ JSON.pretty_generate(hash) }", :color => "green") if ENV['COVERALLS_DEBUG']
+      Coveralls::Output.puts("[Coveralls] Submitting to #{API_BASE}", :color => "cyan")
+
+      client  = build_client(uri)
+      request = build_request(uri.path, hash)
+
+      response = client.request(request)
+
+      response_hash = JSON.load(response.body.to_str)
+
+      if response_hash['message']
+        Coveralls::Output.puts("[Coveralls] #{ response_hash['message'] }", :color => "cyan")
+      end
+
+      if response_hash['url']
+        Coveralls::Output.puts("[Coveralls] #{ Coveralls::Output.format(response_hash['url'], :color => "underline") }", :color => "cyan")
+      end
+
+      case response
+      when Net::HTTPServiceUnavailable
+        Coveralls::Output.puts("[Coveralls] API timeout occured, but data should still be processed", :color => "red")
+      when Net::HTTPInternalServerError
+        Coveralls::Output.puts("[Coveralls] API internal error occured, we're on it!", :color => "red")
+      end
+    end
+
+    private
+
+    def self.disable_net_blockers!
+      begin
+        require 'webmock'
+
+        allow = WebMock::Config.instance.allow || []
+        WebMock::Config.instance.allow = [*allow].push API_HOST
+      rescue LoadError
+      end
+
+      begin
+        require 'vcr'
+
+        VCR.send(VCR.version.major < 2 ? :config : :configure) do |c|
+          c.ignore_hosts API_HOST
+        end
+      rescue LoadError
+      end
+    end
+
+    def self.endpoint_to_uri(endpoint)
+      URI.parse("#{API_BASE}/#{endpoint}")
+    end
+
+    def self.build_client(uri)
+      client = Net::HTTP.new(uri.host, uri.port)
+      client.use_ssl = true if uri.port == 443
+      client.verify_mode = OpenSSL::SSL::VERIFY_NONE
+
+      unless client.respond_to?(:ssl_version=)
+        Net::HTTP.ssl_context_accessor("ssl_version")
+      end
+
+      client.ssl_version = 'TLSv1'
+
+      client
+    end
+
+    def self.build_request(path, hash)
+      request  = Net::HTTP::Post.new(path)
+      boundary = rand(1_000_000).to_s
+
+      request.body         = build_request_body(hash, boundary)
+      request.content_type = "multipart/form-data, boundary=#{boundary}"
+
+      request
+    end
+
+    def self.build_request_body(hash, boundary)
+      hash = apified_hash(hash)
+      file = hash_to_file(hash)
+
+      "--#{boundary}\r\n" \
+      "Content-Disposition: form-data; name=\"json_file\"; filename=\"#{File.basename(file.path)}\"\r\n" \
+      "Content-Type: text/plain\r\n\r\n" +
+      File.read(file.path) +
+      "\r\n--#{boundary}--\r\n"
+    end
+
+    def self.hash_to_file(hash)
+      file = nil
+      Tempfile.open(['coveralls-upload', 'json']) do |f|
+        f.write(JSON.dump hash)
+        file = f
+      end
+      File.new(file.path, 'rb')
+    end
+
+    def self.apified_hash hash
+      config = Coveralls::Configuration.configuration
+      if ENV['COVERALLS_DEBUG'] || Coveralls.testing
+        Coveralls::Output.puts "[Coveralls] Submitting with config:", :color => "yellow"
+        output = JSON.pretty_generate(config).gsub(/"repo_token": ?"(.*?)"/,'"repo_token": "[secure]"')
+        Coveralls::Output.puts output, :color => "yellow"
+      end
+      hash.merge(config)
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb
new file mode 100644
index 0000000000..2a9f262cff
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb
@@ -0,0 +1,69 @@
+require "thor"
+
+module Coveralls
+  class CommandLine < Thor
+
+    desc "push", "Runs your test suite and pushes the coverage results to Coveralls."
+    def push
+      return unless ensure_can_run_locally!
+      ENV["COVERALLS_RUN_LOCALLY"] = "true"
+      cmds = "bundle exec rake"
+      if File.exist?('.travis.yml')
+        cmds = YAML.load_file('.travis.yml')["script"] || cmds rescue cmds
+      end
+      cmds.each { |cmd| system cmd }
+      ENV["COVERALLS_RUN_LOCALLY"] = nil
+    end
+
+    desc "report", "Runs your test suite locally and displays coverage statistics."
+    def report
+      ENV["COVERALLS_NOISY"] = "true"
+      exec "bundle exec rake"
+      ENV["COVERALLS_NOISY"] = nil
+    end
+
+    desc "open", "View this repository on Coveralls."
+    def open
+      open_token_based_url "https://coveralls.io/repos/%@"
+    end
+
+    desc "service", "View this repository on your CI service's website."
+    def service
+      open_token_based_url "https://coveralls.io/repos/%@/service"
+    end
+
+    desc "last", "View the last build for this repository on Coveralls."
+    def last
+      open_token_based_url "https://coveralls.io/repos/%@/last_build"
+    end
+
+    desc "version", "See version"
+    def version
+      Coveralls::Output.puts Coveralls::VERSION
+    end
+
+    private
+
+    def open_token_based_url url
+      config = Coveralls::Configuration.configuration
+      if config[:repo_token]
+        url = url.gsub("%@", config[:repo_token])
+        `open #{url}`
+      else
+        Coveralls::Output.puts "No repo_token configured."
+      end
+    end
+
+    def ensure_can_run_locally!
+      config = Coveralls::Configuration.configuration
+      if config[:repo_token].nil?
+        Coveralls::Output.puts "Coveralls cannot run locally because no repo_secret_token is set in .coveralls.yml", :color => "red"
+        Coveralls::Output.puts "Please try again when you get your act together.", :color => "red"
+
+        return false
+      end
+      true
+    end
+
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb
new file mode 100644
index 0000000000..605094f4b3
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb
@@ -0,0 +1,233 @@
+require 'yaml'
+require 'securerandom'
+
+module Coveralls
+  module Configuration
+
+    def self.configuration
+      config = {
+        :environment => self.relevant_env,
+        :git => git
+      }
+      yml = self.yaml_config
+      if yml
+        config[:configuration] = yml
+        config[:repo_token] = yml['repo_token'] || yml['repo_secret_token']
+      end
+      if ENV['COVERALLS_REPO_TOKEN']
+        config[:repo_token] = ENV['COVERALLS_REPO_TOKEN']
+      end
+      if ENV['COVERALLS_PARALLEL'] && ENV['COVERALLS_PARALLEL'] != "false"
+        config[:parallel] = true
+      end
+      if ENV['COVERALLS_FLAG_NAME']
+        config[:flag_name] = ENV['COVERALLS_FLAG_NAME']
+      end
+      if ENV['TRAVIS']
+        set_service_params_for_travis(config, yml ? yml['service_name'] : nil)
+      elsif ENV['CIRCLECI']
+        set_service_params_for_circleci(config)
+      elsif ENV['SEMAPHORE']
+        set_service_params_for_semaphore(config)
+      elsif ENV['JENKINS_URL'] || ENV['JENKINS_HOME']
+        set_service_params_for_jenkins(config)
+      elsif ENV['APPVEYOR']
+        set_service_params_for_appveyor(config)
+      elsif ENV['TDDIUM']
+        set_service_params_for_tddium(config)
+      elsif ENV['GITLAB_CI']
+        set_service_params_for_gitlab(config)
+      elsif ENV['COVERALLS_RUN_LOCALLY'] || Coveralls.testing
+        set_service_params_for_coveralls_local(config)
+      end
+
+      # standardized env vars
+      set_standard_service_params_for_generic_ci(config)
+
+      if service_name = ENV['COVERALLS_SERVICE_NAME']
+        config[:service_name] = service_name
+      end
+
+      config
+    end
+
+    def self.set_service_params_for_travis(config, service_name)
+      config[:service_job_id] = ENV['TRAVIS_JOB_ID']
+      config[:service_pull_request] = ENV['TRAVIS_PULL_REQUEST'] unless ENV['TRAVIS_PULL_REQUEST'] == 'false'
+      config[:service_name]   = service_name || 'travis-ci'
+      config[:service_branch] = ENV['TRAVIS_BRANCH']
+    end
+
+    def self.set_service_params_for_circleci(config)
+      config[:service_name]         = 'circleci'
+      config[:service_number]       = ENV['CIRCLE_BUILD_NUM']
+      config[:service_pull_request] = (ENV['CI_PULL_REQUEST'] || "")[/(\d+)$/,1]
+      config[:parallel]             = ENV['CIRCLE_NODE_TOTAL'].to_i > 1
+      config[:service_job_number]   = ENV['CIRCLE_NODE_INDEX']
+    end
+
+    def self.set_service_params_for_semaphore(config)
+      config[:service_name]         = 'semaphore'
+      config[:service_number]       = ENV['SEMAPHORE_BUILD_NUMBER']
+      config[:service_pull_request] = ENV['PULL_REQUEST_NUMBER']
+    end
+
+    def self.set_service_params_for_jenkins(config)
+      config[:service_name]   = 'jenkins'
+      config[:service_number] = ENV['BUILD_NUMBER']
+      config[:service_branch] = ENV['BRANCH_NAME']
+      config[:service_pull_request] = ENV['ghprbPullId']
+    end
+
+    def self.set_service_params_for_appveyor(config)
+      config[:service_name]   = 'appveyor'
+      config[:service_number] = ENV['APPVEYOR_BUILD_VERSION']
+      config[:service_branch] = ENV['APPVEYOR_REPO_BRANCH']
+      config[:commit_sha] = ENV['APPVEYOR_REPO_COMMIT']
+      repo_name = ENV['APPVEYOR_REPO_NAME']
+      config[:service_build_url]  = 'https://ci.appveyor.com/project/%s/build/%s' % [repo_name, config[:service_number]]
+    end
+
+    def self.set_service_params_for_tddium(config)
+      config[:service_name]         = 'tddium'
+      config[:service_number]       = ENV['TDDIUM_SESSION_ID']
+      config[:service_job_number]   = ENV['TDDIUM_TID']
+      config[:service_pull_request] = ENV['TDDIUM_PR_ID']
+      config[:service_branch]       = ENV['TDDIUM_CURRENT_BRANCH']
+      config[:service_build_url]    = "https://ci.solanolabs.com/reports/#{ENV['TDDIUM_SESSION_ID']}"
+    end
+
+    def self.set_service_params_for_gitlab(config)
+      config[:service_name]         = 'gitlab-ci'
+      config[:service_job_number]   = ENV['CI_BUILD_NAME']
+      config[:service_job_id]       = ENV['CI_BUILD_ID']
+      config[:service_branch]       = ENV['CI_BUILD_REF_NAME']
+      config[:commit_sha]           = ENV['CI_BUILD_REF']
+    end
+
+    def self.set_service_params_for_coveralls_local(config)
+      config[:service_job_id]     = nil
+      config[:service_name]       = 'coveralls-ruby'
+      config[:service_event_type] = 'manual'
+    end
+
+    def self.set_standard_service_params_for_generic_ci(config)
+      config[:service_name]         ||= ENV['CI_NAME']
+      config[:service_number]       ||= ENV['CI_BUILD_NUMBER']
+      config[:service_job_id]       ||= ENV['CI_JOB_ID']
+      config[:service_build_url]    ||= ENV['CI_BUILD_URL']
+      config[:service_branch]       ||= ENV['CI_BRANCH']
+      config[:service_pull_request] ||= (ENV['CI_PULL_REQUEST'] || "")[/(\d+)$/,1]
+    end
+
+    def self.yaml_config
+      if self.configuration_path && File.exist?(self.configuration_path)
+        YAML::load_file(self.configuration_path)
+      end
+    end
+
+    def self.configuration_path
+      File.expand_path(File.join(self.root, ".coveralls.yml")) if self.root
+    end
+
+    def self.root
+      pwd
+    end
+
+    def self.pwd
+      Dir.pwd
+    end
+
+    def self.simplecov_root
+      if defined?(::SimpleCov)
+        ::SimpleCov.root
+      end
+    end
+
+    def self.rails_root
+      Rails.root.to_s
+    rescue
+      nil
+    end
+
+    def self.git
+      hash = {}
+
+      Dir.chdir(root) do
+
+        hash[:head] = {
+          :id => ENV.fetch("GIT_ID", `git log -1 --pretty=format:'%H'`),
+          :author_name => ENV.fetch("GIT_AUTHOR_NAME", `git log -1 --pretty=format:'%aN'`),
+          :author_email => ENV.fetch("GIT_AUTHOR_EMAIL", `git log -1 --pretty=format:'%ae'`),
+          :committer_name => ENV.fetch("GIT_COMMITTER_NAME", `git log -1 --pretty=format:'%cN'`),
+          :committer_email => ENV.fetch("GIT_COMMITTER_EMAIL", `git log -1 --pretty=format:'%ce'`),
+          :message => ENV.fetch("GIT_MESSAGE", `git log -1 --pretty=format:'%s'`)
+        }
+
+        # Branch
+        hash[:branch] = ENV.fetch("GIT_BRANCH", `git rev-parse --abbrev-ref HEAD`)
+
+        # Remotes
+        remotes = nil
+        begin
+          remotes = `git remote -v`.split(/\n/).map do |remote|
+            splits = remote.split(" ").compact
+            {:name => splits[0], :url => splits[1]}
+          end.uniq
+        rescue
+        end
+        hash[:remotes] = remotes
+
+      end
+
+      hash
+
+    rescue Exception => e
+      Coveralls::Output.puts "Coveralls git error:", :color => "red"
+      Coveralls::Output.puts e.to_s, :color => "red"
+      nil
+    end
+
+    def self.relevant_env
+      hash = {
+        :pwd => self.pwd,
+        :rails_root => self.rails_root,
+        :simplecov_root => simplecov_root,
+        :gem_version => VERSION
+      }
+
+      hash.merge! begin
+        if ENV['TRAVIS']
+          {
+            :travis_job_id => ENV['TRAVIS_JOB_ID'],
+            :travis_pull_request => ENV['TRAVIS_PULL_REQUEST'],
+            :branch => ENV['TRAVIS_BRANCH']
+          }
+        elsif ENV['CIRCLECI']
+          {
+            :circleci_build_num => ENV['CIRCLE_BUILD_NUM'],
+            :branch => ENV['CIRCLE_BRANCH'],
+            :commit_sha => ENV['CIRCLE_SHA1']
+          }
+        elsif ENV['JENKINS_URL']
+          {
+            :jenkins_build_num => ENV['BUILD_NUMBER'],
+            :jenkins_build_url => ENV['BUILD_URL'],
+            :branch => ENV['GIT_BRANCH'],
+            :commit_sha => ENV['GIT_COMMIT']
+          }
+        elsif ENV['SEMAPHORE']
+          {
+            :branch => ENV['BRANCH_NAME'],
+            :commit_sha => ENV['REVISION']
+          }
+        else
+          {}
+        end
+      end
+
+      hash
+    end
+
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb
new file mode 100644
index 0000000000..1706f28b74
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb
@@ -0,0 +1,114 @@
+module Coveralls
+  #
+  # Public: Methods for formatting strings with Term::ANSIColor.
+  # Does not utilize monkey-patching and should play nicely when
+  # included with other libraries.
+  #
+  # All methods are module methods and should be called on
+  # the Coveralls::Output module.
+  #
+  # Examples
+  #
+  #   Coveralls::Output.format("Hello World", :color => "cyan")
+  #   # => "\e[36mHello World\e[0m"
+  #
+  #   Coveralls::Output.print("Hello World")
+  #   # Hello World => nil
+  #
+  #   Coveralls::Output.puts("Hello World", :color => "underline")
+  #   # Hello World
+  #   # => nil
+  #
+  # To silence output completely:
+  #
+  #   Coveralls::Output.silent = true
+  #
+  # or set this environment variable:
+  #
+  #   COVERALLS_SILENT
+  #
+  # To disable color completely:
+  #
+  #   Coveralls::Output.no_color = true
+
+  module Output
+    attr_accessor :silent, :no_color
+    attr_writer :output
+    extend self
+
+    def output
+      (defined?(@output) && @output) || $stdout
+    end
+
+    def no_color?
+      (defined?(@no_color)) && @no_color
+    end
+
+    # Public: Formats the given string with the specified color
+    # through Term::ANSIColor
+    #
+    # string  - the text to be formatted
+    # options - The hash of options used for formatting the text:
+    #           :color - The color to be passed as a method to
+    #                    Term::ANSIColor
+    #
+    # Examples
+    #
+    #   Coveralls::Output.format("Hello World!", :color => "cyan")
+    #   # => "\e[36mHello World\e[0m"
+    #
+    # Returns the formatted string.
+    def format(string, options = {})
+      unless no_color?
+        require 'term/ansicolor'
+        if options[:color]
+          options[:color].split(/\s/).reverse_each do |color|
+            if Term::ANSIColor.respond_to?(color.to_sym)
+              string = Term::ANSIColor.send(color.to_sym, string)
+            end
+          end
+        end
+      end
+      string
+    end
+
+    # Public: Passes .format to Kernel#puts
+    #
+    # string  - the text to be formatted
+    # options - The hash of options used for formatting the text:
+    #           :color - The color to be passed as a method to
+    #                    Term::ANSIColor
+    #
+    #
+    # Example
+    #
+    #   Coveralls::Output.puts("Hello World", :color => "cyan")
+    #
+    # Returns nil.
+    def puts(string, options = {})
+      return if silent?
+      (options[:output] || output).puts self.format(string, options)
+    end
+
+    # Public: Passes .format to Kernel#print
+    #
+    # string  - the text to be formatted
+    # options - The hash of options used for formatting the text:
+    #           :color - The color to be passed as a method to
+    #                    Term::ANSIColor
+    #
+    # Example
+    #
+    #   Coveralls::Output.print("Hello World!", :color => "underline")
+    #
+    # Returns nil.
+    def print(string, options = {})
+      return if silent?
+      (options[:output] || output).print self.format(string, options)
+    end
+
+    def silent?
+      ENV["COVERALLS_SILENT"] || (defined?(@silent) && @silent)
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb
new file mode 100644
index 0000000000..f5f3bfa36e
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb
@@ -0,0 +1,19 @@
+require 'rake'
+require 'rake/tasklib'
+
+module Coveralls
+  class RakeTask < ::Rake::TaskLib
+    include ::Rake::DSL if defined?(::Rake::DSL)
+
+    def initialize(*args, &task_block)
+      namespace :coveralls do
+        desc "Push latest coverage results to Coveralls.io"
+        task :push do
+          require 'coveralls'
+          Coveralls.push!
+        end
+      end
+    end # initialize
+
+  end # class
+end # module
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb
new file mode 100644
index 0000000000..9364b18720
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb
@@ -0,0 +1,101 @@
+module Coveralls
+  module SimpleCov
+    class Formatter
+
+      def display_result(result)
+        # Log which files would be submitted.
+        if result.files.length > 0
+          Coveralls::Output.puts "[Coveralls] Some handy coverage stats:"
+        else
+          Coveralls::Output.puts "[Coveralls] There are no covered files.", :color => "yellow"
+        end
+        result.files.each do |f|
+          Coveralls::Output.print "  * "
+          Coveralls::Output.print short_filename(f.filename).to_s, :color => "cyan"
+          Coveralls::Output.print " => ", :color => "white"
+          cov = "#{f.covered_percent.round}%"
+          if f.covered_percent > 90
+            Coveralls::Output.print cov, :color => "green"
+          elsif f.covered_percent > 80
+            Coveralls::Output.print cov, :color => "yellow"
+          else
+            Coveralls::Output.print cov, :color => "red"
+          end
+          Coveralls::Output.puts ""
+        end
+        true
+      end
+
+      def get_source_files(result)
+        # Gather the source files.
+        source_files = []
+        result.files.each do |file|
+          properties = {}
+
+          # Get Source
+          properties[:source] = File.open(file.filename, "rb:utf-8").read
+
+          # Get the root-relative filename
+          properties[:name] = short_filename(file.filename)
+
+          # Get the coverage
+          properties[:coverage] = file.coverage.dup
+
+          # Skip nocov lines
+          file.lines.each_with_index do |line, i|
+            properties[:coverage][i] = nil if line.skipped?
+          end
+
+          source_files << properties
+        end
+        source_files
+      end
+
+      def format(result)
+
+        unless Coveralls.should_run?
+          if Coveralls.noisy?
+            display_result result
+          end
+          return
+        end
+
+        # Post to Coveralls.
+        API.post_json "jobs", 
+          :source_files => get_source_files(result),
+          :test_framework => result.command_name.downcase,
+          :run_at => result.created_at
+
+        Coveralls::Output.puts output_message result
+
+        true
+
+      rescue Exception => e
+        display_error e
+      end
+
+      def display_error(e)
+        Coveralls::Output.puts "Coveralls encountered an exception:", :color => "red"
+        Coveralls::Output.puts e.class.to_s, :color => "red"
+        Coveralls::Output.puts e.message, :color => "red"
+        e.backtrace.each do |line|
+          Coveralls::Output.puts line, :color => "red"
+        end if e.backtrace
+        if e.respond_to?(:response) && e.response
+          Coveralls::Output.puts e.response.to_s, :color => "red"
+        end
+        false
+      end
+
+      def output_message(result)
+        "Coverage is at #{result.covered_percent.round(2) rescue result.covered_percent.round}%.\nCoverage report sent to Coveralls."
+      end
+
+      def short_filename(filename)
+        filename = filename.gsub(::SimpleCov.root, '.').gsub(/^\.\//, '') if ::SimpleCov.root
+        filename
+      end
+
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb
new file mode 100644
index 0000000000..120a9a06e3
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb
@@ -0,0 +1,3 @@
+module Coveralls
+ VERSION = "0.8.23"
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb
new file mode 100644
index 0000000000..7bd5dc4b49
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb
@@ -0,0 +1,127 @@
+require 'tins/xt/full'
+
+module Term
+
+  # The ANSIColor module can be used for namespacing and mixed into your own
+  # classes.
+  module ANSIColor
+    require 'term/ansicolor/version'
+    require 'term/ansicolor/attribute'
+    require 'term/ansicolor/rgb_triple'
+    require 'term/ansicolor/hsl_triple'
+    require 'term/ansicolor/ppm_reader'
+    require 'term/ansicolor/attribute/text'
+    require 'term/ansicolor/attribute/color8'
+    require 'term/ansicolor/attribute/intense_color8'
+    require 'term/ansicolor/attribute/color256'
+    require 'term/ansicolor/movement'
+
+    include Term::ANSIColor::Movement
+
+    # :stopdoc:
+    ATTRIBUTE_NAMES = Attribute.named_attributes.map(&:name)
+    # :startdoc:
+
+    # Returns true if Term::ANSIColor supports the +feature+.
+    #
+    # The feature :clear, that is mixing the clear color attribute into String,
+    # is only supported on ruby implementations, that do *not* already
+    # implement the String#clear method. It's better to use the reset color
+    # attribute instead.
+    def support?(feature)
+      case feature
+      when :clear
+        !String.instance_methods(false).map(&:to_sym).include?(:clear)
+      end
+    end
+    # Returns true, if the coloring function of this module
+    # is switched on, false otherwise.
+    def self.coloring?
+      @coloring
+    end
+
+    # Turns the coloring on or off globally, so you can easily do
+    # this for example:
+    #  Term::ANSIColor::coloring = STDOUT.isatty
+    def self.coloring=(val)
+      @coloring = val
+    end
+    self.coloring = true
+
+    def self.create_color_method(color_name, color_value)
+      module_eval <<-EOT
+        def #{color_name}(string = nil, &block)
+          color(:#{color_name}, string, &block)
+        end
+      EOT
+      self
+    end
+
+    for attribute in Attribute.named_attributes
+       create_color_method(attribute.name, attribute.code)
+    end
+
+    # Regular expression that is used to scan for ANSI-Attributes while
+    # uncoloring strings.
+    COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;5;\d{1,3})?m/
+
+    # Returns an uncolored version of the string, that is all
+    # ANSI-Attributes are stripped from the string.
+    def uncolor(string = nil) # :yields:
+      if block_given?
+        yield.to_str.gsub(COLORED_REGEXP, '')
+      elsif string.respond_to?(:to_str)
+        string.to_str.gsub(COLORED_REGEXP, '')
+      elsif respond_to?(:to_str)
+        to_str.gsub(COLORED_REGEXP, '')
+      else
+        ''
+      end.extend(Term::ANSIColor)
+    end
+
+    alias uncolored uncolor
+
+    # Return +string+ or the result string of the given +block+ colored with
+    # color +name+. If string isn't a string only the escape sequence to switch
+    # on the color +name+ is returned.
+    def color(name, string = nil, &block)
+      attribute = Attribute[name] or raise ArgumentError, "unknown attribute #{name.inspect}"
+      result = ''
+      result << "\e[#{attribute.code}m" if Term::ANSIColor.coloring?
+      if block_given?
+        result << yield.to_s
+      elsif string.respond_to?(:to_str)
+        result << string.to_str
+      elsif respond_to?(:to_str)
+        result << to_str
+      else
+        return result #only switch on
+      end
+      result << "\e[0m" if Term::ANSIColor.coloring?
+      result.extend(Term::ANSIColor)
+    end
+
+    def on_color(name, string = nil, &block)
+      attribute = Attribute[name] or raise ArgumentError, "unknown attribute #{name.inspect}"
+      color("on_#{attribute.name}", string, &block)
+    end
+
+    class << self
+      # Returns an array of all Term::ANSIColor attributes as symbols.
+      def term_ansicolor_attributes
+        ::Term::ANSIColor::ATTRIBUTE_NAMES
+      end
+
+      alias attributes term_ansicolor_attributes
+    end
+
+    # Returns an array of all Term::ANSIColor attributes as symbols.
+    def  term_ansicolor_attributes
+      ::Term::ANSIColor.term_ansicolor_attributes
+    end
+
+    alias attributes term_ansicolor_attributes
+
+    extend self
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/.keep b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/.keep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb
new file mode 100644
index 0000000000..74af3eb877
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb
@@ -0,0 +1,142 @@
+module Term
+  module ANSIColor
+    class Attribute
+      @__store__ = {}
+
+      if RUBY_VERSION < '1.9'
+        @__order__ = []
+
+        def self.set(name, code, options = {})
+          name = name.to_sym
+          result = @__store__[name] = new(name, code, options)
+          @__order__ << name
+          @rgb_colors = nil
+          result
+        end
+
+        def self.attributes(&block)
+          @__order__.map { |name| @__store__[name] }
+        end
+      else
+        def self.set(name, code, options = {})
+          name = name.to_sym
+          result = @__store__[name] = new(name, code, options)
+          @rgb_colors = nil
+          result
+        end
+
+        def self.attributes(&block)
+          @__store__.each_value(&block)
+        end
+      end
+
+      def self.[](name)
+        case
+        when self === name                              then name
+        when Array === name                             then nearest_rgb_color name
+        when name.respond_to?(:to_rgb_triple)           then nearest_rgb_color(name.to_rgb_triple.to_a)
+        when name.to_s =~ /\A(on_)?(\d+)\z/             then get "#$1color#$2"
+        when name.to_s =~ /\A#([0-9a-f]{3}){1,2}\z/i    then nearest_rgb_color name
+        when name.to_s =~ /\Aon_#([0-9a-f]{3}){1,2}\z/i then nearest_rgb_on_color name
+        else                                            get name
+        end
+      end
+
+      def self.get(name)
+        @__store__[name.to_sym]
+      end
+
+      def self.rgb_colors(options = {}, &block)
+        colors = @rgb_colors ||= attributes.select(&:rgb_color?)
+        if options.key?(:gray) && !options[:gray]
+          colors = colors.reject(&:gray?)
+        end
+        colors.each(&block)
+      end
+
+      def self.named_attributes(&block)
+        @named_attributes ||= attributes.reject(&:rgb_color?).each(&block)
+      end
+
+      def self.nearest_rgb_color(color, options = {})
+        rgb = RGBTriple[color]
+        colors = rgb_colors(options)
+        colors.reject(&:background?).min_by { |c| c.distance_to(rgb, options) }
+      end
+
+      def self.nearest_rgb_on_color(color, options = {})
+        rgb = RGBTriple[color]
+        colors = rgb_colors(options)
+        colors.select(&:background?).min_by { |c| c.distance_to(rgb, options) }
+      end
+
+      def initialize(name, code, options = {})
+        @name = name.to_sym
+        @code = code.to_s
+        if html = options[:html]
+          @rgb = RGBTriple.from_html(html)
+        elsif !options.empty?
+          @rgb = RGBTriple.from_hash(options)
+        else
+          @rgb = nil # prevent instance variable not initialized warnings
+        end
+      end
+
+      attr_reader :name
+
+      def code
+        if rgb_color?
+          background? ? "48;5;#{@code}" : "38;5;#{@code}"
+        else
+          @code
+        end
+      end
+
+      def apply(string = nil, &block)
+        ::Term::ANSIColor.color(self, string, &block)
+      end
+
+      def background?
+        @name.to_s.start_with?('on_')
+      end
+
+      attr_reader :rgb
+
+      def rgb_color?
+        !!@rgb
+      end
+
+      def gray?
+        rgb_color? && to_rgb_triple.gray?
+      end
+
+      def to_rgb_triple
+        @rgb
+      end
+
+      def distance_to(other, options = {})
+        if our_rgb = to_rgb_triple and
+          other.respond_to?(:to_rgb_triple) and
+          other_rgb = other.to_rgb_triple
+        then
+          our_rgb.distance_to(other_rgb, options)
+        else
+          1 / 0.0
+        end
+      end
+
+      def gradient_to(other, options = {})
+        if our_rgb = to_rgb_triple and
+          other.respond_to?(:to_rgb_triple) and
+          other_rgb = other.to_rgb_triple
+        then
+          our_rgb.gradient_to(other_rgb, options).map do |rgb_triple|
+            self.class.nearest_rgb_color(rgb_triple, options)
+          end
+        else
+          []
+        end
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb
new file mode 100644
index 0000000000..eb7c4fbff8
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb
@@ -0,0 +1,69 @@
+module Term
+  module ANSIColor
+    class Attribute
+      class Color256
+        Attribute.set :color0, 0, :html => '#000000'
+        Attribute.set :color1, 1, :html => '#800000'
+        Attribute.set :color2, 2, :html => '#808000'
+        Attribute.set :color3, 3, :html => '#808000'
+        Attribute.set :color4, 4, :html => '#000080'
+        Attribute.set :color5, 5, :html => '#800080'
+        Attribute.set :color6, 6, :html => '#008080'
+        Attribute.set :color7, 7, :html => '#c0c0c0'
+
+        Attribute.set :color8, 8, :html => '#808080'
+        Attribute.set :color9, 9, :html => '#ff0000'
+        Attribute.set :color10, 10, :html => '#00ff00'
+        Attribute.set :color11, 11, :html => '#ffff00'
+        Attribute.set :color12, 12, :html => '#0000ff'
+        Attribute.set :color13, 13, :html => '#ff00ff'
+        Attribute.set :color14, 14, :html => '#00ffff'
+        Attribute.set :color15, 15, :html => '#ffffff'
+
+        steps = [ 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff ]
+
+        for i in 16..231
+          red, green, blue = (i - 16).to_s(6).rjust(3, '0').each_char.map { |c| steps[c.to_i] }
+          Attribute.set "color#{i}", i, :red => red, :green => green, :blue => blue
+        end
+
+        grey = 8
+        for i in 232..255
+          Attribute.set "color#{i}", i, :red => grey, :green => grey, :blue => grey
+          grey += 10
+        end
+
+        Attribute.set :on_color0, 0, :html => '#000000'
+        Attribute.set :on_color1, 1, :html => '#800000'
+        Attribute.set :on_color2, 2, :html => '#808000'
+        Attribute.set :on_color3, 3, :html => '#808000'
+        Attribute.set :on_color4, 4, :html => '#000080'
+        Attribute.set :on_color5, 5, :html => '#800080'
+        Attribute.set :on_color6, 6, :html => '#008080'
+        Attribute.set :on_color7, 7, :html => '#c0c0c0'
+
+        Attribute.set :on_color8, 8, :html => '#808080'
+        Attribute.set :on_color9, 9, :html => '#ff0000'
+        Attribute.set :on_color10, 10, :html => '#00ff00'
+        Attribute.set :on_color11, 11, :html => '#ffff00'
+        Attribute.set :on_color12, 12, :html => '#0000ff'
+        Attribute.set :on_color13, 13, :html => '#ff00ff'
+        Attribute.set :on_color14, 14, :html => '#00ffff'
+        Attribute.set :on_color15, 15, :html => '#ffffff'
+
+        steps = [ 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff ]
+
+        for i in 16..231
+          red, green, blue = (i - 16).to_s(6).rjust(3, '0').each_char.map { |c| steps[c.to_i] }
+          Attribute.set "on_color#{i}", i, :red => red, :green => green, :blue => blue
+        end
+
+        grey = 8
+        for i in 232..255
+          Attribute.set "on_color#{i}", i, :red => grey, :green => grey, :blue => grey
+          grey += 10
+        end
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb
new file mode 100644
index 0000000000..4a77fed631
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb
@@ -0,0 +1,25 @@
+module Term
+  module ANSIColor
+    class Attribute
+      class Color8
+        Attribute.set :black,   30
+        Attribute.set :red,     31
+        Attribute.set :green,   32
+        Attribute.set :yellow,  33
+        Attribute.set :blue,    34
+        Attribute.set :magenta, 35
+        Attribute.set :cyan,    36
+        Attribute.set :white,   37
+
+        Attribute.set :on_black,   40
+        Attribute.set :on_red,     41
+        Attribute.set :on_green,   42
+        Attribute.set :on_yellow,  43
+        Attribute.set :on_blue,    44
+        Attribute.set :on_magenta, 45
+        Attribute.set :on_cyan,    46
+        Attribute.set :on_white,   47
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb
new file mode 100644
index 0000000000..6377fbaaca
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb
@@ -0,0 +1,43 @@
+module Term
+  module ANSIColor
+    class Attribute
+      class IntenseColor8
+        # High intensity, aixterm (works in OS X)
+        Attribute.set :intense_black,   90
+        Attribute.set :bright_black,    90
+        Attribute.set :intense_red,     91
+        Attribute.set :bright_red,      91
+        Attribute.set :intense_green,   92
+        Attribute.set :bright_green,    92
+        Attribute.set :intense_yellow,  93
+        Attribute.set :bright_yellow,   93
+        Attribute.set :intense_blue,    94
+        Attribute.set :bright_blue,     94
+        Attribute.set :intense_magenta, 95
+        Attribute.set :bright_magenta,  95
+        Attribute.set :intense_cyan,    96
+        Attribute.set :bright_cyan,     96
+        Attribute.set :intense_white,   97
+        Attribute.set :bright_white,    97
+
+        # High intensity background,  aixterm (works in OS X)
+        Attribute.set :on_intense_black,   100
+        Attribute.set :on_bright_black,    100
+        Attribute.set :on_intense_red,     101
+        Attribute.set :on_bright_red,      101
+        Attribute.set :on_intense_green,   102
+        Attribute.set :on_bright_green,    102
+        Attribute.set :on_intense_yellow,  103
+        Attribute.set :on_bright_yellow,   103
+        Attribute.set :on_intense_blue,    104
+        Attribute.set :on_bright_blue,     104
+        Attribute.set :on_intense_magenta, 105
+        Attribute.set :on_bright_magenta,  105
+        Attribute.set :on_intense_cyan,    106
+        Attribute.set :on_bright_cyan,     106
+        Attribute.set :on_intense_white,   107
+        Attribute.set :on_bright_white,    107
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb
new file mode 100644
index 0000000000..e41d92f2a8
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb
@@ -0,0 +1,23 @@
+module Term
+  module ANSIColor
+    class Attribute
+      class Text
+        Attribute.set :clear,         0 # String#clear already used in String
+        Attribute.set :reset,         0 # synonym for :clear
+        Attribute.set :bold,          1
+        Attribute.set :dark,          2
+        Attribute.set :faint,         2
+        Attribute.set :italic,        3 # not widely implemented
+        Attribute.set :underline,     4
+        Attribute.set :underscore,    4 # synonym for :underline
+        Attribute.set :blink,         5
+        Attribute.set :rapid_blink,   6 # not widely implemented
+        Attribute.set :reverse,       7 # String#reverse already used in String
+        Attribute.set :negative,      7 # synonym for :reverse
+        Attribute.set :concealed,     8
+        Attribute.set :conceal,       8 # synonym for :concealed
+        Attribute.set :strikethrough, 9 # not widely implemented
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb
new file mode 100644
index 0000000000..37e282d177
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb
@@ -0,0 +1,169 @@
+module Term
+  module ANSIColor
+    class HSLTriple
+      def self.from_rgb_triple(rgb)
+        ps = rgb.to_a.map { |x| x / 255.0 }
+        p_min = ps.min
+        p_max = ps.max
+        p_red, p_green, p_blue = ps
+
+        diff = p_max - p_min
+        l = (p_max + p_min) / 2
+
+        if diff.zero?
+          h = s = 0.0
+        else
+          if l < 0.5
+            s = diff / (p_max + p_min)
+          else
+            s = diff / (2 - p_max - p_min)
+          end
+
+          diff_r = ( ( ( p_max - p_red ) / 6 )   + ( diff / 2 ) ) / diff
+          diff_g = ( ( ( p_max - p_green ) / 6 ) + ( diff / 2 ) ) / diff
+          diff_b = ( ( ( p_max - p_blue ) / 6 )  + ( diff / 2 ) ) / diff
+
+          h = case p_max
+              when p_red
+                diff_b - diff_g
+              when p_green
+                (1 / 3.0) + diff_r - diff_b
+              when p_blue
+                (2 / 3.0) + diff_g - diff_r
+              end
+
+          h < 0 and h += 1
+          h > 1 and h -= 1
+        end
+        from_hash(
+          hue:        360 * h,
+          saturation: 100 * s,
+          lightness:  100 * l
+        )
+      end
+
+      def self.from_css(css)
+        case css
+        when /\A\s*hsl\(\s*([^,\s]+)\s*,\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*\)\z/
+          new(Float($1), Float($2), Float($3))
+        end
+      end
+
+      def self.from_hash(options)
+        new(
+          options[:hue].to_f,
+          options[:saturation].to_f,
+          options[:lightness].to_f
+        )
+      end
+
+      def self.[](thing)
+        case
+        when thing.respond_to?(:to_hsl_triple) then thing.to_hsl_triple
+        when thing.respond_to?(:to_hash)       then from_hash(thing.to_hash)
+        when thing.respond_to?(:to_str)
+          thing = thing.to_str
+          from_css(thing.to_str) ||
+            Term::ANSIColor::RGBTriple.from_html(thing).full?(:to_hsl_triple) ||
+            Term::ANSIColor::RGBTriple.from_css(thing).full?(:to_hsl_triple)
+        else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}"
+        end
+      end
+
+      def initialize(hue, saturation, lightness)
+        @hue        = Float(hue) % 360
+        @saturation = [ [ Float(saturation), 0 ].max, 100 ].min
+        @lightness  = [ [ Float(lightness), 0 ].max, 100 ].min
+      end
+
+      attr_reader :hue
+
+      attr_reader :saturation
+
+      attr_reader :lightness
+
+      def lighten(percentage)
+        self.class.new(@hue, @saturation, @lightness + percentage)
+      end
+
+      def darken(percentage)
+        self.class.new(@hue, @saturation, @lightness - percentage)
+      end
+
+      def saturate(percentage)
+        self.class.new(@hue, @saturation + percentage, @lightness)
+      end
+
+      def desaturate(percentage)
+        self.class.new(@hue, @saturation - percentage, @lightness)
+      end
+
+      def adjust_hue(degree)
+        self.class.new(@hue + degree, @saturation, @lightness)
+      end
+
+      def grayscale
+        self.class.new(@hue, 0, @lightness)
+      end
+
+      def complement
+        adjust_hue(180)
+      end
+
+      def hue2rgb(x, y, h)
+        h < 0 and h += 1
+        h > 1 and h -= 1
+        (6 * h) < 1 and return x + (y - x) * 6 * h
+        (2 * h) < 1 and return y
+        (3 * h) < 2 and return x + (y - x) * ( (2 / 3.0) - h ) * 6
+        x
+      end
+      private :hue2rgb
+
+      def to_rgb_triple
+        h = @hue        / 360.0
+        s = @saturation / 100.0
+        l = @lightness  / 100.0
+
+        if s.zero?
+          r = 255 * l
+          g = 255 * l
+          b = 255 * l
+        else
+           if l < 0.5
+             y = l * (1 + s)
+           else
+             y = (l + s) - (s * l)
+           end
+
+           x = 2 * l - y
+
+           r = 255 * hue2rgb(x, y, h + (1 / 3.0))
+           g = 255 * hue2rgb(x, y, h)
+           b = 255 * hue2rgb(x, y, h - (1 / 3.0))
+        end
+        Term::ANSIColor::RGBTriple.new(r.round, g.round, b.round)
+      end
+
+      def to_hsl_triple
+        self
+      end
+
+      def css
+        "hsl(%s,%s%%,%s%%)" % [ @hue, @saturation, @lightness ]
+      end
+
+      def ==(other)
+        to_rgb_triple == other.to_rgb_triple
+      end
+
+      def method_missing(name, *args, &block)
+        if Term::ANSIColor::RGBTriple.method_defined?(name)
+          to_rgb_triple.send(name, *args, &block)
+        else
+          super
+        end
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb
new file mode 100644
index 0000000000..99057d22b1
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb
@@ -0,0 +1,108 @@
+require 'tins/terminal'
+
+module Term
+  module ANSIColor
+    module Movement
+      def terminal_lines
+        Tins::Terminal.lines
+      end
+
+      def terminal_columns
+        Tins::Terminal.columns
+      end
+
+      def move_to(line = 1, column = 1, string = nil, &block)
+        move_command("\e[#{line.to_i};#{column.to_i}H", string, &block)
+      end
+
+      def move_to_column(column = 1, string = nil, &block)
+        move_command("\e[#{column.to_i}G", string, &block)
+      end
+
+      def move_to_line(line = 1, string = nil, &block)
+        move_command("\e[#{line.to_i}f", string, &block)
+      end
+
+      def move_up(lines = 1, string = nil, &block)
+        move_command("\e[#{lines.to_i}A", string, &block)
+      end
+
+      def move_down(lines = 1, string = nil, &block)
+        move_command("\e[#{lines.to_i}B", string, &block)
+      end
+
+      def move_forward(columns = 1, string = nil, &block)
+        move_command("\e[#{columns.to_i}C", string, &block)
+      end
+
+      def move_backward(columns = 1, string = nil, &block)
+        move_command("\e[#{columns.to_i}D", string, &block)
+      end
+
+      def move_to_next_line(lines = 1, string = nil, &block)
+        move_command("\e[#{lines}E", string, &block)
+      end
+
+      def move_to_previous_line(lines = 1, string = nil, &block)
+        move_command("\e[#{lines}F", string, &block)
+      end
+
+      def move_home(string = nil, &block)
+        move_to(1, 1, string, &block)
+      end
+
+      def clear_screen(string = nil, &block)
+        erase_in_display(2, string, &block)
+      end
+
+      def erase_in_display(n = 0, string = nil, &block)
+        move_command("\e[#{n}J", string, &block)
+      end
+
+      def erase_in_line(n = 0, string = nil, &block)
+        move_command("\e[#{n}K", string, &block)
+      end
+
+      def scroll_up(pages = 1, string = nil, &block)
+        move_command("\e[#{pages}S", string, &block)
+      end
+
+      def scroll_down(pages = 1, string = nil, &block)
+        move_command("\e[#{pages}T", string, &block)
+      end
+
+      def save_position(string = nil, &block)
+        move_command("\e[s", string, &block)
+      end
+
+      def restore_position(string = nil, &block)
+        move_command("\e[u", string, &block)
+      end
+
+      def return_to_position(string = nil, &block)
+        save_position("") << move_command("", string, &block) << restore_position("")
+      end
+
+      def show_cursor(string = nil, &block)
+        move_command("\e[?25h", string, &block)
+      end
+
+      def hide_cursor(string = nil, &block)
+        move_command("\e[?25l", string, &block)
+      end
+
+      private
+
+      def move_command(move, string = nil)
+        if block_given?
+          move << yield.to_s
+        elsif string.respond_to?(:to_str)
+          move << string.to_str
+        elsif respond_to?(:to_str)
+          move << to_str
+        end
+        move
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb
new file mode 100644
index 0000000000..233166a15b
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb
@@ -0,0 +1,96 @@
+module Term
+  module ANSIColor
+    class PPMReader
+      include Term::ANSIColor
+
+      def initialize(io, options = {})
+        @io      = io
+        @options = options
+        @buffer  = ''
+      end
+
+      def reset_io
+        begin
+          @io.rewind
+        rescue Errno::ESPIPE
+        end
+        parse_header
+      end
+
+      def each_row
+        reset_io
+        @height.times do
+          yield parse_row
+        end
+      end
+
+      def to_a
+        enum_for(:each_row).to_a
+      end
+
+      def to_s
+        result = ''
+        each_row do |row|
+          last_pixel = nil
+          for pixel in row
+            if pixel != last_pixel
+              color = Attribute.nearest_rgb_color(pixel, @options)
+              result << on_color(color)
+              last_pixel = pixel
+            end
+            result << ' '
+          end
+          result << reset << "\n"
+        end
+        result
+      end
+
+      private
+
+      def parse_row
+        row = []
+        @width.times do
+          row << parse_next_pixel
+        end
+        row
+      end
+
+      def parse_next_pixel
+        pixel = nil
+        case @type
+        when 3
+          @buffer.empty? and @buffer << next_line
+          @buffer.sub!(/(\d+)\s+(\d+)\s+(\d+)\s*/) do
+            pixel = [ $1.to_i, $2.to_i, $3.to_i ]
+            ''
+          end
+        when 6
+          @buffer.size < 3 and @buffer << @io.read(8192)
+          pixel = @buffer.slice!(0, 3).unpack('C3')
+        end
+        pixel
+      end
+
+      def parse_header
+        (line = next_line) =~ /^P([36])$/ or raise "unknown type #{line.to_s.chomp.inspect}"
+        @type = $1.to_i
+
+        if next_line =~ /^(\d+)\s+(\d+)$/
+          @width, @height = $1.to_i, $2.to_i
+        else
+          raise "missing dimensions"
+        end
+
+        unless next_line =~ /^255$/
+          raise "only 255 max color images allowed"
+        end
+      end
+
+      def next_line
+        while line = @io.gets and line =~ /^#|^\s$/
+        end
+        line
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb
new file mode 100644
index 0000000000..f297de0dd2
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb
@@ -0,0 +1,161 @@
+module Term
+  module ANSIColor
+    module RGBColorMetricsHelpers
+      module WeightedEuclideanDistance
+        def weighted_euclidean_distance_to(other, weights = [ 1.0 ] * values.size)
+          sum = 0.0
+          values.zip(other.values, weights) do |s, o, w|
+            sum += w * (s - o) ** 2
+          end
+          Math.sqrt(sum)
+        end
+      end
+
+      module NormalizeRGBTriple
+        private
+
+        def normalize(v)
+          v /= 255.0
+          if v <= 0.04045
+            v / 12
+          else
+            ( (v + 0.055) / 1.055) ** 2.4
+          end
+        end
+
+        def normalize_rgb_triple(rgb_triple)
+          [
+            rgb_triple.red,
+            rgb_triple.green,
+            rgb_triple.blue
+          ].map { |v| normalize(v) }
+        end
+      end
+    end
+
+    module RGBColorMetrics
+      def self.metric(name)
+        metric?(name) or raise ArgumentError, "unknown metric #{name.inspect}"
+      end
+
+      def self.metric?(name)
+        if const_defined?(name)
+          const_get name
+        end
+      end
+
+      def self.metrics
+        constants.map(&:to_sym)
+      end
+
+      # Implements color distance how the old greeks and most donkeys would…
+      module Euclidean
+        def self.distance(rgb1, rgb2)
+          rgb1.weighted_euclidean_distance_to rgb2
+        end
+      end
+
+      # Implements color distance the best way everybody knows…
+      module NTSC
+        def self.distance(rgb1, rgb2)
+          rgb1.weighted_euclidean_distance_to rgb2, [ 0.299, 0.587, 0.114 ]
+        end
+      end
+
+      # Implements color distance as given in:
+      #   http://www.compuphase.com/cmetric.htm
+      module CompuPhase
+        def self.distance(rgb1, rgb2)
+          rmean = (rgb1.red + rgb2.red) / 2
+          rgb1.weighted_euclidean_distance_to rgb2,
+              [ 2 + (rmean >> 8), 4, 2 + ((255 - rmean) >> 8) ]
+        end
+      end
+
+      module YUV
+        class YUVTriple < Struct.new(:y, :u, :v)
+          include RGBColorMetricsHelpers::WeightedEuclideanDistance
+
+          def self.from_rgb_triple(rgb_triple)
+            r, g, b = rgb_triple.red, rgb_triple.green, rgb_triple.blue
+            y = (0.299 * r + 0.587 * g + 0.114 * b).round
+            u = ((b - y) * 0.492).round
+            v = ((r - y) * 0.877).round
+            new(y, u, v)
+          end
+        end
+
+        def self.distance(rgb1, rgb2)
+          yuv1 = YUVTriple.from_rgb_triple(rgb1)
+          yuv2 = YUVTriple.from_rgb_triple(rgb2)
+          yuv1.weighted_euclidean_distance_to yuv2
+        end
+      end
+
+      module CIEXYZ
+        class CIEXYZTriple < Struct.new(:x, :y, :z)
+          include RGBColorMetricsHelpers::WeightedEuclideanDistance
+          extend RGBColorMetricsHelpers::NormalizeRGBTriple
+
+          def self.from_rgb_triple(rgb_triple)
+            r, g, b = normalize_rgb_triple rgb_triple
+
+            x =  0.436052025 * r + 0.385081593 * g + 0.143087414 * b
+            y =  0.222491598 * r + 0.71688606  * g + 0.060621486 * b
+            z =  0.013929122 * r + 0.097097002 * g + 0.71418547  * b
+
+            x *= 255
+            y *= 255
+            z *= 255
+
+            new(x.round, y.round, z.round)
+          end
+        end
+
+        def self.distance(rgb1, rgb2)
+          xyz1 = CIEXYZTriple.from_rgb_triple(rgb1)
+          xyz2 = CIEXYZTriple.from_rgb_triple(rgb2)
+          xyz1.weighted_euclidean_distance_to xyz2
+        end
+      end
+
+      module CIELab
+        class CIELabTriple < Struct.new(:l, :a, :b)
+          include RGBColorMetricsHelpers::WeightedEuclideanDistance
+          extend RGBColorMetricsHelpers::NormalizeRGBTriple
+
+          def self.from_rgb_triple(rgb_triple)
+            r, g, b = normalize_rgb_triple rgb_triple
+
+            x =  0.436052025 * r + 0.385081593 * g + 0.143087414 * b
+            y =  0.222491598 * r + 0.71688606  * g + 0.060621486 * b
+            z =  0.013929122 * r + 0.097097002 * g + 0.71418547  * b
+
+            xr = x / 0.964221
+            yr = y
+            zr = z / 0.825211
+
+            eps = 216.0 / 24389
+            k = 24389.0 / 27
+
+            fx = xr > eps ? xr ** (1.0 / 3) : (k * xr + 16) / 116
+            fy = yr > eps ? yr ** (1.0 / 3) : (k * yr + 16) / 116
+            fz = zr > eps ? zr ** (1.0 / 3) : (k * zr + 16) / 116
+
+            l = 2.55 * ((116 * fy) - 16)
+            a = 500 * (fx - fy)
+            b = 200 * (fy - fz)
+
+            new(l.round, a.round, b.round)
+          end
+        end
+
+        def self.distance(rgb1, rgb2)
+          lab1 = CIELabTriple.from_rgb_triple(rgb1)
+          lab2 = CIELabTriple.from_rgb_triple(rgb2)
+          lab1.weighted_euclidean_distance_to lab2
+        end
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb
new file mode 100644
index 0000000000..4fbaf48088
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb
@@ -0,0 +1,179 @@
+require 'term/ansicolor/rgb_color_metrics'
+
+module Term
+  module ANSIColor
+    class RGBTriple
+      include Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
+
+      def self.convert_value(color, max: 255)
+        color.nil? and raise ArgumentError, "missing color value"
+        color = Integer(color)
+        (0..max) === color or raise ArgumentError,
+          "color value #{color.inspect} not between 0 and #{max}"
+        color
+      end
+
+      private_class_method :convert_value
+
+      def self.from_html(html)
+        case html
+        when /\A#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\z/i
+          new(*$~.captures.map { |c| convert_value(c.to_i(16)) })
+        when /\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/i
+          new(*$~.captures.map { |c| convert_value((c + c).to_i(16)) })
+        end
+      end
+
+      def self.from_css(css)
+        case css
+        when /\A\s*rgb\(\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*\)\z/
+          new(*$~.captures.map { |c| convert_value(((Float(c) / 100) * 0xff).round) })
+        when /\A\s*rgb\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^\)\s]+)\s*\)\z/
+          new(*$~.captures.map { |c| convert_value((Float(c)).round) })
+        end
+      end
+
+      def self.from_hash(options)
+        new(
+          convert_value(options[:red]),
+          convert_value(options[:green]),
+          convert_value(options[:blue])
+        )
+      end
+
+      def self.from_array(array)
+        new(*array)
+      end
+
+      def self.[](thing)
+        case
+        when thing.respond_to?(:to_rgb_triple) then thing.to_rgb_triple
+        when thing.respond_to?(:to_ary)        then from_array(thing.to_ary)
+        when thing.respond_to?(:to_str)
+          thing = thing.to_str
+          from_html(thing.sub(/\Aon_/, '')) || from_css(thing) ||
+            Term::ANSIColor::HSLTriple.from_css(thing).full?(:to_rgb_triple)
+        when thing.respond_to?(:to_hash)       then from_hash(thing.to_hash)
+        else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}"
+        end
+      end
+
+      def initialize(red, green, blue)
+        @values = [ red, green, blue ].map { |v|
+          [ [ Integer(v), 0 ].max, 0xff ].min
+        }
+      end
+
+      def red
+        @values[0]
+      end
+
+      def green
+        @values[1]
+      end
+
+      def blue
+        @values[2]
+      end
+
+      def percentages
+        @percentages ||= @values.map { |v| 100 * v / 255.0 }
+      end
+
+      def red_p
+        percentages[0]
+      end
+
+      def green_p
+        percentages[1]
+      end
+
+      def blue_p
+        percentages[2]
+      end
+
+      def invert
+        self.class.new(255 - red, 255 - green, 255 - blue)
+      end
+
+      def gray?
+        red != 0 && red != 0xff && red == green && green == blue && blue == red
+      end
+
+      def html
+        s = '#'
+        @values.each { |c| s << '%02x' % c }
+        s
+      end
+
+      def css(percentage: false)
+        if percentage
+          "rgb(%s%%,%s%%,%s%%)" % @values.map { |v| 100.0 * v / 255 }
+        else
+          "rgb(%u,%u,%u)" % @values
+        end
+      end
+
+      def to_rgb_triple
+        self
+      end
+
+      def to_hsl_triple
+        Term::ANSIColor::HSLTriple.from_rgb_triple(self)
+      end
+
+      attr_reader :values
+      protected :values
+
+      def to_a
+        @values.dup
+      end
+
+      def ==(other)
+        @values == other.to_rgb_triple.values
+      end
+
+      def color(string)
+        Term::ANSIColor.color(self, string)
+      end
+
+      def distance_to(other, options = {})
+        options[:metric] ||= RGBColorMetrics::CIELab
+        options[:metric].distance(self, other)
+      end
+
+      def initialize_copy(other)
+        r = super
+        other.instance_variable_set :@values, @values.dup
+        r
+      end
+
+      def gradient_to(other, options = {})
+        options[:steps] ||= 16
+        steps = options[:steps].to_i
+        steps < 2 and raise ArgumentError, 'at least 2 steps are required'
+        changes = other.values.zip(@values).map { |x, y| x - y }
+        current = self
+        gradient = [ current.dup ]
+        s = steps - 1
+        while s > 1
+          current = current.dup
+          gradient << current
+          3.times do |i|
+            current.values[i] += changes[i] / (steps - 1)
+          end
+          s -= 1
+        end
+        gradient << other
+      end
+
+      def method_missing(name, *args, &block)
+        if Term::ANSIColor::HSLTriple.method_defined?(name)
+          to_hsl_triple.send(name, *args, &block)
+        else
+          super
+        end
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb
new file mode 100644
index 0000000000..2c02a364eb
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb
@@ -0,0 +1,8 @@
+module Term::ANSIColor
+  # Term::ANSIColor version
+  VERSION         = '1.7.1'
+  VERSION_ARRAY   = VERSION.split('.').map(&:to_i) # :nodoc:
+  VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
+  VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
+  VERSION_BUILD   = VERSION_ARRAY[2] # :nodoc:
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb
new file mode 100644
index 0000000000..35f415eb5f
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb
@@ -0,0 +1,2 @@
+require 'tins/alias'
+require 'tins/dslkit/polite'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb
new file mode 100644
index 0000000000..8f5762bbd3
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb
@@ -0,0 +1 @@
+require 'tins/dslkit'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb
new file mode 100644
index 0000000000..39649f3314
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb
@@ -0,0 +1 @@
+require 'tins/xt/dslkit'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb
new file mode 100644
index 0000000000..e38ccaea53
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb
@@ -0,0 +1,2 @@
+require 'tins'
+require 'tins/alias'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb
new file mode 100644
index 0000000000..ca7c22cd48
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb
@@ -0,0 +1,61 @@
+module Tins
+  require 'tins/attempt'
+  require 'tins/bijection'
+  require 'tins/count_by'
+  require 'tins/deep_dup'
+  require 'tins/file_binary'
+  require 'tins/find'
+  require 'tins/generator'
+  require 'tins/go'
+  require 'tins/hash_symbolize_keys_recursive'
+  require 'tins/hash_union'
+  require 'tins/limited'
+  require 'tins/lines_file'
+  require 'tins/memoize'
+  require 'tins/minimize'
+  require 'tins/module_group'
+  require 'tins/named_set'
+  require 'tins/null'
+  require 'tins/once'
+  require 'tins/p'
+  require 'tins/partial_application'
+  require 'tins/range_plus'
+  require 'tins/require_maybe'
+  require 'tins/secure_write'
+  require 'tins/string_camelize'
+  require 'tins/string_underscore'
+  require 'tins/string_version'
+  require 'tins/subhash'
+  require 'tins/time_dummy'
+  require 'tins/date_dummy'
+  require 'tins/date_time_dummy'
+  require 'tins/to_proc'
+  require 'tins/uniq_by'
+  require 'tins/version'
+  require 'tins/write'
+  require 'tins/extract_last_argument_options'
+  require 'tins/deep_const_get'
+  require 'tins/responding'
+  require 'tins/proc_compose'
+  require 'tins/proc_prelude'
+  require 'tins/concern'
+  require 'tins/to'
+  require 'tins/terminal'
+  require 'tins/sexy_singleton'
+  require 'tins/method_description'
+  require 'tins/annotate'
+  require 'tins/token'
+  require 'tins/dslkit'
+  require 'tins/case_predicate'
+  require 'tins/implement'
+  if defined? ::Encoding
+    require 'tins/string_byte_order_mark'
+  end
+  require 'tins/complete'
+  require 'tins/duration'
+  require 'tins/unit'
+  require 'tins/expose'
+  require 'tins/temp_io'
+  require 'tins/temp_io_enum'
+end
+require 'tins/alias'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb
new file mode 100644
index 0000000000..5bfa74bbd3
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb
@@ -0,0 +1 @@
+Spruz = Tins
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb
new file mode 100644
index 0000000000..dc461f0ff5
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb
@@ -0,0 +1,38 @@
+module Tins::Annotate
+  def annotate(name)
+    singleton_class.class_eval do
+      define_method(name) do |annotation = :annotated|
+        instance_variable_set "@__annotation_#{name}__", annotation
+      end
+
+      define_method("#{name}_of") do |method_name|
+        __send__("#{name}_annotations")[method_name]
+      end
+
+      define_method("#{name}_annotations") do
+        if instance_variable_defined?("@__annotation_#{name}_annotations__")
+          instance_variable_get "@__annotation_#{name}_annotations__"
+        else
+          instance_variable_set "@__annotation_#{name}_annotations__", {}
+        end
+      end
+
+      old_method_added = instance_method(:method_added)
+      define_method(:method_added) do |method_name|
+        old_method_added.bind(self).call method_name
+        if annotation = instance_variable_get("@__annotation_#{name}__")
+          __send__("#{name}_annotations")[method_name] = annotation
+        end
+        instance_variable_set "@__annotation_#{name}__", nil
+      end
+    end
+
+    define_method("#{name}_annotations") do
+      self.class.__send__("#{name}_annotations")
+    end
+
+    define_method("#{name}_of") do |method_name|
+      self.class.__send__("#{name}_of", method_name)
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb
new file mode 100644
index 0000000000..4318a80f0b
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb
@@ -0,0 +1,31 @@
+module Tins
+  module AskAndSend
+    def ask_and_send(method_name, *args, &block)
+      if respond_to?(method_name)
+        __send__(method_name, *args, &block)
+      end
+    end
+
+    def ask_and_send!(method_name, *args, &block)
+      if respond_to?(method_name, true)
+        __send__(method_name, *args, &block)
+      end
+    end
+
+    def ask_and_send_or_self(method_name, *args, &block)
+      if respond_to?(method_name)
+        __send__(method_name, *args, &block)
+      else
+        self
+      end
+    end
+
+    def ask_and_send_or_self!(method_name, *args, &block)
+      if respond_to?(method_name, true)
+        __send__(method_name, *args, &block)
+      else
+        self
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb
new file mode 100644
index 0000000000..6bcd847a70
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb
@@ -0,0 +1,111 @@
+module Tins
+  module Attempt
+    # Attempts code in block *attempts* times, sleeping according to *sleep*
+    # between attempts and catching the exception(s) in *exception_class*.
+    #
+    # *sleep* is either a Proc returning a floating point number for duration
+    # as seconds or a Numeric >= 0 or < 0. In the former case this is the
+    # duration directly, in the latter case -*sleep* is the total number of
+    # seconds that is slept before giving up, and every attempt is retried
+    # after a exponentially increasing duration of seconds.
+    #
+    # Iff *reraise* is true the caught exception is reraised after running out
+    # of attempts.
+    def attempt(opts = {}, &block)
+      sleep           = nil
+      exception_class = StandardError
+      if Numeric === opts
+        attempts = opts
+      else
+        attempts        = opts[:attempts] || 1
+        attempts >= 1 or raise ArgumentError, 'at least one attempt is required'
+        exception_class = opts[:exception_class] if opts.key?(:exception_class)
+        sleep           = interpret_sleep(opts[:sleep], attempts)
+        reraise         = opts[:reraise]
+      end
+      return if attempts <= 0
+      count = 0
+      if exception_class.nil?
+        begin
+          count += 1
+          if block.call(count)
+            return true
+          elsif count < attempts
+            sleep_duration(sleep, count)
+          end
+        end until count == attempts
+        false
+      else
+        begin
+          count += 1
+          block.call(count)
+          true
+        rescue *exception_class
+          if count < attempts
+            sleep_duration(sleep, count)
+            retry
+          end
+          reraise ? raise : false
+        end
+      end
+    end
+
+    private
+
+    def sleep_duration(duration, count)
+      case duration
+      when Numeric
+        sleep duration
+      when Proc
+        sleep duration.call(count)
+      end
+    end
+
+    def compute_duration_base(sleep, attempts)
+      x1, x2  = 1, sleep
+      attempts <= sleep or raise ArgumentError,
+        "need less or equal number of attempts than sleep duration #{sleep}"
+      x1 >= x2 and raise ArgumentError, "invalid sleep argument: #{sleep.inspect}"
+      function = -> x { (0...attempts).inject { |s, i| s + x ** i } - sleep }
+      f, fmid = function[x1], function[x2]
+      f * fmid >= 0 and raise ArgumentError, "invalid sleep argument: #{sleep.inspect}"
+      n       = 1 << 16
+      epsilon = 1E-16
+      root = if f < 0
+               dx = x2 - x1
+               x1
+             else
+               dx = x1 - x2
+               x2
+             end
+      n.times do
+        fmid = function[xmid = root + (dx *= 0.5)]
+        fmid < 0 and root = xmid
+        dx.abs < epsilon or fmid == 0 and return root
+      end
+      raise ArgumentError, "too many iterations (#{n})"
+      result
+    end
+
+    def interpret_sleep(sleep, attempts)
+      case sleep
+      when nil
+      when Numeric
+        if sleep < 0
+          if attempts > 2
+            sleep = -sleep
+            duration_base = compute_duration_base sleep, attempts
+            sleep = lambda { |i| duration_base ** i }
+          else
+            raise ArgumentError, "require > 2 attempts for negative sleep value"
+          end
+        end
+        sleep
+      when Proc
+        sleep
+      else
+        raise TypeError, "require Proc or Numeric sleep argument"
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb
new file mode 100644
index 0000000000..e5eb76feed
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb
@@ -0,0 +1,46 @@
+module Tins
+  class Bijection < Hash
+    def self.[](*pairs)
+      pairs.size % 2 == 0 or
+        raise ArgumentError, "odd number of arguments for #{self}"
+      new.fill do |obj|
+        (pairs.size / 2).times do |i|
+          j = 2 * i
+          key = pairs[j]
+          value = pairs[j + 1]
+          obj.key?(key) and raise ArgumentError, "duplicate key #{key.inspect} for #{self}"
+          obj.inverted.key?(value) and raise ArgumentError, "duplicate value #{value.inspect} for #{self}"
+          obj[pairs[j]] = pairs[j + 1]
+        end
+      end
+    end
+
+    def initialize(inverted = Bijection.new(self))
+      @inverted = inverted
+    end
+
+    def fill
+      if empty?
+        yield self
+        freeze
+      end
+      self
+    end
+
+    def freeze
+      r = super
+      unless @inverted.frozen?
+        @inverted.freeze
+      end
+      r
+    end
+
+    def []=(key, value)
+      key?(key) and return
+      super
+      @inverted[value] = key
+    end
+
+    attr_reader :inverted
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb
new file mode 100644
index 0000000000..4616f8160c
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb
@@ -0,0 +1,7 @@
+module Tins
+  module CasePredicate
+    def case?(*args)
+      args.find { |a| a === self }
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb
new file mode 100644
index 0000000000..e2899b572e
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb
@@ -0,0 +1,18 @@
+require 'readline'
+
+module Tins
+  module Complete
+    module_function
+
+    @@sync = Sync.new
+
+    def complete(prompt: '', add_hist: false, &block)
+      @@sync.synchronize do
+        Readline.completion_proc = block
+        Readline.input           = STDIN
+        Readline.output          = STDOUT
+        Readline.readline(prompt, add_hist)
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb
new file mode 100644
index 0000000000..af4a759cdf
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb
@@ -0,0 +1,30 @@
+module Tins
+  module Concern
+    def self.extended(base)
+      base.instance_variable_set("@_dependencies", [])
+    end
+
+    def append_features(base)
+      if base.instance_variable_defined?("@_dependencies")
+        base.instance_variable_get("@_dependencies") << self
+        false
+      else
+        return false if base < self
+        @_dependencies.each { |dep| base.send(:include, dep) }
+        super
+        base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
+        base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
+        Thread.current[:tin_concern_args] = nil
+        true
+      end
+    end
+
+    def included(base = nil, &block)
+      if base.nil?
+        @_included_block = block
+      else
+        super
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb
new file mode 100644
index 0000000000..dbe41b7e33
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb
@@ -0,0 +1,8 @@
+module Tins
+  module CountBy
+    def count_by(&b)
+      b ||= lambda { |x| true }
+      inject(0) { |s, e| s += 1 if b[e]; s }
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb
new file mode 100644
index 0000000000..a5d95e8e68
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb
@@ -0,0 +1,53 @@
+require 'date'
+
+module Tins
+  module DateDummy
+    def self.included(modul)
+      class << modul
+        alias really_today today
+
+        remove_method :today rescue nil
+
+        def dummy=(value)
+          if value.respond_to?(:to_str)
+            value = Date.parse(value.to_str)
+          elsif value.respond_to?(:to_date)
+            value = value.to_date
+          end
+          @dummy = value
+        end
+
+        def dummy(value = nil)
+          if value.nil?
+            if defined?(@dummy)
+              @dummy
+            end
+          else
+            begin
+              old_dummy = @dummy
+              self.dummy = value
+              yield
+            ensure
+              self.dummy = old_dummy
+            end
+          end
+        end
+
+        def today
+          if dummy
+            dummy.dup
+          elsif caller.first =~ /`today`/
+            really_today
+          else
+            really_today
+          end
+        end
+
+      end
+      super
+    end
+  end
+end
+
+require 'tins/alias'
+
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb
new file mode 100644
index 0000000000..939fb9d3ac
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb
@@ -0,0 +1,51 @@
+require 'date'
+
+module Tins
+  module DateTimeDummy
+    def self.included(modul)
+      class << modul
+        alias really_now now
+
+        remove_method :now rescue nil
+
+        def dummy=(value)
+          if value.respond_to?(:to_str)
+            value = DateTime.parse(value.to_str)
+          elsif value.respond_to?(:to_datetime)
+            value = value.to_datetime
+          end
+          @dummy = value
+        end
+
+        def dummy(value = nil)
+          if value.nil?
+            if defined?(@dummy)
+              @dummy
+            end
+          else
+            begin
+              old_dummy = @dummy
+              self.dummy = value
+              yield
+            ensure
+              self.dummy = old_dummy
+            end
+          end
+        end
+
+        def now
+          if dummy
+            dummy.dup
+          elsif caller.first =~ /`now`/
+            really_now
+          else
+            really_now
+          end
+        end
+      end
+      super
+    end
+  end
+end
+
+require 'tins/alias'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb
new file mode 100644
index 0000000000..706005d8f3
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb
@@ -0,0 +1,42 @@
+module Tins
+  module DeepConstGet
+    if ::Object.method(:const_defined?).arity == 1
+      # :nocov:
+      # We do not create coverage on 1.8
+      def self.const_defined_in?(modul, constant)
+        modul.const_defined?(constant)
+      end
+      # :nocov:
+    else
+      def self.const_defined_in?(modul, constant)
+        modul.const_defined?(constant, false)
+      end
+    end
+
+    def self.deep_const_get(path, start_module = Object)
+      path.to_s.split('::').inject(start_module) do |p, c|
+        case
+        when c.empty?
+          if start_module == Object
+            Object
+          else
+            raise ArgumentError, "top level constants cannot be reached from"\
+              " start module #{start_module.inspect}"
+          end
+        when const_defined_in?(p, c)
+          p.const_get(c)
+        else
+          begin
+            p.const_missing(c)
+          rescue NameError => e
+            raise ArgumentError, "can't get const #{path}: #{e}"
+          end
+        end
+      end
+    end
+
+    def deep_const_get(path, start_module = Object)
+      ::Tins::DeepConstGet.deep_const_get(path, start_module)
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb
new file mode 100644
index 0000000000..3b53d866a3
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb
@@ -0,0 +1,11 @@
+module Tins
+  module DeepDup
+    def deep_dup
+      Marshal.load(Marshal.dump(self))
+    rescue TypeError
+      return self
+    end
+  end
+end
+
+require 'tins/alias'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb
new file mode 100644
index 0000000000..bace0f13df
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb
@@ -0,0 +1,636 @@
+require 'thread'
+require 'sync'
+
+require 'tins/thread_local'
+
+module Tins
+  # This module contains some handy methods to deal with eigenclasses. Those
+  # are also known as virtual classes, singleton classes, metaclasses, plus all
+  # the other names Matz doesn't like enough to actually accept one of the
+  # names.
+  #
+  # The module can be included into other modules/classes to make the methods available.
+  module Eigenclass
+    # Returns the eigenclass of this object.
+    def eigenclass
+    end
+    alias eigenclass singleton_class
+
+    # Evaluates the _block_ in context of the eigenclass of this object.
+    def eigenclass_eval(&block)
+      eigenclass.instance_eval(&block)
+    end
+  end
+
+  module ClassMethod
+    include Eigenclass
+
+    # Define a class method named _name_ using _block_.
+    def class_define_method(name, &block)
+      eigenclass_eval { define_method(name, &block) }
+    end
+
+    # Define reader and writer attribute methods for all *ids.
+    def class_attr_accessor(*ids)
+      eigenclass_eval { attr_accessor(*ids) }
+    end
+
+    # Define reader attribute methods for all *ids.
+    def class_attr_reader(*ids)
+      eigenclass_eval { attr_reader(*ids) }
+    end
+
+    # Define writer attribute methods for all *ids.
+    def class_attr_writer(*ids)
+      eigenclass_eval { attr_writer(*ids) }
+    end
+
+    # I boycott attr!
+  end
+
+  module ThreadGlobal
+    # Define a thread global variable named _name_ in this module/class. If the
+    # value _value_ is given, it is used to initialize the variable.
+    def thread_global(name, default_value = nil, &default)
+      is_a?(Module) or raise TypeError, "receiver has to be a Module"
+
+      default_value && default and raise ArgumentError,
+        "require either default_falue or default block"
+
+      if default_value
+        default = -> * { default_value }
+      end
+
+      name = name.to_s
+      var_name = "@__#{name}_#{__id__.abs}__"
+
+      lock = Mutex.new
+      modul = self
+
+      define_method(name) do
+        lock.synchronize {
+          if default && !modul.instance_variable_defined?(var_name)
+            modul.instance_variable_set var_name, default.call
+          end
+          modul.instance_variable_get var_name
+        }
+      end
+
+      define_method(name + "=") do |value|
+        lock.synchronize { modul.instance_variable_set var_name, value }
+      end
+
+      self
+    end
+
+    # Define a thread global variable for the current instance with name
+    # _name_. If the value _value_ is given, it is used to initialize the
+    # variable.
+    def instance_thread_global(name, value = nil)
+      sc = class << self
+        extend Tins::ThreadGlobal
+        self
+      end
+      sc.thread_global name, value
+      self
+    end
+  end
+
+  module InstanceExec
+    def self.included(*)
+      super
+      warn "#{self} is deprecated, but included at #{caller.first[/(.*):/, 1]}"
+    end
+  end
+
+  module Interpreter
+    # Interpret the string _source_ as a body of a block, while passing
+    # *args into the block.
+    #
+    # A small example explains how the method is supposed to be used and how
+    # the *args can be fetched:
+    #
+    #  class A
+    #    include Tins::Interpreter
+    #    def c
+    #      3
+    #    end
+    #  end
+    #
+    #  A.new.interpret('|a,b| a + b + c', 1, 2) # => 6
+    #
+    # To use a specified binding see #interpret_with_binding.
+    def interpret(source, *args)
+      interpret_with_binding(source, binding, *args)
+    end
+
+    # Interpret the string _source_ as a body of a block, while passing
+    # *args into the block and using _my_binding_ for evaluation.
+    #
+    # A small example:
+    #
+    #  class A
+    #    include Tins::Interpreter
+    #    def c
+    #      3
+    #    end
+    #    def foo
+    #      b = 2
+    #      interpret_with_binding('|a| a + b + c', binding, 1) # => 6
+    #    end
+    #  end
+    #  A.new.foo # => 6
+    #
+    # See also #interpret.
+    def interpret_with_binding(source, my_binding, *args)
+      path = '(interpret)'
+      if source.respond_to? :to_io
+        path = source.path if source.respond_to? :path
+        source = source.to_io.read
+      end
+      block = lambda { |*a| eval("lambda { #{source} }", my_binding, path).call(*a) }
+      instance_exec(*args, &block)
+    end
+  end
+
+  # This module contains the _constant_ method. For small example of its usage
+  # see the documentation of the DSLAccessor module.
+  module Constant
+    # Create a constant named _name_, that refers to value _value_. _value is
+    # frozen, if this is possible. If you want to modify/exchange a value use
+    # DSLAccessor#dsl_reader/DSLAccessor#dsl_accessor instead.
+    def constant(name, value = name)
+      value = value.freeze rescue value
+      define_method(name) { value }
+    end
+  end
+
+  # The DSLAccessor module contains some methods, that can be used to make
+  # simple accessors for a DSL.
+  #
+  #
+  #  class CoffeeMaker
+  #    extend Tins::Constant
+  #
+  #    constant :on
+  #    constant :off
+  #
+  #    extend Tins::DSLAccessor
+  #
+  #    dsl_accessor(:state) { off } # Note: the off constant from above is used
+  #
+  #    dsl_accessor :allowed_states, :on, :off
+  #
+  #    def process
+  #      allowed_states.include?(state) or fail "Explode!!!"
+  #      if state == on
+  #        puts "Make coffee."
+  #      else
+  #        puts "Idle..."
+  #      end
+  #    end
+  #  end
+  #
+  #  cm = CoffeeMaker.new
+  #  cm.instance_eval do
+  #    state      # => :off
+  #    state on
+  #    state      # => :on
+  #    process    # => outputs "Make coffee."
+  #  end
+  #
+  # Note that Tins::SymbolMaker is an alternative for Tins::Constant in
+  # this example. On the other hand SymbolMaker can make debugging more
+  # difficult.
+  module DSLAccessor
+    # This method creates a dsl accessor named _name_. If nothing else is given
+    # as argument it defaults to nil. If *default is given as a single
+    # value it is used as a default value, if more than one value is given the
+    # _default_ array is used as the default value. If no default value but a
+    # block _block_ is given as an argument, the block is executed everytime
+    # the accessor is read in the context of the current instance.
+    #
+    # After setting up the accessor, the set or default value can be retrieved
+    # by calling the method +name+. To set a value one can call name
+    # :foo to set the attribute value to :foo or
+    # name(:foo, :bar) to set it to [ :foo, :bar ].
+    def dsl_accessor(name, *default, &block)
+      variable = "@#{name}"
+      define_method(name) do |*args|
+        if args.empty?
+          result =
+            if instance_variable_defined?(variable)
+              instance_variable_get(variable)
+            end
+          if result.nil?
+            result = if default.empty?
+              block && instance_eval(&block)
+            elsif default.size == 1
+              default.first
+            else
+              default
+            end
+            instance_variable_set(variable, result)
+            result
+          else
+            result
+          end
+        else
+          instance_variable_set(variable, args.size == 1 ? args.first : args)
+        end
+      end
+    end
+
+    # This method creates a dsl reader accessor, that behaves exactly like a
+    # #dsl_accessor but can only be read not set.
+    def dsl_reader(name, *default, &block)
+      variable = "@#{name}"
+      define_method(name) do |*args|
+        if args.empty?
+          result =
+            if instance_variable_defined?(variable)
+              instance_variable_get(variable)
+            end
+          if result.nil?
+            if default.empty?
+              block && instance_eval(&block)
+            elsif default.size == 1
+              default.first
+            else
+              default
+            end
+          else
+            result
+          end
+        else
+          raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
+        end
+      end
+    end
+  end
+
+  # This module can be included in another module/class. It generates a symbol
+  # for every missing method that was called in the context of this
+  # module/class.
+  module SymbolMaker
+    # Returns a symbol (_id_) for every missing method named _id_.
+    def method_missing(id, *args)
+      if args.empty?
+        id
+      else
+        super
+      end
+    end
+  end
+
+  # This module can be used to extend another module/class. It generates
+  # symbols for every missing constant under the namespace of this
+  # module/class.
+  module ConstantMaker
+    # Returns a symbol (_id_) for every missing constant named _id_.
+    def const_missing(id)
+      id
+    end
+  end
+
+  module BlankSlate
+    # Creates an anonymous blank slate class, that only responds to the methods
+    # *ids. ids can be Symbols, Strings, and Regexps that have to match
+    # the method name with #===.
+    def self.with(*ids)
+      opts = Hash === ids.last ? ids.pop : {}
+      ids = ids.map { |id| Regexp === id ? id : id.to_s }
+      klass = opts[:superclass] ? Class.new(opts[:superclass]) : Class.new
+      klass.instance_eval do
+        instance_methods.each do |m|
+          m = m.to_s
+          undef_method m unless m =~ /^(__|object_id)/ or ids.any? { |i| i === m }
+        end
+      end
+      klass
+    end
+  end
+
+  # See examples/recipe.rb and examples/recipe2.rb how this works at the
+  # moment.
+  module Deflect
+    # The basic Deflect exception
+    class DeflectError < StandardError; end
+
+    class << self
+      extend Tins::ThreadLocal
+
+      # A thread local variable, that holds a DeflectorCollection instance for
+      # the current thread.
+      thread_local :deflecting
+    end
+
+    # A deflector is called with a _class_, a method _id_, and its
+    # *args.
+    class Deflector < Proc; end
+
+    # This class implements a collection of deflectors, to make them available
+    # by emulating Ruby's message dispatch.
+    class DeflectorCollection
+      def initialize
+        @classes = {}
+      end
+
+      # Add a new deflector _deflector_ for class _klass_ and method name _id_,
+      # and return self.
+      #
+      def add(klass, id, deflector)
+        k = @classes[klass]
+        k = @classes[klass] = {} unless k
+        k[id.to_s] = deflector
+        self
+      end
+
+      # Return true if messages are deflected for class _klass_ and method name
+      # _id_, otherwise return false.
+      def member?(klass, id)
+        !!(k = @classes[klass] and k.key?(id.to_s))
+      end
+
+      # Delete the deflecotor class _klass_ and method name _id_. Returns the
+      # deflector if any was found, otherwise returns true.
+      def delete(klass, id)
+        if k = @classes[klass]
+          d = k.delete id.to_s
+          @classes.delete klass if k.empty?
+          d
+        end
+      end
+
+      # Try to find a deflector for class _klass_ and method _id_ and return
+      # it. If none was found, return nil instead.
+      def find(klass, id)
+        klass.ancestors.find do |k|
+          if d = @classes[k] and d = d[id.to_s]
+            return d
+          end
+        end
+      end
+    end
+
+    @@sync = Sync.new
+
+    # Start deflecting method calls named _id_ to the _from_ class using the
+    # Deflector instance deflector.
+    def deflect_start(from, id, deflector)
+      @@sync.synchronize do
+        Deflect.deflecting ||= DeflectorCollection.new
+        Deflect.deflecting.member?(from, id) and
+          raise DeflectError, "#{from}##{id} is already deflected"
+        Deflect.deflecting.add(from, id, deflector)
+        from.class_eval do
+          define_method(id) do |*args|
+            if Deflect.deflecting and d = Deflect.deflecting.find(self.class, id)
+              d.call(self, id, *args)
+            else
+              super(*args)
+            end
+          end
+        end
+      end
+    end
+
+    # Return true if method _id_ is deflected from class _from_, otherwise
+    # return false.
+    def self.deflect?(from, id)
+      Deflect.deflecting && Deflect.deflecting.member?(from, id)
+    end
+
+    # Return true if method _id_ is deflected from class _from_, otherwise
+    # return false.
+    def deflect?(from, id)
+      Deflect.deflect?(from, id)
+    end
+
+    # Start deflecting method calls named _id_ to the _from_ class using the
+    # Deflector instance deflector. After that yield to the given block and
+    # stop deflecting again.
+    def deflect(from, id, deflector)
+      @@sync.synchronize do
+        begin
+          deflect_start(from, id, deflector)
+          yield
+        ensure
+          deflect_stop(from, id)
+        end
+      end
+    end
+
+    # Stop deflection method calls named _id_ to class _from_.
+    def deflect_stop(from, id)
+      @@sync.synchronize do
+        Deflect.deflecting.delete(from, id) or
+          raise DeflectError, "#{from}##{id} is not deflected from"
+        from.instance_eval { remove_method id }
+      end
+    end
+  end
+
+  # This module can be included into modules/classes to make the delegate
+  # method available.
+  module Delegate
+    UNSET = Object.new
+
+    # A method to easily delegate methods to an object, stored in an
+    # instance variable or returned by a method call.
+    #
+    # It's used like this:
+    #   class A
+    #     delegate :method_here, :@obj, :method_there
+    #   end
+    # or:
+    #   class A
+    #     delegate :method_here, :method_call, :method_there
+    #   end
+    #
+    # _other_method_name_ defaults to method_name, if it wasn't given.
+    #def delegate(method_name, to: UNSET, as: method_name)
+    def delegate(method_name, opts = {})
+      to = opts[:to] || UNSET
+      as = opts[:as] || method_name
+      raise ArgumentError, "to argument wasn't defined" if to == UNSET
+      to = to.to_s
+      case
+      when to[0, 2] == '@@'
+        define_method(as) do |*args, &block|
+          if self.class.class_variable_defined?(to)
+            self.class.class_variable_get(to).__send__(method_name, *args, &block)
+          end
+        end
+      when to[0] == ?@
+        define_method(as) do |*args, &block|
+          if instance_variable_defined?(to)
+            instance_variable_get(to).__send__(method_name, *args, &block)
+          end
+        end
+      when (?A..?Z).include?(to[0])
+        define_method(as) do |*args, &block|
+          Tins::DeepConstGet.deep_const_get(to).__send__(method_name, *args, &block)
+        end
+      else
+        define_method(as) do |*args, &block|
+          __send__(to).__send__(method_name, *args, &block)
+        end
+      end
+    end
+  end
+
+  # This module includes the block_self module_function.
+  module BlockSelf
+    module_function
+
+    # This method returns the receiver _self_ of the context in which _block_
+    # was created.
+    def block_self(&block)
+      eval 'self', block.__send__(:binding)
+    end
+  end
+
+  # This module contains a configurable method missing delegator and can be
+  # mixed into a module/class.
+  module MethodMissingDelegator
+
+    # Including this module in your classes makes an _initialize_ method
+    # available, whose first argument is used as method_missing_delegator
+    # attribute. If a superior _initialize_ method was defined it is called
+    # with all arguments but the first.
+    module DelegatorModule
+      include Tins::MethodMissingDelegator
+
+      def initialize(delegator, *a, &b)
+        self.method_missing_delegator = delegator
+        super(*a, &b) if defined? super
+      end
+    end
+
+    # This class includes DelegatorModule and can be used as a superclass
+    # instead of including DelegatorModule.
+    class DelegatorClass
+      include DelegatorModule
+    end
+
+    # This object will be the receiver of all missing method calls, if it has a
+    # value other than nil.
+    attr_accessor :method_missing_delegator
+
+    # Delegates all missing method calls to _method_missing_delegator_ if this
+    # attribute has been set. Otherwise it will call super.
+    def method_missing(id, *a, &b)
+      unless method_missing_delegator.nil?
+        method_missing_delegator.__send__(id, *a, &b)
+      else
+        super
+      end
+    end
+  end
+
+  module ParameterizedModule
+    # Pass _args_ and _block_ to configure the module and then return it after
+    # calling the parameterize method has been called with these arguments. The
+    # _parameterize_ method should return a configured module.
+    def parameterize_for(*args, &block)
+      respond_to?(:parameterize) ? parameterize(*args, &block) : self
+    end
+  end
+
+  module FromModule
+    include ParameterizedModule
+
+    alias from parameterize_for
+
+    def parameterize(opts = {})
+      modul = opts[:module] or raise ArgumentError, 'option :module is required'
+      import_methods = Array(opts[:methods])
+      result = modul.dup
+      remove_methods = modul.instance_methods.map(&:to_sym) - import_methods.map(&:to_sym)
+      remove_methods.each do |m|
+        begin
+          result.__send__ :remove_method, m
+        rescue NameError
+        end
+      end
+      result
+    end
+  end
+
+  module Scope
+    def scope_push(scope_frame, name = :default)
+      scope_get(name).push scope_frame
+      self
+    end
+
+    def scope_pop(name = :default)
+      scope_get(name).pop
+      scope_get(name).empty? and Thread.current[name] = nil
+      self
+    end
+
+    def scope_top(name = :default)
+      scope_get(name).last
+    end
+
+    def scope_reverse(name = :default, &block)
+      scope_get(name).reverse_each(&block)
+    end
+
+    def scope_block(scope_frame, name = :default)
+      scope_push(scope_frame, name)
+      yield
+    ensure
+      scope_pop(name)
+    end
+
+    def scope_get(name = :default)
+      Thread.current[name] ||= []
+    end
+
+    def scope(name = :default)
+      scope_get(name).dup
+    end
+  end
+
+  module DynamicScope
+    class Context < Hash
+      def [](name)
+        super name.to_sym
+      end
+
+      def []=(name, value)
+        super name.to_sym, value
+      end
+    end
+
+    include Scope
+
+    attr_accessor :dynamic_scope_name
+
+    def dynamic_defined?(id)
+      self.dynamic_scope_name ||= :variables
+      scope_reverse(dynamic_scope_name) { |c| c.key?(id) and return true }
+      false
+    end
+
+    def dynamic_scope(&block)
+      self.dynamic_scope_name ||= :variables
+      scope_block(Context.new, dynamic_scope_name, &block)
+    end
+
+    def method_missing(id, *args)
+      self.dynamic_scope_name ||= :variables
+      if args.empty? and scope_reverse(dynamic_scope_name) { |c| c.key?(id) and return c[id] }
+        super
+      elsif args.size == 1 and id.to_s =~ /(.*?)=\Z/
+        c = scope_top(dynamic_scope_name) or super
+        c[$1] = args.first
+      else
+        super
+      end
+    end
+  end
+end
+DSLKit = Tins
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb
new file mode 100644
index 0000000000..264a888f18
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb
@@ -0,0 +1,95 @@
+module Tins
+  class Duration
+    include Comparable
+
+    def initialize(seconds)
+      @negative = seconds < 0
+      seconds = seconds.abs
+      @original_seconds = seconds
+      @days, @hours, @minutes, @seconds, @fractional_seconds =
+        [ 86_400, 3600, 60, 1, 0 ].inject([ [], seconds ]) {|(r, s), d|
+          if d > 0
+            dd, rest = s.divmod(d)
+            r << dd
+            [ r, rest ]
+          else
+            r << s
+          end
+        }
+    end
+
+    def to_f
+      @original_seconds.to_f
+    end
+
+    def <=>(other)
+      to_f <=> other.to_f
+    end
+
+    def negative?
+      @negative
+    end
+
+    def days?
+      @days > 0
+    end
+
+    def hours?
+      @hours > 0
+    end
+
+    def minutes?
+      @minutes > 0
+    end
+
+    def seconds?
+      @seconds > 0
+    end
+
+    def fractional_seconds?
+      @fractional_seconds > 0
+    end
+
+    def format(template = '%S%d+%h:%m:%s.%f', precision: nil)
+      result = template.gsub(/%[DdhmSs]/) { |directive|
+        case directive
+        when '%S' then ?- if negative?
+        when '%d' then @days
+        when '%h' then '%02u' % @hours
+        when '%m' then '%02u' % @minutes
+        when '%s' then '%02u' % @seconds
+        when '%D' then format_smart
+        end
+      }
+      if result.include?('%f')
+        if precision
+          fractional_seconds = "%.#{precision}f" % @fractional_seconds
+        else
+          fractional_seconds = '%f' % @fractional_seconds
+        end
+        result.gsub!('%f', fractional_seconds[2..-1])
+      end
+      result
+    end
+
+    def to_s
+      format_smart
+    end
+
+    private
+
+    def format_smart
+      template  = '%h:%m:%s'
+      precision = nil
+      if days?
+        template.prepend '%d+'
+      end
+      if fractional_seconds?
+        template << '.%f'
+        precision = 3
+      end
+      template.prepend '%S'
+      format template, precision: precision
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb
new file mode 100644
index 0000000000..297ad784b2
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb
@@ -0,0 +1,27 @@
+module Tins
+  module Expose
+    # Expose any (private/protected) method or internal state of this object
+    # returning the result for specing purposes.
+    #
+    # @param method_name [ Symbol | String ] name of the method
+    #                                        (shortcut for reader methods).
+    # @param block [ Proc ] any private/protected methods of the object can be
+    #                       called in this block.
+    #
+    # @return [ Object ] result of the method or block call
+    def expose(method_name = nil, *args, &block)
+      if block
+        instance_eval(&block)
+      elsif method_name.nil?
+        methods = private_methods(true) + protected_methods(true)
+        o = dup
+        o.singleton_class.class_eval do
+          public(*methods)
+        end
+        o
+      elsif method_name
+        __send__(method_name, *args)
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb
new file mode 100644
index 0000000000..8ab8e7c9c9
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb
@@ -0,0 +1,14 @@
+module Tins
+  module ExtractLastArgumentOptions
+    def extract_last_argument_options
+      last_argument = last
+      if last_argument.respond_to?(:to_hash) and
+        options = last_argument.to_hash.dup
+      then
+        return self[0..-2], options
+      else
+        return dup, {}
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb
new file mode 100644
index 0000000000..255f3c1b40
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb
@@ -0,0 +1,83 @@
+module Tins
+  module FileBinary
+    module Constants
+      SEEK_SET = ::File::SEEK_SET
+
+      ZERO   = "\x00"
+      BINARY = "\x01-\x1f\x7f-\xff"
+
+      if defined?(::Encoding)
+        ZERO.force_encoding(Encoding::ASCII_8BIT)
+        BINARY.force_encoding(Encoding::ASCII_8BIT)
+      end
+    end
+
+    class << self
+      # Default options can be queried/set via this hash.
+      attr_accessor :default_options
+    end
+    self.default_options = {
+      offset:            0,
+      buffer_size:       2 ** 13,
+      percentage_binary: 30.0,
+      percentage_zeros:  0.0,
+    }
+
+    # Returns true if this file is considered to be binary, false if it is not
+    # considered to be binary, and nil if it was empty.
+    #
+    # A file is considered to be binary if the percentage of zeros exceeds
+    # options[:percentage_zeros] or the percentage of binary bytes
+    # (8-th bit is 1) exceeds options[:percentage_binary] in the
+    # buffer of size options[:buffer_size] that is checked (beginning
+    # from offset options[:offset]). If an option isn't given the one
+    # from FileBinary.default_options is used instead.
+    def binary?(options = {})
+      options = FileBinary.default_options.merge(options)
+      old_pos = tell
+      seek options[:offset], Constants::SEEK_SET
+      data = read options[:buffer_size]
+      !data or data.empty? and return nil
+      data_size = data.size
+      data.count(Constants::ZERO).to_f / data_size >
+        options[:percentage_zeros] / 100.0 and return true
+      data.count(Constants::BINARY).to_f / data_size >
+        options[:percentage_binary] / 100.0
+    ensure
+      old_pos and seek old_pos, Constants::SEEK_SET
+    end
+
+    # Returns true if FileBinary#binary? returns false, false if
+    # FileBinary#binary? returns true, and nil otherwise. For an explanation of
+    # +options+, see FileBinary#binary?.
+    def ascii?(options = {})
+      case binary?(options)
+      when true   then false
+      when false  then true
+      end
+    end
+
+    def self.included(modul)
+      modul.instance_eval do
+        extend ClassMethods
+      end
+      super
+    end
+
+    module ClassMethods
+      # Returns true if the file with name +name+ is considered to be binary
+      # using the FileBinary#binary? method.
+      def binary?(name, options = {})
+        open(name, 'rb') { |f| f.binary?(options) }
+      end
+
+      # Returns true if the file with name +name+ is considered to be ascii
+      # using the FileBinary#ascii? method.
+      def ascii?(name, options = {})
+        open(name, 'rb') { |f| f.ascii?(options) }
+      end
+    end
+  end
+end
+
+require 'tins/alias'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb
new file mode 100644
index 0000000000..560ca2d299
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb
@@ -0,0 +1,149 @@
+require 'enumerator'
+require 'pathname'
+require 'tins/module_group'
+
+module Tins
+  module Find
+    EXPECTED_STANDARD_ERRORS = ModuleGroup[
+      Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP,
+      Errno::ENAMETOOLONG
+    ]
+
+    class Finder
+      module PathExtension
+        attr_accessor :finder
+
+        def finder_stat
+          finder.protect_from_errors do
+            finder.follow_symlinks ? File.stat(self) : File.lstat(self)
+          end
+        end
+
+        def file
+          finder.protect_from_errors do
+            File.new(self) if file?
+          end
+        end
+
+        def file?
+          finder.protect_from_errors { s = finder_stat and s.file? }
+        end
+
+        def directory?
+          finder.protect_from_errors { s = finder_stat and s.directory? }
+        end
+
+        def exist?
+          finder.protect_from_errors { File.exist?(self) }
+        end
+
+        def stat
+          finder.protect_from_errors { File.stat(self) }
+        end
+
+        def lstat
+          finder.protect_from_errors { File.lstat(self) }
+        end
+
+        def pathname
+          Pathname.new(self)
+        end
+
+        def suffix
+          pathname.extname[1..-1] || ''
+        end
+      end
+
+      def initialize(opts = {})
+        @show_hidden     = opts.fetch(:show_hidden)     { true }
+        @raise_errors    = opts.fetch(:raise_errors)    { false }
+        @follow_symlinks = opts.fetch(:follow_symlinks) { true }
+        if opts.key?(:visit) && opts.key?(:suffix)
+          raise ArgumentError, 'either use visit or suffix argument'
+        elsif opts.key?(:visit)
+          @visit = opts.fetch(:visit) { -> path { true } }
+        elsif opts.key?(:suffix)
+          @suffix = Array(opts[:suffix])
+          @visit = -> path { @suffix.nil? || @suffix.empty? || @suffix.include?(path.suffix) }
+        end
+      end
+
+      attr_accessor :show_hidden
+
+      attr_accessor :raise_errors
+
+      attr_accessor :follow_symlinks
+
+      attr_accessor :suffix
+
+      def visit_path?(path)
+        if !defined?(@visit) || @visit.nil?
+          true
+        else
+          @visit.(path)
+        end
+      end
+
+      def find(*paths)
+        block_given? or return enum_for(__method__, *paths)
+        paths.collect! { |d| d.dup }
+        while path = paths.shift
+          path = prepare_path(path)
+          catch(:prune) do
+            stat = path.finder_stat or next
+            visit_path?(path) and yield path
+            if stat.directory?
+              ps = protect_from_errors { Dir.entries(path) } or next
+              ps.sort!
+              ps.reverse_each do |p|
+                next if p == "." or p == ".."
+                next if !@show_hidden && p.start_with?('.')
+                p = File.join(path, p)
+                paths.unshift p
+              end
+            end
+          end
+        end
+      end
+
+      def prepare_path(path)
+        path = path.dup
+        path.extend PathExtension
+        path.finder = self
+        path
+      end
+
+      def protect_from_errors(errors = Find::EXPECTED_STANDARD_ERRORS)
+        yield
+      rescue errors
+        raise_errors and raise
+        return
+      end
+    end
+
+    #
+    # Calls the associated block with the name of every path and directory
+    # listed as arguments, then recursively on their subdirectories, and so on.
+    #
+    # See the +Find+ module documentation for an example.
+    #
+    def find(*paths, &block) # :yield: path
+      opts = Hash === paths.last ? paths.pop : {}
+      Finder.new(opts).find(*paths, &block)
+    end
+
+    #
+    # Skips the current path or directory, restarting the loop with the next
+    # entry. If the current path is a directory, that directory will not be
+    # recursively entered. Meaningful only within the block associated with
+    # Find::find.
+    #
+    # See the +Find+ module documentation for an example.
+    #
+    def prune
+      throw :prune
+    end
+
+    module_function :find, :prune
+  end
+end
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb
new file mode 100644
index 0000000000..49ecb2c0c7
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb
@@ -0,0 +1,68 @@
+module Tins
+  # This class can create generator objects, that can produce all tuples, that
+  # would be created by as many for-loops as dimensions were given.
+  #
+  # The generator
+  #  g = Tins::Generator[1..2, %w[a b c]]
+  # produces
+  #  g.to_a # => [[1, "a"], [1, "b"], [1, "c"], [2, "a"], [2, "b"], [2, "c"]]
+  #
+  # The 'each' method can be used to iterate over the tuples
+  #  g.each { |a, b| puts "#{a} #{b}" }
+  # and Tins::Generator includes the Enumerable module, so
+  # Enumerable.instance_methods can be used as well:
+  #  g.select { |a, b| %w[a c].include? b  } # => [[1, "a"], [1, "c"], [2, "a"], [2, "c"]]
+  #
+  class Generator
+    include Enumerable
+
+    # Create a new Generator object from the enumberables _enums_.
+    def self.[](*enums)
+      new(enums)
+    end
+
+    # Create a new Generator instance. Use the objects in the Array _enums_
+    # as dimensions. The should all respond to the :each method (see module
+    # Enumerable in the core ruby library).
+    def initialize(enums)
+      @enums, @iterators, @n = [], [], 0
+      enums.each { |e| add_dimension(e) }
+    end
+
+    # Iterate over all tuples produced by this generator and yield to them.
+    def each(&block) # :yield: tuple
+      recurse(&block)
+      self
+    end
+
+    def recurse(tuple = [ nil ] * @n, i = 0, &block)
+      if i < @n - 1 then
+        @enums[i].__send__(@iterators[i]) do |x|
+          tuple[i] = x
+          recurse(tuple, i + 1, &block)
+        end
+      else
+        @enums[i].__send__(@iterators[i]) do |x|
+          tuple[i] = x
+          yield tuple.dup
+        end
+      end
+    end
+    private :recurse
+
+    # Add another dimension to this generator. _enum_ is an object, that ought
+    # to respond to the _iterator_ method (defaults to :each).
+    def add_dimension(enum, iterator = :each)
+      @enums << enum
+      @iterators << iterator
+      @n += 1
+    end
+
+    # Return the size of this generator, that is the number of its dimensions.
+    def size
+      @enums.size
+    end
+  end
+end
+
+require 'tins/alias'
diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb
new file mode 100644
index 0000000000..e4d62d8525
--- /dev/null
+++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb
@@ -0,0 +1,96 @@
+module Tins
+  module GO
+    module EnumerableExtension
+      def push(argument)
+        @arguments ||= []
+        @arguments.push argument
+        self
+      end
+      alias << push
+
+      def each(&block)
+        @arguments.each(&block)
+        self
+      end
+      include Enumerable
+    end
+
+    module_function
+
+    # Parses the argument array _args_, according to the pattern _s_, to
+    # retrieve the single character command line options from it. If _s_ is
+    # 'xy:' an option '-x' without an option argument is searched, and an
+    # option '-y foo' with an option argument ('foo'). To disable the '-x'
+    # option, pass '~x'.
+    #
+    # The _defaults_ argument specifies default values for the options.
+    #
+    # An option hash is returned with all found options set to true or the
+    # found option argument.
+    def go(s, args = ARGV, defaults: {})
+      d = defaults || {}
+      b, v = s.scan(/(.)(:?)/).inject([ {}, {} ]) { |t, (o, a)|
+        a = a == ?:
+        t[a ? 1 : 0][o] = a ? nil : false
+        t
+      }
+      b.each_key do |k|
+        d.key?(k) or next
+        if [ 0, false, nil ].include?(d[k])
+          b[k] = false
+        elsif d[k].respond_to?(:to_int)
+          b[k] = d[k].to_int
+        else
+          b[k] = 1
+        end
+      end
+      v.each_key do |k|
+        d.key?(k) or next
+        if [ 0, false, nil ].include?(d[k])
+          v[k] = nil
+        else
+          v[k] = d[k].to_s
+        end
+      end
+      r = []
+      while a = args.shift
+        /\A-(?

.+)/ =~ a or (r << a; next) + until p == '' + o = p.slice!(0, 1) + if v.key?(o) + if p.empty? && args.empty? + r << a + break 1 + elsif p == '' + a = args.shift + else + a = p + end + if v[o].nil? || !(EnumerableExtension === v[o]) + a = a.dup + a.extend EnumerableExtension + a << a + v[o] = a + else + v[o] << a + end + break + elsif b.key?(o) + if b[o] + b[o] += 1 + else + b[o] = 1 + end + else + r << a + end + end && break + end + r.reject! { |a| (b[p] = false) || true if /\A~(?

.)/ =~ a } + args.replace r + b.merge(v) + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb new file mode 100644 index 0000000000..7869a6a084 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb @@ -0,0 +1,48 @@ +require 'tins/thread_local' + +module Tins + module HashSymbolizeKeysRecursive + extend Tins::ThreadLocal + + thread_local :seen + + def symbolize_keys_recursive(circular: nil) + self.seen = {} + _symbolize_keys_recursive(self, circular: circular) + ensure + self.seen = nil + end + + def symbolize_keys_recursive!(circular: nil) + replace symbolize_keys_recursive(circular: circular) + end + + private + + def _symbolize_keys_recursive(object, circular: nil) + case + when seen[object.__id__] + object = circular + when Hash === object + seen[object.__id__] = true + new_object = object.class.new + seen[new_object.__id__] = true + object.each do |k, v| + new_object[k.to_s.to_sym] = _symbolize_keys_recursive(v, circular: circular) + end + object = new_object + when Array === object + seen[object.__id__] = true + new_object = object.class.new(object.size) + seen[new_object.__id__] = true + object.each_with_index do |v, i| + new_object[i] = _symbolize_keys_recursive(v, circular: circular) + end + object = new_object + end + object + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb new file mode 100644 index 0000000000..ce47d11427 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb @@ -0,0 +1,15 @@ +module Tins + module HashUnion + def |(other) + case + when other.respond_to?(:to_hash) + other = other.to_hash + when other.respond_to?(:to_h) + other = other.to_h + end + other.merge(self) + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb new file mode 100644 index 0000000000..a238e9857e --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb @@ -0,0 +1,7 @@ +module Tins + module IfPredicate + def if? + self ? self : nil + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb new file mode 100644 index 0000000000..c6b62d1a8f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb @@ -0,0 +1,40 @@ +module Tins + module Implement + MESSAGES = { + default: 'method %{method_name} not implemented in module %{module}', + subclass: 'method %{method_name} has to be implemented in '\ + 'subclasses of %{module}', + submodule: 'method %{method_name} has to be implemented in '\ + 'submodules of %{module}', + } + + def implement(method_name, msg = :default) + method_name.nil? and return + case msg + when ::Symbol + msg = MESSAGES.fetch(msg) + when ::Hash + return implement method_name, msg.fetch(:in) + end + display_method_name = method_name + if m = instance_method(method_name) rescue nil + m.extend Tins::MethodDescription + display_method_name = m.description(style: :name) + end + begin + msg = msg % { method_name: display_method_name, module: self } + rescue KeyError + end + define_method(method_name) do |*| + raise ::NotImplementedError, msg + end + end + + def implement_in_submodule(method_name) + implement method_name, + 'method %{method_name} has to be implemented in submodules of'\ + ' %{module}' + end + end +end + diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb new file mode 100644 index 0000000000..6b753bb06c --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb @@ -0,0 +1,44 @@ +require 'thread' + +module Tins + class Limited + # Create a Limited instance, that runs _maximum_ threads at most. + def initialize(maximum) + @mutex = Mutex.new + @continue = ConditionVariable.new + @maximum = Integer(maximum) + raise ArgumentError, "maximum < 1" if @maximum < 1 + @count = 0 + @tg = ThreadGroup.new + end + + # The maximum number of worker threads. + attr_reader :maximum + + # Execute _maximum_ number of threads in parallel. + def execute + @mutex.synchronize do + loop do + if @count < @maximum + @count += 1 + Thread.new do + @tg.add Thread.current + yield + @mutex.synchronize { @count -= 1 } + @continue.signal + end + return + else + @continue.wait(@mutex) + end + end + end + end + + def wait + @tg.list.each(&:join) + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb new file mode 100644 index 0000000000..13fb5550c3 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb @@ -0,0 +1,123 @@ +module Tins + class LinesFile + module LineExtension + attr_reader :line_number + + def filename + lines_file.filename.dup + end + end + + def self.for_filename(filename, line_number = nil) + obj = new(File.readlines(filename), line_number) + obj.filename = filename + obj + end + + def self.for_file(file, line_number = nil) + obj = new(file.readlines, line_number) + obj.filename = file.path + obj + end + + def self.for_lines(lines, line_number = nil) + new(lines, line_number) + end + + def initialize(lines, line_number = nil) + @lines = lines + @lines.each_with_index do |line, i| + line.extend LineExtension + line.instance_variable_set :@line_number, i + 1 + line.instance_variable_set :@lines_file, self + end + instance_variable_set :@line_number, line_number || (@lines.empty? ? 0 : 1) + end + + attr_accessor :filename + + attr_reader :line_number + + def rewind + self.line_number = 1 + self + end + + def next! + old = line_number + self.line_number += 1 + line_number > old ? self : nil + end + + def previous! + old = line_number + self.line_number -= 1 + line_number < old ? self : nil + end + + def line_number=(number) + number = number.to_i + if number > 0 && number <= last_line_number + @line_number = number + end + end + + def last_line_number + @lines.size + end + + def empty? + @lines.empty? + end + + def each(&block) + empty? and return self + old_line_number = line_number + 1.upto(last_line_number) do |number| + self.line_number = number + block.call(line) + end + self + ensure + self.line_number = old_line_number + end + include Enumerable + + def line + index = line_number - 1 + @lines[index] if index >= 0 + end + + def file_linenumber + "#{filename}:#{line_number}" + end + + def match_backward(regexp, previous_after_match = false) + begin + if line =~ regexp + previous_after_match and previous! + return $~.captures + end + end while previous! + end + + def match_forward(regexp, next_after_match = false) + begin + if line =~ regexp + next_after_match and next! + return $~.captures + end + end while next! + end + + def to_s + "#{line_number} #{line.chomp}" + end + + def inspect + "#<#{self.class}: #{to_s.inspect}>" + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb new file mode 100644 index 0000000000..0ea38c7035 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb @@ -0,0 +1,91 @@ +require 'tins/extract_last_argument_options' + +module Tins + module Memoize + module CacheMethods + # Return the cache object. + def __memoize_cache__ + @__memoize_cache__ ||= {} + end + + # Clear cached values for all methods/functions. + def memoize_cache_clear + __memoize_cache__.clear + self + end + + def memoize_apply_visibility(id) + visibility = instance_eval do + case + when private_method_defined?(id) + :private + when protected_method_defined?(id) + :protected + end + end + yield + ensure + visibility and __send__(visibility, id) + end + end + + class ::Module + # Automatically memoize calls of the the methods +method_ids+. The + # memoized results do NOT ONLY depend on the arguments, but ALSO on the + # object the method is called on. + def memoize_method(*method_ids) + method_ids.extend(ExtractLastArgumentOptions) + method_ids, opts = method_ids.extract_last_argument_options + include CacheMethods + method_ids.each do |method_id| + method_id = method_id.to_s.to_sym + memoize_apply_visibility method_id do + orig_method = instance_method(method_id) + __send__(:define_method, method_id) do |*args| + mc = __memoize_cache__ + if mc.key?(method_id) and result = mc[method_id][args] + result + else + (mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args) + $DEBUG and warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]" + opts[:freeze] and result.freeze + end + result + end + end + end + method_ids.size == 1 ? method_ids.first : method_ids + end + + include CacheMethods + + # Automatically memoize calls of the functions +function_ids+. The + # memoized result does ONLY depend on the arguments given to the + # function. + def memoize_function(*function_ids) + function_ids.extend(ExtractLastArgumentOptions) + function_ids, opts = function_ids.extract_last_argument_options + mc = __memoize_cache__ + function_ids.each do |function_id| + function_id = function_id.to_s.to_sym + memoize_apply_visibility function_id do + orig_function = instance_method(function_id) + __send__(:define_method, function_id) do |*args| + if mc.key?(function_id) and result = mc[function_id][args] + result + else + (mc[function_id] ||= {})[args] = result = orig_function.bind(self).call(*args) + opts[:freeze] and result.freeze + $DEBUG and warn "#{self.class} cached function #{function_id}(#{args.inspect unless args.empty?}) = #{result.inspect}" + end + result + end + end + end + function_ids.size == 1 ? function_ids.first : function_ids + end + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb new file mode 100644 index 0000000000..7e0aa601ae --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb @@ -0,0 +1,143 @@ +module Tins + module MethodDescription + class Parameters + class Parameter < Struct.new(:type, :name) + def ==(other) + type == other.type + end + + def inspect + "#<#{self.class} #{to_s.inspect}>" + end + end + + class RestParameter < Parameter + def to_s + "*#{name}" + end + end + + class KeyrestParameter < Parameter + def to_s + "**#{name}" + end + end + + class ReqParameter < Parameter + def to_s + name.to_s + end + end + + class OptParameter < Parameter + def to_s + "#{name}=?" + end + end + + class KeyParameter < Parameter + def to_s + "#{name}:?" + end + end + + class KeyreqParameter < Parameter + def to_s + "#{name}:" + end + end + + class BlockParameter < Parameter + def to_s + "&#{name}" + end + end + + class GenericParameter < Parameter + def to_s + [ name, type ] * ?: + end + end + + def self.build(type, name) + parameter_classname = "#{type.to_s.capitalize}Parameter" + parameter_class = + if const_defined? parameter_classname + const_get parameter_classname + else + GenericParameter + end + parameter_class.new(type, name) + end + end + + class Signature + def initialize(*parameters) + @parameters = parameters + end + + attr_reader :parameters + + def eql?(other) + @parameters.eql? other.parameters + end + + def ==(other) + @parameters == other.parameters + end + + def ===(method) + self == method.signature + end + + def to_s + @parameters * ?, + end + + def inspect + "#<#{self.class} (#{to_s})>" + end + end + + def signature + description style: :parameters + end + + def description(style: :namespace) + valid_styles = %i[ namespace name parameters ] + valid_styles.include?(style) or + raise ArgumentError, + "style has to be one of #{valid_styles * ', '}" + if respond_to?(:parameters) + generated_name = 'x0' + parameter_array = parameters.map { |p_type, p_name| + unless p_name + generated_name = generated_name.succ + p_name = generated_name + end + Parameters.build(p_type, p_name) + } + signature = Signature.new(*parameter_array) + if style == :parameters + return signature + end + end + result = '' + if style == :namespace + if owner <= Module + result << receiver.to_s << ?. # XXX Better to use owner here as well? + else + result << owner.name.to_s << ?# + end + end + if %i[ namespace name ].include?(style) + result << name.to_s << '(' + end + result << (signature || arity).to_s + if %i[ namespace name ].include?(style) + result << ?) + end + result + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb new file mode 100644 index 0000000000..68c94aff96 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb @@ -0,0 +1,55 @@ +module Tins + # This module can be mixed into all classes, whose instances respond to the + # [] and size-methods, like for example Array. The returned elements from [] + # should respond to the succ method. + module Minimize + # Returns a minimized version of this object, that is successive elements + # are substituted with ranges a..b. In the situation ..., x, y,... and y != + # x.succ a range x..x is created, to make it easier to iterate over all the + # ranges in one run. A small example: + # [ 'A', 'B', 'C', 'G', 'K', 'L', 'M' ].minimize # => [ 'A'..'C', 'G'..'G', 'K'..'M' ] + # + # If the order of the original elements doesn't matter, it's a good idea to + # first sort them and then minimize: + # [ 5, 1, 4, 2 ].sort.minimize # => [ 1..2, 4..5 ] + def minimize + result = [] + last_index = size - 1 + size.times do |i| + result << [ self[0] ] if i == 0 + if self[i].succ != self[i + 1] or i == last_index + result[-1] << self[i] + result << [ self[i + 1] ] unless i == last_index + end + end + result.map! { |a, b| a..b } + end + + # First minimizes this object, then calls the replace method with the + # result. + def minimize! + replace minimize + end + + # Invert a minimized version of an object. Some small examples: + # [ 'A'..'C', 'G'..'G', 'K'..'M' ].unminimize # => [ 'A', 'B', 'C', 'G', 'K', 'L', 'M' ] + # and + # [ 1..2, 4..5 ].unminimize # => [ 1, 2, 4, 5 ] + def unminimize + result = [] + for range in self + for e in range + result << e + end + end + result + end + + # Invert a minimized version of this object in place. + def unminimize! + replace unminimize + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb new file mode 100644 index 0000000000..91e3b6fc51 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb @@ -0,0 +1,13 @@ +module Tins + module ModuleGroup + def self.[](*modules) + modul = Module.new + modules.each do |m| + m.module_eval { include modul } + end + modul + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb new file mode 100644 index 0000000000..1b31e0af8f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb @@ -0,0 +1,12 @@ +require 'set' + +module Tins + class NamedSet < Set + def initialize(name) + @name = name + super() + end + + attr_accessor :name + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb new file mode 100644 index 0000000000..d974a9d8f3 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb @@ -0,0 +1,101 @@ +module Tins + # Implementation of the null object pattern in Ruby. + module Null + def method_missing(*) + self + end + + def const_missing(*) + self + end + + def to_s + '' + end + + def to_str + nil + end + + def to_f + 0.0 + end + + def to_i + 0 + end + + def to_int + nil + end + + def to_a + [] + end + + def to_ary + nil + end + + def inspect + 'NULL' + end + + def nil? + true + end + + def blank? + true + end + + def as_json(*) + end + + def to_json(*) + 'null' + end + + module Kernel + def null(value = nil) + value.nil? ? Tins::NULL : value + end + + alias Null null + + def null_plus(opts = {}) + value = opts[:value] + opts[:caller] = caller + if respond_to?(:caller_locations, true) + opts[:caller_locations] = caller_locations + end + + value.nil? ? Tins::NullPlus.new(opts) : value + end + + alias NullPlus null_plus + end + end + + class NullClass < Module + include Tins::Null + end + + NULL = NullClass.new + + NULL.freeze + + class NullPlus + include Tins::Null + + def initialize(opts = {}) + singleton_class.class_eval do + opts.each do |name, value| + define_method(name) { value } + end + end + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb new file mode 100644 index 0000000000..8e2800ff8c --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb @@ -0,0 +1,25 @@ +module Tins + module Once + include File::Constants + + module_function + + def only_once(lock_filename = nil, locking_constant = nil) + lock_filename ||= $0 + locking_constant ||= LOCK_EX + f = File.new(lock_filename, RDONLY) + f.flock(locking_constant) and yield + ensure + if f + f.flock LOCK_UN + f.close + end + end + + def try_only_once(lock_filename = nil, locking_constant = nil, &block) + only_once(lock_filename, locking_constant || LOCK_EX | LOCK_NB, &block) + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb new file mode 100644 index 0000000000..e4061f4385 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb @@ -0,0 +1,23 @@ +require 'pp' + +module Tins + module P + private + + # Raise a runtime error with the inspected objects +objs+ (obtained by + # calling the #inspect method) as their message text. This is useful for + # quick debugging. + def p!(*objs) + raise((objs.size < 2 ? objs.first : objs).inspect) + end + + # Raise a runtime error with the inspected objects +objs+ (obtained by + # calling the #pretty_inspect method) as their message text. This is useful + # for quick debugging. + def pp!(*objs) + raise("\n" + (objs.size < 2 ? objs.first : objs).pretty_inspect.chomp) + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb new file mode 100644 index 0000000000..cbd382268f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb @@ -0,0 +1,31 @@ +module Tins + module PartialApplication + # If this module is included into a Proc (or similar object), it tampers + # with its Proc#arity method. + def self.included(modul) + modul.module_eval do + old_arity = instance_method(:arity) + define_method(:arity) do + defined?(@__arity__) or old_arity.bind(self).call + end + end + super + end + + # Create a partial application of this Proc (or similar object) using + # _args_ as the already applied arguments. + def partial(*args) + if args.empty? + dup + elsif args.size > arity + raise ArgumentError, "wrong number of arguments (#{args.size} for #{arity})" + else + f = lambda { |*b| call(*(args + b)) } + f.instance_variable_set :@__arity__, arity - args.size + f + end + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb new file mode 100644 index 0000000000..6fefd60f97 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb @@ -0,0 +1,15 @@ +module Tins + module ProcCompose + def compose(other) + self.class.new do |*args| + if other.respond_to?(:call) + call(*other.call(*args)) + else + call(*other.to_proc.call(*args)) + end + end + end + + alias * compose + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb new file mode 100644 index 0000000000..8bb6cbea3e --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb @@ -0,0 +1,73 @@ +require 'tins/memoize' + +module Tins + module ProcPrelude + def apply(&my_proc) + my_proc or raise ArgumentError, 'a block argument is required' + lambda { |list| my_proc.call(*list) } + end + + def map_apply(my_method, *args, &my_proc) + my_proc or raise ArgumentError, 'a block argument is required' + lambda { |x, y| my_proc.call(x, y.__send__(my_method, *args)) } + end + + def call(obj, &my_proc) + my_proc or raise ArgumentError, 'a block argument is required' + obj.instance_eval(&my_proc) + end + + def array + lambda { |*list| list } + end + memoize_function :array, freeze: true + + def first + lambda { |*list| list.first } + end + memoize_function :first, freeze: true + + alias head first + + def second + lambda { |*list| list[1] } + end + memoize_function :second, freeze: true + + def tail + lambda { |*list| list[1..-1] } + end + memoize_function :tail, freeze: true + + def last + lambda { |*list| list.last } + end + memoize_function :last, freeze: true + + def rotate(n = 1) + lambda { |*list| list.rotate(n) } + end + + alias swap rotate + + def id1 + lambda { |obj| obj } + end + memoize_function :id1, freeze: true + + def const(konst = nil, &my_proc) + konst ||= my_proc.call + lambda { |*_| konst } + end + + def nth(n) + lambda { |*list| list[n] } + end + + def from(&block) + my_method, binding = block.call, block.binding + my_self = eval 'self', binding + lambda { |*list| my_self.__send__(my_method, *list) } + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb new file mode 100644 index 0000000000..07ed9c33ad --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb @@ -0,0 +1,9 @@ +module Tins + module RangePlus + def +(other) + to_a + other.to_a + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb new file mode 100644 index 0000000000..aab9dccf4d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb @@ -0,0 +1,9 @@ +module Tins + module RequireMaybe + def require_maybe(library) + require library + rescue LoadError => e + block_given? and yield e + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb new file mode 100644 index 0000000000..f2dd7e3468 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb @@ -0,0 +1,19 @@ +module Tins + module Responding + def responding?(*method_names) + Class.new do + define_method(:to_s) do + "Responding to #{method_names * ', '}" + end + + alias inspect to_s + + define_method(:===) do |object| + method_names.all? do |method_name| + object.respond_to?(method_name) + end + end + end.new + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb new file mode 100644 index 0000000000..fc79904df3 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb @@ -0,0 +1,27 @@ +module Tins + module SecureWrite + # Write to a file atomically + def secure_write(filename, content = nil, mode = 'w') + temp = File.new(filename + ".tmp.#$$.#{Time.now.to_f}", mode) + if content.nil? and block_given? + yield temp + elsif !content.nil? + temp.write content + else + raise ArgumentError, "either content or block argument required" + end + temp.fsync + size = temp.stat.size + temp.close + File.rename temp.path, filename + size + ensure + if temp + !temp.closed? and temp.close + File.file?(temp.path) and File.unlink temp.path + end + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb new file mode 100644 index 0000000000..d342df54a1 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb @@ -0,0 +1,39 @@ +require 'singleton' + +module Tins + + SexySingleton = Singleton.dup + + module SexySingleton + module SingletonClassMethods + end + end + + class << SexySingleton + alias __old_singleton_included__ included + + def included(klass) + __old_singleton_included__(klass) + (class << klass; self; end).class_eval do + if Object.method_defined?(:respond_to_missing?) + def respond_to_missing?(name, *args) + instance.respond_to?(name) || super + end + else + def respond_to?(name, *args) + instance.respond_to?(name) || super + end + end + + def method_missing(name, *args, &block) + if instance.respond_to?(name) + instance.__send__(name, *args, &block) + else + super + end + end + end + super + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb new file mode 100644 index 0000000000..36f069ede2 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb @@ -0,0 +1,20 @@ +require 'tins/concern' + +module Tins + module StringByteOrderMark + def bom_encoding + prefix = self[0, 4].force_encoding(Encoding::ASCII_8BIT) + case prefix + when /\A\xef\xbb\xbf/n then Encoding::UTF_8 + when /\A\x00\x00\xff\xfe/n then Encoding::UTF_32BE + when /\A\xff\xfe\x00\x00/n then Encoding::UTF_32LE + when /\A\xfe\xff/n then Encoding::UTF_16BE + when /\A\xff\xfe/n then Encoding::UTF_16LE + when /\A\x2b\x2f\x76[\x38-\x39\x2b\x2f]/n then Encoding::UTF_7 + when /\A\x84\x31\x95\x33/n then Encoding::GB18030 + end + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb new file mode 100644 index 0000000000..90e2f207c6 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb @@ -0,0 +1,16 @@ +module Tins + module StringCamelize + def camelize(first_letter = :upper) + case first_letter + when :upper, true + gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } + when :lower, false + self[0].chr.downcase + camelize[1..-1] + end + end + + alias camelcase camelize + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb new file mode 100644 index 0000000000..c2e82287ba --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb @@ -0,0 +1,15 @@ +module Tins + module StringUnderscore + def underscore + word = dup + word.gsub!(/::/, '/') + word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') + word.gsub!(/([a-z\d])([A-Z])/,'\1_\2') + word.tr!("-", "_") + word.downcase! + word + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb new file mode 100644 index 0000000000..bd5cf874e2 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb @@ -0,0 +1,104 @@ +module Tins + module StringVersion + LEVELS = [ :major, :minor, :build, :revision ].each_with_index. + each_with_object({}) { |(k, v), h| h[k] = v }.freeze + + SYMBOLS = LEVELS.invert.freeze + + class Version + include Comparable + + def initialize(string) + string =~ /\A\d+(\.\d+)*\z/ or + raise ArgumentError, "#{string.inspect} isn't a version number" + @version = string.frozen? ? string.dup : string + end + + LEVELS.each do |symbol, level| + define_method(symbol) do + self[level] + end + + define_method("#{symbol}=") do |new_level| + self[level] = new_level + end + end + + def bump(level = array.size - 1) + level = level_of(level) + self[level] += 1 + for l in level.succ..3 + self[l] &&= 0 + end + self + end + + def level_of(specifier) + if specifier.respond_to?(:to_sym) + LEVELS.fetch(specifier) + else + specifier + end + end + + def [](level) + array[level_of(level)] + end + + def []=(level, value) + level = level_of(level) + value = value.to_i + value >= 0 or raise ArgumentError, + "version numbers can't contain negative numbers like #{value}" + a = array + a[level] = value + a.map!(&:to_i) + @version.replace a * ?. + end + + def succ! + self[-1] += 1 + self + end + + def pred! + self[-1] -= 1 + self + end + + def <=>(other) + pairs = array.zip(other.array) + pairs.map! { |a, b| [ a.to_i, b.to_i ] } + a, b = pairs.transpose + a <=> b + end + + def ==(other) + (self <=> other).zero? + end + + def array + @version.split(?.).map(&:to_i) + end + + alias to_a array + + def to_s + @version + end + + def initialize_copy(source) + super + @version = source.instance_variable_get(:@version).dup + end + + alias inspect to_s + end + + def version + Version.new(self) + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb new file mode 100644 index 0000000000..4efa924e16 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb @@ -0,0 +1,42 @@ +module Tins + module Subhash + # Create a subhash from this hash, that only contains key-value pairs + # matching +patterns+ and return it. +patterns+ can be for example /^foo/ + # to put 'foobar' and 'foobaz' or 'foo'/:foo to put 'foo' into the subhash. + # + # If a block is given this method yields to it after the first pattern + # matched with a 3-tuple of +(key, value, match_data)+ using the return + # value of the block as the value of the result hash. +match_data+ is a + # MatchData instance if the matching pattern was a regular rexpression + # otherwise it is nil. + def subhash(*patterns) + patterns.map! do |pat| + pat = pat.to_sym.to_s if pat.respond_to?(:to_sym) + pat.respond_to?(:match) ? pat : pat.to_s + end + result = + if default_proc + self.class.new(&default_proc) + else + self.class.new(default) + end + if block_given? + each do |k, v| + patterns.each { |pat| + if pat === k.to_s + result[k] = yield(k, v, $~) + break + end + } + end + else + each do |k, v| + result[k] = v if patterns.any? { |pat| pat === k.to_s } + end + end + result + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb new file mode 100644 index 0000000000..bafcb857cf --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb @@ -0,0 +1,26 @@ +require 'tmpdir' + +module Tins + module TempIO + def temp_io(content: nil, name: __method__) + content.nil? and raise ArgumentError, "missing keyword: content" + name = File.basename(name.to_s) + Dir.mktmpdir do |dir| + name = File.join(dir, name) + File.open(name, 'w+b') do |io| + if content.respond_to?(:call) + if content.respond_to?(:arity) && content.arity == 1 + content.call(io) + else + io.write content.call + end + else + io.write content + end + io.rewind + yield io + end + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb new file mode 100644 index 0000000000..028ce3c600 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb @@ -0,0 +1,26 @@ +require 'tins/temp_io' + +module Tins + module TempIO + class Enum < Enumerator + include Tins::TempIO + + def initialize(chunk_size: 2 ** 16, filename: nil, &content_proc) + content_proc or raise ArgumentError, 'need a content proc as block argument' + super() do |y| + temp_io(name: 'some-stream', content: content_proc) do |file| + until file.eof? + y.yield file.read(chunk_size) + end + end + end.tap do |enum| + if filename + enum.define_singleton_method(:filename) do + filename + end + end + end + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb new file mode 100644 index 0000000000..3c2cd95489 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb @@ -0,0 +1,42 @@ +begin + require 'io/console' +rescue LoadError +end + +module Tins + module Terminal + + module_function + + def winsize + if IO.respond_to?(:console) + console = IO.console + if console.respond_to?(:winsize) + console.winsize + else + [] + end + else + [] + end + end + + def rows + winsize[0] || `stty size 2>/dev/null`.split[0].to_i.nonzero? || + `tput lines 2>/dev/null`.to_i.nonzero? || 25 + end + + def lines + rows + end + + def columns + winsize[1] || `stty size 2>/dev/null`.split[1].to_i.nonzero? || + `tput cols 2>/dev/null`.to_i.nonzero? || 80 + end + + def cols + columns + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb new file mode 100644 index 0000000000..cf6169cf5a --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb @@ -0,0 +1,57 @@ +module Tins + module ThreadLocal + @@mutex = Mutex.new + + @@cleanup = lambda do |my_object_id| + my_id = "__thread_local_#{my_object_id}__" + @@mutex.synchronize do + for t in Thread.list + t[my_id] = nil if t[my_id] + end + end + end + + # Define a thread local variable named _name_ in this module/class. If the + # value _value_ is given, it is used to initialize the variable. + def thread_local(name, default_value = nil, &default) + is_a?(Module) or raise TypeError, "receiver has to be a Module" + + default_value && default and raise ArgumentError, + "require either default_falue or default block" + + if default_value + default = -> * { default_value } + end + + name = name.to_s + my_id = "__thread_local_#{__id__}__" + + ObjectSpace.define_finalizer(self, @@cleanup) + + define_method(name) do + values = Thread.current[my_id] ||= {} + if default && !values.key?(name) + values[name] = default.call + end + values[name] + end + + define_method("#{name}=") do |value| + Thread.current[my_id] ||= {} + Thread.current[my_id][name] = value + end + + self + end + + # Define a thread local variable for the current instance with name _name_. + # If the value _value_ is given, it is used to initialize the variable. + def instance_thread_local(name, default_value = nil, &default) + class << self + extend Tins::ThreadLocal + self + end.thread_local name, default_value, &default + self + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb new file mode 100644 index 0000000000..dc58d5735d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb @@ -0,0 +1,57 @@ +require 'time' + +module Tins + module TimeDummy + def self.included(modul) + class << modul + alias really_new new + alias really_now now + + remove_method :now rescue nil + remove_method :new rescue nil + + def dummy=(value) + if value.respond_to?(:to_str) + value = Time.parse(value.to_str) + elsif value.respond_to?(:to_time) + value = value.to_time + end + @dummy = value + end + + def dummy(value = nil) + if value.nil? + if defined?(@dummy) + @dummy + end + else + begin + old_dummy = @dummy + self.dummy = value + yield + ensure + self.dummy = old_dummy + end + end + end + + def new(*a) + if dummy + dummy.dup + elsif caller.first =~ /`now`/ + really_now + else + really_new(*a) + end + end + + def now + new + end + end + super + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb new file mode 100644 index 0000000000..4c5947a8a8 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb @@ -0,0 +1,8 @@ +module Tins + module To + def to(string) + shift_width = (string[/\A\s*/]).size + string.gsub(/^[^\S\n]{0,#{shift_width}}/, '') + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb new file mode 100644 index 0000000000..110f3bbf3d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb @@ -0,0 +1,12 @@ +module Tins + module ToProc + # :nocov: + def to_proc + lambda do |obj, *args| + obj.__send__(self, *args[0..-1]) + end + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb new file mode 100644 index 0000000000..16459b2460 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb @@ -0,0 +1,36 @@ +require 'securerandom' + +module Tins + class Token < String + DEFAULT_ALPHABET = + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".freeze + + BASE64_ALPHABET = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".freeze + + BASE64_URL_FILENAME_SAFE_ALPHABET = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".freeze + + BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".freeze + + BASE32_EXTENDED_HEX_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUV".freeze + + BASE16_ALPHABET = "0123456789ABCDEF".freeze + + def initialize(bits: 128, length: nil, alphabet: DEFAULT_ALPHABET, random: SecureRandom) + alphabet.size > 1 or raise ArgumentError, 'need at least 2 symbols in alphabet' + if length + length > 0 or raise ArgumentError, 'length has to be positive' + else + bits > 0 or raise ArgumentError, 'bits has to be positive' + length = (Math.log(1 << bits) / Math.log(alphabet.size)).ceil + end + self.bits = (Math.log(alphabet.size ** length) / Math.log(2)).floor + token = '' + length.times { token << alphabet[random.random_number(alphabet.size)] } + super token + end + + attr_accessor :bits + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb new file mode 100644 index 0000000000..fae406232b --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb @@ -0,0 +1,10 @@ +module Tins + module UniqBy + def uniq_by(&b) + b ||= lambda { |x| x } + inject({}) { |h, e| h[b[e]] ||= e; h }.values + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb new file mode 100644 index 0000000000..998bb526bf --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb @@ -0,0 +1,179 @@ +require 'strscan' +require 'bigdecimal' + +module Tins::Unit + Prefix = Struct.new(:name, :step, :multiplier, :fraction) + + PREFIX_LC = [ + '', 'k', 'm', 'g', 't', 'p', 'e', 'z', 'y', + ].each_with_index.map { |n, i| Prefix.new(n.freeze, 1000, 1000 ** i, false) }.freeze + + PREFIX_UC = [ + '', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', + ].each_with_index.map { |n, i| Prefix.new(n.freeze, 1024, 1024 ** i, false) }.freeze + + PREFIX_F = [ + '', 'm', 'µ', 'n', 'p', 'f', 'a', 'z', 'y', + ].each_with_index.map { |n, i| Prefix.new(n.freeze, 1000, 1000 ** -i, true) }.freeze + + class ParserError < ArgumentError; end + + module_function + + def prefixes(identifier) + case identifier + when :uppercase, :uc, 1024 + PREFIX_UC + when :lowercase, :lc, 1000 + PREFIX_LC + when :fraction, :f, 0.001 + PREFIX_F + when Array + identifier + end + end + + def format(value, format: '%f %U', prefix: 1024, unit: ?b) + prefixes = prefixes(prefix) + first_prefix = prefixes.first or + raise ArgumentError, 'a non-empty array of prefixes is required' + if value.zero? + result = format.sub('%U', unit) + result %= value + else + prefix = prefixes[ + (first_prefix.fraction ? -1 : 1) * Math.log(value.abs) / Math.log(first_prefix.step) + ] + result = format.sub('%U', "#{prefix.name}#{unit}") + result %= (value / prefix.multiplier.to_f) + end + end + + class UnitParser < StringScanner + NUMBER = /([+-]? + (?:0|[1-9]\d*) + (?: + \.\d+(?i:e[+-]?\d+) | + \.\d+ | + (?i:e[+-]?\d+) + )? + )/x + + def initialize(source, unit, prefixes = nil) + super source + if prefixes + @unit_re = unit_re(Tins::Unit.prefixes(prefixes), unit) + @unit_lc_re = @unit_uc_re = nil + else + @unit_lc_re = unit_re(Tins::Unit.prefixes(:lc), unit) + @unit_uc_re = unit_re(Tins::Unit.prefixes(:uc), unit) + @unit_re = nil + end + @number = 1.0 + end + + def unit_re(prefixes, unit) + re = Regexp.new( + "(#{prefixes.reverse.map { |pre| Regexp.quote(pre.name) } * ?|})(#{unit})" + ) + re.singleton_class.class_eval do + define_method(:prefixes) { prefixes } + end + re + end + + private :unit_re + + attr_reader :number + + def scan(re) + re.nil? and return + super + end + + def scan_number + scan(NUMBER) or return + @number *= BigDecimal(self[1]) + end + + def scan_unit + case + when scan(@unit_re) + prefix = @unit_re.prefixes.find { |pre| pre.name == self[1] } or return + @number *= prefix.multiplier + when scan(@unit_lc_re) + prefix = @unit_lc_re.prefixes.find { |pre| pre.name == self[1] } or return + @number *= prefix.multiplier + when scan(@unit_uc_re) + prefix = @unit_uc_re.prefixes.find { |pre| pre.name == self[1] } or return + @number *= prefix.multiplier + end + end + + def scan_char(char) + scan(/#{char}/) or return + end + + def parse + raise NotImplementedError + end + end + + class FormatParser < StringScanner + def initialize(format, unit_parser) + super format + @unit_parser = unit_parser + end + + def reset + super + @unit_parser.reset + end + + def location + @unit_parser.peek(10).inspect + end + + private :location + + def parse + reset + until eos? || @unit_parser.eos? + case + when scan(/%f/) + @unit_parser.scan_number or + raise ParserError, "\"%f\" expected at #{location}" + when scan(/%U/) + @unit_parser.scan_unit or + raise ParserError, "\"%U\" expected at #{location}" + when scan(/%%/) + @unit_parser.scan_char(?%) or + raise ParserError, "#{?%.inspect} expected at #{location}" + else + char = scan(/./) + @unit_parser.scan_char(char) or + raise ParserError, "#{char.inspect} expected at #{location}" + end + end + unless eos? && @unit_parser.eos? + raise ParserError, + "format #{string.inspect} and string "\ + "#{@unit_parser.string.inspect} do not match" + end + @unit_parser.number + end + end + + # Parse the string +string+ if it matches +format+ with the unit +unit+ and + # the prefixes specified by +prefix+. + def parse(string, format: '%f %U', unit: ?b, prefix: nil) + prefixes = prefixes(prefix) + FormatParser.new(format, UnitParser.new(string, unit, prefixes)).parse + end + + def parse?(string, **options) + parse(string, **options) + rescue ParserError + nil + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb new file mode 100644 index 0000000000..16e1a7177b --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb @@ -0,0 +1,8 @@ +module Tins + # Tins version + VERSION = '1.25.0' + VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc: + VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc: + VERSION_MINOR = VERSION_ARRAY[1] # :nodoc: + VERSION_BUILD = VERSION_ARRAY[2] # :nodoc: +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb new file mode 100644 index 0000000000..8a6eab1755 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb @@ -0,0 +1,19 @@ +require 'tins/secure_write' + +module Tins + module Write + def self.extended(modul) + modul.extend SecureWrite + if modul.respond_to?(:write) + $DEBUG and warn "Skipping inclusion of Tins::Write#write method, include Tins::Write::SecureWrite#secure_write instead" + else + class << modul; self; end.instance_eval do + alias_method :write, :secure_write + end + end + super + end + end +end + +require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb new file mode 100644 index 0000000000..9d7b263825 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb @@ -0,0 +1,45 @@ +require 'tins' + +module Tins + require 'tins/xt/attempt' + require 'tins/xt/blank' + require 'tins/xt/count_by' + require 'tins/xt/deep_dup' + require 'tins/xt/file_binary' + require 'tins/xt/full' + require 'tins/xt/hash_symbolize_keys_recursive' + require 'tins/xt/hash_union' + require 'tins/xt/irb' + require 'tins/xt/named' + require 'tins/xt/null' + require 'tins/xt/p' + require 'tins/xt/partial_application' + require 'tins/xt/range_plus' + require 'tins/xt/require_maybe' + require 'tins/xt/secure_write' + require 'tins/xt/string' + require 'tins/xt/subhash' + require 'tins/xt/time_dummy' + require 'tins/xt/date_dummy' + require 'tins/xt/date_time_dummy' + require 'tins/xt/uniq_by' + require 'tins/xt/write' + require 'tins/xt/if_predicate' + require 'tins/xt/ask_and_send' + require 'tins/xt/extract_last_argument_options' + require 'tins/xt/deep_const_get' + require 'tins/xt/responding' + require 'tins/xt/proc_compose' + require 'tins/xt/proc_prelude' + require 'tins/xt/sexy_singleton' + require 'tins/xt/method_description' + require 'tins/xt/annotate' + require 'tins/xt/concern' + require 'tins/xt/dslkit' + require 'tins/xt/time_freezer' + require 'tins/xt/case_predicate' + require 'tins/xt/implement' + require 'tins/xt/complete' + require 'tins/xt/expose' + require 'tins/xt/temp_io' +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb new file mode 100644 index 0000000000..82118aab6f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb @@ -0,0 +1,5 @@ +require 'tins/annotate' + +class Module + include Tins::Annotate +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb new file mode 100644 index 0000000000..84ca6fdf6d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb @@ -0,0 +1,7 @@ +require 'tins/ask_and_send' + +module Tins + class ::Object + include Tins::AskAndSend + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb new file mode 100644 index 0000000000..40d5e0de10 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb @@ -0,0 +1,7 @@ +require 'tins/attempt' + +module Tins + class ::Object + include Tins::Attempt + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb new file mode 100644 index 0000000000..d6833928c9 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb @@ -0,0 +1,67 @@ +module Tins + module Blank + module Object + def blank? + respond_to?(:empty?) ? empty? : !self + end + + def present? + !blank? + end + end + + module NilClass + def blank? + true + end + end + + module FalseClass + def blank? + true + end + end + + module TrueClass + def blank? + false + end + end + + module Array + def self.included(modul) + modul.module_eval do + alias_method :blank?, :empty? + end + end + end + + module Hash + def self.included(modul) + modul.module_eval do + alias_method :blank?, :empty? + end + end + end + + module String + def blank? + self !~ /\S/ + end + end + + module Numeric + def blank? + false + end + end + end +end + +unless Object.respond_to?(:blank?) + for k in Tins::Blank.constants + Object.const_get(k).class_eval do + include Tins::Blank.const_get(k) + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb new file mode 100644 index 0000000000..c688acf611 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb @@ -0,0 +1,8 @@ +require 'tins/case_predicate' + +module Tins + class ::Object + include Tins::CasePredicate + end +end + diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb new file mode 100644 index 0000000000..94a0712b67 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb @@ -0,0 +1,7 @@ +require 'tins/complete' + +module Tins + class ::Object + include Tins::Complete + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb new file mode 100644 index 0000000000..e4e5d0269b --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb @@ -0,0 +1,20 @@ +require 'tins/concern' + +module Tins + module Concern + module ModuleMixin + def tins_concern_configure(*args) + Thread.current[:tin_concern_args] = args + self + end + + def tins_concern_args + Thread.current[:tin_concern_args] + end + end + end + + class ::Module + include Tins::Concern::ModuleMixin + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb new file mode 100644 index 0000000000..3455bdc2bd --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb @@ -0,0 +1,11 @@ +require 'tins/count_by' + +module Tins + module ::Enumerable + include CountBy + end + + class ::Array + include CountBy + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb new file mode 100644 index 0000000000..5a3bbaed48 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb @@ -0,0 +1,7 @@ +require 'tins/date_dummy' + +module Tins + class ::Date + include DateDummy + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb new file mode 100644 index 0000000000..4c290366f8 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb @@ -0,0 +1,7 @@ +require 'tins/date_time_dummy' + +module Tins + class ::DateTime + include DateTimeDummy + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb new file mode 100644 index 0000000000..e8dbb5674b --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb @@ -0,0 +1,7 @@ +require 'tins/deep_const_get' + +module Tins + class ::Object + include DeepConstGet + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb new file mode 100644 index 0000000000..f9c0b48a55 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb @@ -0,0 +1,7 @@ +require 'tins/deep_dup' + +module Tins + class ::Object + include Tins::DeepDup + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb new file mode 100644 index 0000000000..4b56232837 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb @@ -0,0 +1,22 @@ +require 'tins' + +module Tins + class ::Module + include Tins::Constant + include Tins::DSLAccessor + include Tins::ClassMethod + include Tins::Delegate + include Tins::ParameterizedModule + include Tins::FromModule + end + + class ::Object + include Tins::ThreadLocal + include Tins::ThreadGlobal + include Tins::Interpreter + include Tins::Deflect + include Tins::ThreadLocal + include Tins::Eigenclass + include Tins::BlockSelf + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb new file mode 100644 index 0000000000..10c80c5461 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb @@ -0,0 +1,5 @@ +require 'tins/expose' + +class ::Object + include Tins::Expose +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb new file mode 100644 index 0000000000..794a7d7321 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb @@ -0,0 +1,7 @@ +require 'tins/extract_last_argument_options' + +module Tins + class ::Array + include ExtractLastArgumentOptions + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb new file mode 100644 index 0000000000..c2f02a4500 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb @@ -0,0 +1,7 @@ +require 'tins/file_binary' + +module Tins + class ::File + include FileBinary + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb new file mode 100644 index 0000000000..1c9048f490 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb @@ -0,0 +1,39 @@ +require 'tins/xt/blank' + +module Tins + module Full + # Returns the object if it isn't blank (as in Object#blank?), otherwise it + # returns nil. If a block was given as an argument and the object isn't + # blank, the block is executed with the object as its first argument. If an + # argument +dispatch+ was given and the object wasn't blank the method + # given by dispatch is called on the object. This is the same as + # foo.full?(&:bar) in the previous block form. + def full?(dispatch = nil, *args) + if blank? + obj = nil + #elsif Module === dispatch # TODO + # dispatch.found?(self) + elsif dispatch + obj = __send__(dispatch, *args) + obj = nil if obj.blank? + else + obj = self + end + if block_given? and obj + yield obj + else + obj + end + end + + def all_full? + if respond_to?(:all?) && all?(&:full?) + block_given? ? yield(self) : self + end + end + end + + class ::Object + include Full + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb new file mode 100644 index 0000000000..162b9d1e32 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb @@ -0,0 +1,7 @@ +require 'tins/hash_symbolize_keys_recursive' + +module Tins + class ::Hash + include HashSymbolizeKeysRecursive + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb new file mode 100644 index 0000000000..22ad94194a --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb @@ -0,0 +1,11 @@ +require 'tins/hash_union' + +module Tins + class ::Hash + if method_defined?(:|) + warn "#{self}#| already defined, didn't include at #{__FILE__}:#{__LINE__}" + else + include HashUnion + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb new file mode 100644 index 0000000000..1c0ee6e10f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb @@ -0,0 +1,7 @@ +require 'tins/if_predicate' + +module Tins + class ::Object + include Tins::IfPredicate + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb new file mode 100644 index 0000000000..3f4b7963ee --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb @@ -0,0 +1,5 @@ +require 'tins/implement' + +class Module + include Tins::Implement +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb new file mode 100644 index 0000000000..920f61b615 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb @@ -0,0 +1,23 @@ +require 'irb' + +module Tins + IRB = ::IRB + + module ::IRB + def self.examine(binding = TOPLEVEL_BINDING) + setup nil + workspace = WorkSpace.new binding + irb = Irb.new workspace + @CONF[:MAIN_CONTEXT] = irb.context + catch(:IRB_EXIT) { irb.eval_input } + rescue Interrupt + exit + end + end + + class ::Object + def examine(binding = TOPLEVEL_BINDING) + IRB.examine(binding) + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb new file mode 100644 index 0000000000..b5ca8cc095 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb @@ -0,0 +1,23 @@ +require 'tins/method_description' + +module Tins + class ::UnboundMethod + include MethodDescription + + alias to_s description + + def inspect + "#<#{self.class}: #{description}>" + end + end + + class ::Method + include MethodDescription + + alias to_s description + + def inspect + "#<#{self.class}: #{description}>" + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb new file mode 100644 index 0000000000..7c15116e70 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb @@ -0,0 +1,23 @@ +require 'tins/xt/string_version' + +class Object + def named(name, method, *args, &named_block) + extend Module.new { + define_method(name) do |*rest, &block| + block = named_block if named_block + __send__(method, *(args + rest), &block) + end + } + end +end + +class Module + def named(name, method, *args, &named_block) + include Module.new { + define_method(name) do |*rest, &block| + block = named_block if named_block + __send__(method, *(args + rest), &block) + end + } + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb new file mode 100644 index 0000000000..37455d3a2c --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb @@ -0,0 +1,9 @@ +require 'tins/null' + +module Tins + ::NULL = Tins::NULL + + class ::Object + include Tins::Null::Kernel + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb new file mode 100644 index 0000000000..775f2bb3ee --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb @@ -0,0 +1,7 @@ +require 'tins/p' + +module Tins + class ::Object + include Tins::P + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb new file mode 100644 index 0000000000..9c05b840b5 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb @@ -0,0 +1,11 @@ +require 'tins/partial_application' + +module Tins + class ::Proc + include PartialApplication + end + + class ::Method + include PartialApplication + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb new file mode 100644 index 0000000000..2bde627e71 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb @@ -0,0 +1,7 @@ +require 'tins/proc_compose' + +module Tins + class ::Proc + include Tins::ProcCompose + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb new file mode 100644 index 0000000000..ed64d2187f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb @@ -0,0 +1,7 @@ +require 'tins/proc_prelude' + +module Tins + class ::Proc + extend Tins::ProcPrelude + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb new file mode 100644 index 0000000000..fc6cc4fdee --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb @@ -0,0 +1,12 @@ +require 'tins/range_plus' + +module Tins + class ::Range + if method_defined?(:+) + warn "#{self}#+ already defined, didn't include at #{__FILE__}:#{__LINE__}" + else + include RangePlus + end + end +end + diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb new file mode 100644 index 0000000000..ae6d9e15ff --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb @@ -0,0 +1,7 @@ +require 'tins/require_maybe' + +module Tins + class ::Object + include Tins::RequireMaybe + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb new file mode 100644 index 0000000000..ec626b3653 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb @@ -0,0 +1,7 @@ +require 'tins/responding' + +module Tins + class ::Object + include Tins::Responding + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb new file mode 100644 index 0000000000..86aeb82527 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb @@ -0,0 +1,11 @@ +require 'tins/secure_write' + +module Tins + #class ::Object + # include Tins::SecureWrite + #end + + class ::IO + extend Tins::SecureWrite + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb new file mode 100644 index 0000000000..2182c99f34 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb @@ -0,0 +1,3 @@ +module Tins + ::SexySingleton = Tins::SexySingleton +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb new file mode 100644 index 0000000000..9a4661ac13 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb @@ -0,0 +1,6 @@ +module Tins + require 'tins/xt/string_camelize' + require 'tins/xt/string_underscore' + require 'tins/xt/string_version' + require 'tins/xt/string_byte_order_mark' +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb new file mode 100644 index 0000000000..06694bee66 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb @@ -0,0 +1,7 @@ +module Tins + require 'tins/string_byte_order_mark' + class ::String + include StringByteOrderMark + end +end + diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb new file mode 100644 index 0000000000..0b19427fa3 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb @@ -0,0 +1,6 @@ +module Tins + require 'tins/string_camelize' + class ::String + include StringCamelize + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb new file mode 100644 index 0000000000..48d9aa03c8 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb @@ -0,0 +1,6 @@ +module Tins + require 'tins/string_underscore' + class ::String + include StringUnderscore + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb new file mode 100644 index 0000000000..fc46c81057 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb @@ -0,0 +1,7 @@ +module Tins + require 'tins/string_version' + + class ::String + include StringVersion + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb new file mode 100644 index 0000000000..4d1485458d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb @@ -0,0 +1,11 @@ +require 'tins/subhash' + +module Tins + class ::Hash + include Tins::Subhash + + def subhash!(*patterns) + replace subhash(*patterns) + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb new file mode 100644 index 0000000000..a0ba260f94 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb @@ -0,0 +1,5 @@ +require 'tins/temp_io' + +class ::Object + include Tins::TempIO +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb new file mode 100644 index 0000000000..8b1a4e52dd --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb @@ -0,0 +1,7 @@ +require 'tins/time_dummy' + +module Tins + class ::Time + include TimeDummy + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb new file mode 100644 index 0000000000..768dedde12 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb @@ -0,0 +1,15 @@ +require 'tins/xt/time_dummy' +require 'tins/xt/date_time_dummy' +require 'tins/xt/date_dummy' + +module Tins::TimeFreezer + def self.freeze(time) + Time.dummy(time) do + DateTime.dummy(time) do + Date.dummy(time) do + yield + end + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb new file mode 100644 index 0000000000..b1c8c21475 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb @@ -0,0 +1,5 @@ +module Tins + class ::Object + include ::Tins::To + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb new file mode 100644 index 0000000000..87eca8b10d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb @@ -0,0 +1,15 @@ +require 'tins/uniq_by' + +module Tins + module ::Enumerable + include UniqBy + end + + class ::Array + include UniqBy + + def uniq_by!(&b) + replace uniq_by(&b) + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb new file mode 100644 index 0000000000..7c8071709f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb @@ -0,0 +1,11 @@ +require 'tins/write' + +module Tins + #class ::Object + # include Tins::Write + #end + + class ::IO + extend Tins::Write + end +end From e62a0c65efb0d9189baba6167c4d22f3241179c7 Mon Sep 17 00:00:00 2001 From: Baffour Adu Boampong Date: Mon, 6 Jul 2020 13:59:04 +0000 Subject: [PATCH 149/149] brew man --- .../gems/coveralls-0.8.23/lib/coveralls.rb | 101 --- .../coveralls-0.8.23/lib/coveralls/api.rb | 128 ---- .../coveralls-0.8.23/lib/coveralls/command.rb | 69 -- .../lib/coveralls/configuration.rb | 233 ------- .../coveralls-0.8.23/lib/coveralls/output.rb | 114 ---- .../lib/coveralls/rake/task.rb | 19 - .../lib/coveralls/simplecov.rb | 101 --- .../coveralls-0.8.23/lib/coveralls/version.rb | 3 - .../lib/term/ansicolor.rb | 127 ---- .../lib/term/ansicolor/.keep | 0 .../lib/term/ansicolor/attribute.rb | 142 ---- .../lib/term/ansicolor/attribute/color256.rb | 69 -- .../lib/term/ansicolor/attribute/color8.rb | 25 - .../ansicolor/attribute/intense_color8.rb | 43 -- .../lib/term/ansicolor/attribute/text.rb | 23 - .../lib/term/ansicolor/hsl_triple.rb | 169 ----- .../lib/term/ansicolor/movement.rb | 108 --- .../lib/term/ansicolor/ppm_reader.rb | 96 --- .../lib/term/ansicolor/rgb_color_metrics.rb | 161 ----- .../lib/term/ansicolor/rgb_triple.rb | 179 ----- .../lib/term/ansicolor/version.rb | 8 - .../ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb | 2 - .../gems/tins-1.25.0/lib/dslkit/polite.rb | 1 - .../2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb | 1 - .../ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb | 2 - .../ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb | 61 -- .../2.6.0/gems/tins-1.25.0/lib/tins/alias.rb | 1 - .../gems/tins-1.25.0/lib/tins/annotate.rb | 38 -- .../gems/tins-1.25.0/lib/tins/ask_and_send.rb | 31 - .../gems/tins-1.25.0/lib/tins/attempt.rb | 111 --- .../gems/tins-1.25.0/lib/tins/bijection.rb | 46 -- .../tins-1.25.0/lib/tins/case_predicate.rb | 7 - .../gems/tins-1.25.0/lib/tins/complete.rb | 18 - .../gems/tins-1.25.0/lib/tins/concern.rb | 30 - .../gems/tins-1.25.0/lib/tins/count_by.rb | 8 - .../gems/tins-1.25.0/lib/tins/date_dummy.rb | 53 -- .../tins-1.25.0/lib/tins/date_time_dummy.rb | 51 -- .../tins-1.25.0/lib/tins/deep_const_get.rb | 42 -- .../gems/tins-1.25.0/lib/tins/deep_dup.rb | 11 - .../2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb | 636 ------------------ .../gems/tins-1.25.0/lib/tins/duration.rb | 95 --- .../2.6.0/gems/tins-1.25.0/lib/tins/expose.rb | 27 - .../lib/tins/extract_last_argument_options.rb | 14 - .../gems/tins-1.25.0/lib/tins/file_binary.rb | 83 --- .../2.6.0/gems/tins-1.25.0/lib/tins/find.rb | 149 ---- .../gems/tins-1.25.0/lib/tins/generator.rb | 68 -- .../2.6.0/gems/tins-1.25.0/lib/tins/go.rb | 96 --- .../lib/tins/hash_symbolize_keys_recursive.rb | 48 -- .../gems/tins-1.25.0/lib/tins/hash_union.rb | 15 - .../gems/tins-1.25.0/lib/tins/if_predicate.rb | 7 - .../gems/tins-1.25.0/lib/tins/implement.rb | 40 -- .../gems/tins-1.25.0/lib/tins/limited.rb | 44 -- .../gems/tins-1.25.0/lib/tins/lines_file.rb | 123 ---- .../gems/tins-1.25.0/lib/tins/memoize.rb | 91 --- .../lib/tins/method_description.rb | 143 ---- .../gems/tins-1.25.0/lib/tins/minimize.rb | 55 -- .../gems/tins-1.25.0/lib/tins/module_group.rb | 13 - .../gems/tins-1.25.0/lib/tins/named_set.rb | 12 - .../2.6.0/gems/tins-1.25.0/lib/tins/null.rb | 101 --- .../2.6.0/gems/tins-1.25.0/lib/tins/once.rb | 25 - .../ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb | 23 - .../lib/tins/partial_application.rb | 31 - .../gems/tins-1.25.0/lib/tins/proc_compose.rb | 15 - .../gems/tins-1.25.0/lib/tins/proc_prelude.rb | 73 -- .../gems/tins-1.25.0/lib/tins/range_plus.rb | 9 - .../tins-1.25.0/lib/tins/require_maybe.rb | 9 - .../gems/tins-1.25.0/lib/tins/responding.rb | 19 - .../gems/tins-1.25.0/lib/tins/secure_write.rb | 27 - .../tins-1.25.0/lib/tins/sexy_singleton.rb | 39 -- .../lib/tins/string_byte_order_mark.rb | 20 - .../tins-1.25.0/lib/tins/string_camelize.rb | 16 - .../tins-1.25.0/lib/tins/string_underscore.rb | 15 - .../tins-1.25.0/lib/tins/string_version.rb | 104 --- .../gems/tins-1.25.0/lib/tins/subhash.rb | 42 -- .../gems/tins-1.25.0/lib/tins/temp_io.rb | 26 - .../gems/tins-1.25.0/lib/tins/temp_io_enum.rb | 26 - .../gems/tins-1.25.0/lib/tins/terminal.rb | 42 -- .../gems/tins-1.25.0/lib/tins/thread_local.rb | 57 -- .../gems/tins-1.25.0/lib/tins/time_dummy.rb | 57 -- .../2.6.0/gems/tins-1.25.0/lib/tins/to.rb | 8 - .../gems/tins-1.25.0/lib/tins/to_proc.rb | 12 - .../2.6.0/gems/tins-1.25.0/lib/tins/token.rb | 36 - .../gems/tins-1.25.0/lib/tins/uniq_by.rb | 10 - .../2.6.0/gems/tins-1.25.0/lib/tins/unit.rb | 179 ----- .../gems/tins-1.25.0/lib/tins/version.rb | 8 - .../2.6.0/gems/tins-1.25.0/lib/tins/write.rb | 19 - .../2.6.0/gems/tins-1.25.0/lib/tins/xt.rb | 45 -- .../gems/tins-1.25.0/lib/tins/xt/annotate.rb | 5 - .../tins-1.25.0/lib/tins/xt/ask_and_send.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/attempt.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/blank.rb | 67 -- .../tins-1.25.0/lib/tins/xt/case_predicate.rb | 8 - .../gems/tins-1.25.0/lib/tins/xt/complete.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/concern.rb | 20 - .../gems/tins-1.25.0/lib/tins/xt/count_by.rb | 11 - .../tins-1.25.0/lib/tins/xt/date_dummy.rb | 7 - .../lib/tins/xt/date_time_dummy.rb | 7 - .../tins-1.25.0/lib/tins/xt/deep_const_get.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/deep_dup.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/dslkit.rb | 22 - .../gems/tins-1.25.0/lib/tins/xt/expose.rb | 5 - .../tins/xt/extract_last_argument_options.rb | 7 - .../tins-1.25.0/lib/tins/xt/file_binary.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/full.rb | 39 -- .../tins/xt/hash_symbolize_keys_recursive.rb | 7 - .../tins-1.25.0/lib/tins/xt/hash_union.rb | 11 - .../tins-1.25.0/lib/tins/xt/if_predicate.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/implement.rb | 5 - .../2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb | 23 - .../lib/tins/xt/method_description.rb | 23 - .../gems/tins-1.25.0/lib/tins/xt/named.rb | 23 - .../gems/tins-1.25.0/lib/tins/xt/null.rb | 9 - .../2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb | 7 - .../lib/tins/xt/partial_application.rb | 11 - .../tins-1.25.0/lib/tins/xt/proc_compose.rb | 7 - .../tins-1.25.0/lib/tins/xt/proc_prelude.rb | 7 - .../tins-1.25.0/lib/tins/xt/range_plus.rb | 12 - .../tins-1.25.0/lib/tins/xt/require_maybe.rb | 7 - .../tins-1.25.0/lib/tins/xt/responding.rb | 7 - .../tins-1.25.0/lib/tins/xt/secure_write.rb | 11 - .../tins-1.25.0/lib/tins/xt/sexy_singleton.rb | 3 - .../gems/tins-1.25.0/lib/tins/xt/string.rb | 6 - .../lib/tins/xt/string_byte_order_mark.rb | 7 - .../lib/tins/xt/string_camelize.rb | 6 - .../lib/tins/xt/string_underscore.rb | 6 - .../tins-1.25.0/lib/tins/xt/string_version.rb | 7 - .../gems/tins-1.25.0/lib/tins/xt/subhash.rb | 11 - .../gems/tins-1.25.0/lib/tins/xt/temp_io.rb | 5 - .../tins-1.25.0/lib/tins/xt/time_dummy.rb | 7 - .../tins-1.25.0/lib/tins/xt/time_freezer.rb | 15 - .../2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb | 5 - .../gems/tins-1.25.0/lib/tins/xt/uniq_by.rb | 15 - .../gems/tins-1.25.0/lib/tins/xt/write.rb | 11 - completions/internal_commands_list.txt | 1 + docs/Manpage.md | 5 + manpages/brew.1 | 3 + 136 files changed, 9 insertions(+), 5805 deletions(-) delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/.keep delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb deleted file mode 100644 index b6d672e89d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls.rb +++ /dev/null @@ -1,101 +0,0 @@ -require "coveralls/version" -require "coveralls/configuration" -require "coveralls/api" -require "coveralls/output" -require "coveralls/simplecov" - -module Coveralls - extend self - - class NilFormatter - def format(result) - end - end - - attr_accessor :testing, :noisy, :run_locally - - def wear!(simplecov_setting=nil, &block) - setup! - start! simplecov_setting, &block - end - - def wear_merged!(simplecov_setting=nil, &block) - require 'simplecov' - @@adapter = :simplecov - ::SimpleCov.formatter = NilFormatter - start! simplecov_setting, &block - end - - def push! - require 'simplecov' - result = ::SimpleCov::ResultMerger.merged_result - Coveralls::SimpleCov::Formatter.new.format result - end - - def setup! - # Try to load up SimpleCov. - @@adapter = nil - if defined?(::SimpleCov) - @@adapter = :simplecov - else - begin - require 'simplecov' - @@adapter = :simplecov if defined?(::SimpleCov) - rescue - end - end - - # Load the appropriate adapter. - if @@adapter == :simplecov - ::SimpleCov.formatter = Coveralls::SimpleCov::Formatter - Coveralls::Output.puts("[Coveralls] Set up the SimpleCov formatter.", :color => "green") - else - Coveralls::Output.puts("[Coveralls] Couldn't find an appropriate adapter.", :color => "red") - end - - end - - def start!(simplecov_setting = 'test_frameworks', &block) - if @@adapter == :simplecov - ::SimpleCov.add_filter 'vendor' - - if simplecov_setting - Coveralls::Output.puts("[Coveralls] Using SimpleCov's '#{simplecov_setting}' settings.", :color => "green") - if block_given? - ::SimpleCov.start(simplecov_setting) { instance_eval(&block)} - else - ::SimpleCov.start(simplecov_setting) - end - elsif block - Coveralls::Output.puts("[Coveralls] Using SimpleCov settings defined in block.", :color => "green") - ::SimpleCov.start { instance_eval(&block) } - else - Coveralls::Output.puts("[Coveralls] Using SimpleCov's default settings.", :color => "green") - ::SimpleCov.start - end - end - end - - def should_run? - # Fail early if we're not on a CI - unless will_run? - Coveralls::Output.puts("[Coveralls] Outside the CI environment, not sending data.", :color => "yellow") - return false - end - - if ENV["COVERALLS_RUN_LOCALLY"] || (defined?(@run_locally) && @run_locally) - Coveralls::Output.puts("[Coveralls] Creating a new job on Coveralls from local coverage results.", :color => "cyan") - end - - true - end - - def will_run? - ENV["CI"] || ENV["JENKINS_URL"] || ENV['TDDIUM'] || - ENV["COVERALLS_RUN_LOCALLY"] || (defined?(@testing) && @testing) - end - - def noisy? - ENV["COVERALLS_NOISY"] || (defined?(@noisy) && @noisy) - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb deleted file mode 100644 index 1b268db347..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/api.rb +++ /dev/null @@ -1,128 +0,0 @@ -require 'json' -require 'net/https' -require 'tempfile' - -module Coveralls - class API - if ENV['COVERALLS_ENDPOINT'] - API_HOST = ENV['COVERALLS_ENDPOINT'] - API_DOMAIN = ENV['COVERALLS_ENDPOINT'] - else - API_HOST = ENV['COVERALLS_DEVELOPMENT'] ? "localhost:3000" : "coveralls.io" - API_PROTOCOL = ENV['COVERALLS_DEVELOPMENT'] ? "http" : "https" - API_DOMAIN = "#{API_PROTOCOL}://#{API_HOST}" - end - - API_BASE = "#{API_DOMAIN}/api/v1" - - def self.post_json(endpoint, hash) - disable_net_blockers! - - uri = endpoint_to_uri(endpoint) - - Coveralls::Output.puts("#{ JSON.pretty_generate(hash) }", :color => "green") if ENV['COVERALLS_DEBUG'] - Coveralls::Output.puts("[Coveralls] Submitting to #{API_BASE}", :color => "cyan") - - client = build_client(uri) - request = build_request(uri.path, hash) - - response = client.request(request) - - response_hash = JSON.load(response.body.to_str) - - if response_hash['message'] - Coveralls::Output.puts("[Coveralls] #{ response_hash['message'] }", :color => "cyan") - end - - if response_hash['url'] - Coveralls::Output.puts("[Coveralls] #{ Coveralls::Output.format(response_hash['url'], :color => "underline") }", :color => "cyan") - end - - case response - when Net::HTTPServiceUnavailable - Coveralls::Output.puts("[Coveralls] API timeout occured, but data should still be processed", :color => "red") - when Net::HTTPInternalServerError - Coveralls::Output.puts("[Coveralls] API internal error occured, we're on it!", :color => "red") - end - end - - private - - def self.disable_net_blockers! - begin - require 'webmock' - - allow = WebMock::Config.instance.allow || [] - WebMock::Config.instance.allow = [*allow].push API_HOST - rescue LoadError - end - - begin - require 'vcr' - - VCR.send(VCR.version.major < 2 ? :config : :configure) do |c| - c.ignore_hosts API_HOST - end - rescue LoadError - end - end - - def self.endpoint_to_uri(endpoint) - URI.parse("#{API_BASE}/#{endpoint}") - end - - def self.build_client(uri) - client = Net::HTTP.new(uri.host, uri.port) - client.use_ssl = true if uri.port == 443 - client.verify_mode = OpenSSL::SSL::VERIFY_NONE - - unless client.respond_to?(:ssl_version=) - Net::HTTP.ssl_context_accessor("ssl_version") - end - - client.ssl_version = 'TLSv1' - - client - end - - def self.build_request(path, hash) - request = Net::HTTP::Post.new(path) - boundary = rand(1_000_000).to_s - - request.body = build_request_body(hash, boundary) - request.content_type = "multipart/form-data, boundary=#{boundary}" - - request - end - - def self.build_request_body(hash, boundary) - hash = apified_hash(hash) - file = hash_to_file(hash) - - "--#{boundary}\r\n" \ - "Content-Disposition: form-data; name=\"json_file\"; filename=\"#{File.basename(file.path)}\"\r\n" \ - "Content-Type: text/plain\r\n\r\n" + - File.read(file.path) + - "\r\n--#{boundary}--\r\n" - end - - def self.hash_to_file(hash) - file = nil - Tempfile.open(['coveralls-upload', 'json']) do |f| - f.write(JSON.dump hash) - file = f - end - File.new(file.path, 'rb') - end - - def self.apified_hash hash - config = Coveralls::Configuration.configuration - if ENV['COVERALLS_DEBUG'] || Coveralls.testing - Coveralls::Output.puts "[Coveralls] Submitting with config:", :color => "yellow" - output = JSON.pretty_generate(config).gsub(/"repo_token": ?"(.*?)"/,'"repo_token": "[secure]"') - Coveralls::Output.puts output, :color => "yellow" - end - hash.merge(config) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb deleted file mode 100644 index 2a9f262cff..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/command.rb +++ /dev/null @@ -1,69 +0,0 @@ -require "thor" - -module Coveralls - class CommandLine < Thor - - desc "push", "Runs your test suite and pushes the coverage results to Coveralls." - def push - return unless ensure_can_run_locally! - ENV["COVERALLS_RUN_LOCALLY"] = "true" - cmds = "bundle exec rake" - if File.exist?('.travis.yml') - cmds = YAML.load_file('.travis.yml')["script"] || cmds rescue cmds - end - cmds.each { |cmd| system cmd } - ENV["COVERALLS_RUN_LOCALLY"] = nil - end - - desc "report", "Runs your test suite locally and displays coverage statistics." - def report - ENV["COVERALLS_NOISY"] = "true" - exec "bundle exec rake" - ENV["COVERALLS_NOISY"] = nil - end - - desc "open", "View this repository on Coveralls." - def open - open_token_based_url "https://coveralls.io/repos/%@" - end - - desc "service", "View this repository on your CI service's website." - def service - open_token_based_url "https://coveralls.io/repos/%@/service" - end - - desc "last", "View the last build for this repository on Coveralls." - def last - open_token_based_url "https://coveralls.io/repos/%@/last_build" - end - - desc "version", "See version" - def version - Coveralls::Output.puts Coveralls::VERSION - end - - private - - def open_token_based_url url - config = Coveralls::Configuration.configuration - if config[:repo_token] - url = url.gsub("%@", config[:repo_token]) - `open #{url}` - else - Coveralls::Output.puts "No repo_token configured." - end - end - - def ensure_can_run_locally! - config = Coveralls::Configuration.configuration - if config[:repo_token].nil? - Coveralls::Output.puts "Coveralls cannot run locally because no repo_secret_token is set in .coveralls.yml", :color => "red" - Coveralls::Output.puts "Please try again when you get your act together.", :color => "red" - - return false - end - true - end - - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb deleted file mode 100644 index 605094f4b3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/configuration.rb +++ /dev/null @@ -1,233 +0,0 @@ -require 'yaml' -require 'securerandom' - -module Coveralls - module Configuration - - def self.configuration - config = { - :environment => self.relevant_env, - :git => git - } - yml = self.yaml_config - if yml - config[:configuration] = yml - config[:repo_token] = yml['repo_token'] || yml['repo_secret_token'] - end - if ENV['COVERALLS_REPO_TOKEN'] - config[:repo_token] = ENV['COVERALLS_REPO_TOKEN'] - end - if ENV['COVERALLS_PARALLEL'] && ENV['COVERALLS_PARALLEL'] != "false" - config[:parallel] = true - end - if ENV['COVERALLS_FLAG_NAME'] - config[:flag_name] = ENV['COVERALLS_FLAG_NAME'] - end - if ENV['TRAVIS'] - set_service_params_for_travis(config, yml ? yml['service_name'] : nil) - elsif ENV['CIRCLECI'] - set_service_params_for_circleci(config) - elsif ENV['SEMAPHORE'] - set_service_params_for_semaphore(config) - elsif ENV['JENKINS_URL'] || ENV['JENKINS_HOME'] - set_service_params_for_jenkins(config) - elsif ENV['APPVEYOR'] - set_service_params_for_appveyor(config) - elsif ENV['TDDIUM'] - set_service_params_for_tddium(config) - elsif ENV['GITLAB_CI'] - set_service_params_for_gitlab(config) - elsif ENV['COVERALLS_RUN_LOCALLY'] || Coveralls.testing - set_service_params_for_coveralls_local(config) - end - - # standardized env vars - set_standard_service_params_for_generic_ci(config) - - if service_name = ENV['COVERALLS_SERVICE_NAME'] - config[:service_name] = service_name - end - - config - end - - def self.set_service_params_for_travis(config, service_name) - config[:service_job_id] = ENV['TRAVIS_JOB_ID'] - config[:service_pull_request] = ENV['TRAVIS_PULL_REQUEST'] unless ENV['TRAVIS_PULL_REQUEST'] == 'false' - config[:service_name] = service_name || 'travis-ci' - config[:service_branch] = ENV['TRAVIS_BRANCH'] - end - - def self.set_service_params_for_circleci(config) - config[:service_name] = 'circleci' - config[:service_number] = ENV['CIRCLE_BUILD_NUM'] - config[:service_pull_request] = (ENV['CI_PULL_REQUEST'] || "")[/(\d+)$/,1] - config[:parallel] = ENV['CIRCLE_NODE_TOTAL'].to_i > 1 - config[:service_job_number] = ENV['CIRCLE_NODE_INDEX'] - end - - def self.set_service_params_for_semaphore(config) - config[:service_name] = 'semaphore' - config[:service_number] = ENV['SEMAPHORE_BUILD_NUMBER'] - config[:service_pull_request] = ENV['PULL_REQUEST_NUMBER'] - end - - def self.set_service_params_for_jenkins(config) - config[:service_name] = 'jenkins' - config[:service_number] = ENV['BUILD_NUMBER'] - config[:service_branch] = ENV['BRANCH_NAME'] - config[:service_pull_request] = ENV['ghprbPullId'] - end - - def self.set_service_params_for_appveyor(config) - config[:service_name] = 'appveyor' - config[:service_number] = ENV['APPVEYOR_BUILD_VERSION'] - config[:service_branch] = ENV['APPVEYOR_REPO_BRANCH'] - config[:commit_sha] = ENV['APPVEYOR_REPO_COMMIT'] - repo_name = ENV['APPVEYOR_REPO_NAME'] - config[:service_build_url] = 'https://ci.appveyor.com/project/%s/build/%s' % [repo_name, config[:service_number]] - end - - def self.set_service_params_for_tddium(config) - config[:service_name] = 'tddium' - config[:service_number] = ENV['TDDIUM_SESSION_ID'] - config[:service_job_number] = ENV['TDDIUM_TID'] - config[:service_pull_request] = ENV['TDDIUM_PR_ID'] - config[:service_branch] = ENV['TDDIUM_CURRENT_BRANCH'] - config[:service_build_url] = "https://ci.solanolabs.com/reports/#{ENV['TDDIUM_SESSION_ID']}" - end - - def self.set_service_params_for_gitlab(config) - config[:service_name] = 'gitlab-ci' - config[:service_job_number] = ENV['CI_BUILD_NAME'] - config[:service_job_id] = ENV['CI_BUILD_ID'] - config[:service_branch] = ENV['CI_BUILD_REF_NAME'] - config[:commit_sha] = ENV['CI_BUILD_REF'] - end - - def self.set_service_params_for_coveralls_local(config) - config[:service_job_id] = nil - config[:service_name] = 'coveralls-ruby' - config[:service_event_type] = 'manual' - end - - def self.set_standard_service_params_for_generic_ci(config) - config[:service_name] ||= ENV['CI_NAME'] - config[:service_number] ||= ENV['CI_BUILD_NUMBER'] - config[:service_job_id] ||= ENV['CI_JOB_ID'] - config[:service_build_url] ||= ENV['CI_BUILD_URL'] - config[:service_branch] ||= ENV['CI_BRANCH'] - config[:service_pull_request] ||= (ENV['CI_PULL_REQUEST'] || "")[/(\d+)$/,1] - end - - def self.yaml_config - if self.configuration_path && File.exist?(self.configuration_path) - YAML::load_file(self.configuration_path) - end - end - - def self.configuration_path - File.expand_path(File.join(self.root, ".coveralls.yml")) if self.root - end - - def self.root - pwd - end - - def self.pwd - Dir.pwd - end - - def self.simplecov_root - if defined?(::SimpleCov) - ::SimpleCov.root - end - end - - def self.rails_root - Rails.root.to_s - rescue - nil - end - - def self.git - hash = {} - - Dir.chdir(root) do - - hash[:head] = { - :id => ENV.fetch("GIT_ID", `git log -1 --pretty=format:'%H'`), - :author_name => ENV.fetch("GIT_AUTHOR_NAME", `git log -1 --pretty=format:'%aN'`), - :author_email => ENV.fetch("GIT_AUTHOR_EMAIL", `git log -1 --pretty=format:'%ae'`), - :committer_name => ENV.fetch("GIT_COMMITTER_NAME", `git log -1 --pretty=format:'%cN'`), - :committer_email => ENV.fetch("GIT_COMMITTER_EMAIL", `git log -1 --pretty=format:'%ce'`), - :message => ENV.fetch("GIT_MESSAGE", `git log -1 --pretty=format:'%s'`) - } - - # Branch - hash[:branch] = ENV.fetch("GIT_BRANCH", `git rev-parse --abbrev-ref HEAD`) - - # Remotes - remotes = nil - begin - remotes = `git remote -v`.split(/\n/).map do |remote| - splits = remote.split(" ").compact - {:name => splits[0], :url => splits[1]} - end.uniq - rescue - end - hash[:remotes] = remotes - - end - - hash - - rescue Exception => e - Coveralls::Output.puts "Coveralls git error:", :color => "red" - Coveralls::Output.puts e.to_s, :color => "red" - nil - end - - def self.relevant_env - hash = { - :pwd => self.pwd, - :rails_root => self.rails_root, - :simplecov_root => simplecov_root, - :gem_version => VERSION - } - - hash.merge! begin - if ENV['TRAVIS'] - { - :travis_job_id => ENV['TRAVIS_JOB_ID'], - :travis_pull_request => ENV['TRAVIS_PULL_REQUEST'], - :branch => ENV['TRAVIS_BRANCH'] - } - elsif ENV['CIRCLECI'] - { - :circleci_build_num => ENV['CIRCLE_BUILD_NUM'], - :branch => ENV['CIRCLE_BRANCH'], - :commit_sha => ENV['CIRCLE_SHA1'] - } - elsif ENV['JENKINS_URL'] - { - :jenkins_build_num => ENV['BUILD_NUMBER'], - :jenkins_build_url => ENV['BUILD_URL'], - :branch => ENV['GIT_BRANCH'], - :commit_sha => ENV['GIT_COMMIT'] - } - elsif ENV['SEMAPHORE'] - { - :branch => ENV['BRANCH_NAME'], - :commit_sha => ENV['REVISION'] - } - else - {} - end - end - - hash - end - - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb deleted file mode 100644 index 1706f28b74..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/output.rb +++ /dev/null @@ -1,114 +0,0 @@ -module Coveralls - # - # Public: Methods for formatting strings with Term::ANSIColor. - # Does not utilize monkey-patching and should play nicely when - # included with other libraries. - # - # All methods are module methods and should be called on - # the Coveralls::Output module. - # - # Examples - # - # Coveralls::Output.format("Hello World", :color => "cyan") - # # => "\e[36mHello World\e[0m" - # - # Coveralls::Output.print("Hello World") - # # Hello World => nil - # - # Coveralls::Output.puts("Hello World", :color => "underline") - # # Hello World - # # => nil - # - # To silence output completely: - # - # Coveralls::Output.silent = true - # - # or set this environment variable: - # - # COVERALLS_SILENT - # - # To disable color completely: - # - # Coveralls::Output.no_color = true - - module Output - attr_accessor :silent, :no_color - attr_writer :output - extend self - - def output - (defined?(@output) && @output) || $stdout - end - - def no_color? - (defined?(@no_color)) && @no_color - end - - # Public: Formats the given string with the specified color - # through Term::ANSIColor - # - # string - the text to be formatted - # options - The hash of options used for formatting the text: - # :color - The color to be passed as a method to - # Term::ANSIColor - # - # Examples - # - # Coveralls::Output.format("Hello World!", :color => "cyan") - # # => "\e[36mHello World\e[0m" - # - # Returns the formatted string. - def format(string, options = {}) - unless no_color? - require 'term/ansicolor' - if options[:color] - options[:color].split(/\s/).reverse_each do |color| - if Term::ANSIColor.respond_to?(color.to_sym) - string = Term::ANSIColor.send(color.to_sym, string) - end - end - end - end - string - end - - # Public: Passes .format to Kernel#puts - # - # string - the text to be formatted - # options - The hash of options used for formatting the text: - # :color - The color to be passed as a method to - # Term::ANSIColor - # - # - # Example - # - # Coveralls::Output.puts("Hello World", :color => "cyan") - # - # Returns nil. - def puts(string, options = {}) - return if silent? - (options[:output] || output).puts self.format(string, options) - end - - # Public: Passes .format to Kernel#print - # - # string - the text to be formatted - # options - The hash of options used for formatting the text: - # :color - The color to be passed as a method to - # Term::ANSIColor - # - # Example - # - # Coveralls::Output.print("Hello World!", :color => "underline") - # - # Returns nil. - def print(string, options = {}) - return if silent? - (options[:output] || output).print self.format(string, options) - end - - def silent? - ENV["COVERALLS_SILENT"] || (defined?(@silent) && @silent) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb deleted file mode 100644 index f5f3bfa36e..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/rake/task.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rake' -require 'rake/tasklib' - -module Coveralls - class RakeTask < ::Rake::TaskLib - include ::Rake::DSL if defined?(::Rake::DSL) - - def initialize(*args, &task_block) - namespace :coveralls do - desc "Push latest coverage results to Coveralls.io" - task :push do - require 'coveralls' - Coveralls.push! - end - end - end # initialize - - end # class -end # module diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb deleted file mode 100644 index 9364b18720..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/simplecov.rb +++ /dev/null @@ -1,101 +0,0 @@ -module Coveralls - module SimpleCov - class Formatter - - def display_result(result) - # Log which files would be submitted. - if result.files.length > 0 - Coveralls::Output.puts "[Coveralls] Some handy coverage stats:" - else - Coveralls::Output.puts "[Coveralls] There are no covered files.", :color => "yellow" - end - result.files.each do |f| - Coveralls::Output.print " * " - Coveralls::Output.print short_filename(f.filename).to_s, :color => "cyan" - Coveralls::Output.print " => ", :color => "white" - cov = "#{f.covered_percent.round}%" - if f.covered_percent > 90 - Coveralls::Output.print cov, :color => "green" - elsif f.covered_percent > 80 - Coveralls::Output.print cov, :color => "yellow" - else - Coveralls::Output.print cov, :color => "red" - end - Coveralls::Output.puts "" - end - true - end - - def get_source_files(result) - # Gather the source files. - source_files = [] - result.files.each do |file| - properties = {} - - # Get Source - properties[:source] = File.open(file.filename, "rb:utf-8").read - - # Get the root-relative filename - properties[:name] = short_filename(file.filename) - - # Get the coverage - properties[:coverage] = file.coverage.dup - - # Skip nocov lines - file.lines.each_with_index do |line, i| - properties[:coverage][i] = nil if line.skipped? - end - - source_files << properties - end - source_files - end - - def format(result) - - unless Coveralls.should_run? - if Coveralls.noisy? - display_result result - end - return - end - - # Post to Coveralls. - API.post_json "jobs", - :source_files => get_source_files(result), - :test_framework => result.command_name.downcase, - :run_at => result.created_at - - Coveralls::Output.puts output_message result - - true - - rescue Exception => e - display_error e - end - - def display_error(e) - Coveralls::Output.puts "Coveralls encountered an exception:", :color => "red" - Coveralls::Output.puts e.class.to_s, :color => "red" - Coveralls::Output.puts e.message, :color => "red" - e.backtrace.each do |line| - Coveralls::Output.puts line, :color => "red" - end if e.backtrace - if e.respond_to?(:response) && e.response - Coveralls::Output.puts e.response.to_s, :color => "red" - end - false - end - - def output_message(result) - "Coverage is at #{result.covered_percent.round(2) rescue result.covered_percent.round}%.\nCoverage report sent to Coveralls." - end - - def short_filename(filename) - filename = filename.gsub(::SimpleCov.root, '.').gsub(/^\.\//, '') if ::SimpleCov.root - filename - end - - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb deleted file mode 100644 index 120a9a06e3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/coveralls-0.8.23/lib/coveralls/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -module Coveralls - VERSION = "0.8.23" -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb deleted file mode 100644 index 7bd5dc4b49..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor.rb +++ /dev/null @@ -1,127 +0,0 @@ -require 'tins/xt/full' - -module Term - - # The ANSIColor module can be used for namespacing and mixed into your own - # classes. - module ANSIColor - require 'term/ansicolor/version' - require 'term/ansicolor/attribute' - require 'term/ansicolor/rgb_triple' - require 'term/ansicolor/hsl_triple' - require 'term/ansicolor/ppm_reader' - require 'term/ansicolor/attribute/text' - require 'term/ansicolor/attribute/color8' - require 'term/ansicolor/attribute/intense_color8' - require 'term/ansicolor/attribute/color256' - require 'term/ansicolor/movement' - - include Term::ANSIColor::Movement - - # :stopdoc: - ATTRIBUTE_NAMES = Attribute.named_attributes.map(&:name) - # :startdoc: - - # Returns true if Term::ANSIColor supports the +feature+. - # - # The feature :clear, that is mixing the clear color attribute into String, - # is only supported on ruby implementations, that do *not* already - # implement the String#clear method. It's better to use the reset color - # attribute instead. - def support?(feature) - case feature - when :clear - !String.instance_methods(false).map(&:to_sym).include?(:clear) - end - end - # Returns true, if the coloring function of this module - # is switched on, false otherwise. - def self.coloring? - @coloring - end - - # Turns the coloring on or off globally, so you can easily do - # this for example: - # Term::ANSIColor::coloring = STDOUT.isatty - def self.coloring=(val) - @coloring = val - end - self.coloring = true - - def self.create_color_method(color_name, color_value) - module_eval <<-EOT - def #{color_name}(string = nil, &block) - color(:#{color_name}, string, &block) - end - EOT - self - end - - for attribute in Attribute.named_attributes - create_color_method(attribute.name, attribute.code) - end - - # Regular expression that is used to scan for ANSI-Attributes while - # uncoloring strings. - COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;5;\d{1,3})?m/ - - # Returns an uncolored version of the string, that is all - # ANSI-Attributes are stripped from the string. - def uncolor(string = nil) # :yields: - if block_given? - yield.to_str.gsub(COLORED_REGEXP, '') - elsif string.respond_to?(:to_str) - string.to_str.gsub(COLORED_REGEXP, '') - elsif respond_to?(:to_str) - to_str.gsub(COLORED_REGEXP, '') - else - '' - end.extend(Term::ANSIColor) - end - - alias uncolored uncolor - - # Return +string+ or the result string of the given +block+ colored with - # color +name+. If string isn't a string only the escape sequence to switch - # on the color +name+ is returned. - def color(name, string = nil, &block) - attribute = Attribute[name] or raise ArgumentError, "unknown attribute #{name.inspect}" - result = '' - result << "\e[#{attribute.code}m" if Term::ANSIColor.coloring? - if block_given? - result << yield.to_s - elsif string.respond_to?(:to_str) - result << string.to_str - elsif respond_to?(:to_str) - result << to_str - else - return result #only switch on - end - result << "\e[0m" if Term::ANSIColor.coloring? - result.extend(Term::ANSIColor) - end - - def on_color(name, string = nil, &block) - attribute = Attribute[name] or raise ArgumentError, "unknown attribute #{name.inspect}" - color("on_#{attribute.name}", string, &block) - end - - class << self - # Returns an array of all Term::ANSIColor attributes as symbols. - def term_ansicolor_attributes - ::Term::ANSIColor::ATTRIBUTE_NAMES - end - - alias attributes term_ansicolor_attributes - end - - # Returns an array of all Term::ANSIColor attributes as symbols. - def term_ansicolor_attributes - ::Term::ANSIColor.term_ansicolor_attributes - end - - alias attributes term_ansicolor_attributes - - extend self - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/.keep b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb deleted file mode 100644 index 74af3eb877..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute.rb +++ /dev/null @@ -1,142 +0,0 @@ -module Term - module ANSIColor - class Attribute - @__store__ = {} - - if RUBY_VERSION < '1.9' - @__order__ = [] - - def self.set(name, code, options = {}) - name = name.to_sym - result = @__store__[name] = new(name, code, options) - @__order__ << name - @rgb_colors = nil - result - end - - def self.attributes(&block) - @__order__.map { |name| @__store__[name] } - end - else - def self.set(name, code, options = {}) - name = name.to_sym - result = @__store__[name] = new(name, code, options) - @rgb_colors = nil - result - end - - def self.attributes(&block) - @__store__.each_value(&block) - end - end - - def self.[](name) - case - when self === name then name - when Array === name then nearest_rgb_color name - when name.respond_to?(:to_rgb_triple) then nearest_rgb_color(name.to_rgb_triple.to_a) - when name.to_s =~ /\A(on_)?(\d+)\z/ then get "#$1color#$2" - when name.to_s =~ /\A#([0-9a-f]{3}){1,2}\z/i then nearest_rgb_color name - when name.to_s =~ /\Aon_#([0-9a-f]{3}){1,2}\z/i then nearest_rgb_on_color name - else get name - end - end - - def self.get(name) - @__store__[name.to_sym] - end - - def self.rgb_colors(options = {}, &block) - colors = @rgb_colors ||= attributes.select(&:rgb_color?) - if options.key?(:gray) && !options[:gray] - colors = colors.reject(&:gray?) - end - colors.each(&block) - end - - def self.named_attributes(&block) - @named_attributes ||= attributes.reject(&:rgb_color?).each(&block) - end - - def self.nearest_rgb_color(color, options = {}) - rgb = RGBTriple[color] - colors = rgb_colors(options) - colors.reject(&:background?).min_by { |c| c.distance_to(rgb, options) } - end - - def self.nearest_rgb_on_color(color, options = {}) - rgb = RGBTriple[color] - colors = rgb_colors(options) - colors.select(&:background?).min_by { |c| c.distance_to(rgb, options) } - end - - def initialize(name, code, options = {}) - @name = name.to_sym - @code = code.to_s - if html = options[:html] - @rgb = RGBTriple.from_html(html) - elsif !options.empty? - @rgb = RGBTriple.from_hash(options) - else - @rgb = nil # prevent instance variable not initialized warnings - end - end - - attr_reader :name - - def code - if rgb_color? - background? ? "48;5;#{@code}" : "38;5;#{@code}" - else - @code - end - end - - def apply(string = nil, &block) - ::Term::ANSIColor.color(self, string, &block) - end - - def background? - @name.to_s.start_with?('on_') - end - - attr_reader :rgb - - def rgb_color? - !!@rgb - end - - def gray? - rgb_color? && to_rgb_triple.gray? - end - - def to_rgb_triple - @rgb - end - - def distance_to(other, options = {}) - if our_rgb = to_rgb_triple and - other.respond_to?(:to_rgb_triple) and - other_rgb = other.to_rgb_triple - then - our_rgb.distance_to(other_rgb, options) - else - 1 / 0.0 - end - end - - def gradient_to(other, options = {}) - if our_rgb = to_rgb_triple and - other.respond_to?(:to_rgb_triple) and - other_rgb = other.to_rgb_triple - then - our_rgb.gradient_to(other_rgb, options).map do |rgb_triple| - self.class.nearest_rgb_color(rgb_triple, options) - end - else - [] - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb deleted file mode 100644 index eb7c4fbff8..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color256.rb +++ /dev/null @@ -1,69 +0,0 @@ -module Term - module ANSIColor - class Attribute - class Color256 - Attribute.set :color0, 0, :html => '#000000' - Attribute.set :color1, 1, :html => '#800000' - Attribute.set :color2, 2, :html => '#808000' - Attribute.set :color3, 3, :html => '#808000' - Attribute.set :color4, 4, :html => '#000080' - Attribute.set :color5, 5, :html => '#800080' - Attribute.set :color6, 6, :html => '#008080' - Attribute.set :color7, 7, :html => '#c0c0c0' - - Attribute.set :color8, 8, :html => '#808080' - Attribute.set :color9, 9, :html => '#ff0000' - Attribute.set :color10, 10, :html => '#00ff00' - Attribute.set :color11, 11, :html => '#ffff00' - Attribute.set :color12, 12, :html => '#0000ff' - Attribute.set :color13, 13, :html => '#ff00ff' - Attribute.set :color14, 14, :html => '#00ffff' - Attribute.set :color15, 15, :html => '#ffffff' - - steps = [ 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff ] - - for i in 16..231 - red, green, blue = (i - 16).to_s(6).rjust(3, '0').each_char.map { |c| steps[c.to_i] } - Attribute.set "color#{i}", i, :red => red, :green => green, :blue => blue - end - - grey = 8 - for i in 232..255 - Attribute.set "color#{i}", i, :red => grey, :green => grey, :blue => grey - grey += 10 - end - - Attribute.set :on_color0, 0, :html => '#000000' - Attribute.set :on_color1, 1, :html => '#800000' - Attribute.set :on_color2, 2, :html => '#808000' - Attribute.set :on_color3, 3, :html => '#808000' - Attribute.set :on_color4, 4, :html => '#000080' - Attribute.set :on_color5, 5, :html => '#800080' - Attribute.set :on_color6, 6, :html => '#008080' - Attribute.set :on_color7, 7, :html => '#c0c0c0' - - Attribute.set :on_color8, 8, :html => '#808080' - Attribute.set :on_color9, 9, :html => '#ff0000' - Attribute.set :on_color10, 10, :html => '#00ff00' - Attribute.set :on_color11, 11, :html => '#ffff00' - Attribute.set :on_color12, 12, :html => '#0000ff' - Attribute.set :on_color13, 13, :html => '#ff00ff' - Attribute.set :on_color14, 14, :html => '#00ffff' - Attribute.set :on_color15, 15, :html => '#ffffff' - - steps = [ 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff ] - - for i in 16..231 - red, green, blue = (i - 16).to_s(6).rjust(3, '0').each_char.map { |c| steps[c.to_i] } - Attribute.set "on_color#{i}", i, :red => red, :green => green, :blue => blue - end - - grey = 8 - for i in 232..255 - Attribute.set "on_color#{i}", i, :red => grey, :green => grey, :blue => grey - grey += 10 - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb deleted file mode 100644 index 4a77fed631..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/color8.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Term - module ANSIColor - class Attribute - class Color8 - Attribute.set :black, 30 - Attribute.set :red, 31 - Attribute.set :green, 32 - Attribute.set :yellow, 33 - Attribute.set :blue, 34 - Attribute.set :magenta, 35 - Attribute.set :cyan, 36 - Attribute.set :white, 37 - - Attribute.set :on_black, 40 - Attribute.set :on_red, 41 - Attribute.set :on_green, 42 - Attribute.set :on_yellow, 43 - Attribute.set :on_blue, 44 - Attribute.set :on_magenta, 45 - Attribute.set :on_cyan, 46 - Attribute.set :on_white, 47 - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb deleted file mode 100644 index 6377fbaaca..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/intense_color8.rb +++ /dev/null @@ -1,43 +0,0 @@ -module Term - module ANSIColor - class Attribute - class IntenseColor8 - # High intensity, aixterm (works in OS X) - Attribute.set :intense_black, 90 - Attribute.set :bright_black, 90 - Attribute.set :intense_red, 91 - Attribute.set :bright_red, 91 - Attribute.set :intense_green, 92 - Attribute.set :bright_green, 92 - Attribute.set :intense_yellow, 93 - Attribute.set :bright_yellow, 93 - Attribute.set :intense_blue, 94 - Attribute.set :bright_blue, 94 - Attribute.set :intense_magenta, 95 - Attribute.set :bright_magenta, 95 - Attribute.set :intense_cyan, 96 - Attribute.set :bright_cyan, 96 - Attribute.set :intense_white, 97 - Attribute.set :bright_white, 97 - - # High intensity background, aixterm (works in OS X) - Attribute.set :on_intense_black, 100 - Attribute.set :on_bright_black, 100 - Attribute.set :on_intense_red, 101 - Attribute.set :on_bright_red, 101 - Attribute.set :on_intense_green, 102 - Attribute.set :on_bright_green, 102 - Attribute.set :on_intense_yellow, 103 - Attribute.set :on_bright_yellow, 103 - Attribute.set :on_intense_blue, 104 - Attribute.set :on_bright_blue, 104 - Attribute.set :on_intense_magenta, 105 - Attribute.set :on_bright_magenta, 105 - Attribute.set :on_intense_cyan, 106 - Attribute.set :on_bright_cyan, 106 - Attribute.set :on_intense_white, 107 - Attribute.set :on_bright_white, 107 - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb deleted file mode 100644 index e41d92f2a8..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/attribute/text.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Term - module ANSIColor - class Attribute - class Text - Attribute.set :clear, 0 # String#clear already used in String - Attribute.set :reset, 0 # synonym for :clear - Attribute.set :bold, 1 - Attribute.set :dark, 2 - Attribute.set :faint, 2 - Attribute.set :italic, 3 # not widely implemented - Attribute.set :underline, 4 - Attribute.set :underscore, 4 # synonym for :underline - Attribute.set :blink, 5 - Attribute.set :rapid_blink, 6 # not widely implemented - Attribute.set :reverse, 7 # String#reverse already used in String - Attribute.set :negative, 7 # synonym for :reverse - Attribute.set :concealed, 8 - Attribute.set :conceal, 8 # synonym for :concealed - Attribute.set :strikethrough, 9 # not widely implemented - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb deleted file mode 100644 index 37e282d177..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/hsl_triple.rb +++ /dev/null @@ -1,169 +0,0 @@ -module Term - module ANSIColor - class HSLTriple - def self.from_rgb_triple(rgb) - ps = rgb.to_a.map { |x| x / 255.0 } - p_min = ps.min - p_max = ps.max - p_red, p_green, p_blue = ps - - diff = p_max - p_min - l = (p_max + p_min) / 2 - - if diff.zero? - h = s = 0.0 - else - if l < 0.5 - s = diff / (p_max + p_min) - else - s = diff / (2 - p_max - p_min) - end - - diff_r = ( ( ( p_max - p_red ) / 6 ) + ( diff / 2 ) ) / diff - diff_g = ( ( ( p_max - p_green ) / 6 ) + ( diff / 2 ) ) / diff - diff_b = ( ( ( p_max - p_blue ) / 6 ) + ( diff / 2 ) ) / diff - - h = case p_max - when p_red - diff_b - diff_g - when p_green - (1 / 3.0) + diff_r - diff_b - when p_blue - (2 / 3.0) + diff_g - diff_r - end - - h < 0 and h += 1 - h > 1 and h -= 1 - end - from_hash( - hue: 360 * h, - saturation: 100 * s, - lightness: 100 * l - ) - end - - def self.from_css(css) - case css - when /\A\s*hsl\(\s*([^,\s]+)\s*,\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*\)\z/ - new(Float($1), Float($2), Float($3)) - end - end - - def self.from_hash(options) - new( - options[:hue].to_f, - options[:saturation].to_f, - options[:lightness].to_f - ) - end - - def self.[](thing) - case - when thing.respond_to?(:to_hsl_triple) then thing.to_hsl_triple - when thing.respond_to?(:to_hash) then from_hash(thing.to_hash) - when thing.respond_to?(:to_str) - thing = thing.to_str - from_css(thing.to_str) || - Term::ANSIColor::RGBTriple.from_html(thing).full?(:to_hsl_triple) || - Term::ANSIColor::RGBTriple.from_css(thing).full?(:to_hsl_triple) - else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}" - end - end - - def initialize(hue, saturation, lightness) - @hue = Float(hue) % 360 - @saturation = [ [ Float(saturation), 0 ].max, 100 ].min - @lightness = [ [ Float(lightness), 0 ].max, 100 ].min - end - - attr_reader :hue - - attr_reader :saturation - - attr_reader :lightness - - def lighten(percentage) - self.class.new(@hue, @saturation, @lightness + percentage) - end - - def darken(percentage) - self.class.new(@hue, @saturation, @lightness - percentage) - end - - def saturate(percentage) - self.class.new(@hue, @saturation + percentage, @lightness) - end - - def desaturate(percentage) - self.class.new(@hue, @saturation - percentage, @lightness) - end - - def adjust_hue(degree) - self.class.new(@hue + degree, @saturation, @lightness) - end - - def grayscale - self.class.new(@hue, 0, @lightness) - end - - def complement - adjust_hue(180) - end - - def hue2rgb(x, y, h) - h < 0 and h += 1 - h > 1 and h -= 1 - (6 * h) < 1 and return x + (y - x) * 6 * h - (2 * h) < 1 and return y - (3 * h) < 2 and return x + (y - x) * ( (2 / 3.0) - h ) * 6 - x - end - private :hue2rgb - - def to_rgb_triple - h = @hue / 360.0 - s = @saturation / 100.0 - l = @lightness / 100.0 - - if s.zero? - r = 255 * l - g = 255 * l - b = 255 * l - else - if l < 0.5 - y = l * (1 + s) - else - y = (l + s) - (s * l) - end - - x = 2 * l - y - - r = 255 * hue2rgb(x, y, h + (1 / 3.0)) - g = 255 * hue2rgb(x, y, h) - b = 255 * hue2rgb(x, y, h - (1 / 3.0)) - end - Term::ANSIColor::RGBTriple.new(r.round, g.round, b.round) - end - - def to_hsl_triple - self - end - - def css - "hsl(%s,%s%%,%s%%)" % [ @hue, @saturation, @lightness ] - end - - def ==(other) - to_rgb_triple == other.to_rgb_triple - end - - def method_missing(name, *args, &block) - if Term::ANSIColor::RGBTriple.method_defined?(name) - to_rgb_triple.send(name, *args, &block) - else - super - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb deleted file mode 100644 index 99057d22b1..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/movement.rb +++ /dev/null @@ -1,108 +0,0 @@ -require 'tins/terminal' - -module Term - module ANSIColor - module Movement - def terminal_lines - Tins::Terminal.lines - end - - def terminal_columns - Tins::Terminal.columns - end - - def move_to(line = 1, column = 1, string = nil, &block) - move_command("\e[#{line.to_i};#{column.to_i}H", string, &block) - end - - def move_to_column(column = 1, string = nil, &block) - move_command("\e[#{column.to_i}G", string, &block) - end - - def move_to_line(line = 1, string = nil, &block) - move_command("\e[#{line.to_i}f", string, &block) - end - - def move_up(lines = 1, string = nil, &block) - move_command("\e[#{lines.to_i}A", string, &block) - end - - def move_down(lines = 1, string = nil, &block) - move_command("\e[#{lines.to_i}B", string, &block) - end - - def move_forward(columns = 1, string = nil, &block) - move_command("\e[#{columns.to_i}C", string, &block) - end - - def move_backward(columns = 1, string = nil, &block) - move_command("\e[#{columns.to_i}D", string, &block) - end - - def move_to_next_line(lines = 1, string = nil, &block) - move_command("\e[#{lines}E", string, &block) - end - - def move_to_previous_line(lines = 1, string = nil, &block) - move_command("\e[#{lines}F", string, &block) - end - - def move_home(string = nil, &block) - move_to(1, 1, string, &block) - end - - def clear_screen(string = nil, &block) - erase_in_display(2, string, &block) - end - - def erase_in_display(n = 0, string = nil, &block) - move_command("\e[#{n}J", string, &block) - end - - def erase_in_line(n = 0, string = nil, &block) - move_command("\e[#{n}K", string, &block) - end - - def scroll_up(pages = 1, string = nil, &block) - move_command("\e[#{pages}S", string, &block) - end - - def scroll_down(pages = 1, string = nil, &block) - move_command("\e[#{pages}T", string, &block) - end - - def save_position(string = nil, &block) - move_command("\e[s", string, &block) - end - - def restore_position(string = nil, &block) - move_command("\e[u", string, &block) - end - - def return_to_position(string = nil, &block) - save_position("") << move_command("", string, &block) << restore_position("") - end - - def show_cursor(string = nil, &block) - move_command("\e[?25h", string, &block) - end - - def hide_cursor(string = nil, &block) - move_command("\e[?25l", string, &block) - end - - private - - def move_command(move, string = nil) - if block_given? - move << yield.to_s - elsif string.respond_to?(:to_str) - move << string.to_str - elsif respond_to?(:to_str) - move << to_str - end - move - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb deleted file mode 100644 index 233166a15b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/ppm_reader.rb +++ /dev/null @@ -1,96 +0,0 @@ -module Term - module ANSIColor - class PPMReader - include Term::ANSIColor - - def initialize(io, options = {}) - @io = io - @options = options - @buffer = '' - end - - def reset_io - begin - @io.rewind - rescue Errno::ESPIPE - end - parse_header - end - - def each_row - reset_io - @height.times do - yield parse_row - end - end - - def to_a - enum_for(:each_row).to_a - end - - def to_s - result = '' - each_row do |row| - last_pixel = nil - for pixel in row - if pixel != last_pixel - color = Attribute.nearest_rgb_color(pixel, @options) - result << on_color(color) - last_pixel = pixel - end - result << ' ' - end - result << reset << "\n" - end - result - end - - private - - def parse_row - row = [] - @width.times do - row << parse_next_pixel - end - row - end - - def parse_next_pixel - pixel = nil - case @type - when 3 - @buffer.empty? and @buffer << next_line - @buffer.sub!(/(\d+)\s+(\d+)\s+(\d+)\s*/) do - pixel = [ $1.to_i, $2.to_i, $3.to_i ] - '' - end - when 6 - @buffer.size < 3 and @buffer << @io.read(8192) - pixel = @buffer.slice!(0, 3).unpack('C3') - end - pixel - end - - def parse_header - (line = next_line) =~ /^P([36])$/ or raise "unknown type #{line.to_s.chomp.inspect}" - @type = $1.to_i - - if next_line =~ /^(\d+)\s+(\d+)$/ - @width, @height = $1.to_i, $2.to_i - else - raise "missing dimensions" - end - - unless next_line =~ /^255$/ - raise "only 255 max color images allowed" - end - end - - def next_line - while line = @io.gets and line =~ /^#|^\s$/ - end - line - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb deleted file mode 100644 index f297de0dd2..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_color_metrics.rb +++ /dev/null @@ -1,161 +0,0 @@ -module Term - module ANSIColor - module RGBColorMetricsHelpers - module WeightedEuclideanDistance - def weighted_euclidean_distance_to(other, weights = [ 1.0 ] * values.size) - sum = 0.0 - values.zip(other.values, weights) do |s, o, w| - sum += w * (s - o) ** 2 - end - Math.sqrt(sum) - end - end - - module NormalizeRGBTriple - private - - def normalize(v) - v /= 255.0 - if v <= 0.04045 - v / 12 - else - ( (v + 0.055) / 1.055) ** 2.4 - end - end - - def normalize_rgb_triple(rgb_triple) - [ - rgb_triple.red, - rgb_triple.green, - rgb_triple.blue - ].map { |v| normalize(v) } - end - end - end - - module RGBColorMetrics - def self.metric(name) - metric?(name) or raise ArgumentError, "unknown metric #{name.inspect}" - end - - def self.metric?(name) - if const_defined?(name) - const_get name - end - end - - def self.metrics - constants.map(&:to_sym) - end - - # Implements color distance how the old greeks and most donkeys would… - module Euclidean - def self.distance(rgb1, rgb2) - rgb1.weighted_euclidean_distance_to rgb2 - end - end - - # Implements color distance the best way everybody knows… - module NTSC - def self.distance(rgb1, rgb2) - rgb1.weighted_euclidean_distance_to rgb2, [ 0.299, 0.587, 0.114 ] - end - end - - # Implements color distance as given in: - # http://www.compuphase.com/cmetric.htm - module CompuPhase - def self.distance(rgb1, rgb2) - rmean = (rgb1.red + rgb2.red) / 2 - rgb1.weighted_euclidean_distance_to rgb2, - [ 2 + (rmean >> 8), 4, 2 + ((255 - rmean) >> 8) ] - end - end - - module YUV - class YUVTriple < Struct.new(:y, :u, :v) - include RGBColorMetricsHelpers::WeightedEuclideanDistance - - def self.from_rgb_triple(rgb_triple) - r, g, b = rgb_triple.red, rgb_triple.green, rgb_triple.blue - y = (0.299 * r + 0.587 * g + 0.114 * b).round - u = ((b - y) * 0.492).round - v = ((r - y) * 0.877).round - new(y, u, v) - end - end - - def self.distance(rgb1, rgb2) - yuv1 = YUVTriple.from_rgb_triple(rgb1) - yuv2 = YUVTriple.from_rgb_triple(rgb2) - yuv1.weighted_euclidean_distance_to yuv2 - end - end - - module CIEXYZ - class CIEXYZTriple < Struct.new(:x, :y, :z) - include RGBColorMetricsHelpers::WeightedEuclideanDistance - extend RGBColorMetricsHelpers::NormalizeRGBTriple - - def self.from_rgb_triple(rgb_triple) - r, g, b = normalize_rgb_triple rgb_triple - - x = 0.436052025 * r + 0.385081593 * g + 0.143087414 * b - y = 0.222491598 * r + 0.71688606 * g + 0.060621486 * b - z = 0.013929122 * r + 0.097097002 * g + 0.71418547 * b - - x *= 255 - y *= 255 - z *= 255 - - new(x.round, y.round, z.round) - end - end - - def self.distance(rgb1, rgb2) - xyz1 = CIEXYZTriple.from_rgb_triple(rgb1) - xyz2 = CIEXYZTriple.from_rgb_triple(rgb2) - xyz1.weighted_euclidean_distance_to xyz2 - end - end - - module CIELab - class CIELabTriple < Struct.new(:l, :a, :b) - include RGBColorMetricsHelpers::WeightedEuclideanDistance - extend RGBColorMetricsHelpers::NormalizeRGBTriple - - def self.from_rgb_triple(rgb_triple) - r, g, b = normalize_rgb_triple rgb_triple - - x = 0.436052025 * r + 0.385081593 * g + 0.143087414 * b - y = 0.222491598 * r + 0.71688606 * g + 0.060621486 * b - z = 0.013929122 * r + 0.097097002 * g + 0.71418547 * b - - xr = x / 0.964221 - yr = y - zr = z / 0.825211 - - eps = 216.0 / 24389 - k = 24389.0 / 27 - - fx = xr > eps ? xr ** (1.0 / 3) : (k * xr + 16) / 116 - fy = yr > eps ? yr ** (1.0 / 3) : (k * yr + 16) / 116 - fz = zr > eps ? zr ** (1.0 / 3) : (k * zr + 16) / 116 - - l = 2.55 * ((116 * fy) - 16) - a = 500 * (fx - fy) - b = 200 * (fy - fz) - - new(l.round, a.round, b.round) - end - end - - def self.distance(rgb1, rgb2) - lab1 = CIELabTriple.from_rgb_triple(rgb1) - lab2 = CIELabTriple.from_rgb_triple(rgb2) - lab1.weighted_euclidean_distance_to lab2 - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb deleted file mode 100644 index 4fbaf48088..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/rgb_triple.rb +++ /dev/null @@ -1,179 +0,0 @@ -require 'term/ansicolor/rgb_color_metrics' - -module Term - module ANSIColor - class RGBTriple - include Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance - - def self.convert_value(color, max: 255) - color.nil? and raise ArgumentError, "missing color value" - color = Integer(color) - (0..max) === color or raise ArgumentError, - "color value #{color.inspect} not between 0 and #{max}" - color - end - - private_class_method :convert_value - - def self.from_html(html) - case html - when /\A#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\z/i - new(*$~.captures.map { |c| convert_value(c.to_i(16)) }) - when /\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/i - new(*$~.captures.map { |c| convert_value((c + c).to_i(16)) }) - end - end - - def self.from_css(css) - case css - when /\A\s*rgb\(\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*\)\z/ - new(*$~.captures.map { |c| convert_value(((Float(c) / 100) * 0xff).round) }) - when /\A\s*rgb\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^\)\s]+)\s*\)\z/ - new(*$~.captures.map { |c| convert_value((Float(c)).round) }) - end - end - - def self.from_hash(options) - new( - convert_value(options[:red]), - convert_value(options[:green]), - convert_value(options[:blue]) - ) - end - - def self.from_array(array) - new(*array) - end - - def self.[](thing) - case - when thing.respond_to?(:to_rgb_triple) then thing.to_rgb_triple - when thing.respond_to?(:to_ary) then from_array(thing.to_ary) - when thing.respond_to?(:to_str) - thing = thing.to_str - from_html(thing.sub(/\Aon_/, '')) || from_css(thing) || - Term::ANSIColor::HSLTriple.from_css(thing).full?(:to_rgb_triple) - when thing.respond_to?(:to_hash) then from_hash(thing.to_hash) - else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}" - end - end - - def initialize(red, green, blue) - @values = [ red, green, blue ].map { |v| - [ [ Integer(v), 0 ].max, 0xff ].min - } - end - - def red - @values[0] - end - - def green - @values[1] - end - - def blue - @values[2] - end - - def percentages - @percentages ||= @values.map { |v| 100 * v / 255.0 } - end - - def red_p - percentages[0] - end - - def green_p - percentages[1] - end - - def blue_p - percentages[2] - end - - def invert - self.class.new(255 - red, 255 - green, 255 - blue) - end - - def gray? - red != 0 && red != 0xff && red == green && green == blue && blue == red - end - - def html - s = '#' - @values.each { |c| s << '%02x' % c } - s - end - - def css(percentage: false) - if percentage - "rgb(%s%%,%s%%,%s%%)" % @values.map { |v| 100.0 * v / 255 } - else - "rgb(%u,%u,%u)" % @values - end - end - - def to_rgb_triple - self - end - - def to_hsl_triple - Term::ANSIColor::HSLTriple.from_rgb_triple(self) - end - - attr_reader :values - protected :values - - def to_a - @values.dup - end - - def ==(other) - @values == other.to_rgb_triple.values - end - - def color(string) - Term::ANSIColor.color(self, string) - end - - def distance_to(other, options = {}) - options[:metric] ||= RGBColorMetrics::CIELab - options[:metric].distance(self, other) - end - - def initialize_copy(other) - r = super - other.instance_variable_set :@values, @values.dup - r - end - - def gradient_to(other, options = {}) - options[:steps] ||= 16 - steps = options[:steps].to_i - steps < 2 and raise ArgumentError, 'at least 2 steps are required' - changes = other.values.zip(@values).map { |x, y| x - y } - current = self - gradient = [ current.dup ] - s = steps - 1 - while s > 1 - current = current.dup - gradient << current - 3.times do |i| - current.values[i] += changes[i] / (steps - 1) - end - s -= 1 - end - gradient << other - end - - def method_missing(name, *args, &block) - if Term::ANSIColor::HSLTriple.method_defined?(name) - to_hsl_triple.send(name, *args, &block) - else - super - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb deleted file mode 100644 index 2c02a364eb..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/term-ansicolor-1.7.1/lib/term/ansicolor/version.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Term::ANSIColor - # Term::ANSIColor version - VERSION = '1.7.1' - VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc: - VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc: - VERSION_MINOR = VERSION_ARRAY[1] # :nodoc: - VERSION_BUILD = VERSION_ARRAY[2] # :nodoc: -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb deleted file mode 100644 index 35f415eb5f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'tins/alias' -require 'tins/dslkit/polite' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb deleted file mode 100644 index 8f5762bbd3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/polite.rb +++ /dev/null @@ -1 +0,0 @@ -require 'tins/dslkit' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb deleted file mode 100644 index 39649f3314..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/dslkit/rude.rb +++ /dev/null @@ -1 +0,0 @@ -require 'tins/xt/dslkit' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb deleted file mode 100644 index e38ccaea53..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/spruz.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'tins' -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb deleted file mode 100644 index ca7c22cd48..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins.rb +++ /dev/null @@ -1,61 +0,0 @@ -module Tins - require 'tins/attempt' - require 'tins/bijection' - require 'tins/count_by' - require 'tins/deep_dup' - require 'tins/file_binary' - require 'tins/find' - require 'tins/generator' - require 'tins/go' - require 'tins/hash_symbolize_keys_recursive' - require 'tins/hash_union' - require 'tins/limited' - require 'tins/lines_file' - require 'tins/memoize' - require 'tins/minimize' - require 'tins/module_group' - require 'tins/named_set' - require 'tins/null' - require 'tins/once' - require 'tins/p' - require 'tins/partial_application' - require 'tins/range_plus' - require 'tins/require_maybe' - require 'tins/secure_write' - require 'tins/string_camelize' - require 'tins/string_underscore' - require 'tins/string_version' - require 'tins/subhash' - require 'tins/time_dummy' - require 'tins/date_dummy' - require 'tins/date_time_dummy' - require 'tins/to_proc' - require 'tins/uniq_by' - require 'tins/version' - require 'tins/write' - require 'tins/extract_last_argument_options' - require 'tins/deep_const_get' - require 'tins/responding' - require 'tins/proc_compose' - require 'tins/proc_prelude' - require 'tins/concern' - require 'tins/to' - require 'tins/terminal' - require 'tins/sexy_singleton' - require 'tins/method_description' - require 'tins/annotate' - require 'tins/token' - require 'tins/dslkit' - require 'tins/case_predicate' - require 'tins/implement' - if defined? ::Encoding - require 'tins/string_byte_order_mark' - end - require 'tins/complete' - require 'tins/duration' - require 'tins/unit' - require 'tins/expose' - require 'tins/temp_io' - require 'tins/temp_io_enum' -end -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb deleted file mode 100644 index 5bfa74bbd3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/alias.rb +++ /dev/null @@ -1 +0,0 @@ -Spruz = Tins diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb deleted file mode 100644 index dc461f0ff5..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/annotate.rb +++ /dev/null @@ -1,38 +0,0 @@ -module Tins::Annotate - def annotate(name) - singleton_class.class_eval do - define_method(name) do |annotation = :annotated| - instance_variable_set "@__annotation_#{name}__", annotation - end - - define_method("#{name}_of") do |method_name| - __send__("#{name}_annotations")[method_name] - end - - define_method("#{name}_annotations") do - if instance_variable_defined?("@__annotation_#{name}_annotations__") - instance_variable_get "@__annotation_#{name}_annotations__" - else - instance_variable_set "@__annotation_#{name}_annotations__", {} - end - end - - old_method_added = instance_method(:method_added) - define_method(:method_added) do |method_name| - old_method_added.bind(self).call method_name - if annotation = instance_variable_get("@__annotation_#{name}__") - __send__("#{name}_annotations")[method_name] = annotation - end - instance_variable_set "@__annotation_#{name}__", nil - end - end - - define_method("#{name}_annotations") do - self.class.__send__("#{name}_annotations") - end - - define_method("#{name}_of") do |method_name| - self.class.__send__("#{name}_of", method_name) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb deleted file mode 100644 index 4318a80f0b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/ask_and_send.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Tins - module AskAndSend - def ask_and_send(method_name, *args, &block) - if respond_to?(method_name) - __send__(method_name, *args, &block) - end - end - - def ask_and_send!(method_name, *args, &block) - if respond_to?(method_name, true) - __send__(method_name, *args, &block) - end - end - - def ask_and_send_or_self(method_name, *args, &block) - if respond_to?(method_name) - __send__(method_name, *args, &block) - else - self - end - end - - def ask_and_send_or_self!(method_name, *args, &block) - if respond_to?(method_name, true) - __send__(method_name, *args, &block) - else - self - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb deleted file mode 100644 index 6bcd847a70..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/attempt.rb +++ /dev/null @@ -1,111 +0,0 @@ -module Tins - module Attempt - # Attempts code in block *attempts* times, sleeping according to *sleep* - # between attempts and catching the exception(s) in *exception_class*. - # - # *sleep* is either a Proc returning a floating point number for duration - # as seconds or a Numeric >= 0 or < 0. In the former case this is the - # duration directly, in the latter case -*sleep* is the total number of - # seconds that is slept before giving up, and every attempt is retried - # after a exponentially increasing duration of seconds. - # - # Iff *reraise* is true the caught exception is reraised after running out - # of attempts. - def attempt(opts = {}, &block) - sleep = nil - exception_class = StandardError - if Numeric === opts - attempts = opts - else - attempts = opts[:attempts] || 1 - attempts >= 1 or raise ArgumentError, 'at least one attempt is required' - exception_class = opts[:exception_class] if opts.key?(:exception_class) - sleep = interpret_sleep(opts[:sleep], attempts) - reraise = opts[:reraise] - end - return if attempts <= 0 - count = 0 - if exception_class.nil? - begin - count += 1 - if block.call(count) - return true - elsif count < attempts - sleep_duration(sleep, count) - end - end until count == attempts - false - else - begin - count += 1 - block.call(count) - true - rescue *exception_class - if count < attempts - sleep_duration(sleep, count) - retry - end - reraise ? raise : false - end - end - end - - private - - def sleep_duration(duration, count) - case duration - when Numeric - sleep duration - when Proc - sleep duration.call(count) - end - end - - def compute_duration_base(sleep, attempts) - x1, x2 = 1, sleep - attempts <= sleep or raise ArgumentError, - "need less or equal number of attempts than sleep duration #{sleep}" - x1 >= x2 and raise ArgumentError, "invalid sleep argument: #{sleep.inspect}" - function = -> x { (0...attempts).inject { |s, i| s + x ** i } - sleep } - f, fmid = function[x1], function[x2] - f * fmid >= 0 and raise ArgumentError, "invalid sleep argument: #{sleep.inspect}" - n = 1 << 16 - epsilon = 1E-16 - root = if f < 0 - dx = x2 - x1 - x1 - else - dx = x1 - x2 - x2 - end - n.times do - fmid = function[xmid = root + (dx *= 0.5)] - fmid < 0 and root = xmid - dx.abs < epsilon or fmid == 0 and return root - end - raise ArgumentError, "too many iterations (#{n})" - result - end - - def interpret_sleep(sleep, attempts) - case sleep - when nil - when Numeric - if sleep < 0 - if attempts > 2 - sleep = -sleep - duration_base = compute_duration_base sleep, attempts - sleep = lambda { |i| duration_base ** i } - else - raise ArgumentError, "require > 2 attempts for negative sleep value" - end - end - sleep - when Proc - sleep - else - raise TypeError, "require Proc or Numeric sleep argument" - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb deleted file mode 100644 index e5eb76feed..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/bijection.rb +++ /dev/null @@ -1,46 +0,0 @@ -module Tins - class Bijection < Hash - def self.[](*pairs) - pairs.size % 2 == 0 or - raise ArgumentError, "odd number of arguments for #{self}" - new.fill do |obj| - (pairs.size / 2).times do |i| - j = 2 * i - key = pairs[j] - value = pairs[j + 1] - obj.key?(key) and raise ArgumentError, "duplicate key #{key.inspect} for #{self}" - obj.inverted.key?(value) and raise ArgumentError, "duplicate value #{value.inspect} for #{self}" - obj[pairs[j]] = pairs[j + 1] - end - end - end - - def initialize(inverted = Bijection.new(self)) - @inverted = inverted - end - - def fill - if empty? - yield self - freeze - end - self - end - - def freeze - r = super - unless @inverted.frozen? - @inverted.freeze - end - r - end - - def []=(key, value) - key?(key) and return - super - @inverted[value] = key - end - - attr_reader :inverted - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb deleted file mode 100644 index 4616f8160c..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/case_predicate.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Tins - module CasePredicate - def case?(*args) - args.find { |a| a === self } - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb deleted file mode 100644 index e2899b572e..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/complete.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'readline' - -module Tins - module Complete - module_function - - @@sync = Sync.new - - def complete(prompt: '', add_hist: false, &block) - @@sync.synchronize do - Readline.completion_proc = block - Readline.input = STDIN - Readline.output = STDOUT - Readline.readline(prompt, add_hist) - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb deleted file mode 100644 index af4a759cdf..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/concern.rb +++ /dev/null @@ -1,30 +0,0 @@ -module Tins - module Concern - def self.extended(base) - base.instance_variable_set("@_dependencies", []) - end - - def append_features(base) - if base.instance_variable_defined?("@_dependencies") - base.instance_variable_get("@_dependencies") << self - false - else - return false if base < self - @_dependencies.each { |dep| base.send(:include, dep) } - super - base.extend const_get("ClassMethods") if const_defined?("ClassMethods") - base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block") - Thread.current[:tin_concern_args] = nil - true - end - end - - def included(base = nil, &block) - if base.nil? - @_included_block = block - else - super - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb deleted file mode 100644 index dbe41b7e33..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/count_by.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Tins - module CountBy - def count_by(&b) - b ||= lambda { |x| true } - inject(0) { |s, e| s += 1 if b[e]; s } - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb deleted file mode 100644 index a5d95e8e68..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_dummy.rb +++ /dev/null @@ -1,53 +0,0 @@ -require 'date' - -module Tins - module DateDummy - def self.included(modul) - class << modul - alias really_today today - - remove_method :today rescue nil - - def dummy=(value) - if value.respond_to?(:to_str) - value = Date.parse(value.to_str) - elsif value.respond_to?(:to_date) - value = value.to_date - end - @dummy = value - end - - def dummy(value = nil) - if value.nil? - if defined?(@dummy) - @dummy - end - else - begin - old_dummy = @dummy - self.dummy = value - yield - ensure - self.dummy = old_dummy - end - end - end - - def today - if dummy - dummy.dup - elsif caller.first =~ /`today`/ - really_today - else - really_today - end - end - - end - super - end - end -end - -require 'tins/alias' - diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb deleted file mode 100644 index 939fb9d3ac..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/date_time_dummy.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'date' - -module Tins - module DateTimeDummy - def self.included(modul) - class << modul - alias really_now now - - remove_method :now rescue nil - - def dummy=(value) - if value.respond_to?(:to_str) - value = DateTime.parse(value.to_str) - elsif value.respond_to?(:to_datetime) - value = value.to_datetime - end - @dummy = value - end - - def dummy(value = nil) - if value.nil? - if defined?(@dummy) - @dummy - end - else - begin - old_dummy = @dummy - self.dummy = value - yield - ensure - self.dummy = old_dummy - end - end - end - - def now - if dummy - dummy.dup - elsif caller.first =~ /`now`/ - really_now - else - really_now - end - end - end - super - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb deleted file mode 100644 index 706005d8f3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_const_get.rb +++ /dev/null @@ -1,42 +0,0 @@ -module Tins - module DeepConstGet - if ::Object.method(:const_defined?).arity == 1 - # :nocov: - # We do not create coverage on 1.8 - def self.const_defined_in?(modul, constant) - modul.const_defined?(constant) - end - # :nocov: - else - def self.const_defined_in?(modul, constant) - modul.const_defined?(constant, false) - end - end - - def self.deep_const_get(path, start_module = Object) - path.to_s.split('::').inject(start_module) do |p, c| - case - when c.empty? - if start_module == Object - Object - else - raise ArgumentError, "top level constants cannot be reached from"\ - " start module #{start_module.inspect}" - end - when const_defined_in?(p, c) - p.const_get(c) - else - begin - p.const_missing(c) - rescue NameError => e - raise ArgumentError, "can't get const #{path}: #{e}" - end - end - end - end - - def deep_const_get(path, start_module = Object) - ::Tins::DeepConstGet.deep_const_get(path, start_module) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb deleted file mode 100644 index 3b53d866a3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/deep_dup.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Tins - module DeepDup - def deep_dup - Marshal.load(Marshal.dump(self)) - rescue TypeError - return self - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb deleted file mode 100644 index bace0f13df..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/dslkit.rb +++ /dev/null @@ -1,636 +0,0 @@ -require 'thread' -require 'sync' - -require 'tins/thread_local' - -module Tins - # This module contains some handy methods to deal with eigenclasses. Those - # are also known as virtual classes, singleton classes, metaclasses, plus all - # the other names Matz doesn't like enough to actually accept one of the - # names. - # - # The module can be included into other modules/classes to make the methods available. - module Eigenclass - # Returns the eigenclass of this object. - def eigenclass - end - alias eigenclass singleton_class - - # Evaluates the _block_ in context of the eigenclass of this object. - def eigenclass_eval(&block) - eigenclass.instance_eval(&block) - end - end - - module ClassMethod - include Eigenclass - - # Define a class method named _name_ using _block_. - def class_define_method(name, &block) - eigenclass_eval { define_method(name, &block) } - end - - # Define reader and writer attribute methods for all *ids. - def class_attr_accessor(*ids) - eigenclass_eval { attr_accessor(*ids) } - end - - # Define reader attribute methods for all *ids. - def class_attr_reader(*ids) - eigenclass_eval { attr_reader(*ids) } - end - - # Define writer attribute methods for all *ids. - def class_attr_writer(*ids) - eigenclass_eval { attr_writer(*ids) } - end - - # I boycott attr! - end - - module ThreadGlobal - # Define a thread global variable named _name_ in this module/class. If the - # value _value_ is given, it is used to initialize the variable. - def thread_global(name, default_value = nil, &default) - is_a?(Module) or raise TypeError, "receiver has to be a Module" - - default_value && default and raise ArgumentError, - "require either default_falue or default block" - - if default_value - default = -> * { default_value } - end - - name = name.to_s - var_name = "@__#{name}_#{__id__.abs}__" - - lock = Mutex.new - modul = self - - define_method(name) do - lock.synchronize { - if default && !modul.instance_variable_defined?(var_name) - modul.instance_variable_set var_name, default.call - end - modul.instance_variable_get var_name - } - end - - define_method(name + "=") do |value| - lock.synchronize { modul.instance_variable_set var_name, value } - end - - self - end - - # Define a thread global variable for the current instance with name - # _name_. If the value _value_ is given, it is used to initialize the - # variable. - def instance_thread_global(name, value = nil) - sc = class << self - extend Tins::ThreadGlobal - self - end - sc.thread_global name, value - self - end - end - - module InstanceExec - def self.included(*) - super - warn "#{self} is deprecated, but included at #{caller.first[/(.*):/, 1]}" - end - end - - module Interpreter - # Interpret the string _source_ as a body of a block, while passing - # *args into the block. - # - # A small example explains how the method is supposed to be used and how - # the *args can be fetched: - # - # class A - # include Tins::Interpreter - # def c - # 3 - # end - # end - # - # A.new.interpret('|a,b| a + b + c', 1, 2) # => 6 - # - # To use a specified binding see #interpret_with_binding. - def interpret(source, *args) - interpret_with_binding(source, binding, *args) - end - - # Interpret the string _source_ as a body of a block, while passing - # *args into the block and using _my_binding_ for evaluation. - # - # A small example: - # - # class A - # include Tins::Interpreter - # def c - # 3 - # end - # def foo - # b = 2 - # interpret_with_binding('|a| a + b + c', binding, 1) # => 6 - # end - # end - # A.new.foo # => 6 - # - # See also #interpret. - def interpret_with_binding(source, my_binding, *args) - path = '(interpret)' - if source.respond_to? :to_io - path = source.path if source.respond_to? :path - source = source.to_io.read - end - block = lambda { |*a| eval("lambda { #{source} }", my_binding, path).call(*a) } - instance_exec(*args, &block) - end - end - - # This module contains the _constant_ method. For small example of its usage - # see the documentation of the DSLAccessor module. - module Constant - # Create a constant named _name_, that refers to value _value_. _value is - # frozen, if this is possible. If you want to modify/exchange a value use - # DSLAccessor#dsl_reader/DSLAccessor#dsl_accessor instead. - def constant(name, value = name) - value = value.freeze rescue value - define_method(name) { value } - end - end - - # The DSLAccessor module contains some methods, that can be used to make - # simple accessors for a DSL. - # - # - # class CoffeeMaker - # extend Tins::Constant - # - # constant :on - # constant :off - # - # extend Tins::DSLAccessor - # - # dsl_accessor(:state) { off } # Note: the off constant from above is used - # - # dsl_accessor :allowed_states, :on, :off - # - # def process - # allowed_states.include?(state) or fail "Explode!!!" - # if state == on - # puts "Make coffee." - # else - # puts "Idle..." - # end - # end - # end - # - # cm = CoffeeMaker.new - # cm.instance_eval do - # state # => :off - # state on - # state # => :on - # process # => outputs "Make coffee." - # end - # - # Note that Tins::SymbolMaker is an alternative for Tins::Constant in - # this example. On the other hand SymbolMaker can make debugging more - # difficult. - module DSLAccessor - # This method creates a dsl accessor named _name_. If nothing else is given - # as argument it defaults to nil. If *default is given as a single - # value it is used as a default value, if more than one value is given the - # _default_ array is used as the default value. If no default value but a - # block _block_ is given as an argument, the block is executed everytime - # the accessor is read in the context of the current instance. - # - # After setting up the accessor, the set or default value can be retrieved - # by calling the method +name+. To set a value one can call name - # :foo to set the attribute value to :foo or - # name(:foo, :bar) to set it to [ :foo, :bar ]. - def dsl_accessor(name, *default, &block) - variable = "@#{name}" - define_method(name) do |*args| - if args.empty? - result = - if instance_variable_defined?(variable) - instance_variable_get(variable) - end - if result.nil? - result = if default.empty? - block && instance_eval(&block) - elsif default.size == 1 - default.first - else - default - end - instance_variable_set(variable, result) - result - else - result - end - else - instance_variable_set(variable, args.size == 1 ? args.first : args) - end - end - end - - # This method creates a dsl reader accessor, that behaves exactly like a - # #dsl_accessor but can only be read not set. - def dsl_reader(name, *default, &block) - variable = "@#{name}" - define_method(name) do |*args| - if args.empty? - result = - if instance_variable_defined?(variable) - instance_variable_get(variable) - end - if result.nil? - if default.empty? - block && instance_eval(&block) - elsif default.size == 1 - default.first - else - default - end - else - result - end - else - raise ArgumentError, "wrong number of arguments (#{args.size} for 0)" - end - end - end - end - - # This module can be included in another module/class. It generates a symbol - # for every missing method that was called in the context of this - # module/class. - module SymbolMaker - # Returns a symbol (_id_) for every missing method named _id_. - def method_missing(id, *args) - if args.empty? - id - else - super - end - end - end - - # This module can be used to extend another module/class. It generates - # symbols for every missing constant under the namespace of this - # module/class. - module ConstantMaker - # Returns a symbol (_id_) for every missing constant named _id_. - def const_missing(id) - id - end - end - - module BlankSlate - # Creates an anonymous blank slate class, that only responds to the methods - # *ids. ids can be Symbols, Strings, and Regexps that have to match - # the method name with #===. - def self.with(*ids) - opts = Hash === ids.last ? ids.pop : {} - ids = ids.map { |id| Regexp === id ? id : id.to_s } - klass = opts[:superclass] ? Class.new(opts[:superclass]) : Class.new - klass.instance_eval do - instance_methods.each do |m| - m = m.to_s - undef_method m unless m =~ /^(__|object_id)/ or ids.any? { |i| i === m } - end - end - klass - end - end - - # See examples/recipe.rb and examples/recipe2.rb how this works at the - # moment. - module Deflect - # The basic Deflect exception - class DeflectError < StandardError; end - - class << self - extend Tins::ThreadLocal - - # A thread local variable, that holds a DeflectorCollection instance for - # the current thread. - thread_local :deflecting - end - - # A deflector is called with a _class_, a method _id_, and its - # *args. - class Deflector < Proc; end - - # This class implements a collection of deflectors, to make them available - # by emulating Ruby's message dispatch. - class DeflectorCollection - def initialize - @classes = {} - end - - # Add a new deflector _deflector_ for class _klass_ and method name _id_, - # and return self. - # - def add(klass, id, deflector) - k = @classes[klass] - k = @classes[klass] = {} unless k - k[id.to_s] = deflector - self - end - - # Return true if messages are deflected for class _klass_ and method name - # _id_, otherwise return false. - def member?(klass, id) - !!(k = @classes[klass] and k.key?(id.to_s)) - end - - # Delete the deflecotor class _klass_ and method name _id_. Returns the - # deflector if any was found, otherwise returns true. - def delete(klass, id) - if k = @classes[klass] - d = k.delete id.to_s - @classes.delete klass if k.empty? - d - end - end - - # Try to find a deflector for class _klass_ and method _id_ and return - # it. If none was found, return nil instead. - def find(klass, id) - klass.ancestors.find do |k| - if d = @classes[k] and d = d[id.to_s] - return d - end - end - end - end - - @@sync = Sync.new - - # Start deflecting method calls named _id_ to the _from_ class using the - # Deflector instance deflector. - def deflect_start(from, id, deflector) - @@sync.synchronize do - Deflect.deflecting ||= DeflectorCollection.new - Deflect.deflecting.member?(from, id) and - raise DeflectError, "#{from}##{id} is already deflected" - Deflect.deflecting.add(from, id, deflector) - from.class_eval do - define_method(id) do |*args| - if Deflect.deflecting and d = Deflect.deflecting.find(self.class, id) - d.call(self, id, *args) - else - super(*args) - end - end - end - end - end - - # Return true if method _id_ is deflected from class _from_, otherwise - # return false. - def self.deflect?(from, id) - Deflect.deflecting && Deflect.deflecting.member?(from, id) - end - - # Return true if method _id_ is deflected from class _from_, otherwise - # return false. - def deflect?(from, id) - Deflect.deflect?(from, id) - end - - # Start deflecting method calls named _id_ to the _from_ class using the - # Deflector instance deflector. After that yield to the given block and - # stop deflecting again. - def deflect(from, id, deflector) - @@sync.synchronize do - begin - deflect_start(from, id, deflector) - yield - ensure - deflect_stop(from, id) - end - end - end - - # Stop deflection method calls named _id_ to class _from_. - def deflect_stop(from, id) - @@sync.synchronize do - Deflect.deflecting.delete(from, id) or - raise DeflectError, "#{from}##{id} is not deflected from" - from.instance_eval { remove_method id } - end - end - end - - # This module can be included into modules/classes to make the delegate - # method available. - module Delegate - UNSET = Object.new - - # A method to easily delegate methods to an object, stored in an - # instance variable or returned by a method call. - # - # It's used like this: - # class A - # delegate :method_here, :@obj, :method_there - # end - # or: - # class A - # delegate :method_here, :method_call, :method_there - # end - # - # _other_method_name_ defaults to method_name, if it wasn't given. - #def delegate(method_name, to: UNSET, as: method_name) - def delegate(method_name, opts = {}) - to = opts[:to] || UNSET - as = opts[:as] || method_name - raise ArgumentError, "to argument wasn't defined" if to == UNSET - to = to.to_s - case - when to[0, 2] == '@@' - define_method(as) do |*args, &block| - if self.class.class_variable_defined?(to) - self.class.class_variable_get(to).__send__(method_name, *args, &block) - end - end - when to[0] == ?@ - define_method(as) do |*args, &block| - if instance_variable_defined?(to) - instance_variable_get(to).__send__(method_name, *args, &block) - end - end - when (?A..?Z).include?(to[0]) - define_method(as) do |*args, &block| - Tins::DeepConstGet.deep_const_get(to).__send__(method_name, *args, &block) - end - else - define_method(as) do |*args, &block| - __send__(to).__send__(method_name, *args, &block) - end - end - end - end - - # This module includes the block_self module_function. - module BlockSelf - module_function - - # This method returns the receiver _self_ of the context in which _block_ - # was created. - def block_self(&block) - eval 'self', block.__send__(:binding) - end - end - - # This module contains a configurable method missing delegator and can be - # mixed into a module/class. - module MethodMissingDelegator - - # Including this module in your classes makes an _initialize_ method - # available, whose first argument is used as method_missing_delegator - # attribute. If a superior _initialize_ method was defined it is called - # with all arguments but the first. - module DelegatorModule - include Tins::MethodMissingDelegator - - def initialize(delegator, *a, &b) - self.method_missing_delegator = delegator - super(*a, &b) if defined? super - end - end - - # This class includes DelegatorModule and can be used as a superclass - # instead of including DelegatorModule. - class DelegatorClass - include DelegatorModule - end - - # This object will be the receiver of all missing method calls, if it has a - # value other than nil. - attr_accessor :method_missing_delegator - - # Delegates all missing method calls to _method_missing_delegator_ if this - # attribute has been set. Otherwise it will call super. - def method_missing(id, *a, &b) - unless method_missing_delegator.nil? - method_missing_delegator.__send__(id, *a, &b) - else - super - end - end - end - - module ParameterizedModule - # Pass _args_ and _block_ to configure the module and then return it after - # calling the parameterize method has been called with these arguments. The - # _parameterize_ method should return a configured module. - def parameterize_for(*args, &block) - respond_to?(:parameterize) ? parameterize(*args, &block) : self - end - end - - module FromModule - include ParameterizedModule - - alias from parameterize_for - - def parameterize(opts = {}) - modul = opts[:module] or raise ArgumentError, 'option :module is required' - import_methods = Array(opts[:methods]) - result = modul.dup - remove_methods = modul.instance_methods.map(&:to_sym) - import_methods.map(&:to_sym) - remove_methods.each do |m| - begin - result.__send__ :remove_method, m - rescue NameError - end - end - result - end - end - - module Scope - def scope_push(scope_frame, name = :default) - scope_get(name).push scope_frame - self - end - - def scope_pop(name = :default) - scope_get(name).pop - scope_get(name).empty? and Thread.current[name] = nil - self - end - - def scope_top(name = :default) - scope_get(name).last - end - - def scope_reverse(name = :default, &block) - scope_get(name).reverse_each(&block) - end - - def scope_block(scope_frame, name = :default) - scope_push(scope_frame, name) - yield - ensure - scope_pop(name) - end - - def scope_get(name = :default) - Thread.current[name] ||= [] - end - - def scope(name = :default) - scope_get(name).dup - end - end - - module DynamicScope - class Context < Hash - def [](name) - super name.to_sym - end - - def []=(name, value) - super name.to_sym, value - end - end - - include Scope - - attr_accessor :dynamic_scope_name - - def dynamic_defined?(id) - self.dynamic_scope_name ||= :variables - scope_reverse(dynamic_scope_name) { |c| c.key?(id) and return true } - false - end - - def dynamic_scope(&block) - self.dynamic_scope_name ||= :variables - scope_block(Context.new, dynamic_scope_name, &block) - end - - def method_missing(id, *args) - self.dynamic_scope_name ||= :variables - if args.empty? and scope_reverse(dynamic_scope_name) { |c| c.key?(id) and return c[id] } - super - elsif args.size == 1 and id.to_s =~ /(.*?)=\Z/ - c = scope_top(dynamic_scope_name) or super - c[$1] = args.first - else - super - end - end - end -end -DSLKit = Tins diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb deleted file mode 100644 index 264a888f18..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/duration.rb +++ /dev/null @@ -1,95 +0,0 @@ -module Tins - class Duration - include Comparable - - def initialize(seconds) - @negative = seconds < 0 - seconds = seconds.abs - @original_seconds = seconds - @days, @hours, @minutes, @seconds, @fractional_seconds = - [ 86_400, 3600, 60, 1, 0 ].inject([ [], seconds ]) {|(r, s), d| - if d > 0 - dd, rest = s.divmod(d) - r << dd - [ r, rest ] - else - r << s - end - } - end - - def to_f - @original_seconds.to_f - end - - def <=>(other) - to_f <=> other.to_f - end - - def negative? - @negative - end - - def days? - @days > 0 - end - - def hours? - @hours > 0 - end - - def minutes? - @minutes > 0 - end - - def seconds? - @seconds > 0 - end - - def fractional_seconds? - @fractional_seconds > 0 - end - - def format(template = '%S%d+%h:%m:%s.%f', precision: nil) - result = template.gsub(/%[DdhmSs]/) { |directive| - case directive - when '%S' then ?- if negative? - when '%d' then @days - when '%h' then '%02u' % @hours - when '%m' then '%02u' % @minutes - when '%s' then '%02u' % @seconds - when '%D' then format_smart - end - } - if result.include?('%f') - if precision - fractional_seconds = "%.#{precision}f" % @fractional_seconds - else - fractional_seconds = '%f' % @fractional_seconds - end - result.gsub!('%f', fractional_seconds[2..-1]) - end - result - end - - def to_s - format_smart - end - - private - - def format_smart - template = '%h:%m:%s' - precision = nil - if days? - template.prepend '%d+' - end - if fractional_seconds? - template << '.%f' - precision = 3 - end - template.prepend '%S' - format template, precision: precision - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb deleted file mode 100644 index 297ad784b2..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/expose.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Tins - module Expose - # Expose any (private/protected) method or internal state of this object - # returning the result for specing purposes. - # - # @param method_name [ Symbol | String ] name of the method - # (shortcut for reader methods). - # @param block [ Proc ] any private/protected methods of the object can be - # called in this block. - # - # @return [ Object ] result of the method or block call - def expose(method_name = nil, *args, &block) - if block - instance_eval(&block) - elsif method_name.nil? - methods = private_methods(true) + protected_methods(true) - o = dup - o.singleton_class.class_eval do - public(*methods) - end - o - elsif method_name - __send__(method_name, *args) - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb deleted file mode 100644 index 8ab8e7c9c9..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/extract_last_argument_options.rb +++ /dev/null @@ -1,14 +0,0 @@ -module Tins - module ExtractLastArgumentOptions - def extract_last_argument_options - last_argument = last - if last_argument.respond_to?(:to_hash) and - options = last_argument.to_hash.dup - then - return self[0..-2], options - else - return dup, {} - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb deleted file mode 100644 index 255f3c1b40..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/file_binary.rb +++ /dev/null @@ -1,83 +0,0 @@ -module Tins - module FileBinary - module Constants - SEEK_SET = ::File::SEEK_SET - - ZERO = "\x00" - BINARY = "\x01-\x1f\x7f-\xff" - - if defined?(::Encoding) - ZERO.force_encoding(Encoding::ASCII_8BIT) - BINARY.force_encoding(Encoding::ASCII_8BIT) - end - end - - class << self - # Default options can be queried/set via this hash. - attr_accessor :default_options - end - self.default_options = { - offset: 0, - buffer_size: 2 ** 13, - percentage_binary: 30.0, - percentage_zeros: 0.0, - } - - # Returns true if this file is considered to be binary, false if it is not - # considered to be binary, and nil if it was empty. - # - # A file is considered to be binary if the percentage of zeros exceeds - # options[:percentage_zeros] or the percentage of binary bytes - # (8-th bit is 1) exceeds options[:percentage_binary] in the - # buffer of size options[:buffer_size] that is checked (beginning - # from offset options[:offset]). If an option isn't given the one - # from FileBinary.default_options is used instead. - def binary?(options = {}) - options = FileBinary.default_options.merge(options) - old_pos = tell - seek options[:offset], Constants::SEEK_SET - data = read options[:buffer_size] - !data or data.empty? and return nil - data_size = data.size - data.count(Constants::ZERO).to_f / data_size > - options[:percentage_zeros] / 100.0 and return true - data.count(Constants::BINARY).to_f / data_size > - options[:percentage_binary] / 100.0 - ensure - old_pos and seek old_pos, Constants::SEEK_SET - end - - # Returns true if FileBinary#binary? returns false, false if - # FileBinary#binary? returns true, and nil otherwise. For an explanation of - # +options+, see FileBinary#binary?. - def ascii?(options = {}) - case binary?(options) - when true then false - when false then true - end - end - - def self.included(modul) - modul.instance_eval do - extend ClassMethods - end - super - end - - module ClassMethods - # Returns true if the file with name +name+ is considered to be binary - # using the FileBinary#binary? method. - def binary?(name, options = {}) - open(name, 'rb') { |f| f.binary?(options) } - end - - # Returns true if the file with name +name+ is considered to be ascii - # using the FileBinary#ascii? method. - def ascii?(name, options = {}) - open(name, 'rb') { |f| f.ascii?(options) } - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb deleted file mode 100644 index 560ca2d299..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/find.rb +++ /dev/null @@ -1,149 +0,0 @@ -require 'enumerator' -require 'pathname' -require 'tins/module_group' - -module Tins - module Find - EXPECTED_STANDARD_ERRORS = ModuleGroup[ - Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, - Errno::ENAMETOOLONG - ] - - class Finder - module PathExtension - attr_accessor :finder - - def finder_stat - finder.protect_from_errors do - finder.follow_symlinks ? File.stat(self) : File.lstat(self) - end - end - - def file - finder.protect_from_errors do - File.new(self) if file? - end - end - - def file? - finder.protect_from_errors { s = finder_stat and s.file? } - end - - def directory? - finder.protect_from_errors { s = finder_stat and s.directory? } - end - - def exist? - finder.protect_from_errors { File.exist?(self) } - end - - def stat - finder.protect_from_errors { File.stat(self) } - end - - def lstat - finder.protect_from_errors { File.lstat(self) } - end - - def pathname - Pathname.new(self) - end - - def suffix - pathname.extname[1..-1] || '' - end - end - - def initialize(opts = {}) - @show_hidden = opts.fetch(:show_hidden) { true } - @raise_errors = opts.fetch(:raise_errors) { false } - @follow_symlinks = opts.fetch(:follow_symlinks) { true } - if opts.key?(:visit) && opts.key?(:suffix) - raise ArgumentError, 'either use visit or suffix argument' - elsif opts.key?(:visit) - @visit = opts.fetch(:visit) { -> path { true } } - elsif opts.key?(:suffix) - @suffix = Array(opts[:suffix]) - @visit = -> path { @suffix.nil? || @suffix.empty? || @suffix.include?(path.suffix) } - end - end - - attr_accessor :show_hidden - - attr_accessor :raise_errors - - attr_accessor :follow_symlinks - - attr_accessor :suffix - - def visit_path?(path) - if !defined?(@visit) || @visit.nil? - true - else - @visit.(path) - end - end - - def find(*paths) - block_given? or return enum_for(__method__, *paths) - paths.collect! { |d| d.dup } - while path = paths.shift - path = prepare_path(path) - catch(:prune) do - stat = path.finder_stat or next - visit_path?(path) and yield path - if stat.directory? - ps = protect_from_errors { Dir.entries(path) } or next - ps.sort! - ps.reverse_each do |p| - next if p == "." or p == ".." - next if !@show_hidden && p.start_with?('.') - p = File.join(path, p) - paths.unshift p - end - end - end - end - end - - def prepare_path(path) - path = path.dup - path.extend PathExtension - path.finder = self - path - end - - def protect_from_errors(errors = Find::EXPECTED_STANDARD_ERRORS) - yield - rescue errors - raise_errors and raise - return - end - end - - # - # Calls the associated block with the name of every path and directory - # listed as arguments, then recursively on their subdirectories, and so on. - # - # See the +Find+ module documentation for an example. - # - def find(*paths, &block) # :yield: path - opts = Hash === paths.last ? paths.pop : {} - Finder.new(opts).find(*paths, &block) - end - - # - # Skips the current path or directory, restarting the loop with the next - # entry. If the current path is a directory, that directory will not be - # recursively entered. Meaningful only within the block associated with - # Find::find. - # - # See the +Find+ module documentation for an example. - # - def prune - throw :prune - end - - module_function :find, :prune - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb deleted file mode 100644 index 49ecb2c0c7..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/generator.rb +++ /dev/null @@ -1,68 +0,0 @@ -module Tins - # This class can create generator objects, that can produce all tuples, that - # would be created by as many for-loops as dimensions were given. - # - # The generator - # g = Tins::Generator[1..2, %w[a b c]] - # produces - # g.to_a # => [[1, "a"], [1, "b"], [1, "c"], [2, "a"], [2, "b"], [2, "c"]] - # - # The 'each' method can be used to iterate over the tuples - # g.each { |a, b| puts "#{a} #{b}" } - # and Tins::Generator includes the Enumerable module, so - # Enumerable.instance_methods can be used as well: - # g.select { |a, b| %w[a c].include? b } # => [[1, "a"], [1, "c"], [2, "a"], [2, "c"]] - # - class Generator - include Enumerable - - # Create a new Generator object from the enumberables _enums_. - def self.[](*enums) - new(enums) - end - - # Create a new Generator instance. Use the objects in the Array _enums_ - # as dimensions. The should all respond to the :each method (see module - # Enumerable in the core ruby library). - def initialize(enums) - @enums, @iterators, @n = [], [], 0 - enums.each { |e| add_dimension(e) } - end - - # Iterate over all tuples produced by this generator and yield to them. - def each(&block) # :yield: tuple - recurse(&block) - self - end - - def recurse(tuple = [ nil ] * @n, i = 0, &block) - if i < @n - 1 then - @enums[i].__send__(@iterators[i]) do |x| - tuple[i] = x - recurse(tuple, i + 1, &block) - end - else - @enums[i].__send__(@iterators[i]) do |x| - tuple[i] = x - yield tuple.dup - end - end - end - private :recurse - - # Add another dimension to this generator. _enum_ is an object, that ought - # to respond to the _iterator_ method (defaults to :each). - def add_dimension(enum, iterator = :each) - @enums << enum - @iterators << iterator - @n += 1 - end - - # Return the size of this generator, that is the number of its dimensions. - def size - @enums.size - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb deleted file mode 100644 index e4d62d8525..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/go.rb +++ /dev/null @@ -1,96 +0,0 @@ -module Tins - module GO - module EnumerableExtension - def push(argument) - @arguments ||= [] - @arguments.push argument - self - end - alias << push - - def each(&block) - @arguments.each(&block) - self - end - include Enumerable - end - - module_function - - # Parses the argument array _args_, according to the pattern _s_, to - # retrieve the single character command line options from it. If _s_ is - # 'xy:' an option '-x' without an option argument is searched, and an - # option '-y foo' with an option argument ('foo'). To disable the '-x' - # option, pass '~x'. - # - # The _defaults_ argument specifies default values for the options. - # - # An option hash is returned with all found options set to true or the - # found option argument. - def go(s, args = ARGV, defaults: {}) - d = defaults || {} - b, v = s.scan(/(.)(:?)/).inject([ {}, {} ]) { |t, (o, a)| - a = a == ?: - t[a ? 1 : 0][o] = a ? nil : false - t - } - b.each_key do |k| - d.key?(k) or next - if [ 0, false, nil ].include?(d[k]) - b[k] = false - elsif d[k].respond_to?(:to_int) - b[k] = d[k].to_int - else - b[k] = 1 - end - end - v.each_key do |k| - d.key?(k) or next - if [ 0, false, nil ].include?(d[k]) - v[k] = nil - else - v[k] = d[k].to_s - end - end - r = [] - while a = args.shift - /\A-(?

.+)/ =~ a or (r << a; next) - until p == '' - o = p.slice!(0, 1) - if v.key?(o) - if p.empty? && args.empty? - r << a - break 1 - elsif p == '' - a = args.shift - else - a = p - end - if v[o].nil? || !(EnumerableExtension === v[o]) - a = a.dup - a.extend EnumerableExtension - a << a - v[o] = a - else - v[o] << a - end - break - elsif b.key?(o) - if b[o] - b[o] += 1 - else - b[o] = 1 - end - else - r << a - end - end && break - end - r.reject! { |a| (b[p] = false) || true if /\A~(?

.)/ =~ a } - args.replace r - b.merge(v) - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb deleted file mode 100644 index 7869a6a084..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_symbolize_keys_recursive.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'tins/thread_local' - -module Tins - module HashSymbolizeKeysRecursive - extend Tins::ThreadLocal - - thread_local :seen - - def symbolize_keys_recursive(circular: nil) - self.seen = {} - _symbolize_keys_recursive(self, circular: circular) - ensure - self.seen = nil - end - - def symbolize_keys_recursive!(circular: nil) - replace symbolize_keys_recursive(circular: circular) - end - - private - - def _symbolize_keys_recursive(object, circular: nil) - case - when seen[object.__id__] - object = circular - when Hash === object - seen[object.__id__] = true - new_object = object.class.new - seen[new_object.__id__] = true - object.each do |k, v| - new_object[k.to_s.to_sym] = _symbolize_keys_recursive(v, circular: circular) - end - object = new_object - when Array === object - seen[object.__id__] = true - new_object = object.class.new(object.size) - seen[new_object.__id__] = true - object.each_with_index do |v, i| - new_object[i] = _symbolize_keys_recursive(v, circular: circular) - end - object = new_object - end - object - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb deleted file mode 100644 index ce47d11427..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/hash_union.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Tins - module HashUnion - def |(other) - case - when other.respond_to?(:to_hash) - other = other.to_hash - when other.respond_to?(:to_h) - other = other.to_h - end - other.merge(self) - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb deleted file mode 100644 index a238e9857e..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/if_predicate.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Tins - module IfPredicate - def if? - self ? self : nil - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb deleted file mode 100644 index c6b62d1a8f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/implement.rb +++ /dev/null @@ -1,40 +0,0 @@ -module Tins - module Implement - MESSAGES = { - default: 'method %{method_name} not implemented in module %{module}', - subclass: 'method %{method_name} has to be implemented in '\ - 'subclasses of %{module}', - submodule: 'method %{method_name} has to be implemented in '\ - 'submodules of %{module}', - } - - def implement(method_name, msg = :default) - method_name.nil? and return - case msg - when ::Symbol - msg = MESSAGES.fetch(msg) - when ::Hash - return implement method_name, msg.fetch(:in) - end - display_method_name = method_name - if m = instance_method(method_name) rescue nil - m.extend Tins::MethodDescription - display_method_name = m.description(style: :name) - end - begin - msg = msg % { method_name: display_method_name, module: self } - rescue KeyError - end - define_method(method_name) do |*| - raise ::NotImplementedError, msg - end - end - - def implement_in_submodule(method_name) - implement method_name, - 'method %{method_name} has to be implemented in submodules of'\ - ' %{module}' - end - end -end - diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb deleted file mode 100644 index 6b753bb06c..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/limited.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'thread' - -module Tins - class Limited - # Create a Limited instance, that runs _maximum_ threads at most. - def initialize(maximum) - @mutex = Mutex.new - @continue = ConditionVariable.new - @maximum = Integer(maximum) - raise ArgumentError, "maximum < 1" if @maximum < 1 - @count = 0 - @tg = ThreadGroup.new - end - - # The maximum number of worker threads. - attr_reader :maximum - - # Execute _maximum_ number of threads in parallel. - def execute - @mutex.synchronize do - loop do - if @count < @maximum - @count += 1 - Thread.new do - @tg.add Thread.current - yield - @mutex.synchronize { @count -= 1 } - @continue.signal - end - return - else - @continue.wait(@mutex) - end - end - end - end - - def wait - @tg.list.each(&:join) - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb deleted file mode 100644 index 13fb5550c3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/lines_file.rb +++ /dev/null @@ -1,123 +0,0 @@ -module Tins - class LinesFile - module LineExtension - attr_reader :line_number - - def filename - lines_file.filename.dup - end - end - - def self.for_filename(filename, line_number = nil) - obj = new(File.readlines(filename), line_number) - obj.filename = filename - obj - end - - def self.for_file(file, line_number = nil) - obj = new(file.readlines, line_number) - obj.filename = file.path - obj - end - - def self.for_lines(lines, line_number = nil) - new(lines, line_number) - end - - def initialize(lines, line_number = nil) - @lines = lines - @lines.each_with_index do |line, i| - line.extend LineExtension - line.instance_variable_set :@line_number, i + 1 - line.instance_variable_set :@lines_file, self - end - instance_variable_set :@line_number, line_number || (@lines.empty? ? 0 : 1) - end - - attr_accessor :filename - - attr_reader :line_number - - def rewind - self.line_number = 1 - self - end - - def next! - old = line_number - self.line_number += 1 - line_number > old ? self : nil - end - - def previous! - old = line_number - self.line_number -= 1 - line_number < old ? self : nil - end - - def line_number=(number) - number = number.to_i - if number > 0 && number <= last_line_number - @line_number = number - end - end - - def last_line_number - @lines.size - end - - def empty? - @lines.empty? - end - - def each(&block) - empty? and return self - old_line_number = line_number - 1.upto(last_line_number) do |number| - self.line_number = number - block.call(line) - end - self - ensure - self.line_number = old_line_number - end - include Enumerable - - def line - index = line_number - 1 - @lines[index] if index >= 0 - end - - def file_linenumber - "#{filename}:#{line_number}" - end - - def match_backward(regexp, previous_after_match = false) - begin - if line =~ regexp - previous_after_match and previous! - return $~.captures - end - end while previous! - end - - def match_forward(regexp, next_after_match = false) - begin - if line =~ regexp - next_after_match and next! - return $~.captures - end - end while next! - end - - def to_s - "#{line_number} #{line.chomp}" - end - - def inspect - "#<#{self.class}: #{to_s.inspect}>" - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb deleted file mode 100644 index 0ea38c7035..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/memoize.rb +++ /dev/null @@ -1,91 +0,0 @@ -require 'tins/extract_last_argument_options' - -module Tins - module Memoize - module CacheMethods - # Return the cache object. - def __memoize_cache__ - @__memoize_cache__ ||= {} - end - - # Clear cached values for all methods/functions. - def memoize_cache_clear - __memoize_cache__.clear - self - end - - def memoize_apply_visibility(id) - visibility = instance_eval do - case - when private_method_defined?(id) - :private - when protected_method_defined?(id) - :protected - end - end - yield - ensure - visibility and __send__(visibility, id) - end - end - - class ::Module - # Automatically memoize calls of the the methods +method_ids+. The - # memoized results do NOT ONLY depend on the arguments, but ALSO on the - # object the method is called on. - def memoize_method(*method_ids) - method_ids.extend(ExtractLastArgumentOptions) - method_ids, opts = method_ids.extract_last_argument_options - include CacheMethods - method_ids.each do |method_id| - method_id = method_id.to_s.to_sym - memoize_apply_visibility method_id do - orig_method = instance_method(method_id) - __send__(:define_method, method_id) do |*args| - mc = __memoize_cache__ - if mc.key?(method_id) and result = mc[method_id][args] - result - else - (mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args) - $DEBUG and warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]" - opts[:freeze] and result.freeze - end - result - end - end - end - method_ids.size == 1 ? method_ids.first : method_ids - end - - include CacheMethods - - # Automatically memoize calls of the functions +function_ids+. The - # memoized result does ONLY depend on the arguments given to the - # function. - def memoize_function(*function_ids) - function_ids.extend(ExtractLastArgumentOptions) - function_ids, opts = function_ids.extract_last_argument_options - mc = __memoize_cache__ - function_ids.each do |function_id| - function_id = function_id.to_s.to_sym - memoize_apply_visibility function_id do - orig_function = instance_method(function_id) - __send__(:define_method, function_id) do |*args| - if mc.key?(function_id) and result = mc[function_id][args] - result - else - (mc[function_id] ||= {})[args] = result = orig_function.bind(self).call(*args) - opts[:freeze] and result.freeze - $DEBUG and warn "#{self.class} cached function #{function_id}(#{args.inspect unless args.empty?}) = #{result.inspect}" - end - result - end - end - end - function_ids.size == 1 ? function_ids.first : function_ids - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb deleted file mode 100644 index 7e0aa601ae..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/method_description.rb +++ /dev/null @@ -1,143 +0,0 @@ -module Tins - module MethodDescription - class Parameters - class Parameter < Struct.new(:type, :name) - def ==(other) - type == other.type - end - - def inspect - "#<#{self.class} #{to_s.inspect}>" - end - end - - class RestParameter < Parameter - def to_s - "*#{name}" - end - end - - class KeyrestParameter < Parameter - def to_s - "**#{name}" - end - end - - class ReqParameter < Parameter - def to_s - name.to_s - end - end - - class OptParameter < Parameter - def to_s - "#{name}=?" - end - end - - class KeyParameter < Parameter - def to_s - "#{name}:?" - end - end - - class KeyreqParameter < Parameter - def to_s - "#{name}:" - end - end - - class BlockParameter < Parameter - def to_s - "&#{name}" - end - end - - class GenericParameter < Parameter - def to_s - [ name, type ] * ?: - end - end - - def self.build(type, name) - parameter_classname = "#{type.to_s.capitalize}Parameter" - parameter_class = - if const_defined? parameter_classname - const_get parameter_classname - else - GenericParameter - end - parameter_class.new(type, name) - end - end - - class Signature - def initialize(*parameters) - @parameters = parameters - end - - attr_reader :parameters - - def eql?(other) - @parameters.eql? other.parameters - end - - def ==(other) - @parameters == other.parameters - end - - def ===(method) - self == method.signature - end - - def to_s - @parameters * ?, - end - - def inspect - "#<#{self.class} (#{to_s})>" - end - end - - def signature - description style: :parameters - end - - def description(style: :namespace) - valid_styles = %i[ namespace name parameters ] - valid_styles.include?(style) or - raise ArgumentError, - "style has to be one of #{valid_styles * ', '}" - if respond_to?(:parameters) - generated_name = 'x0' - parameter_array = parameters.map { |p_type, p_name| - unless p_name - generated_name = generated_name.succ - p_name = generated_name - end - Parameters.build(p_type, p_name) - } - signature = Signature.new(*parameter_array) - if style == :parameters - return signature - end - end - result = '' - if style == :namespace - if owner <= Module - result << receiver.to_s << ?. # XXX Better to use owner here as well? - else - result << owner.name.to_s << ?# - end - end - if %i[ namespace name ].include?(style) - result << name.to_s << '(' - end - result << (signature || arity).to_s - if %i[ namespace name ].include?(style) - result << ?) - end - result - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb deleted file mode 100644 index 68c94aff96..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/minimize.rb +++ /dev/null @@ -1,55 +0,0 @@ -module Tins - # This module can be mixed into all classes, whose instances respond to the - # [] and size-methods, like for example Array. The returned elements from [] - # should respond to the succ method. - module Minimize - # Returns a minimized version of this object, that is successive elements - # are substituted with ranges a..b. In the situation ..., x, y,... and y != - # x.succ a range x..x is created, to make it easier to iterate over all the - # ranges in one run. A small example: - # [ 'A', 'B', 'C', 'G', 'K', 'L', 'M' ].minimize # => [ 'A'..'C', 'G'..'G', 'K'..'M' ] - # - # If the order of the original elements doesn't matter, it's a good idea to - # first sort them and then minimize: - # [ 5, 1, 4, 2 ].sort.minimize # => [ 1..2, 4..5 ] - def minimize - result = [] - last_index = size - 1 - size.times do |i| - result << [ self[0] ] if i == 0 - if self[i].succ != self[i + 1] or i == last_index - result[-1] << self[i] - result << [ self[i + 1] ] unless i == last_index - end - end - result.map! { |a, b| a..b } - end - - # First minimizes this object, then calls the replace method with the - # result. - def minimize! - replace minimize - end - - # Invert a minimized version of an object. Some small examples: - # [ 'A'..'C', 'G'..'G', 'K'..'M' ].unminimize # => [ 'A', 'B', 'C', 'G', 'K', 'L', 'M' ] - # and - # [ 1..2, 4..5 ].unminimize # => [ 1, 2, 4, 5 ] - def unminimize - result = [] - for range in self - for e in range - result << e - end - end - result - end - - # Invert a minimized version of this object in place. - def unminimize! - replace unminimize - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb deleted file mode 100644 index 91e3b6fc51..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/module_group.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Tins - module ModuleGroup - def self.[](*modules) - modul = Module.new - modules.each do |m| - m.module_eval { include modul } - end - modul - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb deleted file mode 100644 index 1b31e0af8f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/named_set.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'set' - -module Tins - class NamedSet < Set - def initialize(name) - @name = name - super() - end - - attr_accessor :name - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb deleted file mode 100644 index d974a9d8f3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/null.rb +++ /dev/null @@ -1,101 +0,0 @@ -module Tins - # Implementation of the null object pattern in Ruby. - module Null - def method_missing(*) - self - end - - def const_missing(*) - self - end - - def to_s - '' - end - - def to_str - nil - end - - def to_f - 0.0 - end - - def to_i - 0 - end - - def to_int - nil - end - - def to_a - [] - end - - def to_ary - nil - end - - def inspect - 'NULL' - end - - def nil? - true - end - - def blank? - true - end - - def as_json(*) - end - - def to_json(*) - 'null' - end - - module Kernel - def null(value = nil) - value.nil? ? Tins::NULL : value - end - - alias Null null - - def null_plus(opts = {}) - value = opts[:value] - opts[:caller] = caller - if respond_to?(:caller_locations, true) - opts[:caller_locations] = caller_locations - end - - value.nil? ? Tins::NullPlus.new(opts) : value - end - - alias NullPlus null_plus - end - end - - class NullClass < Module - include Tins::Null - end - - NULL = NullClass.new - - NULL.freeze - - class NullPlus - include Tins::Null - - def initialize(opts = {}) - singleton_class.class_eval do - opts.each do |name, value| - define_method(name) { value } - end - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb deleted file mode 100644 index 8e2800ff8c..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/once.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Tins - module Once - include File::Constants - - module_function - - def only_once(lock_filename = nil, locking_constant = nil) - lock_filename ||= $0 - locking_constant ||= LOCK_EX - f = File.new(lock_filename, RDONLY) - f.flock(locking_constant) and yield - ensure - if f - f.flock LOCK_UN - f.close - end - end - - def try_only_once(lock_filename = nil, locking_constant = nil, &block) - only_once(lock_filename, locking_constant || LOCK_EX | LOCK_NB, &block) - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb deleted file mode 100644 index e4061f4385..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/p.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'pp' - -module Tins - module P - private - - # Raise a runtime error with the inspected objects +objs+ (obtained by - # calling the #inspect method) as their message text. This is useful for - # quick debugging. - def p!(*objs) - raise((objs.size < 2 ? objs.first : objs).inspect) - end - - # Raise a runtime error with the inspected objects +objs+ (obtained by - # calling the #pretty_inspect method) as their message text. This is useful - # for quick debugging. - def pp!(*objs) - raise("\n" + (objs.size < 2 ? objs.first : objs).pretty_inspect.chomp) - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb deleted file mode 100644 index cbd382268f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/partial_application.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Tins - module PartialApplication - # If this module is included into a Proc (or similar object), it tampers - # with its Proc#arity method. - def self.included(modul) - modul.module_eval do - old_arity = instance_method(:arity) - define_method(:arity) do - defined?(@__arity__) or old_arity.bind(self).call - end - end - super - end - - # Create a partial application of this Proc (or similar object) using - # _args_ as the already applied arguments. - def partial(*args) - if args.empty? - dup - elsif args.size > arity - raise ArgumentError, "wrong number of arguments (#{args.size} for #{arity})" - else - f = lambda { |*b| call(*(args + b)) } - f.instance_variable_set :@__arity__, arity - args.size - f - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb deleted file mode 100644 index 6fefd60f97..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_compose.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Tins - module ProcCompose - def compose(other) - self.class.new do |*args| - if other.respond_to?(:call) - call(*other.call(*args)) - else - call(*other.to_proc.call(*args)) - end - end - end - - alias * compose - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb deleted file mode 100644 index 8bb6cbea3e..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/proc_prelude.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'tins/memoize' - -module Tins - module ProcPrelude - def apply(&my_proc) - my_proc or raise ArgumentError, 'a block argument is required' - lambda { |list| my_proc.call(*list) } - end - - def map_apply(my_method, *args, &my_proc) - my_proc or raise ArgumentError, 'a block argument is required' - lambda { |x, y| my_proc.call(x, y.__send__(my_method, *args)) } - end - - def call(obj, &my_proc) - my_proc or raise ArgumentError, 'a block argument is required' - obj.instance_eval(&my_proc) - end - - def array - lambda { |*list| list } - end - memoize_function :array, freeze: true - - def first - lambda { |*list| list.first } - end - memoize_function :first, freeze: true - - alias head first - - def second - lambda { |*list| list[1] } - end - memoize_function :second, freeze: true - - def tail - lambda { |*list| list[1..-1] } - end - memoize_function :tail, freeze: true - - def last - lambda { |*list| list.last } - end - memoize_function :last, freeze: true - - def rotate(n = 1) - lambda { |*list| list.rotate(n) } - end - - alias swap rotate - - def id1 - lambda { |obj| obj } - end - memoize_function :id1, freeze: true - - def const(konst = nil, &my_proc) - konst ||= my_proc.call - lambda { |*_| konst } - end - - def nth(n) - lambda { |*list| list[n] } - end - - def from(&block) - my_method, binding = block.call, block.binding - my_self = eval 'self', binding - lambda { |*list| my_self.__send__(my_method, *list) } - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb deleted file mode 100644 index 07ed9c33ad..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/range_plus.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Tins - module RangePlus - def +(other) - to_a + other.to_a - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb deleted file mode 100644 index aab9dccf4d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/require_maybe.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Tins - module RequireMaybe - def require_maybe(library) - require library - rescue LoadError => e - block_given? and yield e - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb deleted file mode 100644 index f2dd7e3468..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/responding.rb +++ /dev/null @@ -1,19 +0,0 @@ -module Tins - module Responding - def responding?(*method_names) - Class.new do - define_method(:to_s) do - "Responding to #{method_names * ', '}" - end - - alias inspect to_s - - define_method(:===) do |object| - method_names.all? do |method_name| - object.respond_to?(method_name) - end - end - end.new - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb deleted file mode 100644 index fc79904df3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/secure_write.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Tins - module SecureWrite - # Write to a file atomically - def secure_write(filename, content = nil, mode = 'w') - temp = File.new(filename + ".tmp.#$$.#{Time.now.to_f}", mode) - if content.nil? and block_given? - yield temp - elsif !content.nil? - temp.write content - else - raise ArgumentError, "either content or block argument required" - end - temp.fsync - size = temp.stat.size - temp.close - File.rename temp.path, filename - size - ensure - if temp - !temp.closed? and temp.close - File.file?(temp.path) and File.unlink temp.path - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb deleted file mode 100644 index d342df54a1..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/sexy_singleton.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'singleton' - -module Tins - - SexySingleton = Singleton.dup - - module SexySingleton - module SingletonClassMethods - end - end - - class << SexySingleton - alias __old_singleton_included__ included - - def included(klass) - __old_singleton_included__(klass) - (class << klass; self; end).class_eval do - if Object.method_defined?(:respond_to_missing?) - def respond_to_missing?(name, *args) - instance.respond_to?(name) || super - end - else - def respond_to?(name, *args) - instance.respond_to?(name) || super - end - end - - def method_missing(name, *args, &block) - if instance.respond_to?(name) - instance.__send__(name, *args, &block) - else - super - end - end - end - super - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb deleted file mode 100644 index 36f069ede2..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_byte_order_mark.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'tins/concern' - -module Tins - module StringByteOrderMark - def bom_encoding - prefix = self[0, 4].force_encoding(Encoding::ASCII_8BIT) - case prefix - when /\A\xef\xbb\xbf/n then Encoding::UTF_8 - when /\A\x00\x00\xff\xfe/n then Encoding::UTF_32BE - when /\A\xff\xfe\x00\x00/n then Encoding::UTF_32LE - when /\A\xfe\xff/n then Encoding::UTF_16BE - when /\A\xff\xfe/n then Encoding::UTF_16LE - when /\A\x2b\x2f\x76[\x38-\x39\x2b\x2f]/n then Encoding::UTF_7 - when /\A\x84\x31\x95\x33/n then Encoding::GB18030 - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb deleted file mode 100644 index 90e2f207c6..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_camelize.rb +++ /dev/null @@ -1,16 +0,0 @@ -module Tins - module StringCamelize - def camelize(first_letter = :upper) - case first_letter - when :upper, true - gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } - when :lower, false - self[0].chr.downcase + camelize[1..-1] - end - end - - alias camelcase camelize - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb deleted file mode 100644 index c2e82287ba..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_underscore.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Tins - module StringUnderscore - def underscore - word = dup - word.gsub!(/::/, '/') - word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') - word.gsub!(/([a-z\d])([A-Z])/,'\1_\2') - word.tr!("-", "_") - word.downcase! - word - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb deleted file mode 100644 index bd5cf874e2..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/string_version.rb +++ /dev/null @@ -1,104 +0,0 @@ -module Tins - module StringVersion - LEVELS = [ :major, :minor, :build, :revision ].each_with_index. - each_with_object({}) { |(k, v), h| h[k] = v }.freeze - - SYMBOLS = LEVELS.invert.freeze - - class Version - include Comparable - - def initialize(string) - string =~ /\A\d+(\.\d+)*\z/ or - raise ArgumentError, "#{string.inspect} isn't a version number" - @version = string.frozen? ? string.dup : string - end - - LEVELS.each do |symbol, level| - define_method(symbol) do - self[level] - end - - define_method("#{symbol}=") do |new_level| - self[level] = new_level - end - end - - def bump(level = array.size - 1) - level = level_of(level) - self[level] += 1 - for l in level.succ..3 - self[l] &&= 0 - end - self - end - - def level_of(specifier) - if specifier.respond_to?(:to_sym) - LEVELS.fetch(specifier) - else - specifier - end - end - - def [](level) - array[level_of(level)] - end - - def []=(level, value) - level = level_of(level) - value = value.to_i - value >= 0 or raise ArgumentError, - "version numbers can't contain negative numbers like #{value}" - a = array - a[level] = value - a.map!(&:to_i) - @version.replace a * ?. - end - - def succ! - self[-1] += 1 - self - end - - def pred! - self[-1] -= 1 - self - end - - def <=>(other) - pairs = array.zip(other.array) - pairs.map! { |a, b| [ a.to_i, b.to_i ] } - a, b = pairs.transpose - a <=> b - end - - def ==(other) - (self <=> other).zero? - end - - def array - @version.split(?.).map(&:to_i) - end - - alias to_a array - - def to_s - @version - end - - def initialize_copy(source) - super - @version = source.instance_variable_get(:@version).dup - end - - alias inspect to_s - end - - def version - Version.new(self) - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb deleted file mode 100644 index 4efa924e16..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/subhash.rb +++ /dev/null @@ -1,42 +0,0 @@ -module Tins - module Subhash - # Create a subhash from this hash, that only contains key-value pairs - # matching +patterns+ and return it. +patterns+ can be for example /^foo/ - # to put 'foobar' and 'foobaz' or 'foo'/:foo to put 'foo' into the subhash. - # - # If a block is given this method yields to it after the first pattern - # matched with a 3-tuple of +(key, value, match_data)+ using the return - # value of the block as the value of the result hash. +match_data+ is a - # MatchData instance if the matching pattern was a regular rexpression - # otherwise it is nil. - def subhash(*patterns) - patterns.map! do |pat| - pat = pat.to_sym.to_s if pat.respond_to?(:to_sym) - pat.respond_to?(:match) ? pat : pat.to_s - end - result = - if default_proc - self.class.new(&default_proc) - else - self.class.new(default) - end - if block_given? - each do |k, v| - patterns.each { |pat| - if pat === k.to_s - result[k] = yield(k, v, $~) - break - end - } - end - else - each do |k, v| - result[k] = v if patterns.any? { |pat| pat === k.to_s } - end - end - result - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb deleted file mode 100644 index bafcb857cf..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'tmpdir' - -module Tins - module TempIO - def temp_io(content: nil, name: __method__) - content.nil? and raise ArgumentError, "missing keyword: content" - name = File.basename(name.to_s) - Dir.mktmpdir do |dir| - name = File.join(dir, name) - File.open(name, 'w+b') do |io| - if content.respond_to?(:call) - if content.respond_to?(:arity) && content.arity == 1 - content.call(io) - else - io.write content.call - end - else - io.write content - end - io.rewind - yield io - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb deleted file mode 100644 index 028ce3c600..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/temp_io_enum.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'tins/temp_io' - -module Tins - module TempIO - class Enum < Enumerator - include Tins::TempIO - - def initialize(chunk_size: 2 ** 16, filename: nil, &content_proc) - content_proc or raise ArgumentError, 'need a content proc as block argument' - super() do |y| - temp_io(name: 'some-stream', content: content_proc) do |file| - until file.eof? - y.yield file.read(chunk_size) - end - end - end.tap do |enum| - if filename - enum.define_singleton_method(:filename) do - filename - end - end - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb deleted file mode 100644 index 3c2cd95489..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/terminal.rb +++ /dev/null @@ -1,42 +0,0 @@ -begin - require 'io/console' -rescue LoadError -end - -module Tins - module Terminal - - module_function - - def winsize - if IO.respond_to?(:console) - console = IO.console - if console.respond_to?(:winsize) - console.winsize - else - [] - end - else - [] - end - end - - def rows - winsize[0] || `stty size 2>/dev/null`.split[0].to_i.nonzero? || - `tput lines 2>/dev/null`.to_i.nonzero? || 25 - end - - def lines - rows - end - - def columns - winsize[1] || `stty size 2>/dev/null`.split[1].to_i.nonzero? || - `tput cols 2>/dev/null`.to_i.nonzero? || 80 - end - - def cols - columns - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb deleted file mode 100644 index cf6169cf5a..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/thread_local.rb +++ /dev/null @@ -1,57 +0,0 @@ -module Tins - module ThreadLocal - @@mutex = Mutex.new - - @@cleanup = lambda do |my_object_id| - my_id = "__thread_local_#{my_object_id}__" - @@mutex.synchronize do - for t in Thread.list - t[my_id] = nil if t[my_id] - end - end - end - - # Define a thread local variable named _name_ in this module/class. If the - # value _value_ is given, it is used to initialize the variable. - def thread_local(name, default_value = nil, &default) - is_a?(Module) or raise TypeError, "receiver has to be a Module" - - default_value && default and raise ArgumentError, - "require either default_falue or default block" - - if default_value - default = -> * { default_value } - end - - name = name.to_s - my_id = "__thread_local_#{__id__}__" - - ObjectSpace.define_finalizer(self, @@cleanup) - - define_method(name) do - values = Thread.current[my_id] ||= {} - if default && !values.key?(name) - values[name] = default.call - end - values[name] - end - - define_method("#{name}=") do |value| - Thread.current[my_id] ||= {} - Thread.current[my_id][name] = value - end - - self - end - - # Define a thread local variable for the current instance with name _name_. - # If the value _value_ is given, it is used to initialize the variable. - def instance_thread_local(name, default_value = nil, &default) - class << self - extend Tins::ThreadLocal - self - end.thread_local name, default_value, &default - self - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb deleted file mode 100644 index dc58d5735d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/time_dummy.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'time' - -module Tins - module TimeDummy - def self.included(modul) - class << modul - alias really_new new - alias really_now now - - remove_method :now rescue nil - remove_method :new rescue nil - - def dummy=(value) - if value.respond_to?(:to_str) - value = Time.parse(value.to_str) - elsif value.respond_to?(:to_time) - value = value.to_time - end - @dummy = value - end - - def dummy(value = nil) - if value.nil? - if defined?(@dummy) - @dummy - end - else - begin - old_dummy = @dummy - self.dummy = value - yield - ensure - self.dummy = old_dummy - end - end - end - - def new(*a) - if dummy - dummy.dup - elsif caller.first =~ /`now`/ - really_now - else - really_new(*a) - end - end - - def now - new - end - end - super - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb deleted file mode 100644 index 4c5947a8a8..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Tins - module To - def to(string) - shift_width = (string[/\A\s*/]).size - string.gsub(/^[^\S\n]{0,#{shift_width}}/, '') - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb deleted file mode 100644 index 110f3bbf3d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/to_proc.rb +++ /dev/null @@ -1,12 +0,0 @@ -module Tins - module ToProc - # :nocov: - def to_proc - lambda do |obj, *args| - obj.__send__(self, *args[0..-1]) - end - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb deleted file mode 100644 index 16459b2460..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/token.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'securerandom' - -module Tins - class Token < String - DEFAULT_ALPHABET = - "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".freeze - - BASE64_ALPHABET = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".freeze - - BASE64_URL_FILENAME_SAFE_ALPHABET = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".freeze - - BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".freeze - - BASE32_EXTENDED_HEX_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUV".freeze - - BASE16_ALPHABET = "0123456789ABCDEF".freeze - - def initialize(bits: 128, length: nil, alphabet: DEFAULT_ALPHABET, random: SecureRandom) - alphabet.size > 1 or raise ArgumentError, 'need at least 2 symbols in alphabet' - if length - length > 0 or raise ArgumentError, 'length has to be positive' - else - bits > 0 or raise ArgumentError, 'bits has to be positive' - length = (Math.log(1 << bits) / Math.log(alphabet.size)).ceil - end - self.bits = (Math.log(alphabet.size ** length) / Math.log(2)).floor - token = '' - length.times { token << alphabet[random.random_number(alphabet.size)] } - super token - end - - attr_accessor :bits - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb deleted file mode 100644 index fae406232b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/uniq_by.rb +++ /dev/null @@ -1,10 +0,0 @@ -module Tins - module UniqBy - def uniq_by(&b) - b ||= lambda { |x| x } - inject({}) { |h, e| h[b[e]] ||= e; h }.values - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb deleted file mode 100644 index 998bb526bf..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/unit.rb +++ /dev/null @@ -1,179 +0,0 @@ -require 'strscan' -require 'bigdecimal' - -module Tins::Unit - Prefix = Struct.new(:name, :step, :multiplier, :fraction) - - PREFIX_LC = [ - '', 'k', 'm', 'g', 't', 'p', 'e', 'z', 'y', - ].each_with_index.map { |n, i| Prefix.new(n.freeze, 1000, 1000 ** i, false) }.freeze - - PREFIX_UC = [ - '', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', - ].each_with_index.map { |n, i| Prefix.new(n.freeze, 1024, 1024 ** i, false) }.freeze - - PREFIX_F = [ - '', 'm', 'µ', 'n', 'p', 'f', 'a', 'z', 'y', - ].each_with_index.map { |n, i| Prefix.new(n.freeze, 1000, 1000 ** -i, true) }.freeze - - class ParserError < ArgumentError; end - - module_function - - def prefixes(identifier) - case identifier - when :uppercase, :uc, 1024 - PREFIX_UC - when :lowercase, :lc, 1000 - PREFIX_LC - when :fraction, :f, 0.001 - PREFIX_F - when Array - identifier - end - end - - def format(value, format: '%f %U', prefix: 1024, unit: ?b) - prefixes = prefixes(prefix) - first_prefix = prefixes.first or - raise ArgumentError, 'a non-empty array of prefixes is required' - if value.zero? - result = format.sub('%U', unit) - result %= value - else - prefix = prefixes[ - (first_prefix.fraction ? -1 : 1) * Math.log(value.abs) / Math.log(first_prefix.step) - ] - result = format.sub('%U', "#{prefix.name}#{unit}") - result %= (value / prefix.multiplier.to_f) - end - end - - class UnitParser < StringScanner - NUMBER = /([+-]? - (?:0|[1-9]\d*) - (?: - \.\d+(?i:e[+-]?\d+) | - \.\d+ | - (?i:e[+-]?\d+) - )? - )/x - - def initialize(source, unit, prefixes = nil) - super source - if prefixes - @unit_re = unit_re(Tins::Unit.prefixes(prefixes), unit) - @unit_lc_re = @unit_uc_re = nil - else - @unit_lc_re = unit_re(Tins::Unit.prefixes(:lc), unit) - @unit_uc_re = unit_re(Tins::Unit.prefixes(:uc), unit) - @unit_re = nil - end - @number = 1.0 - end - - def unit_re(prefixes, unit) - re = Regexp.new( - "(#{prefixes.reverse.map { |pre| Regexp.quote(pre.name) } * ?|})(#{unit})" - ) - re.singleton_class.class_eval do - define_method(:prefixes) { prefixes } - end - re - end - - private :unit_re - - attr_reader :number - - def scan(re) - re.nil? and return - super - end - - def scan_number - scan(NUMBER) or return - @number *= BigDecimal(self[1]) - end - - def scan_unit - case - when scan(@unit_re) - prefix = @unit_re.prefixes.find { |pre| pre.name == self[1] } or return - @number *= prefix.multiplier - when scan(@unit_lc_re) - prefix = @unit_lc_re.prefixes.find { |pre| pre.name == self[1] } or return - @number *= prefix.multiplier - when scan(@unit_uc_re) - prefix = @unit_uc_re.prefixes.find { |pre| pre.name == self[1] } or return - @number *= prefix.multiplier - end - end - - def scan_char(char) - scan(/#{char}/) or return - end - - def parse - raise NotImplementedError - end - end - - class FormatParser < StringScanner - def initialize(format, unit_parser) - super format - @unit_parser = unit_parser - end - - def reset - super - @unit_parser.reset - end - - def location - @unit_parser.peek(10).inspect - end - - private :location - - def parse - reset - until eos? || @unit_parser.eos? - case - when scan(/%f/) - @unit_parser.scan_number or - raise ParserError, "\"%f\" expected at #{location}" - when scan(/%U/) - @unit_parser.scan_unit or - raise ParserError, "\"%U\" expected at #{location}" - when scan(/%%/) - @unit_parser.scan_char(?%) or - raise ParserError, "#{?%.inspect} expected at #{location}" - else - char = scan(/./) - @unit_parser.scan_char(char) or - raise ParserError, "#{char.inspect} expected at #{location}" - end - end - unless eos? && @unit_parser.eos? - raise ParserError, - "format #{string.inspect} and string "\ - "#{@unit_parser.string.inspect} do not match" - end - @unit_parser.number - end - end - - # Parse the string +string+ if it matches +format+ with the unit +unit+ and - # the prefixes specified by +prefix+. - def parse(string, format: '%f %U', unit: ?b, prefix: nil) - prefixes = prefixes(prefix) - FormatParser.new(format, UnitParser.new(string, unit, prefixes)).parse - end - - def parse?(string, **options) - parse(string, **options) - rescue ParserError - nil - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb deleted file mode 100644 index 16e1a7177b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/version.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Tins - # Tins version - VERSION = '1.25.0' - VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc: - VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc: - VERSION_MINOR = VERSION_ARRAY[1] # :nodoc: - VERSION_BUILD = VERSION_ARRAY[2] # :nodoc: -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb deleted file mode 100644 index 8a6eab1755..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/write.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'tins/secure_write' - -module Tins - module Write - def self.extended(modul) - modul.extend SecureWrite - if modul.respond_to?(:write) - $DEBUG and warn "Skipping inclusion of Tins::Write#write method, include Tins::Write::SecureWrite#secure_write instead" - else - class << modul; self; end.instance_eval do - alias_method :write, :secure_write - end - end - super - end - end -end - -require 'tins/alias' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb deleted file mode 100644 index 9d7b263825..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'tins' - -module Tins - require 'tins/xt/attempt' - require 'tins/xt/blank' - require 'tins/xt/count_by' - require 'tins/xt/deep_dup' - require 'tins/xt/file_binary' - require 'tins/xt/full' - require 'tins/xt/hash_symbolize_keys_recursive' - require 'tins/xt/hash_union' - require 'tins/xt/irb' - require 'tins/xt/named' - require 'tins/xt/null' - require 'tins/xt/p' - require 'tins/xt/partial_application' - require 'tins/xt/range_plus' - require 'tins/xt/require_maybe' - require 'tins/xt/secure_write' - require 'tins/xt/string' - require 'tins/xt/subhash' - require 'tins/xt/time_dummy' - require 'tins/xt/date_dummy' - require 'tins/xt/date_time_dummy' - require 'tins/xt/uniq_by' - require 'tins/xt/write' - require 'tins/xt/if_predicate' - require 'tins/xt/ask_and_send' - require 'tins/xt/extract_last_argument_options' - require 'tins/xt/deep_const_get' - require 'tins/xt/responding' - require 'tins/xt/proc_compose' - require 'tins/xt/proc_prelude' - require 'tins/xt/sexy_singleton' - require 'tins/xt/method_description' - require 'tins/xt/annotate' - require 'tins/xt/concern' - require 'tins/xt/dslkit' - require 'tins/xt/time_freezer' - require 'tins/xt/case_predicate' - require 'tins/xt/implement' - require 'tins/xt/complete' - require 'tins/xt/expose' - require 'tins/xt/temp_io' -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb deleted file mode 100644 index 82118aab6f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/annotate.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'tins/annotate' - -class Module - include Tins::Annotate -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb deleted file mode 100644 index 84ca6fdf6d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/ask_and_send.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/ask_and_send' - -module Tins - class ::Object - include Tins::AskAndSend - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb deleted file mode 100644 index 40d5e0de10..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/attempt.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/attempt' - -module Tins - class ::Object - include Tins::Attempt - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb deleted file mode 100644 index d6833928c9..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/blank.rb +++ /dev/null @@ -1,67 +0,0 @@ -module Tins - module Blank - module Object - def blank? - respond_to?(:empty?) ? empty? : !self - end - - def present? - !blank? - end - end - - module NilClass - def blank? - true - end - end - - module FalseClass - def blank? - true - end - end - - module TrueClass - def blank? - false - end - end - - module Array - def self.included(modul) - modul.module_eval do - alias_method :blank?, :empty? - end - end - end - - module Hash - def self.included(modul) - modul.module_eval do - alias_method :blank?, :empty? - end - end - end - - module String - def blank? - self !~ /\S/ - end - end - - module Numeric - def blank? - false - end - end - end -end - -unless Object.respond_to?(:blank?) - for k in Tins::Blank.constants - Object.const_get(k).class_eval do - include Tins::Blank.const_get(k) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb deleted file mode 100644 index c688acf611..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/case_predicate.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'tins/case_predicate' - -module Tins - class ::Object - include Tins::CasePredicate - end -end - diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb deleted file mode 100644 index 94a0712b67..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/complete.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/complete' - -module Tins - class ::Object - include Tins::Complete - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb deleted file mode 100644 index e4e5d0269b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/concern.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'tins/concern' - -module Tins - module Concern - module ModuleMixin - def tins_concern_configure(*args) - Thread.current[:tin_concern_args] = args - self - end - - def tins_concern_args - Thread.current[:tin_concern_args] - end - end - end - - class ::Module - include Tins::Concern::ModuleMixin - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb deleted file mode 100644 index 3455bdc2bd..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/count_by.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'tins/count_by' - -module Tins - module ::Enumerable - include CountBy - end - - class ::Array - include CountBy - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb deleted file mode 100644 index 5a3bbaed48..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_dummy.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/date_dummy' - -module Tins - class ::Date - include DateDummy - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb deleted file mode 100644 index 4c290366f8..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/date_time_dummy.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/date_time_dummy' - -module Tins - class ::DateTime - include DateTimeDummy - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb deleted file mode 100644 index e8dbb5674b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_const_get.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/deep_const_get' - -module Tins - class ::Object - include DeepConstGet - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb deleted file mode 100644 index f9c0b48a55..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/deep_dup.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/deep_dup' - -module Tins - class ::Object - include Tins::DeepDup - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb deleted file mode 100644 index 4b56232837..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/dslkit.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'tins' - -module Tins - class ::Module - include Tins::Constant - include Tins::DSLAccessor - include Tins::ClassMethod - include Tins::Delegate - include Tins::ParameterizedModule - include Tins::FromModule - end - - class ::Object - include Tins::ThreadLocal - include Tins::ThreadGlobal - include Tins::Interpreter - include Tins::Deflect - include Tins::ThreadLocal - include Tins::Eigenclass - include Tins::BlockSelf - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb deleted file mode 100644 index 10c80c5461..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/expose.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'tins/expose' - -class ::Object - include Tins::Expose -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb deleted file mode 100644 index 794a7d7321..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/extract_last_argument_options.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/extract_last_argument_options' - -module Tins - class ::Array - include ExtractLastArgumentOptions - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb deleted file mode 100644 index c2f02a4500..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/file_binary.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/file_binary' - -module Tins - class ::File - include FileBinary - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb deleted file mode 100644 index 1c9048f490..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/full.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'tins/xt/blank' - -module Tins - module Full - # Returns the object if it isn't blank (as in Object#blank?), otherwise it - # returns nil. If a block was given as an argument and the object isn't - # blank, the block is executed with the object as its first argument. If an - # argument +dispatch+ was given and the object wasn't blank the method - # given by dispatch is called on the object. This is the same as - # foo.full?(&:bar) in the previous block form. - def full?(dispatch = nil, *args) - if blank? - obj = nil - #elsif Module === dispatch # TODO - # dispatch.found?(self) - elsif dispatch - obj = __send__(dispatch, *args) - obj = nil if obj.blank? - else - obj = self - end - if block_given? and obj - yield obj - else - obj - end - end - - def all_full? - if respond_to?(:all?) && all?(&:full?) - block_given? ? yield(self) : self - end - end - end - - class ::Object - include Full - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb deleted file mode 100644 index 162b9d1e32..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_symbolize_keys_recursive.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/hash_symbolize_keys_recursive' - -module Tins - class ::Hash - include HashSymbolizeKeysRecursive - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb deleted file mode 100644 index 22ad94194a..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/hash_union.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'tins/hash_union' - -module Tins - class ::Hash - if method_defined?(:|) - warn "#{self}#| already defined, didn't include at #{__FILE__}:#{__LINE__}" - else - include HashUnion - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb deleted file mode 100644 index 1c0ee6e10f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/if_predicate.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/if_predicate' - -module Tins - class ::Object - include Tins::IfPredicate - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb deleted file mode 100644 index 3f4b7963ee..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/implement.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'tins/implement' - -class Module - include Tins::Implement -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb deleted file mode 100644 index 920f61b615..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/irb.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'irb' - -module Tins - IRB = ::IRB - - module ::IRB - def self.examine(binding = TOPLEVEL_BINDING) - setup nil - workspace = WorkSpace.new binding - irb = Irb.new workspace - @CONF[:MAIN_CONTEXT] = irb.context - catch(:IRB_EXIT) { irb.eval_input } - rescue Interrupt - exit - end - end - - class ::Object - def examine(binding = TOPLEVEL_BINDING) - IRB.examine(binding) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb deleted file mode 100644 index b5ca8cc095..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/method_description.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'tins/method_description' - -module Tins - class ::UnboundMethod - include MethodDescription - - alias to_s description - - def inspect - "#<#{self.class}: #{description}>" - end - end - - class ::Method - include MethodDescription - - alias to_s description - - def inspect - "#<#{self.class}: #{description}>" - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb deleted file mode 100644 index 7c15116e70..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/named.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'tins/xt/string_version' - -class Object - def named(name, method, *args, &named_block) - extend Module.new { - define_method(name) do |*rest, &block| - block = named_block if named_block - __send__(method, *(args + rest), &block) - end - } - end -end - -class Module - def named(name, method, *args, &named_block) - include Module.new { - define_method(name) do |*rest, &block| - block = named_block if named_block - __send__(method, *(args + rest), &block) - end - } - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb deleted file mode 100644 index 37455d3a2c..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/null.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'tins/null' - -module Tins - ::NULL = Tins::NULL - - class ::Object - include Tins::Null::Kernel - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb deleted file mode 100644 index 775f2bb3ee..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/p.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/p' - -module Tins - class ::Object - include Tins::P - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb deleted file mode 100644 index 9c05b840b5..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/partial_application.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'tins/partial_application' - -module Tins - class ::Proc - include PartialApplication - end - - class ::Method - include PartialApplication - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb deleted file mode 100644 index 2bde627e71..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_compose.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/proc_compose' - -module Tins - class ::Proc - include Tins::ProcCompose - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb deleted file mode 100644 index ed64d2187f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/proc_prelude.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/proc_prelude' - -module Tins - class ::Proc - extend Tins::ProcPrelude - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb deleted file mode 100644 index fc6cc4fdee..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/range_plus.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'tins/range_plus' - -module Tins - class ::Range - if method_defined?(:+) - warn "#{self}#+ already defined, didn't include at #{__FILE__}:#{__LINE__}" - else - include RangePlus - end - end -end - diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb deleted file mode 100644 index ae6d9e15ff..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/require_maybe.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/require_maybe' - -module Tins - class ::Object - include Tins::RequireMaybe - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb deleted file mode 100644 index ec626b3653..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/responding.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/responding' - -module Tins - class ::Object - include Tins::Responding - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb deleted file mode 100644 index 86aeb82527..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/secure_write.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'tins/secure_write' - -module Tins - #class ::Object - # include Tins::SecureWrite - #end - - class ::IO - extend Tins::SecureWrite - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb deleted file mode 100644 index 2182c99f34..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/sexy_singleton.rb +++ /dev/null @@ -1,3 +0,0 @@ -module Tins - ::SexySingleton = Tins::SexySingleton -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb deleted file mode 100644 index 9a4661ac13..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Tins - require 'tins/xt/string_camelize' - require 'tins/xt/string_underscore' - require 'tins/xt/string_version' - require 'tins/xt/string_byte_order_mark' -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb deleted file mode 100644 index 06694bee66..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_byte_order_mark.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Tins - require 'tins/string_byte_order_mark' - class ::String - include StringByteOrderMark - end -end - diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb deleted file mode 100644 index 0b19427fa3..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_camelize.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Tins - require 'tins/string_camelize' - class ::String - include StringCamelize - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb deleted file mode 100644 index 48d9aa03c8..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_underscore.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Tins - require 'tins/string_underscore' - class ::String - include StringUnderscore - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb deleted file mode 100644 index fc46c81057..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/string_version.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Tins - require 'tins/string_version' - - class ::String - include StringVersion - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb deleted file mode 100644 index 4d1485458d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/subhash.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'tins/subhash' - -module Tins - class ::Hash - include Tins::Subhash - - def subhash!(*patterns) - replace subhash(*patterns) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb deleted file mode 100644 index a0ba260f94..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/temp_io.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'tins/temp_io' - -class ::Object - include Tins::TempIO -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb deleted file mode 100644 index 8b1a4e52dd..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_dummy.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'tins/time_dummy' - -module Tins - class ::Time - include TimeDummy - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb deleted file mode 100644 index 768dedde12..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/time_freezer.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'tins/xt/time_dummy' -require 'tins/xt/date_time_dummy' -require 'tins/xt/date_dummy' - -module Tins::TimeFreezer - def self.freeze(time) - Time.dummy(time) do - DateTime.dummy(time) do - Date.dummy(time) do - yield - end - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb deleted file mode 100644 index b1c8c21475..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/to.rb +++ /dev/null @@ -1,5 +0,0 @@ -module Tins - class ::Object - include ::Tins::To - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb deleted file mode 100644 index 87eca8b10d..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/uniq_by.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'tins/uniq_by' - -module Tins - module ::Enumerable - include UniqBy - end - - class ::Array - include UniqBy - - def uniq_by!(&b) - replace uniq_by(&b) - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb deleted file mode 100644 index 7c8071709f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/lib/tins/xt/write.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'tins/write' - -module Tins - #class ::Object - # include Tins::Write - #end - - class ::IO - extend Tins::Write - end -end diff --git a/completions/internal_commands_list.txt b/completions/internal_commands_list.txt index 3beacf0b09..efdf978359 100644 --- a/completions/internal_commands_list.txt +++ b/completions/internal_commands_list.txt @@ -12,6 +12,7 @@ abv analytics audit bottle +bump bump-formula-pr bump-revision cask diff --git a/docs/Manpage.md b/docs/Manpage.md index aaabdb46e6..611e106b48 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -696,6 +696,11 @@ at its original value, while `--no-rebuild` will remove it. * `--root-url`: Use the specified *`URL`* as the root of the bottle's URL instead of Homebrew's default. +### `bump` + +Display out-of-date brew formulae, the latest version available, and whether a +pull request has been opened. + ### `bump-formula-pr` [*`options`*] [*`formula`*] Create a pull request to update *`formula`* with a new URL or a new tag. diff --git a/manpages/brew.1 b/manpages/brew.1 index 4972791289..f527e36b0c 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -906,6 +906,9 @@ When passed with \fB\-\-write\fR, a new commit will not generated after writing \fB\-\-root\-url\fR Use the specified \fIURL\fR as the root of the bottle\'s URL instead of Homebrew\'s default\. . +.SS "\fBbump\fR" +Display out\-of\-date brew formulae, the latest version available, and whether a pull request has been opened\. +. .SS "\fBbump\-formula\-pr\fR [\fIoptions\fR] [\fIformula\fR]" Create a pull request to update \fIformula\fR with a new URL or a new tag\. .