pry 0.9.9.6 → 0.9.10pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/CHANGELOG +35 -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 +87 -30
  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 +12 -12
  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 +65 -24
@@ -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