repl_runner 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6202f0b227dbf9c88ab52cf6f10b7294c2f97630
4
- data.tar.gz: 0dad45ad6ab909015bda06202b69496a18c6260e
3
+ metadata.gz: 17d75b996b5cda53bf314490ad7f65a014cae74f
4
+ data.tar.gz: 3d3a8e485b8ec3994c956c91155722788682efd0
5
5
  SHA512:
6
- metadata.gz: b54cd9a521ec9df9c82086d4b7441ea7d04c3a09ad5fd384dfb2200b922579a0269e05fb5a17195aef7cd4af99bc43a830eb6ac05c93705ccf4c5c9b3d3a21b9
7
- data.tar.gz: a963bcb45e11f9b1b74016d996923994a49e2310fbbc8f6023f68e12b719313b85bb788401b257d44d01a09a34cfa5af86f8b38adb843dbd3814a7fb5c031bf7
6
+ metadata.gz: dc1f2891ff45a80042105f1562fc86bca5de45964f7ff02079c9085220e6fc0b12c852bab3453fe9e5541928c1996cd11187b860590e9c803e3c9fa1833bd654
7
+ data.tar.gz: 4bf24b4a0f3275ae713a68098810bb33dc330065ddcef38b2605495daa59e54aa5cc838c216bf116e0c513740cfe91f6e6a896f711fa3b76857a3aa714b9dead
@@ -1,3 +1,7 @@
1
+ ## 0.0.3 (02/18/2014)
2
+
3
+ * Ability to register commands by regex `ReplRunner.register_command(/^bin\/rails/)`
4
+
1
5
  ## 0.0.2 (10/02/2013)
2
6
 
3
7
  * Remove trailing prompts by default
data/README.md CHANGED
@@ -28,7 +28,7 @@ Then run `$ bundle install`.
28
28
 
29
29
  To open a remote rails console on heroku with the heroku toolbelt installed, you could drive it like this:
30
30
 
31
- ```
31
+ ```ruby
32
32
  ReplRunner.new(:rails_console, "heroku run rails console -a testapp").run do |repl|
33
33
  repl.run('a = 1 + 1') {|result| assert_match '2', result }
34
34
  repl.run('"hello" + "world"') {|result| assert_match 'helloworld', result }
@@ -36,6 +36,8 @@ ReplRunner.new(:rails_console, "heroku run rails console -a testapp").run do |re
36
36
  end
37
37
  ```
38
38
 
39
+ **Note:** do not forget to call `run` on the ReplRunner object.
40
+
39
41
  The first argument `:rails_console` tells ReplReader what type of a session we are going to open up. The second `"heroku run rails console -a testapp"` is the command we want to use to start our psuedo remote terminal.
40
42
 
41
43
  You can then call `run` on this and pass in a block. The block yields to a `MultiRepl` instance that can take the command `run` along with arguments to pass into the command line such as `'1+1'`
@@ -47,13 +49,13 @@ Also note that you will get the entire return including any prompts if you run a
47
49
  ```
48
50
  $ irb
49
51
  1.9.3p392 :001 > 1 + 1
