diff --git a/features/063_cookbook_incorrectly_depends_on_itself.feature b/features/063_cookbook_incorrectly_depends_on_itself.feature deleted file mode 100644 index dafdafdd..00000000 --- a/features/063_cookbook_incorrectly_depends_on_itself.feature +++ /dev/null @@ -1,15 +0,0 @@ -Feature: Check for metadata using suggests keyword - - In order to avoid pathological depsolving issues - As a developer - I want to identify cookbooks that depend on themselves and remove that (unnecessary) dependency - - Scenario: Metadata with self dependency - Given a cookbook with metadata that includes a self dependency - When I check the cookbook - Then the metadata with self dependency warning 063 should be shown against the metadata file - - Scenario: Metadata without self dependency - Given a cookbook with metadata that does not include a self dependency - When I check the cookbook - Then the metadata with self dependency warning 063 should be not shown against the metadata file diff --git a/features/064_check_for_no_issues_url.feature b/features/064_check_for_no_issues_url.feature deleted file mode 100644 index cad31cbb..00000000 --- a/features/064_check_for_no_issues_url.feature +++ /dev/null @@ -1,25 +0,0 @@ -Feature: Check for no issues_url - - In order to be able to share my cookbook on the Supermarket - As a developer - I want to be notified when my cookbook metadata does not specify the issues_url - - Scenario: Metadata without a issues_url - Given a cookbook with metadata that does not include a issues_url keyword - When I check the cookbook - Then the metadata missing issues_url warning 064 should be shown against the metadata file - - Scenario: Metadata with a issues_url - Given a cookbook with metadata that includes a issues_url keyword - When I check the cookbook - Then the metadata missing issues_url warning 064 should be not shown against the metadata file - - Scenario: Metadata with a issues_url that is an expression - Given a cookbook with metadata that includes a issues_url expression - When I check the cookbook - Then the metadata missing issues_url warning 064 should be not shown against the metadata file - - Scenario: Cookbook without metadata file - Given a cookbook that does not have defined metadata - When I check the cookbook - Then the metadata missing issues_url warning 064 should be not shown against the metadata file diff --git a/features/065_check_for_no_source_url.feature b/features/065_check_for_no_source_url.feature deleted file mode 100644 index b63b4cb6..00000000 --- a/features/065_check_for_no_source_url.feature +++ /dev/null @@ -1,25 +0,0 @@ -Feature: Check for no source_url - - In order to be able to share my cookbook on the Supermarket - As a developer - I want to be notified when my cookbook metadata does not specify the source_url - - Scenario: Metadata without a source_url - Given a cookbook with metadata that does not include a source_url keyword - When I check the cookbook - Then the metadata missing source_url warning 065 should be shown against the metadata file - - Scenario: Metadata with a source_url - Given a cookbook with metadata that includes a source_url keyword - When I check the cookbook - Then the metadata missing source_url warning 065 should be not shown against the metadata file - - Scenario: Metadata with a source_url that is an expression - Given a cookbook with metadata that includes a source_url expression - When I check the cookbook - Then the metadata missing source_url warning 065 should be not shown against the metadata file - - Scenario: Cookbook without metadata file - Given a cookbook that does not have defined metadata - When I check the cookbook - Then the metadata missing source_url warning 065 should be not shown against the metadata file diff --git a/features/step_definitions/cookbook_steps.rb b/features/step_definitions/cookbook_steps.rb index ed63264d..b7616d11 100644 --- a/features/step_definitions/cookbook_steps.rb +++ b/features/step_definitions/cookbook_steps.rb @@ -2505,47 +2505,3 @@ class Site < Chef::Resource::LWRPBase version magic_version_generator('and its args') } end - -Given(/^a cookbook with metadata that (includes|does not include) a self dependency$/) do |includes| - write_metadata %Q{ - name 'bar' - depends 'baz' - #{"depends 'bar'" if includes == 'includes'} - } -end - -Then(/^the metadata with self dependency warning 063 should be (shown|not shown) against the metadata file$/) do |show_warning| - if show_warning == "shown" - expect_warning("FC063", :file => "metadata.rb", :line => 3, :expect_warning => true) - else - expect_warning("FC063", :file => "metadata.rb", :expect_warning => false) - end -end - -Given(/^a cookbook with metadata that (includes|does not include) a issues_url keyword$/) do |includes| - write_metadata %Q{ - #{"issues_url 'http://github.com/foo/bar_cookbook/issues'" if includes == 'includes'} - } -end - -Given(/^a cookbook with metadata that includes a issues_url expression$/) do - write_metadata "issues_url an(expression)" -end - -Then(/^the metadata missing issues_url warning 064 should be (shown|not shown) against the metadata file$/) do |show_warning| - expect_warning("FC064", :file => "metadata.rb", :expect_warning => show_warning == "shown") -end - -Given(/^a cookbook with metadata that (includes|does not include) a source_url keyword$/) do |includes| - write_metadata %Q{ - #{"source_url 'http://github.com/foo/bar_cookbook/'" if includes == 'includes'} - } -end - -Then(/^the metadata missing source_url warning 065 should be (shown|not shown) against the metadata file$/) do |show_warning| - expect_warning("FC065", :file => "metadata.rb", :expect_warning => show_warning == "shown") -end - -Given(/^a cookbook with metadata that includes a source_url expression$/) do - write_metadata "source_url an(expression)" -end diff --git a/lib/foodcritic/rules/fc069.rb b/lib/foodcritic/rules/fc069.rb new file mode 100644 index 00000000..b4a7c00a --- /dev/null +++ b/lib/foodcritic/rules/fc069.rb @@ -0,0 +1,365 @@ +rule "FC069", "Ensure standardized license defined in metadata" do + tags %w{metadata} + metadata do |ast, filename| + begin + license = ast.xpath(%Q{//command[ident/@value='license']/ + descendant::tstring_content}).attribute("value").to_s + + # list of valid SPDX.org license strings. To build an array run this: + # require 'json' + # require 'net/http' + # json_data = JSON.parse(Net::HTTP.get(URI('https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json'))) + # licenses = json_data['licenses'].map {|l| l['licenseId'] } + # + valid = %w{ + Glide + Abstyles + AFL-1.1 + AFL-1.2 + AFL-2.0 + AFL-2.1 + AFL-3.0 + AMPAS + APL-1.0 + Adobe-Glyph + APAFML + Adobe-2006 + AGPL-1.0 + Afmparse + Aladdin + ADSL + AMDPLPA + ANTLR-PD + Apache-1.0 + Apache-1.1 + Apache-2.0 + AML + APSL-1.0 + APSL-1.1 + APSL-1.2 + APSL-2.0 + Artistic-1.0 + Artistic-1.0-Perl + Artistic-1.0-cl8 + Artistic-2.0 + AAL + Bahyph + Barr + Beerware + BitTorrent-1.0 + BitTorrent-1.1 + BSL-1.0 + Borceux + BSD-2-Clause + BSD-2-Clause-FreeBSD + BSD-2-Clause-NetBSD + BSD-3-Clause + BSD-3-Clause-Clear + BSD-3-Clause-No-Nuclear-License + BSD-3-Clause-No-Nuclear-License-2014 + BSD-3-Clause-No-Nuclear-Warranty + BSD-4-Clause + BSD-Protection + BSD-Source-Code + BSD-3-Clause-Attribution + 0BSD + BSD-4-Clause-UC + bzip2-1.0.5 + bzip2-1.0.6 + Caldera + CECILL-1.0 + CECILL-1.1 + CECILL-2.0 + CECILL-2.1 + CECILL-B + CECILL-C + ClArtistic + MIT-CMU + CNRI-Jython + CNRI-Python + CNRI-Python-GPL-Compatible + CPOL-1.02 + CDDL-1.0 + CDDL-1.1 + CPAL-1.0 + CPL-1.0 + CATOSL-1.1 + Condor-1.1 + CC-BY-1.0 + CC-BY-2.0 + CC-BY-2.5 + CC-BY-3.0 + CC-BY-4.0 + CC-BY-ND-1.0 + CC-BY-ND-2.0 + CC-BY-ND-2.5 + CC-BY-ND-3.0 + CC-BY-ND-4.0 + CC-BY-NC-1.0 + CC-BY-NC-2.0 + CC-BY-NC-2.5 + CC-BY-NC-3.0 + CC-BY-NC-4.0 + CC-BY-NC-ND-1.0 + CC-BY-NC-ND-2.0 + CC-BY-NC-ND-2.5 + CC-BY-NC-ND-3.0 + CC-BY-NC-ND-4.0 + CC-BY-NC-SA-1.0 + CC-BY-NC-SA-2.0 + CC-BY-NC-SA-2.5 + CC-BY-NC-SA-3.0 + CC-BY-NC-SA-4.0 + CC-BY-SA-1.0 + CC-BY-SA-2.0 + CC-BY-SA-2.5 + CC-BY-SA-3.0 + CC-BY-SA-4.0 + CC0-1.0 + Crossword + CrystalStacker + CUA-OPL-1.0 + Cube + curl + D-FSL-1.0 + diffmark + WTFPL + DOC + Dotseqn + DSDP + dvipdfm + EPL-1.0 + ECL-1.0 + ECL-2.0 + eGenix + EFL-1.0 + EFL-2.0 + MIT-advertising + MIT-enna + Entessa + ErlPL-1.1 + EUDatagrid + EUPL-1.0 + EUPL-1.1 + Eurosym + Fair + MIT-feh + Frameworx-1.0 + FreeImage + FTL + FSFAP + FSFUL + FSFULLR + Giftware + GL2PS + Glulxe + AGPL-3.0 + GFDL-1.1 + GFDL-1.2 + GFDL-1.3 + GPL-1.0 + GPL-2.0 + GPL-3.0 + LGPL-2.1 + LGPL-3.0 + LGPL-2.0 + gnuplot + gSOAP-1.3b + HaskellReport + HPND + IBM-pibs + IPL-1.0 + ICU + ImageMagick + iMatix + Imlib2 + IJG + Info-ZIP + Intel-ACPI + Intel + Interbase-1.0 + IPA + ISC + JasPer-2.0 + JSON + LPPL-1.0 + LPPL-1.1 + LPPL-1.2 + LPPL-1.3a + LPPL-1.3c + Latex2e + BSD-3-Clause-LBNL + Leptonica + LGPLLR + Libpng + libtiff + LAL-1.2 + LAL-1.3 + LiLiQ-P-1.1 + LiLiQ-Rplus-1.1 + LiLiQ-R-1.1 + LPL-1.02 + LPL-1.0 + MakeIndex + MTLL + MS-PL + MS-RL + MirOS + MITNFA + MIT + Motosoto + MPL-1.0 + MPL-1.1 + MPL-2.0 + MPL-2.0-no-copyleft-exception + mpich2 + Multics + Mup + NASA-1.3 + Naumen + NBPL-1.0 + Net-SNMP + NetCDF + NGPL + NOSL + NPL-1.0 + NPL-1.1 + Newsletr + NLPL + Nokia + NPOSL-3.0 + NLOD-1.0 + Noweb + NRL + NTP + Nunit + OCLC-2.0 + ODbL-1.0 + PDDL-1.0 + OCCT-PL + OGTSL + OLDAP-2.2.2 + OLDAP-1.1 + OLDAP-1.2 + OLDAP-1.3 + OLDAP-1.4 + OLDAP-2.0 + OLDAP-2.0.1 + OLDAP-2.1 + OLDAP-2.2 + OLDAP-2.2.1 + OLDAP-2.3 + OLDAP-2.4 + OLDAP-2.5 + OLDAP-2.6 + OLDAP-2.7 + OLDAP-2.8 + OML + OPL-1.0 + OSL-1.0 + OSL-1.1 + OSL-2.0 + OSL-2.1 + OSL-3.0 + OpenSSL + OSET-PL-2.1 + PHP-3.0 + PHP-3.01 + Plexus + PostgreSQL + psfrag + psutils + Python-2.0 + QPL-1.0 + Qhull + Rdisc + RPSL-1.0 + RPL-1.1 + RPL-1.5 + RHeCos-1.1 + RSCPL + RSA-MD + Ruby + SAX-PD + Saxpath + SCEA + SWL + SMPPL + Sendmail + SGI-B-1.0 + SGI-B-1.1 + SGI-B-2.0 + OFL-1.0 + OFL-1.1 + SimPL-2.0 + Sleepycat + SNIA + Spencer-86 + Spencer-94 + Spencer-99 + SMLNJ + SugarCRM-1.1.3 + SISSL + SISSL-1.2 + SPL-1.0 + Watcom-1.0 + TCL + TCP-wrappers + Unlicense + TMate + TORQUE-1.1 + TOSL + Unicode-DFS-2015 + Unicode-DFS-2016 + Unicode-TOU + UPL-1.0 + NCSA + Vim + VOSTROM + VSL-1.0 + W3C-20150513 + W3C-19980720 + W3C + Wsuipa + Xnet + X11 + Xerox + XFree86-1.1 + xinetd + xpp + XSkat + YPL-1.0 + YPL-1.1 + Zed + Zend-2.0 + Zimbra-1.3 + Zimbra-1.4 + Zlib + zlib-acknowledgement + ZPL-1.1 + ZPL-2.0 + ZPL-2.1 + eCos-2.0 + GPL-1.0+ + GPL-2.0+ + GPL-2.0-with-autoconf-exception + GPL-2.0-with-bison-exception + GPL-2.0-with-classpath-exception + GPL-2.0-with-font-exception + GPL-2.0-with-GCC-exception + GPL-3.0+ + GPL-3.0-with-autoconf-exception + GPL-3.0-with-GCC-exception + LGPL-2.1+ + LGPL-3.0+ + LGPL-2.0+ + StandardML-NJ + WXwindows + } + valid << "All Rights Reserved" # Chef-DK's non-standard extra value + [file_match(filename)] unless valid.include?(license) + rescue NoMethodError # no license in the metadata + [file_match(filename)] + end + end +end diff --git a/spec/functional/fc063_spec.rb b/spec/functional/fc063_spec.rb new file mode 100644 index 00000000..f0832531 --- /dev/null +++ b/spec/functional/fc063_spec.rb @@ -0,0 +1,18 @@ +require "spec_helper" + +describe "FC063" do + context "with a cookbook with a metadata file that depends on itself" do + metadata_file "name 'something'\ndepends 'something'" + it { is_expected.to violate_rule("FC063") } + end + + context "with a cookbook with a metadata file that depends on a cookbook, but not itself" do + metadata_file "name 'something'\ndepends 'another_thing'" + it { is_expected.to_not violate_rule("FC063") } + end + + context "with a cookbook with a metadata file that doesn't depend on any cookbooks" do + metadata_file "name 'something'" + it { is_expected.to_not violate_rule("FC063") } + end +end diff --git a/spec/functional/fc064_spec.rb b/spec/functional/fc064_spec.rb new file mode 100644 index 00000000..677b461d --- /dev/null +++ b/spec/functional/fc064_spec.rb @@ -0,0 +1,13 @@ +require "spec_helper" + +describe "FC064" do + context "with a cookbook with a metadata file that does not specify issues_url" do + metadata_file + it { is_expected.to violate_rule("FC064") } + end + + context "with a cookbook with a metadata file that specifies a issues_url" do + metadata_file "issues_url 'http://wwww.something.com/'" + it { is_expected.to_not violate_rule("FC064") } + end +end diff --git a/spec/functional/fc065_spec.rb b/spec/functional/fc065_spec.rb new file mode 100644 index 00000000..2a34f4d0 --- /dev/null +++ b/spec/functional/fc065_spec.rb @@ -0,0 +1,13 @@ +require "spec_helper" + +describe "FC065" do + context "with a cookbook with a metadata file that does not specify source_url" do + metadata_file + it { is_expected.to violate_rule("FC065") } + end + + context "with a cookbook with a metadata file that specifies a source_url" do + metadata_file "source_url 'http://wwww.something.com/'" + it { is_expected.to_not violate_rule("FC065") } + end +end diff --git a/spec/functional/fc069_spec.rb b/spec/functional/fc069_spec.rb new file mode 100644 index 00000000..bdd7da92 --- /dev/null +++ b/spec/functional/fc069_spec.rb @@ -0,0 +1,23 @@ +require "spec_helper" + +describe "FC069" do + context "with a cookbook with a metadata file that specifies a license generated by knife cookbook create" do + metadata_file "license 'Apache 2.0'" + it { is_expected.to violate_rule("FC069") } + end + + context "with a cookbook with a metadata file that specifies a license generated by chef generate cookbook" do + metadata_file "license 'apache_2'" + it { is_expected.to violate_rule("FC069") } + end + + context "with a cookbook with a metadata file that specifies a valid SPDX license" do + metadata_file "license 'Apache-2.0'" + it { is_expected.to_not violate_rule("FC069") } + end + + context "with a cookbook with a metadata file that specifies ChefDK's non-SPDX all rights reserved string" do + metadata_file "license 'All Rights Reserved'" + it { is_expected.to_not violate_rule("FC069") } + end +end