prigner 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/CHANGELOG +29 -0
  2. data/README.rdoc +32 -42
  3. data/Rakefile +12 -8
  4. data/lib/prigner/builder.rb +8 -3
  5. data/lib/prigner/cli/new.rb +30 -8
  6. data/lib/prigner/cli.rb +1 -2
  7. data/lib/prigner/extensions.rb +14 -2
  8. data/lib/prigner/template.rb +31 -7
  9. data/lib/prigner.rb +2 -2
  10. data/prigner.gemspec +14 -5
  11. data/share/templates/bash/default/models/script.sh +45 -0
  12. data/share/templates/bash/default/models/scriptrc +2 -0
  13. data/share/templates/bash/default/specfile +18 -0
  14. data/share/templates/ruby/default/models/executable +23 -0
  15. data/share/templates/ruby/default/models/testhelper.rb +23 -0
  16. data/share/templates/ruby/default/specfile +20 -4
  17. data/share/templates/ruby/gem/models/README.rdoc +4 -0
  18. data/share/templates/ruby/gem/models/Rakefile +81 -148
  19. data/share/templates/ruby/gem/models/cli.rb +43 -0
  20. data/share/templates/ruby/gem/models/executable +23 -0
  21. data/share/templates/ruby/gem/models/gemspec +10 -8
  22. data/share/templates/ruby/gem/models/module.rb +24 -9
  23. data/share/templates/ruby/gem/models/testhelper.rb +23 -0
  24. data/share/templates/ruby/gem/specfile +20 -8
  25. data/test/builder_test.rb +15 -0
  26. data/test/fixtures/templates/shared/templates/ruby/default/models/cli.rb +0 -0
  27. data/test/fixtures/templates/shared/templates/ruby/default/models/executable +23 -0
  28. data/test/fixtures/templates/shared/templates/ruby/default/models/testhelper.rb +0 -0
  29. data/test/fixtures/templates/shared/templates/ruby/default/specfile +21 -9
  30. data/test/helpers.rb +8 -8
  31. data/test/spec_test.rb +18 -4
  32. data/test/template_test.rb +21 -6
  33. metadata +19 -10
  34. data/share/templates/ruby/gem/models/README.mkd +0 -5
  35. data/share/templates/ruby/gem/models/empty_test.rb +0 -16
  36. data/test/fixtures/templates/shared/templates/ruby/default/README.mkd +0 -2
data/CHANGELOG CHANGED
@@ -1,5 +1,34 @@
1
1
  = Prigner v0.1.1 (2010-10-21) - Changelog
2
2
 
3
+ == 2010-10-27
4
+
5
+ * Releasing of version 0.2.0.
6
+ * Adding of template for Bash script.
7
+ * Fixes in error of the emtpy directories.
8
+ * Updates in shared templates.
9
+
10
+ == 2010-10-26
11
+
12
+ * Adjustments in CLI command.
13
+ * The 'new' command has been updated for handling of optional files.
14
+ * Small fixes in CLI module.
15
+
16
+ == 2010-10-25
17
+
18
+ * Fixes in the parsing of optional files.
19
+
20
+ == 2010-10-24
21
+
22
+ * Adding of optional models.
23
+ * Each option can include the itself list of models.
24
+ * Enhancements in library for handle the optional models.
25
+ * More core extensions.
26
+
27
+ == 2010-10-22
28
+
29
+ * Fixes in the tasks for releasing of packages.
30
+ * Checking of the tagged current version.
31
+
3
32
  == 2010-10-21
4
33
 
5
34
  * Releasing of version 0.1.1.
data/README.rdoc CHANGED
@@ -7,14 +7,13 @@ short, a project template engine.
7
7
 
8
8
  == Features
9
9
 
10
- * Load and create all directories and files from templates.
10
+ * Load and create all directories and files from template specification.
11
+ * The template specification is parsed to command line options.
11
12
  * Default Ruby project templates.
12
13
  * Ruby Gem.
13
14
  * A simple project using setup.
14
- * Script file with or without directory structure.
15
15
  * Add common tasks and libraries.
16
16
  * Tests.
17
- * Deploy.
18
17
  * Code for versioning.
19
18
 
20
19
  == Installation
@@ -23,6 +22,10 @@ First, install Prigner stable through Gem:
23
22
 
24
23
  gem install prigner