50
- => 2
52
+ => 2
51
53
  ```
52
54
 
53
55
  So when you run this via ReplRunner you will get a result string like this
54
56
 
55
- ```
56
- ReplRunner.new(:irb) do |repl|
57
+ ```ruby
58
+ ReplRunner.new(:irb).run do |repl|
57
59
  repl.run('1 + 1') {|result| puts result }
58
60
  end
59
61
  " => 2\r\r\n"
@@ -6,11 +6,12 @@ require 'pty'
6
6
  require 'active_support/core_ext/object/blank'
7
7
 
8
8
  class ReplRunner
9
- attr_accessor :command, :repl
9
+ attr_accessor :command, :repl, :config
10
10
 
11
- class NoResults < StandardError
12
- def initialize(command, string)
13
- msg = "No result found for command: #{command.inspect} in output: #{string.inspect}"
11
+ class NoResultsError < StandardError
12
+ def initialize(command, regex, string)
13
+ msg = "No result found for command: #{command.inspect}\nIn output: \n #{string.inspect}\n"
14
+ msg << "Using regex: \n /#{regex}/\n"
14
15
  super(msg)
15
16
  end
16
17
  end
@@ -23,15 +24,23 @@ class ReplRunner
23
24
  end
24
25
 
25
26
  def initialize(cmd_type, command = nil, options = {})
27
+ raise "Unexpected block, use the `run` command instead?" if block_given?
26
28
  command = cmd_type.to_s if command.nil?
27
29
  cmd_type = cmd_type.chomp.gsub(/\s/, '_').to_sym if cmd_type.is_a?(String)
28
30
  @command = command
29
31
  @repl = nil
30
- @config = known_configs[cmd_type]
32
+ @config = get_config_for_command(cmd_type)
31
33
  raise UnregisteredCommand.new(cmd_type) unless @config
32
34
  @options = options
33
35
  end
34
36
 
37
+ def get_config_for_command(cmd_type)
38
+ known_configs.detect do |cmd_match, config|
39
+ return config if cmd_match == cmd_type
40
+ return config if cmd_match.is_a?(Regexp) && cmd_match =~ cmd_type.to_s
41
+ end
42
+ end
43
+
35
44
  def known_configs
36
45
  self.class.known_configs
37
46
  end
@@ -61,13 +70,13 @@ class ReplRunner
61
70
 
62
71
  def zip(string)
63
72
  results = []
64
- lines = string.lines.map(&:rstrip)
73
+ inputs = string.lines.map(&:rstrip)
65
74
  self.run do |repl|
66
- lines.each do |line|
75
+ inputs.each do |line|
67
76
  repl.run(line) {|result| results << result }
68
77
  end
69
78
  end
70
- lines.zip(results)
79
+ inputs.zip(results)
71
80
  end
72
81
 
73
82
  def run(&block)
@@ -1,4 +1,4 @@
1
- ReplRunner.register_command(:rails_console, :irb) do |config|
1
+ ReplRunner.register_command(:rails_console, :irb, /^bin\/rails/) do |config|
2
2
  config.terminate_command "exit" # the command you use to end the 'rails console'
3
3
  config.startup_timeout 60 # seconds to boot
4
4
  config.return_char "\n" # the character that submits the command
@@ -24,7 +24,7 @@ class ReplRunner
24
24
  regex = command_to_regex(command)
25
25
  before, match, result = string.rpartition(regex)
26
26
 
27
- raise NoResults.new(command, raw) if result.empty?
27
+ raise NoResultsError.new(command, regex, raw) if result.empty?
28
28
 
29
29
  string = before
30
30
  @parsed_result << result.rpartition(STRIP_TRAILING_PROMPT_REGEX).first
@@ -73,7 +73,7 @@ class ReplRunner
73
73
  @jobs.each_with_index do |job, index|
74
74
  job.call(output_array[index])
75
75
  end
76
- rescue NoResults => e
76
+ rescue NoResultsError => e
77
77
  raise e, "Booting up REPL with command: #{command.inspect} \n#{e.message}"
78
78
  end
79
79
  end
@@ -1,3 +1,3 @@
1
1
  class ReplRunner
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -25,4 +25,9 @@ class ConfigTest < Test::Unit::TestCase
25
25
 
26
26
  assert_equal @hash, config.to_options
27
27
  end
28
+
29
+ def test_default_config
30
+ runner = ReplRunner.new("bin/rails console")
31
+ assert_equal "exit", runner.config.to_options[:terminate_command]
32
+ end
28
33
  end
@@ -9,10 +9,22 @@ class StreamExecTest < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_multi_command_read
12
- repl = ReplRunner::PtyParty.new("irb --simple-prompt")
12
+ repl = ReplRunner::PtyParty.new("env TERM=ansi-mono irb --simple-prompt")
13
13
  repl.write("STDOUT.sync = true\n")
14
14
  repl.write("1+1\n")
15
15
  repl.write("exit\n")
16
- assert_equal "STDOUT.sync = true\r\n1+1\r\nexit\r\n>> STDOUT.sync = true\r\n=> true\r\n>> 1+1\r\n=> 2\r\n>> exit\r\n", repl.read
16
+ result = repl.read
17
+ [
18
+ "STDOUT.sync = true",
19
+ "1+1",
20
+ "exit",
21
+ ">> STDOUT.sync = true",
22
+ "=> true",
23
+ ">> 1+1",
24
+ "=> 2",
25
+ ">> exit"
26
+ ].each do |expected|
27
+ assert_match /#{Regexp.escape(expected)}/, result
28
+ end
17
29
  end
18
30
  end
@@ -19,6 +19,13 @@ class ReplRunnerTest < Test::Unit::TestCase
19
19
  end
20
20
  end
21
21
 
22
+ def test_forgot_run
23
+ assert_raise RuntimeError do
24
+ ReplRunner.new(:irb, "irb") do |repl|
25
+ end
26
+ end
27
+ end
28
+
22
29
  def test_does_not_have_trailing_prompts
23
30
  ReplRunner.new(:irb, "irb ").run do |repl|
24
31
  repl.run('111+111') {|r| assert_equal "=> 222", r.strip }
@@ -26,7 +33,7 @@ class ReplRunnerTest < Test::Unit::TestCase
26
33
  end
27
34
 
28
35
  def test_ensure_exit
29
- assert_raise(ReplRunner::NoResults) do
36
+ assert_raise(ReplRunner::NoResultsError) do
30
37
  ReplRunner.new(:irb, "irb -r ./test/require/never-boots.rb", startup_timeout: 2).run do |repl|
31
38
  repl.run('111+111') {|r| }
32
39
  end
@@ -46,19 +53,25 @@ class ReplRunnerTest < Test::Unit::TestCase
46
53
  end
47
54
 
48
55
  def test_zipping_commands
49
- commands = "a = 3\nb = 'foo' * a\nputs b"
50
- zip = ReplRunner.new(:irb).zip(commands)
51
- actual = [["a = 3", "=> 3\r"],
52
- ["b = 'foo' * a", "=> \"foofoofoo\"\r"],
53
- ["puts b", "foofoofoo\r\n=> nil\r"]]
54
- assert_equal actual, zip
56
+ commands = []
57
+ results = []
58
+ commands << "a = 3\n"
59
+ commands << "b = 'foo' * a\n"
60
+ commands << "puts b"
61
+
62
+ repl = ReplRunner.new(:irb)
63
+ zip = repl.zip(commands.join(""))
64
+
65
+ repl.run do |repl|
66
+ commands.each do |command|
67
+ repl.run(command.rstrip) {|r| results << r }
68
+ end
69
+ end
70
+ expected = [[commands[0].rstrip, results[0]],
71
+ [commands[1].rstrip, results[1]],
72
+ [commands[2].rstrip, results[2]]]
73
+ assert_equal expected, zip
55
74
 
56
- expected = ["a = 3",
57
- "=> 3\r",
58
- "b = 'foo' * a",
59
- "=> \"foofoofoo\"\r",
60
- "puts b",
61
- "foofoofoo\r\n=> nil\r"]
62
- assert_equal expected, zip.flatten
75
+ assert_equal expected.flatten, zip.flatten
63
76
  end
64
77
  end
metadata CHANGED
@@ -1,66 +1,66 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repl_runner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-02 00:00:00.000000000 Z
11
+ date: 2014-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mocha
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description: ' Programatically drive REPL like interfaces, irb, bash, etc. '
55
+ description: " Programatically drive REPL like interfaces, irb, bash, etc. "
56
56
  email:
57
57
  - richard@heroku.com
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
63
- - .travis.yml
62
+ - ".gitignore"
63
+ - ".travis.yml"
64
64
  - CHANGELOG.md
65
65
  - Gemfile
66
66
  - LICENSE
@@ -91,17 +91,17 @@ require_paths:
91
91
  - lib
92
92
  required_ruby_version: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  requirements:
99
- - - '>='
99
+ - - ">="
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
102
  requirements: []
103
103
  rubyforge_project:
104
- rubygems_version: 2.0.3
104
+ rubygems_version: 2.2.0
105
105
  signing_key:
106
106
  specification_version: 4
107
107
  summary: Run your REPL like interfaces like never before
@@ -113,3 +113,4 @@ test_files:
113
113
  - test/repl_runner_test.rb
114
114
  - test/require/never-boots.rb
115
115
  - test/test_helper.rb
116
+ has_rdoc: