bones 3.5.5 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,14 @@
1
+ == 3.6.0 / 2011-01-21
2
+
3
+ Enhancements
4
+ - Use RDoc::Task if it's available. Otherwise fallback to Rake::RDoctask.
5
+ - Specify gem sources in the Bones configuration block.
6
+ - Initialize bones from an external gemspec file.
7
+ - Colorization of bones command output.
8
+
9
+ Bug Fixes
10
+ - Excluding the "version.txt" file from rdoc processing.
11
+
1
12
  == 3.5.5 / 2011-01-10
2
13
 
3
14
  1 bug fix
data/default/Rakefile.bns CHANGED
@@ -9,7 +9,7 @@ task :default => 'test:run'
9
9
  task 'gem:release' => 'test:run'
10
10
 
11
11
  Bones {
12
- name '<%= name %>'
12
+ name '<%= name %>'
13
13
  authors 'FIXME (who is writing this software)'
14
14
  email 'FIXME (your e-mail)'
15
15
  url 'FIXME (project homepage)'
@@ -4,24 +4,19 @@ module <%= classname %>
4
4
  # :stopdoc:
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
+ VERSION = ::File.read(PATH + 'version.txt').strip
7
8
  # :startdoc:
8
9
 
9
- # Returns the version string for the library.
10
- #
11
- def self.version
12
- @version ||= File.read(path('version.txt')).strip
13
- end
14
-
15
10
  # Returns the library path for the module. If any arguments are given,
16
11
  # they will be joined to the end of the libray path using
17
12
  # <tt>File.join</tt>.
18
13
  #
19
- def self.libpath( *args, &block )
14
+ def self.libpath( *args )
20
15
  rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
21
- if block
16
+ if block_given?
22
17
  begin
23
18
  $LOAD_PATH.unshift LIBPATH
24
- rv = block.call
19
+ rv = yield
25
20
  ensure
26
21
  $LOAD_PATH.shift
27
22
  end
@@ -33,12 +28,12 @@ module <%= classname %>
33
28
  # they will be joined to the end of the path using
34
29
  # <tt>File.join</tt>.
35
30
  #
36
- def self.path( *args, &block )
31
+ def self.path( *args )
37
32
  rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
38
- if block
33
+ if block_given?
39
34
  begin
40
35
  $LOAD_PATH.unshift PATH
41
- rv = block.call
36
+ rv = yield
42
37
  ensure
43
38
  $LOAD_PATH.shift
44
39
  end
@@ -0,0 +1 @@
1
+ https://github.com/radar/guides/blob/master/gem-development.md
data/lib/bones.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  require 'rubygems'
3
3
  require 'rake'
4
4
  require 'rake/clean'
5
+ require 'pathname'
5
6
  require 'fileutils'
6
7
  require 'find'
7
8
  require 'rbconfig'
@@ -32,12 +33,12 @@ module Bones
32
33
  # Returns the path for Mr Bones. If any arguments are given,
33
34
  # they will be joined to the end of the path using <tt>File.join</tt>.
34
35
  #
35
- def self.path( *args, &block )
36
+ def self.path( *args )
36
37
  rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
37
- if block
38
+ if block_given?
38
39
  begin
39
40
  $LOAD_PATH.unshift PATH
40
- rv = block.call
41
+ rv = yield
41
42
  ensure
42
43
  $LOAD_PATH.shift
43
44
  end
@@ -48,12 +49,12 @@ module Bones
48
49
  # Returns the lib path for Mr Bones. If any arguments are given,
49
50
  # they will be joined to the end of the path using <tt>File.join</tt>.
50
51
  #
51
- def self.libpath( *args, &block )
52
+ def self.libpath( *args )
52
53
  rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
53
- if block
54
+ if block_given?
54
55
  begin
55
56
  $LOAD_PATH.unshift LIBPATH
56
- rv = block.call
57
+ rv = yield
57
58
  ensure
58
59
  $LOAD_PATH.shift
59
60
  end
@@ -87,7 +88,7 @@ Bones.libpath {
87
88
  each { |fn| require File.join('bones', fn) }
88
89
 
89
90
  Bones.config {}
90
- Loquacious.remove :gem, :file, :test
91
+ Loquacious.remove :gem, :file, :test, :timeout
91
92
  }
92
93
 
93
94
  module Kernel
@@ -97,13 +98,14 @@ module Kernel
97
98
  # Configure Mr Bones using the given _block_ of code. If a block is not
98
99
  # given, the Bones module is returned.
99
100
  #
100
- def Bones( &block )
101
+ def Bones( filename = nil, &block )
101
102
 
102
103
  # we absolutely have to have the bones plugin
103
104
  plugin_names = ::Bones.plugin_names
104
105
  ::Bones.plugin :bones_plugin unless plugin_names.empty? or plugin_names.include? :bones_plugin
105
106
 
106
107
  plugins = ::Bones.initialize_plugins.values
108
+ ::Bones::Plugins::Gem.import_gemspec(filename) if filename
107
109
  return ::Bones unless block
108
110
 
109
111
  extend_method = Object.instance_method(:extend).bind(::Bones.config)
@@ -10,8 +10,8 @@ class Bones::AnnotationExtractor
10
10
  # will be included in the string.
11
11
  #
12
12
  def to_s( opts = {} )
13
- s = "[%3d] " % line
14
- s << "[#{tag}] " if opts[:tag]
13
+ s = "[#{Bones::Colors.colorize('%3d', :magenta)}] " % line
14
+ s << "[#{Bones::Colors.colorize(tag, :cyan)}] " if opts[:tag]
15
15
  s << text
16
16
  end
17
17
  }
