Skip to content
Browse files

Merge pull request #634 from kyrylo/extend-command-group-regexp

Extend command group regexp (bugfix)
  • Loading branch information...
2 parents 2e95e2a + e0fdf24 commit 94fbfabfc61e59610d210b608e04b5af0c67cf94 Robert Gleeson committed Jul 5, 2012
Showing with 364 additions and 348 deletions.
  1. +13 −13 lib/pry/command.rb
  2. +351 −335 test/test_command.rb
View
26 lib/pry/command.rb
@@ -143,21 +143,21 @@ def convert_to_regex(obj)
# This is usually auto-generated from directory naming, but it can be
# manually overridden if necessary.
def group(name=nil)
- @group = if name
- name
- else
- case Pry::Method(block).source_file
- when %r{/pry/.*_commands/(.*).rb}
- $1.capitalize.gsub(/_/, " ")
- when %r{(pry-\w+)-([\d\.]+([\w\d\.]+)?)}
- name, version = $1, $2
- "#{name.to_s} (v#{version.to_s})"
- when /pryrc/
- "~/.pryrc"
+ @group ||= if name
+ name
else
- "(other)"
+ case Pry::Method(block).source_file
+ when %r{/pry/.*_commands/(.*).rb}
+ $1.capitalize.gsub(/_/, " ")
+ when %r{(pry-\w+)-([\d\.]+([\w\d\.]+)?)}
+ name, version = $1, $2
+ "#{name.to_s} (v#{version.to_s})"
+ when /pryrc/
+ "~/.pryrc"
+ else
+ "(other)"
+ end
end
- end
end
end
View
686 test/test_command.rb
@@ -342,355 +342,371 @@ def process
end
end
- describe "block parameters" do
- before do
- @context = Object.new
- @set.command "walking-spanish", "down the hall", :takes_block => true do
- inject_var(:@x, command_block.call, target)
- end
- @set.import Pry::Commands
- end
-
- it 'should accept multiline blocks' do
- redirect_pry_io(InputTester.new("walking-spanish | do",
- " :jesus",
- "end",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :jesus
- end
-
- it 'should accept normal parameters along with block' do
- @set.block_command "walking-spanish", "litella's been screeching for a blind pig.", :takes_block => true do |x, y|
- inject_var(:@x, x, target)
- inject_var(:@y, y, target)
- inject_var(:@block_var, command_block.call, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish john carl| { :jesus }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
-
- @context.instance_variable_get(:@x).should == "john"
- @context.instance_variable_get(:@y).should == "carl"
- @context.instance_variable_get(:@block_var).should == :jesus
- end
-
- describe "single line blocks" do
- it 'should accept blocks with do ; end' do
- redirect_pry_io(InputTester.new("walking-spanish | do ; :jesus; end",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :jesus
- end
+ describe "block parameters" do
+ before do
+ @context = Object.new
+ @set.command "walking-spanish", "down the hall", :takes_block => true do
+ inject_var(:@x, command_block.call, target)
+ end
+ @set.import Pry::Commands
+ end
- it 'should accept blocks with do; end' do
- redirect_pry_io(InputTester.new("walking-spanish | do; :jesus; end",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :jesus
- end
+ it 'should accept multiline blocks' do
+ redirect_pry_io(InputTester.new("walking-spanish | do",
+ " :jesus",
+ "end",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :jesus
+ end
- it 'should accept blocks with { }' do
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :jesus
- end
-
- end
-
- describe "block-related content removed from arguments" do
-
- describe "arg_string" do
- it 'should remove block-related content from arg_string (with one normal arg)' do
- @set.block_command "walking-spanish", "down the hall", :takes_block => true do |x, y|
- inject_var(:@arg_string, arg_string, target)
- inject_var(:@x, x, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish john| { :jesus }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@arg_string).should == @context.instance_variable_get(:@x)
- end
+ it 'should accept normal parameters along with block' do
+ @set.block_command "walking-spanish", "litella's been screeching for a blind pig.", :takes_block => true do |x, y|
+ inject_var(:@x, x, target)
+ inject_var(:@y, y, target)
+ inject_var(:@block_var, command_block.call, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish john carl| { :jesus }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
- it 'should remove block-related content from arg_string (with no normal args)' do
- @set.block_command "walking-spanish", "down the hall", :takes_block => true do
- inject_var(:@arg_string, arg_string, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@arg_string).should == ""
- end
+ @context.instance_variable_get(:@x).should == "john"
+ @context.instance_variable_get(:@y).should == "carl"
+ @context.instance_variable_get(:@block_var).should == :jesus
+ end
- it 'should NOT remove block-related content from arg_string when :takes_block => false' do
- block_string = "| { :jesus }"
- @set.block_command "walking-spanish", "homemade special", :takes_block => false do
- inject_var(:@arg_string, arg_string, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish #{block_string}",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@arg_string).should == block_string
- end
- end
-
- describe "args" do
- describe "block_command" do
- it "should remove block-related content from arguments" do
- @set.block_command "walking-spanish", "glass is full of sand", :takes_block => true do |x, y|
- inject_var(:@x, x, target)
- inject_var(:@y, y, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == nil
- @context.instance_variable_get(:@y).should == nil
- end
-
- it "should NOT remove block-related content from arguments if :takes_block => false" do
- @set.block_command "walking-spanish", "litella screeching for a blind pig", :takes_block => false do |x, y|
- inject_var(:@x, x, target)
- inject_var(:@y, y, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == "|"
- @context.instance_variable_get(:@y).should == "{"
- end
- end
+ describe "single line blocks" do
+ it 'should accept blocks with do ; end' do
+ redirect_pry_io(InputTester.new("walking-spanish | do ; :jesus; end",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :jesus
+ end
- describe "create_command" do
- it "should remove block-related content from arguments" do
- @set.create_command "walking-spanish", "punk sanders carved one out of wood", :takes_block => true do
- def process(x, y)
- inject_var(:@x, x, target)
- inject_var(:@y, y, target)
- end
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == nil
- @context.instance_variable_get(:@y).should == nil
- end
-
- it "should NOT remove block-related content from arguments if :takes_block => false" do
- @set.create_command "walking-spanish", "down the hall", :takes_block => false do
- def process(x, y)
- inject_var(:@x, x, target)
- inject_var(:@y, y, target)
- end
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == "|"
- @context.instance_variable_get(:@y).should == "{"
- end
- end
- end
- end
-
- describe "blocks can take parameters" do
- describe "{} style blocks" do
- it 'should accept multiple parameters' do
- @set.block_command "walking-spanish", "down the hall", :takes_block => true do
- inject_var(:@x, command_block.call(1, 2), target)
- end
-
- redirect_pry_io(InputTester.new("walking-spanish | { |x, y| [x, y] }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == [1, 2]
- end
- end
-
- describe "do/end style blocks" do
- it 'should accept multiple parameters' do
- @set.create_command "walking-spanish", "litella", :takes_block => true do
- def process
- inject_var(:@x, command_block.call(1, 2), target)
- end
- end
-
- redirect_pry_io(InputTester.new("walking-spanish | do |x, y|",
- " [x, y]",
- "end",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == [1, 2]
- end
- end
- end
-
- describe "closure behaviour" do
- it 'should close over locals in the definition context' do
- redirect_pry_io(InputTester.new("var = :hello",
- "walking-spanish | { var }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :hello
- end
- end
-
- describe "exposing block parameter" do
- describe "block_command" do
- it "should expose block in command_block method" do
- @set.block_command "walking-spanish", "glass full of sand", :takes_block => true do
- inject_var(:@x, command_block.call, target)
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :jesus
- end
- end
-
- describe "create_command" do
- it "should NOT expose &block in create_command's process method" do
- @set.create_command "walking-spanish", "down the hall", :takes_block => true do
- def process(&block)
- inject_var(:@x, block.call, target)
- end
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all")) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == nil
- end
+ it 'should accept blocks with do; end' do
+ redirect_pry_io(InputTester.new("walking-spanish | do; :jesus; end",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :jesus
+ end
- it "should expose block in command_block method" do
- @set.create_command "walking-spanish", "homemade special", :takes_block => true do
- def process
- inject_var(:@x, command_block.call, target)
- end
- end
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
- "exit-all"), out = StringIO.new) do
- Pry.start @context, :commands => @set
- end
- @context.instance_variable_get(:@x).should == :jesus
- end
- end
- end
- end
+ it 'should accept blocks with { }' do
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :jesus
+ end
- describe "commands made with custom sub-classes" do
- before do
+ end
- class MyTestCommand < Pry::ClassCommand
- match /my-*test/
- description "So just how many sound technicians does it take to change a lightbulb? 1? 2? 3? 1-2-3? Testing?"
- options :shellwords => false, :listing => "my-test"
+ describe "block-related content removed from arguments" do
+
+ describe "arg_string" do
+ it 'should remove block-related content from arg_string (with one normal arg)' do
+ @set.block_command "walking-spanish", "down the hall", :takes_block => true do |x, y|
+ inject_var(:@arg_string, arg_string, target)
+ inject_var(:@x, x, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish john| { :jesus }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@arg_string).should == @context.instance_variable_get(:@x)
+ end
- def process
- output.puts command_name * 2
- end
- end
+ it 'should remove block-related content from arg_string (with no normal args)' do
+ @set.block_command "walking-spanish", "down the hall", :takes_block => true do
+ inject_var(:@arg_string, arg_string, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@arg_string).should == ""
+ end
- Pry.commands.add_command MyTestCommand
- end
+ it 'should NOT remove block-related content from arg_string when :takes_block => false' do
+ block_string = "| { :jesus }"
+ @set.block_command "walking-spanish", "homemade special", :takes_block => false do
+ inject_var(:@arg_string, arg_string, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish #{block_string}",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@arg_string).should == block_string
+ end
+ end
- after do
- Pry.commands.delete 'my-test'
- end
+ describe "args" do
+ describe "block_command" do
+ it "should remove block-related content from arguments" do
+ @set.block_command "walking-spanish", "glass is full of sand", :takes_block => true do |x, y|
+ inject_var(:@x, x, target)
+ inject_var(:@y, y, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == nil
+ @context.instance_variable_get(:@y).should == nil
+ end
+
+ it "should NOT remove block-related content from arguments if :takes_block => false" do
+ @set.block_command "walking-spanish", "litella screeching for a blind pig", :takes_block => false do |x, y|
+ inject_var(:@x, x, target)
+ inject_var(:@y, y, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == "|"
+ @context.instance_variable_get(:@y).should == "{"
+ end
+ end
- it "should allow creating custom sub-classes of Pry::Command" do
- mock_pry("my---test").should =~ /my-testmy-test/
- end
+ describe "create_command" do
+ it "should remove block-related content from arguments" do
+ @set.create_command "walking-spanish", "punk sanders carved one out of wood", :takes_block => true do
+ def process(x, y)
+ inject_var(:@x, x, target)
+ inject_var(:@y, y, target)
+ end
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == nil
+ @context.instance_variable_get(:@y).should == nil
+ end
+
+ it "should NOT remove block-related content from arguments if :takes_block => false" do
+ @set.create_command "walking-spanish", "down the hall", :takes_block => false do
+ def process(x, y)
+ inject_var(:@x, x, target)
+ inject_var(:@y, y, target)
+ end
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == "|"
+ @context.instance_variable_get(:@y).should == "{"
+ end
+ end
+ end
+ end
- it "should show the source of the process method" do
- mock_pry("show-command my-test").should =~ /output.puts command_name/
- end
- end
+ describe "blocks can take parameters" do
+ describe "{} style blocks" do
+ it 'should accept multiple parameters' do
+ @set.block_command "walking-spanish", "down the hall", :takes_block => true do
+ inject_var(:@x, command_block.call(1, 2), target)
+ end
+
+ redirect_pry_io(InputTester.new("walking-spanish | { |x, y| [x, y] }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == [1, 2]
+ end
+ end
- describe "commands can save state" do
- before do
- @set = Pry::CommandSet.new do
- create_command "litella", "desc" do
- def process
- state.my_state ||= 0
- state.my_state += 1
- end
- end
+ describe "do/end style blocks" do
+ it 'should accept multiple parameters' do
+ @set.create_command "walking-spanish", "litella", :takes_block => true do
+ def process
+ inject_var(:@x, command_block.call(1, 2), target)
+ end
+ end
+
+ redirect_pry_io(InputTester.new("walking-spanish | do |x, y|",
+ " [x, y]",
+ "end",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == [1, 2]
+ end
+ end
+ end
- create_command "sanders", "desc" do
- def process
- state.my_state = "wood"
- end
- end
+ describe "closure behaviour" do
+ it 'should close over locals in the definition context' do
+ redirect_pry_io(InputTester.new("var = :hello",
+ "walking-spanish | { var }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :hello
+ end
+ end
- create_command /[Hh]ello-world/, "desc" do
- def process
- state.my_state ||= 0
- state.my_state += 2
- end
- end
+ describe "exposing block parameter" do
+ describe "block_command" do
+ it "should expose block in command_block method" do
+ @set.block_command "walking-spanish", "glass full of sand", :takes_block => true do
+ inject_var(:@x, command_block.call, target)
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :jesus
+ end
+ end
- end.import Pry::Commands
- end
-
- it 'should save state for the command on the Pry#command_state hash' do
- instance = nil
- redirect_pry_io(InputTester.new("litella",
- "exit-all")) do
- instance = Pry.new(:commands => @set)
- instance.repl
- end
-
- instance.command_state["litella"].my_state.should == 1
- end
-
- it 'should ensure state is maintained between multiple invocations of command' do
- instance = nil
- redirect_pry_io(InputTester.new("litella", "litella",
- "exit-all")) do
- instance = Pry.new(:commands => @set)
- instance.repl
- end
-
- instance.command_state["litella"].my_state.should == 2
- end
-
- it 'should ensure state with same name stored seperately for each command' do
- instance = nil
- redirect_pry_io(InputTester.new("litella", "sanders", "exit-all")) do
- instance = Pry.new(:commands => @set)
- instance.repl
- end
-
- instance.command_state["litella"].my_state.should == 1
- instance.command_state["sanders"].my_state.should =="wood"
- end
-
- it 'should ensure state is properly saved for regex commands' do
- instance = nil
- redirect_pry_io(InputTester.new("hello-world", "Hello-world", "exit-all")) do
- instance = Pry.new(:commands => @set)
- instance.repl
- end
-
- instance.command_state[/[Hh]ello-world/].my_state.should == 4
- end
- end
- end
+ describe "create_command" do
+ it "should NOT expose &block in create_command's process method" do
+ @set.create_command "walking-spanish", "down the hall", :takes_block => true do
+ def process(&block)
+ inject_var(:@x, block.call, target)
+ end
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all")) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == nil
+ end
+
+ it "should expose block in command_block method" do
+ @set.create_command "walking-spanish", "homemade special", :takes_block => true do
+ def process
+ inject_var(:@x, command_block.call, target)
+ end
+ end
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
+ "exit-all"), out = StringIO.new) do
+ Pry.start @context, :commands => @set
+ end
+ @context.instance_variable_get(:@x).should == :jesus
+ end
+ end
+ end
+ end
+
+ describe "commands made with custom sub-classes" do
+ before do
+
+ class MyTestCommand < Pry::ClassCommand
+ match /my-*test/
+ description "So just how many sound technicians does it take to change a lightbulb? 1? 2? 3? 1-2-3? Testing?"
+ options :shellwords => false, :listing => "my-test"
+
+ def process
+ output.puts command_name * 2
+ end
+ end
+
+ Pry.commands.add_command MyTestCommand
+ end
+
+ after do
+ Pry.commands.delete 'my-test'
+ end
+
+ it "should allow creating custom sub-classes of Pry::Command" do
+ mock_pry("my---test").should =~ /my-testmy-test/
+ end
+
+ it "should show the source of the process method" do
+ mock_pry("show-command my-test").should =~ /output.puts command_name/
+ end
+ end
+
+ describe "commands can save state" do
+ before do
+ @set = Pry::CommandSet.new do
+ create_command "litella", "desc" do
+ def process
+ state.my_state ||= 0
+ state.my_state += 1
+ end
+ end
+
+ create_command "sanders", "desc" do
+ def process
+ state.my_state = "wood"
+ end
+ end
+
+ create_command /[Hh]ello-world/, "desc" do
+ def process
+ state.my_state ||= 0
+ state.my_state += 2
+ end
+ end
+
+ end.import Pry::Commands
+ end
+
+ it 'should save state for the command on the Pry#command_state hash' do
+ instance = nil
+ redirect_pry_io(InputTester.new("litella",
+ "exit-all")) do
+ instance = Pry.new(:commands => @set)
+ instance.repl
+ end
+
+ instance.command_state["litella"].my_state.should == 1
+ end
+
+ it 'should ensure state is maintained between multiple invocations of command' do
+ instance = nil
+ redirect_pry_io(InputTester.new("litella", "litella",
+ "exit-all")) do
+ instance = Pry.new(:commands => @set)
+ instance.repl
+ end
+
+ instance.command_state["litella"].my_state.should == 2
+ end
+
+ it 'should ensure state with same name stored seperately for each command' do
+ instance = nil
+ redirect_pry_io(InputTester.new("litella", "sanders", "exit-all")) do
+ instance = Pry.new(:commands => @set)
+ instance.repl
+ end
+
+ instance.command_state["litella"].my_state.should == 1
+ instance.command_state["sanders"].my_state.should =="wood"
+ end
+
+ it 'should ensure state is properly saved for regex commands' do
+ instance = nil
+ redirect_pry_io(InputTester.new("hello-world", "Hello-world", "exit-all")) do
+ instance = Pry.new(:commands => @set)
+ instance.repl
+ end
+
+ instance.command_state[/[Hh]ello-world/].my_state.should == 4
+ end
+ end
+
+ describe 'group' do
+ before do
+ @set.import Pry::DefaultCommands::Cd
+ end
+
+ it 'should not change once it is initialized' do
+ @set.commands["cd"].group("-==CD COMMAND==-")
+ @set.commands["cd"].group.should == "Context"
+ end
+
+ it 'should be correct for default commands' do
+ @set.commands["cd"].group.should == "Context"
+ @set.commands["help"].group.should == "Help"
+ end
+ end
+end

0 comments on commit 94fbfab

Please sign in to comment.
Something went wrong with that request. Please try again.