pry 0.9.9.6pre2-java → 0.9.10-java

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.
Files changed (68) hide show
  1. data/CHANGELOG +41 -0
  2. data/CONTRIBUTORS +27 -26
  3. data/README.markdown +4 -4
  4. data/Rakefile +2 -2
  5. data/lib/pry.rb +25 -19
  6. data/lib/pry/cli.rb +31 -10
  7. data/lib/pry/code.rb +41 -83
  8. data/lib/pry/command.rb +87 -76
  9. data/lib/pry/command_set.rb +13 -20
  10. data/lib/pry/completion.rb +139 -121
  11. data/lib/pry/config.rb +4 -0
  12. data/lib/pry/core_extensions.rb +88 -31
  13. data/lib/pry/default_commands/cd.rb +31 -8
  14. data/lib/pry/default_commands/context.rb +4 -58
  15. data/lib/pry/default_commands/easter_eggs.rb +1 -1
  16. data/lib/pry/default_commands/editing.rb +21 -14
  17. data/lib/pry/default_commands/find_method.rb +5 -7
  18. data/lib/pry/default_commands/gist.rb +187 -0
  19. data/lib/pry/default_commands/hist.rb +6 -6
  20. data/lib/pry/default_commands/input_and_output.rb +73 -129
  21. data/lib/pry/default_commands/introspection.rb +107 -52
  22. data/lib/pry/default_commands/ls.rb +1 -1
  23. data/lib/pry/default_commands/misc.rb +0 -5
  24. data/lib/pry/default_commands/whereami.rb +92 -0
  25. data/lib/pry/helpers/base_helpers.rb +6 -1
  26. data/lib/pry/helpers/command_helpers.rb +30 -9
  27. data/lib/pry/helpers/documentation_helpers.rb +7 -7
  28. data/lib/pry/helpers/options_helpers.rb +1 -1
  29. data/lib/pry/helpers/text.rb +7 -9
  30. data/lib/pry/history.rb +15 -2
  31. data/lib/pry/hooks.rb +1 -1
  32. data/lib/pry/indent.rb +17 -10
  33. data/lib/pry/method.rb +35 -19
  34. data/lib/pry/module_candidate.rb +130 -0
  35. data/lib/pry/pry_class.rb +54 -22
  36. data/lib/pry/pry_instance.rb +71 -14
  37. data/lib/pry/repl_file_loader.rb +80 -0
  38. data/lib/pry/version.rb +1 -1
  39. data/lib/pry/wrapped_module.rb +121 -142
  40. data/pry.gemspec +13 -13
  41. data/test/candidate_helper1.rb +11 -0
  42. data/test/candidate_helper2.rb +8 -0
  43. data/test/helper.rb +16 -0
  44. data/test/test_code.rb +1 -1
  45. data/test/test_command.rb +364 -270
  46. data/test/test_command_integration.rb +235 -267
  47. data/test/test_completion.rb +36 -0
  48. data/test/test_control_d_handler.rb +45 -0
  49. data/test/test_default_commands/example.erb +5 -0
  50. data/test/test_default_commands/test_cd.rb +316 -11
  51. data/test/test_default_commands/test_context.rb +143 -192
  52. data/test/test_default_commands/test_documentation.rb +81 -14
  53. data/test/test_default_commands/test_find_method.rb +10 -2
  54. data/test/test_default_commands/test_input.rb +102 -111
  55. data/test/test_default_commands/test_introspection.rb +17 -12
  56. data/test/test_default_commands/test_ls.rb +8 -6
  57. data/test/test_default_commands/test_shell.rb +18 -15
  58. data/test/test_default_commands/test_show_source.rb +170 -44
  59. data/test/test_exception_whitelist.rb +6 -2
  60. data/test/test_hooks.rb +32 -0
  61. data/test/test_input_stack.rb +19 -16
  62. data/test/test_method.rb +0 -4
  63. data/test/test_prompt.rb +60 -0
  64. data/test/test_pry.rb +23 -31
  65. data/test/test_pry_defaults.rb +75 -57
  66. data/test/test_syntax_checking.rb +12 -11
  67. data/test/test_wrapped_module.rb +103 -0
  68. metadata +72 -26
