burke 0.1.0 → 0.2.0

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.
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