rib 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
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