@@ -26,7 +26,7 @@ describe Pry::Code do
26
26
  should 'raise an error if the file doesn\'t exist' do
27
27
  proc do
28
28
  Pry::Code.from_file('/knalkjsdnalsd/alkjdlkq')
29
- end.should.raise(Pry::CommandError)
29
+ end.should.raise(MethodSource::SourceNotFoundError)
30
30
  end
31
31
  end
32
32
 
@@ -213,7 +213,7 @@ describe "Pry::Command" do
213
213
  it 'should provide opts and args as provided by slop' do
214
214
  cmd = @set.create_command 'lintilla', "One of 800,000,000 clones" do
215
215
  def options(opt)
216
- opt.on :f, :four, "A numeric four", :as => Integer, :optional => true
216
+ opt.on :f, :four, "A numeric four", :as => Integer, :optional_argument => true
217
217
  end
218
218
 
219
219
  def process
@@ -342,285 +342,379 @@ describe "Pry::Command" do
342
342
  end
343
343
  end
344
344
 
345
- describe "block parameters" do
346
- before do
347
- @context = Object.new
348
- @set.command "walking-spanish", "down the hall", :takes_block => true do
349
- inject_var(:@x, command_block.call, target)
350
- end
351
- @set.import Pry::Commands
352
- end
353
-
354
- it 'should accept multiline blocks' do
355
- redirect_pry_io(InputTester.new("walking-spanish | do",
356
- " :jesus",
357
- "end",
358
- "exit-all"), out = StringIO.new) do
359
- Pry.start @context, :commands => @set
360
- end
361
- @context.instance_variable_get(:@x).should == :jesus
362
- end
363
-
364
- it 'should accept normal parameters along with block' do
365
- @set.block_command "walking-spanish", "litella's been screeching for a blind pig.", :takes_block => true do |x, y|
366
- inject_var(:@x, x, target)
367
- inject_var(:@y, y, target)
368
- inject_var(:@block_var, command_block.call, target)
369
- end
370
- redirect_pry_io(InputTester.new("walking-spanish john carl| { :jesus }",
371
- "exit-all")) do
372
- Pry.start @context, :commands => @set
373
- end
374
-
375
- @context.instance_variable_get(:@x).should == "john"
376
- @context.instance_variable_get(:@y).should == "carl"
377
- @context.instance_variable_get(:@block_var).should == :jesus
378
- end
379
-
380
- describe "single line blocks" do
381
- it 'should accept blocks with do ; end' do
382
- redirect_pry_io(InputTester.new("walking-spanish | do ; :jesus; end",
383
- "exit-all"), out = StringIO.new) do
384
- Pry.start @context, :commands => @set
385
- end
386
- @context.instance_variable_get(:@x).should == :jesus
387
- end
345
+ describe "block parameters" do
346
+ before do
347
+ @context = Object.new
348
+ @set.command "walking-spanish", "down the hall", :takes_block => true do
349
+ inject_var(:@x, command_block.call, target)
350
+ end
351
+ @set.import Pry::Commands
352
+ end
388
353
 
389
- it 'should accept blocks with do; end' do
390
- redirect_pry_io(InputTester.new("walking-spanish | do; :jesus; end",
391
- "exit-all"), out = StringIO.new) do
392
- Pry.start @context, :commands => @set
393
- end
394
- @context.instance_variable_get(:@x).should == :jesus
395
- end
354
+ it 'should accept multiline blocks' do
355
+ redirect_pry_io(InputTester.new("walking-spanish | do",
356
+ " :jesus",
357
+ "end",
358
+ "exit-all"), out = StringIO.new) do
359
+ Pry.start @context, :commands => @set
360
+ end
361
+ @context.instance_variable_get(:@x).should == :jesus
362
+ end
396
363
 
