burke 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,66 @@
1
+ = Burke
2
+
3
+ == Synopsis
4
+
5
+ Burke provides a bunch of helpers to make creating Rake files a little more
6
+ pleasant. There are many subjective elements to this project, particularly
7
+ when it comes to sensible defaults, but popular Ruby conventions are adhered to
8
+ where possible. The project is named after Don Burke, host of an Australian
9
+ gardening and home improvement show named Burke's Backyard
10
+ (http://www.burkesbackyard.com.au).
11
+
12
+ == Features
13
+
14
+ * DRY definition of Gem packages for multiple platforms
15
+ * Recovery from missing libraries like Yard and RSpec
16
+
17
+ == Example
18
+
19
+ Here is a sample Rakefile using Burke.
20
+
21
+ require 'rubygems'
22
+ require 'burke'
23
+ require 'fileutils'
24
+
25
+ # Enable all tasks possible
26
+ Burke.enable_all
27
+
28
+ # Give Burke some data about the project
29
+ Burke.setup do |s|
30
+ s.name = 'foo'
31
+ s.version = '1.2.3'
32
+ s.summary = 'an example Ruby library with extra foo'
33
+ s.files = FileList['lib/**/*.rb']
34
+
35
+ s.docs do |d|
36
+ d.readme = 'README'
37
+ d.markup = 'rdoc'
38
+ end
39
+
40
+ s.gems do |g|
41
+ g.platform 'ruby'
42
+
43
+ g.platform 'x86-linux' do |p|
44
+ p.before do |s|
45
+ FileUtils.copy 'native/libfoo-x86-linux.so', 'lib/libfoo.so'
46
+ s.add_dependency 'ffi'
47
+ s.files += ['lib/libfoo.so']
48
+ end
49
+
50
+ p.after do
51
+ FileUtils.remove 'lib/libfoo.so'
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ == Default attributes
58
+
59
+ * +version+ inferred from contents of 'VERSION' file
60
+ * +files+ all files in 'lib' and 'spec' plus detected 'README', 'VERSION',
61
+ 'LICENSE', 'COPYING' and/or 'Rakefile'
62
+ * +docs.readme+ inferred from files matching 'README[\..*]?', case ignored
63
+ * +docs.markup+ inferred from extension of detected README file
64
+ * +rspec.spec_files+ 'spec/**/*_spec.rb'
65
+ * +rspec.color+ true
66
+
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ $LOAD_PATH << File.join(File.dirname(File.expand_path(__FILE__)), 'lib')
2
+ require 'burke'
3
+
4
+ Burke.enable_all
5
+
6
+ Burke.setup do |s|
7
+ s.name = 'burke'
8
+ s.summary = 'Helper for creating nice and clean Rake files'
9
+ s.author = 'Aiden Nibali'
10
+ s.email = 'dismal.denizen@gmail.com'
11
+ s.homepage = "http://github.com/dismaldenizen/burke"
12
+
13
+ s.dependencies do |d|
14
+ d.rake '~> 0.8.7'
15
+ end
16
+
17
+ s.has_rdoc = true
18
+
19
+ s.clean = %w[.yardoc]
20
+ s.clobber = %w[pkg doc html]
21
+
22
+ s.gems do |g|
23
+ g.platform 'ruby'
24
+ end
25
+ end
26
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
data/lib/burke.rb CHANGED
@@ -2,150 +2,320 @@ require 'rubygems'
2
2
  require 'rubygems/installer'
3
3
  require 'rake'
4
4
  require 'rake/tasklib'
5
-
6
- desc "Build gems for all targets"
7
- task :gems
5
+ require 'mash'
8
6
 
9
7
  module Burke
10
- VERSION = '0.1.0'
8
+ VERSION = File.read(File.join(File.dirname(File.dirname(__FILE__)), 'VERSION'))
9
+ @tasks = []
11
10
 
12
11
  class << self
13
- def base_spec
14
- @base_spec ||= Gem::Specification.new
15
- yield @base_spec if block_given?
16
- @base_spec
12
+ def enable_all opts={}
13
+ @tasks = %w[clean yard rdoc rspec rspec_rcov gems install].map {|t| t.to_sym}
14
+ disable opts[:except] if opts[:except]
17
15
  end
18
16
 
19
- def package_task *args, &block
20
- Rake::GemPackageTask.new *args, &block
17
+ def enable *args
18
+ @tasks.concat([*args].map {|t| t.to_sym})
19
+ @tasks.uniq!
21
20
  end
22
21
 
23
- def install_task *args, &block
24
- Rake::GemInstallTask.new *args, &block
22
+ def disable *args
23
+ dis = [*args].map {|t| t.to_sym}
24
+ @tasks.reject! {|t| dis.include? t}
25
25
  end
26
26
 
27
- def yard_task *args, &block
27
+ def setup
28
+ @settings = Mash[
29
+ :dependencies => Mash[],
30
+ :docs => Mash[],
31
+ :rspec => Mash[:rcov => Mash[]],
32
+ :gems => GemSettings.new,
33
+ :clean => [],
34
+ :clobber => [],
35
+ ]
36
+
37
+ @settings.files = Dir.glob('{lib,spec}/**/*')
38
+ %w[Rakefile COPYING LICENSE].each do |file|
39
+ @settings.files << file if File.exists?(file)
40
+ end
41
+
42
+ project_files = Dir['*'].reject! {|f| File.directory? f or !File.readable? f}
43
+
44
+ version_file = 'VERSION'
45
+ if File.readable?(version_file)
46
+ @settings.version = File.read(version_file).strip
47
+ @settings.files << version_file
48
+ end
49
+
50
+ license_file = nil
51
+ project_files.each do |f|
52
+ if %w[license licence copying].include? f.downcase.split('.').first
53
+ license_file = f
54
+ end
55
+ end
56
+
57
+ if license_file
58
+ @settings.docs.license = license_file
59
+ @settings.files << license_file
60
+ end
61
+
62
+ readme_file = nil
63
+ project_files.each do |f|
64
+ if f.downcase =~ /readme[\..*]?/
65
+ readme_file = f if readme_file.nil? or f.length < readme_file.length
66
+ end
67
+ end
68
+
69
+ if readme_file
70
+ @settings.docs.readme = File.basename readme_file
71
+ @settings.files << readme_file
72
+ @settings.docs.markup = case File.extname(readme_file).downcase
73
+ when '.rdoc'
74
+ 'rdoc'
75
+ when '.md'
76
+ 'markdown'
77
+ when '.textile'
78
+ 'textile'
79
+ end
80
+ end
81
+
82
+ @settings.rspec.spec_files = Dir['spec/**/*_spec.rb']
83
+ @settings.rspec.color = true
84
+
85
+ yield @settings
86
+
87
+ begin
88
+ require 'rake/clean'
89
+ CLOBBER.include(*@settings.clobber) if @settings.clobber
90
+ rescue LoadError
91
+ end if @tasks.include? :clean
92
+
93
+ unless @settings.docs.files
94
+ d = @settings.docs
95
+ fl = FileList.new
96
+ fl.include "lib/**/*.rb"
97
+ fl.include d.readme if d.readme
98
+ fl.include d.license if d.license
99
+ d.files = fl.to_a
100
+ end
101
+
28
102
  begin
29
103
  require 'yard'
30
- YARD::Rake::YardocTask.new *args, &block
104
+ opts = []
105
+ d = @settings.docs
106
+ opts << "--title" << "#{@settings.name} #{@settings.version}"
107
+ opts << "--readme" << d.readme if d.readme
108
+ opts << "--markup" << d.markup if d.markup
109
+ extra_files = [d.license].compact
110
+ opts << "--files" << extra_files.join(',') unless extra_files.empty?
111
+ YARD::Rake::YardocTask.new 'yard' do |t|
112
+ t.options = opts
113
+ end
114
+ rescue LoadError
115
+ end if @tasks.include? :yard
116
+
117
+ begin
118
+ require 'rake/rdoctask'
119
+ d = @settings.docs
120
+ Rake::RDocTask.new 'rdoc' do |r|
121
+ r.rdoc_files.include d.files
122
+ r.title = "#{@settings.name} #{@settings.version}"
123
+ r.main = d.readme if d.readme
124
+ end
31
125
  rescue LoadError
32
- puts "Couldn't load Yard: generation of Yard docs is disabled"
126
+ end if @tasks.include? :rdoc
127
+
128
+ if @settings.has_rdoc
129
+ d = @settings.docs
130
+ (@settings.extra_rdoc_files ||= []).concat d.files
131
+ opts = []
132
+ opts << "--title" << "#{@settings.name} #{@settings.version}"
133
+ opts << "--main" << d.readme if d.readme
134
+ @settings.rdoc_options ||= opts
33
135
  end
34
- end
35
-
36
- def spec_task *args, &block
136
+
37
137
  begin
38
138
  require 'spec/rake/spectask'
39
- Spec::Rake::SpecTask.new *args, &block
139
+ r = @settings.rspec
140
+ opts = []
141
+ opts << "--colour" if r.color
142
+ opts << "--format" << r.format if r.format
143
+ Spec::Rake::SpecTask.new 'spec' do |t|
144
+ t.spec_files = r.spec_files
145
+ t.spec_opts = opts
146
+ end unless r.empty?
147
+
148
+ begin
149
+ require 'spec/rake/verify_rcov'
150
+
151
+ desc "Run specs with RCov"
152
+ Spec::Rake::SpecTask.new('spec:rcov') do |t|
153
+ t.spec_files = r.spec_files
154
+ t.spec_opts = opts
155
+ t.rcov = true
156
+ t.rcov_opts = ['--exclude', 'spec']
157
+ end
158
+
159
+ RCov::VerifyTask.new('spec:rcov:verify' => 'spec:rcov') do |t|
160
+ t.threshold = r.rcov.threshold
161
+ t.index_html = 'coverage/index.html'
162
+ end if r.rcov.threshold
163
+ rescue LoadError
164
+ end if @tasks.include? :rspec_rcov
40
165
  rescue LoadError
41
- puts "Couldn't load RSpec: running of RSpec examples is disabled"
166
+ end if @tasks.include? :rspec
167
+
168
+ begin
169
+ settings.gems.individuals.each do |conf|
170
+ GemTaskManager.add_task conf
171
+ end
172
+
173
+ if name
174
+ desc "Build gem for this platform"
175
+ task(:gem => GemTaskManager.task_for_this_platform.task_name)
176
+ end
177
+ rescue LoadError
178
+ end if @tasks.include? :gems
179
+
180
+ if @tasks.include? :install
181
+ GemTaskManager.install_task unless GemTaskManager::TASKS.empty?
42
182
  end
183
+
184
+ @settings
43
185
  end
44
186
 
45
- def rcov_verify_task *args, &block
46
- begin
47
- require 'spec/rake/verify_rcov'
48
- RCov::VerifyTask.new *args, &block
49
- rescue LoadError
50
- puts "Couldn't load RSpec and RCov: verification of code coverage with RCov is disabled"
187
+ def base_gemspec
188
+ if @base_gemspec.nil?
189
+ @base_gemspec = Gem::Specification.new
190
+
191
+ attrs = Gem::Specification.attribute_names
192
+ attrs -= [:dependencies]
193
+ attrs += [:author]
194
+
195
+ attrs.each do |attr|
196
+ value = @settings.send(attr)
197
+ @base_gemspec.send("#{attr}=", value) if value
198
+ end
199
+
200
+ @settings.dependencies.each do |gem, version|
201
+ @base_gemspec.add_dependency gem.to_s, version
202
+ end
51
203
  end
204
+
205
+ @base_gemspec
206
+ end
207
+
208
+ def settings
209
+ @settings
52
210
  end
53
211
  end
54
212
 
55
- module Rake
56
- class GemPackageTask < ::Rake::TaskLib
57
- attr_reader :spec, :name
58
-
59
- TASKS = {}
213
+ class GemTaskManager
214
+ TASKS = {}
215
+
216
+ def self.add_task conf
217
+ spec = conf.gemspec
218
+ name = "gem:#{spec.platform}"
219
+ pkg_dir = Burke.settings.gems.package_dir
60
220
 
61
- @@package_dir = 'pkg'
221
+ if TASKS.empty?
222
+ desc "Build gems for all targets"
223
+ end
224
+ task :gems => name
62
225
 
63
- def initialize plaf=Gem::Platform::RUBY
64
- @spec = Burke.base_spec.dup
65
- @spec.platform = Gem::Platform.new plaf
66
- @name = "gem:#{@spec.platform}"
67
- yield self if block_given?
68
- define
226
+ unless ::Rake.application.last_comment
227
+ desc "Build gem for target '#{spec.platform}'"
69
228
  end
70
229
 
71
- def self.package_dir= path
72
- @@package_dir = path
230
+ task(name) do
231
+ conf.before.call spec unless conf.before.nil?
232
+ builder = Gem::Builder.new(spec)
233
+ builder.build
234
+ verbose true do
235
+ mkdir pkg_dir unless File.exists? pkg_dir
236
+ mv conf.gem_file, File.join(pkg_dir, conf.gem_file)
237
+ end
238
+ conf.after.call spec unless conf.after.nil?
73
239
  end
74
240
 
75
- def self.package_dir
76
- @@package_dir
241
+ TASKS[spec.platform.to_s] = conf
242
+ end
243
+
244
+ def self.has_task? platform
245
+ TASKS.has_key? platform
246
+ end
247
+
248
+ def self.task_for_this_platform
249
+ platform = Gem::Platform.new(RUBY_PLATFORM).to_s
250
+ name = nil
251
+
252
+ if GemTaskManager.has_task? platform
253
+ name = platform
254
+ elsif GemTaskManager.has_task? 'ruby'
255
+ name = "ruby"
77
256
  end
78
257
 
79
- def before &block
80
- @before = block
258
+ TASKS[name]
259
+ end
260
+
261
+ def self.install_task
262
+ t = task_for_this_platform
263
+
264
+ desc "Install gem for this platform"
265
+ task 'install' => [t.task_name] do
266
+ Gem::Installer.new(File.join(t.package_dir, t.gem_file)).install
81
267
  end
268
+ end
269
+ end
270
+
271
+ class GemSettings
272
+ attr_accessor :package_dir, :individuals
273
+
274
+ def initialize
275
+ @package_dir = 'pkg'
276
+ end
277
+
278
+ def platform plaf
279
+ conf = IndividualGemSettings.new plaf
280
+ @individuals ||= []
281
+ @individuals << conf
282
+ yield conf if block_given?
283
+ conf
284
+ end
285
+
286
+ class IndividualGemSettings
287
+ attr_reader :platform
82
288
 
83
- def extend_spec &block
84
- @extend_spec = block
289
+ def initialize plaf
290
+ @platform = Gem::Platform.new plaf
85
291
  end
86
292
 
87
- def after &block
88
- @after = block
293
+ def gemspec
294
+ spec = Burke.base_gemspec.dup
295
+ spec.platform = @platform
296
+ spec
89
297
  end
90
298
 
91
299
  def gem_file
92
- "#{spec.full_name}.gem"
300
+ "#{gemspec.full_name}.gem"
93
301
  end
94
302
 
95
- private
96
- def define
97
- task :gems => name
98
-
99
- unless ::Rake.application.last_comment
100
- desc "Build gem for target '#{@spec.platform}'"
101
- end
102
- task(name) { run_task }
103
- TASKS[name] = self
104
-
105
- if @spec.platform == Gem::Platform::RUBY
106
- desc "Build gem for target '#{@spec.platform}'"
107
- task(:gem) { run_task }
108
- end
109
-
110
- self
303
+ def task_name
304
+ "gem:#{platform}"
111
305
  end
112
306
 
113
- def run_task
114
- @before.call unless @before.nil?
115
- @extend_spec.call spec unless @extend_spec.nil?
116
- builder = Gem::Builder.new(@spec)
117
- builder.build
118
- verbose true do
119
- mkdir @@package_dir unless File.exists? @@package_dir
120
- mv gem_file, File.join(@@package_dir, gem_file)
121
- end
122
- @after.call unless @after.nil?
307
+ def package_dir
308
+ Burke.settings.gems.package_dir
123
309
  end
124
- end
125
-
126
- class GemInstallTask < ::Rake::TaskLib
127
- attr_reader :name
128
310
 
129
- def initialize
130
- @name = "install"
131
- define
311
+ def before &block
312
+ @before = block if block_given?
313
+ @before
132
314
  end
133
315
 
134
- private
135
- def define
136
- platform = Gem::Platform.new(RUBY_PLATFORM).to_s
137
- t = nil
138
- dep = nil
139
- unless t = GemPackageTask::TASKS["gem:#{platform}"]
140
- t = GemPackageTask::TASKS["gem:ruby"]
141
- end
142
-
143
- desc "Build and install gem for this platform"
144
- task name => [t.name] do
145
- Gem::Installer.new(File.join(GemPackageTask.package_dir, t.gem_file)).install
146
- end
147
-
148
- self
316
+ def after &block
317
+ @after = block if block_given?
318
+ @after
149
319
  end
150
320
  end
151
321
  end
data/lib/mash.rb ADDED
@@ -0,0 +1,25 @@
1
+ class Mash < Hash
2
+ def method_missing name, *args, &block
3
+ if name.to_s =~ /(.*)=/
4
+ self.[]=($1, *args, &block)
5
+ else
6
+ if args.empty?
7
+ self.[](name, &block)
8
+ else
9
+ self.[]=(name, *args, &block)
10
+ end
11
+ end
12
+ end
13
+
14
+ def []=(k, *v)
15
+ v = *v if v.one?
16
+ super k.to_s.downcase.to_sym, v
17
+ end
18
+
19
+ def [](k)
20
+ v = super(k.to_s.downcase.to_sym)
21
+ yield v if block_given?
22
+ v
23
+ end
24
+ end
25
+
data/spec/mash_spec.rb ADDED
@@ -0,0 +1,11 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
+
3
+ describe Mash do
4
+ context "when representing {:num => 42}" do
5
+ subject { Mash[:num => 42] }
6
+ its(:num) { should eql 42 }
7
+ its(:size) { should eql 1 }
8
+ its(:to_hash) { should eql :num => 42 }
9
+ end
10
+ end
11
+
@@ -0,0 +1,2 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. lib burke])
2
+
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Aiden Nibali
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-22 00:00:00 +10:00
17
+ date: 2010-08-24 00:00:00 +10:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -31,23 +31,34 @@ dependencies:
31
31
  version: 0.8.7
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
- description: Helper for creating nice and clean Rake files
34
+ description:
35
35
  email: dismal.denizen@gmail.com
36
36
  executables: []
37
37
 
38
38
  extensions: []
39
39
 
40
- extra_rdoc_files: []
41
-
40
+ extra_rdoc_files:
41
+ - lib/burke.rb
42
+ - lib/mash.rb
43
+ - README.rdoc
42
44
  files:
43
45
  - lib/burke.rb
46
+ - lib/mash.rb
47
+ - spec/spec_helper.rb
48
+ - spec/mash_spec.rb
49
+ - Rakefile
50
+ - VERSION
51
+ - README.rdoc
44
52
  has_rdoc: true
45
53
  homepage: http://github.com/dismaldenizen/burke
46
54
  licenses: []
47
55
 
48
56
  post_install_message:
49
- rdoc_options: []
50
-
57
+ rdoc_options:
58
+ - --title
59
+ - burke 0.2.0
60
+ - --main
61
+ - README.rdoc
51
62
  require_paths:
52
63
  - lib
53
64
  required_ruby_version: !ruby/object:Gem::Requirement