25
24
 
25
+ If you want try the developer source:
26
+
27
+ git clone http://github.com/codigorama/prigner.git
28
+
26
29
  == Usage
27
30
 
28
31
  Prigner create the most common Ruby projects through templates shared. To
@@ -30,55 +33,42 @@ generate new Gem project, run command using the following syntax:
30
33
 
31
34
  prign new ruby:gem foo
32
35
 
33
- foo
34
- |-- CHANGELOG
35
- |-- COPYRIGHT
36
- |-- README.mkd
37
- |-- Rakefile
38
- |-- bin
39
- | `-- foo
40
- |-- foo.gemspec
41
- |-- lib
42
- | |-- foo
36
+ foo/
37
+ |-- lib/
38
+ | |-- foo/
43
39
  | `-- foo.rb
44
- `-- test
45
- |-- fixtures
46
- |-- foo_test.rb
47
- `-- helper.rb
48
-
49
- This command will generate 'foo' Gem project structure. Or, you maybe create a
50
- Ruby script or a UNIX-like program.
51
-
52
- prign new bash:script bar
53
-
54
- bar
55
- |-- bar
56
- `-- barrc
40
+ |-- CHANGELOG
41
+ |-- COPYING
42
+ `-- README.rdoc
57
43
 
58
- prign new bash:program ducklet
44
+ This command will generate 'foo' Gem project structure. But all templates
45
+ offers options.
59
46
 
