mvz-live_ast 2.0.0 → 2.1.1

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.rdoc +9 -0
  3. data/README.rdoc +14 -0
  4. data/lib/live_ast/base.rb +7 -9
  5. data/lib/live_ast/irb_spy.rb +1 -1
  6. data/lib/live_ast/replace_caller.rb +14 -0
  7. data/lib/live_ast/version.rb +1 -1
  8. metadata +85 -120
  9. data/Rakefile +0 -62
  10. data/devel/levitate.rb +0 -184
  11. data/devel/levitate_config.rb +0 -4
  12. data/test/alias_test.rb +0 -25
  13. data/test/ast_eval/ast_eval_test.rb +0 -13
  14. data/test/ast_load/ast_load_test.rb +0 -47
  15. data/test/attr_test.rb +0 -26
  16. data/test/backtrace_test.rb +0 -161
  17. data/test/base/noninvasive_test.rb +0 -55
  18. data/test/base/reload_test.rb +0 -43
  19. data/test/covert_define_method_test.rb +0 -25
  20. data/test/def_test.rb +0 -37
  21. data/test/define_method_test.rb +0 -69
  22. data/test/define_singleton_method_test.rb +0 -17
  23. data/test/encoding_test/bad.rb +0 -1
  24. data/test/encoding_test/cp932.rb +0 -6
  25. data/test/encoding_test/default.rb +0 -5
  26. data/test/encoding_test/eucjp.rb +0 -6
  27. data/test/encoding_test/koi8.rb +0 -6
  28. data/test/encoding_test/koi8_shebang.rb +0 -7
  29. data/test/encoding_test/koi8_with_utf8bom.rb +0 -6
  30. data/test/encoding_test/usascii.rb +0 -6
  31. data/test/encoding_test/usascii_with_utf8bom.rb +0 -6
  32. data/test/encoding_test/utf8.rb +0 -6
  33. data/test/encoding_test/utf8bom.rb +0 -6
  34. data/test/encoding_test/utf8bom_only.rb +0 -5
  35. data/test/encoding_test/utf8dos.rb +0 -6
  36. data/test/encoding_test/utf8mac.rb +0 -6
  37. data/test/encoding_test/utf8mac_alt.rb +0 -6
  38. data/test/encoding_test/utf8unix.rb +0 -6
  39. data/test/encoding_test.rb +0 -54
  40. data/test/error_test.rb +0 -118
  41. data/test/eval_test.rb +0 -271
  42. data/test/flush_cache_test.rb +0 -102
  43. data/test/full/ast_reload_test.rb +0 -41
  44. data/test/full/replace_eval_test.rb +0 -433
  45. data/test/irb_test.rb +0 -43
  46. data/test/lambda_test.rb +0 -65
  47. data/test/load_path_test.rb +0 -77
  48. data/test/load_test.rb +0 -125
  49. data/test/main.rb +0 -134
  50. data/test/nested_test.rb +0 -31
  51. data/test/readme_test.rb +0 -16
  52. data/test/recursive_eval_test.rb +0 -53
  53. data/test/redefine_method_test.rb +0 -85
  54. data/test/rubygems_test.rb +0 -27
  55. data/test/rubyspec_test.rb +0 -39
  56. data/test/singleton_test.rb +0 -27
  57. data/test/stdlib_test.rb +0 -15
  58. data/test/thread_test.rb +0 -45
  59. data/test/to_ast/to_ast_feature_test.rb +0 -13
  60. data/test/to_ruby/to_ruby_feature_test.rb +0 -13
  61. data/test/to_ruby/to_ruby_test.rb +0 -101
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e96ab3dab36ef2a9b745f3a878b71b79bb8b8ecfd870b0c8ad29dcef5520a943
4
- data.tar.gz: b8b7f606c175caff1522b70db8287392160d8352e44f57fca8e6709011599bd5
3
+ metadata.gz: d2f6177411755421ed4f570258386498d1fb2f1e4215f63e29742047b81140b5
4
+ data.tar.gz: 8b963f0d5b60cae5977e22c17e7acedff8fdcfeba9437fa0f5ed4c5b963e64ba
5
5
  SHA512:
6
- metadata.gz: ac889c697aa0c722078437135a3c57db7b05126178920e1224e4728616ab38cabbcb682d6eae3194a9361f2032400a6b55d2e89726f95abe006fa33d9e8c6ef9
7
- data.tar.gz: ecc774511be6e4bb0d89559c8e6186ec766aa30ad31376f6e310ef5e9d0e116f603b648ce1a8f8a722116daadc1150913bdcbb977ed653c2784b0e84525c59c7
6
+ metadata.gz: b6747a62bfcc46aa05ab45612b2b80831936f0b4bce3ba439f1ef0fe5468ddaaa09771e0c9b8f324c5e0ab49048dca50a13186a19c4016f8678b10ed87474841
7
+ data.tar.gz: fbf59148663fe10cadfa3bb127c0c4df7c93349b662f72239dbaaf78691fb43e38a812ce9a9d7ea4607b21da4a923671985cb66b867011207401e0b9426adba2
data/CHANGES.rdoc CHANGED
@@ -1,5 +1,14 @@
1
1
  = live_ast Changes
2
2
 
3
+ == Version 2.1.1
4
+
5
+ * Loosen dependency on ruby2ruby
6
+
7
+ == Version 2.1.0
8
+
9
+ * Add support for Ruby 3.1
10
+ * Add `live_ast/replace_caller` similar to `replace_raise`
11
+
3
12
  == Version 2.0.0
4
13
 
5
14
  * Breaking change: Use bindings gem instead of binding_of_caller.
data/README.rdoc CHANGED
@@ -224,6 +224,20 @@ code. An exception from within a native method will likely still
224
224
  contain the token in its backtrace (e.g., in MRI the exception raised
225
225
  by <code>1/0</code> comes from C).
226
226
 
227
+ Similarly to replace_raise, there is a replace_caller for libraries that
228
+ use the output of Kernel.caller directly to identify files. This has the
229
+ same caveats as replace_raise.
230
+
231
+ require 'live_ast'
232
+
233
+ f = ast_eval %{ lambda { caller.first } }, binding
234
+ f.call
235
+ => "(irb)|ast@o:7:in `irb_binding'"
236
+
237
+ require 'live_ast/replace_caller'
238
+ f.call
239
+ => "(irb):7:in `block in irb_binding'"
240
+
227
241
  == Replacing the Parser
228
242
 
229
243
  Despite its name, LiveAST knows nothing about ASTs. It merely reports
data/lib/live_ast/base.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "thread"
4
-
5
3
  require "live_ast/common"
6
4
  require "live_ast/reader"
7
5
  require "live_ast/evaler"
@@ -11,12 +9,12 @@ require "live_ast/error"
11
9
  require "live_ast/irb_spy" if defined?(IRB)
12
10
 
13
11
  module LiveAST
14
- NATIVE_EVAL = Kernel.method(:eval) #:nodoc:
12
+ NATIVE_EVAL = Kernel.method(:eval) # :nodoc:
15
13
 
16
14
  class << self
17
- attr_writer :parser #:nodoc:
15
+ attr_writer :parser # :nodoc:
18
16
 
19
- def parser #:nodoc:
17
+ def parser # :nodoc:
20
18
  @parser ||=
21
19
  begin
22
20
  require "live_ast/ruby_parser"
@@ -29,7 +27,7 @@ module LiveAST
29
27
  #
30
28
  # Equivalent to <code>obj.to_ast</code>.
31
29
  #
32
- def ast(obj) #:nodoc:
30
+ def ast(obj) # :nodoc:
33
31
  case obj
34
32
  when Method, UnboundMethod
35
33
  Linker.find_method_ast(obj.owner, obj.name, *obj.source_location)
