live_ast 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/CHANGES.rdoc +6 -0
  2. data/MANIFEST +54 -0
  3. data/README.rdoc +388 -0
  4. data/Rakefile +19 -0
  5. data/devel/jumpstart.rb +983 -0
  6. data/lib/live_ast/ast_eval.rb +13 -0
  7. data/lib/live_ast/ast_load.rb +15 -0
  8. data/lib/live_ast/base.rb +56 -0
  9. data/lib/live_ast/cache.rb +14 -0
  10. data/lib/live_ast/error.rb +30 -0
  11. data/lib/live_ast/evaler.rb +66 -0
  12. data/lib/live_ast/linker.rb +107 -0
  13. data/lib/live_ast/loader.rb +69 -0
  14. data/lib/live_ast/parser.rb +48 -0
  15. data/lib/live_ast/replace_load.rb +14 -0
  16. data/lib/live_ast/replace_raise.rb +21 -0
  17. data/lib/live_ast/to_ast.rb +17 -0
  18. data/lib/live_ast/to_ruby.rb +12 -0
  19. data/lib/live_ast/version.rb +3 -0
  20. data/lib/live_ast.rb +4 -0
  21. data/test/ast_eval_feature_test.rb +11 -0
  22. data/test/ast_load_feature_test.rb +11 -0
  23. data/test/backtrace_test.rb +159 -0
  24. data/test/covert_define_method_test.rb +23 -0
  25. data/test/def_test.rb +35 -0
  26. data/test/define_method_test.rb +41 -0
  27. data/test/define_singleton_method_test.rb +15 -0
  28. data/test/encoding_test/bad.rb +1 -0
  29. data/test/encoding_test/cp932.rb +6 -0
  30. data/test/encoding_test/default.rb +5 -0
  31. data/test/encoding_test/eucjp.rb +6 -0
  32. data/test/encoding_test/koi8.rb +6 -0
  33. data/test/encoding_test/koi8_shebang.rb +7 -0
  34. data/test/encoding_test/usascii.rb +6 -0
  35. data/test/encoding_test/utf8.rb +6 -0
  36. data/test/encoding_test.rb +51 -0
  37. data/test/error_test.rb +115 -0
  38. data/test/eval_test.rb +269 -0
  39. data/test/flush_cache_test.rb +98 -0
  40. data/test/lambda_test.rb +56 -0
  41. data/test/load_path_test.rb +84 -0
  42. data/test/load_test.rb +85 -0
  43. data/test/noninvasive_test.rb +51 -0
  44. data/test/readme_test.rb +11 -0
  45. data/test/recursive_eval_test.rb +52 -0
  46. data/test/redefine_method_test.rb +83 -0
  47. data/test/reload_test.rb +108 -0
  48. data/test/shared/ast_generators.rb +124 -0
  49. data/test/shared/main.rb +110 -0
  50. data/test/stdlib_test.rb +11 -0
  51. data/test/thread_test.rb +44 -0
  52. data/test/to_ast_feature_test.rb +15 -0
  53. data/test/to_ruby_feature_test.rb +15 -0
  54. data/test/to_ruby_test.rb +86 -0
  55. metadata +223 -0