@@ -74,7 +74,7 @@ class Bones::AnnotationExtractor
74
74
 
75
75
  text = m[2]
76
76
  if text =~ @id_rgxp
77
- text.gsub!(@id_rgxp) {|str| ::Bones::Colors.green(str)} if config.colorize
77
+ text.gsub!(@id_rgxp) {|str| Bones::Colors.colorize(str, :green)}
78
78
  list << Annotation.new(lineno, m[1], text)
79
79
  end
80
80
  list
data/lib/bones/app.rb CHANGED
@@ -17,6 +17,7 @@ module Bones::App
17
17
  end
18
18
 
19
19
  class Main
20
+ include Bones::Colors
20
21
  attr_reader :stdout
21
22
  attr_reader :stderr
22
23
 
@@ -58,11 +59,11 @@ module Bones::App
58
59
  end
59
60
 
60
61
  rescue Bones::App::Error => err
61
- stderr.puts "ERROR: While executing bones ..."
62
- stderr.puts " #{err.message}"
62
+ stderr.puts "#{colorize('ERROR', :white, :on_red)}: While executing bones ..."
63
+ stderr.puts " #{err.message.split("\n").join("\n ")}"
63
64
  exit 1
64
65
  rescue StandardError => err
65
- stderr.puts "ERROR: While executing bones ... (#{err.class})"
66
+ stderr.puts "#{colorize('ERROR', :white, :on_red)}: While executing bones ... (#{colorize(err.class, :red)})"
66
67
  stderr.puts " #{err.to_s}"
67
68
  exit 1
68
69
  end
@@ -1,8 +1,10 @@
1
1
 
2
2
  class Bones::App::Command
3
+ include Bones::Colors
3
4
 
4
5
  # :stopdoc:
5
6
  DEFAULT_SKELETON = 'default'
7
+ Bones.config() { colorize = true }
6
8
  # :startdoc:
7
9
 
8
10
  attr_reader :stdout
@@ -17,7 +19,7 @@ class Bones::App::Command
17
19
  :skeleton_dir => File.join(mrbones_dir, DEFAULT_SKELETON),
18
20
  :verbose => false,
19
21
  :name => nil,
20
- :output_dir => nil
22
+ :output_dir => nil,
21
23
  }
22
24
  @config[:skeleton_dir] = ::Bones.path(DEFAULT_SKELETON) unless test(?d, skeleton_dir)
23
25
  end
@@ -129,7 +131,8 @@ class Bones::App::Command
129
131
  return opts
130
132
  end
131
133
 
132
- #
134
+ # Returns a hash of the standard options that can be used for individual
135
+ # commadns.
133
136
  #
134
137
  def self.standard_options
135
138
  @standard_options ||= {
@@ -155,7 +158,10 @@ class Bones::App::Command
155
158
 
156
159
  :repository => ['-r', '--repository URL', String,
157
160
  'svn or git repository path.',
158
- lambda { |value| config[:repository] = value }]
161
+ lambda { |value| config[:repository] = value }],
162
+
163
+ :colorize => ['-c', '--color', '--no-color', 'Colorize output',
164
+ lambda { |value| Bones.config.colorize = value }]
159
165
  }
160
166
  end
161
167
 
@@ -17,7 +17,7 @@ be used as the skeleton if the '--repository' flag is given.
17
17
  option(standard_options[:directory])
18
18
  option(standard_options[:skeleton])
19
19
  option(standard_options[:repository])
20
- option(standard_options[:verbose])
20
+ option(standard_options[:colorize])
21
21
  end
22
22
 
23
23
  def self.in_output_directory( *args )
@@ -56,22 +56,20 @@ be used as the skeleton if the '--repository' flag is given.
56
56
  :destination => output_dir,
57
57
  :stdout => stdout,
58
58
  :stderr => stderr,
59
- :verbose => verbose?
59
+ :verbose => true
60
60
  )
61
-
62
- fm.copy
63
- fm.finalize name
61
+ fm.template name
64
62
  rescue Bones::App::FileManager::Error => err