397
- it 'should accept blocks with { }' do
398
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
399
- "exit-all"), out = StringIO.new) do
400
- Pry.start @context, :commands => @set
401
- end
402
- @context.instance_variable_get(:@x).should == :jesus
403
- end
404
-
405
- end
406
-
407
- describe "block-related content removed from arguments" do
408
-
409
- describe "arg_string" do
410
- it 'should remove block-related content from arg_string (with one normal arg)' do
411
- @set.block_command "walking-spanish", "down the hall", :takes_block => true do |x, y|
412
- inject_var(:@arg_string, arg_string, target)
413
- inject_var(:@x, x, target)
414
- end
415
- redirect_pry_io(InputTester.new("walking-spanish john| { :jesus }",
416
- "exit-all")) do
417
- Pry.start @context, :commands => @set
418
- end
419
- @context.instance_variable_get(:@arg_string).should == @context.instance_variable_get(:@x)
420
- end
364
+ it 'should accept normal parameters along with block' do
365
+ @set.block_command "walking-spanish", "litella's been screeching for a blind pig.", :takes_block => true do |x, y|
366
+ inject_var(:@x, x, target)
367
+ inject_var(:@y, y, target)
368
+ inject_var(:@block_var, command_block.call, target)
369
+ end
370
+ redirect_pry_io(InputTester.new("walking-spanish john carl| { :jesus }",
371
+ "exit-all")) do
372
+ Pry.start @context, :commands => @set
373
+ end
421
374
 
422
- it 'should remove block-related content from arg_string (with no normal args)' do
423
- @set.block_command "walking-spanish", "down the hall", :takes_block => true do
424
- inject_var(:@arg_string, arg_string, target)
425
- end
426
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
427
- "exit-all")) do
428
- Pry.start @context, :commands => @set
429
- end
430
- @context.instance_variable_get(:@arg_string).should == ""
431
- end
375
+ @context.instance_variable_get(:@x).should == "john"
376
+ @context.instance_variable_get(:@y).should == "carl"
377
+ @context.instance_variable_get(:@block_var).should == :jesus
378
+ end
432
379
 
433
- it 'should NOT remove block-related content from arg_string when :takes_block => false' do
434
- block_string = "| { :jesus }"
435
- @set.block_command "walking-spanish", "homemade special", :takes_block => false do
436
- inject_var(:@arg_string, arg_string, target)
437
- end
438
- redirect_pry_io(InputTester.new("walking-spanish #{block_string}",
439
- "exit-all")) do
440
- Pry.start @context, :commands => @set
441
- end
442
- @context.instance_variable_get(:@arg_string).should == block_string
443
- end
444
- end
445
-
446
- describe "args" do
447
- describe "block_command" do
448
- it "should remove block-related content from arguments" do
449
- @set.block_command "walking-spanish", "glass is full of sand", :takes_block => true do |x, y|
450
- inject_var(:@x, x, target)
451
- inject_var(:@y, y, target)
452
- end
453
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
454
- "exit-all"), out = StringIO.new) do
455
- Pry.start @context, :commands => @set
456
- end
457
- @context.instance_variable_get(:@x).should == nil
458
- @context.instance_variable_get(:@y).should == nil
459
- end
460
-
461
- it "should NOT remove block-related content from arguments if :takes_block => false" do
462
- @set.block_command "walking-spanish", "litella screeching for a blind pig", :takes_block => false do |x, y|
463
- inject_var(:@x, x, target)
464
- inject_var(:@y, y, target)
465
- end
466
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
467
- "exit-all"), out = StringIO.new) do
468
- Pry.start @context, :commands => @set
469
- end
470
- @context.instance_variable_get(:@x).should == "|"
471
- @context.instance_variable_get(:@y).should == "{"
472
- end
473
- end
380
+ describe "single line blocks" do
381
+ it 'should accept blocks with do ; end' do
382
+ redirect_pry_io(InputTester.new("walking-spanish | do ; :jesus; end",
383
+ "exit-all"), out = StringIO.new) do
384
+ Pry.start @context, :commands => @set
385
+ end
386
+ @context.instance_variable_get(:@x).should == :jesus
387
+ end
474
388
 
