pure 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Pure
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.2"
4
4
  end
@@ -23,7 +23,7 @@ end
23
23
  require 'rbconfig'
24
24
 
25
25
  # uneven results in windows
26
- unless Config::CONFIG["host"] =~ %r!(mswin|cygwin|mingw)!
26
+ unless RbConfig::CONFIG["host"] =~ %r!(mswin|cygwin|mingw)!
27
27
  describe "compute" do
28
28
  describe "with timed example" do
29
29
  it "should run with 1 thread" do
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/pure_spec_base'
2
2
 
3
- require 'jumpstart'
3
+ require 'levitate'
4
4
 
5
5
  describe "pure" do
6
6
  describe "`fun' definitions" do
@@ -81,7 +81,7 @@ describe "pure" do
81
81
  end
82
82
 
83
83
  it "should be overwritten by later `def' definitions" do
84
- Jumpstart::Ruby.no_warnings {
84
+ Levitate.no_warnings {
85
85
  pure do
86
86
  fun :f do
87
87
  44
@@ -95,7 +95,7 @@ describe "pure" do
95
95
  end
96
96
 
97
97
  it "should overwrite earlier `def' definitions" do
98
- Jumpstart::Ruby.no_warnings {
98
+ Levitate.no_warnings {
99
99
  pure do
100
100
  def f
101
101
  33
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/pure_spec_base'
2
2
 
3
- require 'jumpstart'
3
+ require 'levitate'
4
4
 
5
5
  describe "pure" do
6
6
  it "should not be available without require 'pure/dsl'" do
@@ -18,7 +18,7 @@ describe "pure" do
18
18
  end
19
19
  }
20
20
  lambda {
21
- Jumpstart::Ruby.run("-e", code)
21
+ Levitate.run("-e", code)
22
22
  }.should_not raise_error
23
23
  end
24
24
 
@@ -1,6 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/pure_spec_base'
2
-
3
- require "jumpstart"
2
+ require 'levitate'
4
3
 
5
4
  readme = "README.rdoc"
6
5
 
@@ -13,10 +12,10 @@ simple_sections = [
13
12
  "Default Number of Functions in Parallel",
14
13
  ]
15
14
 
16
- Jumpstart.doc_to_spec(readme, *simple_sections)
15
+ Levitate.doc_to_spec(readme, *simple_sections)
17
16
 
18
17
  sections = ["Dynamic Names", "Mapping an Enumerable in Parallel"]
19
- Jumpstart.doc_to_spec(readme, *sections) { |expected, actual, index|
18
+ Levitate.doc_to_spec(readme, *sections) { |expected, actual, index|
20
19
  if index == 1
21
20
  [expected, actual].each { |expr|
22
21
  expr.should match(%r!\A[\d\s]+\Z!)
@@ -26,7 +25,7 @@ Jumpstart.doc_to_spec(readme, *sections) { |expected, actual, index|
26
25
  end
27
26
  }
28
27
 
29
- Jumpstart.doc_to_spec(readme, "Worker Plugins") { |expected, actual, index|
28
+ Levitate.doc_to_spec(readme, "Worker Plugins") { |expected, actual, index|
30
29
  case index
31
30
  when 0, 2
32
31
  actual.should == expected
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ prerelease:
5
+ version: 0.2.2
5
6
  platform: ruby
6
7
  authors:
7
8
  - James M. Lawrence
@@ -9,49 +10,52 @@ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-10-30 00:00:00 -04:00
13
- default_executable:
13
+ date: 2011-05-18 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: comp_tree
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
23
  version: 1.0.0
24
- version:
24
+ type: :runtime
25
+ version_requirements: *id001
25
26
  - !ruby/object:Gem::Dependency
26
27
  name: ruby_parser
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
30
31
  requirements:
31
32
  - - ">="
32
33
  - !ruby/object:Gem::Version
33
34
  version: 2.0.4
34
- version:
35
+ type: :runtime
36
+ version_requirements: *id002
35
37
  - !ruby/object:Gem::Dependency
36
38
  name: ruby2ruby
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
40
42
  requirements:
41
43
  - - ">="
42
44
  - !ruby/object:Gem::Version
43
45
  version: 1.2.2
44
- version:
46
+ type: :development
47
+ version_requirements: *id003
45
48
  - !ruby/object:Gem::Dependency
46
49
  name: rspec
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
50
53
  requirements:
51
- - - ">="
54
+ - - ~>
52
55
  - !ruby/object:Gem::Version
53
- version: 1.2.6
54
- version:
56
+ version: "1.3"
57
+ type: :development
58
+ version_requirements: *id004
55
59
  description: Pure imports aspects of the pure functional paradigm into Ruby.
56
60
  email:
57
61
  - quixoticsycophant@gmail.com
@@ -61,13 +65,12 @@ extensions: []
61
65
 
62
66
  extra_rdoc_files:
63
67
  - README.rdoc
68
+ - CHANGES.rdoc
64
69
  files:
65
70
  - CHANGES.rdoc
66
- - MANIFEST
67
71
  - README.rdoc
68
72
  - Rakefile
69
- - devel/jumpstart.rb
70
- - install.rb
73
+ - devel/levitate.rb
71
74
  - lib/pure.rb
72
75
  - lib/pure/bundled_parsers.rb
73
76
  - lib/pure/bundled_plugin.rb
@@ -117,8 +120,7 @@ files:
117
120
  - spec/readme_spec.rb
118
121
  - spec/splat_spec.rb
119
122
  - spec/worker_spec.rb
120
- has_rdoc: true
121
- homepage: http://purefunctional.rubyforge.org
123
+ homepage: http://quix.github.com/pure
122
124
  licenses: []
123
125
 
124
126
  post_install_message:
@@ -126,21 +128,7 @@ rdoc_options:
126
128
  - --main
127
129
  - README.rdoc
128
130
  - --title
129
- - "pure: Language-level support for automatic parallelism and lazy evaluation."
130
- - --exclude
131
- - CHANGES.rdoc
132
- - --exclude
133
- - MANIFEST
134
- - --exclude
135
- - README.rdoc
136
- - --exclude
137
- - Rakefile
138
- - --exclude
139
- - devel/jumpstart.rb
140
- - --exclude
141
- - install.rb
142
- - --exclude
143
- - lib/pure.rb
131
+ - "pure: Language-level support for automatic parallelism and lazy evaluation"
144
132
  - --exclude
145
133
  - lib/pure/bundled_parsers.rb
146
134
  - --exclude
@@ -180,73 +168,25 @@ rdoc_options:
180
168
  - --exclude
181
169
  - lib/pure/version.rb
182
170
  - --exclude
183
- - spec/compiler_ruby_parser_spec.rb
184
- - --exclude
185
- - spec/compute_overrides_spec.rb
186
- - --exclude
187
- - spec/compute_spec.rb
188
- - --exclude
189
- - spec/compute_thread_spec.rb
190
- - --exclude
191
- - spec/compute_timed_spec.rb
192
- - --exclude
193
- - spec/delegate_spec.rb
194
- - --exclude
195
- - spec/fstat_example.rb
196
- - --exclude
197
- - spec/parser_sexp_spec.rb
198
- - --exclude
199
- - spec/parser_spec.rb
200
- - --exclude
201
- - spec/pure_combine_spec.rb
202
- - --exclude
203
- - spec/pure_def_spec.rb
204
- - --exclude
205
- - spec/pure_define_method_spec.rb
206
- - --exclude
207
- - spec/pure_eval_spec.rb
208
- - --exclude
209
- - spec/pure_fun_map_spec.rb
210
- - --exclude
211
- - spec/pure_fun_spec.rb
212
- - --exclude
213
- - spec/pure_nested_spec.rb
214
- - --exclude
215
- - spec/pure_parser_spec.rb
216
- - --exclude
217
- - spec/pure_spec.rb
218
- - --exclude
219
- - spec/pure_spec_base.rb
220
- - --exclude
221
- - spec/pure_splat_spec.rb
222
- - --exclude
223
- - spec/pure_two_defs_spec.rb
224
- - --exclude
225
- - spec/pure_worker_spec.rb
226
- - --exclude
227
- - spec/readme_spec.rb
228
- - --exclude
229
- - spec/splat_spec.rb
230
- - --exclude
231
- - spec/worker_spec.rb
171
+ - lib/pure.rb
232
172
  require_paths:
233
173
  - lib
234
174
  required_ruby_version: !ruby/object:Gem::Requirement
175
+ none: false
235
176
  requirements:
236
177
  - - ">="
237
178
  - !ruby/object:Gem::Version
238
179
  version: "0"
239
- version:
240
180
  required_rubygems_version: !ruby/object:Gem::Requirement
181
+ none: false
241
182
  requirements:
242
183
  - - ">="
243
184
  - !ruby/object:Gem::Version
244
185
  version: "0"
245
- version:
246
186
  requirements: []
247
187
 
248
- rubyforge_project: purefunctional
249
- rubygems_version: 1.3.5
188
+ rubyforge_project:
189
+ rubygems_version: 1.8.2
250
190
  signing_key:
251
191
  specification_version: 3
252
192
  summary: Language-level support for automatic parallelism and lazy evaluation.
data/MANIFEST DELETED
@@ -1,55 +0,0 @@
1
- CHANGES.rdoc
2
- MANIFEST
3
- README.rdoc
4
- Rakefile
5
- devel/jumpstart.rb
6
- install.rb
7
- lib/pure.rb
8
- lib/pure/bundled_parsers.rb
9
- lib/pure/bundled_plugin.rb
10
- lib/pure/compiler/ruby_parser.rb
11
- lib/pure/delegate.rb
12
- lib/pure/driver.rb
13
- lib/pure/dsl.rb
14
- lib/pure/dsl_definition.rb
15
- lib/pure/error.rb
16
- lib/pure/extracted_functions.rb
17
- lib/pure/extractor.rb
18
- lib/pure/names.rb
19
- lib/pure/native_worker.rb
20
- lib/pure/parser/impl/base_parser.rb
21
- lib/pure/parser/impl/internal.rb
22
- lib/pure/parser/impl/ripper.rb
23
- lib/pure/parser/impl/ruby_parser.rb
24
- lib/pure/parser/internal.rb
25
- lib/pure/parser/ripper.rb
26
- lib/pure/parser/ruby_parser.rb
27
- lib/pure/pure.rb
28
- lib/pure/pure_module.rb
29
- lib/pure/util.rb
30
- lib/pure/version.rb
31
- spec/compiler_ruby_parser_spec.rb
32
- spec/compute_overrides_spec.rb
33
- spec/compute_spec.rb
34
- spec/compute_thread_spec.rb
35
- spec/compute_timed_spec.rb
36
- spec/delegate_spec.rb
37
- spec/fstat_example.rb
38
- spec/parser_sexp_spec.rb
39
- spec/parser_spec.rb
40
- spec/pure_combine_spec.rb
41
- spec/pure_def_spec.rb
42
- spec/pure_define_method_spec.rb
43
- spec/pure_eval_spec.rb
44
- spec/pure_fun_map_spec.rb
45
- spec/pure_fun_spec.rb
46
- spec/pure_nested_spec.rb
47
- spec/pure_parser_spec.rb
48
- spec/pure_spec.rb
49
- spec/pure_spec_base.rb
50
- spec/pure_splat_spec.rb
51
- spec/pure_two_defs_spec.rb
52
- spec/pure_worker_spec.rb
53
- spec/readme_spec.rb
54
- spec/splat_spec.rb
55
- spec/worker_spec.rb
@@ -1,987 +0,0 @@
1
-
2
- class Jumpstart
3
- class SimpleInstaller
4
- def initialize
5
- require 'fileutils'
6
- require 'rbconfig'
7
- require 'find'
8
- dest_root = Config::CONFIG["sitelibdir"]
9
- sources = []
10
- Find.find("./lib") { |source|
11
- if install_file?(source)
12
- sources << source
13
- end
14
- }
15
- @spec = sources.inject(Array.new) { |acc, source|
16
- if source == "./lib"
17
- acc
18
- else
19
- dest = File.join(dest_root, source.sub(%r!\A\./lib!, ""))
20
-
21
- install = lambda {
22
- if File.directory?(source)
23
- unless File.directory?(dest)
24
- puts "mkdir #{dest}"
25
- FileUtils.mkdir(dest)
26
- end
27
- else
28
- puts "install #{source} --> #{dest}"
29
- FileUtils.install(source, dest)
30
- end
31
- }
32
-
33
- uninstall = lambda {
34
- if File.directory?(source)
35
- if File.directory?(dest)
36
- puts "rmdir #{dest}"
37
- FileUtils.rmdir(dest)
38
- end
39
- else
40
- if File.file?(dest)
41
- puts "rm #{dest}"
42
- FileUtils.rm(dest)
43
- end
44
- end
45
- }
46
-
47
- acc << {
48
- :source => source,
49
- :dest => dest,
50
- :install => install,
51
- :uninstall => uninstall,
52
- }
53
- end
54
- }
55
- end
56
-
57
- def install_file?(source)
58
- File.directory?(source) or
59
- (File.file?(source) and File.extname(source) == ".rb")
60
- end
61
-
62
- def install
63
- @spec.each { |entry|
64
- entry[:install].call
65
- }
66
- end
67
-
68
- def uninstall
69
- @spec.reverse.each { |entry|
70
- entry[:uninstall].call
71
- }
72
- end
73
-
74
- def run(args = ARGV)
75
- if args.empty?
76
- install
77
- elsif args.size == 1 and args.first == "--uninstall"
78
- uninstall
79
- else
80
- raise "unrecognized arguments: #{args.inspect}"
81
- end
82
- end
83
- end
84
-
85
- module AttrLazy
86
- def attr_lazy(name, &block)
87
- AttrLazy.define_reader(class << self ; self ; end, name, &block)
88
- end
89
-
90
- def attr_lazy_accessor(name, &block)
91
- attr_lazy(name, &block)
92
- AttrLazy.define_writer(class << self ; self ; end, name, &block)
93
- end
94
-
95
- class << self
96
- def included(mod)
97
- (class << mod ; self ; end).class_eval do
98
- def attr_lazy(name, &block)
99
- AttrLazy.define_reader(self, name, &block)
100
- end
101
-
102
- def attr_lazy_accessor(name, &block)
103
- attr_lazy(name, &block)
104
- AttrLazy.define_writer(self, name, &block)
105
- end
106
- end
107
- end
108
-
109
- def define_evaluated_reader(instance, name, value)
110
- (class << instance ; self ; end).class_eval do
111
- remove_method name rescue nil
112
- define_method name do
113
- value
114
- end
115
- end
116
- end
117
-
118
- def define_reader(klass, name, &block)
119
- klass.class_eval do
120
- remove_method name rescue nil
121
- define_method name do
122
- value = instance_eval(&block)
123
- AttrLazy.define_evaluated_reader(self, name, value)
124
- value
125
- end
126
- end
127
- end
128
-
129
- def define_writer(klass, name, &block)
130
- klass.class_eval do
131
- writer = "#{name}="
132
- remove_method writer rescue nil
133
- define_method writer do |value|
134
- AttrLazy.define_evaluated_reader(self, name, value)
135
- value
136
- end
137
- end
138
- end
139
- end
140
- end
141
-
142
- module Ruby
143
- module_function
144
-
145
- def executable
146
- require 'rbconfig'
147
-
148
- name = File.join(
149
- Config::CONFIG["bindir"],
150
- Config::CONFIG["RUBY_INSTALL_NAME"]
151
- )
152
-
153
- if Config::CONFIG["host"] =~ %r!(mswin|cygwin|mingw)! and
154
- File.basename(name) !~ %r!\.(exe|com|bat|cmd)\Z!i
155
- name + Config::CONFIG["EXEEXT"]
156
- else
157
- name
158
- end
159
- end
160
-
161
- def run(*args)
162
- cmd = [executable, *args]
163
- unless system(*cmd)
164
- cmd_str = cmd.map { |t| "'#{t}'" }.join(", ")
165
- raise "system(#{cmd_str}) failed with status #{$?.exitstatus}"
166
- end
167
- end
168
-
169
- def run_code_and_capture(code)
170
- IO.popen(%{"#{executable}"}, "r+") { |pipe|
171
- pipe.print(code)
172
- pipe.flush
173
- pipe.close_write
174
- pipe.read
175
- }
176
- end
177
-
178
- def run_file_and_capture(file)
179
- unless File.file? file
180
- raise "file does not exist: `#{file}'"
181
- end
182
- IO.popen(%{"#{executable}" "#{file}"}, "r") { |pipe|
183
- pipe.read
184
- }
185
- end
186
-
187
- def with_warnings(value = true)
188
- previous = $VERBOSE
189
- $VERBOSE = value
190
- begin
191
- yield
192
- ensure
193
- $VERBOSE = previous
194
- end
195
- end
196
-
197
- def no_warnings(&block)
198
- with_warnings(nil, &block)
199
- end
200
- end
201
-
202
- module Util
203
- module_function
204
-
205
- def run_ruby_on_each(*files)
206
- files.each { |file|
207
- Ruby.run("-w", file)
208
- }
209
- end
210
-
211
- def to_camel_case(str)
212
- str.split('_').map { |t| t.capitalize }.join
213
- end
214
-
215
- def write_file(file)
216
- contents = yield
217
- File.open(file, "wb") { |out|
218
- out.print(contents)
219
- }
220
- contents
221
- end
222
-
223
- def replace_file(file)
224
- old_contents = File.read(file)
225
- new_contents = yield(old_contents)
226
- if old_contents != new_contents
227
- File.open(file, "wb") { |output|
228
- output.print(new_contents)
229
- }
230
- end
231
- new_contents
232
- end
233
- end
234
-
235
- module InstanceEvalWithArgs
236
- module_function
237
-
238
- def with_temp_method(instance, method_name, method_block)
239
- (class << instance ; self ; end).class_eval do
240
- define_method(method_name, &method_block)
241
- begin
242
- yield method_name
243
- ensure
244
- remove_method(method_name)
245
- end
246
- end
247
- end
248
-
249
- def call_temp_method(instance, method_name, *args, &method_block)
250
- with_temp_method(instance, method_name, method_block) {
251
- instance.send(method_name, *args)
252
- }
253
- end
254
-
255
- def instance_eval_with_args(instance, *args, &block)
256
- call_temp_method(instance, :__temp_method, *args, &block)
257
- end
258
- end
259
-
260
- include AttrLazy
261
- include Util
262
-
263
- def initialize(project_name)
264
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
265
- $LOAD_PATH.unshift File.dirname(__FILE__)
266
-
267
- require 'rake/gempackagetask'
268
- require 'rake/clean'
269
-
270
- @project_name = project_name
271
-
272
- yield self
273
-
274
- self.class.instance_methods(false).select { |t|
275
- t.to_s =~ %r!\Adefine_!
276
- }.each { |method_name|
277
- send(method_name)
278
- }
279
- end
280
-
281
- class << self
282
- alias_method :attribute, :attr_lazy_accessor
283
- end
284
-
285
- attribute :name do
286
- @project_name
287
- end
288
-
289
- attribute :version_constant_name do
290
- "VERSION"
291
- end
292
-
293
- attribute :version do
294
- require name
295
- mod_name = to_camel_case(name)
296
- begin
297
- mod = Kernel.const_get(mod_name)
298
- if mod.constants.include?(version_constant_name)
299
- mod.const_get(version_constant_name)
300
- else
301
- raise
302
- end
303
- rescue
304
- "0.0.0"
305
- end
306
- end
307
-
308
- attribute :rubyforge_name do
309
- name.gsub('_', '')
310
- end
311
-
312
- attribute :rubyforge_user do
313
- email.first[%r!^.*(?=@)!]
314
- end
315
-
316
- attribute :readme_file do
317
- "README.rdoc"
318
- end
319
-
320
- attribute :history_file do
321
- "CHANGES.rdoc"
322
- end
323
-
324
- attribute :doc_dir do
325
- "documentation"
326
- end
327
-
328
- attribute :spec_files do
329
- Dir["./spec/*_{spec,example}.rb"]
330
- end
331
-
332
- attribute :test_files do
333
- (Dir["./test/test_*.rb"] + Dir["./test/*_test.rb"]).uniq
334
- end
335
-
336
- attribute :rcov_dir do
337
- "coverage"
338
- end
339
-
340
- attribute :spec_output_dir do
341
- "rspec_output"
342
- end
343
-
344
- attribute :spec_output_file do
345
- "spec.html"
346
- end
347
-
348
- attr_lazy :spec_output do
349
- "#{spec_output_dir}/#{spec_output_file}"
350
- end
351
-
352
- [:gem, :tgz].each { |ext|
353
- attribute ext do
354
- "pkg/#{name}-#{version}.#{ext}"
355
- end
356
- }
357
-
358
- attribute :rcov_options do
359
- # workaround for the default rspec task
360
- Dir["*"].select { |f| File.directory? f }.inject(Array.new) { |acc, dir|
361
- if dir == "lib"
362
- acc
363
- else
364
- acc + ["--exclude", dir + "/"]
365
- end
366
- } + ["--text-report"]
367
- end
368
-
369
- attribute :readme_file do
370
- "README.rdoc"
371
- end
372
-
373
- attribute :manifest_file do
374
- "MANIFEST"
375
- end
376
-
377
- attribute :generated_files do
378
- []
379
- end
380
-
381
- attribute :files do
382
- if File.exist?(manifest_file)
383
- File.read(manifest_file).split("\n")
384
- else
385
- `git ls-files`.split("\n") + [manifest_file] + generated_files
386
- end
387
- end
388
-
389
- attribute :rdoc_files do
390
- Dir["lib/**/*.rb"]
391
- end
392
-
393
- attribute :extra_rdoc_files do
394
- if File.exist?(readme_file)
395
- [readme_file]
396
- else
397
- []
398
- end
399
- end
400
-
401
- attribute :rdoc_options do
402
- if File.exist?(readme_file)
403
- ["--main", readme_file]
404
- else
405
- []
406
- end + [
407
- "--title", "#{name}: #{summary}",
408
- ] + (files - rdoc_files).inject(Array.new) { |acc, file|
409
- acc + ["--exclude", file]
410
- }
411
- end
412
-
413
- attribute :browser do
414
- require 'rbconfig'
415
- if Config::CONFIG["host"] =~ %r!darwin!
416
- app = %w[Firefox Safari].map { |t|
417
- "/Applications/#{t}.app"
418
- }.select { |t|
419
- File.exist? t
420
- }.first
421
- if app
422
- ["open", app]
423
- else
424
- raise "need to set `browser'"
425
- end
426
- else
427
- "firefox"
428
- end
429
- end
430
-
431
- attribute :gemspec do
432
- Gem::Specification.new { |g|
433
- g.has_rdoc = true
434
- %w[
435
- name
436
- authors
437
- email
438
- summary
439
- version
440
- description
441
- files
442
- extra_rdoc_files
443
- rdoc_options
444
- ].each { |param|
445
- value = send(param) and (
446
- g.send("#{param}=", value)
447
- )
448
- }
449
-
450
- if rubyforge_name
451
- g.rubyforge_project = rubyforge_name
452
- end
453
-
454
- if url
455
- g.homepage = url
456
- end
457
-
458
- extra_deps.each { |dep|
459
- g.add_dependency(*dep)
460
- }
461
-
462
- extra_dev_deps.each { |dep|
463
- g.add_development_dependency(*dep)
464
- }
465
- }
466
- end
467
-
468
- attribute :readme_contents do
469
- File.read(readme_file) rescue "FIXME: readme_file"
470
- end
471
-
472
- attribute :sections do
473
- require 'enumerator'
474
- begin
475
- data = readme_contents.split(%r!^==\s*(.*?)\s*$!)
476
- pairs = data[1..-1].enum_slice(2).map { |section, contents|
477
- [section.downcase, contents.strip]
478
- }
479
- Hash[*pairs.flatten]
480
- rescue
481
- nil
482
- end
483
- end
484
-
485
- attribute :description_section do
486
- "description"
487
- end
488
-
489
- attribute :summary_section do
490
- "summary"
491
- end
492
-
493
- attribute :description_sentences do
494
- 1
495
- end
496
-
497
- attribute :summary_sentences do
498
- 1
499
- end
500
-
501
- [:summary, :description].each { |section|
502
- attribute section do
503
- begin
504
- sections[send("#{section}_section")].
505
- gsub("\n", " ").
506
- split(%r!\.\s*!m).
507
- first(send("#{section}_sentences")).
508
- join(". ") << "."
509
- rescue
510
- "FIXME: #{section}"
511
- end
512
- end
513
- }
514
-
515
- attribute :url do
516
- begin
517
- readme_contents.match(%r!^\*.*?(http://\S+)!)[1]
518
- rescue
519
- "http://#{rubyforge_name}.rubyforge.org"
520
- end
521
- end
522
-
523
- attribute :extra_deps do
524
- []
525
- end
526
-
527
- attribute :extra_dev_deps do
528
- []
529
- end
530
-
531
- attribute :authors do
532
- Array.new
533
- end
534
-
535
- attribute :email do
536
- Array.new
537
- end
538
-
539
- def developer(name, email)
540
- authors << name
541
- self.email << email
542
- end
543
-
544
- def dependency(name, version)
545
- extra_deps << [name, version]
546
- end
547
-
548
- def define_clean
549
- task :clean do
550
- Rake::Task[:clobber].invoke
551
- end
552
- end
553
-
554
- def define_package
555
- task manifest_file do
556
- create_manifest
557
- end
558
- CLEAN.include manifest_file
559
- task :package => :clean
560
- Rake::GemPackageTask.new(gemspec) { |t|
561
- t.need_tar = true
562
- }
563
- end
564
-
565
- def define_spec
566
- unless spec_files.empty?
567
- Ruby.no_warnings {
568
- require 'spec/rake/spectask'
569
- }
570
-
571
- desc "run specs"
572
- Spec::Rake::SpecTask.new('spec') do |t|
573
- t.spec_files = spec_files
574
- end
575
-
576
- desc "run specs with text output"
577
- Spec::Rake::SpecTask.new('text_spec') do |t|
578
- t.spec_files = spec_files
579
- t.spec_opts = ['-fs']
580
- end
581
-
582
- desc "run specs with html output"
583
- Spec::Rake::SpecTask.new('full_spec') do |t|
584
- t.spec_files = spec_files
585
- t.rcov = true
586
- t.rcov_opts = rcov_options
587
- t.spec_opts = ["-fh:#{spec_output}"]
588
- end
589
-
590
- suppress_task_warnings :spec, :full_spec, :text_spec
591
-
592
- desc "run full_spec then open browser"
593
- task :show_spec => :full_spec do
594
- open_browser(spec_output, rcov_dir + "/index.html")
595
- end
596
-
597
- desc "run specs individually"
598
- task :spec_deps do
599
- run_ruby_on_each(*spec_files)
600
- end
601
-
602
- task :prerelease => [:spec, :spec_deps]
603
- task :default => :spec
604
-
605
- CLEAN.include spec_output_dir
606
- end
607
- end
608
-
609
- def define_test
610
- unless test_files.empty?
611
- desc "run tests"
612
- task :test do
613
- test_files.each { |file|
614
- require file
615
- }
616
- end
617
-
618
- desc "run tests with rcov"
619
- task :full_test do
620
- verbose(false) {
621
- sh("rcov", "-o", rcov_dir, "--text-report",
622
- *(test_files + rcov_options)
623
- )
624
- }
625
- end
626
-
627
- desc "run full_test then open browser"
628
- task :show_test => :full_test do
629
- open_browser(rcov_dir + "/index.html")
630
- end
631
-
632
- desc "run tests individually"
633
- task :test_deps do
634
- run_ruby_on_each(*test_files)
635
- end
636
-
637
- task :prerelease => [:test, :test_deps]
638
- task :default => :test
639
-
640
- CLEAN.include rcov_dir
641
- end
642
- end
643
-
644
- def define_doc
645
- desc "run rdoc"
646
- task :doc => :clean_doc do
647
- require 'rdoc/rdoc'
648
- args = (
649
- gemspec.rdoc_options +
650
- gemspec.require_paths.clone +
651
- gemspec.extra_rdoc_files +
652
- ["-o", doc_dir]
653
- ).flatten.map { |t| t.to_s }
654
- RDoc::RDoc.new.document args
655
- end
656
-
657
- task :clean_doc do
658
- # normally rm_rf, but mimic rake/clean output
659
- rm_r(doc_dir) rescue nil
660
- end
661
-
662
- desc "run rdoc then open browser"
663
- task :show_doc => :doc do
664
- open_browser(doc_dir + "/index.html")
665
- end
666
-
667
- task :rdoc => :doc
668
- task :clean => :clean_doc
669
- end
670
-
671
- def define_publish
672
- desc "upload docs"
673
- task :publish => [:clean_doc, :doc] do
674
- require 'rake/contrib/sshpublisher'
675
- Rake::SshDirPublisher.new(
676
- "#{rubyforge_user}@rubyforge.org",
677
- "/var/www/gforge-projects/#{rubyforge_name}",
678
- doc_dir
679
- ).upload
680
- end
681
- end
682
-
683
- def define_install
684
- desc "direct install (no gem)"
685
- task :install do
686
- SimpleInstaller.new.run([])
687
- end
688
-
689
- desc "direct uninstall (no gem)"
690
- task :uninstall do
691
- SimpleInstaller.new.run(["--uninstall"])
692
- end
693
- end
694
-
695
- def define_debug
696
- runner = Class.new do
697
- def comment_src_dst(on)
698
- on ? ["", "#"] : ["#", ""]
699
- end
700
-
701
- def comment_regions(on, contents, start)
702
- src, dst = comment_src_dst(on)
703
- contents.gsub(%r!^(\s+)#{src}#{start}.*?^\1#{src}(\}|end)!m) { |chunk|
704
- indent = $1
705
- chunk.gsub(%r!^#{indent}#{src}!, "#{indent}#{dst}")
706
- }
707
- end
708
-
709
- def comment_lines(on, contents, start)
710
- src, dst = comment_src_dst(on)
711
- contents.gsub(%r!^(\s*)#{src}#{start}!) {
712
- $1 + dst + start
713
- }
714
- end
715
-
716
- def debug_info(enable)
717
- require 'find'
718
- Find.find("lib", "test") { |path|
719
- if path =~ %r!\.rb\Z!
720
- replace_file(path) { |contents|
721
- result = comment_regions(!enable, contents, "debug")
722
- comment_lines(!enable, result, "trace")
723
- }
724
- end
725
- }
726
- end
727
- end
728
-
729
- desc "enable debug and trace calls"
730
- task :debug_on do
731
- runner.new.debug_info(true)
732
- end
733
-
734
- desc "disable debug and trace calls"
735
- task :debug_off do
736
- runner.new.debug_info(false)
737
- end
738
- end
739
-
740
- def define_columns
741
- desc "check for columns > 80"
742
- task :check_columns do
743
- Dir["**/*.rb"].each { |file|
744
- File.read(file).scan(%r!^.{81}!) { |match|
745
- unless match =~ %r!http://!
746
- raise "#{file} greater than 80 columns: #{match}"
747
- end
748
- }
749
- }
750
- end
751
- task :prerelease => :check_columns
752
- end
753
-
754
- def define_comments
755
- task :comments do
756
- file = "comments.txt"
757
- write_file(file) {
758
- result = Array.new
759
- (["Rakefile"] + Dir["**/*.{rb,rake}"]).each { |f|
760
- File.read(f).scan(%r!\#[^\{].*$!) { |match|
761
- result << match
762
- }
763
- }
764
- result.join("\n")
765
- }
766
- CLEAN.include file
767
- end
768
- end
769
-
770
- def define_check_directory
771
- task :check_directory do
772
- unless `git status` =~ %r!nothing to commit \(working directory clean\)!
773
- raise "Directory not clean"
774
- end
775
- end
776
- end
777
-
778
- def define_ping
779
- task :ping do
780
- require 'rbconfig'
781
- %w[github.com rubyforge.org].each { |server|
782
- cmd = "ping " + (
783
- if Config::CONFIG["host"] =~ %r!darwin!
784
- "-c2 #{server}"
785
- else
786
- "#{server} 2 2"
787
- end
788
- )
789
- unless `#{cmd}` =~ %r!0% packet loss!
790
- raise "No ping for #{server}"
791
- end
792
- }
793
- end
794
- end
795
-
796
- def define_update_jumpstart
797
- url = ENV["RUBY_JUMPSTART"] || "git://github.com/quix/jumpstart.git"
798
- task :update_jumpstart do
799
- git "clone", url
800
- rm_rf "devel/jumpstart"
801
- Dir["jumpstart/**/*.rb"].each { |source|
802
- dest = source.sub(%r!\Ajumpstart/!, "devel/")
803
- dest_dir = File.dirname(dest)
804
- mkdir_p(dest_dir) unless File.directory?(dest_dir)
805
- cp source, dest
806
- }
807
- rm_r "jumpstart"
808
- git "commit", "devel", "-m", "update jumpstart"
809
- end
810
- end
811
-
812
- def git(*args)
813
- sh("git", *args)
814
- end
815
-
816
- def create_manifest
817
- write_file(manifest_file) {
818
- files.sort.join("\n")
819
- }
820
- end
821
-
822
- def rubyforge(mode, file, *options)
823
- command = ["rubyforge", mode] + options + [
824
- rubyforge_name,
825
- rubyforge_name,
826
- version.to_s,
827
- file,
828
- ]
829
- sh(*command)
830
- end
831
-
832
- def define_release
833
- task :prerelease => [:clean, :check_directory, :ping, history_file]
834
-
835
- task :finish_release do
836
- gem_md5, tgz_md5 = [gem, tgz].map { |file|
837
- md5 = "#{file}.md5"
838
- sh("md5sum #{file} > #{md5}")
839
- md5
840
- }
841
-
842
- rubyforge(
843
- "add_release", gem, "--release_changes", history_file, "--preformatted"
844
- )
845
- [gem_md5, tgz, tgz_md5].each { |file|
846
- rubyforge("add_file", file)
847
- }
848
-
849
- git("tag", "#{name}-" + version.to_s)
850
- git(*%w(push --tags origin master))
851
- end
852
-
853
- task :release => [:prerelease, :package, :publish, :finish_release]
854
- end
855
-
856
- def define_debug_gem
857
- task :debug_gem do
858
- puts gemspec.to_ruby
859
- end
860
- end
861
-
862
- def open_browser(*files)
863
- sh(*([browser].flatten + files))
864
- end
865
-
866
- def suppress_task_warnings(*task_names)
867
- task_names.each { |task_name|
868
- Rake::Task[task_name].actions.map! { |action|
869
- lambda { |*args|
870
- Ruby.no_warnings {
871
- action.call(*args)
872
- }
873
- }
874
- }
875
- }
876
- end
877
-
878
- class << self
879
- include Util
880
- include InstanceEvalWithArgs
881
-
882
- # From minitest, part of the Ruby source; by Ryan Davis.
883
- def capture_io
884
- require 'stringio'
885
-
886
- orig_stdout, orig_stderr = $stdout, $stderr
887
- captured_stdout, captured_stderr = StringIO.new, StringIO.new
888
- $stdout, $stderr = captured_stdout, captured_stderr
889
-
890
- yield
891
-
892
- return captured_stdout.string, captured_stderr.string
893
- ensure
894
- $stdout = orig_stdout
895
- $stderr = orig_stderr
896
- end
897
-
898
- def run_doc_code(code, expected, index, instance, &block)
899
- lib = File.expand_path(File.dirname(__FILE__) + "/../lib")
900
- header = %{
901
- $LOAD_PATH.unshift "#{lib}"
902
- begin
903
- }
904
- footer = %{
905
- rescue Exception => __jumpstart_exception
906
- puts "raises \#{__jumpstart_exception.class}"
907
- end
908
- }
909
- final_code = header + code + footer
910
-
911
- # Sometimes code is required to be inside a file.
912
- actual = nil
913
- require 'tempfile'
914
- Tempfile.open("run-rdoc-code") { |temp_file|
915
- temp_file.print(final_code)
916
- temp_file.close
917
- actual = Ruby.run_file_and_capture(temp_file.path).chomp
918
- }
919
-
920
- instance_eval_with_args(instance, expected, actual, index, &block)
921
- end
922
-
923
- def run_doc_section(file, section, instance, &block)
924
- contents = File.read(file)
925
- re = %r!^=+[ \t]#{Regexp.quote(section)}.*?\n(.*?)^=!m
926
- if section_contents = contents[re, 1]
927
- index = 0
928
- section_contents.scan(%r!^( \S.*?)(?=(^\S|\Z))!m) { |indented, unused|
929
- code_sections = indented.split(%r!^ \#\#\#\# output:\s*$!)
930
- code, expected = (
931
- case code_sections.size
932
- when 1
933
- [indented, indented.scan(%r!\# => (.*?)\n!).flatten.join("\n")]
934
- when 2
935
- code_sections
936
- else
937
- raise "parse error"
938
- end
939
- )
940
- run_doc_code(code, expected, index, instance, &block)
941
- index += 1
942
- }
943
- else
944
- raise "couldn't find section `#{section}' of `#{file}'"
945
- end
946
- end
947
-
948
- def doc_to_spec(file, *sections, &block)
949
- jump = self
950
- describe file do
951
- sections.each { |section|
952
- describe "section `#{section}'" do
953
- it "should run as claimed" do
954
- if block
955
- jump.run_doc_section(file, section, self, &block)
956
- else
957
- jump.run_doc_section(file, section, self) {
958
- |expected, actual, index|
959
- actual.should == expected
960
- }
961
- end
962
- end
963
- end
964
- }
965
- end
966
- end
967
-
968
- def doc_to_test(file, *sections, &block)
969
- jump = self
970
- klass = Class.new Test::Unit::TestCase do
971
- sections.each { |section|
972
- define_method "test_#{file}_#{section}" do
973
- if block
974
- jump.run_doc_section(file, section, self, &block)
975
- else
976
- jump.run_doc_section(file, section, self) {
977
- |expected, actual, index|
978
- assert_equal expected, actual
979
- }
980
- end
981
- end
982
- }
983
- end
984
- Object.const_set("Test#{file}".gsub(".", ""), klass)
985
- end
986
- end
987
- end