@@ -53,7 +51,7 @@ module LiveAST
53
51
  #
54
52
  # Equivalent to <code>Kernel#ast_eval</code>.
55
53
  #
56
- def eval(*args) #:nodoc:
54
+ def eval(*args) # :nodoc:
57
55
  Evaler.eval(args[0], *args)
58
56
  end
59
57
 
@@ -62,14 +60,14 @@ module LiveAST
62
60
  #
63
61
  # Equivalent to <code>Kernel#ast_load</code>.
64
62
  #
65
- def load(file, wrap = false) #:nodoc:
63
+ def load(file, wrap = false) # :nodoc:
66
64
  Loader.load(file, wrap)
67
65
  end
68
66
 
69
67
  #
70
68
  # strip the revision token from a string
71
69
  #
72
- def strip_token(file) #:nodoc:
70
+ def strip_token(file) # :nodoc:
73
71
  file.sub(/#{Regexp.quote Linker::REVISION_TOKEN}[a-z]+/, "")
74
72
  end
75
73
  end
@@ -10,7 +10,7 @@ module LiveAST
10
10
  def code_at(line)
11
11
  code = +""
12
12
  checked_history[line..].each do |code_line|
13
- code << code_line << "\n"
13
+ code += "#{code_line}\n"
14
14
  return code if can_parse code
15
15
  end
16
16
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "live_ast/base"
4
+
5
+ module Kernel
6
+ private
7
+
8
+ alias live_ast_original_caller caller
9
+ def caller(*args)
10
+ c = live_ast_original_caller(*args)
11
+ c.shift
12
+ c.map { |line| LiveAST.strip_token line }
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LiveAST
4
- VERSION = "2.0.0"
4
+ VERSION = "2.1.1"
5
5
  end
metadata CHANGED
@@ -1,30 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mvz-live_ast
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James M. Lawrence
8
8
  - Matijs van Zuijlen
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-12-26 00:00:00.000000000 Z
12
+ date: 2022-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ruby2ruby
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '2.4'
21
+ - - "<"
19
22
  - !ruby/object:Gem::Version
20
- version: 2.4.0
23
+ version: '2.6'
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
24
27
  requirements:
25
- - - "~>"
28
+ - - ">="
26
29
  - !ruby/object:Gem::Version
27
- version: 2.4.0
30
+ version: '2.4'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.6'
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: ruby_parser
30
36
  requirement: !ruby/object:Gem::Requirement
@@ -81,6 +87,20 @@ dependencies:
81
87
  - - "~>"
82
88
  - !ruby/object:Gem::Version
83
89
  version: '13.0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: rake-manifest
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.2.0
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.2.0
84
104
  - !ruby/object:Gem::Dependency
85
105
  name: rdoc
86
106
  requirement: !ruby/object:Gem::Requirement
@@ -101,32 +121,75 @@ dependencies:
101
121
  requirements:
102
122
  - - "~>"
103
123
  - !ruby/object:Gem::Version
104
- version: 1.6.0
124
+ version: '1.25'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.25'
132
+ - !ruby/object:Gem::Dependency
133
+ name: rubocop-minitest
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.22.0
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.22.0
146
+ - !ruby/object:Gem::Dependency
147
+ name: rubocop-packaging
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.5.0
105
153
  type: :development
106
154
  prerelease: false
107
155
  version_requirements: !ruby/object:Gem::Requirement
108
156
  requirements:
109
157
  - - "~>"
110
158
  - !ruby/object:Gem::Version
111
- version: 1.6.0
159
+ version: 0.5.0
112
160
  - !ruby/object:Gem::Dependency
113
161
  name: rubocop-performance
114
162
  requirement: !ruby/object:Gem::Requirement
115
163
  requirements:
116
164
  - - "~>"
117
165
  - !ruby/object:Gem::Version
118
- version: 1.9.1
166
+ version: '1.13'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.13'
174
+ - !ruby/object:Gem::Dependency
175
+ name: rubocop-rake
176
+ requirement: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 0.6.0
119
181
  type: :development
120
182
  prerelease: false
121
183
  version_requirements: !ruby/object:Gem::Requirement
122
184
  requirements:
123
185
  - - "~>"
124
186
  - !ruby/object:Gem::Version
125
- version: 1.9.1
187
+ version: 0.6.0
126
188
  description: |2
127
189
  LiveAST enables a program to find the ASTs of objects created by dynamically
128
190
  generated code.
129
- email: matijs@matijs.net
191
+ email:
192
+ - matijs@matijs.net
130
193
  executables: []
131
194
  extensions: []
132
195
  extra_rdoc_files:
@@ -135,9 +198,6 @@ extra_rdoc_files:
135
198
  files:
136
199
  - CHANGES.rdoc
137
200
  - README.rdoc
138
- - Rakefile
139
- - devel/levitate.rb
140
- - devel/levitate_config.rb
141
201
  - lib/live_ast.rb
142
202
  - lib/live_ast/ast_eval.rb
143
203
  - lib/live_ast/ast_load.rb
@@ -150,6 +210,7 @@ files:
150
210
  - lib/live_ast/linker.rb
151
211
  - lib/live_ast/loader.rb
152
212
  - lib/live_ast/reader.rb
213
+ - lib/live_ast/replace_caller.rb
153
214
  - lib/live_ast/replace_eval.rb
154
215
  - lib/live_ast/replace_load.rb
155
216
  - lib/live_ast/replace_raise.rb
@@ -159,61 +220,15 @@ files:
159
220
  - lib/live_ast/to_ast.rb
160
221
  - lib/live_ast/to_ruby.rb
161
222
  - lib/live_ast/version.rb
162
- - test/alias_test.rb
163
- - test/ast_eval/ast_eval_test.rb
164
- - test/ast_load/ast_load_test.rb
165
- - test/attr_test.rb
166
- - test/backtrace_test.rb
167
- - test/base/noninvasive_test.rb
168
- - test/base/reload_test.rb
169
- - test/covert_define_method_test.rb
170
- - test/def_test.rb
171
- - test/define_method_test.rb
172
- - test/define_singleton_method_test.rb
173
- - test/encoding_test.rb
174
- - test/encoding_test/bad.rb
175
- - test/encoding_test/cp932.rb
176
- - test/encoding_test/default.rb
177
- - test/encoding_test/eucjp.rb
178
- - test/encoding_test/koi8.rb
179
- - test/encoding_test/koi8_shebang.rb
180
- - test/encoding_test/koi8_with_utf8bom.rb
181
- - test/encoding_test/usascii.rb
182
- - test/encoding_test/usascii_with_utf8bom.rb
183
- - test/encoding_test/utf8.rb
184
- - test/encoding_test/utf8bom.rb
185
- - test/encoding_test/utf8bom_only.rb
186
- - test/encoding_test/utf8dos.rb
187
- - test/encoding_test/utf8mac.rb
188
- - test/encoding_test/utf8mac_alt.rb
189
- - test/encoding_test/utf8unix.rb
190
- - test/error_test.rb
191
- - test/eval_test.rb
192
- - test/flush_cache_test.rb
193
- - test/full/ast_reload_test.rb
194
- - test/full/replace_eval_test.rb
195
- - test/irb_test.rb
196
- - test/lambda_test.rb
197
- - test/load_path_test.rb
198
- - test/load_test.rb
199
- - test/main.rb
200
- - test/nested_test.rb
201
- - test/readme_test.rb
202
- - test/recursive_eval_test.rb
203
- - test/redefine_method_test.rb
204
- - test/rubygems_test.rb
205
- - test/rubyspec_test.rb
206
- - test/singleton_test.rb
207
- - test/stdlib_test.rb
208
- - test/thread_test.rb
209
- - test/to_ast/to_ast_feature_test.rb
210
- - test/to_ruby/to_ruby_feature_test.rb
211
- - test/to_ruby/to_ruby_test.rb
212
223
  homepage: https://github.com/mvz/live_ast
213
224
  licenses:
214
225
  - MIT
215
- metadata: {}
216
- post_install_message:
226
+ metadata:
227
+ homepage_uri: https://github.com/mvz/live_ast
228
+ source_code_uri: https://github.com/mvz/live_ast
229
+ changelog_uri: https://github.com/mvz/live_ast/blob/master/CHANGES.rdoc
230
+ rubygems_mfa_required: 'true'
231
+ post_install_message:
217
232
  rdoc_options:
218
233
  - "--main"
219
234
  - README.rdoc
@@ -234,58 +249,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
249
  - !ruby/object:Gem::Version
235
250
  version: '0'
236
251
  requirements: []
237
- rubygems_version: 3.2.3
238
- signing_key:
252
+ rubygems_version: 3.3.7
253
+ signing_key:
239
254
  specification_version: 4
240
255
  summary: Live abstract syntax trees of methods and procs.
241
- test_files:
242
- - test/alias_test.rb
243
- - test/full/ast_reload_test.rb
244
- - test/full/replace_eval_test.rb
245
- - test/eval_test.rb
246
- - test/load_path_test.rb
247
- - test/readme_test.rb
248
- - test/stdlib_test.rb
249
- - test/encoding_test/koi8_shebang.rb
250
- - test/encoding_test/utf8dos.rb
251
- - test/encoding_test/koi8.rb
252
- - test/encoding_test/eucjp.rb
253
- - test/encoding_test/utf8bom.rb
254
- - test/encoding_test/utf8bom_only.rb
255
- - test/encoding_test/cp932.rb
256
- - test/encoding_test/usascii.rb
257
- - test/encoding_test/utf8.rb
258
- - test/encoding_test/usascii_with_utf8bom.rb
259
- - test/encoding_test/utf8mac_alt.rb
260
- - test/encoding_test/default.rb
261
- - test/encoding_test/koi8_with_utf8bom.rb
262
- - test/encoding_test/utf8unix.rb
263
- - test/encoding_test/utf8mac.rb
264
- - test/encoding_test/bad.rb
265
- - test/to_ruby/to_ruby_test.rb
266
- - test/to_ruby/to_ruby_feature_test.rb
267
- - test/nested_test.rb
268
- - test/singleton_test.rb
269
- - test/define_singleton_method_test.rb
270
- - test/irb_test.rb
271
- - test/attr_test.rb
272
- - test/lambda_test.rb
273
- - test/load_test.rb
274
- - test/base/noninvasive_test.rb
275
- - test/base/reload_test.rb
276
- - test/encoding_test.rb
277
- - test/rubyspec_test.rb
278
- - test/main.rb
279
- - test/define_method_test.rb
280
- - test/error_test.rb
281
- - test/rubygems_test.rb
282
- - test/ast_load/ast_load_test.rb
283
- - test/def_test.rb
284
- - test/recursive_eval_test.rb
285
- - test/ast_eval/ast_eval_test.rb
286
- - test/flush_cache_test.rb
287
- - test/thread_test.rb
288
- - test/redefine_method_test.rb
289
- - test/backtrace_test.rb
290
- - test/covert_define_method_test.rb
291
- - test/to_ast/to_ast_feature_test.rb
256
+ test_files: []
data/Rakefile DELETED
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rake/clean"
4
- require "bundler/gem_tasks"
5
- require "rake/testtask"
6
- require "rdoc/task"
7
-
8
- namespace :test do
9
- desc "run tests"
10
- Rake::TestTask.new(:main) do |t|
11
- t.libs = ["lib"]
12
- t.ruby_opts += ["-w -Itest"]
13
- t.test_files = FileList["test/*_test.rb"]
14
- end
15
-
16
- Rake::TestTask.new(:base) do |t|
17
- t.libs = ["lib"]
18
- t.ruby_opts += ["-w -Itest"]
19
- t.test_files = FileList["test/base/*_test.rb"]
20
- end
21
-
22
- Rake::TestTask.new(:ast_load) do |t|
23
- t.libs = ["lib"]
24
- t.ruby_opts += ["-w -Itest"]
25
- t.test_files = FileList["test/ast_load/*_test.rb"]
26
- end
27
-
28
- Rake::TestTask.new(:ast_eval) do |t|
29
- t.libs = ["lib"]
30
- t.ruby_opts += ["-w -Itest"]
31
- t.test_files = FileList["test/ast_eval/*_test.rb"]
32
- end
33
-
34
- Rake::TestTask.new(:to_ast) do |t|
35
- t.libs = ["lib"]
36
- t.ruby_opts += ["-w -Itest"]
37
- t.test_files = FileList["test/to_ast/*_test.rb"]
38
- end
39
-
40
- Rake::TestTask.new(:to_ruby) do |t|
41
- t.libs = ["lib"]
42
- t.ruby_opts += ["-w -Itest"]
43
- t.test_files = FileList["test/to_ruby/*_test.rb"]
44
- end
45
-
46
- Rake::TestTask.new(:full) do |t|
47
- t.libs = ["lib"]
48
- t.ruby_opts += ["-w -Itest"]
49
- t.test_files = FileList["test/full/*_test.rb"]
50
- end
51
-
52
- task all: [:main, :base, :ast_load, :to_ast, :to_ruby, :full]
53
- end
54
-
55
- RDoc::Task.new(:rdoc) do |t|
56
- t.main = "README.rdoc"
57
- t.title = "LiveAST: Live Abstract Syntax Trees"
58
- t.options += ["--visibility", "private"]
59
- t.rdoc_files.include("README.rdoc", "CHANGES.rdoc", "lib")
60
- end
61
-
62
- task default: "test:all"
data/devel/levitate.rb DELETED
@@ -1,184 +0,0 @@
1
- class Levitate
2
- #### utility for instance and class
3
- module Util
4
- def ruby_bin
5
- require 'rbconfig'
6
-
7
- name = File.join(
8
- RbConfig::CONFIG["bindir"],
9
- RbConfig::CONFIG["RUBY_INSTALL_NAME"]
10
- )
11
-
12
- if RbConfig::CONFIG["host"] =~ %r!(mswin|cygwin|mingw)! and
13
- File.basename(name) !~ %r!\.(exe|com|bat|cmd)\Z!i
14
- name + RbConfig::CONFIG["EXEEXT"]
15
- else
16
- name
17
- end
18
- end
19
-
20
- def ruby_command
21
- [ruby_bin] + Levitate.ruby_opts.to_a
22
- end
23
-
24
- def ruby_command_string
25
- ruby_command.join(" ")
26
- end
27
-
28
- def run(*args)
29
- cmd = ruby_command + args
30
- unless system(*cmd)
31
- cmd_str = cmd.map { |t| "'#{t}'" }.join(", ")
32
- raise "system(#{cmd_str}) failed with status #{$?.exitstatus}"
33
- end
34
- end
35
-
36
- def run_each_file(*files)
37
- files.each { |file|
38
- run("-w", file)
39
- }
40
- end
41
-
42
- def run_code_and_capture(code)
43
- IO.popen(ruby_command_string, "r+") { |pipe|
44
- pipe.print(code)
45
- pipe.flush
46
- pipe.close_write
47
- pipe.read
48
- }
49
- end
50
-
51
- def run_file_and_capture(file)
52
- unless File.file? file
53
- raise "file does not exist: `#{file}'"
54
- end
55
- IO.popen(ruby_command_string + " " + file, "r") { |pipe|
56
- pipe.read
57
- }
58
- end
59
-
60
- def with_warnings(value = true)
61
- previous = $VERBOSE
62
- $VERBOSE = value
63
- begin
64
- yield
65
- ensure
66
- $VERBOSE = previous
67
- end
68
- end
69
-
70
- def no_warnings(&block)
71
- with_warnings(nil, &block)
72
- end
73
-
74
- def to_camel_case(str)
75
- str.split('_').map { |t| t.capitalize }.join
76
- end
77
-
78
- def write_file(file)
79
- contents = yield
80
- File.open(file, "wb") { |out|
81
- out.print(contents)
82
- }
83
- contents
84
- end
85
-
86
- def instance_exec2(obj, *args, &block)
87
- method_name = ["_", obj.object_id, "_", Thread.current.object_id].join
88
- (class << obj; self; end).class_eval do
89
- define_method method_name, &block
90
- begin
91
- obj.send(method_name, *args)
92
- ensure
93
- remove_method method_name
94
- end
95
- end
96
- end
97
- end
98
- extend Util
99
- include Util
100
-
101
- #### public helpers for testing
102
-
103
- class << self
104
- def run_doc_code(code, expected, index, instance, &block)
105
- lib = File.expand_path(File.dirname(__FILE__) + "/../lib")
106
- header = %{
107
- $LOAD_PATH.unshift "#{lib}"
108
- begin
109
- }
110
- footer = %{
111
- rescue Exception => __levitate_exception
112
- puts "raises \#{__levitate_exception.class}"
113
- end
114
- }
115
- final_code = header + code + footer
116
-
117
- # Sometimes code is required to be inside a file.
118
- actual = nil
119
- require 'tempfile'
120
- Tempfile.open("run-rdoc-code") { |temp_file|
121
- temp_file.print(final_code)
122
- temp_file.close
123
- actual = run_file_and_capture(temp_file.path).chomp
124
- }
125
-
126
- instance_exec2(instance, expected, actual, index, &block)
127
- end
128
-
129
- def run_doc_section(file, section, instance, &block)
130
- contents = File.read(file)
131
- re = %r!^=+[ \t]#{Regexp.quote(section)}.*?\n(.*?)^=!m
132
- if (section_contents = contents[re, 1])
133
- index = 0
134
- section_contents.scan(%r!^( \S.*?)(?=(^\S|\Z))!m) { |indented, unused|
135
- code_sections = indented.split(%r!^ \#\#\#\# output:\s*$!)
136
- code, expected = (
137
- case code_sections.size
138
- when 1
139
- [indented, indented.scan(%r!\# => (.*?)\n!).flatten.join("\n")]
140
- when 2
141
- code_sections
142
- else
143
- raise "parse error"
144
- end
145
- )
146
- code.gsub!(/^\s*%.*$/, "") # ignore shell command examples
147
- run_doc_code(code, expected, index, instance, &block)
148
- index += 1
149
- }
150
- else
151
- raise "couldn't find section `#{section}' of `#{file}'"
152
- end
153
- end
154
-
155
- def doc_to_test(file, *sections, &block)
156
- levitate = self
157
- klass = Class.new MiniTest::Test do
158
- sections.each { |section|
159
- define_method "test_#{file}_#{section}" do
160
- if block
161
- levitate.run_doc_section(file, section, self, &block)
162
- else
163
- levitate.run_doc_section(file, section, self) {
164
- |expected, actual, index|
165
- assert_equal expected, actual
166
- }
167
- end
168
- end
169
- }
170
- end
171
- Object.const_set("Test#{file}".gsub(".", ""), klass)
172
- end
173
-
174
- def ruby_opts
175
- @ruby_opts ||= []
176
- end
177
- attr_writer :ruby_opts
178
- end
179
- end
180
-
181
- lambda do
182
- config = File.join(File.dirname(__FILE__), "levitate_config.rb")
183
- require config if File.file? config
184
- end.call
@@ -1,4 +0,0 @@
1
-
2
- if RUBY_ENGINE == "jruby"
3
- Levitate.ruby_opts = %w[--1.9]
4
- end