475
- describe "create_command" do
476
- it "should remove block-related content from arguments" do
477
- @set.create_command "walking-spanish", "punk sanders carved one out of wood", :takes_block => true do
478
- def process(x, y)
479
- inject_var(:@x, x, target)
480
- inject_var(:@y, y, target)
481
- end
482
- end
483
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
484
- "exit-all"), out = StringIO.new) do
485
- Pry.start @context, :commands => @set
486
- end
487
- @context.instance_variable_get(:@x).should == nil
488
- @context.instance_variable_get(:@y).should == nil
489
- end
490
-
491
- it "should NOT remove block-related content from arguments if :takes_block => false" do
492
- @set.create_command "walking-spanish", "down the hall", :takes_block => false do
493
- def process(x, y)
494
- inject_var(:@x, x, target)
495
- inject_var(:@y, y, target)
496
- end
497
- end
498
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
499
- "exit-all")) do
500
- Pry.start @context, :commands => @set
501
- end
502
- @context.instance_variable_get(:@x).should == "|"
503
- @context.instance_variable_get(:@y).should == "{"
504
- end
505
- end
506
- end
507
- end
508
-
509
- describe "blocks can take parameters" do
510
- describe "{} style blocks" do
511
- it 'should accept multiple parameters' do
512
- @set.block_command "walking-spanish", "down the hall", :takes_block => true do
513
- inject_var(:@x, command_block.call(1, 2), target)
514
- end
515
-
516
- redirect_pry_io(InputTester.new("walking-spanish | { |x, y| [x, y] }",
517
- "exit-all")) do
518
- Pry.start @context, :commands => @set
519
- end
520
- @context.instance_variable_get(:@x).should == [1, 2]
521
- end
522
- end
523
-
524
- describe "do/end style blocks" do
525
- it 'should accept multiple parameters' do
526
- @set.create_command "walking-spanish", "litella", :takes_block => true do
527
- def process
528
- inject_var(:@x, command_block.call(1, 2), target)
529
- end
530
- end
531
-
532
- redirect_pry_io(InputTester.new("walking-spanish | do |x, y|",
533
- " [x, y]",
534
- "end",
535
- "exit-all")) do
536
- Pry.start @context, :commands => @set
537
- end
538
- @context.instance_variable_get(:@x).should == [1, 2]
539
- end
540
- end
541
- end
542
-
543
- describe "closure behaviour" do
544
- it 'should close over locals in the definition context' do
545
- redirect_pry_io(InputTester.new("var = :hello",
546
- "walking-spanish | { var }",
547
- "exit-all")) do
548
- Pry.start @context, :commands => @set
549
- end
550
- @context.instance_variable_get(:@x).should == :hello
551
- end
552
- end
553
-
554
- describe "exposing block parameter" do
555
- describe "block_command" do
556
- it "should expose block in command_block method" do
557
- @set.block_command "walking-spanish", "glass full of sand", :takes_block => true do
558
- inject_var(:@x, command_block.call, target)
559
- end
560
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
561
- "exit-all")) do
562
- Pry.start @context, :commands => @set
563
- end
564
- @context.instance_variable_get(:@x).should == :jesus
565
- end
566
- end
567
-
568
- describe "create_command" do
569
- it "should NOT expose &block in create_command's process method" do
570
- @set.create_command "walking-spanish", "down the hall", :takes_block => true do
571
- def process(&block)
572
- inject_var(:@x, block.call, target)
573
- end
574
- end
575
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
576
- "exit-all")) do
577
- Pry.start @context, :commands => @set
578
- end
579
- @context.instance_variable_get(:@x).should == nil
580
- end
389
+ it 'should accept blocks with do; end' do
390
+ redirect_pry_io(InputTester.new("walking-spanish | do; :jesus; end",
391
+ "exit-all"), out = StringIO.new) do
392
+ Pry.start @context, :commands => @set
393
+ end
394
+ @context.instance_variable_get(:@x).should == :jesus
395
+ end
581
396
 
582
- it "should expose block in command_block method" do
583
- @set.create_command "walking-spanish", "homemade special", :takes_block => true do
584
- def process
585
- inject_var(:@x, command_block.call, target)
586
- end
587
- end
588
- redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
589
- "exit-all"), out = StringIO.new) do
590
- Pry.start @context, :commands => @set
591
- end
592
- @context.instance_variable_get(:@x).should == :jesus
593
- end
594
- end
595
- end
596
- end
397
+ it 'should accept blocks with { }' do
398
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
399
+ "exit-all"), out = StringIO.new) do
400
+ Pry.start @context, :commands => @set
401
+ end
402
+ @context.instance_variable_get(:@x).should == :jesus
403
+ end
597
404
 
