rib 1.5.4 → 1.6.1

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
- SHA1:
3
- metadata.gz: 5eff854fa46370d04aaf74853a185f40736e15d5
4
- data.tar.gz: be5170caaaf53d847c0f04123f5df93bed5f1242
2
+ SHA256:
3
+ metadata.gz: 62dad317e197fde4c11688f03c450205b2e47a7536175b9ec4fbd74bf1ba40e5
4
+ data.tar.gz: 59b8c6ac55c4fd1a95d640710e01930d8d68a636e61c86a5c2d63f0546c25123
5
5
  SHA512:
6
- metadata.gz: 4c4c343ea687a0b0e6faa6ae43e807c03c00037562868b5319a72996ecaeb10968ac16094262839a864d78912b7af679c0e76eaff446b3d45a48eb14dda1e139
7
- data.tar.gz: df8b8f84111fa7296be539be5fcc0397802507897eec7fe84acef900826fcf2fe30e122c9e5347078f822b2b922cc01bd0ccdcb24e78f5992e8f9ee1efcd2362
6
+ metadata.gz: cc4de9174c2a49db81d42ea3c91361c6f4a88435e9f169127914c94921fb7f3ddbc27673c8f5e7f70d31fbd25a163147e3dfe48c31bdeee34fcca0df38451a1a
7
+ data.tar.gz: b74d9fa8f2c8a63c92a44378e0db0a0848fd2275223fad29c885c48d67beb9b201fc24f25c639ee276e74337d195bf4e80fcc53dcf07fe42b6fc595df3cd5f3b
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,40 @@
1
+
2
+ stages:
3
+ - test
4
+
5
+ .test:
6
+ stage: test
7
+ image: ruby:${RUBY_VERSION}-bullseye
8
+ variables:
9
+ GIT_DEPTH: "1"
10
+ GIT_SUBMODULE_STRATEGY: recursive
11
+ GIT_SUBMODULE_PATHS: task
12
+ RUBYOPT: --enable-frozen-string-literal
13
+ before_script:
14
+ - bundle install --retry=3
15
+ - unset CI # Coverage doesn't work well with frozen literal
16
+ script:
17
+ - ruby -vr bundler/setup -S rake test
18
+
19
+ ruby:3.0:
20
+ extends:
21
+ - .test
22
+ variables:
23
+ RUBY_VERSION: '3.0'
24
+
25
+ ruby:3.1:
26
+ extends:
27
+ - .test
28
+ variables:
29
+ RUBY_VERSION: '3.1'
30
+
31
+ ruby:3.2:
32
+ extends:
33
+ - .test
34
+ variables:
35
+ RUBY_VERSION: '3.2'
36
+
37
+ jruby:latest:
38
+ extends:
39
+ - .test
40
+ image: jruby:latest
data/.gitmodules CHANGED
@@ -1,3 +1,3 @@
1
1
  [submodule "task"]
2
2
  path = task
3
- url = git://github.com/godfat/gemgem.git
3
+ url = https://github.com/godfat/gemgem.git
data/CHANGES.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # CHANGES
2
2
 
3
+ ## Rib 1.6.1 -- 2022-12-30
4
+
5
+ ### Bugs fixed
6
+
7
+ * Fixed `rib rack` for constant resolution.
8
+
9
+ ### Enhancement
10
+
11
+ * [more/color] Instead of using `$1` and `$2`, use `Regexp.last_match`.
12
+ It should be the same for MRI, but seems to be working better for JRuby.
13
+ Perhaps `$1` and `$2` is not thread local on JRuby?
14
+
15
+ ## Rib 1.6.0 -- 2018-06-20
16
+
17
+ * [core/multiline] Support for JRuby 9.2.0.0 is fixed
18
+ * [more/beep] It would now beep every single time when any evaluation took
19
+ longer than the threshold.
20
+ * [more/color] Fix whenever the input is just `next` or `break`
21
+ * [more/bottomup_backtrace] This would no longer format backtrace twice
22
+ * [more/caller] It would now properly use the enabled plugins
23
+ * [extra/autoindent] It would now indent with `ensure` for `begin` and `def`.
24
+ Thanks @MITSUBOSHI https://github.com/godfat/rib/pull/21 and
25
+ @alpaca-tc https://github.com/godfat/rib/pull/17
26
+ * [extra/autoindent] It would now indent with `for`.
27
+ Thanks @MITSUBOSHI https://github.com/godfat/rib/pull/18
28
+ * [extra/autoindent] It would now indent with `()` and `[]`.
29
+ Thanks @MITSUBOSHI https://github.com/godfat/rib/pull/20 and
30
+ https://github.com/godfat/rib/pull/19
31
+ * [extra/byebug] This is now work-in-progress.
32
+
3
33
  ## Rib 1.5.4 -- 2017-10-23
4
34
 
5
35
  * Removed unnecessary method definition for `puts`
data/Gemfile CHANGED
@@ -16,8 +16,3 @@ gem 'coveralls', :require => false if ENV['CI']
16
16
  platforms :ruby do
