rib 0.9.1 → 0.9.2

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.
data/CHANGES.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Rib CHANGES
2
2
 
3
+ ## Rib 0.9.2 -- 2011-08-25
4
+
5
+ * [extra/autoindent] It has been greatly improved. A lot more accurate.
6
+ * [extra/autoindent] Fixed a bug when you're typing too fast upon rib
7
+ launching, it might eat your input. Thanks bootleq.
8
+
3
9
  ## Rib 0.9.1 -- 2011-08-19
4
10
 
5
11
  * [extra/autoindent] Autoindent plugin help you indent multiline editing.
@@ -40,13 +40,22 @@ module Rib::Autoindent
40
40
  /^until/ => /^(end)\b/ ,
41
41
  # consider cases:
42
42
  # 'do
43
- # "do
43
+ # ' do
44
+ # "' do
44
45
  # /do
45
46
  # '{
46
- # "{
47
- # /{
48
- /[^'"\/]do( *\|.*\|)?$/ => /^(end)\b/ ,
49
- /[^'"\/]\{( *\|.*\|)?$/ => /^(\})\B/ ,
47
+ # %q{
48
+ # %q| do
49
+ # hey, two lines are even harder!
50
+ # "
51
+ # begin
52
+ /do( *\|.*\|)?$/ => /^(end)\b/ ,
53
+ /\{( *\|.*\|)?$/ => /^(\})\B/ ,
54
+ # those are too hard to deal with, so we use syntax error to double check
55
+ # what about this then?
56
+ # v = if true
57
+ # else
58
+ # end
50
59
  }
51
60
 
52
61
  # --------------- Rib API ---------------
@@ -59,43 +68,74 @@ module Rib::Autoindent
59
68
 
60
69
  def get_input
61
70
  return super if Autoindent.disabled?
71
+ # this is only a fix in case we don't autoindent correctly
72
+ # if we're autoindenting 100% correct, then this is a useless check
62
73
  autoindent_stack.clear if multiline_buffer.empty?
74
+
75
+ # this should be called after ::Readline.readline, but it's blocking,
76
+ # and i don't know if there's any hook to do this, so here we use thread
63
77
  Thread.new do
64
78
  sleep(0.01)
65
- # this should be called after ::Readline.readline, but it's blocking,
66
- # and i don't know if there's any hook to do this, so here we use thread
67
- ::Readline.line_buffer = current_autoindent
79
+ ::Readline.line_buffer = current_autoindent if
80
+ ::Readline.line_buffer.empty?
68
81
  end
82
+
69
83
  super
70
84
  end
71
85
 
72
- def loop_eval input
86
+ def eval_input raw_input
73
87
  return super if Autoindent.disabled?
74
- if indented = handle_autoindent(input.strip)
75
- super(indented)
76
- else
77
- super
78
- end
88
+ input = raw_input.strip
89
+ indent = detect_autoindent(input)
90
+ result, err = if indent.first.to_s.start_with?('left')
91
+ super(handle_last_line(input))
92
+ else
93
+ super
94
+ end
95
+ handle_autoindent(input, indent, err)
96
+ [result, err]
79
97
  end
80
98
 
81
99
  # --------------- Plugin API ---------------
82
100
 
83
- def handle_autoindent input
84
- _, up = BLOCK_REGEXP.find{ |key, _| input =~ key }
85
- if up
86
- autoindent_stack << up
87
- nil
101
+ def detect_autoindent input
102
+ _, backmark = BLOCK_REGEXP.find{ |key, _| input =~ key }
103
+ if backmark # e.g. begin
104
+ [:right, backmark]
88
105
  elsif input =~ autoindent_stack.last
89
- if $1 # e.g. end, }, etc
90
- autoindent_stack.pop
91
- handle_last_line(input)
92
- else # e.g. elsif, rescue, etc
93
- handle_last_line(input, current_autoindent(autoindent_stack.size-1))
106
+ if $1 # e.g. end, }, etc
107
+ [:left_end]
108
+ else # e.g. elsif, rescue, etc
109
+ [:left_tmp]
94
110
  end
111
+ else
112
+ [:stay]
113
+ end
114
+ end
115
+
116
+ def handle_autoindent input, indent, err
117
+ case indent.first
118
+ when :right # we need to go deeper
119
+ if multiline?(err)
120
+ if err.message =~ /unterminated \w+ meets end of file/
121
+ # skip if we're in the middle of a string or regexp
122
+ else
123
+ # indent.last is the way (input regexp matches) to go back
124
+ autoindent_stack << indent.last
125
+ end
126
+ end
127
+
128
+ when :left_end # we need to go back
129
+ # could happen in either multiline or not
130
+ autoindent_stack.pop
131
+
132
+ when :left_tmp # temporarily go back
133
+ handle_last_line(input) if multiline?(err)
95
134
  end
96
135
  end
97
136
 
98
- def handle_last_line input, indent=current_autoindent
137
+ def handle_last_line input,
138
+ indent=current_autoindent(autoindent_stack.size-1)
99
139
  new_input = "#{indent}#{input}"
100
140
  puts("\e[1A\e[K#{prompt}#{new_input}")
101
141
  new_input
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Rib
3
- VERSION = '0.9.1'
3
+ VERSION = '0.9.2'
4
4
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rib}
5
- s.version = "0.9.1"
5
+ s.version = "0.9.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = [%q{Lin Jen-Shin (godfat)}]
9
- s.date = %q{2011-08-19}
9
+ s.date = %q{2011-08-25}
10
10
  s.description = %q{Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
11
11
 
12
12
  Rib is based on the design of [ripl][] and the work of [ripl-rc][], some of
@@ -160,7 +160,7 @@ task :test do
160
160
  Bacon.extend(Bacon::TestUnitOutput)
161
161
  Bacon.summary_on_exit
162
162
  $LOAD_PATH.unshift('lib')
163
- Dir['test/**/test_*.rb'].each{ |file| load file }
163
+ Dir['./test/**/test_*.rb'].each{ |file| require file[0..-4] }
164
164
  end
165
165
 
166
166
  desc 'Run tests with shell'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-19 00:00:00.000000000Z
12
+ date: 2011-08-25 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bond
16
- requirement: &2166446500 !ruby/object:Gem::Requirement
16
+ requirement: &2157793060 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2166446500
24
+ version_requirements: *2157793060
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hirb
27
- requirement: &2166446020 !ruby/object:Gem::Requirement
27
+ requirement: &2157792580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2166446020
35
+ version_requirements: *2157792580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: readline_buffer
38
- requirement: &2166445540 !ruby/object:Gem::Requirement
38
+ requirement: &2157792100 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2166445540
46
+ version_requirements: *2157792100
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bacon
49
- requirement: &2166445060 !ruby/object:Gem::Requirement
49
+ requirement: &2157791620 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2166445060
57
+ version_requirements: *2157791620
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rr
60
- requirement: &2166444580 !ruby/object:Gem::Requirement
60
+ requirement: &2157791140 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2166444580
68
+ version_requirements: *2157791140
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
- requirement: &2166444100 !ruby/object:Gem::Requirement
71
+ requirement: &2157790660 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2166444100
79
+ version_requirements: *2157790660
80
80
  description: ! 'Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
81
81
 
82
82