65
63
  FileUtils.rm_rf output_dir
66
64
  msg = "Could not create '#{name}'"
67
65
  msg << " in directory '#{output_dir}'" if name != output_dir
68
- msg << "\n\t#{err.message}"
66
+ msg << "\n#{err.message}"
69
67
  raise Error, msg
70
68
  rescue Exception => err
71
69
  FileUtils.rm_rf output_dir
72
70
  msg = "Could not create '#{name}'"
73
71
  msg << " in directory '#{output_dir}'" if name != output_dir
74
- msg << "\n\t#{err.inspect}"
72
+ msg << "\n#{err.inspect}"
75
73
  raise Error, msg
76
74
  end
77
75
 
@@ -83,11 +81,14 @@ be used as the skeleton if the '--repository' flag is given.
83
81
 
84
82
  def fixme
85
83
  return unless test ?f, 'Rakefile'
84
+
85
+ stdout.puts
86
+ stdout.puts colorize('-'*31, :yellow)
86
87
  stdout.puts 'Now you need to fix these files'
88
+ stdout.puts colorize('-'*31, :yellow)
87
89
  system "#{::Bones::RUBY} -S rake notes"
88
90
  end
89
91
 
90
92
  end # class Create
91
93
  end # module Bones::App
92
94
 
93
- # EOF
@@ -3,6 +3,7 @@ require 'erb'
3
3
 
4
4
  module Bones::App
5
5
  class FileManager
6
+ include Bones::Colors
6
7
 
7
8
  Error = Class.new(StandardError)
8
9
 
@@ -45,7 +46,7 @@ class FileManager
45
46
  def archive_destination
46
47
  return false unless test(?e, destination)
47
48
 
48
- @out.puts "archiving #{destination}" if verbose?
49
+ archiving(destination)
49
50
  FileUtils.rm_rf(archive)
50
51
  FileUtils.mv(destination, archive)
51
52
  true
@@ -59,17 +60,26 @@ class FileManager
59
60
  else
60
61
  _files_to_copy.each {|fn| _cp(fn)}
61
62
  end
63
+ self
62
64
  end
63
65
 
66
+ # Gernate a new destination folder by copying files from the source, rename
67
+ # files and directories that contain "NAME", and perform ERB templating on
68
+ # ".bns" files. The _name_ use used for file/folder renaming and ERB
69
+ # templating.
64
70
  #
65
- #
66
- def finalize( name )
71
+ def template( name )
67
72
  name = name.to_s
68
73
  return if name.empty?
69
74
 
75
+ if repository?
76
+ _checkout(repository)
77
+ else
78
+ _files_to_copy.each {|fn| _cp(fn, false)}
79
+ end
80
+
70
81
  self.destination = _rename(destination, name)
71
82
  _erb(name)
72
-
73
83
  self
74
84
  end
75
85
 
@@ -108,10 +118,16 @@ class FileManager
108
118
  def _erb( name )
109
119
  binding = _erb_binding(name)
110
120
  Dir.glob(File.join(destination, '**', '*'), File::FNM_DOTMATCH).each do |fn|
111
- next unless test(?f, fn) and '.bns' == File.extname(fn)
121
+ next unless test(?f, fn)
122
+ if File.extname(fn) != '.bns'
123
+ creating(fn)
124
+ next
125
+ end
112
126
 
113
- txt = ERB.new(File.read(fn), nil, '-').result(binding)
114
127
  new_fn = fn.sub(%r/\.bns$/, '')
128
+ creating(new_fn)
129
+
130
+ txt = ERB.new(File.read(fn), nil, '-').result(binding)
115
131
  File.open(new_fn, 'w') {|fd| fd.write(txt)}
116
132
  FileUtils.chmod(File.stat(fn).mode, new_fn)
117
133
  FileUtils.rm_f(fn)
@@ -156,19 +172,37 @@ class FileManager
156
172
  # specified project location. A message will be displayed to the screen
157
173
  # indicating that the file is being created.
158
174
  #
159
- def _cp( file )
175
+ def _cp( file, msg = true )
160
176
  dir = File.dirname(file)
161
177
  dir = (dir == '.' ? destination : File.join(destination, dir))
162
178
  dst = File.join(dir, File.basename(file))
163
179
  src = File.join(source, file)
164
180
 
165
- @out.puts(test(?e, dst) ? "updating #{dst}" : "creating #{dst}") if verbose?
181
+ (test(?e, dst) ? updating(dst) : creating(dst)) if msg
182
+
166
183
  FileUtils.mkdir_p(dir)
167
184
  FileUtils.cp src, dst
168
185
 
169
186
  FileUtils.chmod(File.stat(src).mode, dst)
170
187
  end
171
188
 
