clamp 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/clamp/attribute.rb +37 -0
 - data/lib/clamp/attribute_declaration.rb +9 -16
 - data/lib/clamp/command.rb +0 -1
 - data/lib/clamp/option.rb +14 -8
 - data/lib/clamp/option/declaration.rb +0 -2
 - data/lib/clamp/parameter.rb +6 -8
 - data/lib/clamp/subcommand/execution.rb +6 -1
 - data/lib/clamp/version.rb +1 -1
 - data/spec/clamp/command_group_spec.rb +10 -12
 - metadata +5 -4
 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Clamp
         
     | 
| 
      
 2 
     | 
    
         
            +
              
         
     | 
| 
      
 3 
     | 
    
         
            +
              class Attribute
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :description, :attribute_name, :default_value
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def help_rhs
         
     | 
| 
      
 8 
     | 
    
         
            +
                  rhs = description
         
     | 
| 
      
 9 
     | 
    
         
            +
                  if defined?(@default_value)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    rhs += " (default: #{@default_value.inspect})"
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
                  rhs
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
                
         
     | 
| 
      
 15 
     | 
    
         
            +
                def help
         
     | 
| 
      
 16 
     | 
    
         
            +
                  [help_lhs, help_rhs]
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
                
         
     | 
| 
      
 19 
     | 
    
         
            +
                def ivar_name
         
     | 
| 
      
 20 
     | 
    
         
            +
                  "@#{attribute_name}"
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
                
         
     | 
| 
      
 23 
     | 
    
         
            +
                def read_method
         
     | 
| 
      
 24 
     | 
    
         
            +
                  attribute_name
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
                
         
     | 
| 
      
 27 
     | 
    
         
            +
                def default_method
         
     | 
| 
      
 28 
     | 
    
         
            +
                  "default_#{read_method}"
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
                
         
     | 
| 
      
 31 
     | 
    
         
            +
                def write_method
         
     | 
| 
      
 32 
     | 
    
         
            +
                  "#{attribute_name}="
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
              
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -11,34 +11,27 @@ module Clamp 
     | 
|
| 
       11 
11 
     | 
    
         
             
                end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                def define_reader_for(attribute)
         
     | 
| 
       14 
     | 
    
         
            -
                   
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                      instance_variable_get(ivar_name)
         
     | 
| 
       20 
     | 
    
         
            -
                    elsif parent_command && parent_command.respond_to?(reader_name)
         
     | 
| 
       21 
     | 
    
         
            -
                      parent_command.send(reader_name)
         
     | 
| 
       22 
     | 
    
         
            -
                    elsif respond_to?("default_#{attribute.attribute_name}")
         
     | 
| 
       23 
     | 
    
         
            -
                      send("default_#{attribute.attribute_name}")
         
     | 
| 
      
 14 
     | 
    
         
            +
                  define_method(attribute.read_method) do
         
     | 
| 
      
 15 
     | 
    
         
            +
                    if instance_variable_defined?(attribute.ivar_name)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      instance_variable_get(attribute.ivar_name)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    elsif respond_to?(attribute.default_method)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      send(attribute.default_method)
         
     | 
| 
       24 
19 
     | 
    
         
             
                    end
         
     | 
| 
       25 
20 
     | 
    
         
             
                  end
         
     | 
| 
       26 
21 
     | 
    
         
             
                end
         
     | 
| 
       27 
22 
     | 
    
         | 
| 
       28 
23 
     | 
    
         
             
                def define_default_for(attribute)
         
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
       30 
     | 
    
         
            -
                     
     | 
| 
       31 
     | 
    
         
            -
                      attribute.default_value
         
     | 
| 
       32 
     | 
    
         
            -
                    end
         
     | 
| 
      
 24 
     | 
    
         
            +
                  define_method(attribute.default_method) do
         
     | 
| 
      
 25 
     | 
    
         
            +
                    attribute.default_value
         
     | 
| 
       33 
26 
     | 
    
         
             
                  end
         
     | 
| 
       34 
27 
     | 
    
         
             
                end
         
     | 
| 
       35 
