hen 0.0.6.166 → 0.0.6.183

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/Rakefile CHANGED
@@ -13,6 +13,6 @@ Hen.lay! {{
13
13
  "helper that fits my own personal style.",
14
14
  :files => FileList['lib/**/*.rb', 'bin/*'].to_a,
15
15
  :extra_files => FileList['[A-Z]*', 'lib/hens/*.rake', 'example/*', 'example/.henrc'].to_a,
16
- :dependencies => ['rubyforge', ['ruby-nuggets', '>= 0.0.3']]
16
+ :dependencies => ['rubyforge', ['ruby-nuggets', '>= 0.0.4']]
17
17
  }
18
18
  }}
data/bin/hen CHANGED
@@ -28,7 +28,10 @@
28
28
  ###############################################################################
29
29
  #++
30
30
 
31
- # TODO: Add 'list' - List available hens with their tasks (?)
31
+ # TODO: Implement 'list' action -- List available hens with their tasks (?)
32
+
33
+ require 'rubygems'
34
+ require 'nuggets/enumerable/minmax'
32
35
 
33
36
  $: << File.join(File.dirname(__FILE__), '..', 'lib')
34
37
 
@@ -38,13 +41,17 @@ require 'hen/cli'
38
41
  include Hen::CLI
39
42
 
40
43
  ACTIONS = {
41
- 'config' => 'Create a fresh .henrc file',
42
- 'create' => 'Create a new project directory tree',
43
- 'list' => 'List available hens with their tasks'
44
+ 'config' => 'Create a fresh .henrc file',
45
+ 'create' => [
46
+ 'Create a new project directory tree',
47
+ 'Arguments: path [sample-skeleton]'
48
+ ],
49
+ 'list' => 'List available hens with their tasks',
50
+ 'version' => 'Display version number'
44
51
  }
45
52
 
46
53
  USAGE = <<EOT
47
- Usage: #{$0} {#{ACTIONS.keys.sort.join('|')}}
54
+ Usage: #{$0} {#{ACTIONS.keys.sort.join('|')}} [action-arguments]
48
55
  #{$0} [-h|--help]
49
56
  EOT
50
57
 
@@ -58,27 +65,29 @@ case action = ARGV.shift
58
65
  puts
59
66
  puts 'Actions:'
60
67
 
61
- m = ACTIONS.keys.map { |a| a.length }.max
68
+ max = ACTIONS.keys.max(:length)
69
+
70
+ ACTIONS.sort.each { |act, desc|
71
+ desc = [*desc]
72
+ puts " %-#{max}s - %s" % [act, desc.shift]
62
73
 
63
- ACTIONS.sort.each { |a, d|
64
- puts " %-#{m}s - %s" % [a, d]
74
+ desc.each { |extra|
75
+ puts " %#{max}s + %s" % [' ', extra]
76
+ }
65
77
  }
78
+ when 'version', '--version'
79
+ puts "hen v#{Hen::VERSION}"
66
80
  when 'config'
67
- henrc = File.join(EXAMPLE, '.henrc')
68
-
69
- # TODO: DRY up with lib/hen.rb
70
- target = File.join(ENV['HOME'] || File.expand_path('~'), '.henrc')
71
-
72
- render(henrc, target)
81
+ render(File.join(EXAMPLE, '.henrc'), henrc = Hen.henrc(false))
73
82
 
74
83
  puts
75
- puts "Your .henrc has been created: #{target}. Modify to your needs."
84
+ puts "Your .henrc has been created: #{henrc}. Now modify it to your needs."
76
85
  when 'create'
77
86
  path = File.expand_path(ARGV.shift)
78
87
  abort 'Path argument missing!' unless path
79
88
 
80
- template = File.join(EXAMPLE, 'project')
81
- abort "Sample project tree not found: #{template}" unless File.directory?(template)
89
+ skel = ARGV.shift || File.join(EXAMPLE, 'project')
90
+ abort "Sample project tree not found: #{skel}" unless File.directory?(skel)
82
91
 
83
92
  if File.directory?(path)
84
93
  abort "Target directory already exists: #{path}. Won't touch."
@@ -87,15 +96,17 @@ case action = ARGV.shift
87
96
  end
88
97
 
89
98
  # Parts to be replaced by the user
90
- replacements = {}
99
+ replace = {}
91
100
 
92
101
  begin
93
102
  # Keep track of what's been created
94
103
  created = [path]
95
104
 
96
- progname = ask!("Program's name")
105
+ # We need the name here so ask for it already. Additionally, it's
106
+ # a good opportunity to make sure the user's .henrc is available.
107
+ progname = ask!("Program's name", true)
97
108
 
98
- Dir.chdir(template) {
109
+ Dir.chdir(skel) {
99
110
  Dir['**/*'].each { |sample|
100
111
  target = File.join(path, sample.gsub(/__progname__/, progname))
101
112
  created << target
@@ -103,8 +114,7 @@ case action = ARGV.shift
103
114
  if File.directory?(sample)
104
115
  Dir.mkdir(target)
105
116
  else
106
- content = render(sample, target)
107
- replacements[target] = content.scan(/### .* ###/)
117
+ replace[target] = render(sample, target).scan(/### .* ###/)
108
118
  end
109
119
  }
110
120
  }
@@ -113,25 +123,28 @@ case action = ARGV.shift
113
123
  created.clear
114
124
  ensure
115
125
  # In case of an exception or premature program exit: Clean up!
116
- created.reverse.each { |target|
117
- (File.directory?(target) ? Dir : File).unlink(target)
126
+ created.reverse.each { |p|
127
+ (File.directory?(p) ? Dir : File).unlink(p) if File.readable?(p)
118
128
  }
119
129
  end
120
130
 
121
131
  puts
122
- puts "Your new project directory has been created: #{path}"
132
+ puts "Your new project directory has been created: #{path}. Have fun!"
123
133
 
124
- replacements.each { |target, parts|
125
- next if parts.empty?
134
+ replace.each { |target, details|
135
+ next if details.empty?
126
136
 
127
137
  puts
128
138
  puts "#{target}:"
129
139
 
130
- parts.each { |part|
131
- puts " #{part}"
140
+ details.each { |detail|
141
+ puts " #{detail}"
132
142
  }
133
143
  }
134
144
  when 'list'
145
+ # How to achieve? Has to list *all* hens and tasks made available therein,
146
+ # *regardless* of any missing prerequisites (preferably indicating whether
147
+ # a particular hen/task is currently available).
135
148
  abort 'Sorry, not yet available...'
136
149
  else
137
150
  abort "Illegal action: #{action}\n#{USAGE}"
data/lib/hen.rb CHANGED
@@ -93,7 +93,13 @@ class Hen
93
93
  # Execute each hen definition
94
94
  hens.each { |name, hen|
95
95
  # Load any dependencies, in case they're not included yet
96
- load_hens(*hen.dependencies)
96
+ begin
97
+ load_hens(*hen.dependencies)
98
+ rescue LoadError => err
99
+ warn "#{name}: Required dependency missing: " <<
100
+ File.basename(err.to_s, '.rake') if verbose
101
+ next
102
+ end
97
103
 
98
104
  hen.lay!
99
105
  }
@@ -124,19 +130,8 @@ class Hen
124
130
  # henrc => aString
125
131
  #
126
132
  # The path to the user's .henrc
127
- def henrc
128
- @henrc ||= if henrc = ENV['HENRC']
129
- abort "The specified .henrc file could not be found: #{henrc}" \
130
- unless File.readable?(henrc)
131
-
132
- henrc
133
- else
134
- RCDIRS.find { |path|
135
- henrc = File.join(path, '.henrc')
136
- break henrc if File.readable?(henrc)
137
- } or abort "No .henrc file could be found! Please " <<
138
- "create one first by running 'hen config'."
139
- end
133
+ def henrc(must_exist = true)
134
+ @henrc ||= find_henrc(must_exist)
140
135
  end
141
136
 
142
137
  # call-seq:
@@ -149,10 +144,9 @@ class Hen
149
144
  #
150
145
  # Example:
151
146
  # config('a/b/c') #=> @config[:a][:b][:c]
152
- def config(key = default = Object.new)
147
+ def config(key = nil)
153
148
  @config ||= YAML.load_file(henrc)
154
-
155
- return @config if key == default
149
+ return @config unless key
156
150
 
157
151
  key.split('/').inject(@config) { |value, k|
158
152
  value.fetch(k.to_sym)
@@ -162,6 +156,29 @@ class Hen
162
156
 
163
157
  private
164
158
 
159
+ # call-seq:
160
+ # find_henrc(must_exist = true) => aString
161
+ #
162
+ # Search for a readable .henrc, or, if +must_exist+ is false, just return a
163
+ # suitable default location.
164
+ def find_henrc(must_exist = true)
165
+ return ENV['HENRC'] || File.join(RCDIRS.last, '.henrc') unless must_exist
166
+
167
+ if henrc = ENV['HENRC']
168
+ abort "The specified .henrc file could not be found: #{henrc}" \
169
+ unless File.readable?(henrc)
170
+ elsif henrc = RCDIRS.find { |p|
171
+ h = File.join(p, '.henrc')
172
+ break h if File.readable?(h)
173
+ }
174
+ else
175
+ abort "No .henrc file could be found! Please " <<
176
+ "create one first by running 'hen config'."
177
+ end
178
+
179
+ henrc
180
+ end
181
+
165
182
  # call-seq:
166
183
  # load_hens(*hens)
167
184
  # load_hens(*hens) { |hen_name| ... }
@@ -40,17 +40,17 @@ module Hen::CLI
40
40
 
41
41
  # Ask the user to enter an appropriate value for +key+. Uses
42
42
  # already stored answer if present, unless +cached+ is false.
43
- def ask(key, config_key = false, cached = true)
43
+ def ask(key, config_key = nil, cached = true)
44
44
  @@values[key] = nil unless cached
45
45
 
46
- @@values[key] ||=
47
- Hen.config(config_key) || original_ask("Please enter your #{key}: ")
46
+ @@values[key] ||= config_key && Hen.config(config_key) ||
47
+ original_ask("Please enter your #{key}: ")
48
48
  rescue Interrupt
49
49
  abort ''
50
50
  end
51
51
 
52
- # Same as ask, but requires a non-empty value to be entered.
53
- def ask!(key, config_key = false)
52
+ # Same as #ask, but requires a non-empty value to be entered.
53
+ def ask!(key, config_key = nil)
54
54
  msg = "#{key} is required! Please enter a non-empty value."
55
55
  max = 3
56
56
 
@@ -73,7 +73,7 @@ class Hen
73
73
  # Prepare the use of Rubyforge, optionally logging in right away.
74
74
  # Returns the RubyForge object.
75
75
  def init_rubyforge(login = true)
76
- require 'rubyforge'
76
+ require_rubyforge
77
77
 
78
78
  rf = RubyForge.new
79
79
  rf.login if login
@@ -90,12 +90,12 @@ class Hen
90
90
  rf_project = rf_config[:project]
91
91
 
92
92
  raise 'Skipping Rubyforge tasks' if rf_project.nil? || rf_project.empty?
93
- raise LocalJumpError, 'no block given' unless block
94
93
 
95
- require 'rubyforge'
94
+ require_rubyforge
96
95
 
97
- block_args = [rf_config]
96
+ raise LocalJumpError, 'no block given' unless block
98
97
 
98
+ block_args = [rf_config]
99
99
  block_args << lambda { |*args|
100
100
  init_rubyforge(args.empty? || args.first)
101
101
  } if block.arity > 1
@@ -103,6 +103,18 @@ class Hen
103
103
  block[*block_args]
104
104
  end
105
105
 
106
+ private
107
+
108
+ # Loads the Rubyforge library, giving a
109
+ # nicer error message if it's not found.
110
+ def require_rubyforge
111
+ begin
112
+ require 'rubyforge'
113
+ rescue LoadError
114
+ raise "Please install the 'rubyforge' gem first."
115
+ end
116
+ end
117
+
106
118
  end
107
119
 
108
120
  end
@@ -1,5 +1,7 @@
1
- # Use RDOC_OPTIONS from 'rdoc.rake'
2
1
  Hen :gem => :rdoc do
2
+ # Dependencies:
3
+ # * rdoc -- Uses RDOC_OPTIONS and 'publish_docs' task
4
+
3
5
  require 'rake/gempackagetask'
4
6
 
5
7
  gem_options = config[:gem]
@@ -68,7 +70,7 @@ Hen :gem => :rdoc do
68
70
  }
69
71
 
70
72
  desc 'Display the gem specification'
71
- task :debug_gem do
73
+ task :gemspec do
72
74
  puts gem_spec.to_ruby
73
75
  end
74
76
 
@@ -1,4 +1,5 @@
1
1
  Hen :rdoc do
2
+
2
3
  require 'rake/rdoctask'
3
4
 
4
5
  rdoc_options = config[:rdoc]
@@ -1,4 +1,5 @@
1
1
  Hen :spec do
2
+
2
3
  require 'spec/rake/spectask'
3
4
 
4
5
  spec_options = config[:spec]
@@ -15,4 +16,5 @@ Hen :spec do
15
16
  }.compact.flatten
16
17
  }
17
18
  end
19
+
18
20
  end
@@ -1,4 +1,5 @@
1
1
  Hen :test do
2
+
2
3
  require 'rake/testtask'
3
4
 
4
5
  test_options = config[:test]
@@ -15,4 +16,5 @@ Hen :test do
15
16
  }
16
17
  }
17
18
  end
19
+
18
20
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6.166
4
+ version: 0.0.6.183
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Wille
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-01-09 00:00:00 +01:00
12
+ date: 2008-01-21 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -28,7 +28,7 @@ dependencies:
28
28
  requirements:
29
29
  - - ">="
30
30
  - !ruby/object:Gem::Version
31
- version: 0.0.3
31
+ version: 0.0.4
32
32
  version:
33
33
  description: Hoe or Echoe? No, thanks! Just a Rake helper that fits my own personal style.
34
34
  email: jens.wille@uni-koeln.de
@@ -60,15 +60,15 @@ has_rdoc: true
60
60
  homepage: http://prometheus.rubyforge.org/hen
61
61
  post_install_message:
62
62
  rdoc_options:
63
+ - --inline-source
64
+ - --charset
65
+ - UTF-8
63
66
  - --title
64
67
  - hen Application documentation
65
68
  - --all
66
- - --line-numbers
67
- - --inline-source
68
69
  - --main
69
70
  - README
70
- - --charset
71
- - UTF-8
71
+ - --line-numbers
72
72
  require_paths:
73
73
  - lib
74
74
  required_ruby_version: !ruby/object:Gem::Requirement