189
+ private
190
+
191
+ def archiving( filename )
192
+ return unless verbose?
193
+ @put.puts " #{colorize('archiving', :cyan)} #{filename}"
194
+ end
195
+
196
+ def creating( filename )
197
+ return unless verbose?
198
+ @out.puts " #{colorize('creating', :green)} #{filename}"
199
+ end
200
+
201
+ def updating( filename )
202
+ return unless verbose?
203
+ @out.puts " #{colorize('updating', :yellow)} #{filename}"
204
+ end
205
+
172
206
  end # class FileManager
173
207
  end # module Bones::App
174
208
 
@@ -16,6 +16,7 @@ skeleton.
16
16
 
17
17
  option(standard_options[:repository])
18
18
  option(standard_options[:verbose])
19
+ option(standard_options[:colorize])
19
20
  end
20
21
 
21
22
  def run
@@ -14,9 +14,9 @@ class Info < Command
14
14
 
15
15
  msg = "\n"
16
16
  msg << "The default project skeleton will be copied from:\n"
17
- msg << " " << skeleton_dir << "\n\n"
17
+ msg << " " << colorize(skeleton_dir, :cyan) << "\n\n"
18
18
 
19
- fmt = " %-12s => %s\n"
19
+ fmt = " #{colorize('%-12s', :green)} #{colorize('=>', :yellow)} #{colorize('%s', :cyan)}\n"
20
20
  msg << "Available projects skeletons are:\n"
21
21
  Dir.glob(File.join(mrbones_dir, '*')).sort.each do |fn|
22
22
  next if fn =~ %r/\.archive$/
@@ -25,7 +25,7 @@ class Info < Command
25
25
  if test(?f, fn)
26
26
  msg << fmt % [File.basename(fn), File.read(fn).strip]
27
27
  else
28
- msg << " " << File.basename(fn) << "\n"
28
+ msg << " " << colorize(File.basename(fn), :green) << "\n"
29
29
  end
30
30
  end
31
31
 
@@ -14,6 +14,7 @@ gems are not installed.
14
14
  __
15
15
 
16
16
  option('-a', '--all', 'Show all plugins.', lambda { config[:all] = true })
17
+ option(standard_options[:colorize])
17
18
  end
18
19
 
19
20
  def run
@@ -46,7 +47,7 @@ gems are not installed.
46
47
  name = "bones-#{name}"
47
48
  name << "-#{version}" if version
48
49
 
49
- stdout.puts(" [%s] %s" % [installed?(name) ? 'installed' : 'available', name])
50
+ stdout.puts(" [%s] %s" % [installed?(name) ? colorize('installed', :green) : colorize('available', :cyan), name])
50
51
  end
51
52
 
52
53
  private
@@ -13,6 +13,7 @@ not given then the default skeleton is removed.
13
13
  __
14
14
 
15
15
  option(standard_options[:verbose])
16
+ option(standard_options[:colorize])
16
17
  end
17
18
 
18
19
  def run
data/lib/bones/colors.rb CHANGED
@@ -2,53 +2,67 @@
2
2
  module Bones::Colors
3
3
  extend self
4
4
 