17
17
  gem 'readline_buffer'
18
18
  end
19
-
20
- platforms :rbx do
21
- gem 'rubysl-singleton' # used in rake
22
- gem 'rubysl-readline' # we need readline extension
23
- end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Rib [![Build Status](https://secure.travis-ci.org/godfat/rib.png?branch=master)](http://travis-ci.org/godfat/rib) [![Coverage Status](https://coveralls.io/repos/github/godfat/rib/badge.png)](https://coveralls.io/github/godfat/rib) [![Join the chat at https://gitter.im/godfat/rib](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/godfat/rib)
1
+ # Rib [![Pipeline status](https://gitlab.com/godfat/rib/badges/master/pipeline.svg)](https://gitlab.com/godfat/rib/-/pipelines)
2
2
 
3
3
  by Lin Jen-Shin ([godfat](http://godfat.org))
4
4
 
@@ -24,7 +24,7 @@ be simple, lightweight and modular so that everyone could customize Rib.
24
24
 
25
25
  ## REQUIREMENTS:
26
26
 
27
- * Tested with MRI (official CRuby), Rubinius and JRuby.
27
+ * Tested with MRI (official CRuby) and JRuby.
28
28
  * All gem dependencies are optional, but it's highly recommended to use
29
29
  Rib with [bond][] for tab completion.
30
30
 
@@ -132,6 +132,31 @@ file. To see a list of overridable API, please read [api.rb][]
132
132
 
133
133
  [api.rb]: https://github.com/godfat/rib/blob/master/lib/rib/api.rb
134
134
 
135
+ #### Disable enabled plugins
136
+
137
+ While it's convenient to just `require 'rib/all'`, you might not want to use
138
+ all the plugins. No worries, you don't have to list everything in order to
139
+ not use something. For example, you might not get used to `bottomup_backtrace`
140
+ and don't want to use it. You could put this in your config:
141
+
142
+ ``` ruby
143
+ require 'rib/all'
144
+
145
+ Rib::BottomupBacktrace.disable
146
+ ```
147
+
148
+ This could disable `bottomup_backtrace` so you get regular top-down backtrace
149
+ with all other plugins. This is particularly useful whenever there's a bug
150
+ in one of the plugins, and you might need to disable some plugins in order to
151
+ debug. You could always enable it again with:
152
+
153
+ ``` ruby
154
+ Rib::BottomupBacktrace.enable
155
+ ```
156
+
157
+ You could do this any time, in the config, or in the shell session. No need to
158
+ restart anything, because it takes effect immediately.
159
+
135
160
  #### Rib home and history file
136
161
 
137
162
  Rib home is used to store a config file and a history file, which is
@@ -313,15 +338,6 @@ or having conflicted semantics.
313
338
 
314
339
  Which would print the result with hirb.
315
340
 
316
- * `require 'rib/extra/debugger'` This plugin is depending on:
317
-
318
- 1. [debugger][]
319
-
320
- Which introduces `Rib.debug`, which would do similar things as
321
- `Rib.anchor` but only more powerful. However, this is not well
322
- tested and might not work well. Please let me know if you have
323
- any issue using it, thanks!
324
-
325
341
  * `require 'rib/extra/paging'` This plugin is depending on `less` and `tput`.
326
342
 
327
343
  Which would pass the result to `less` (or `$PAGER` if set) if
@@ -332,7 +348,6 @@ or having conflicted semantics.
332
348
 
333
349
  [readline_buffer]: https://github.com/godfat/readline_buffer
334
350
  [hirb]: https://github.com/cldwalker/hirb
335
- [debugger]: https://github.com/cldwalker/debugger
336
351
 
337
352
  ### As a debugging/interacting tool
338
353
 
@@ -454,15 +469,17 @@ simple, simpler than rib-rails.
454
469
  * ayaya (@ayamomiji)
455
470
  * Lin Jen-Shin (@godfat)
456
471
  * Mr. Big Cat (@miaout17)
472
+ * @alpaca-tc
457
473
  * @bootleq
458
474
  * @lulalala
475
+ * @MITSUBOSH
459
476
  * @tka
460
477
 
461
478
  ## LICENSE:
462
479
 
463
480
  Apache License 2.0 (Apache-2.0)
464
481
 
465
- Copyright (c) 2011-2017, Lin Jen-Shin (godfat)
482
+ Copyright (c) 2011-2022, Lin Jen-Shin (godfat)
466
483
 
467
484
  Licensed under the Apache License, Version 2.0 (the "License");
468
485
  you may not use this file except in compliance with the License.
data/lib/rib/api.rb CHANGED
@@ -83,6 +83,10 @@ module Rib; module API
83
83
  end
84
84
  end
85
85
 
86
+ def puts str=''
87
+ super
88
+ end
89
+
86
90
  # Print result using #format_result
87
91
  def print_result result
88
92
  puts(format_result(result))
data/lib/rib/app/rack.rb CHANGED
@@ -12,7 +12,7 @@ module Rib; module Rack
12
12
  def load_rack
13
13
  require 'rack'
14
14
  Rib.abort("Error: Cannot find config.ru") unless rack?
15
- app, _ = Rack::Builder.parse_file(configru_path)
15
+ app, _ = ::Rack::Builder.parse_file(configru_path)
16
16
  self.app = app
17
17
  Rib.shell.eval_binding.eval('def app; Rib::Rack.app; end')
18
18
  Rib.say("Access your app via :app method")
@@ -59,11 +59,13 @@ module Rib; module Multiline
59
59
  [ # string or regexp
60
60
  "unterminated \\w+ meets end of file",
61
61
  # jruby
62
- "syntax error, unexpected" \
63
- " t(UPLUS|UMINUS|STAR|REGEXP_BEG|AMPER)",
64
- "syntax error, unexpected end-of-file",
62
+ "syntax error, unexpected end\\-of\\-file",
65
63
  # jruby 9.0.4.0
66
- "formal argument must be local variable" ].join('|'))
64
+ "formal argument must be local variable",
65
+ # jruby 9.2.0.0
66
+ "syntax error, unexpected (#{RUBY20_IO.join('|')})",
67
+ "syntax error, unexpected '\\W'"
68
+ ].join('|'))
67
69
  end
68
70
 
69
71
  # --------------- Rib API ---------------
@@ -24,7 +24,11 @@ module Rib; module Autoindent
24
24
  # rescue E => e
25
25
  # rescue E=> e
26
26
  # rescue E =>e
27
- /^begin$/ => /^(end)\b|^else$|^rescue *((\w+)? *(=> *\w+)?)?$/,
27
+ # ensure
28
+ /^begin$/ =>
29
+ /^(end)\b|^else$|^rescue *((\w+)? *(=> *\w+)?)?$|^ensure$/,
30
+ /^def\b/ =>
31
+ /^(end)\b|^else$|^rescue *((\w+)? *(=> *\w+)?)?$|^ensure$/,
28
32
  # elsif Expression
29
33
  # consider cases:
30
34
  # elsif(true)
@@ -34,10 +38,10 @@ module Rib; module Autoindent
34
38
  /^if\b/ => /^(end)\b|^else$|^elsif\b/,
35
39
  /^unless\b/ => /^(end)\b|^else$|^elsif\b/,
36
40
  /^case\b/ => /^(end)\b|^else$|when\b/ ,
37
- /^def\b/ => /^(end)\b/ ,
38
41
  /^class\b/ => /^(end)\b/ ,
39
42
  /^module\b/ => /^(end)\b/ ,
40
43
  /^while\b/ => /^(end)\b/ ,
44
+ /^for\b/ => /^(end)\b/ ,
41
45
  /^until\b/ => /^(end)\b/ ,
42
46
  # consider cases:
43
47
  # 'do
@@ -52,6 +56,8 @@ module Rib; module Autoindent
52
56
  # begin
53
57
  /do( *\|.*\|)?$/ => /^(end)\b/ ,
54
58
  /\{( *\|.*\|)?$/ => /^(\})\B/ ,
59
+ /\($/ => /^(\))\B/ ,
60
+ /\[$/ => /^(\])\B/ ,
55
61
  # those are too hard to deal with, so we use syntax error to double check
56
62
  # what about this then?
57
63
  # v = if true
@@ -0,0 +1,109 @@
1
+
2
+ require 'rib/more/anchor'
3
+ require 'byebug/core'
4
+
5
+ # This is based on lib/byebug/processors/pry_processor.rb
6
+
7
+ module Rib; module Byebug
8
+ extend Plugin
9
+ Shell.use(self)
10
+
11
+ def before_loop
12
+ return super if Rib::Byebug.disabled?
13
+
14
+ super
15
+ # ::Byebug::RibProcessor.start
16
+ end
17
+
18
+ module Imp
19
+ def byebug
20
+ return if Rib::Byebug.disabled?
21
+
22
+ ::Byebug::RibProcessor.start
23
+ end
24
+
25
+ def location
26
+ Rib.shell.config[:byebug].location
27
+ end
28
+
29
+ def step times=1
30
+ throw :rib_byebug, [:step, times]
31
+ end
32
+
33
+ def next lines=1
34
+ throw :rib_byebug, [:next, lines]
35
+ end
36
+
37
+ def finish
38
+ throw :rib_byebug, [:finish]
39
+ end
40
+ end
41
+
42
+ Rib.extend(Imp)
43
+ end; end
44
+
45
+ module Byebug
46
+ class RibProcessor < CommandProcessor
47
+ def self.start
48
+ Byebug.start
49
+ Setting[:autolist] = false
50
+ Context.processor = self
51
+ steps = caller.index{ |path| !path.start_with?(__FILE__) }
52
+ Byebug.current_context.step_out(steps + 2, true)
53
+ end
54
+
55
+ def at_line
56
+ resume_rib
57
+ end
58
+
59
+ def at_return(_return_value)
60
+ resume_rib
61
+ end
62
+
63
+ def at_end
64
+ resume_rib
65
+ end
66
+
67
+ def at_breakpoint(breakpoint)
68
+ raise NotImplementedError
69
+ end
70
+
71
+ def location
72
+ context.location
73
+ end
74
+
75
+ private
76
+
77
+ def print_location
78
+ shell = Rib.shell
79
+ shell.puts(shell.format_backtrace([location]).first)
80
+ end
81
+
82
+ def resume_rib
83
+ return if Rib.shell.running?
84
+
85
+ byebug_binding = frame._binding
86
+
87
+ print_location
88
+
89
+ action, *args = catch(:rib_byebug) do
90
+ allowing_other_threads do
91
+ Rib.anchor byebug_binding, :byebug => self
92
+ end
93
+ end
94
+
95
+ perform(action, args)
96
+ end
97
+
98
+ def perform action, args
99
+ case action
100
+ when :step
101
+ context.step_into(*args, frame.pos)
102
+ when :next
103
+ context.step_over(*args, frame.pos)
104
+ when :finish
105
+ context.step_out(1)
106
+ end
107
+ end
108
+ end
109
+ end
data/lib/rib/more/beep.rb CHANGED
@@ -7,12 +7,11 @@ module Rib; module Beep
7
7
 
8
8
  # --------------- Rib API ---------------
9
9
 
10
- def before_loop
11
- super
12
- return self if Beep.disabled?
10
+ def loop_once
11
+ return super if Beep.disabled?
13
12
  beep if started_at && (Time.now - started_at) > beep_threshold
14
- Beep.disable
15
- self
13
+ config[:started_at] = Time.now
14
+ super
16
15
  end
17
16
 
18
17
  private
@@ -10,7 +10,7 @@ module Rib; module BottomupBacktrace
10
10
  def format_error err
11
11
  return super if BottomupBacktrace.disabled?
12
12
  message, backtrace = get_error(err)
13
- " #{format_backtrace(backtrace).join("\n ")}\n#{message}"
13
+ " #{backtrace.join("\n ")}\n#{message}"
14
14
  end
15
15
 
16
16
  def format_backtrace backtrace
@@ -9,7 +9,11 @@ module Rib; module Caller
9
9
  def caller *filters
10
10
  return if Rib::Caller.disabled?
11
11
 
12
- backtrace = Rib.shell.format_backtrace(super().drop(1))
12
+ display_backtrace(super().drop(1), *filters)
13
+ end
14
+
15
+ def display_backtrace raw_backtrace, *filters
16
+ backtrace = Rib.shell.format_backtrace(raw_backtrace)
13
17
 
14
18
  lib = %r{\brib-#{Rib::VERSION}/lib/rib/}
15
19
  if backtrace.first =~ lib
@@ -20,7 +20,7 @@ module Rib; module Color
20
20
  def get_error err
21
21
  return super if Color.disabled?
22
22
  message, backtrace = super
23
- [format_color(err, message), format_backtrace(backtrace)]
23
+ [format_color(err, message), backtrace]
24
24
  end
25
25
 
26
26
  def warn message
@@ -87,7 +87,11 @@ module Rib; module Color
87
87
  backtrace.map{ |b|
88
88
  path, msgs = b.split(':', 2)
89
89
  dir, sep, file = path.rpartition('/')
90
- msg = msgs.sub(/(\d+):/){red{$1}+':'}.sub(/`.+?'/){green{$&}}
90
+ msgs ||= (line - 1).to_s # msgs would be nil when input is next/break
91
+ msg = msgs.sub(/(\d+)(:?)/) do
92
+ m = Regexp.last_match
93
+ "#{red{m[1]}}#{m[2]}"
94
+ end.sub(/`.+?'/){green{Regexp.last_match[0]}}
91
95
 
92
96
  "#{dir+sep}#{yellow{file}}:#{msg}"
93
97
  }
@@ -18,29 +18,29 @@ copy :setup_multiline do
18
18
  if err
19
19
  mock(shell).print_eval_error(is_a(err)){}
20
20
  else
21
- mock(shell).print_result(yield){}
21
+ mock(shell).print_result(is_a(Object)){}
22
22
  end
23
23
  shell.loop_once
24
24
  ok
25
25
  end
26
26
 
27
27
  def check str, err=nil
28
+ yield if block_given?
29
+
28
30
  lines = str.split("\n")
29
31
  lines[0...-1].each{ |line|
30
32
  input(line)
31
33
  shell.loop_once
32
34
  }
33
- input_done(lines.last, err) do
34
- shell.eval_binding.eval(str)
35
- end
35
+ input_done(lines.last, err)
36
36
  end
37
- end
38
37
 
39
- copy :multiline do
40
38
  before do
41
39
  stub_output
42
40
  end
41
+ end
43
42
 
43
+ copy :multiline do
44
44
  would 'work with no prompt' do
45
45
  shell.config[:prompt] = ''
46
46
  check <<~RUBY
@@ -137,9 +137,23 @@ copy :multiline do
137
137
  end
138
138
 
139
139
  would 'be hash treated as a block SyntaxError' do
140
- check <<~RUBY, SyntaxError
140
+ code = <<~RUBY
141
141
  puts { :x => 10 }.class
142
142
  RUBY
143
+
144
+ if RUBY_VERSION >= '3.0.0'
145
+ check code do
146
+ stub(shell.config[:binding_object]).puts{}
147
+ end
148
+ else
149
+ check code, SyntaxError
150
+ end
151
+ end
152
+
153
+ would 'SyntaxError' do
154
+ check <<~RUBY, SyntaxError
155
+ s-y n
156
+ RUBY
143
157
  end
144
158
 
145
159
  would 'begin with SyntaxError' do
@@ -171,10 +185,16 @@ copy :multiline do
171
185
  end
172
186
 
173
187
  would 'binary operator /' do
174
- check <<~RUBY
188
+ code = <<~RUBY
175
189
  1+1.to_i /
176
190
  1
177
191
  RUBY
192
+
193
+ if RUBY_VERSION >= '3.0.0'
194
+ check code.lines.first, SyntaxError
195
+ else
196
+ check code
197
+ end
178
198
  end
179
199
 
180
200
  would 'binary operator |' do
data/lib/rib/test.rb CHANGED
@@ -20,14 +20,19 @@ copy :rib do
20
20
  end
21
21
 
22
22
  def new_shell opts={}
23
- shell = Rib::Shell.new(opts)
24
- yield(shell) if block_given?
25
- shell.before_loop
23
+ binding_object = Object.new
24
+ result = Rib::Shell.new(
25
+ {:binding => binding_object.instance_eval{binding},
26
+ :binding_object => binding_object}.
27
+ merge(opts))
28
+ yield(result) if block_given?
29
+ result.before_loop
26
30
  end
27
31
 
28
32
  def stub_output
29
33
  stub(shell).print(is_a(String)){}
30
34
  stub(shell).puts(is_a(String)){}
35
+ stub(shell).puts{}
31
36
  end
32
37
 
33
38
  def readline?
@@ -51,9 +56,10 @@ copy :rib do
51
56
  Rib.disable_plugins(rest)
52
57
  end
53
58
 
54
- yield
59
+ describe "enabling #{plugins}" do
60
+ block.call
55
61
 
56
- case ENV['TEST_LEVEL']
62
+ case ENV['TEST_LEVEL']
57
63
  when '0'
58
64
  when '1'
59
65
  test_level1(rest, block)
@@ -63,13 +69,18 @@ copy :rib do
63
69
  test_level3(rest, block)
64
70
  else # test_level3 is too slow because of rr (i guess)
65
71
  test_level2(rest, block)
72
+ end
66
73
  end
67
74
  end
68
75
 
69
76
  def test_level1 rest, block
70
77
  rest.each{ |target|
71
78
  target.enable
72
- block.call
79
+
80
+ describe "also enabling #{target}" do
81
+ block.call
82
+ end
83
+
73
84
  target.disable
74
85
  }
75
86
  end
@@ -77,17 +88,31 @@ copy :rib do
77
88
  def test_level2 rest, block
78
89
  rest.combination(2).each{ |targets|
79
90
  Rib.enable_plugins(targets)
80
- block.call
91
+
92
+ describe "also enabling #{targets.join(', ')}" do
93
+ block.call
94
+ end
95
+
81
96
  Rib.disable_plugins(targets)
82
97
  }
83
98
  end
84
99
 
85
100
  def test_level3 rest, block
86
- return block.call if rest.empty?
87
- rest[0].enable
88
- test_level3(rest[1..-1], block)
89
- rest[0].disable
90
- test_level3(rest[1..-1], block)
101
+ if rest.empty?
102
+ block.call
103
+ else
104
+ rest[0].enable
105
+
106
+ describe "also enabling #{rest[0]}" do
107
+ test_level3(rest[1..-1], block)
108
+ end
109
+
110
+ rest[0].disable
111
+
112
+ describe "disabling #{rest[0]}" do
113
+ test_level3(rest[1..-1], block)
114
+ end
115
+ end
91
116
  end
92
117
  end
93
118
  end
data/lib/rib/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Rib
3
- VERSION = '1.5.4'
3
+ VERSION = '1.6.1'
4
4
  end
data/rib.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rib 1.5.4 ruby lib
2
+ # stub: rib 1.6.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rib".freeze
6
- s.version = "1.5.4"
6
+ s.version = "1.6.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Lin Jen-Shin (godfat)".freeze]
11
- s.date = "2017-10-23"
11
+ s.date = "2022-12-30"
12
12
  s.description = "Ruby-Interactive-ruBy -- Yet another interactive Ruby shell\n\nRib is based on the design of [ripl][] and the work of [ripl-rc][], some of\nthe features are also inspired by [pry][]. The aim of Rib is to be fully\nfeatured and yet very easy to opt-out or opt-in other features. It shall\nbe simple, lightweight and modular so that everyone could customize Rib.\n\n[ripl]: https://github.com/cldwalker/ripl\n[ripl-rc]: https://github.com/godfat/ripl-rc\n[pry]: https://github.com/pry/pry".freeze
13
13
  s.email = ["godfat (XD) godfat.org".freeze]
14
14
  s.executables = [
@@ -20,8 +20,8 @@ Gem::Specification.new do |s|
20
20
  "rib-rails".freeze]
21
21
  s.files = [
22
22
  ".gitignore".freeze,
23
+ ".gitlab-ci.yml".freeze,
23
24
  ".gitmodules".freeze,
24
- ".travis.yml".freeze,
25
25
  "CHANGES.md".freeze,
26
26
  "Gemfile".freeze,
27
27
  "LICENSE".freeze,
@@ -51,6 +51,7 @@ Gem::Specification.new do |s|
51
51
  "lib/rib/core/strip_backtrace.rb".freeze,
52
52
  "lib/rib/debug.rb".freeze,
53
53
  "lib/rib/extra/autoindent.rb".freeze,
54
+ "lib/rib/extra/byebug.rb".freeze,
54
55
  "lib/rib/extra/hirb.rb".freeze,
55
56
  "lib/rib/extra/paging.rb".freeze,
56
57
  "lib/rib/extra/spring.rb".freeze,
@@ -92,7 +93,7 @@ Gem::Specification.new do |s|
92
93
  "test/test_shell.rb".freeze]
93
94
  s.homepage = "https://github.com/godfat/rib".freeze
94
95
  s.licenses = ["Apache-2.0".freeze]
95
- s.rubygems_version = "2.6.13".freeze
96
+ s.rubygems_version = "3.4.1".freeze
96
97
  s.summary = "Ruby-Interactive-ruBy -- Yet another interactive Ruby shell".freeze
97
98
  s.test_files = [
98
99
  "test/core/test_completion.rb".freeze,
data/task/README.md CHANGED
@@ -13,7 +13,7 @@ Provided tasks:
13
13
 
14
14
  ## REQUIREMENTS:
15
15
 
16
- * Tested with MRI (official CRuby), Rubinius and JRuby.
16
+ * Tested with MRI (official CRuby) and JRuby.
17
17
 
18
18
  ## INSTALLATION:
19
19
 
@@ -39,7 +39,7 @@ end
39
39
 
40
40
  Apache License 2.0 (Apache-2.0)
41
41
 
42
- Copyright (c) 2011-2017, Lin Jen-Shin (godfat)
42
+ Copyright (c) 2011-2021, Lin Jen-Shin (godfat)
43
43
 
44
44
  Licensed under the Apache License, Version 2.0 (the "License");
45
45
  you may not use this file except in compliance with the License.
data/task/gemgem.rb CHANGED
@@ -42,6 +42,7 @@ module Gemgem
42
42
 
43
43
  def gem_install
44
44
  require 'rubygems/commands/install_command'
45
+ require 'rubygems/package'
45
46
  # read ~/.gemrc
46
47
  Gem.use_paths(Gem.configuration[:gemhome], Gem.configuration[:gempath])
47
48
  Gem::Command.extra_args = Gem.configuration[:gem]
@@ -51,7 +52,8 @@ module Gemgem
51
52
  cmd.handle_options([])
52
53
 
53
54
  # install
54
- install = Gem::Installer.new(gem_path, cmd.options)
55
+ gem_package = Gem::Package.new(gem_path)
56
+ install = Gem::Installer.new(gem_package, cmd.options)
55
57
  install.install
56
58
  puts "\e[35mGem installed: \e[33m#{strip_path(install.gem_dir)}\e[0m"
57
59
  end
@@ -5,10 +5,9 @@ require 'rib/core/history'
5
5
 
6
6
  describe Rib::History do
7
7
  paste :rib
8
+ paste :setup_history
8
9
 
9
10
  test_for Rib::History do
10
- paste :setup_history
11
-
12
11
  would '#after_loop save history' do
13
12
  inputs = %w[blih blah]
14
13
  shell.history.push(*inputs)
@@ -5,10 +5,9 @@ require 'rib/core/squeeze_history'
5
5
 
6
6
  describe Rib::SqueezeHistory do
7
7
  paste :rib
8
+ paste :setup_history
8
9
 
9
10
  test_for Rib::History, Rib::SqueezeHistory do
10
- paste :setup_history
11
-
12
11
  before do
13
12
  @input = %w[foo bar bar foo bar]
14
13
  end
@@ -39,7 +39,7 @@ describe Rib::Autoindent do
39
39
  expect(@indent.stack_size).eq size
40
40
  end
41
41
 
42
- would 'begin rescue else end' do
42
+ would 'begin rescue else ensure end' do
43
43
  ri('begin' , 1)
44
44
  ri( '1' , 1)
45
45
  le('rescue' , 1)
@@ -53,6 +53,30 @@ describe Rib::Autoindent do
53
53
  le('rescue E=> e' , 1)
54
54
  le('rescue E =>e ' , 1)
55
55
  le('else' , 1)
56
+ ri( '1' , 1)
57
+ le('ensure' , 1)
58
+ ri( '1' , 1)
59
+ le('end while nil' , 0)
60
+ end
61
+
62
+ would 'def rescue else ensure end' do
63
+ ri('def f a' , 1)
64
+ ri( 'if a' , 2)
65
+ le( 'end' , 1)
66
+ le('rescue' , 1)
67
+ ri( '1' , 1)
68
+ le('rescue=>e' , 1)
69
+ le('rescue => e' , 1)
70
+ le('rescue =>e' , 1)
71
+ le('rescue E=>e ' , 1)
72
+ le('rescue E' , 1)
73
+ le('rescue E => e ', 1)
74
+ le('rescue E=> e' , 1)
75
+ le('rescue E =>e ' , 1)
76
+ le('else' , 1)
77
+ ri( '1' , 1)
78
+ le('ensure' , 1)
79
+ ri( '1' , 1)
56
80
  le('end while nil' , 0)
57
81
  end
58
82
 
@@ -96,13 +120,6 @@ describe Rib::Autoindent do
96
120
  le('end' , 0)
97
121
  end
98
122
 
99
- would 'def end' do
100
- ri('def f a' , 1)
101
- ri( 'if a' , 2)
102
- le( 'end' , 1)
103
- le('end' , 0)
104
- end
105
-
106
123
  would 'class Object end' do
107
124
  ri('class Object' , 1)
108
125
  ri( 'if true' , 2)
@@ -125,6 +142,13 @@ describe Rib::Autoindent do
125
142
  le('end' , 0)
126
143
  end
127
144
 
145
+ would 'for end' do
146
+ ri('for x in 1..2' , 1)
147
+ ri( 'if true' , 2)
148
+ le( 'end' , 1)
149
+ le('end' , 0)
150
+ end
151
+
128
152
  would 'until end' do
129
153
  ri('until true' , 1)
130
154
  ri( 'if true' , 2)
@@ -142,4 +166,41 @@ describe Rib::Autoindent do
142
166
  le( 'end' , 1)
143
167
  le('end' , 0)
144
168
  end
169
+
170
+ would '{}' do
171
+ ri('{' , 1)
172
+ ri( ':a => :b' , 1)
173
+ le('}' , 0)
174
+ end
175
+
176
+ would '[].each{}' do
177
+ ri('[].each{' , 1)
178
+ ri( '0' , 1)
179
+ ri( '[].each {' , 2)
180
+ le( '}' , 1)
181
+ le('}' , 0)
182
+ end
183
+
184
+ would '()' do
185
+ ri('(' , 1)
186
+ ri( '0' , 1)
187
+ le(')' , 0)
188
+ end
189
+
190
+ would '{}.dig()' do
191
+ ri('{}.dig(' , 1)
192
+ ri( '0,' , 1)
193
+ ri( '1' , 1)
194
+ le(')' , 0)
195
+ end
196
+
197
+ would '[]' do
198
+ ri('[' , 1)
199
+ ri( '0,' , 1)
200
+ ri( '1,' , 1)
201
+ ri( '[' , 2)
202
+ ri( '2' , 2)
203
+ le( ']' , 1)
204
+ le(']' , 0)
205
+ end
145
206
  end
@@ -9,21 +9,24 @@ describe Rib::Beep do
9
9
  Rib::Beep.enable
10
10
  end
11
11
 
12
- after do
13
- expect(Rib::Beep).disabled?
14
- end
15
-
16
12
  def verify delay, threshold=nil, &block
17
- new_shell(:started_at => Time.now - delay,
18
- :beep_threshold => threshold, &block)
13
+ shell(:started_at => Time.now - delay,
14
+ :beep_threshold => threshold, &block)
15
+
16
+ stub_output
17
+ mock(shell).get_input{}
18
+
19
+ shell.loop
20
+
21
+ ok
19
22
  end
20
23
 
21
- def expect_beep shell
22
- mock(shell).print("\a"){}
24
+ def expect_beep sh
25
+ mock(sh).print("\a"){}
23
26
  end
24
27
 
25
- def unexpect_beep shell
26
- stub(shell).print.with_any_args{ flunk }
28
+ def unexpect_beep sh
29
+ stub(sh).print.with_any_args{ flunk }
27
30
  end
28
31
 
29
32
  describe 'beep' do
@@ -9,6 +9,7 @@ describe Rib::MultilineHistory do
9
9
 
10
10
  def check str, err=nil
11
11
  shell.history.clear
12
+ yield if block_given?
12
13
  with_history(str, err)
13
14
 
14
15
  @shell = nil
@@ -16,6 +17,7 @@ describe Rib::MultilineHistory do
16
17
 
17
18
  shell.history.clear
18
19
  shell.history << 'old history'
20
+ yield if block_given?
19
21
  with_history(str, err, 'old history')
20
22
  end
21
23
 
@@ -30,9 +32,7 @@ describe Rib::MultilineHistory do
30
32
 
31
33
  result
32
34
  }
33
- input_done(lines.last, err) do
34
- shell.eval_binding.eval(str)
35
- end
35
+ input_done(lines.last, err)
36
36
 
37
37
  history = if lines.size == 1
38
38
  lines.first
data/test/test_shell.rb CHANGED
@@ -75,6 +75,14 @@ describe Rib::Shell do
75
75
  input('"m" * 2')
76
76
  end
77
77
 
78
+ %w[next break].each do |keyword|
79
+ would "handle #{keyword}" do
80
+ mock(shell).puts(matching(/^SyntaxError:/)){}
81
+
82
+ input(keyword)
83
+ end
84
+ end
85
+
78
86
  would 'error in print_result' do
79
87
  mock(Rib).warn(matching(/Error while printing result.*BOOM/m)){}
80
88
 
@@ -167,26 +175,24 @@ describe Rib::Shell do
167
175
  end
168
176
 
169
177
  would 'have empty binding' do
170
- expect(shell.eval_input('local_variables').first).empty?
178
+ expect(shell(:binding => nil).eval_input('local_variables').first).empty?
171
179
  end
172
180
 
173
181
  would 'not pollute main' do
174
- expect(shell.eval_input('main').first).eq 'rib'
182
+ expect(shell(:binding => nil).eval_input('main').first).eq 'rib'
183
+ end
184
+
185
+ would 'be main' do
186
+ expect(shell(:binding => nil).eval_input('self.inspect').first).eq 'main'
175
187
  end
176
188
 
177
189
  would 'warn on removing main' do
178
- TOPLEVEL_BINDING.eval <<-RUBY
179
- singleton_class.module_eval do
180
- def main; end
181
- end
182
- RUBY
190
+ mock(TOPLEVEL_BINDING.eval('singleton_class')).method_defined?(:main) do
191
+ true
192
+ end
183
193
 
184
194
  mock(Rib).warn(is_a(String)){}
185
195
 
186
- expect(shell.eval_input('main').first).eq 'rib'
187
- end
188
-
189
- would 'be main' do
190
- expect(shell.eval_input('self.inspect').first).eq 'main'
196
+ expect(shell(:binding => nil).eval_input('main').first).eq 'rib'
191
197
  end
192
198
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.4
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-23 00:00:00.000000000 Z
11
+ date: 2022-12-30 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
@@ -34,8 +34,8 @@ extensions: []
34
34
  extra_rdoc_files: []
35
35
  files:
36
36
  - ".gitignore"
37
+ - ".gitlab-ci.yml"
37
38
  - ".gitmodules"
38
- - ".travis.yml"
39
39
  - CHANGES.md
40
40
  - Gemfile
41
41
  - LICENSE
@@ -65,6 +65,7 @@ files:
65
65
  - lib/rib/core/strip_backtrace.rb
66
66
  - lib/rib/debug.rb
67
67
  - lib/rib/extra/autoindent.rb
68
+ - lib/rib/extra/byebug.rb
68
69
  - lib/rib/extra/hirb.rb
69
70
  - lib/rib/extra/paging.rb
70
71
  - lib/rib/extra/spring.rb
@@ -108,7 +109,7 @@ homepage: https://github.com/godfat/rib
108
109
  licenses:
109
110
  - Apache-2.0
110
111
  metadata: {}
111
- post_install_message:
112
+ post_install_message:
112
113
  rdoc_options: []
113
114
  require_paths:
114
115
  - lib
@@ -123,9 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
124
  - !ruby/object:Gem::Version
124
125
  version: '0'
125
126
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.6.13
128
- signing_key:
127
+ rubygems_version: 3.4.1
128
+ signing_key:
129
129
  specification_version: 4
130
130
  summary: Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
131
131
  test_files:
data/.travis.yml DELETED
@@ -1,23 +0,0 @@
1
- sudo: false
2
- language: ruby
3
-
4
- before_install:
5
- - rvm get head
6
- - rvm reload
7
- - rvm use --install $TRAVIS_RUBY_VERSION --binary --latest
8
- install: 'gem install bundler; bundle install --retry=3'
9
- script: 'ruby -r bundler/setup -S rake test'
10
-
11
- matrix:
12
- include:
13
- - rvm: 2.2.5
14
- - rvm: 2.3.2
15
- - rvm: 2.4.1
16
- - rvm: ruby-head
17
- - rvm: jruby-9
18
- env: JRUBY_OPTS=--debug
19
- - rvm: rbx
20
-
21
- allow_failures:
22
- - rvm: 2.4.1
23
- - rvm: rbx