598
- describe "commands made with custom sub-classes" do
599
- before do
405
+ end
600
406
 
601
- class MyTestCommand < Pry::ClassCommand
602
- match /my-*test/
603
- description "So just how many sound technicians does it take to change a lightbulb? 1? 2? 3? 1-2-3? Testing?"
604
- options :shellwords => false, :listing => "my-test"
407
+ describe "block-related content removed from arguments" do
408
+
409
+ describe "arg_string" do
410
+ it 'should remove block-related content from arg_string (with one normal arg)' do
411
+ @set.block_command "walking-spanish", "down the hall", :takes_block => true do |x, y|
412
+ inject_var(:@arg_string, arg_string, target)
413
+ inject_var(:@x, x, target)
414
+ end
415
+ redirect_pry_io(InputTester.new("walking-spanish john| { :jesus }",
416
+ "exit-all")) do
417
+ Pry.start @context, :commands => @set
418
+ end
419
+ @context.instance_variable_get(:@arg_string).should == @context.instance_variable_get(:@x)
420
+ end
605
421
 
606
- def process
607
- output.puts command_name * 2
608
- end
609
- end
422
+ it 'should remove block-related content from arg_string (with no normal args)' do
423
+ @set.block_command "walking-spanish", "down the hall", :takes_block => true do
424
+ inject_var(:@arg_string, arg_string, target)
425
+ end
426
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
427
+ "exit-all")) do
428
+ Pry.start @context, :commands => @set
429
+ end
430
+ @context.instance_variable_get(:@arg_string).should == ""
431
+ end
610
432
 
611
- Pry.commands.add_command MyTestCommand
612
- end
433
+ it 'should NOT remove block-related content from arg_string when :takes_block => false' do
434
+ block_string = "| { :jesus }"
435
+ @set.block_command "walking-spanish", "homemade special", :takes_block => false do
436
+ inject_var(:@arg_string, arg_string, target)
437
+ end
438
+ redirect_pry_io(InputTester.new("walking-spanish #{block_string}",
439
+ "exit-all")) do
440
+ Pry.start @context, :commands => @set
441
+ end
442
+ @context.instance_variable_get(:@arg_string).should == block_string
443
+ end
444
+ end
613
445
 
614
- after do
615
- Pry.commands.delete 'my-test'
616
- end
446
+ describe "args" do
447
+ describe "block_command" do
448
+ it "should remove block-related content from arguments" do
449
+ @set.block_command "walking-spanish", "glass is full of sand", :takes_block => true do |x, y|
450
+ inject_var(:@x, x, target)
451
+ inject_var(:@y, y, target)
452
+ end
453
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
454
+ "exit-all"), out = StringIO.new) do
455
+ Pry.start @context, :commands => @set
456
+ end
457
+ @context.instance_variable_get(:@x).should == nil
458
+ @context.instance_variable_get(:@y).should == nil
459
+ end
460
+
461
+ it "should NOT remove block-related content from arguments if :takes_block => false" do
462
+ @set.block_command "walking-spanish", "litella screeching for a blind pig", :takes_block => false do |x, y|
463
+ inject_var(:@x, x, target)
464
+ inject_var(:@y, y, target)
465
+ end
466
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
467
+ "exit-all"), out = StringIO.new) do
468
+ Pry.start @context, :commands => @set
469
+ end
470
+ @context.instance_variable_get(:@x).should == "|"
471
+ @context.instance_variable_get(:@y).should == "{"
472
+ end
473
+ end
617
474
 