60
- ducklet
61
- |-- bin
62
- | `-- ducklet
63
- `-- etc
64
- `-- duckletrc
47
+ prign new ruby:gem --test --bin
65
48
 
66
- == Templates
49
+ foo/
50
+ |-- bin/
51
+ | `-- foo
52
+ |-- lib/
53
+ | |-- foo/
54
+ | `-- foo.rb
55
+ |-- test/
56
+ | |-- foo_test.rb
57
+ | `-- helper.rb
58
+ |-- CHANGELOG
59
+ |-- COPYING
60
+ `-- README.rdoc
67
61
 
68
- Prigner offer the following templates:
62
+ Run <tt>prign list</tt> to view all available templates.
69
63
 
70
- * Ruby
71
- * Default project based only library directory and common files as
72
- README.rdoc, CHANGELOG
73
- * Gem project that include library directory, main module, test and
74
- directories for fixtures.
75
- * Sinatra basic application.
64
+ You can creates your own templates. Just save in your home directory
65
+ <tt>~/.prigner/templates/<your-template></tt>.
76
66
 
77
67
  == Copyright
78
68
 
79
- Written by [Hallison Batista](http://github.com/hallison).
69
+ Written by {Hallison Batista}[http://github.com/hallison].
80
70
 
81
- Prigner is Copyright (C) 2010, [Codigorama](http://codigorama.com).
71
+ Prigner is Copyright (C) 2010, {Codigorama}[http://codigorama.com].
82
72
 
83
73
  See COPYRIGHT file for more information about license.
84
74
 
data/Rakefile CHANGED
@@ -74,10 +74,9 @@ end
74
74
  # Documentation
75
75
  # =============================================================================
76
76
 
77
- CLOBBER << FileList["doc/*"]
77
+ CLOBBER << FileList["doc/api/*"]
78
78
 
79
79
  file "doc/api/index.html" => FileList["lib/**/*.rb", "README.rdoc", "CHANGELOG"] do |filespec|
80
- rm_rf "doc"
81
80
  rdoc "--op", "doc/api",
82
81
  "--charset", "utf8",
83
82
  "--main", "'Prigner'",
@@ -159,7 +158,10 @@ end
159
158
  CLOBBER << FileList["#{package_path.dirname}/*"]
160
159
 
161
160
  task :tagged do
162
- abort "The version #{version.tag} is not tagged, yet." unless tag[1..-1] == version.tag
161
+ abort "The gemspec not updated to version #{version.tag} (#{spec.version})" \
162
+ unless spec.version.to_s == version.tag
163
+ abort "The version #{version.tag} is not tagged." \
164
+ unless tag[1..-1] == version.tag
163
165
  end
164
166
 
165
167
  file specfile => FileList["{bin,lib,test}/**", "Rakefile"] do
@@ -202,13 +204,15 @@ task :package => [package(".gem"), package(".tar.gz")]
202
204
  desc "Release gem package to repositories."
203
205
  task :release => [ :tagged, :package ] do
204
206
  sh "gem push #{package('.gem')}"
205
- { :release => ".gem", :file => ".tar.gz" }.each do |file, ext|
206
- sh "rubyforge add_#{file}",
207
- "#{spec.rubyforge_project}",
208
- "#{spec.name} #{spec.version} #{package(ext)}"
207
+ [%w[release .gem], %w[file .tar.gz]].each do |file, ext|
208
+ sh <<-endsh.gsub(/^[ ]{6}/,"")
209
+ rubyforge add_#{file} #{spec.rubyforge_project} #{spec.name} #{spec.version} #{package(ext)}
210
+ endsh
209
211
  end
210
212
  if release_notes.exist?
211
- sh "rubyforge add_news 'Prigner v#{spec.version} released' '#{release_notes.read}'"
213
+ sh <<-endsh.gsub(/^[ ]{6}/,"")
214
+ rubyforge post_news #{spec.rubyforge_project} 'Prigner v#{spec.version} released' '#{release_notes.read}'
215
+ endsh
212
216
  end
213
217
  end
214
218
 
@@ -31,15 +31,20 @@ class Prigner::Builder
31
31
  end
32
32
  end
33
33
 
34
- def make_project_files #:yields: path, info
35
- @template.models.inject({}) do |hash, (model, basename)|
34
+ def make_project_files(option = :required) #:yields: path, info
35
+ @template.models[option.to_sym].inject({}) do |hash, (model, basename)|
36
36
  file = basename.gsub(/\((.*?)\)/){ project.send($1) }
37
37
  path = File.join(@project.path, file)
38
38
  model.binder = Prigner::Binder.new(@project, @template.options)
39
39
  model.write(path)
40
40
  hash[no_pwd(model.file_written)] = File.stat(model.file_written)
41
41
  hash
42
- end
42
+ end if @template.models.has_key?(option.to_sym)
43
+ end
44
+
45
+ def make_project_files_for_option(option)
46
+ @template.initialize_models_for_option(option)
47
+ self.make_project_files(option)
43
48
  end
44
49
 
45
50
  private
@@ -21,17 +21,20 @@ begin
21
21
 
22
22
  end_banner
23
23
 
24
- unless ARGV.empty?
25
- arguments.parse!
26
-
24
+ unless ARGV.empty? or ARGV[0] =~ /^-.*?/
27
25
  name = ARGV.shift
28
26
 
29
- template = Prigner::Template.load(*name.split(":"))
30
-
31
- if template
27
+ if template = Prigner::Template.load(*name.split(":"))
32
28
  arguments.banner = <<-end_banner.gsub /^[ ]{10}/, ''
33
29
  #{Prigner::Version}
34
30
 
31
+ Template:
32
+ #{template.mask} v#{template.spec.version}
33
+
34
+ #{template.spec.description}
35
+
36
+ Written by #{template.spec.author} <#{template.spec.email}>.
37
+
35
38
  Usage:
36
39
  #{program} #{command} #{template.mask} <path> [options]
37
40
 
@@ -51,6 +54,9 @@ begin
51
54
  else
52
55
  raise RuntimeError, "unable to load template '#{name}'"
53
56
  end
57
+
58
+ arguments.parse!
59
+
54
60
  end
55
61
 
56
62
  path = unless ARGV.empty?
@@ -82,12 +88,28 @@ begin
82
88
 
83
89
  status.start "Creating directories" do
84
90
  builder.make_project_directories
85
- end
91
+ end unless builder.template.directories.empty?
86
92
 
87
- status.start "Writing files" do
93
+ status.start "Writing required files" do
88
94
  builder.make_project_files
89
95
  end
90
96
 
97
+ options_used = []
98
+ template.options.members.each do |optname|
99
+ option = template.options[optname]
100
+ if option.enabled and option.files.size > 0
101
+ builder.make_project_files_for_option(optname)
102
+ options_used << optname
103
+ end
104
+ end if template.options
105
+
106
+ for optional in options_used
107
+ status.start "Writing #{optional} files" do
108
+ builder.make_project_files_for_option(optional)
109
+ end
110
+ end
111
+
112
+
91
113
  end
92
114
 
93
115
  rescue => error
data/lib/prigner/cli.rb CHANGED
@@ -39,8 +39,7 @@ module Prigner::CLI
39
39
  def self.run(*args)
40
40
  command = args.shift if commands.include? args.first
41
41
  raise RuntimeError, "unknown command '#{args.first}'" unless command
42
- rubyopt = "-I#{Prigner::ROOT}/lib"
43
- exec ruby, rubyopt, source(command), *args
42
+ exec ruby, source(command), *args
44
43
  end
45
44
 
46
45
  class Status
@@ -9,8 +9,6 @@ end
9
9
 
10
10
  class Hash
11
11
 
12
- alias has? has_key?
13
-
14
12
  # Only symbolize all keys, including all key in sub-hashes.
15
13
  def symbolize_keys
16
14
  return self.clone if self.empty?
@@ -58,6 +56,8 @@ class Struct
58
56
  end
59
57
 
60
58
  class Pathname
59
+
60
+ # For compatibilities with Net::HTTP.get method.
61
61
  def get(file)
62
62
  result = self.join(file.gsub(/^\/(.*?)$/){$1})
63
63
  def result.to_s
@@ -66,17 +66,29 @@ class Pathname
66
66
  result
67
67
  end
68
68
 
69
+ # For compatibilities with the Net::HTTPResponse.read_body method.
69
70
  alias read_body read
70
71
 
72
+ # For compatibilities with the Net::HTTP.address method.
71
73
  alias address expand_path
72
74
 
75
+ # For compatibilities with the Net::HTTP.port method.
73
76
  def port
74
77
  nil
75
78
  end
76
79
 
80
+ # For compatibilities with the Net::HTTP.start method.
77
81
  def start
78
82
  block_given? ? (yield self) : self
79
83
  end
80
84
 
81
85
  end
82
86
 
87
+ class NilClass
88
+
89
+ # nil is empty? of course!
90
+ def empty?
91
+ true
92
+ end
93
+
94
+ end
@@ -15,6 +15,8 @@
15
15
  # project using +specfile+.
16
16
  class Prigner::Template
17
17
 
18
+ Option = Struct.new(:enabled, :description, :files)
19
+
18
20
  # Namespace of template.
19
21
  attr_reader :namespace
20
22
 
@@ -52,7 +54,7 @@ class Prigner::Template
52
54
  initialize_options
53
55
  initialize_directories
54
56
  initialize_models
55
- rescue Exception => error
57
+ rescue Errno::ENOENT => error
56
58
  raise RuntimeError, error.message
57
59
  end
58
60
 
@@ -90,6 +92,14 @@ class Prigner::Template
90
92
  end
91
93
  end
92
94
 
95
+ # If the option has list of files, then initialize all models.
96
+ def initialize_models_for_option(optname)
97
+ option = optname.to_sym
98
+ unless @options[option].files.empty?
99
+ @models[option] = parse_models(@options[option].files)
100
+ end
101
+ end
102
+
93
103
  private
94
104
 
95
105
  # Return the specfile placed in template path.
@@ -102,24 +112,38 @@ class Prigner::Template
102
112
  @spec = Prigner::Spec.load(specfile)
103
113
  end
104
114
 
105
- # Initialize options.
115
+ # The "+options+" attribute is a Hash that contains a list of the Option
116
+ # structure.
106
117
  def initialize_options
107
- @options = @spec.options.inject({}) do |options, (name, desc)|
108
- options[name] = { :enabled => nil, :description => desc }
118
+ @options = @spec.options.inject({}) do |options, (name, params)|
119
+ options[name] = Option.new
120
+ options[name].enabled = false
121
+ options[name].description = params["description"] || params
122
+ options[name].files = params["files"] || {}
109
123
  options
110
124
  end.to_struct if @spec.options
111
125
  end
112
126
 
113
127
  def initialize_directories
114
- @directories = @spec.directories
128
+ @directories = @spec.directories || []
115
129
  end
116
130
 
131
+ # All models are listed by a Hash and are indexed by "+required+" key and the
132
+ # option names.
117
133
  def initialize_models
118
- @models = @spec.files.inject({}) do |models, (source, file)|
134
+ @models = {}
135
+ @models[:required] = parse_models(@spec.files) if @spec.files
136
+ end
137
+
138
+ # Parses a Hash that contains a pair of the model file name and the result
139
+ # output name.
140
+ def parse_models(hash)
141
+ hash.inject({}) do |models, (source, file)|
119
142
  model = Prigner::Model.new(@path.join("models", source))
143
+ models ||= {}
120
144
  models[model] = file ? file : source
121
145
  models
122
- end if @spec.files
146
+ end
123
147
  end
124
148
 
125
149
  end
data/lib/prigner.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #@ ---
2
2
  #@ :timestamp: 2009-07-16 14:05:16 -04:00
3
- #@ :date: 2010-10-21
4
- #@ :tag: 0.1.1
3
+ #@ :date: 2010-10-27
4
+ #@ :tag: 0.2.0
5
5
  # encoding: UTF-8
6
6
 
7
7
  # Copyright (c) 2009, 2010, Hallison Batista
data/prigner.gemspec CHANGED
@@ -14,8 +14,8 @@ Gem::Specification.new do |spec|
14
14
  #
15
15
 
16
16
  #version
17
- spec.version = "0.1.1"
18
- spec.date = "2010-10-21"
17
+ spec.version = "0.2.0"
18
+ spec.date = "2010-10-27"
19
19
  #
20
20
 
21
21
  #dependencies
@@ -40,26 +40,35 @@ Gem::Specification.new do |spec|
40
40
  "lib/prigner/project.rb",
41
41
  "lib/prigner/template.rb",
42
42
  "prigner.gemspec",
43
+ "share/templates/bash/default/models/script.sh",
44
+ "share/templates/bash/default/models/scriptrc",
45
+ "share/templates/bash/default/specfile",
43
46
  "share/templates/ruby/default/models/CHANGELOG",
44
47
  "share/templates/ruby/default/models/COPYING",
45
48
  "share/templates/ruby/default/models/README.rdoc",
49
+ "share/templates/ruby/default/models/executable",
46
50
  "share/templates/ruby/default/models/module.rb",
51
+ "share/templates/ruby/default/models/testhelper.rb",
47
52
  "share/templates/ruby/default/specfile",
48
53
  "share/templates/ruby/gem/models/CHANGELOG",
49
54
  "share/templates/ruby/gem/models/COPYING",
50
- "share/templates/ruby/gem/models/README.mkd",
55
+ "share/templates/ruby/gem/models/README.rdoc",
51
56
  "share/templates/ruby/gem/models/Rakefile",
52
- "share/templates/ruby/gem/models/empty_test.rb",
57
+ "share/templates/ruby/gem/models/cli.rb",
58
+ "share/templates/ruby/gem/models/executable",
53
59
  "share/templates/ruby/gem/models/gemspec",
54
60
  "share/templates/ruby/gem/models/module.rb",
61
+ "share/templates/ruby/gem/models/testhelper.rb",
55
62
  "share/templates/ruby/gem/specfile",
56
63
  "test/builder_test.rb",
57
64
  "test/fixtures/model.rb.erb",
58
- "test/fixtures/templates/shared/templates/ruby/default/README.mkd",
59
65
  "test/fixtures/templates/shared/templates/ruby/default/models/README.mkd",
60
66
  "test/fixtures/templates/shared/templates/ruby/default/models/Rakefile",
67
+ "test/fixtures/templates/shared/templates/ruby/default/models/cli.rb",
61
68
  "test/fixtures/templates/shared/templates/ruby/default/models/empty_test.rb",
69
+ "test/fixtures/templates/shared/templates/ruby/default/models/executable",
62
70
  "test/fixtures/templates/shared/templates/ruby/default/models/module.rb",
71
+ "test/fixtures/templates/shared/templates/ruby/default/models/testhelper.rb",
63
72
  "test/fixtures/templates/shared/templates/ruby/default/specfile",
64
73
  "test/fixtures/templates/shared/templates/ruby/sinatra/models/README.mkd",
65
74
  "test/fixtures/templates/shared/templates/ruby/sinatra/models/Rakefile",
@@ -0,0 +1,45 @@
1
+ #!/bin/bash
2
+ #$ <%=project.name%> v0.1.0
3
+ #$
4
+ #$ Usage:
5
+ #$ <%=project.name%> [options] [args]
6
+ #$
7
+ #$ Options:
8
+ #$ -h,--help Show this message.
9
+ #$
10
+
11
+ function <%=project.name%> {
12
+ local path="${BASH_SOURCE%/*}/"
13
+
14
+ # This function show the message written in the header.
15
+ function __help {
16
+ local origin="$(1<${0})"
17
+ local comments="${origin}"
18
+
19
+ comments="${comments#\#!*\#\$}"
20
+ comments="${comments%\#\$*}"
21
+ comments="${comments//\#\$ }"
22
+ comments="${comments:1:${#comments}}"
23
+
24
+ test "${comments//\$}" != "${origin}" && echo "${comments//\#\$}"
25
+ }
26
+ function _h { __help; return 0; }
27
+
28
+ if [[ ${#} -eq 0 ]]; then
29
+ __help
30
+ exit 0
31
+ elif [[ ${1} =~ -.|-- ]]; then
32
+ source $path/<%=project.name%>rc
33
+
34
+ local option=""
35
+
36
+ [[ "${1}" =~ ^-.* ]] && option=${1//-/_}
37
+
38
+ shift 1
39
+
40
+ ${option} ${@}
41
+ fi
42
+
43
+ }
44
+
45
+ <%=project.name%> ${@}
@@ -0,0 +1,2 @@
1
+ # put the global variables in this file
2
+
@@ -0,0 +1,18 @@
1
+ author:
2
+ Hallison Batista
3
+ email:
4
+ hallison@codigorama.com
5
+ version:
6
+ 0.1.0
7
+ description:
8
+ A simple Bash script
9
+
10
+ options:
11
+
12
+ directories:
13
+
14
+ files:
15
+ script.sh: (project)
16
+ scriptrc: (project)rc
17
+
18
+ # vim: filetype=yaml
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+ require "<%=project.name%>"
5
+
6
+ ARGV.options do |args|
7
+
8
+ args.on "-s", "--set VALUE", String, "Set anything" do |anything|
9
+ puts "Setting anything to #{anything} ..."
10
+ end
11
+
12
+ args.on "-a", "--anything", TrueClass, "Do anything!" do |enabled|
13
+ puts "Enable to doing anything ..." if enabled
14
+ end
15
+
16
+ unless ARGV.empty?
17
+ args.parse!
18
+ else
19
+ puts args
20
+ exit 0
21
+ end
22
+
23
+ end
@@ -0,0 +1,23 @@
1
+ # This code extracted from book "Ruby Best Practices" and the code be found
2
+ # in http://github.com/sandal/rbp/blob/master/testing/test_unit_extensions.rb
3
+
4
+ TEST_HOME = File.expand_path(File.dirname(__FILE__)) unless defined? TEST_HOME
5
+ FIXTURES = File.join(TEST_HOME, "fixtures") unless defined? FIXTURES
6
+
7
+ module Test::Unit
8
+ class TestCase
9
+ def self.should(description, &block)
10
+ test_name = "test_#{description.gsub(/\s+/,'_')}".downcase.to_sym
11
+ defined = instance_method(test_name) rescue false
12
+ raise "#{test_name} is already defined in #{self}" if defined
13
+ if block_given?
14
+ define_method(test_name, &block)
15
+ else
16
+ define_method(test_name) do
17
+ flunk "No implementation provided for #{description}"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -1,9 +1,24 @@
1
- author : Hallison Batista
2
- email : hallison@codigorama.com
3
- version : 0.1.0
4
- description : Default template for Ruby projects
1
+ author:
2
+ Hallison Batista
3
+ email:
4
+ hallison@codigorama.com
5
+ version:
6
+ 0.1.0
7
+ description:
8
+ Default template for Ruby projects.
5
9
 
6
10
  options:
11
+ bin:
12
+ description:
13
+ Includes executable file.
14
+ files:
15
+ executable: bin/(project)
16
+ test:
17
+ description:
18
+ Includes test files.
19
+ files:
20
+ test.rb: test/(project)_test.rb
21
+ testhelper.rb: test/helper.rb
7
22
 
8
23
  directories:
9
24
  - lib/(project)
@@ -14,3 +29,4 @@ files:
14
29
  README.rdoc:
15
30
  module.rb : lib/(project).rb
16
31
 
32
+ # vim: filetype=yaml
@@ -0,0 +1,4 @@
1
+ = <%=project.upper_camel_case_namespace%>
2
+
3
+ This is my great Ruby project.
4
+