bones 3.5.5 → 3.6.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/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