618
- it "should allow creating custom sub-classes of Pry::Command" do
619
- mock_pry("my---test").should =~ /my-testmy-test/
620
- end
475
+ describe "create_command" do
476
+ it "should remove block-related content from arguments" do
477
+ @set.create_command "walking-spanish", "punk sanders carved one out of wood", :takes_block => true do
478
+ def process(x, y)
479
+ inject_var(:@x, x, target)
480
+ inject_var(:@y, y, target)
481
+ end
482
+ end
483
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
484
+ "exit-all"), out = StringIO.new) do
485
+ Pry.start @context, :commands => @set
486
+ end
487
+ @context.instance_variable_get(:@x).should == nil
488
+ @context.instance_variable_get(:@y).should == nil
489
+ end
490
+
491
+ it "should NOT remove block-related content from arguments if :takes_block => false" do
492
+ @set.create_command "walking-spanish", "down the hall", :takes_block => false do
493
+ def process(x, y)
494
+ inject_var(:@x, x, target)
495
+ inject_var(:@y, y, target)
496
+ end
497
+ end
498
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
499
+ "exit-all")) do
500
+ Pry.start @context, :commands => @set
501
+ end
502
+ @context.instance_variable_get(:@x).should == "|"
503
+ @context.instance_variable_get(:@y).should == "{"
504
+ end
505
+ end
506
+ end
507
+ end
621
508
 
622
- it "should show the source of the process method" do
623
- mock_pry("show-command my-test").should =~ /output.puts command_name/
624
- end
625
- end
626
- end
509
+ describe "blocks can take parameters" do
510
+ describe "{} style blocks" do
511
+ it 'should accept multiple parameters' do
512
+ @set.block_command "walking-spanish", "down the hall", :takes_block => true do
513
+ inject_var(:@x, command_block.call(1, 2), target)
514
+ end
515
+
516
+ redirect_pry_io(InputTester.new("walking-spanish | { |x, y| [x, y] }",
517
+ "exit-all")) do
518
+ Pry.start @context, :commands => @set
519
+ end
520
+ @context.instance_variable_get(:@x).should == [1, 2]
521
+ end
522
+ end
523
+
524
+ describe "do/end style blocks" do
525
+ it 'should accept multiple parameters' do
526
+ @set.create_command "walking-spanish", "litella", :takes_block => true do
527
+ def process
528
+ inject_var(:@x, command_block.call(1, 2), target)
529
+ end
530
+ end
531
+
532
+ redirect_pry_io(InputTester.new("walking-spanish | do |x, y|",
533
+ " [x, y]",
534
+ "end",
535
+ "exit-all")) do
536
+ Pry.start @context, :commands => @set
537
+ end
538
+ @context.instance_variable_get(:@x).should == [1, 2]
539
+ end
540
+ end
541
+ end
542
+
543
+ describe "closure behaviour" do
544
+ it 'should close over locals in the definition context' do
545
+ redirect_pry_io(InputTester.new("var = :hello",
546
+ "walking-spanish | { var }",
547
+ "exit-all")) do
548
+ Pry.start @context, :commands => @set
549
+ end
550
+ @context.instance_variable_get(:@x).should == :hello
551
+ end
552
+ end
553
+
554
+ describe "exposing block parameter" do
555
+ describe "block_command" do
556
+ it "should expose block in command_block method" do
557
+ @set.block_command "walking-spanish", "glass full of sand", :takes_block => true do
558
+ inject_var(:@x, command_block.call, target)
559
+ end
560
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
561
+ "exit-all")) do
562
+ Pry.start @context, :commands => @set
563
+ end
564
+ @context.instance_variable_get(:@x).should == :jesus
565
+ end
566
+ end
567
+
568
+ describe "create_command" do
569
+ it "should NOT expose &block in create_command's process method" do
570
+ @set.create_command "walking-spanish", "down the hall", :takes_block => true do
571
+ def process(&block)
572
+ inject_var(:@x, block.call, target)
573
+ end
574
+ end
575
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
576
+ "exit-all")) do
577
+ Pry.start @context, :commands => @set
578
+ end
579
+ @context.instance_variable_get(:@x).should == nil
580
+ end
581
+
582
+ it "should expose block in command_block method" do
583
+ @set.create_command "walking-spanish", "homemade special", :takes_block => true do
584
+ def process
585
+ inject_var(:@x, command_block.call, target)
586
+ end
587
+ end
588
+ redirect_pry_io(InputTester.new("walking-spanish | { :jesus }",
589
+ "exit-all"), out = StringIO.new) do
590
+ Pry.start @context, :commands => @set
591
+ end
592
+ @context.instance_variable_get(:@x).should == :jesus
593
+ end
594
+ end
595
+ end
596
+ end
597
+
598
+ describe "commands made with custom sub-classes" do
599
+ before do
600
+
601
+ class MyTestCommand < Pry::ClassCommand
602
+ match /my-*test/
603
+ description "So just how many sound technicians does it take to change a lightbulb? 1? 2? 3? 1-2-3? Testing?"
604
+ options :shellwords => false, :listing => "my-test"
605
+
606
+ def process
607
+ output.puts command_name * 2
608
+ end
609
+ end
610
+
611
+ Pry.commands.add_command MyTestCommand
612
+ end
613
+
614
+ after do
615
+ Pry.commands.delete 'my-test'
616
+ end
617
+
618
+ it "should allow creating custom sub-classes of Pry::Command" do
619
+ mock_pry("my---test").should =~ /my-testmy-test/
620
+ end
621
+
622
+ it "should show the source of the process method" do
623
+ mock_pry("show-command my-test").should =~ /output.puts command_name/
624
+ end
625
+ end
626
+
627
+ describe "commands can save state" do
628
+ before do
629
+ @set = Pry::CommandSet.new do
630
+ create_command "litella", "desc" do
631
+ def process
632
+ state.my_state ||= 0
633
+ state.my_state += 1
634
+ end
635
+ end
636
+
637
+ create_command "sanders", "desc" do
638
+ def process
639
+ state.my_state = "wood"
640
+ end
641
+ end
642
+
643
+ create_command /[Hh]ello-world/, "desc" do
644
+ def process
645
+ state.my_state ||= 0
646
+ state.my_state += 2
647
+ end
648
+ end
649
+
650
+ end.import Pry::Commands
651
+ end
652
+
653
+ it 'should save state for the command on the Pry#command_state hash' do
654
+ instance = nil
655
+ redirect_pry_io(InputTester.new("litella",
656
+ "exit-all")) do
657
+ instance = Pry.new(:commands => @set)
658
+ instance.repl
659
+ end
660
+
661
+ instance.command_state["litella"].my_state.should == 1
662
+ end
663
+
664
+ it 'should ensure state is maintained between multiple invocations of command' do
665
+ instance = nil
666
+ redirect_pry_io(InputTester.new("litella", "litella",
667
+ "exit-all")) do
668
+ instance = Pry.new(:commands => @set)
669
+ instance.repl
670
+ end
671
+
672
+ instance.command_state["litella"].my_state.should == 2
673
+ end
674
+
675
+ it 'should ensure state with same name stored seperately for each command' do
676
+ instance = nil
677
+ redirect_pry_io(InputTester.new("litella", "sanders", "exit-all")) do
678
+ instance = Pry.new(:commands => @set)
679
+ instance.repl
680
+ end
681
+
682
+ instance.command_state["litella"].my_state.should == 1
683
+ instance.command_state["sanders"].my_state.should =="wood"
684
+ end
685
+
686
+ it 'should ensure state is properly saved for regex commands' do
687
+ instance = nil
688
+ redirect_pry_io(InputTester.new("hello-world", "Hello-world", "exit-all")) do
689
+ instance = Pry.new(:commands => @set)
690
+ instance.repl
691
+ end
692
+
693
+ instance.command_state[/[Hh]ello-world/].my_state.should == 4
694
+ end
695
+ end
696
+
697
+ describe 'group' do
698
+ before do
699
+ @set.import(
700
+ Pry::CommandSet.new do
701
+ create_command("magic") { group("Not for a public use") }
702
+ end
703
+ )
704
+ end
705
+
706
+ it 'should be correct for default commands' do
707
+ @set.commands["help"].group.should == "Help"
708
+ end
709
+
710
+ it 'should not change once it is initialized' do
711
+ @set.commands["magic"].group("-==CD COMMAND==-")
712
+ @set.commands["magic"].group.should == "Not for a public use"
713
+ end
714
+
715
+ it 'should not disappear after the call without parameters' do
716
+ @set.commands["magic"].group
717
+ @set.commands["magic"].group.should == "Not for a public use"
718
+ end
719
+ end
720
+ end