@@ -0,0 +1,110 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
2
+
3
+ # require first for stdlib_test
4
+ require 'pp'
5
+ require 'find'
6
+ require 'fileutils'
7
+
8
+ require 'minitest/unit'
9
+ require 'minitest/mock'
10
+ require 'minitest/autorun'
11
+ require 'live_ast/base'
12
+
13
+ require_relative "ast_generators"
14
+
15
+ def define_unsorted_test_case(name, superclass, &block)
16
+ klass = Class.new superclass, &block
17
+ letter = ('A'..'Z').to_a[rand(26)]
18
+ Object.const_set "#{letter}#{name}", klass
19
+ end
20
+
21
+ class JLMiniTest < MiniTest::Unit::TestCase
22
+ def self.test_methods
23
+ default = super
24
+ onlies = default.select { |m| m =~ %r!__only\Z! }
25
+ if onlies.empty?
26
+ default
27
+ else
28
+ puts "\n!!! NOTE: running ONLY *__only tests for #{self}"
29
+ onlies
30
+ end
31
+ end
32
+
33
+ def delim(char)
34
+ ":\n" << (char*72) << "\n"
35
+ end
36
+
37
+ def mu_pp(obj)
38
+ delim("_") <<
39
+ obj.pretty_inspect.chomp <<
40
+ delim("=")
41
+ end
42
+
43
+ def unfixable
44
+ begin
45
+ yield
46
+ raise "claimed to be unfixable, but assertion succeeded"
47
+ rescue MiniTest::Assertion
48
+ end
49
+ end
50
+
51
+ alias_method :assert_raise, :assert_raises
52
+ alias_method :assert_not_equal, :refute_equal
53
+ alias_method :assert_not_nil, :refute_nil
54
+
55
+ def assert_nothing_raised
56
+ assert_equal 3, 3
57
+ yield
58
+ rescue => ex
59
+ raise MiniTest::Assertion,
60
+ exception_details(ex, "Expected nothing raised, but got:")
61
+ end
62
+ end
63
+
64
+ class BaseTest < JLMiniTest
65
+ include ASTGenerators
66
+
67
+ DATA_DIR = File.expand_path(File.dirname(__FILE__) + "/../data")
68
+
69
+ def temp_file(basename = nil)
70
+ unless basename
71
+ basename = ('a'..'z').to_a.shuffle.join + ".rb"
72
+ end
73
+
74
+ path = DATA_DIR + "/" + basename
75
+ FileUtils.mkdir DATA_DIR unless File.directory? DATA_DIR
76
+
77
+ begin
78
+ FileUtils.rm_f path
79
+ yield path
80
+ ensure
81
+ unless defined? SimpleCov
82
+ FileUtils.rm_f path
83
+ FileUtils.rmdir DATA_DIR rescue nil
84
+ end
85
+ end
86
+ end
87
+
88
+ def write_file(file, contents)
89
+ File.open(file, "w") { |f| f.print contents }
90
+ end
91
+
92
+ def return_block(&block)
93
+ block
94
+ end
95
+
96
+ def exception_backtrace
97
+ begin
98
+ yield
99
+ rescue Exception => e
100
+ e.backtrace
101
+ end
102
+ end
103
+ end
104
+
105
+ class RegularTest < BaseTest
106
+ def setup
107
+ super
108
+ require 'live_ast'
109
+ end
110
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'shared/main'
2
+
3
+ class StdlibTest < RegularTest
4
+ def test_pp
5
+ assert_not_nil method(:pp).to_ast
6
+ end
7
+
8
+ def test_find
9
+ assert_not_nil Find.method(:find).to_ast
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ require_relative 'shared/main'
2
+
3
+ require 'thread'
4
+
5
+ class ThreadTest < RegularTest
6
+
7
+ def test_threads
8
+ klass = nil
9
+ mutex = Mutex.new
10
+ stop = false
11
+ results = []
12
+ num_threads = 50
13
+
14
+ workers = (0...num_threads).map {
15
+ Thread.new {
16
+ until stop
17
+ if klass
18
+ found = klass.instance_method(:f).to_ast
19
+ mutex.synchronize {
20
+ results << found
21
+ }
22
+ break
23
+ end
24
+ end
25
+ }
26
+ }
27
+
28
+ klass = Class.new do
29
+ def f
30
+ "anon#f"
31
+ end
32
+ end
33
+
34
+ sleep(0.2)
35
+ stop = true
36
+
37
+ workers.each { |t| t.join }
38
+
39
+ assert_equal num_threads, results.size
40
+ results.each { |result|
41
+ assert_equal no_arg_def(:f, "anon#f"), result
42
+ }
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'shared/main'
2
+
3
+ class AAB_ToASTFeatureTest < BaseTest
4
+ def test_require
5
+ [Method, UnboundMethod, Proc].each { |obj|
6
+ assert !obj.instance_methods.include?(:to_ast)
7
+ }
8
+
9
+ require 'live_ast/to_ast'
10
+
11
+ [Method, UnboundMethod, Proc].each { |obj|
12
+ assert obj.instance_methods.include?(:to_ast)
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'shared/main'
2
+
3
+ class AAB_ToRubyFeatureTest < BaseTest
4
+ def test_require
5
+ [Method, UnboundMethod, Proc].each { |obj|
6
+ assert !obj.instance_methods.include?(:to_ruby)
7
+ }
8
+
9
+ require 'live_ast/to_ruby'
10
+
11
+ [Method, UnboundMethod, Proc].each { |obj|
12
+ assert obj.instance_methods.include?(:to_ruby)
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,86 @@
1
+ require_relative 'shared/main'
2
+
3
+ class AAC_ToRubyTest < RegularTest
4
+ def setup
5
+ super
6
+ require 'live_ast/to_ruby'
7
+ end
8
+
9
+ def test_lambda_0
10
+ src = %{lambda { "moo" }}
11
+ dst = ast_eval(src, binding).to_ruby
12
+ assert_equal src, dst
13
+ end
14
+
15
+ def test_lambda_1
16
+ src = %{lambda { |x| (x ** 2) }}
17
+ dst = ast_eval(src, binding).to_ruby
18
+ assert_equal src, dst
19
+ end
20
+
21
+ def test_lambda_2
22
+ src = %{lambda { |x, y| (x + y) }}
23
+ dst = ast_eval(src, binding).to_ruby
24
+ assert_equal src, dst
25
+ end
26
+
27
+ def test_proc_0
28
+ src = %{proc { "moo" }}
29
+ dst = ast_eval(src, binding).to_ruby
30
+ assert_equal src, dst
31
+ end
32
+
33
+ def test_proc_1
34
+ src = %{proc { |x| (x ** 2) }}
35
+ dst = ast_eval(src, binding).to_ruby
36
+ assert_equal src, dst
37
+ end
38
+
39
+ def test_proc_2
40
+ src = %{proc { |x, y| (x * y) }}
41
+ dst = ast_eval(src, binding).to_ruby
42
+ assert_equal src, dst
43
+ end
44
+
45
+ def test_block_0
46
+ src = %{return_block { "moo" }}
47
+ dst = ast_eval(src, binding).to_ruby
48
+ assert_equal src, dst
49
+ end
50
+
51
+ def test_block_1
52
+ src = %{return_block { |x| (x ** 2) }}
53
+ dst = ast_eval(src, binding).to_ruby
54
+ assert_equal src, dst
55
+ end
56
+
57
+ def test_block_2
58
+ src = %{return_block { |x, y| (x - y) }}
59
+ dst = ast_eval(src, binding).to_ruby
60
+ assert_equal src, dst
61
+ end
62
+
63
+ def test_method_0
64
+ src = %{def f\n "moo"\nend}
65
+ dst = Class.new do
66
+ ast_eval(src, binding)
67
+ end.instance_method(:f).to_ruby
68
+ assert_equal src, dst
69
+ end
70
+
71
+ def test_method_1
72
+ src = %{def f(x)\n (x ** 2)\nend}
73
+ dst = Class.new do
74
+ ast_eval(src, binding)
75
+ end.instance_method(:f).to_ruby
76
+ assert_equal src, dst
77
+ end
78
+
79
+ def test_method_2
80
+ src = %{def f(x, y)\n (x / y)\nend}
81
+ dst = Class.new do
82
+ ast_eval(src, binding)
83
+ end.instance_method(:f).to_ruby
84
+ assert_equal src, dst
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,223 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: live_ast
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.2.0
6
+ platform: ruby
7
+ authors:
8
+ - James M. Lawrence
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-02-17 00:00:00 -05:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: ruby_parser
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - "="
23
+ - !ruby/object:Gem::Version
24
+ version: 2.0.5
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ description: LiveAST enables a program to find the ASTs of objects created by dynamically generated code.
28
+ email:
29
+ - quixoticsycophant@gmail.com
30
+ executables: []
31
+
32
+ extensions: []
33
+
34
+ extra_rdoc_files:
35
+ - README.rdoc
36
+ files:
37
+ - CHANGES.rdoc
38
+ - README.rdoc
39
+ - Rakefile
40
+ - devel/jumpstart.rb
41
+ - lib/live_ast.rb
42
+ - lib/live_ast/ast_eval.rb
43
+ - lib/live_ast/ast_load.rb
44
+ - lib/live_ast/base.rb
45
+ - lib/live_ast/cache.rb
46
+ - lib/live_ast/error.rb
47
+ - lib/live_ast/evaler.rb
48
+ - lib/live_ast/linker.rb
49
+ - lib/live_ast/loader.rb
50
+ - lib/live_ast/parser.rb
51
+ - lib/live_ast/replace_load.rb
52
+ - lib/live_ast/replace_raise.rb
53
+ - lib/live_ast/to_ast.rb
54
+ - lib/live_ast/to_ruby.rb
55
+ - lib/live_ast/version.rb
56
+ - test/ast_eval_feature_test.rb
57
+ - test/ast_load_feature_test.rb
58
+ - test/backtrace_test.rb
59
+ - test/covert_define_method_test.rb
60
+ - test/def_test.rb
61
+ - test/define_method_test.rb
62
+ - test/define_singleton_method_test.rb
63
+ - test/encoding_test.rb
64
+ - test/encoding_test/bad.rb
65
+ - test/encoding_test/cp932.rb
66
+ - test/encoding_test/default.rb
67
+ - test/encoding_test/eucjp.rb
68
+ - test/encoding_test/koi8.rb
69
+ - test/encoding_test/koi8_shebang.rb
70
+ - test/encoding_test/usascii.rb
71
+ - test/encoding_test/utf8.rb
72
+ - test/error_test.rb
73
+ - test/eval_test.rb
74
+ - test/flush_cache_test.rb
75
+ - test/lambda_test.rb
76
+ - test/load_path_test.rb
77
+ - test/load_test.rb
78
+ - test/noninvasive_test.rb
79
+ - test/readme_test.rb
80
+ - test/recursive_eval_test.rb
81
+ - test/redefine_method_test.rb
82
+ - test/reload_test.rb
83
+ - test/shared/ast_generators.rb
84
+ - test/shared/main.rb
85
+ - test/stdlib_test.rb
86
+ - test/thread_test.rb
87
+ - test/to_ast_feature_test.rb
88
+ - test/to_ruby_feature_test.rb
89
+ - test/to_ruby_test.rb
90
+ - MANIFEST
91
+ has_rdoc: true
92
+ homepage: http://liveast.rubyforge.org
93
+ licenses: []
94
+
95
+ post_install_message:
96
+ rdoc_options:
97
+ - --main
98
+ - README.rdoc
99
+ - --title
100
+ - "LiveAST: Live Abstract Syntax Trees"
101
+ - --exclude
102
+ - CHANGES.rdoc
103
+ - --exclude
104
+ - Rakefile
105
+ - --exclude
106
+ - devel/jumpstart.rb
107
+ - --exclude
108
+ - lib/live_ast.rb
109
+ - --exclude
110
+ - lib/live_ast/ast_load.rb
111
+ - --exclude
112
+ - lib/live_ast/cache.rb
113
+ - --exclude
114
+ - lib/live_ast/error.rb
115
+ - --exclude
116
+ - lib/live_ast/evaler.rb
117
+ - --exclude
118
+ - lib/live_ast/linker.rb
119
+ - --exclude
120
+ - lib/live_ast/loader.rb
121
+ - --exclude
122
+ - lib/live_ast/parser.rb
123
+ - --exclude
124
+ - lib/live_ast/replace_load.rb
125
+ - --exclude
126
+ - lib/live_ast/replace_raise.rb
127
+ - --exclude
128
+ - lib/live_ast/to_ast.rb
129
+ - --exclude
130
+ - lib/live_ast/to_ruby.rb
131
+ - --exclude
132
+ - test/ast_eval_feature_test.rb
133
+ - --exclude
134
+ - test/ast_load_feature_test.rb
135
+ - --exclude
136
+ - test/backtrace_test.rb
137
+ - --exclude
138
+ - test/covert_define_method_test.rb
139
+ - --exclude
140
+ - test/def_test.rb
141
+ - --exclude
142
+ - test/define_method_test.rb
143
+ - --exclude
144
+ - test/define_singleton_method_test.rb
145
+ - --exclude
146
+ - test/encoding_test.rb
147
+ - --exclude
148
+ - test/encoding_test/bad.rb
149
+ - --exclude
150
+ - test/encoding_test/cp932.rb
151
+ - --exclude
152
+ - test/encoding_test/default.rb
153
+ - --exclude
154
+ - test/encoding_test/eucjp.rb
155
+ - --exclude
156
+ - test/encoding_test/koi8.rb
157
+ - --exclude
158
+ - test/encoding_test/koi8_shebang.rb
159
+ - --exclude
160
+ - test/encoding_test/usascii.rb
161
+ - --exclude
162
+ - test/encoding_test/utf8.rb
163
+ - --exclude
164
+ - test/error_test.rb
165
+ - --exclude
166
+ - test/eval_test.rb
167
+ - --exclude
168
+ - test/flush_cache_test.rb
169
+ - --exclude
170
+ - test/lambda_test.rb
171
+ - --exclude
172
+ - test/load_path_test.rb
173
+ - --exclude
174
+ - test/load_test.rb
175
+ - --exclude
176
+ - test/noninvasive_test.rb
177
+ - --exclude
178
+ - test/readme_test.rb
179
+ - --exclude
180
+ - test/recursive_eval_test.rb
181
+ - --exclude
182
+ - test/redefine_method_test.rb
183
+ - --exclude
184
+ - test/reload_test.rb
185
+ - --exclude
186
+ - test/shared/ast_generators.rb
187
+ - --exclude
188
+ - test/shared/main.rb
189
+ - --exclude
190
+ - test/stdlib_test.rb
191
+ - --exclude
192
+ - test/thread_test.rb
193
+ - --exclude
194
+ - test/to_ast_feature_test.rb
195
+ - --exclude
196
+ - test/to_ruby_feature_test.rb
197
+ - --exclude
198
+ - test/to_ruby_test.rb
199
+ - --exclude
200
+ - MANIFEST
201
+ require_paths:
202
+ - lib
203
+ required_ruby_version: !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: "0"
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ none: false
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: "0"
215
+ requirements: []
216
+
217
+ rubyforge_project: liveast
218
+ rubygems_version: 1.5.2
219
+ signing_key:
220
+ specification_version: 3
221
+ summary: A pure Ruby library for obtaining live abstract syntax trees of methods and procs.
222
+ test_files: []
223
+