5
- COLOR_CODES = {
6
- :clear => 0,
7
- :reset => 0, # synonym for :clear
8
- :bold => 1,
9
- :dark => 2,
10
- :italic => 3, # not widely implemented
11
- :underline => 4,
12
- :underscore => 4, # synonym for :underline
13
- :blink => 5,
14
- :rapid_blink => 6, # not widely implemented
15
- :negative => 7, # no reverse because of String#reverse
16
- :concealed => 8,
17
- :strikethrough => 9, # not widely implemented
18
- :black => 30,
19
- :red => 31,
20
- :green => 32,
21
- :yellow => 33,
22
- :blue => 34,
23
- :magenta => 35,
24
- :cyan => 36,
25
- :white => 37,
26
- :on_black => 40,
27
- :on_red => 41,
28
- :on_green => 42,
29
- :on_yellow => 43,
30
- :on_blue => 44,
31
- :on_magenta => 45,
32
- :on_cyan => 46,
33
- :on_white => 47
34
- }
5
+ COLORS = {
6
+ # Embed in a String to clear all previous ANSI sequences. This *MUST* be
7
+ # done before the program exits!
8
+ #
9
+ :clear => "\e[0m",
10
+ :erase_line => "\e[K",
11
+ :erase_char => "\e[P",
12
+ :bold => "\e[1m",
13
+ :dark => "\e[2m",
14
+ :underline => "\e[4m",
15
+ :blink => "\e[5m",
16
+ :reverse => "\e[7m",
17
+ :concealed => "\e[8m",
18
+
19
+ # Terminal's foreground ANSI colors
20
+ :black => "\e[30m",
21
+ :red => "\e[31m",
22
+ :green => "\e[32m",
23
+ :yellow => "\e[33m",
24
+ :blue => "\e[34m",
25
+ :magenta => "\e[35m",
26
+ :cyan => "\e[36m",
27
+ :white => "\e[37m",
35
28
 
36
- COLOR_CODES.each { |name,code|
37
- module_eval <<-CODE
38
- def #{name.to_s}( str )
39
- "\e[#{code}m\#{str}\e[0m"
40
- end
41
- CODE
29
+ # Terminal's background ANSI colors
30
+ :on_black => "\e[40m",
31
+ :on_red => "\e[41m",
32
+ :on_green => "\e[42m",
33
+ :on_yellow => "\e[43m",
34
+ :on_blue => "\e[44m",
35
+ :on_magenta => "\e[45m",
36
+ :on_cyan => "\e[46m",
37
+ :on_white => "\e[47m"
42
38
  }
39
+ COLORS[:reset] = COLORS[:clear]
40
+ COLORS[:underscore] = COLORS[:underline]
41
+
42
+ # This method provides easy access to ANSI color sequences, without the user
43
+ # needing to remember to CLEAR at the end of each sequence. Just pass the
44
+ # _string_ to color, followed by a list of _colors_ you would like it to
45
+ # be affected by. The _colors_ can be class constants, or symbols (:blue
46
+ # for BLUE, for example). A CLEAR will automatically be embedded to the
47
+ # end of the returned String.
48
+ #
49
+ # This method returns the original _string_ unchanged if colorize? is
50
+ # +false+.
51
+ #
52
+ def colorize( string, *colors )
53
+ return string unless colorize?
43
54
 
44
- def colorize( str, *args )
45
- args.each { |name|
46
- code = COLOR_CODES[name]
47
- next if code.nil?
48
- str = "\e[#{code}m#{str}\e[0m"
55
+ colors.map! { |c|
56
+ c.is_a?(Symbol) ? COLORS[c] : c
49
57
  }
50
- str
58
+ "#{colors.flatten.join}#{string}#{COLORS[:clear]}"
51
59
  end
60
+
61
+ # Returns true if Bones is currently using color escapes.
62
+ #
63
+ def colorize?
64
+ Bones.config.colorize
65
+ end
66
+
52
67
  end # module Bones::Colors
53
68
 
54
- # EOF
@@ -5,6 +5,8 @@ module Bones::Plugins::Gem
5
5
  include ::Bones::Helpers
6
6
  extend self
7
7
 
8
+ GemspecError = Class.new(StandardError)
9
+
8
10
  module Syntax
9
11
  # Adds the given gem _name_ to the current project's dependency list. An
10
12
  # optional gem _version_ can be given. If omitted, the newest gem version
@@ -26,10 +28,21 @@ module Bones::Plugins::Gem
26
28
  development ?
27
29
  ::Bones.config.gem.development_dependencies << dep :
28
30
  ::Bones.config.gem.dependencies << dep
31
+ nil
32
+ end
33
+
34
+ # Add the given _url_ to the list of gem sources.
35
+ #
36
+ def source( url )
37
+ sources = ::Bones.config.gem.sources
38
+ sources << url unless sources.include? url
39
+ nil
29
40
  end
30
41
  end
31
42
 
32
43
  def initialize_gem
44
+ Gem.configuration
45
+
33
46
  ::Bones.config {
34
47
  desc 'Configuration settings for gem packaging.'
35
48
  gem {
@@ -89,6 +102,14 @@ module Bones::Plugins::Gem
89
102
  provided for by Mr Bones. You will need to refer to the rubygems
90
103
  documentation for a complete list of specification settings.
91
104
  __
105
+
106
+ sources Gem.sources.dup, :desc => <<-__
107
+ An array of sources to fetch remote gems from. A convenience method
108
+ is provided to add new gem sources to this list.
109
+
110
+ | source 'http://gems.example.com'
111
+ | source 'http://rubygems.org'
112
+ __
92
113
  }
93
114
  }
94
115
 
@@ -98,79 +119,85 @@ module Bones::Plugins::Gem
98
119
  def post_load
99
120
  config = ::Bones.config
100
121
 
101
- config.gem.files ||= manifest
102
- config.gem.executables ||= config.gem.files.find_all {|fn| fn =~ %r/^bin/}
103
- config.gem.development_dependencies << ['bones', ">= #{Bones.version}"]
122
+ Gem.sources = config.gem.sources
123
+
124
+ unless $bones_external_spec
125
+ config.gem.files ||= manifest
126
+ config.gem.executables ||= config.gem.files.find_all {|fn| fn =~ %r/^bin/}
127
+ config.gem.development_dependencies << ['bones', ">= #{Bones.version}"]
128
+ end
104
129
  end
105
130
 
106
131
  def define_tasks
107
132
  config = ::Bones.config
108
133
 
109
134
  namespace :gem do
110
- config.gem._spec = Gem::Specification.new do |s|
111
- s.name = config.name
112
- s.version = config.version
113
- s.summary = config.summary
114
- s.authors = Array(config.authors)
115
- s.email = config.email
116
- s.homepage = Array(config.url).first
117
- s.rubyforge_project = config.name
118
-
119
- if !config.rubyforge.nil? and config.rubyforge.name
120
- s.rubyforge_project = config.rubyforge.name
121
- end
135
+ if config.gem._spec.nil?
136
+ config.gem._spec = Gem::Specification.new do |s|
137
+ s.name = config.name
138
+ s.version = config.version
139
+ s.summary = config.summary
140
+ s.authors = Array(config.authors)
141
+ s.email = config.email
142
+ s.homepage = Array(config.url).first
143
+ s.rubyforge_project = config.name
144
+
145
+ if !config.rubyforge.nil? and config.rubyforge.name
146
+ s.rubyforge_project = config.rubyforge.name
147
+ end
122
148
 
123
- s.description = config.description
149
+ s.description = config.description
124
150
 
125
- config.gem.dependencies.each do |dep|
126
- s.add_dependency(*dep)
127
- end
151
+ config.gem.dependencies.each do |dep|
152
+ s.add_dependency(*dep)
153
+ end
128
154
 
129
- config.gem.development_dependencies.each do |dep|
130
- s.add_development_dependency(*dep)
131
- end
155
+ config.gem.development_dependencies.each do |dep|
156
+ s.add_development_dependency(*dep)
157
+ end
132
158
 
133
- s.files = config.gem.files
134
- s.executables = config.gem.executables.map {|fn| File.basename(fn)}
135
- s.extensions = config.gem.files.grep %r/extconf\.rb$/
136
-
137
- s.bindir = 'bin'
138
- dirs = Dir["{#{config.libs.join(',')}}"]
139
- s.require_paths = dirs unless dirs.empty?
140
-
141
- if have? :rdoc
142
- incl = Regexp.new(config.rdoc.include.join('|'))
143
- excl = config.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
144
- excl = Regexp.new(excl.join('|'))
145
- rdoc_files = config.gem.files.find_all do |fn|
146
- case fn
147
- when excl; false
148
- when incl; true
149
- else false end
150
- end
151
- s.rdoc_options = config.rdoc.opts + ['--main', config.rdoc.main]
152
- s.extra_rdoc_files = rdoc_files
153
- s.has_rdoc = true
154
- end
159
+ s.files = config.gem.files
160
+ s.executables = config.gem.executables.map {|fn| File.basename(fn)}
161
+ s.extensions = config.gem.files.grep %r/extconf\.rb$/
162
+
163
+ s.bindir = 'bin'
164
+ dirs = Dir["{#{config.libs.join(',')}}"]
165
+ s.require_paths = dirs unless dirs.empty?
166
+
167
+ if have? :rdoc
168
+ incl = Regexp.new(config.rdoc.include.join('|'))
169
+ excl = config.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
170
+ excl = Regexp.new(excl.join('|'))
171
+ rdoc_files = config.gem.files.find_all do |fn|
172
+ case fn
173
+ when excl; false
174
+ when incl; true
175
+ else false end
176
+ end
177
+ s.rdoc_options = config.rdoc.opts + ['--main', config.rdoc.main]
178
+ s.extra_rdoc_files = rdoc_files
179
+ s.has_rdoc = true
180
+ end
155
181
 
156
- if config.test
157
- if test ?f, config.test.file
158
- s.test_file = config.test.file
159
- else
160
- s.test_files = config.test.files.to_a
182
+ if config.test
183
+ if test ?f, config.test.file
184
+ s.test_file = config.test.file
185
+ else
186
+ s.test_files = config.test.files.to_a
187
+ end
161
188
  end
162
- end
163
189
 
164
- # Do any extra stuff the user wants
165
- config.gem.extras.each do |msg, val|
166
- case val
167
- when Proc
168
- val.call(s.send(msg))
169
- else
170
- s.send "#{msg}=", val
190
+ # Do any extra stuff the user wants
191
+ config.gem.extras.each do |msg, val|
192
+ case val
193
+ when Proc
194
+ val.call(s.send(msg))
195
+ else
196
+ s.send "#{msg}=", val
197
+ end
171
198
  end
172
- end
173
- end # Gem::Specification.new
199
+ end # Gem::Specification.new
200
+ end # if gem._spec.nil?
174
201
 
175
202
  ::Bones::GemPackageTask.new(config.gem._spec) do |pkg|
176
203
  pkg.need_tar = config.gem.need_tar
@@ -192,10 +219,13 @@ module Bones::Plugins::Gem
192
219
  puts config.gem._spec.to_ruby
193
220
  end
194
221
 
195
- desc 'Write the gemspec'
196
- task :spec => 'gem:prereqs' do
197
- File.open("#{config.name}.gemspec", 'w') do |f|
198
- f.write config.gem._spec.to_ruby
222
+ # don't use the "spec" task if we have an external gemspec
223
+ unless $bones_external_spec
224
+ desc 'Write the gemspec'
225
+ task :spec => 'gem:prereqs' do
226
+ File.open("#{config.name}.gemspec", 'w') do |f|
227
+ f.write config.gem._spec.to_ruby
228
+ end
199
229
  end
200
230
  end
201
231
 
@@ -288,6 +318,78 @@ module Bones::Plugins::Gem
288
318
  files.sort!
289
319
  end
290
320
 
321
+ # Import configuration from the given gemspec file.
322
+ #
323
+ def import_gemspec( filename )
324
+ $bones_external_spec = false
325
+ spec = load_gemspec(filename)
326
+ return if spec.nil?
327
+
328
+ config = ::Bones.config
329
+ config.gem._spec = spec
330
+ $bones_external_spec = true
331
+
332
+ config.name = spec.name
333
+ config.version = spec.version
334
+ config.summary = spec.summary
335
+ config.authors = spec.authors
336
+ config.email = spec.email
337
+ config.url = spec.homepage
338
+ config.description = spec.description
339
+ config.files = spec.files
340
+ config.libs = spec.require_paths
341
+ config.rubyforge_project = spec.rubyforge_project
342
+
343
+ config.gem.executables = spec.executables
344
+ config.rdoc.opts = spec.rdoc_options
345
+ config.test.file = spec.test_file if spec.test_file
346
+ config.test.files = spec.test_files if spec.test_files
347
+
348
+ spec.runtime_dependencies.each do |dep|
349
+ config.gem.dependencies << [dep.name, dep.requirements_list].flatten
350
+ end
351
+
352
+ spec.development_dependencies.each do |dep|
353
+ config.gem.development_dependencies << [dep.name, dep.requirements_list].flatten
354
+ end
355
+
356
+ [:signing_key, :cert_chain, :post_install_message, :licenses].each { |key|
357
+ value = spec.send(key)
358
+ next if value.nil? or value.empty?
359
+ config.gem.extras[key] = value
360
+ }
361
+
362
+ nil
363
+ end
364
+
365
+ # This method is stolen from the Bundler gem. It loads the gemspec from a
366
+ # file if available.
367
+ #
368
+ def load_gemspec( filename )
369
+ path = Pathname.new(filename)
370
+ # Eval the gemspec from its parent directory
371
+ Dir.chdir(path.dirname) do
372
+ begin
373
+ Gem::Specification.from_yaml(path.basename)
374
+ # Raises ArgumentError if the file is not valid YAML
375
+ rescue ArgumentError, SyntaxError, Gem::EndOfYAMLException, Gem::Exception
376
+ begin
377
+ eval(File.read(path.basename), TOPLEVEL_BINDING, path.expand_path.to_s)
378
+ rescue LoadError => e
379
+ original_line = e.backtrace.find { |line| line.include?(path.to_s) }
380
+ msg = "There was a LoadError while evaluating #{path.basename}:\n #{e.message}"
381
+ msg << " from\n #{original_line}" if original_line
382
+ msg << "\n"
383
+
384
+ if RUBY_VERSION >= "1.9.0"
385
+ msg << "\nDoes it try to require a relative path? That doesn't work in Ruby 1.9."
386
+ end
387
+
388
+ raise GemspecError, msg
389
+ end
390
+ end
391
+ end
392
+ end
393
+
291
394
  end # Bones::Plugins::Gem
292
395
 
293
- # EOF
@@ -1,5 +1,11 @@
1
1
 
2
- require 'rake/rdoctask'
2
+ # since RDoc v 2.4.2 has RDoc::Task to replace Rake::RDoctask
3
+ begin
4
+ gem 'rdoc'
5
+ require 'rdoc/task'
6
+ rescue LoadError
7
+ require 'rake/rdoctask'
8
+ end
3
9
 
4
10
  module Bones::Plugins::Rdoc
5
11
  include ::Bones::Helpers
@@ -18,7 +24,7 @@ module Bones::Plugins::Rdoc
18
24
  will be converted in regular expressions.
19
25
  __
20
26
 
21
- exclude %w(extconf\.rb$), :desc => <<-__
27
+ exclude %w(extconf\.rb$ ^version.txt), :desc => <<-__
22
28
  An array of patterns that will be used to exclude files from rdoc
23
29
  processing. This is an array of strings that will be converted in
24
30
  regular expressions.
@@ -43,31 +49,44 @@ module Bones::Plugins::Rdoc
43
49
  config.rdoc.main ||= config.readme_file
44
50
  end
45
51
 
52
+ def rdoc_config(rd, config)
53
+ rdoc = config.rdoc
54
+ incl = Regexp.new(rdoc.include.join('|'))
55
+ excl = Regexp.new(rdoc.exclude.join('|'))
56
+ files = config.gem.files.find_all do |fn|
57
+ case fn
58
+ when excl; false
59
+ when incl; true
60
+ else false end
61
+ end
62
+ title = "#{config.name}-#{config.version} Documentation"
63
+ rd.main = rdoc.main
64
+ rd.rdoc_dir = rdoc.dir
65
+
66
+ rd.rdoc_files.push(*files)
67
+
68
+ if rd.class == RDoc::Task
69
+ rd.title = title
70
+ else
71
+ rd.options << "-t #{title}"
72
+ end
73
+
74
+ rd.options.concat(rdoc.opts)
75
+ end
76
+
46
77
  def define_tasks
47
78
  config = ::Bones.config
48
79
 
49
80
  namespace :doc do
50
81
  desc 'Generate RDoc documentation'
51
- Rake::RDocTask.new do |rd|
52
- rdoc = config.rdoc
53
- rd.main = rdoc.main
54
- rd.rdoc_dir = rdoc.dir
55
-
56
- incl = Regexp.new(rdoc.include.join('|'))
57
- excl = Regexp.new(rdoc.exclude.join('|'))
58
- files = config.gem.files.find_all do |fn|
59
- case fn
60
- when excl; false
61
- when incl; true
62
- else false end
63
- end
64
- rd.rdoc_files.push(*files)
65
-
66
- title = "#{config.name}-#{config.version} Documentation"
67
-
68
- rd.options << "-t #{title}"
69
- rd.options.concat(rdoc.opts)
82
+
83
+ # rdoc-2.4.2
84
+ begin
85
+ rd = RDoc::Task.new
86
+ rescue NameError
87
+ rd = Rake::RDoctask.new
70
88
  end
89
+ rdoc_config(rd,config)
71
90
 
72
91
  desc 'Generate ri locally for testing'
73
92
  task :ri => :clobber_ri do
@@ -92,4 +111,3 @@ module Bones::Plugins::Rdoc
92
111
 
93
112
  end # module Bones::Plugins::Rdoc
94
113
 
95
- # EOF
@@ -87,8 +87,7 @@ describe Bones::App::FileManager do
87
87
  it "should perform ERb templating on '.bns' files" do
88
88
  @fm.source = Bones.path(%w[spec data default])
89
89
  @fm.destination = Bones.path(%w[spec data bar])
90
- @fm.copy
91
- @fm.finalize('foo_bar')
90
+ @fm.template('foo_bar')
92
91
 
93
92
  dir = @fm.destination
94
93
  test(?e, File.join(dir, 'Rakefile.bns')).should == false
@@ -114,8 +113,7 @@ end
114
113
  it "preserves the executable status of .bns files" do
115
114
  @fm.source = Bones.path(%w[spec data default])
116
115
  @fm.destination = Bones.path(%w[spec data bar])
117
- @fm.copy
118
- @fm.finalize('foo_bar')
116
+ @fm.template('foo_bar')
119
117
 
120
118
  dir = @fm.destination
121
119
  test(?e, File.join(dir, 'bin/foo_bar')).should == true
@@ -74,7 +74,7 @@ describe Bones::App do
74
74
 
75
75
  it 'should report an error for unrecognized commands' do
76
76
  lambda {@app.run %w[foo]}.should raise_error(SystemExit)
77
- @err.readline.should == 'ERROR: While executing bones ...'
77
+ @err.readline.should == "\e[37m\e[41mERROR\e[0m: While executing bones ..."
78
78
  @err.readline.should == ' Unknown command "foo"'
79
79
  end
80
80
 
data/version.txt CHANGED
@@ -1 +1 @@
1
- 3.5.5
1
+ 3.6.0
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bones
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
- - 5
9
- - 5
10
- version: 3.5.5
8
+ - 6
9
+ - 0
10
+ version: 3.6.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tim Pease
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-10 00:00:00 -07:00
18
+ date: 2011-01-22 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -114,9 +114,9 @@ extra_rdoc_files:
114
114
  - README.rdoc
115
115
  - bin/bones
116
116
  - default/version.txt
117
+ - gem-development.txt
117
118
  - spec/data/markdown.txt
118
119
  - spec/data/rdoc.txt
119
- - version.txt
120
120
  files:
121
121
  - .autotest
122
122
  - History.txt
@@ -133,6 +133,7 @@ files:
133
133
  - default/spec/spec_helper.rb.bns
134
134
  - default/test/test_NAME.rb
135
135
  - default/version.txt
136
+ - gem-development.txt
136
137
  - lib/bones.rb
137
138
  - lib/bones/annotation_extractor.rb
138
139
  - lib/bones/app.rb