binding.repl 0.1.1.1 → 0.3.0

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.
@@ -1,3 +1,23 @@
1
+ == v0.3.0
2
+ - add Binding.repl.add
3
+ add a ruby console to binding.repl
4
+
5
+ - add lib/binding.repl/{pry,irb,ripl}.rb
6
+ individual files for each console that use Binding.repl.add
7
+
8
+ - modularize design, cleanup internals
9
+ the anonymous class is gone because constant lookup rules are a
10
+ pain with anonymous classes. The class we create is available at
11
+ Binding.repl and nowhere else, though.
12
+
13
+ == v0.2.0
14
+ - call IRB.setup() once
15
+ fixes #4
16
+
17
+ - add binding.repl.auto
18
+ auto discover the first available console.
19
+ fixes #3
20
+
1
21
  == v0.1.1.1
2
22
  - doc improvements
3
23
 
data/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  __DESCRIPTION__
9
9
 
10
10
  __binding.repl__ can start a number of different ruby consoles at runtime.
11
- IRB, ripl, and Pry(of course!) can be invoked at runtime in any context
11
+ IRB, ripl, and pry(of course!) can be invoked at runtime in any context
12
12
  that an instance of `Binding` closes over.
13
13
 
14
14
  I owe all credit to John Mair([banisterfiend](https://github.com/banister)),
@@ -29,27 +29,36 @@ consoles (if I missed one, open an issue or send an e-note :)).
29
29
  __EXAMPLES__
30
30
 
31
31
  ```ruby
32
- class Foo
33
- binding.repl.pry # invoke pry in context of "Foo"
34
- binding.repl.ripl # invoke ripl in context of "Foo"
35
- binding.repl.irb # invoke irb in context of "Foo"
36
- end
37
-
38
- class BlogsController < ActionController::Base
39
- def index
32
+ class BlogsController < ApplicationController
33
+ def show
40
34
  @blog = Blog.find(params[:id])
35
+ # invoke pry,irb, or ripl in the context of the 'show' method.
41
36
  binding.repl.{pry,irb,ripl}
42
37
  end
43
38
  end
39
+
40
+ class Bar
41
+ # auto discover the first available console.
42
+ # default order is: ripl, pry, or irb.
43
+ binding.repl.auto
44
+
45
+ # change default load order
46
+ Binding.repl.auto_load_order = %w(pry ripl irb)
47
+
48
+ # remove "irb" from auto discovery
49
+ Binding.repl.auto_load_order -= ["irb"]
50
+ end
44
51
  ```
45
52
 
46
53
  __NOTES__
47
54
 
48
- _CAVAETS_
55
+ _CONFIGURATION_
49
56
 
50
- Ripl and Pry can be customized by passing a set of key-value pairs but
51
- IRB cannot. ripl can be invoked with options that are forwarded to
52
- `Ripl.start(…)`:
57
+ ripl and pry can be customized by passing a set of key-value pairs but
58
+ IRB isn't as straight forward to configure and I haven't implemented
59
+ any customization options for it yet.
60
+
61
+ ripl can be invoked with options that are forwarded to `Ripl.start(…)`:
53
62
 
54
63
  ```ruby
55
64
  class Foo
@@ -57,7 +66,7 @@ class Foo
57
66
  end
58
67
  ```
59
68
 
60
- Pry can be configured in the same way. options are forwarded to `Pry.start(…)`:
69
+ pry can be configured in the same way. options are forwarded to `Pry.start(…)`:
61
70
 
62
71
  ```ruby
63
72
  class Foo
@@ -65,6 +74,8 @@ class Foo
65
74
  end
66
75
  ```
67
76
 
77
+ _RIPL & IRB_
78
+
68
79
  I have only used Ripl once(to write this library) and I don't use IRB
69
80
  much anymore. If I can improve support for either please let me know
70
81
  via an issue or pull request/e-note.
@@ -72,9 +83,9 @@ via an issue or pull request/e-note.
72
83
 
73
84
  _DEPENDENCIES_
74
85
 
75
- binding.repl doesn't depend on anything. it's up to you to meet the
76
- dependencies(pry, irb, and/or ripl). `binding.repl.{ripl,pry,irb}`
77
- will try to load the appropiate console for you if it looks like it
86
+ binding.repl doesn't depend on anything. it's up to you to meet the
87
+ dependencies(pry, irb, and/or ripl). `binding.repl.{ripl,pry,irb}`
88
+ will try to load the appropiate console for you if it looks like it
78
89
  hasn't been loaded yet.
79
90
 
80
91
  __INSTALL__
@@ -87,10 +98,10 @@ gem install binding.repl
87
98
 
88
99
  __CREDIT__
89
100
 
90
- - [banisterfiend](https://github.com/banister) (John Mair)
101
+ - [banisterfiend](https://github.com/banister) (John Mair)
91
102
  for pry
92
103
 
93
- - [Kyrylo](https://github.com/kyrylo) (Kyrylo Silin)
104
+ - [Kyrylo](https://github.com/kyrylo) (Kyrylo Silin)
94
105
  for his hard work on pry.
95
106
 
96
107
  Rest of the Pry team(!!):
@@ -5,9 +5,9 @@ Gem::Specification.new do |spec|
5
5
  spec.version = Binding.repl.version
6
6
  spec.authors = ["Robert Gleeson"]
7
7
  spec.email = ["rob@flowof.info"]
8
- spec.description = "binding.repl provides the same binding.pry interface to all ruby consoles"
9
- spec.summary = "binding.repl provides the same binding.pry interface to all ruby consoles"
10
- spec.homepage = ""
8
+ spec.description = "binding.repl: binding.pry for all ruby consoles"
9
+ spec.summary = spec.description
10
+ spec.homepage = "https://github.com/robgleeson/binding.repl"
11
11
  spec.license = "MIT"
12
12
 
13
13
  spec.files = `git ls-files`.split($/)
@@ -1,54 +1,90 @@
1
- klass = Class.new do
2
- self.const_set :BindingMixin, Module.new {
1
+ class BindingRepl
2
+ module BindingMixin
3
3
  def repl
4
4
  Binding.repl.new(self)
5
5
  end
6
- }
6
+ end
7
+
8
+ LOOKUP = {}
9
+ LOOKUP.default = [proc { true }, proc { :'binding.repl.unknown_console' }]
10
+ private_constant :LOOKUP
11
+
12
+ def self.name
13
+ "binding.repl"
14
+ end
15
+
16
+ def self.inspect
17
+ name
18
+ end
7
19
 
8
20
  def self.version
9
- "0.1.1.1"
21
+ "0.3.0"
10
22
  end
11
23
 
12
- def initialize(binding)
13
- @binding = binding
24
+ def self.add(console, predicate, runner)
25
+ LOOKUP[console] = [predicate, runner]
26
+ define_method(console) do |options = {}|
27
+ exit_value = invoke_console(console, options)
28
+ error?(exit_value) ? fail!(console) : exit_value
29
+ end
14
30
  end
15
31
 
16
- def pry(options = {})
17
- safe_require "pry", defined?(Pry)
18
- @binding.pry options
32
+ def self.auto_load_order=(order)
33
+ @auto_load_order = order
19
34
  end
20
35
 
21
- def ripl(options = {})
22
- safe_require "ripl", defined?(Ripl)
23
- Ripl.start options.merge(:binding => @binding)
36
+ def self.auto_load_order
37
+ @auto_load_order
24
38
  end
25
39
 
26
- def irb(options = nil)
27
- # Insane API, but here it is (IRB.start() doesn't take binding).
28
- safe_require "irb", defined?(IRB)
29
- IRB.setup(nil)
30
- irb = IRB::Irb.new IRB::WorkSpace.new(@binding)
31
- IRB.conf[:IRB_RC].call(irb.context) if IRB.conf[:IRB_RC]
32
- IRB.conf[:MAIN_CONTEXT] = irb.context
33
- trap("SIGINT") do
34
- irb.signal_handle
35
- end
36
- catch(:IRB_EXIT) do
37
- irb.eval_input
40
+ def initialize(binding)
41
+ @binding = binding
42
+ @lookup = LOOKUP
43
+ end
44
+
45
+ def auto
46
+ load_order = Binding.repl.auto_load_order
47
+ load_order.each do |console|
48
+ exit_value = invoke_console(console.to_sym, {})
49
+ return exit_value unless error?(exit_value)
38
50
  end
51
+ raise LoadError, "failed to load consoles: #{load_order.join(", ")}", []
39
52
  end
40
53
 
41
54
  private
42
- def safe_require(lib, already_loaded)
43
- unless already_loaded
44
- require(lib)
55
+ def fail!(console)
56
+ raise LoadError, "the console '#{console}' could not be loaded. is #{console} installed?", []
57
+ end
58
+
59
+ def error?(exit_value)
60
+ exit_value.to_s.start_with? "binding.repl"
61
+ end
62
+
63
+ def invoke_console(console, options)
64
+ require_predicate, runner = @lookup[console]
65
+ require_console(console, require_predicate)
66
+ runner.call(@binding, options)
67
+ rescue LoadError
68
+ :'binding.repl.load_error'
69
+ end
70
+
71
+ def require_console(console, predicate)
72
+ already_required = predicate.call
73
+ if !already_required
74
+ require(console.to_s)
75
+ # IRB hack.
76
+ IRB.setup(nil) if console == :irb
45
77
  end
46
- rescue LoadError => e
47
- raise e, "the ruby console '#{lib}' could not be loaded. is '#{lib}' installed?"
48
78
  end
49
79
  end
50
80
 
81
+ klass = BindingRepl
82
+ Object.send :remove_const, :BindingRepl
51
83
  Binding.class_eval do
52
84
  define_singleton_method(:repl) { klass }
53
- include Binding.repl::BindingMixin
85
+ include klass::BindingMixin
86
+ repl.auto_load_order = %w(ripl pry irb)
54
87
  end
88
+ require_relative "binding.repl/pry"
89
+ require_relative "binding.repl/irb"
90
+ require_relative "binding.repl/ripl"
@@ -0,0 +1,10 @@
1
+ predicate = lambda do
2
+ defined?(IRB)
3
+ end
4
+ runner = lambda do |binding, options|
5
+ irb = IRB::Irb.new IRB::WorkSpace.new(binding)
6
+ IRB.conf[:MAIN_CONTEXT] = irb.context
7
+ trap("SIGINT") { irb.signal_handle }
8
+ catch(:IRB_EXIT) { irb.eval_input }
9
+ end
10
+ Binding.repl.add :irb, predicate, runner
@@ -0,0 +1,7 @@
1
+ predicate = lambda do
2
+ defined?(Pry)
3
+ end
4
+ runner = lambda do |binding, options|
5
+ binding.public_send :pry, options
6
+ end
7
+ Binding.repl.add :pry, predicate, runner
@@ -0,0 +1,7 @@
1
+ predicate = lambda do
2
+ defined?(Ripl)
3
+ end
4
+ runner = lambda do |binding, options|
5
+ Ripl.start options.merge(binding: binding)
6
+ end
7
+ Binding.repl.add :ripl, predicate, runner
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binding.repl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-26 00:00:00.000000000 Z
12
+ date: 2013-09-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,7 +43,7 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
- description: binding.repl provides the same binding.pry interface to all ruby consoles
46
+ description: ! 'binding.repl: binding.pry for all ruby consoles'
47
47
  email:
48
48
  - rob@flowof.info
49
49
  executables: []
@@ -59,7 +59,10 @@ files:
59
59
  - Rakefile
60
60
  - binding.repl.gemspec
61
61
  - lib/binding.repl.rb
62
- homepage: ''
62
+ - lib/binding.repl/irb.rb
63
+ - lib/binding.repl/pry.rb
64
+ - lib/binding.repl/ripl.rb
65
+ homepage: https://github.com/robgleeson/binding.repl
63
66
  licenses:
64
67
  - MIT
65
68
  post_install_message:
@@ -80,11 +83,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
83
  version: '0'
81
84
  segments:
82
85
  - 0
83
- hash: -3088308682955123081
86
+ hash: 2298799895627227771
84
87
  requirements: []
85
88
  rubyforge_project:
86
89
  rubygems_version: 1.8.23
87
90
  signing_key:
88
91
  specification_version: 3
89
- summary: binding.repl provides the same binding.pry interface to all ruby consoles
92
+ summary: ! 'binding.repl: binding.pry for all ruby consoles'
90
93
  test_files: []