mvz-live_ast 1.1.1 → 1.1.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.
- checksums.yaml +4 -4
- data/CHANGES.rdoc +14 -0
- data/Rakefile +48 -9
- data/devel/levitate.rb +5 -674
- data/lib/live_ast/common.rb +22 -21
- data/lib/live_ast/error.rb +2 -2
- data/lib/live_ast/irb_spy.rb +4 -6
- data/lib/live_ast/linker.rb +7 -7
- data/lib/live_ast/loader.rb +6 -6
- data/lib/live_ast/reader.rb +2 -2
- data/lib/live_ast/replace_eval.rb +27 -31
- data/lib/live_ast/replace_load.rb +1 -1
- data/lib/live_ast/ruby_parser.rb +24 -22
- data/lib/live_ast/ruby_parser/test.rb +183 -179
- data/lib/live_ast/ruby_parser/unparser.rb +10 -6
- data/lib/live_ast/to_ast.rb +1 -1
- data/lib/live_ast/version.rb +1 -1
- data/test/ast_eval/ast_eval_test.rb +11 -0
- data/test/ast_load/ast_load_test.rb +45 -0
- data/test/backtrace_test.rb +29 -28
- data/test/{noninvasive_test.rb → base/noninvasive_test.rb} +7 -5
- data/test/base/reload_test.rb +41 -0
- data/test/covert_define_method_test.rb +1 -1
- data/test/define_method_test.rb +5 -5
- data/test/encoding_test.rb +5 -5
- data/test/error_test.rb +6 -6
- data/test/eval_test.rb +7 -7
- data/test/flush_cache_test.rb +6 -6
- data/test/full/ast_reload_test.rb +39 -0
- data/test/{replace_eval_test.rb → full/replace_eval_test.rb} +31 -12
- data/test/irb_test.rb +1 -1
- data/test/lambda_test.rb +7 -0
- data/test/load_path_test.rb +12 -12
- data/test/load_test.rb +35 -35
- data/test/main.rb +19 -27
- data/test/nested_test.rb +1 -1
- data/test/readme_test.rb +1 -3
- data/test/recursive_eval_test.rb +2 -3
- data/test/redefine_method_test.rb +2 -2
- data/test/rubygems_test.rb +1 -1
- data/test/rubyspec_test.rb +3 -3
- data/test/stdlib_test.rb +1 -1
- data/test/thread_test.rb +1 -2
- data/test/to_ast/to_ast_feature_test.rb +11 -0
- data/test/to_ruby/to_ruby_feature_test.rb +11 -0
- data/test/{to_ruby_test.rb → to_ruby/to_ruby_test.rb} +2 -2
- metadata +93 -91
- data/test/ast_eval_feature_test.rb +0 -11
- data/test/ast_load_feature_test.rb +0 -11
- data/test/reload_test.rb +0 -105
- data/test/to_ast_feature_test.rb +0 -15
- data/test/to_ruby_feature_test.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 897291ec9d3c788854d81ceac045a13bc0c3ce99
|
4
|
+
data.tar.gz: a435731330baaac2e536d96aeb04f22af1179fb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfeeab4452c22121bf20220b6b49e8b9fbcbe957697209891684edd418f6286b9a32489a872780bed0068cb3f7a79a83bef4bdbe2c7bcc24a80e03076a927bd2
|
7
|
+
data.tar.gz: bf06a3f0415e2462bc84248719ed7023afeceb58585fe5bac6780563b6152b6e356f13b5712723a679552e374d10a1784027e5304c46e062debdd58d7770ebfc
|
data/CHANGES.rdoc
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
|
2
2
|
= live_ast Changes
|
3
3
|
|
4
|
+
== Version 1.1.2
|
5
|
+
|
6
|
+
* Update dependencies
|
7
|
+
* Improve test suite:
|
8
|
+
- Separate suites for different sets of loaded live_ast features
|
9
|
+
- Eliminate test run order dependencies
|
10
|
+
* Clean up code
|
11
|
+
* Fix error handling for nil file argument of instance_eval
|
12
|
+
|
13
|
+
== Version 1.1.1
|
14
|
+
|
15
|
+
* Support Ruby 2.0 and 2.1
|
16
|
+
* Update RubyParser dependency
|
17
|
+
|
4
18
|
== Version 1.1.0
|
5
19
|
|
6
20
|
* incorporate default parser in the main gem
|
data/Rakefile
CHANGED
@@ -1,21 +1,60 @@
|
|
1
1
|
require 'rake/clean'
|
2
|
-
require
|
2
|
+
require 'bundler/gem_tasks'
|
3
3
|
require 'rake/testtask'
|
4
4
|
require 'rdoc/task'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
namespace :test do
|
7
|
+
desc 'run tests'
|
8
|
+
Rake::TestTask.new(:main) do |t|
|
9
|
+
t.libs = ['lib']
|
10
|
+
t.ruby_opts += ["-w -Itest"]
|
11
|
+
t.test_files = FileList['test/*_test.rb']
|
12
|
+
end
|
13
|
+
|
14
|
+
Rake::TestTask.new(:base) do |t|
|
15
|
+
t.libs = ['lib']
|
16
|
+
t.ruby_opts += ["-w -Itest"]
|
17
|
+
t.test_files = FileList['test/base/*_test.rb']
|
18
|
+
end
|
19
|
+
|
20
|
+
Rake::TestTask.new(:ast_load) do |t|
|
21
|
+
t.libs = ['lib']
|
22
|
+
t.ruby_opts += ["-w -Itest"]
|
23
|
+
t.test_files = FileList['test/ast_load/*_test.rb']
|
24
|
+
end
|
25
|
+
|
26
|
+
Rake::TestTask.new(:ast_eval) do |t|
|
27
|
+
t.libs = ['lib']
|
28
|
+
t.ruby_opts += ["-w -Itest"]
|
29
|
+
t.test_files = FileList['test/ast_eval/*_test.rb']
|
30
|
+
end
|
31
|
+
|
32
|
+
Rake::TestTask.new(:to_ast) do |t|
|
33
|
+
t.libs = ['lib']
|
34
|
+
t.ruby_opts += ["-w -Itest"]
|
35
|
+
t.test_files = FileList['test/to_ast/*_test.rb']
|
36
|
+
end
|
37
|
+
|
38
|
+
Rake::TestTask.new(:to_ruby) do |t|
|
39
|
+
t.libs = ['lib']
|
40
|
+
t.ruby_opts += ["-w -Itest"]
|
41
|
+
t.test_files = FileList['test/to_ruby/*_test.rb']
|
42
|
+
end
|
43
|
+
|
44
|
+
Rake::TestTask.new(:full) do |t|
|
45
|
+
t.libs = ['lib']
|
46
|
+
t.ruby_opts += ["-w -Itest"]
|
47
|
+
t.test_files = FileList['test/full/*_test.rb']
|
48
|
+
end
|
49
|
+
|
50
|
+
task all: [:main, :base, :ast_load, :to_ast, :to_ruby, :full]
|
11
51
|
end
|
12
52
|
|
13
53
|
RDoc::Task.new(:rdoc) do |t|
|
14
54
|
t.main = "README.rdoc"
|
15
55
|
t.title = "LiveAST: Live Abstract Syntax Trees"
|
16
|
-
t.options += ["--visibility", "private"
|
56
|
+
t.options += ["--visibility", "private"]
|
17
57
|
t.rdoc_files.include("README.rdoc", "CHANGES.rdoc", "lib")
|
18
|
-
|
19
58
|
end
|
20
59
|
|
21
|
-
task default: :
|
60
|
+
task default: 'test:all'
|
data/devel/levitate.rb
CHANGED
@@ -1,596 +1,5 @@
|
|
1
|
-
|
2
1
|
class Levitate
|
3
|
-
include Rake::DSL if defined? Rake::DSL
|
4
|
-
|
5
|
-
def initialize(gem_name)
|
6
|
-
@gem_name = gem_name
|
7
|
-
|
8
|
-
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
9
|
-
|
10
|
-
yield self
|
11
|
-
|
12
|
-
self.class.instance_methods(false).sort.each do |name|
|
13
|
-
if name.to_s =~ %r!\Adefine_!
|
14
|
-
send(name)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_reader :gem_name
|
20
|
-
|
21
|
-
def self.attribute(name, &block)
|
22
|
-
var = :"@#{name}"
|
23
|
-
define_method name do
|
24
|
-
if instance_variable_defined?(var)
|
25
|
-
instance_variable_get(var)
|
26
|
-
else
|
27
|
-
instance_variable_set(var, instance_eval(&block))
|
28
|
-
end
|
29
|
-
end
|
30
|
-
attr_writer name
|
31
|
-
end
|
32
|
-
|
33
|
-
attribute :version_constant_name do
|
34
|
-
"VERSION"
|
35
|
-
end
|
36
|
-
|
37
|
-
attribute :camel_name do
|
38
|
-
to_camel_case(gem_name)
|
39
|
-
end
|
40
|
-
|
41
|
-
attribute :version do
|
42
|
-
catch :bail do
|
43
|
-
if File.file?(version_file = "./lib/#{gem_name}/version.rb")
|
44
|
-
require version_file
|
45
|
-
elsif File.file?("./lib/#{gem_name}.rb")
|
46
|
-
require gem_name
|
47
|
-
else
|
48
|
-
throw :bail
|
49
|
-
end
|
50
|
-
mod = Kernel.const_get(camel_name)
|
51
|
-
constants = mod.constants.map { |t| t.to_sym }
|
52
|
-
unless constants.include?(version_constant_name.to_sym)
|
53
|
-
throw :bail
|
54
|
-
end
|
55
|
-
mod.const_get(version_constant_name)
|
56
|
-
end or "0.0.0"
|
57
|
-
end
|
58
|
-
|
59
|
-
attribute :required_ruby_version do
|
60
|
-
">= 0"
|
61
|
-
end
|
62
|
-
|
63
|
-
attribute :readme_file do
|
64
|
-
"README.rdoc"
|
65
|
-
end
|
66
|
-
|
67
|
-
attribute :history_file do
|
68
|
-
"CHANGES.rdoc"
|
69
|
-
end
|
70
|
-
|
71
|
-
attribute :doc_dir do
|
72
|
-
"doc"
|
73
|
-
end
|
74
|
-
|
75
|
-
attribute :spec_files do
|
76
|
-
Dir["./spec/*_{spec,example}.rb"]
|
77
|
-
end
|
78
|
-
|
79
|
-
attribute :test_files do
|
80
|
-
(Dir["./test/test_*.rb"] + Dir["./test/*_test.rb"]).uniq
|
81
|
-
end
|
82
|
-
|
83
|
-
attribute :cov_dir do
|
84
|
-
"coverage"
|
85
|
-
end
|
86
|
-
|
87
|
-
attribute :spec_output_dir do
|
88
|
-
"rspec_output"
|
89
|
-
end
|
90
|
-
|
91
|
-
attribute :spec_output_file do
|
92
|
-
"spec.html"
|
93
|
-
end
|
94
|
-
|
95
|
-
attribute :spec_output do
|
96
|
-
"#{spec_output_dir}/#{spec_output_file}"
|
97
|
-
end
|
98
|
-
|
99
|
-
attribute :rcov_options do
|
100
|
-
# workaround for the default rspec task
|
101
|
-
Dir["*"].select { |f| File.directory? f }.inject(Array.new) { |acc, dir|
|
102
|
-
if dir == "lib"
|
103
|
-
acc
|
104
|
-
else
|
105
|
-
acc + ["--exclude", dir + "/"]
|
106
|
-
end
|
107
|
-
} + ["--text-report"]
|
108
|
-
end
|
109
|
-
|
110
|
-
attribute :generated_files do
|
111
|
-
[]
|
112
|
-
end
|
113
|
-
|
114
|
-
attribute :extra_gemspec do
|
115
|
-
lambda { |spec| }
|
116
|
-
end
|
117
|
-
|
118
|
-
attribute :files do
|
119
|
-
if source_control?
|
120
|
-
IO.popen("git ls-files") { |pipe| pipe.read.split "\n" }
|
121
|
-
end.to_a + generated_files
|
122
|
-
end
|
123
|
-
|
124
|
-
attribute :rdoc_files do
|
125
|
-
files_in_require_paths
|
126
|
-
end
|
127
|
-
|
128
|
-
attribute :rdoc_title do
|
129
|
-
"#{gem_name}: #{summary}".sub(/\.\Z/, "")
|
130
|
-
end
|
131
|
-
|
132
|
-
attribute :require_paths do
|
133
|
-
["lib"]
|
134
|
-
end
|
135
|
-
|
136
|
-
attribute :rdoc_options do
|
137
|
-
if File.file?(readme_file)
|
138
|
-
["--main", readme_file]
|
139
|
-
else
|
140
|
-
[]
|
141
|
-
end + [
|
142
|
-
"--title", rdoc_title,
|
143
|
-
] + (files_in_require_paths - rdoc_files).inject(Array.new) {
|
144
|
-
|acc, file|
|
145
|
-
acc + ["--exclude", file]
|
146
|
-
}
|
147
|
-
end
|
148
|
-
|
149
|
-
attribute :extra_rdoc_files do
|
150
|
-
[readme_file, history_file].select { |file| File.file?(file) }
|
151
|
-
end
|
152
|
-
|
153
|
-
attribute :browser do
|
154
|
-
require 'rbconfig'
|
155
|
-
if RbConfig::CONFIG["host"] =~ %r!darwin!
|
156
|
-
"open"
|
157
|
-
else
|
158
|
-
"firefox"
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
attribute :gemspec do
|
163
|
-
Gem::Specification.new do |g|
|
164
|
-
%w[
|
165
|
-
summary
|
166
|
-
version
|
167
|
-
description
|
168
|
-
files
|
169
|
-
rdoc_options
|
170
|
-
extra_rdoc_files
|
171
|
-
require_paths
|
172
|
-
required_ruby_version
|
173
|
-
].each do |param|
|
174
|
-
t = send(param) and g.send("#{param}=", t)
|
175
|
-
end
|
176
|
-
g.name = gem_name
|
177
|
-
g.homepage = url if url
|
178
|
-
dependencies.each { |dep|
|
179
|
-
g.add_dependency(*dep)
|
180
|
-
}
|
181
|
-
development_dependencies.each { |dep|
|
182
|
-
g.add_development_dependency(*dep)
|
183
|
-
}
|
184
|
-
g.authors = developers.map { |d| d[0] }
|
185
|
-
g.email = developers.map { |d| d[1] }
|
186
|
-
extra_gemspec.call(g)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
attribute :readme_contents do
|
191
|
-
File.read(readme_file) rescue "FIXME: readme_file"
|
192
|
-
end
|
193
|
-
|
194
|
-
attribute :sections do
|
195
|
-
begin
|
196
|
-
data = readme_contents.split(%r!^==\s*(.*?)\s*$!)
|
197
|
-
pairs = data[1..-1].each_slice(2).map { |section, contents|
|
198
|
-
[section.downcase, contents.strip]
|
199
|
-
}
|
200
|
-
Hash[*pairs.flatten]
|
201
|
-
rescue
|
202
|
-
nil
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
attribute :description_section do
|
207
|
-
"description"
|
208
|
-
end
|
209
|
-
|
210
|
-
attribute :summary_section do
|
211
|
-
"summary"
|
212
|
-
end
|
213
|
-
|
214
|
-
attribute :description_sentences do
|
215
|
-
1
|
216
|
-
end
|
217
|
-
|
218
|
-
attribute :summary_sentences do
|
219
|
-
1
|
220
|
-
end
|
221
|
-
|
222
|
-
[:summary, :description].each { |section|
|
223
|
-
attribute section do
|
224
|
-
begin
|
225
|
-
sections[send("#{section}_section")].
|
226
|
-
gsub("\n", " ").
|
227
|
-
split(%r!\.\s+!m).
|
228
|
-
first(send("#{section}_sentences")).
|
229
|
-
join(". ").
|
230
|
-
concat(".").
|
231
|
-
sub(%r!\.+\Z!, ".")
|
232
|
-
rescue
|
233
|
-
"FIXME: #{section}"
|
234
|
-
end
|
235
|
-
end
|
236
|
-
}
|
237
|
-
|
238
|
-
attribute :url do
|
239
|
-
"http://#{username}.github.com/#{gem_name}"
|
240
|
-
end
|
241
|
-
|
242
|
-
attribute :username do
|
243
|
-
raise "username not set"
|
244
|
-
end
|
245
|
-
|
246
|
-
attribute :rubyforge_info do
|
247
|
-
nil
|
248
|
-
end
|
249
|
-
|
250
|
-
attribute :dependencies do
|
251
|
-
[]
|
252
|
-
end
|
253
|
-
|
254
|
-
attribute :development_dependencies do
|
255
|
-
[]
|
256
|
-
end
|
257
|
-
|
258
|
-
attribute :developers do
|
259
|
-
[]
|
260
|
-
end
|
261
|
-
|
262
|
-
attribute :remote_levitate do
|
263
|
-
url = ENV["LEVITATE"] ||
|
264
|
-
"https://raw.github.com/quix/levitate/master/levitate.rb"
|
265
|
-
IO.popen("curl -s #{url}") { |f| f.read }
|
266
|
-
end
|
267
|
-
|
268
|
-
attribute :local_levitate do
|
269
|
-
File.open(__FILE__, "rb") { |f| f.read }
|
270
|
-
end
|
271
|
-
|
272
|
-
#### tasks
|
273
|
-
|
274
|
-
def define_clean
|
275
|
-
require 'rake/clean'
|
276
|
-
task :clean do
|
277
|
-
Rake::Task[:clobber].invoke
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
def define_package
|
282
|
-
if source_control?
|
283
|
-
require 'rubygems/package_task'
|
284
|
-
|
285
|
-
task :package => :clean
|
286
|
-
Gem::PackageTask.new(gemspec).define
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
def define_spec
|
291
|
-
unless spec_files.empty?
|
292
|
-
no_warnings {
|
293
|
-
require 'spec/rake/spectask'
|
294
|
-
}
|
295
|
-
|
296
|
-
desc "run specs"
|
297
|
-
Spec::Rake::SpecTask.new('spec') do |t|
|
298
|
-
t.spec_files = spec_files
|
299
|
-
end
|
300
|
-
|
301
|
-
desc "run specs with text output"
|
302
|
-
Spec::Rake::SpecTask.new('text_spec') do |t|
|
303
|
-
t.spec_files = spec_files
|
304
|
-
t.spec_opts = ['-fs']
|
305
|
-
end
|
306
|
-
|
307
|
-
desc "run specs with html output"
|
308
|
-
Spec::Rake::SpecTask.new('full_spec') do |t|
|
309
|
-
t.spec_files = spec_files
|
310
|
-
t.rcov = true
|
311
|
-
t.rcov_opts = rcov_options
|
312
|
-
t.spec_opts = ["-fh:#{spec_output}"]
|
313
|
-
end
|
314
|
-
|
315
|
-
suppress_task_warnings :spec, :full_spec, :text_spec
|
316
|
-
|
317
|
-
desc "run full_spec then open browser"
|
318
|
-
task :show_spec => :full_spec do
|
319
|
-
open_browser(spec_output, cov_dir + "/index.html")
|
320
|
-
end
|
321
|
-
|
322
|
-
desc "run specs individually"
|
323
|
-
task :spec_deps do
|
324
|
-
run_each_file(*spec_files)
|
325
|
-
end
|
326
|
-
|
327
|
-
task :prerelease => [:spec, :spec_deps]
|
328
|
-
task :default => :spec
|
329
|
-
|
330
|
-
CLEAN.add spec_output_dir
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
def define_test
|
335
|
-
unless test_files.empty?
|
336
|
-
desc "run tests"
|
337
|
-
task :test do
|
338
|
-
test_files.each { |file| require file }
|
339
|
-
|
340
|
-
# if we use at_exit hook instead, it won't run before :release
|
341
|
-
MiniTest::Unit.new.run ARGV
|
342
|
-
end
|
343
|
-
|
344
|
-
desc "run tests with coverage"
|
345
|
-
if ruby_18?
|
346
|
-
task :full_test do
|
347
|
-
verbose(false) {
|
348
|
-
sh("rcov", "-o", cov_dir, "--text-report",
|
349
|
-
*(test_files + rcov_options)
|
350
|
-
)
|
351
|
-
}
|
352
|
-
end
|
353
|
-
else
|
354
|
-
task :full_test do
|
355
|
-
rm_rf cov_dir
|
356
|
-
require 'simplecov'
|
357
|
-
SimpleCov.start do
|
358
|
-
add_filter "test/"
|
359
|
-
add_filter "devel/"
|
360
|
-
end
|
361
|
-
Rake::Task[:test].invoke
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
|
-
desc "run full_test then open browser"
|
366
|
-
task :show_test => :full_test do
|
367
|
-
show = lambda { open_browser(cov_dir + "/index.html") }
|
368
|
-
if ruby_18?
|
369
|
-
show.call
|
370
|
-
else
|
371
|
-
SimpleCov.at_exit do
|
372
|
-
SimpleCov.result.format!
|
373
|
-
show.call
|
374
|
-
end
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
desc "run tests individually"
|
379
|
-
task :test_deps do
|
380
|
-
run_each_file(*test_files)
|
381
|
-
end
|
382
|
-
|
383
|
-
task :prerelease => [:test, :test_deps]
|
384
|
-
task :default => :test
|
385
|
-
|
386
|
-
CLEAN.add cov_dir
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
def define_doc
|
391
|
-
desc "run rdoc"
|
392
|
-
task :doc => :clean_doc do
|
393
|
-
gem 'rdoc' rescue nil
|
394
|
-
require 'rdoc/rdoc'
|
395
|
-
args = (
|
396
|
-
gemspec.rdoc_options +
|
397
|
-
gemspec.require_paths.clone +
|
398
|
-
gemspec.extra_rdoc_files +
|
399
|
-
["-o", doc_dir]
|
400
|
-
).flatten.map { |t| t.to_s }
|
401
|
-
RDoc::RDoc.new.document args
|
402
|
-
end
|
403
|
-
|
404
|
-
task :clean_doc do
|
405
|
-
# normally rm_rf, but mimic rake/clean output
|
406
|
-
rm_r(doc_dir) rescue nil
|
407
|
-
end
|
408
|
-
|
409
|
-
desc "run rdoc then open browser"
|
410
|
-
task :show_doc => :doc do
|
411
|
-
open_browser(doc_dir + "/index.html")
|
412
|
-
end
|
413
|
-
|
414
|
-
task :rdoc => :doc
|
415
|
-
task :clean => :clean_doc
|
416
|
-
end
|
417
|
-
|
418
|
-
def define_publish
|
419
|
-
if source_control?
|
420
|
-
desc "publish docs"
|
421
|
-
task :publish => [:clean, :check_directory, :doc] do
|
422
|
-
current_branch = `git branch`[/^\* (\S+)$/, 1] or raise "??? branch"
|
423
|
-
if rubyforge_info
|
424
|
-
user, project = rubyforge_info
|
425
|
-
Dir.chdir(doc_dir) do
|
426
|
-
sh "scp", "-r",
|
427
|
-
".",
|
428
|
-
"#{user}@rubyforge.org:/var/www/gforge-projects/#{project}"
|
429
|
-
end
|
430
|
-
end
|
431
|
-
git "branch", "-D", "gh-pages"
|
432
|
-
git "checkout", "--orphan", "gh-pages"
|
433
|
-
FileUtils.rm ".git/index"
|
434
|
-
git "clean", "-fdx", "-e", "doc"
|
435
|
-
Dir["doc/*"].each { |path|
|
436
|
-
FileUtils.mv path, "."
|
437
|
-
}
|
438
|
-
FileUtils.rmdir "doc"
|
439
|
-
git "add", "."
|
440
|
-
git "commit", "-m", "generated by rdoc"
|
441
|
-
git "checkout", current_branch
|
442
|
-
git "push", "-f", "origin", "gh-pages"
|
443
|
-
end
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
def define_install
|
448
|
-
desc "direct install (no gem)"
|
449
|
-
task :install do
|
450
|
-
Installer.new.install
|
451
|
-
end
|
452
|
-
|
453
|
-
desc "direct uninstall (no gem)"
|
454
|
-
task :uninstall do
|
455
|
-
Installer.new.uninstall
|
456
|
-
end
|
457
|
-
end
|
458
|
-
|
459
|
-
def define_check_directory
|
460
|
-
task :check_directory do
|
461
|
-
unless `git status` =~ %r!nothing to commit \(working directory clean\)!
|
462
|
-
raise "directory not clean"
|
463
|
-
end
|
464
|
-
end
|
465
|
-
end
|
466
|
-
|
467
|
-
def define_ping
|
468
|
-
task :ping do
|
469
|
-
require 'rbconfig'
|
470
|
-
[
|
471
|
-
"github.com",
|
472
|
-
("rubyforge.org" if rubyforge_info),
|
473
|
-
].compact.each do |server|
|
474
|
-
cmd = "ping " + (
|
475
|
-
if RbConfig::CONFIG["host"] =~ %r!darwin!
|
476
|
-
"-c2 #{server}"
|
477
|
-
else
|
478
|
-
"#{server} 2 2"
|
479
|
-
end
|
480
|
-
)
|
481
|
-
unless `#{cmd}` =~ %r!0% packet loss!
|
482
|
-
raise "No ping for #{server}"
|
483
|
-
end
|
484
|
-
end
|
485
|
-
end
|
486
|
-
end
|
487
|
-
|
488
|
-
def define_check_levitate
|
489
|
-
task :check_levitate do
|
490
|
-
unless local_levitate == remote_levitate
|
491
|
-
raise "levitate is out of date"
|
492
|
-
end
|
493
|
-
end
|
494
|
-
end
|
495
|
-
|
496
|
-
def define_update_levitate
|
497
|
-
task :update_levitate do
|
498
|
-
if local_levitate == remote_levitate
|
499
|
-
puts "Already up-to-date."
|
500
|
-
else
|
501
|
-
File.open(__FILE__, "w") { |f| f.print(remote_levitate) }
|
502
|
-
git "commit", __FILE__, "-m", "update tools"
|
503
|
-
puts "Updated levitate."
|
504
|
-
end
|
505
|
-
end
|
506
|
-
end
|
507
|
-
|
508
|
-
def define_changes
|
509
|
-
task :changes do
|
510
|
-
if File.read(history_file).index version
|
511
|
-
raise "version not updated"
|
512
|
-
end
|
513
|
-
|
514
|
-
header = "\n\n== Version #{version}\n\n"
|
515
|
-
|
516
|
-
bullets = `git log --format=%s #{last_release}..HEAD`.lines.map { |line|
|
517
|
-
"* #{line}"
|
518
|
-
}.join.chomp
|
519
|
-
|
520
|
-
write_file(history_file) do
|
521
|
-
File.read(history_file).sub(/(?<=#{gem_name} Changes)/) {
|
522
|
-
header + bullets
|
523
|
-
}
|
524
|
-
end
|
525
|
-
end
|
526
|
-
end
|
527
|
-
|
528
|
-
def define_release
|
529
|
-
task :prerelease => [
|
530
|
-
:clean,
|
531
|
-
:check_directory,
|
532
|
-
:check_levitate,
|
533
|
-
:ping,
|
534
|
-
history_file
|
535
|
-
]
|
536
|
-
|
537
|
-
task :finish_release do
|
538
|
-
git "tag", "#{gem_name}-" + version.to_s
|
539
|
-
git "push", "--tags", "origin", "master"
|
540
|
-
sh "gem", "push", "pkg/#{gem_name}-#{version}.gem"
|
541
|
-
end
|
542
|
-
|
543
|
-
task :release => [:prerelease, :package, :finish_release, :publish]
|
544
|
-
end
|
545
|
-
|
546
|
-
def define_debug_gem
|
547
|
-
task :debug_gem do
|
548
|
-
puts gemspec.to_ruby
|
549
|
-
end
|
550
|
-
end
|
551
|
-
|
552
|
-
#### helpers
|
553
|
-
|
554
|
-
def files_in_require_paths
|
555
|
-
require_paths.inject([]) { |acc, dir|
|
556
|
-
acc + Dir.glob("#{dir}/**/*.rb")
|
557
|
-
}
|
558
|
-
end
|
559
|
-
|
560
|
-
def last_release
|
561
|
-
`git tag`.lines.select { |t| t.index(gem_name) == 0 }.last.chomp
|
562
|
-
end
|
563
|
-
|
564
|
-
def git(*args)
|
565
|
-
sh "git", *args
|
566
|
-
end
|
567
|
-
|
568
|
-
def open_browser(*files)
|
569
|
-
sh(*([browser].flatten + files))
|
570
|
-
end
|
571
|
-
|
572
|
-
def suppress_task_warnings(*task_names)
|
573
|
-
task_names.each { |task_name|
|
574
|
-
Rake::Task[task_name].actions.map! { |action|
|
575
|
-
lambda { |*args|
|
576
|
-
no_warnings {
|
577
|
-
action.call(*args)
|
578
|
-
}
|
579
|
-
}
|
580
|
-
}
|
581
|
-
}
|
582
|
-
end
|
583
|
-
|
584
|
-
def ruby_18?
|
585
|
-
RUBY_VERSION =~ %r!\A1\.8!
|
586
|
-
end
|
587
|
-
|
588
|
-
def source_control?
|
589
|
-
File.directory? ".git"
|
590
|
-
end
|
591
|
-
|
592
2
|
#### utility for instance and class
|
593
|
-
|
594
3
|
module Util
|
595
4
|
def ruby_bin
|
596
5
|
require 'rbconfig'
|
@@ -647,7 +56,7 @@ class Levitate
|
|
647
56
|
pipe.read
|
648
57
|
}
|
649
58
|
end
|
650
|
-
|
59
|
+
|
651
60
|
def with_warnings(value = true)
|
652
61
|
previous = $VERBOSE
|
653
62
|
$VERBOSE = value
|
@@ -657,7 +66,7 @@ class Levitate
|
|
657
66
|
$VERBOSE = previous
|
658
67
|
end
|
659
68
|
end
|
660
|
-
|
69
|
+
|
661
70
|
def no_warnings(&block)
|
662
71
|
with_warnings(nil, &block)
|
663
72
|
end
|
@@ -676,7 +85,7 @@ class Levitate
|
|
676
85
|
|
677
86
|
def instance_exec2(obj, *args, &block)
|
678
87
|
method_name = ["_", obj.object_id, "_", Thread.current.object_id].join
|
679
|
-
(class << obj
|
88
|
+
(class << obj; self; end).class_eval do
|
680
89
|
define_method method_name, &block
|
681
90
|
begin
|
682
91
|
obj.send(method_name, *args)
|
@@ -692,22 +101,6 @@ class Levitate
|
|
692
101
|
#### public helpers for testing
|
693
102
|
|
694
103
|
class << self
|
695
|
-
# From 'minitest' by Ryan Davis.
|
696
|
-
def capture_io
|
697
|
-
require 'stringio'
|
698
|
-
|
699
|
-
orig_stdout, orig_stderr = $stdout, $stderr
|
700
|
-
captured_stdout, captured_stderr = StringIO.new, StringIO.new
|
701
|
-
$stdout, $stderr = captured_stdout, captured_stderr
|
702
|
-
|
703
|
-
yield
|
704
|
-
|
705
|
-
return captured_stdout.string, captured_stderr.string
|
706
|
-
ensure
|
707
|
-
$stdout = orig_stdout
|
708
|
-
$stderr = orig_stderr
|
709
|
-
end
|
710
|
-
|
711
104
|
def run_doc_code(code, expected, index, instance, &block)
|
712
105
|
lib = File.expand_path(File.dirname(__FILE__) + "/../lib")
|
713
106
|
header = %{
|
@@ -736,7 +129,7 @@ class Levitate
|
|
736
129
|
def run_doc_section(file, section, instance, &block)
|
737
130
|
contents = File.read(file)
|
738
131
|
re = %r!^=+[ \t]#{Regexp.quote(section)}.*?\n(.*?)^=!m
|
739
|
-
if section_contents = contents[re, 1]
|
132
|
+
if (section_contents = contents[re, 1])
|
740
133
|
index = 0
|
741
134
|
section_contents.scan(%r!^( \S.*?)(?=(^\S|\Z))!m) { |indented, unused|
|
742
135
|
code_sections = indented.split(%r!^ \#\#\#\# output:\s*$!)
|
@@ -759,29 +152,9 @@ class Levitate
|
|
759
152
|
end
|
760
153
|
end
|
761
154
|
|
762
|
-
def doc_to_spec(file, *sections, &block)
|
763
|
-
levitate = self
|
764
|
-
describe file do
|
765
|
-
sections.each { |section|
|
766
|
-
describe "section `#{section}'" do
|
767
|
-
it "should run as claimed" do
|
768
|
-
if block
|
769
|
-
levitate.run_doc_section(file, section, self, &block)
|
770
|
-
else
|
771
|
-
levitate.run_doc_section(file, section, self) {
|
772
|
-
|expected, actual, index|
|
773
|
-
actual.should == expected
|
774
|
-
}
|
775
|
-
end
|
776
|
-
end
|
777
|
-
end
|
778
|
-
}
|
779
|
-
end
|
780
|
-
end
|
781
|
-
|
782
155
|
def doc_to_test(file, *sections, &block)
|
783
156
|
levitate = self
|
784
|
-
klass = Class.new MiniTest::
|
157
|
+
klass = Class.new MiniTest::Test do
|
785
158
|
sections.each { |section|
|
786
159
|
define_method "test_#{file}_#{section}" do
|
787
160
|
if block
|
@@ -803,48 +176,6 @@ class Levitate
|
|
803
176
|
end
|
804
177
|
attr_writer :ruby_opts
|
805
178
|
end
|
806
|
-
|
807
|
-
#### raw install, bypass gems
|
808
|
-
|
809
|
-
class Installer
|
810
|
-
def initialize
|
811
|
-
require 'fileutils'
|
812
|
-
require 'rbconfig'
|
813
|
-
require 'find'
|
814
|
-
|
815
|
-
@fu = FileUtils::Verbose
|
816
|
-
@spec = []
|
817
|
-
|
818
|
-
rb_root = RbConfig::CONFIG["sitelibdir"]
|
819
|
-
|
820
|
-
Find.find "lib" do |source|
|
821
|
-
next if source == "lib"
|
822
|
-
next unless File.directory?(source) || File.extname(source) == ".rb"
|
823
|
-
dest = File.join(rb_root, source.sub(%r!\Alib/!, ""))
|
824
|
-
@spec << [source, dest]
|
825
|
-
end
|
826
|
-
end
|
827
|
-
|
828
|
-
def install
|
829
|
-
@spec.each do |source, dest|
|
830
|
-
if File.directory?(source)
|
831
|
-
@fu.mkdir(dest) unless File.directory?(dest)
|
832
|
-
else
|
833
|
-
@fu.install(source, dest)
|
834
|
-
end
|
835
|
-
end
|
836
|
-
end
|
837
|
-
|
838
|
-
def uninstall
|
839
|
-
@spec.reverse.each do |source, dest|
|
840
|
-
if File.directory?(source)
|
841
|
-
@fu.rmdir(dest) if File.directory?(dest)
|
842
|
-
else
|
843
|
-
@fu.rm(dest) if File.file?(dest)
|
844
|
-
end
|
845
|
-
end
|
846
|
-
end
|
847
|
-
end
|
848
179
|
end
|
849
180
|
|
850
181
|
lambda do
|