Hello community, here is the log from the commit of package rubygem-mixlib-cli for openSUSE:Factory checked in at 2016-05-29 03:11:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-mixlib-cli (Old) and /work/SRC/openSUSE:Factory/.rubygem-mixlib-cli.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-mixlib-cli" Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-mixlib-cli/rubygem-mixlib-cli.changes 2014-10-14 07:13:18.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-mixlib-cli.new/rubygem-mixlib-cli.changes 2016-05-29 03:12:39.000000000 +0200 @@ -1,0 +2,6 @@ +Fri May 6 04:40:27 UTC 2016 - co...@suse.com + +- updated to version 1.6.0 + no changelog found + +------------------------------------------------------------------- Old: ---- mixlib-cli-1.5.0.gem New: ---- mixlib-cli-1.6.0.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-mixlib-cli.spec ++++++ --- /var/tmp/diff_new_pack.ZNUwFs/_old 2016-05-29 03:12:41.000000000 +0200 +++ /var/tmp/diff_new_pack.ZNUwFs/_new 2016-05-29 03:12:41.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package rubygem-mixlib-cli # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,8 +16,15 @@ # +# +# This file was generated with a gem2rpm.yml and not just plain gem2rpm. +# All sections marked as MANUAL, license headers, summaries and descriptions +# can be maintained in that file. Please consult this file before editing any +# of those fields +# + Name: rubygem-mixlib-cli -Version: 1.5.0 +Version: 1.6.0 Release: 0 %define mod_name mixlib-cli %define mod_full_name %{mod_name}-%{version} @@ -25,7 +32,7 @@ BuildRequires: %{rubygem gem2rpm} BuildRequires: %{ruby} BuildRequires: ruby-macros >= 5 -Url: http://www.opscode.com +Url: https://www.chef.io Source: http://rubygems.org/gems/%{mod_full_name}.gem Source1: gem2rpm.yml Summary: A simple mixin for CLI interfaces, including option parsing @@ -41,7 +48,7 @@ %install %gem_install \ - --doc-files="LICENSE README.rdoc" \ + --doc-files="LICENSE README.md" \ -f %gem_packages ++++++ mixlib-cli-1.5.0.gem -> mixlib-cli-1.6.0.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Gemfile new/Gemfile --- old/Gemfile 1970-01-01 01:00:00.000000000 +0100 +++ new/Gemfile 2016-05-05 12:34:03.000000000 +0200 @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gemspec diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/NOTICE new/NOTICE --- old/NOTICE 1970-01-01 01:00:00.000000000 +0100 +++ new/NOTICE 2016-05-05 12:34:03.000000000 +0200 @@ -1,27 +1,26 @@ Mixin::CLI NOTICE ================= -Developed at Opscode (http://www.opscode.com). +Developed at Chef (http://www.chef.io). - * Copyright 2009, Opscode, Inc. <le...@opscode.com> + + * Copyright 2009-2016, Chef Software, Inc. <le...@chef.io> Mixin::CLI incorporates code from Chef. The Chef notice file follows: Chef NOTICE =========== -Developed at Opscode (http://www.opscode.com). +Developed at Chef (http://www.chef.io). Contributors and Copyright holders: - * Copyright 2008, Adam Jacob <a...@opscode.com> + * Copyright 2008, Adam Jacob <a...@chef.io> * Copyright 2008, Arjuna Christensen <a...@hjksolutions.com> * Copyright 2008, Bryan McLellan <b...@loftninjas.org> * Copyright 2008, Ezra Zygmuntowicz <e...@engineyard.com> * Copyright 2009, Sean Cribbs <seancri...@gmail.com> - * Copyright 2009, Christopher Brown <c...@opscode.com> + * Copyright 2009, Christopher Brown <c...@chef.io> * Copyright 2009, Thom May <t...@clearairturbulence.org> Chef incorporates code modified from Open4 (http://www.codeforpeople.com/lib/ruby/open4/), which was written by Ara T. Howard. - -Chef incorporates code modified from Merb (http://www.merbivore.com), which is Copyright (c) 2008 Engine Yard. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 1970-01-01 01:00:00.000000000 +0100 +++ new/README.md 2016-05-05 12:34:03.000000000 +0200 @@ -0,0 +1,109 @@ +# Mixlib::CLI + +[![Build Status Master](https://travis-ci.org/chef/mixlib-cli.svg?branch=master)](https://travis-ci.org/chef/mixlib-cli) [![Gem Version](https://badge.fury.io/rb/mixlib-cli.svg)](https://badge.fury.io/rb/mixlib-cli) + +Mixlib::CLI provides a class-based command line option parsing object, like the one used in Chef, Ohai and Relish. To use in your project: + +```ruby +require 'rubygems' +require 'mixlib/cli' + +class MyCLI + include Mixlib::CLI + + option :config_file, + :short => "-c CONFIG", + :long => "--config CONFIG", + :default => 'config.rb', + :description => "The configuration file to use" + + option :log_level, + :short => "-l LEVEL", + :long => "--log_level LEVEL", + :description => "Set the log level (debug, info, warn, error, fatal)", + :required => true, + :in => ['debug', 'info', 'warn', 'error', 'fatal'], + :proc => Proc.new { |l| l.to_sym } + + option :help, + :short => "-h", + :long => "--help", + :description => "Show this message", + :on => :tail, + :boolean => true, + :show_options => true, + :exit => 0 + +end + +# ARGV = [ '-c', 'foo.rb', '-l', 'debug' ] +cli = MyCLI.new +cli.parse_options +cli.config[:config_file] # 'foo.rb' +cli.config[:log_level] # :debug +``` + +If you are using this in conjunction with Mixlib::Config, you can do something like this (building on the above definition): + +```ruby +class MyConfig + extend(Mixlib::Config) + + log_level :info + config_file "default.rb" +end + +class MyCLI + def run(argv=ARGV) + parse_options(argv) + MyConfig.merge!(config) + end +end + +c = MyCLI.new +# ARGV = [ '-l', 'debug' ] +c.run +MyConfig[:log_level] # :debug +``` + +Available arguments to 'option': + +- `:short`: The short option, just like from optparse. Example: "-l LEVEL" +- `:long`: The long option, just like from optparse. Example: "--level LEVEL" +- `:description`: The description for this item, just like from optparse. +- `:default`: A default value for this option +- `:required`: Prints a message informing the user of the missing requirement, and exits. Default is false. +- `:on`: Set to :tail to appear at the end, or `:head`: to appear at the top. +- `:boolean:`: If this option takes no arguments, set this to true. +- `:show_options`: If you want the option list printed when this option is called, set this to true. +- `:exit`: Exit your program with the exit code when this option is specified. Example: 0 +- `:proc`: If set, the configuration value will be set to the return value of this proc. +- `:in`: An array containing the list of accepted values + +If you need access to the leftover options that aren't captured in the config, you can get at them through +cli_arguments+ (referring to the above definition of MyCLI). + +```ruby +# ARGV = [ '-c', 'foo.rb', '-l', 'debug', 'file1', 'file2', 'file3' ] +cli = MyCLI.new +cli.parse_options +cli.cli_arguments # [ 'file1', 'file2', 'file3' ] +``` + +## LICENSE: + +- Copyright:: Copyright (c) 2008-2016 Chef Software, Inc. +- License:: Apache License, Version 2.0 + +```text +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.rdoc new/README.rdoc --- old/README.rdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/README.rdoc 1970-01-01 01:00:00.000000000 +0100 @@ -1,84 +0,0 @@ -== Mixlib::CLI - -Mixlib::CLI provides a class-based command line option parsing object, like the one used in Chef, Ohai and Relish. To use in your project: - - require 'rubygems' - require 'mixlib/cli' - - class MyCLI - include Mixlib::CLI - - option :config_file, - :short => "-c CONFIG", - :long => "--config CONFIG", - :default => 'config.rb', - :description => "The configuration file to use" - - option :log_level, - :short => "-l LEVEL", - :long => "--log_level LEVEL", - :description => "Set the log level (debug, info, warn, error, fatal)", - :required => true, - :proc => Proc.new { |l| l.to_sym } - - option :help, - :short => "-h", - :long => "--help", - :description => "Show this message", - :on => :tail, - :boolean => true, - :show_options => true, - :exit => 0 - - end - - # ARGV = [ '-c', 'foo.rb', '-l', 'debug' ] - cli = MyCLI.new - cli.parse_options - cli.config[:config_file] # 'foo.rb' - cli.config[:log_level] # :debug - -If you are using this in conjunction with Mixlib::Config, you can do something like this (building on the above definition): - - class MyConfig - extend(Mixlib::Config) - - log_level :info - config_file "default.rb" - end - - class MyCLI - def run(argv=ARGV) - parse_options(argv) - MyConfig.merge!(config) - end - end - - c = MyCLI.new - # ARGV = [ '-l', 'debug' ] - c.run - MyConfig[:log_level] # :debug - -Available arguments to 'option': - -:short:: The short option, just like from optparse. Example: "-l LEVEL" -:long:: The long option, just like from optparse. Example: "--level LEVEL" -:description:: The description for this item, just like from optparse. -:default:: A default value for this option -:required:: Prints a message informing the user of the missing requirement, and exits. Default is false. -:on:: Set to :tail to appear at the end, or :head to appear at the top. -:boolean:: If this option takes no arguments, set this to true. -:show_options:: If you want the option list printed when this option is called, set this to true. -:exit:: Exit your program with the exit code when this option is specified. Example: 0 -:proc:: If set, the configuration value will be set to the return value of this proc. - -=== New in 1.2.2 - -:required works, and we now support Ruby-style boolean option negation -(e.g. '--no-cookie' will set 'cookie' to false if the option is boolean) - -=== New in 1.2.0 - -We no longer destructively manipulate ARGV. - -Have fun! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Rakefile new/Rakefile --- old/Rakefile 1970-01-01 01:00:00.000000000 +0100 +++ new/Rakefile 2016-05-05 12:34:03.000000000 +0200 @@ -1,8 +1,8 @@ -require 'bundler' -require 'rubygems' -require 'rubygems/package_task' -require 'rdoc/task' -require 'rspec/core/rake_task' +require "bundler" +require "rubygems" +require "rubygems/package_task" +require "rdoc/task" +require "rspec/core/rake_task" Bundler::GemHelper.install_tasks @@ -10,14 +10,24 @@ desc "Run specs" RSpec::Core::RakeTask.new(:spec) do |spec| - spec.pattern = 'spec/**/*_spec.rb' + spec.pattern = "spec/**/*_spec.rb" end gem_spec = eval(File.read("mixlib-cli.gemspec")) RDoc::Task.new do |rdoc| - rdoc.rdoc_dir = 'rdoc' + rdoc.rdoc_dir = "rdoc" rdoc.title = "mixlib-cli #{gem_spec.version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') + rdoc.rdoc_files.include("README*") + rdoc.rdoc_files.include("lib/**/*.rb") +end + +begin + require "chefstyle" + require "rubocop/rake_task" + RuboCop::RakeTask.new(:style) do |task| + task.options += ["--display-cop-names", "--no-color"] + end +rescue LoadError + puts "chefstyle/rubocop is not available. gem install chefstyle to do style checking." end Files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mixlib/cli/version.rb new/lib/mixlib/cli/version.rb --- old/lib/mixlib/cli/version.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/mixlib/cli/version.rb 2016-05-05 12:34:03.000000000 +0200 @@ -1,6 +1,5 @@ module Mixlib module CLI - VERSION = "1.5.0" + VERSION = "1.6.0" end end - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/mixlib/cli.rb new/lib/mixlib/cli.rb --- old/lib/mixlib/cli.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/mixlib/cli.rb 2016-05-05 12:34:03.000000000 +0200 @@ -16,7 +16,7 @@ # limitations under the License. # -require 'optparse' +require "optparse" module Mixlib @@ -38,8 +38,46 @@ # #parse_options. After calling this method, the attribute #config will # contain a hash of `:option_name => value` pairs. module CLI - module ClassMethods + module InheritMethods + def inherited(receiver) + receiver.options = deep_dup(self.options) + receiver.extend(Mixlib::CLI::InheritMethods) + end + + # object:: Instance to clone + # This method will return a "deep clone" of the provided + # `object`. If the provided `object` is an enumerable type the + # contents will be iterated and cloned as well. + def deep_dup(object) + cloned_object = object.respond_to?(:dup) ? object.dup : object + if cloned_object.kind_of?(Enumerable) + if cloned_object.kind_of?(Hash) + new_hash = cloned_object.class.new + cloned_object.each do |key, value| + cloned_key = deep_dup(key) + cloned_value = deep_dup(value) + new_hash[cloned_key] = cloned_value + end + cloned_object.replace(new_hash) + else + cloned_object.map! do |shallow_instance| + deep_dup(shallow_instance) + end + end + end + cloned_object + rescue TypeError + # Symbol will happily provide a `#dup` method even though + # attempts to clone it will result in an exception (atoms!). + # So if we run into an issue of TypeErrors, just return the + # original object as we gave our "best effort" + object + end + + end + + module ClassMethods # When this setting is set to +true+, default values supplied to the # mixlib-cli DSL will be stored in a separate Hash def use_separate_default_options(true_or_false) @@ -47,7 +85,7 @@ end def use_separate_defaults? - @separate_default_options || false + @separate_default_options ||= false end # Add a command line option. @@ -92,7 +130,7 @@ # # === Returns # @banner<String>:: The current banner - def banner(bstring=nil) + def banner(bstring = nil) if bstring @banner = bstring else @@ -149,7 +187,7 @@ @opt_parser = nil # Set the banner - @banner = self.class.banner + @banner = self.class.banner # Dupe the class options for this instance klass_options = self.class.options @@ -170,6 +208,7 @@ config_opts[:proc] ||= nil config_opts[:show_options] ||= false config_opts[:exit] ||= nil + config_opts[:in] ||= nil if config_opts.has_key?(:default) defaults_container[config_key] = config_opts[:default] @@ -186,7 +225,7 @@ # # === Returns # argv<Array>:: Returns any un-parsed elements. - def parse_options(argv=ARGV) + def parse_options(argv = ARGV) argv = argv.dup opt_parser.parse!(argv) @@ -198,13 +237,23 @@ puts @opt_parser exit 2 end + if opt_value[:in] + unless opt_value[:in].kind_of?(Array) + raise(ArgumentError, "Options config key :in must receive an Array") + end + if !opt_value[:in].include?(config[opt_key]) + reqarg = opt_value[:short] || opt_value[:long] + puts "#{reqarg}: #{config[opt_key]} is not included in the list ['#{opt_value[:in].join("', '")}'] " + puts @opt_parser + exit 2 + end + end end @cli_arguments = argv argv end - # The option parser generated from the mixlib-cli DSL. +opt_parser+ can be # used to print a help message including the banner and any CLI options via # `puts opt_parser`. @@ -220,15 +269,15 @@ opt_args = build_option_arguments(opt_val) opt_method = case opt_val[:on] - when :on - :on - when :tail - :on_tail - when :head - :on_head - else - raise ArgumentError, "You must pass :on, :tail, or :head to :on" - end + when :on + :on + when :tail + :on_tail + when :head + :on_head + else + raise ArgumentError, "You must pass :on, :tail, or :head to :on" + end parse_block = Proc.new() do |c| @@ -250,10 +299,10 @@ arguments << opt_setting[:short] if opt_setting.has_key?(:short) arguments << opt_setting[:long] if opt_setting.has_key?(:long) - if opt_setting.has_key?(:description) description = opt_setting[:description] description << " (required)" if opt_setting[:required] + description << " (included in ['#{opt_setting[:in].join("', '")}'])" if opt_setting[:in] arguments << description end @@ -262,6 +311,7 @@ def self.included(receiver) receiver.extend(Mixlib::CLI::ClassMethods) + receiver.extend(Mixlib::CLI::InheritMethods) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 1970-01-01 01:00:00.000000000 +0100 +++ new/metadata 2016-05-05 12:34:03.000000000 +0200 @@ -1,76 +1,93 @@ --- !ruby/object:Gem::Specification name: mixlib-cli version: !ruby/object:Gem::Version - version: 1.5.0 + version: 1.6.0 platform: ruby authors: -- Opscode, Inc. +- Chef Software, Inc. autorequire: bindir: bin cert_chain: [] -date: 2014-04-25 00:00:00.000000000 Z +date: 2016-05-05 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - "<" - !ruby/object:Gem::Version - version: '0' + version: '11.0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - "<" - !ruby/object:Gem::Version - version: '0' + version: '11.0' - !ruby/object:Gem::Dependency name: rspec requirement: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - "~>" - !ruby/object:Gem::Version - version: '0' + version: '2.14' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - "~>" - !ruby/object:Gem::Version - version: '0' + version: '2.14' - !ruby/object:Gem::Dependency name: rdoc requirement: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' +- !ruby/object:Gem::Dependency + name: chefstyle + requirement: !ruby/object:Gem::Requirement + requirements: + - - "~>" + - !ruby/object:Gem::Version + version: '0.3' + type: :development + prerelease: false + version_requirements: !ruby/object:Gem::Requirement + requirements: + - - "~>" + - !ruby/object:Gem::Version + version: '0.3' description: A simple mixin for CLI interfaces, including option parsing -email: i...@opscode.com +email: i...@chef.io executables: [] extensions: [] extra_rdoc_files: -- README.rdoc +- README.md - LICENSE - NOTICE files: +- Gemfile - LICENSE -- README.rdoc -- Rakefile - NOTICE -- lib/mixlib/cli/version.rb +- README.md +- Rakefile - lib/mixlib/cli.rb +- lib/mixlib/cli/version.rb +- mixlib-cli.gemspec - spec/mixlib/cli_spec.rb - spec/spec_helper.rb -homepage: http://www.opscode.com -licenses: [] +homepage: https://www.chef.io +licenses: +- Apache-2.0 metadata: {} post_install_message: rdoc_options: [] @@ -78,19 +95,18 @@ - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - - '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: -rubygems_version: 2.0.3 +rubygems_version: 2.4.5.1 signing_key: specification_version: 4 summary: A simple mixin for CLI interfaces, including option parsing test_files: [] -has_rdoc: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mixlib-cli.gemspec new/mixlib-cli.gemspec --- old/mixlib-cli.gemspec 1970-01-01 01:00:00.000000000 +0100 +++ new/mixlib-cli.gemspec 2016-05-05 12:34:03.000000000 +0200 @@ -0,0 +1,27 @@ +$:.unshift(File.dirname(__FILE__) + "/lib") +require "mixlib/cli/version" + +Gem::Specification.new do |s| + s.name = "mixlib-cli" + s.version = Mixlib::CLI::VERSION + s.platform = Gem::Platform::RUBY + s.has_rdoc = true + s.extra_rdoc_files = ["README.md", "LICENSE", "NOTICE"] + s.summary = "A simple mixin for CLI interfaces, including option parsing" + s.description = s.summary + s.author = "Chef Software, Inc." + s.email = "i...@chef.io" + s.homepage = "https://www.chef.io" + s.license = "Apache-2.0" + + # Uncomment this to add a dependency + #s.add_dependency "mixlib-log" + s.add_development_dependency "rake", "< 11.0" + s.add_development_dependency "rspec", "~> 2.14" + s.add_development_dependency "rdoc" + s.add_development_dependency "chefstyle", "~> 0.3" + + s.require_path = "lib" + s.files = %w{LICENSE README.md Gemfile Rakefile NOTICE} + Dir.glob("*.gemspec") + + Dir.glob("{lib,spec}/**/*", File::FNM_DOTMATCH).reject { |f| File.directory?(f) } +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/mixlib/cli_spec.rb new/spec/mixlib/cli_spec.rb --- old/spec/mixlib/cli_spec.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/spec/mixlib/cli_spec.rb 2016-05-05 12:34:03.000000000 +0200 @@ -27,21 +27,21 @@ describe "class method" do describe "option" do it "should allow you to set a config option with a hash" do - TestCLI.option(:config_file, :short => '-c CONFIG').should == { :short => '-c CONFIG' } + TestCLI.option(:config_file, :short => "-c CONFIG").should == { :short => "-c CONFIG" } end end describe "options" do it "should return the current options hash" do - TestCLI.option(:config_file, :short => '-c CONFIG') - TestCLI.options.should == { :config_file => { :short => '-c CONFIG' } } + TestCLI.option(:config_file, :short => "-c CONFIG") + TestCLI.options.should == { :config_file => { :short => "-c CONFIG" } } end end describe "options=" do it "should allow you to set the full options with a single hash" do - TestCLI.options = { :config_file => { :short => '-c CONFIG' } } - TestCLI.options.should == { :config_file => { :short => '-c CONFIG' } } + TestCLI.options = { :config_file => { :short => "-c CONFIG" } } + TestCLI.options.should == { :config_file => { :short => "-c CONFIG" } } end end @@ -79,8 +79,9 @@ :required => false, :proc => nil, :show_options => false, - :exit => nil - } + :exit => nil, + :in => nil, + }, } end @@ -134,8 +135,8 @@ it "should set the corresponding config value for non-boolean arguments" do TestCLI.option(:config_file, :short => "-c CONFIG") @cli = TestCLI.new - @cli.parse_options([ '-c', 'foo.rb' ]) - @cli.config[:config_file].should == 'foo.rb' + @cli.parse_options([ "-c", "foo.rb" ]) + @cli.config[:config_file].should == "foo.rb" end it "should set the corresponding config value according to a supplied proc" do @@ -151,14 +152,14 @@ it "should set the corresponding config value to true for boolean arguments" do TestCLI.option(:i_am_boolean, :short => "-i", :boolean => true) @cli = TestCLI.new - @cli.parse_options([ '-i' ]) + @cli.parse_options([ "-i" ]) @cli.config[:i_am_boolean].should == true end it "should set the corresponding config value to false when a boolean is prefixed with --no" do TestCLI.option(:i_am_boolean, :long => "--[no-]bool", :boolean => true) @cli = TestCLI.new - @cli.parse_options([ '--no-bool' ]) + @cli.parse_options([ "--no-bool" ]) @cli.config[:i_am_boolean].should == false end @@ -174,6 +175,32 @@ lambda { @cli.parse_options([]) }.should raise_error(SystemExit) end + it "should exit if option is not included in the list" do + TestCLI.option(:inclusion, :short => "-i val", :in => %w{one two}) + @cli = TestCLI.new + lambda { @cli.parse_options(["-i", "three"]) }.should raise_error(SystemExit) + end + + it "should raise ArgumentError if options key :in is not an array" do + TestCLI.option(:inclusion, :short => "-i val", :in => "foo") + @cli = TestCLI.new + lambda { @cli.parse_options(["-i", "three"]) }.should raise_error(ArgumentError) + end + + it "should not exit if option is included in the list" do + TestCLI.option(:inclusion, :short => "-i val", :in => %w{one two}) + @cli = TestCLI.new + @cli.parse_options(["-i", "one"]) + @cli.config[:inclusion].should == "one" + end + + it "should change description if :in key is specified" do + TestCLI.option(:inclusion, :short => "-i val", :in => %w{one two}, :description => "desc") + @cli = TestCLI.new + @cli.parse_options(["-i", "one"]) + @cli.options[:inclusion][:description].should == "desc (included in ['one', 'two'])" + end + it "should not exit if a required option is specified" do TestCLI.option(:require_me, :short => "-r", :boolean => true, :required => true) @cli = TestCLI.new @@ -199,17 +226,17 @@ TestCLI.option(:config_file, :short => "-c CONFIG") @cli = TestCLI.new argv_old = ARGV.dup - ARGV.replace ['-c','foo.rb'] + ARGV.replace ["-c", "foo.rb"] @cli.parse_options() - ARGV.should == ['-c','foo.rb'] + ARGV.should == ["-c", "foo.rb"] ARGV.replace argv_old end it "should preserve and return any un-parsed elements" do TestCLI.option(:party, :short => "-p LOCATION") @cli = TestCLI.new - @cli.parse_options([ 'easy', '-p', 'opscode', 'hard' ]).should == ['easy', 'hard'] - @cli.cli_arguments.should == ['easy', 'hard'] + @cli.parse_options([ "easy", "-p", "opscode", "hard" ]).should == %w{easy hard} + @cli.cli_arguments.should == %w{easy hard} end end end @@ -228,15 +255,62 @@ end it "sets parsed values on the `config` hash" do - @cli.parse_options(%w[-D not-default]) + @cli.parse_options(%w{-D not-default}) @cli.default_config[:defaulter].should == "this is the default" @cli.config[:defaulter].should == "not-default" end end -end + context "when subclassed" do + before do + TestCLI.options = { :arg1 => { :boolean => true } } + end + + it "should retain previously defined options from parent" do + class T1 < TestCLI + option :arg2, :boolean => true + end + T1.options[:arg1].should be_a(Hash) + T1.options[:arg2].should be_a(Hash) + TestCLI.options[:arg2].should be_nil + end + + it "should not be able to modify parent classes options" do + class T2 < TestCLI + option :arg2, :boolean => true + end + T2.options[:arg1][:boolean] = false + T2.options[:arg1][:boolean].should be_false + TestCLI.options[:arg1][:boolean].should be_true + end + + it "should pass its options onto child" do + class T3 < TestCLI + option :arg2, :boolean => true + end + class T4 < T3 + option :arg3, :boolean => true + end + 3.times do |i| + T4.options["arg#{i + 1}".to_sym].should be_a(Hash) + end + end + it "should also work with an option that's an array" do + class T5 < TestCLI + option :arg2, :default => [] + end + + class T6 < T5 + end + + T6.options[:arg2].should be_a(Hash) + end + + end + +end # option :config_file, # :short => "-c CONFIG", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/spec_helper.rb new/spec/spec_helper.rb --- old/spec/spec_helper.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/spec/spec_helper.rb 2016-05-05 12:34:03.000000000 +0200 @@ -1,9 +1,15 @@ -$TESTING=true -$:.push File.join(File.dirname(__FILE__), '..', 'lib') +$TESTING = true +$:.push File.join(File.dirname(__FILE__), "..", "lib") -require 'mixlib/cli' +require "mixlib/cli" class TestCLI include Mixlib::CLI end +RSpec.configure do |config| + config.filter_run :focus => true + config.run_all_when_everything_filtered = true + config.treat_symbols_as_metadata_keys_with_true_values = true + config.warnings = true +end