templater 0.5.0 → 1.0.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 +3 -0
- data/Manifest.txt +64 -0
- data/{README → README.rdoc} +33 -2
- data/Rakefile +23 -143
- data/lib/templater.rb +1 -2
- data/lib/templater/cli/generator.rb +12 -14
- data/lib/templater/cli/manifold.rb +1 -1
- data/lib/templater/core_ext/kernel.rb +1 -1
- data/lib/templater/core_ext/string.rb +12 -3
- data/lib/templater/description.rb +15 -13
- data/lib/templater/generator.rb +8 -22
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/spec_helper.rb +1 -0
- data/templater.gemspec +54 -0
- metadata +58 -36
- data/LICENSE +0 -21
- data/ROADMAP +0 -35
- data/lib/templater/actions/evaluation.rb +0 -21
- data/spec/actions/custom_action_spec.rb +0 -18
- data/spec/actions/evaluation_spec.rb +0 -40
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
lib/templater.rb
|
6
|
+
lib/templater/actions/action.rb
|
7
|
+
lib/templater/actions/directory.rb
|
8
|
+
lib/templater/actions/empty_directory.rb
|
9
|
+
lib/templater/actions/file.rb
|
10
|
+
lib/templater/actions/template.rb
|
11
|
+
lib/templater/capture_helpers.rb
|
12
|
+
lib/templater/cli/generator.rb
|
13
|
+
lib/templater/cli/manifold.rb
|
14
|
+
lib/templater/cli/parser.rb
|
15
|
+
lib/templater/core_ext/kernel.rb
|
16
|
+
lib/templater/core_ext/string.rb
|
17
|
+
lib/templater/description.rb
|
18
|
+
lib/templater/discovery.rb
|
19
|
+
lib/templater/generator.rb
|
20
|
+
lib/templater/manifold.rb
|
21
|
+
lib/templater/spec/helpers.rb
|
22
|
+
script/console
|
23
|
+
script/destroy
|
24
|
+
script/generate
|
25
|
+
spec/actions/directory_spec.rb
|
26
|
+
spec/actions/empty_directory_spec.rb
|
27
|
+
spec/actions/file_spec.rb
|
28
|
+
spec/actions/template_spec.rb
|
29
|
+
spec/core_ext/string_spec.rb
|
30
|
+
spec/generator/actions_spec.rb
|
31
|
+
spec/generator/arguments_spec.rb
|
32
|
+
spec/generator/desc_spec.rb
|
33
|
+
spec/generator/destination_root_spec.rb
|
34
|
+
spec/generator/empty_directories_spec.rb
|
35
|
+
spec/generator/files_spec.rb
|
36
|
+
spec/generator/generators_spec.rb
|
37
|
+
spec/generator/glob_spec.rb
|
38
|
+
spec/generator/invocations_spec.rb
|
39
|
+
spec/generator/invoke_spec.rb
|
40
|
+
spec/generator/options_spec.rb
|
41
|
+
spec/generator/render_spec.rb
|
42
|
+
spec/generator/source_root_spec.rb
|
43
|
+
spec/generator/templates_spec.rb
|
44
|
+
spec/manifold_spec.rb
|
45
|
+
spec/options_parser_spec.rb
|
46
|
+
spec/results/erb.rbs
|
47
|
+
spec/results/file.rbs
|
48
|
+
spec/results/random.rbs
|
49
|
+
spec/results/simple_erb.rbs
|
50
|
+
spec/spec_helper.rb
|
51
|
+
spec/spec_helpers_spec.rb
|
52
|
+
spec/templater_spec.rb
|
53
|
+
spec/templates/erb.rbt
|
54
|
+
spec/templates/glob/README
|
55
|
+
spec/templates/glob/arg.js
|
56
|
+
spec/templates/glob/hellothar.%feh%
|
57
|
+
spec/templates/glob/hellothar.html.%feh%
|
58
|
+
spec/templates/glob/subfolder/jessica_alba.jpg
|
59
|
+
spec/templates/glob/subfolder/monkey.rb
|
60
|
+
spec/templates/glob/test.rb
|
61
|
+
spec/templates/literals_erb.rbt
|
62
|
+
spec/templates/simple.rbt
|
63
|
+
spec/templates/simple_erb.rbt
|
64
|
+
templater.gemspec
|
data/{README → README.rdoc}
RENAMED
@@ -1,6 +1,14 @@
|
|
1
1
|
= Templater
|
2
2
|
|
3
|
-
|
3
|
+
* http://github.com/jnicklas/templater
|
4
|
+
|
5
|
+
== Summary
|
6
|
+
|
7
|
+
Templater is a Ruby framework for building code generators.
|
8
|
+
|
9
|
+
== Description
|
10
|
+
|
11
|
+
Templater has the ability to both copy files from A to B and also to render templates using ERB. Templater consists of four parts:
|
4
12
|
|
5
13
|
- Actions (File copying routines, templates generation and directories creation routines).
|
6
14
|
- Generators (set of rules).
|
@@ -68,7 +76,7 @@ This is how to create a very simple system for generating things:
|
|
68
76
|
|
69
77
|
The generator classes override the source_root method to specify where templates will be located. All subclasses of Templater::Generator that have any actions must do this. The +template+ and +file+ methods add actions to the generator. In the first case, a template that is rendered with ERB and then put in its destination location, in the other case a file that is copied. +empty_directory+ action creates empty directory under destination root.
|
70
78
|
|
71
|
-
Neither manifolds or generators actually do anything by themselves, they are just abstract
|
79
|
+
Neither manifolds or generators actually do anything by themselves, they are just abstract represenations. The last line invokes the command-line-interface, which fetches the desired generator, tells it to render its templates and checks with the user if there are any problems. The generators can easily be used without the command-line-interface, so it is easy to construct an alternative interface.
|
72
80
|
|
73
81
|
== Invoking other generators
|
74
82
|
|
@@ -233,3 +241,26 @@ A generator for creating a model class, such as it used by Merb or Rails, could
|
|
233
241
|
add :model, ModelGenerator
|
234
242
|
|
235
243
|
end
|
244
|
+
|
245
|
+
== License
|
246
|
+
|
247
|
+
Copyright (c) 2008 Jonas Nicklas, Michael S. Klishin
|
248
|
+
|
249
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
250
|
+
a copy of this software and associated documentation files (the
|
251
|
+
"Software"), to deal in the Software without restriction, including
|
252
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
253
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
254
|
+
permit persons to whom the Software is furnished to do so, subject to
|
255
|
+
the following conditions:
|
256
|
+
|
257
|
+
The above copyright notice and this permission notice shall be
|
258
|
+
included in all copies or substantial portions of the Software.
|
259
|
+
|
260
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
261
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
262
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
263
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
264
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
265
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
266
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,143 +1,23 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
25
|
-
GEM_VERSION = Templater::VERSION + PKG_BUILD
|
26
|
-
RELEASE_NAME = "REL #{GEM_VERSION}"
|
27
|
-
|
28
|
-
require "extlib/tasks/release"
|
29
|
-
|
30
|
-
#
|
31
|
-
# ==== Gemspec and installation
|
32
|
-
#
|
33
|
-
|
34
|
-
spec = Gem::Specification.new do |s|
|
35
|
-
s.name = NAME
|
36
|
-
s.version = Templater::VERSION
|
37
|
-
s.platform = Gem::Platform::RUBY
|
38
|
-
s.has_rdoc = true
|
39
|
-
s.extra_rdoc_files = ["README", "LICENSE", 'ROADMAP']
|
40
|
-
s.summary = SUMMARY
|
41
|
-
s.description = s.summary
|
42
|
-
s.author = AUTHOR
|
43
|
-
s.email = EMAIL
|
44
|
-
s.homepage = HOMEPAGE
|
45
|
-
s.require_path = 'lib'
|
46
|
-
s.autorequire = PLUGIN
|
47
|
-
s.files = %w(LICENSE README Rakefile ROADMAP) + Dir.glob("{lib,spec}/**/*")
|
48
|
-
|
49
|
-
s.add_dependency "highline", ">= 1.4.0"
|
50
|
-
s.add_dependency "diff-lcs", ">= 1.1.2"
|
51
|
-
s.add_dependency "extlib", ">= 0.9.5"
|
52
|
-
end
|
53
|
-
|
54
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
55
|
-
pkg.gem_spec = spec
|
56
|
-
end
|
57
|
-
|
58
|
-
desc "removes any generated content"
|
59
|
-
task :clean do
|
60
|
-
FileUtils.rm_rf "clobber/*"
|
61
|
-
FileUtils.rm_rf "pkg/*"
|
62
|
-
end
|
63
|
-
|
64
|
-
desc "install the plugin locally"
|
65
|
-
task :install => [:clean, :package] do
|
66
|
-
sh %{sudo gem install pkg/#{NAME}-#{Templater::VERSION} --no-update-sources}
|
67
|
-
end
|
68
|
-
|
69
|
-
desc "create a gemspec file"
|
70
|
-
task :make_spec do
|
71
|
-
File.open("#{GEM}.gemspec", "w") do |file|
|
72
|
-
file.puts spec.to_ruby
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
namespace :jruby do
|
77
|
-
|
78
|
-
desc "Run :package and install the resulting .gem with jruby"
|
79
|
-
task :install => :package do
|
80
|
-
sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Templater::VERSION}.gem --no-rdoc --no-ri}
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
#
|
86
|
-
# ==== RDoc
|
87
|
-
#
|
88
|
-
|
89
|
-
desc 'Generate documentation for Templater.'
|
90
|
-
Rake::RDocTask.new(:doc) do |rdoc|
|
91
|
-
rdoc.rdoc_dir = 'doc'
|
92
|
-
rdoc.title = 'Templater'
|
93
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
94
|
-
rdoc.rdoc_files.include('README')
|
95
|
-
rdoc.rdoc_files.include('LICENSE')
|
96
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
97
|
-
end
|
98
|
-
|
99
|
-
#
|
100
|
-
# ==== RCov
|
101
|
-
#
|
102
|
-
|
103
|
-
desc "Run coverage suite"
|
104
|
-
task :rcov do
|
105
|
-
require 'fileutils'
|
106
|
-
FileUtils.rm_rf("coverage") if File.directory?("coverage")
|
107
|
-
FileUtils.mkdir("coverage")
|
108
|
-
path = File.expand_path(Dir.pwd)
|
109
|
-
files = Dir["spec/**/*_spec.rb"]
|
110
|
-
files.each do |spec|
|
111
|
-
puts "Getting coverage for #{File.expand_path(spec)}"
|
112
|
-
command = %{rcov #{File.expand_path(spec)} --aggregate #{path}/coverage/data.data}
|
113
|
-
command += " --no-html" unless spec == files.last
|
114
|
-
`#{command} 2>&1`
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
file_list = FileList['spec/**/*_spec.rb']
|
119
|
-
|
120
|
-
desc "Run all examples"
|
121
|
-
Spec::Rake::SpecTask.new('spec') do |t|
|
122
|
-
t.spec_files = file_list
|
123
|
-
end
|
124
|
-
|
125
|
-
namespace :spec do
|
126
|
-
desc "Run all examples with RCov"
|
127
|
-
Spec::Rake::SpecTask.new('rcov') do |t|
|
128
|
-
t.spec_files = file_list
|
129
|
-
t.rcov = true
|
130
|
-
t.rcov_dir = "doc/coverage"
|
131
|
-
t.rcov_opts = ['--exclude', 'spec']
|
132
|
-
end
|
133
|
-
|
134
|
-
desc "Generate an html report"
|
135
|
-
Spec::Rake::SpecTask.new('report') do |t|
|
136
|
-
t.spec_files = file_list
|
137
|
-
t.spec_opts = ["--format", "html:doc/reports/specs.html"]
|
138
|
-
t.fail_on_error = false
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
desc 'Default: run unit tests.'
|
143
|
-
task :default => 'spec'
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'hoe', '>= 2.1.0'
|
3
|
+
require 'hoe'
|
4
|
+
require 'fileutils'
|
5
|
+
require './lib/templater'
|
6
|
+
|
7
|
+
Hoe.plugin :newgem
|
8
|
+
# Hoe.plugin :website
|
9
|
+
# Hoe.plugin :cucumberfeatures
|
10
|
+
|
11
|
+
# Generate all the Rake tasks
|
12
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
13
|
+
$hoe = Hoe.spec 'templater' do
|
14
|
+
self.developer 'Jonas Nicklas', 'jonas.nicklas@gmail.com'
|
15
|
+
self.rubyforge_name = self.name # TODO this is default value
|
16
|
+
self.extra_deps << ['highline', ">= 1.4.0"]
|
17
|
+
self.extra_deps << ['diff-lcs', ">= 1.1.2"]
|
18
|
+
self.extra_deps << ['extlib', ">= 0.9.5"]
|
19
|
+
self.extra_dev_deps << ['rspec', '>= 1.2.8']
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'newgem/tasks'
|
23
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
data/lib/templater.rb
CHANGED
@@ -14,7 +14,6 @@ require path + 'actions/template'
|
|
14
14
|
require path + 'actions/file'
|
15
15
|
require path + 'actions/directory'
|
16
16
|
require path + 'actions/empty_directory'
|
17
|
-
require path + 'actions/evaluation'
|
18
17
|
require path + 'description'
|
19
18
|
require path + 'generator'
|
20
19
|
require path + 'manifold'
|
@@ -45,6 +44,6 @@ module Templater
|
|
45
44
|
class MalformattedArgumentError < ArgumentError #:nodoc:
|
46
45
|
end
|
47
46
|
|
48
|
-
VERSION = '0.
|
47
|
+
VERSION = '1.0.0'
|
49
48
|
|
50
49
|
end
|
@@ -5,11 +5,11 @@ module Templater
|
|
5
5
|
class Generator
|
6
6
|
|
7
7
|
def initialize(generator_name, generator_class, destination_root, name, version)
|
8
|
-
@generator_name
|
8
|
+
@generator_name = generator_name
|
9
9
|
@destination_root = destination_root
|
10
|
-
@generator_class
|
11
|
-
@name
|
12
|
-
@version
|
10
|
+
@generator_class = generator_class
|
11
|
+
@name = name
|
12
|
+
@version = version
|
13
13
|
end
|
14
14
|
|
15
15
|
def version
|
@@ -20,11 +20,11 @@ module Templater
|
|
20
20
|
# outputs a helpful message and quits
|
21
21
|
def help
|
22
22
|
puts "Usage: #{@name} #{@generator_name} [options] [args]"
|
23
|
-
puts
|
23
|
+
puts ''
|
24
24
|
puts @generator_class.desc
|
25
|
-
puts
|
25
|
+
puts ''
|
26
26
|
puts @options[:opts]
|
27
|
-
puts
|
27
|
+
puts ''
|
28
28
|
exit
|
29
29
|
end
|
30
30
|
|
@@ -75,11 +75,9 @@ module Templater
|
|
75
75
|
step_through_templates
|
76
76
|
|
77
77
|
# Run hooks
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
@generator.after_deletion if @options[:delete]
|
82
|
-
end
|
78
|
+
@generator.after_run
|
79
|
+
@generator.after_generation unless @options[:delete]
|
80
|
+
@generator.after_deletion if @options[:delete]
|
83
81
|
end
|
84
82
|
|
85
83
|
def step_through_templates
|
@@ -125,7 +123,7 @@ module Templater
|
|
125
123
|
puts "Rendering " + template.relative_destination
|
126
124
|
puts ""
|
127
125
|
# outputs each line of the file with the row number prepended
|
128
|
-
template.render.
|
126
|
+
template.render.to_lines.each_with_index do |line, i|
|
129
127
|
puts((i+1).to_s.rjust(4) + ': ' + line)
|
130
128
|
end
|
131
129
|
puts ""
|
@@ -136,7 +134,7 @@ module Templater
|
|
136
134
|
puts "Showing differences for " + template.relative_destination
|
137
135
|
puts ""
|
138
136
|
|
139
|
-
diffs = Diff::LCS.diff(::File.read(template.destination).to_s.
|
137
|
+
diffs = Diff::LCS.diff(::File.read(template.destination).to_s.to_lines, template.render.to_lines).first
|
140
138
|
|
141
139
|
diffs.each do |diff|
|
142
140
|
output_diff_line(diff)
|
@@ -2,7 +2,16 @@ class String
|
|
2
2
|
|
3
3
|
def realign_indentation
|
4
4
|
basis = self.index(/\S/) # find the first non-whitespace character
|
5
|
-
return self.
|
5
|
+
return self.to_lines.map { |s| s[basis..-1] }.join
|
6
6
|
end
|
7
|
-
|
8
|
-
|
7
|
+
|
8
|
+
if "".respond_to?(:lines)
|
9
|
+
def to_lines
|
10
|
+
lines.to_a
|
11
|
+
end
|
12
|
+
else
|
13
|
+
def to_lines
|
14
|
+
to_a
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,23 +1,25 @@
|
|
1
1
|
module Templater
|
2
|
-
|
2
|
+
|
3
3
|
class Description
|
4
4
|
attr_accessor :name, :options, :block
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(name, options={}, &block)
|
7
7
|
@name = name
|
8
8
|
@options = options
|
9
9
|
@block = block
|
10
|
-
end
|
10
|
+
end
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
class ActionDescription < Description
|
14
|
+
|
14
15
|
def compile(generator)
|
15
16
|
@block.call(generator)
|
16
17
|
end
|
18
|
+
|
17
19
|
end
|
18
|
-
|
20
|
+
|
19
21
|
class ArgumentDescription < Description
|
20
|
-
|
22
|
+
|
21
23
|
# Checks if the given argument is valid according to this description
|
22
24
|
#
|
23
25
|
# === Parameters
|
@@ -33,7 +35,7 @@ module Templater
|
|
33
35
|
elsif options[:as] == :array and not argument.is_a?(Array)
|
34
36
|
raise Templater::MalformattedArgumentError, "Expected the argument to be an Array, but was '#{argument.inspect}'"
|
35
37
|
end
|
36
|
-
|
38
|
+
|
37
39
|
invalid = catch :invalid do
|
38
40
|
block.call(argument) if block
|
39
41
|
throw :invalid, :not_invalid
|
@@ -41,7 +43,7 @@ module Templater
|
|
41
43
|
raise Templater::ArgumentError, invalid unless invalid == :not_invalid
|
42
44
|
end
|
43
45
|
end
|
44
|
-
|
46
|
+
|
45
47
|
def extract(argument)
|
46
48
|
case options[:as]
|
47
49
|
when :hash
|
@@ -58,11 +60,11 @@ module Templater
|
|
58
60
|
end
|
59
61
|
return argument
|
60
62
|
end
|
61
|
-
|
63
|
+
|
62
64
|
end
|
63
|
-
|
65
|
+
|
64
66
|
class InvocationDescription < Description
|
65
|
-
|
67
|
+
|
66
68
|
def get(generator)
|
67
69
|
klass = generator.class.manifold.generator(name)
|
68
70
|
if klass and block
|
@@ -71,6 +73,6 @@ module Templater
|
|
71
73
|
klass.new(generator.destination_root, generator.options, *generator.arguments)
|
72
74
|
end
|
73
75
|
end
|
74
|
-
|
76
|
+
|
75
77
|
end
|
76
|
-
end
|
78
|
+
end
|
data/lib/templater/generator.rb
CHANGED
@@ -308,25 +308,6 @@ module Templater
|
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
311
|
-
# Evaluates given block in the scope of generator. Useful for modification
|
312
|
-
# of existing files, for instance, Merb generators may update routing
|
313
|
-
# file or something.
|
314
|
-
#
|
315
|
-
# === Parameters
|
316
|
-
# name<Symbol>:: The name of this custom action
|
317
|
-
# options<Hash>:: Options for this custom action
|
318
|
-
# &block<Proc>:: A block to execute when the generator is instantiated
|
319
|
-
#
|
320
|
-
# === Options
|
321
|
-
# :before<Symbol>:: Name of a method to execute before this template is invoked
|
322
|
-
# :after<Symbol>:: Name of a method to execute after this template is invoked
|
323
|
-
def custom_action(name, *args, &block)
|
324
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
325
|
-
actions[name] = ActionDescription.new(name, options) do |generator|
|
326
|
-
Actions::Evaluation.new(generator, name, options, &block)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
311
|
# An easy way to add many templates to a generator, each item in the list is added as a
|
331
312
|
# template. The provided list can be either an array of Strings or a Here-Doc with templates
|
332
313
|
# on individual lines.
|
@@ -344,7 +325,8 @@ module Templater
|
|
344
325
|
# template_list ['a/third/template.rb', 'and/a/fourth.js']
|
345
326
|
# end
|
346
327
|
def template_list(list)
|
347
|
-
list.
|
328
|
+
list = list.to_lines if list.is_a?(String)
|
329
|
+
list.each do |item|
|
348
330
|
item = item.to_s.chomp.strip
|
349
331
|
self.template(item.gsub(/[\.\/]/, '_').to_sym, item)
|
350
332
|
end
|
@@ -366,7 +348,8 @@ module Templater
|
|
366
348
|
# file_list ['a/third/file.gif', 'and/a/fourth.rb']
|
367
349
|
# end
|
368
350
|
def file_list(list)
|
369
|
-
list.
|
351
|
+
list = list.to_lines if list.is_a?(String)
|
352
|
+
list.each do |item|
|
370
353
|
item = item.to_s.chomp.strip
|
371
354
|
self.file(item.gsub(/[\.\/]/, '_').to_sym, item)
|
372
355
|
end
|
@@ -388,7 +371,8 @@ module Templater
|
|
388
371
|
# directory_list ['a/third/directory', 'and/a/fourth']
|
389
372
|
# end
|
390
373
|
def directory_list(list)
|
391
|
-
list.
|
374
|
+
list = list.to_lines if list.is_a?(String)
|
375
|
+
list.each do |item|
|
392
376
|
item = item.to_s.chomp.strip
|
393
377
|
self.directory(item.gsub(/[\.\/]/, '_').to_sym, item)
|
394
378
|
end
|
@@ -557,6 +541,8 @@ module Templater
|
|
557
541
|
|
558
542
|
# Finds and returns all templates and files for this generators whose options match its options.
|
559
543
|
#
|
544
|
+
# === Parameters
|
545
|
+
# type<Symbol>:: The type of actions to look up (optional)
|
560
546
|
# === Returns
|
561
547
|
# [Templater::Actions::*]:: The found templates and files.
|
562
548
|
def actions(type=nil)
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/templater.rb'}"
|
9
|
+
puts "Loading templater gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/spec/spec_helper.rb
CHANGED
data/templater.gemspec
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{templater}
|
5
|
+
s.version = "1.0.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jonas Nicklas"]
|
9
|
+
s.date = %q{2009-08-28}
|
10
|
+
s.description = %q{Templater has the ability to both copy files from A to B and also to render templates using ERB. Templater consists of four parts:
|
11
|
+
|
12
|
+
- Actions (File copying routines, templates generation and directories creation routines).
|
13
|
+
- Generators (set of rules).
|
14
|
+
- Manifolds (generator suites).
|
15
|
+
- The command line interface.
|
16
|
+
|
17
|
+
Hierarchy is pretty simple: manifold has one or many public and private generators. Public ones are supposed to be called
|
18
|
+
by end user. Generators have one or more action that specify what they do, where they take files, how they name resulting
|
19
|
+
files and so forth.}
|
20
|
+
s.email = ["jonas.nicklas@gmail.com"]
|
21
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
|
22
|
+
s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/templater.rb", "lib/templater/actions/action.rb", "lib/templater/actions/directory.rb", "lib/templater/actions/empty_directory.rb", "lib/templater/actions/file.rb", "lib/templater/actions/template.rb", "lib/templater/capture_helpers.rb", "lib/templater/cli/generator.rb", "lib/templater/cli/manifold.rb", "lib/templater/cli/parser.rb", "lib/templater/core_ext/kernel.rb", "lib/templater/core_ext/string.rb", "lib/templater/description.rb", "lib/templater/discovery.rb", "lib/templater/generator.rb", "lib/templater/manifold.rb", "lib/templater/spec/helpers.rb", "script/console", "script/destroy", "script/generate", "spec/actions/directory_spec.rb", "spec/actions/empty_directory_spec.rb", "spec/actions/file_spec.rb", "spec/actions/template_spec.rb", "spec/core_ext/string_spec.rb", "spec/generator/actions_spec.rb", "spec/generator/arguments_spec.rb", "spec/generator/desc_spec.rb", "spec/generator/destination_root_spec.rb", "spec/generator/empty_directories_spec.rb", "spec/generator/files_spec.rb", "spec/generator/generators_spec.rb", "spec/generator/glob_spec.rb", "spec/generator/invocations_spec.rb", "spec/generator/invoke_spec.rb", "spec/generator/options_spec.rb", "spec/generator/render_spec.rb", "spec/generator/source_root_spec.rb", "spec/generator/templates_spec.rb", "spec/manifold_spec.rb", "spec/options_parser_spec.rb", "spec/results/erb.rbs", "spec/results/file.rbs", "spec/results/random.rbs", "spec/results/simple_erb.rbs", "spec/spec_helper.rb", "spec/spec_helpers_spec.rb", "spec/templater_spec.rb", "spec/templates/erb.rbt", "spec/templates/glob/README", "spec/templates/glob/arg.js", "spec/templates/glob/hellothar.%feh%", "spec/templates/glob/hellothar.html.%feh%", "spec/templates/glob/subfolder/jessica_alba.jpg", "spec/templates/glob/subfolder/monkey.rb", "spec/templates/glob/test.rb", "spec/templates/literals_erb.rbt", "spec/templates/simple.rbt", "spec/templates/simple_erb.rbt", "templater.gemspec"]
|
23
|
+
s.homepage = %q{http://github.com/jnicklas/templater}
|
24
|
+
s.rdoc_options = ["--main", "README.rdoc"]
|
25
|
+
s.require_paths = ["lib"]
|
26
|
+
s.rubyforge_project = %q{templater}
|
27
|
+
s.rubygems_version = %q{1.3.5}
|
28
|
+
s.summary = %q{Templater has the ability to both copy files from A to B and also to render templates using ERB}
|
29
|
+
|
30
|
+
if s.respond_to? :specification_version then
|
31
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
32
|
+
s.specification_version = 3
|
33
|
+
|
34
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
35
|
+
s.add_runtime_dependency(%q<highline>, [">= 1.4.0"])
|
36
|
+
s.add_runtime_dependency(%q<diff-lcs>, [">= 1.1.2"])
|
37
|
+
s.add_runtime_dependency(%q<extlib>, [">= 0.9.5"])
|
38
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.8"])
|
39
|
+
s.add_development_dependency(%q<hoe>, [">= 2.3.3"])
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<highline>, [">= 1.4.0"])
|
42
|
+
s.add_dependency(%q<diff-lcs>, [">= 1.1.2"])
|
43
|
+
s.add_dependency(%q<extlib>, [">= 0.9.5"])
|
44
|
+
s.add_dependency(%q<rspec>, [">= 1.2.8"])
|
45
|
+
s.add_dependency(%q<hoe>, [">= 2.3.3"])
|
46
|
+
end
|
47
|
+
else
|
48
|
+
s.add_dependency(%q<highline>, [">= 1.4.0"])
|
49
|
+
s.add_dependency(%q<diff-lcs>, [">= 1.1.2"])
|
50
|
+
s.add_dependency(%q<extlib>, [">= 0.9.5"])
|
51
|
+
s.add_dependency(%q<rspec>, [">= 1.2.8"])
|
52
|
+
s.add_dependency(%q<hoe>, [">= 2.3.3"])
|
53
|
+
end
|
54
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: templater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Jonas Nicklas
|
8
|
-
autorequire:
|
7
|
+
- Jonas Nicklas
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-08-28 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,54 +42,76 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 0.9.5
|
44
44
|
version:
|
45
|
-
|
46
|
-
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: rspec
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.8
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: hoe
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 2.3.3
|
64
|
+
version:
|
65
|
+
description: |-
|
66
|
+
Templater has the ability to both copy files from A to B and also to render templates using ERB. Templater consists of four parts:
|
67
|
+
|
68
|
+
- Actions (File copying routines, templates generation and directories creation routines).
|
69
|
+
- Generators (set of rules).
|
70
|
+
- Manifolds (generator suites).
|
71
|
+
- The command line interface.
|
72
|
+
|
73
|
+
Hierarchy is pretty simple: manifold has one or many public and private generators. Public ones are supposed to be called
|
74
|
+
by end user. Generators have one or more action that specify what they do, where they take files, how they name resulting
|
75
|
+
files and so forth.
|
76
|
+
email:
|
77
|
+
- jonas.nicklas@gmail.com
|
47
78
|
executables: []
|
48
79
|
|
49
80
|
extensions: []
|
50
81
|
|
51
82
|
extra_rdoc_files:
|
52
|
-
-
|
53
|
-
-
|
54
|
-
- ROADMAP
|
83
|
+
- History.txt
|
84
|
+
- Manifest.txt
|
55
85
|
files:
|
56
|
-
-
|
57
|
-
-
|
86
|
+
- History.txt
|
87
|
+
- Manifest.txt
|
88
|
+
- README.rdoc
|
58
89
|
- Rakefile
|
59
|
-
-
|
60
|
-
- lib/templater
|
61
|
-
- lib/templater/actions
|
90
|
+
- lib/templater.rb
|
62
91
|
- lib/templater/actions/action.rb
|
63
92
|
- lib/templater/actions/directory.rb
|
64
93
|
- lib/templater/actions/empty_directory.rb
|
65
|
-
- lib/templater/actions/evaluation.rb
|
66
94
|
- lib/templater/actions/file.rb
|
67
95
|
- lib/templater/actions/template.rb
|
68
96
|
- lib/templater/capture_helpers.rb
|
69
|
-
- lib/templater/cli
|
70
97
|
- lib/templater/cli/generator.rb
|
71
98
|
- lib/templater/cli/manifold.rb
|
72
99
|
- lib/templater/cli/parser.rb
|
73
|
-
- lib/templater/core_ext
|
74
100
|
- lib/templater/core_ext/kernel.rb
|
75
101
|
- lib/templater/core_ext/string.rb
|
76
102
|
- lib/templater/description.rb
|
77
103
|
- lib/templater/discovery.rb
|
78
104
|
- lib/templater/generator.rb
|
79
105
|
- lib/templater/manifold.rb
|
80
|
-
- lib/templater/spec
|
81
106
|
- lib/templater/spec/helpers.rb
|
82
|
-
-
|
83
|
-
-
|
84
|
-
-
|
107
|
+
- script/console
|
108
|
+
- script/destroy
|
109
|
+
- script/generate
|
85
110
|
- spec/actions/directory_spec.rb
|
86
111
|
- spec/actions/empty_directory_spec.rb
|
87
|
-
- spec/actions/evaluation_spec.rb
|
88
112
|
- spec/actions/file_spec.rb
|
89
113
|
- spec/actions/template_spec.rb
|
90
|
-
- spec/core_ext
|
91
114
|
- spec/core_ext/string_spec.rb
|
92
|
-
- spec/generator
|
93
115
|
- spec/generator/actions_spec.rb
|
94
116
|
- spec/generator/arguments_spec.rb
|
95
117
|
- spec/generator/desc_spec.rb
|
@@ -106,7 +128,6 @@ files:
|
|
106
128
|
- spec/generator/templates_spec.rb
|
107
129
|
- spec/manifold_spec.rb
|
108
130
|
- spec/options_parser_spec.rb
|
109
|
-
- spec/results
|
110
131
|
- spec/results/erb.rbs
|
111
132
|
- spec/results/file.rbs
|
112
133
|
- spec/results/random.rbs
|
@@ -114,25 +135,26 @@ files:
|
|
114
135
|
- spec/spec_helper.rb
|
115
136
|
- spec/spec_helpers_spec.rb
|
116
137
|
- spec/templater_spec.rb
|
117
|
-
- spec/templates
|
118
138
|
- spec/templates/erb.rbt
|
119
|
-
- spec/templates/glob
|
139
|
+
- spec/templates/glob/README
|
120
140
|
- spec/templates/glob/arg.js
|
121
141
|
- spec/templates/glob/hellothar.%feh%
|
122
142
|
- spec/templates/glob/hellothar.html.%feh%
|
123
|
-
- spec/templates/glob/README
|
124
|
-
- spec/templates/glob/subfolder
|
125
143
|
- spec/templates/glob/subfolder/jessica_alba.jpg
|
126
144
|
- spec/templates/glob/subfolder/monkey.rb
|
127
145
|
- spec/templates/glob/test.rb
|
128
146
|
- spec/templates/literals_erb.rbt
|
129
147
|
- spec/templates/simple.rbt
|
130
148
|
- spec/templates/simple_erb.rbt
|
149
|
+
- templater.gemspec
|
131
150
|
has_rdoc: true
|
132
|
-
homepage: http://
|
133
|
-
|
134
|
-
rdoc_options: []
|
151
|
+
homepage: http://github.com/jnicklas/templater
|
152
|
+
licenses: []
|
135
153
|
|
154
|
+
post_install_message:
|
155
|
+
rdoc_options:
|
156
|
+
- --main
|
157
|
+
- README.rdoc
|
136
158
|
require_paths:
|
137
159
|
- lib
|
138
160
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -149,10 +171,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
171
|
version:
|
150
172
|
requirements: []
|
151
173
|
|
152
|
-
rubyforge_project:
|
153
|
-
rubygems_version: 1.3.
|
174
|
+
rubyforge_project: templater
|
175
|
+
rubygems_version: 1.3.5
|
154
176
|
signing_key:
|
155
|
-
specification_version:
|
156
|
-
summary:
|
177
|
+
specification_version: 3
|
178
|
+
summary: Templater has the ability to both copy files from A to B and also to render templates using ERB
|
157
179
|
test_files: []
|
158
180
|
|
data/LICENSE
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
Copyright (c) 2008 Jonas Nicklas
|
2
|
-
Copyright (c) 2008 Michael S. Klishin
|
3
|
-
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
-
a copy of this software and associated documentation files (the
|
6
|
-
"Software"), to deal in the Software without restriction, including
|
7
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
-
permit persons to whom the Software is furnished to do so, subject to
|
10
|
-
the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be
|
13
|
-
included in all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/ROADMAP
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
Roadmap:
|
2
|
-
|
3
|
-
0.5:
|
4
|
-
|
5
|
-
* Custom actions (ex.: append/prepend to existing files).
|
6
|
-
|
7
|
-
0.6:
|
8
|
-
|
9
|
-
* Internals overview.
|
10
|
-
* Plugins development guide.
|
11
|
-
* Overall improvements in documentation.
|
12
|
-
|
13
|
-
0.7:
|
14
|
-
|
15
|
-
* Haml support.
|
16
|
-
|
17
|
-
0.8:
|
18
|
-
|
19
|
-
* Interactive UI.
|
20
|
-
|
21
|
-
0.9:
|
22
|
-
|
23
|
-
* Built-in generators generator.
|
24
|
-
* Executable to run the generator above.
|
25
|
-
* Clean up as much as possible before stabilization period.
|
26
|
-
|
27
|
-
1.0:
|
28
|
-
|
29
|
-
* Redundant spec coverage.
|
30
|
-
* Generators in natural languages with Treetop. We can write generators using
|
31
|
-
plain text and use Cucumber-like steps to process actions.
|
32
|
-
|
33
|
-
1.x:
|
34
|
-
|
35
|
-
* Add magic template names for files.
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Templater
|
2
|
-
module Actions
|
3
|
-
class Evaluation < Action
|
4
|
-
attr_reader :generaor, :name, :options, :operation
|
5
|
-
|
6
|
-
def initialize(generator, name, options = {}, &operation)
|
7
|
-
@generator, @name = generator, name
|
8
|
-
@options = options
|
9
|
-
@operation = operation
|
10
|
-
end
|
11
|
-
|
12
|
-
def render
|
13
|
-
self.generator.instance_eval(&operation) || ''
|
14
|
-
end
|
15
|
-
|
16
|
-
def identical?
|
17
|
-
false
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
describe Templater::Generator, ".custom_action" do
|
4
|
-
before do
|
5
|
-
@generator_class = Templater::Generator
|
6
|
-
@generator_class.stub!(:source_root).and_return('/tmp/source')
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'evaluates given block in context of generator' do
|
10
|
-
$custom_action_evaluation_result = "not called yet"
|
11
|
-
@generator_class.custom_action :update_routes_rb do
|
12
|
-
$custom_action_evaluation_result = source_root
|
13
|
-
end
|
14
|
-
|
15
|
-
@generator_class.new("/tmp/destination").render!
|
16
|
-
$custom_action_evaluation_result.should == "/tmp/source"
|
17
|
-
end
|
18
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
describe Templater::Actions::Evaluation do
|
4
|
-
before do
|
5
|
-
@generator = mock('a generator')
|
6
|
-
@generator.stub!(:source_root).and_return('/tmp/source')
|
7
|
-
@generator.stub!(:destination_root).and_return('/tmp/destination')
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#render' do
|
11
|
-
it "returns result of block evaluation" do
|
12
|
-
evaluation = Templater::Actions::Evaluation.new(@generator, :monkey) do
|
13
|
-
"noop"
|
14
|
-
end
|
15
|
-
evaluation.render.should == "noop"
|
16
|
-
end
|
17
|
-
|
18
|
-
it "returns empty string when block returned nil" do
|
19
|
-
evaluation = Templater::Actions::Evaluation.new(@generator, :monkey) do
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
evaluation.render.should == ""
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "#identical?" do
|
27
|
-
it "always returns false" do
|
28
|
-
noop_evaluation = Templater::Actions::Evaluation.new(@generator, :monkey) do
|
29
|
-
"noop"
|
30
|
-
end
|
31
|
-
|
32
|
-
another_evaluation = Templater::Actions::Evaluation.new(@generator, :monkey) do
|
33
|
-
"noop"
|
34
|
-
end
|
35
|
-
|
36
|
-
noop_evaluation.should_not be_identical
|
37
|
-
another_evaluation.should_not be_identical
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|