28 
     | 
    
         | 
| 
       36 
29 
     | 
    
         
             
                def define_writer_for(attribute, &block)
         
     | 
| 
       37 
     | 
    
         
            -
                  define_method( 
     | 
| 
      
 30 
     | 
    
         
            +
                  define_method(attribute.write_method) do |value|
         
     | 
| 
       38 
31 
     | 
    
         
             
                    if block
         
     | 
| 
       39 
32 
     | 
    
         
             
                      value = instance_exec(value, &block)
         
     | 
| 
       40 
33 
     | 
    
         
             
                    end
         
     | 
| 
       41 
     | 
    
         
            -
                    instance_variable_set( 
     | 
| 
      
 34 
     | 
    
         
            +
                    instance_variable_set(attribute.ivar_name, value)
         
     | 
| 
       42 
35 
     | 
    
         
             
                  end
         
     | 
| 
       43 
36 
     | 
    
         
             
                end
         
     | 
| 
       44 
37 
     | 
    
         | 
    
        data/lib/clamp/command.rb
    CHANGED
    
    
    
        data/lib/clamp/option.rb
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'clamp/attribute'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            module Clamp
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
              class Option
         
     | 
| 
      
 5 
     | 
    
         
            +
              class Option < Attribute
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
                def initialize(switches, type, description, options = {})
         
     | 
| 
       6 
8 
     | 
    
         
             
                  @switches = Array(switches)
         
     | 
| 
         @@ -14,7 +16,7 @@ module Clamp 
     | 
|
| 
       14 
16 
     | 
    
         
             
                  end
         
     | 
| 
       15 
17 
     | 
    
         
             
                end
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                attr_reader :switches, :type 
     | 
| 
      
 19 
     | 
    
         
            +
                attr_reader :switches, :type
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
21 
     | 
    
         
             
                def attribute_name
         
     | 
| 
       20 
22 
     | 
    
         
             
                  @attribute_name ||= long_switch.sub(/^--(\[no-\])?/, '').tr('-', '_')
         
     | 
| 
         @@ -35,6 +37,14 @@ module Clamp 
     | 
|
| 
       35 
37 
     | 
    
         
             
                def flag_value(switch)
         
     | 
| 
       36 
38 
     | 
    
         
             
                  !(switch =~ /^--no-(.*)/ && switches.member?("--\[no-\]#{$1}"))
         
     | 
| 
       37 
39 
     | 
    
         
             
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                def read_method
         
     | 
| 
      
 42 
     | 
    
         
            +
                  if flag?
         
     | 
| 
      
 43 
     | 
    
         
            +
                    super + "?"
         
     | 
| 
      
 44 
     | 
    
         
            +
                  else
         
     | 
| 
      
 45 
     | 
    
         
            +
                    super
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
       38 
48 
     | 
    
         | 
| 
       39 
49 
     | 
    
         
             
                def extract_value(switch, arguments)
         
     | 
| 
       40 
50 
     | 
    
         
             
                  if flag?
         
     | 
| 
         @@ -44,14 +54,10 @@ module Clamp 
     | 
|
| 
       44 
54 
     | 
    
         
             
                  end
         
     | 
| 
       45 
55 
     | 
    
         
             
                end
         
     | 
| 
       46 
56 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
                def  
     | 
| 
      
 57 
     | 
    
         
            +
                def help_lhs
         
     | 
| 
       48 
58 
     | 
    
         
             
                  lhs = switches.join(", ")
         
     | 
| 
       49 
59 
     | 
    
         
             
                  lhs += " " + type unless flag?
         
     | 
| 
       50 
     | 
    
         
            -
                   
     | 
| 
       51 
     | 
    
         
            -
                  if defined?(@default_value)
         
     | 
| 
       52 
     | 
    
         
            -
                    rhs += " (default: #{@default_value.inspect})"
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
                  [lhs, rhs]
         
     | 
| 
      
 60 
     | 
    
         
            +
                  lhs
         
     | 
| 
       55 
61 
     | 
    
         
             
                end
         
     | 
| 
       56 
62 
     | 
    
         | 
| 
       57 
63 
     | 
    
         
             
                private
         
     | 
    
        data/lib/clamp/parameter.rb
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'clamp/attribute'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            module Clamp
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
              class Parameter
         
     | 
| 
      
 5 
     | 
    
         
            +
              class Parameter < Attribute
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
                def initialize(name, description, options = {})
         
     | 
| 
       6 
8 
     | 
    
         
             
                  @name = name
         
     | 
| 
         @@ -14,14 +16,10 @@ module Clamp 
     | 
|
| 
       14 
16 
     | 
    
         
             
                  end
         
     | 
| 
       15 
17 
     | 
    
         
             
                end
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                attr_reader :name, : 
     | 
| 
      
 19 
     | 
    
         
            +
                attr_reader :name, :attribute_name
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
                def  
     | 
| 
       20 
     | 
    
         
            -
                   
     | 
| 
       21 
     | 
    
         
            -
                  if defined?(@default_value)
         
     | 
| 
       22 
     | 
    
         
            -
                    rhs += " (default: #{@default_value.inspect})"
         
     | 
| 
       23 
     | 
    
         
            -
                  end
         
     | 
| 
       24 
     | 
    
         
            -
                  [name, rhs]
         
     | 
| 
      
 21 
     | 
    
         
            +
                def help_lhs
         
     | 
| 
      
 22 
     | 
    
         
            +
                  name
         
     | 
| 
       25 
23 
     | 
    
         
             
                end
         
     | 
| 
       26 
24 
     | 
    
         | 
| 
       27 
25 
     | 
    
         
             
                def consume(arguments)
         
     | 
| 
         @@ -9,7 +9,12 @@ module Clamp 
     | 
|
| 
       9 
9 
     | 
    
         
             
                    signal_usage_error "no subcommand specified" unless subcommand_name
         
     | 
| 
       10 
10 
     | 
    
         
             
                    subcommand_class = find_subcommand_class(subcommand_name)
         
     | 
| 
       11 
11 
     | 
    
         
             
                    subcommand = subcommand_class.new("#{invocation_path} #{subcommand_name}", context)
         
     | 
| 
       12 
     | 
    
         
            -
                     
     | 
| 
      
 12 
     | 
    
         
            +
                    self.class.declared_options.each do |option|
         
     | 
| 
      
 13 
     | 
    
         
            +
                      option_set = instance_variable_defined?(option.ivar_name)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      if option_set && subcommand.respond_to?(option.write_method)
         
     | 
| 
      
 15 
     | 
    
         
            +
                        subcommand.send(option.write_method, self.send(option.read_method))
         
     | 
| 
      
 16 
     | 
    
         
            +
                      end
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
       13 
18 
     | 
    
         
             
                    subcommand.run(subcommand_arguments)
         
     | 
| 
       14 
19 
     | 
    
         
             
                  end
         
     | 
| 
       15 
20 
     | 
    
         | 
    
        data/lib/clamp/version.rb
    CHANGED
    
    
| 
         @@ -118,39 +118,37 @@ describe Clamp::Command do 
     | 
|
| 
       118 
118 
     | 
    
         | 
| 
       119 
119 
     | 
    
         
             
                  @command_class = Class.new(Clamp::Command) do
         
     | 
| 
       120 
120 
     | 
    
         | 
| 
       121 
     | 
    
         
            -
                    option "--direction", "DIR", "which way"
         
     | 
| 
      
 121 
     | 
    
         
            +
                    option "--direction", "DIR", "which way", :default => "home"
         
     | 
| 
       122 
122 
     | 
    
         | 
| 
       123 
     | 
    
         
            -
                    subcommand " 
     | 
| 
      
 123 
     | 
    
         
            +
                    subcommand "move", "move in the appointed direction" do
         
     | 
| 
       124 
124 
     | 
    
         | 
| 
       125 
125 
     | 
    
         
             
                      def execute
         
     | 
| 
       126 
     | 
    
         
            -
                         
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
                        else
         
     | 
| 
       129 
     | 
    
         
            -
                          puts "wandering #{context[:default_direction]} by default"
         
     | 
| 
       130 
     | 
    
         
            -
                        end
         
     | 
| 
      
 126 
     | 
    
         
            +
                        motion = context[:motion] || "walking"
         
     | 
| 
      
 127 
     | 
    
         
            +
                        puts "#{motion} #{direction}"
         
     | 
| 
       131 
128 
     | 
    
         
             
                      end
         
     | 
| 
       132 
129 
     | 
    
         | 
| 
       133 
130 
     | 
    
         
             
                    end
         
     | 
| 
       134 
131 
     | 
    
         | 
| 
       135 
132 
     | 
    
         
             
                  end
         
     | 
| 
       136 
133 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
                  @command = @command_class.new("go" 
     | 
| 
      
 134 
     | 
    
         
            +
                  @command = @command_class.new("go")
         
     | 
| 
       138 
135 
     | 
    
         | 
| 
       139 
136 
     | 
    
         
             
                end
         
     | 
| 
       140 
137 
     | 
    
         | 
| 
       141 
138 
     | 
    
         
             
                it "accepts parents options (specified after the subcommand)" do
         
     | 
| 
       142 
     | 
    
         
            -
                  @command.run([" 
     | 
| 
      
 139 
     | 
    
         
            +
                  @command.run(["move", "--direction", "north"])
         
     | 
| 
       143 
140 
     | 
    
         
             
                  stdout.should =~ /walking north/
         
     | 
| 
       144 
141 
     | 
    
         
             
                end
         
     | 
| 
       145 
142 
     | 
    
         | 
| 
       146 
143 
     | 
    
         
             
                it "accepts parents options (specified before the subcommand)" do
         
     | 
| 
       147 
     | 
    
         
            -
                  @command.run(["--direction", "north", " 
     | 
| 
      
 144 
     | 
    
         
            +
                  @command.run(["--direction", "north", "move"])
         
     | 
| 
       148 
145 
     | 
    
         
             
                  stdout.should =~ /walking north/
         
     | 
| 
       149 
146 
     | 
    
         
             
                end
         
     | 
| 
       150 
147 
     | 
    
         | 
| 
       151 
148 
     | 
    
         
             
                it "has access to command context" do
         
     | 
| 
       152 
     | 
    
         
            -
                  @command. 
     | 
| 
       153 
     | 
    
         
            -
                   
     | 
| 
      
 149 
     | 
    
         
            +
                  @command = @command_class.new("go", :motion => "wandering")
         
     | 
| 
      
 150 
     | 
    
         
            +
                  @command.run(["move"])
         
     | 
| 
      
 151 
     | 
    
         
            +
                  stdout.should =~ /wandering home/
         
     | 
| 
       154 
152 
     | 
    
         
             
                end
         
     | 
| 
       155 
153 
     | 
    
         | 
| 
       156 
154 
     | 
    
         
             
              end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: clamp
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 21
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
8 
     | 
    
         
             
              - 1
         
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0.1. 
     | 
| 
      
 9 
     | 
    
         
            +
              - 7
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.1.7
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Mike Williams
         
     | 
| 
         @@ -15,7 +15,7 @@ autorequire: 
     | 
|
| 
       15 
15 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       16 
16 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            date: 2011-01- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2011-01-30 00:00:00 +11:00
         
     | 
| 
       19 
19 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
         @@ -40,6 +40,7 @@ files: 
     | 
|
| 
       40 
40 
     | 
    
         
             
            - examples/fubar
         
     | 
| 
       41 
41 
     | 
    
         
             
            - examples/speak
         
     | 
| 
       42 
42 
     | 
    
         
             
            - lib/clamp.rb
         
     | 
| 
      
 43 
     | 
    
         
            +
            - lib/clamp/attribute.rb
         
     | 
| 
       43 
44 
     | 
    
         
             
            - lib/clamp/attribute_declaration.rb
         
     | 
| 
       44 
45 
     | 
    
         
             
            - lib/clamp/command.rb
         
     | 
| 
       45 
46 
     | 
    
         
             
            - lib/clamp/errors.rb
         
     |