templater 0.1.1 → 0.1.2
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/README +44 -14
- data/Rakefile +38 -4
- data/lib/templater.rb +3 -2
- data/lib/templater/cli/generator.rb +6 -2
- data/lib/templater/cli/parser.rb +4 -0
- data/lib/templater/empty_directory.rb +53 -0
- data/lib/templater/file.rb +2 -2
- data/lib/templater/generator.rb +52 -5
- data/lib/templater/proxy.rb +6 -1
- data/lib/templater/template.rb +2 -2
- data/spec/empty_directory_spec.rb +97 -0
- data/spec/generator/actions_spec.rb +62 -0
- data/spec/generator/argument_as_array_spec.rb +40 -0
- data/spec/generator/argument_as_hash_spec.rb +43 -0
- data/spec/generator/argument_spec.rb +132 -0
- data/spec/generator/desc_spec.rb +10 -0
- data/spec/generator/destination_root_spec.rb +9 -0
- data/spec/generator/empty_directory_spec.rb +20 -0
- data/spec/generator/file_getter_spec.rb +48 -0
- data/spec/generator/file_list_spec.rb +32 -0
- data/spec/generator/file_spec.rb +53 -0
- data/spec/generator/files_spec.rb +47 -0
- data/spec/generator/generators_spec.rb +63 -0
- data/spec/generator/glob_spec.rb +81 -0
- data/spec/generator/invocations_spec.rb +64 -0
- data/spec/generator/invoke_spec.rb +109 -0
- data/spec/generator/option_spec.rb +46 -0
- data/spec/generator/source_root_getter_spec.rb +11 -0
- data/spec/generator/source_root_spec.rb +8 -0
- data/spec/generator/template_getter_spec.rb +48 -0
- data/spec/generator/template_list_spec.rb +32 -0
- data/spec/generator/template_spec.rb +79 -0
- data/spec/generator/templates_spec.rb +47 -0
- metadata +27 -3
- data/spec/generator_spec.rb +0 -1089
data/README
CHANGED
@@ -2,12 +2,24 @@
|
|
2
2
|
|
3
3
|
Templater is a system for generating files. 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
4
|
|
5
|
-
- Actions (
|
6
|
-
- Generators
|
7
|
-
- Manifolds
|
8
|
-
- The command line interface
|
5
|
+
- Actions (File copying routines, templates generation and directories creation routines).
|
6
|
+
- Generators (set of rules).
|
7
|
+
- Manifolds (generator suites).
|
8
|
+
- The command line interface.
|
9
|
+
|
10
|
+
Hierarchy is pretty simple: manifold has one or many public and private generators. Public ones are supposed to be called
|
11
|
+
by end user. Generators have one or more action that specify what they do, where they take files, how they name resulting
|
12
|
+
files and so forth.
|
13
|
+
|
14
|
+
|
15
|
+
== Idea behind Templater
|
16
|
+
|
17
|
+
Templater keeps declarations of generator inside it's body. You vary source and destinations of each action the way you want.
|
18
|
+
There's no magical %variables% in filenames sprinkled across your generator, generator rules are simple, readable, concise
|
19
|
+
and are in one place making it easy to take existing generator as example.
|
20
|
+
|
21
|
+
This is how Templater is different from some other code/components generation frameworks.
|
9
22
|
|
10
|
-
Each manifold has many generator, and each generator has many actions.
|
11
23
|
|
12
24
|
== Example
|
13
25
|
|
@@ -18,14 +30,24 @@ This is how to create a very simple system for generating things:
|
|
18
30
|
extend Templater::Manifold
|
19
31
|
|
20
32
|
class BlogGenerator < Templater::Generator
|
21
|
-
|
33
|
+
# directory this generator uses as source root when searching
|
34
|
+
# for files, directories, templates
|
22
35
|
def self.source_root
|
23
36
|
File.join(File.dirname(__FILE__), 'templates')
|
24
37
|
end
|
25
38
|
|
39
|
+
# uses blog.rbt template (note conventional trailing t)
|
40
|
+
# placing resulting file to blog.rb relatively to
|
41
|
+
# destination root
|
26
42
|
template :blog, 'blog.rb'
|
43
|
+
|
44
|
+
# does simple copy of me.jpg placing resulting file to me.jpg relatively to
|
45
|
+
# destination root
|
27
46
|
file :me, 'me.jpg'
|
28
47
|
|
48
|
+
# creates empty directory public/javascripts relatively to
|
49
|
+
# destination root
|
50
|
+
empty_directory :javascripts, File.join("public", "javascripts")
|
29
51
|
end
|
30
52
|
|
31
53
|
class WikiGenerator < Templater::Generator
|
@@ -38,17 +60,19 @@ This is how to create a very simple system for generating things:
|
|
38
60
|
file :img, 'wiki.jpg'
|
39
61
|
|
40
62
|
end
|
41
|
-
|
63
|
+
|
64
|
+
# The generators are added to the manifold, and assigned the names 'wiki' and 'blog'.
|
65
|
+
# So you can call them <script name> blog merb-blog-in-10-minutes and
|
66
|
+
# <script name> blog merb-wiki-in-10-minutes, respectively
|
42
67
|
add :blog, BlogGenerator
|
43
68
|
add :wiki, WikiGenerator
|
44
69
|
|
45
70
|
end
|
46
71
|
|
72
|
+
# registers manifold with command line interface
|
47
73
|
MyGenerators.run_cli Dir.pwd, 'my_generators', '0.1', ARGV
|
48
74
|
|
49
|
-
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.
|
50
|
-
|
51
|
-
The generators are added to the manifold, and assigned the names 'wiki' and 'blog'.
|
75
|
+
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.
|
52
76
|
|
53
77
|
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.
|
54
78
|
|
@@ -91,6 +115,9 @@ This will search the source root and add all files as actions.
|
|
91
115
|
|
92
116
|
== Templates
|
93
117
|
|
118
|
+
Templates are processed using generator instance scope as binding, so every instance method available on your
|
119
|
+
generator is available in template body.
|
120
|
+
|
94
121
|
There are a lot of ways of adding templates:
|
95
122
|
|
96
123
|
template :one_argument, 'source_and_destination.rb'
|
@@ -135,17 +162,20 @@ A generator for creating a model class, such as it used by Merb or Rails, could
|
|
135
162
|
def self.source_root
|
136
163
|
File.join(super, 'model')
|
137
164
|
end
|
138
|
-
|
165
|
+
|
166
|
+
# description end users see next to generator name
|
139
167
|
desc <<-DESC
|
140
168
|
This is a model generator
|
141
169
|
DESC
|
142
|
-
|
170
|
+
|
171
|
+
# options generator takes, their metadata, like description or arguments type
|
143
172
|
option :testing_framework, :desc => 'Specify which testing framework to use (spec, test_unit)'
|
144
173
|
option :orm, :desc => 'Specify which Object-Relation Mapper to use (none, activerecord, datamapper, sequel)'
|
145
|
-
|
174
|
+
|
175
|
+
# you may use shortcuts for first 4 option positions
|
146
176
|
first_argument :name, :required => true
|
147
177
|
second_argument :attributes, :as => :hash, :default => {}
|
148
|
-
|
178
|
+
|
149
179
|
invoke :migration do |generator|
|
150
180
|
generator.new(destination_root, options.merge(:model => true), name, attributes)
|
151
181
|
end
|
data/Rakefile
CHANGED
@@ -12,6 +12,11 @@ EMAIL = "jonas.nicklas@gmail.com"
|
|
12
12
|
HOMEPAGE = "http://templater.rubyforge.org/"
|
13
13
|
SUMMARY = "File generation system"
|
14
14
|
|
15
|
+
|
16
|
+
#
|
17
|
+
# ==== Gemspec and installation
|
18
|
+
#
|
19
|
+
|
15
20
|
spec = Gem::Specification.new do |s|
|
16
21
|
s.name = NAME
|
17
22
|
s.version = Templater::VERSION
|
@@ -38,9 +43,15 @@ Rake::GemPackageTask.new(spec) do |pkg|
|
|
38
43
|
pkg.gem_spec = spec
|
39
44
|
end
|
40
45
|
|
46
|
+
desc "removes any generated content"
|
47
|
+
task :clean do
|
48
|
+
FileUtils.rm_rf "clobber/*"
|
49
|
+
FileUtils.rm_rf "pkg/*"
|
50
|
+
end
|
51
|
+
|
41
52
|
desc "install the plugin locally"
|
42
|
-
task :install => [:package] do
|
43
|
-
sh %{sudo gem install pkg/#{NAME}-#{VERSION} --no-update-sources}
|
53
|
+
task :install => [:clean, :package] do
|
54
|
+
sh %{sudo gem install pkg/#{NAME}-#{Templater::VERSION} --no-update-sources}
|
44
55
|
end
|
45
56
|
|
46
57
|
desc "create a gemspec file"
|
@@ -54,11 +65,15 @@ namespace :jruby do
|
|
54
65
|
|
55
66
|
desc "Run :package and install the resulting .gem with jruby"
|
56
67
|
task :install => :package do
|
57
|
-
sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{
|
68
|
+
sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Templater::VERSION}.gem --no-rdoc --no-ri}
|
58
69
|
end
|
59
70
|
|
60
71
|
end
|
61
72
|
|
73
|
+
#
|
74
|
+
# ==== RDoc
|
75
|
+
#
|
76
|
+
|
62
77
|
desc 'Generate documentation for Templater.'
|
63
78
|
Rake::RDocTask.new(:doc) do |rdoc|
|
64
79
|
rdoc.rdoc_dir = 'doc'
|
@@ -67,4 +82,23 @@ Rake::RDocTask.new(:doc) do |rdoc|
|
|
67
82
|
rdoc.rdoc_files.include('README')
|
68
83
|
rdoc.rdoc_files.include('LICENSE')
|
69
84
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
70
|
-
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# ==== RCov
|
89
|
+
#
|
90
|
+
|
91
|
+
desc "Run coverage suite"
|
92
|
+
task :rcov do
|
93
|
+
require 'fileutils'
|
94
|
+
FileUtils.rm_rf("coverage") if File.directory?("coverage")
|
95
|
+
FileUtils.mkdir("coverage")
|
96
|
+
path = File.expand_path(Dir.pwd)
|
97
|
+
files = Dir["spec/**/*_spec.rb"]
|
98
|
+
files.each do |spec|
|
99
|
+
puts "Getting coverage for #{File.expand_path(spec)}"
|
100
|
+
command = %{rcov #{File.expand_path(spec)} --aggregate #{path}/coverage/data.data}
|
101
|
+
command += " --no-html" unless spec == files.last
|
102
|
+
`#{command} 2>&1`
|
103
|
+
end
|
104
|
+
end
|
data/lib/templater.rb
CHANGED
@@ -10,6 +10,7 @@ require 'facets'
|
|
10
10
|
require path + 'capture_helpers'
|
11
11
|
require path + 'template'
|
12
12
|
require path + 'file'
|
13
|
+
require path + 'empty_directory'
|
13
14
|
require path + 'generator'
|
14
15
|
require path + 'proxy'
|
15
16
|
require path + 'manifold'
|
@@ -39,6 +40,6 @@ module Templater
|
|
39
40
|
class MalformattedArgumentError < ArgumentError #:nodoc:
|
40
41
|
end
|
41
42
|
|
42
|
-
VERSION = '0.1.
|
43
|
+
VERSION = '0.1.2'
|
43
44
|
|
44
|
-
end
|
45
|
+
end
|
@@ -57,8 +57,12 @@ module Templater
|
|
57
57
|
# Try to instantiate a generator, if the arguments to it were incorrect: show a help message
|
58
58
|
begin
|
59
59
|
@generator = @generator_class.new(@destination_root, @options, *arguments)
|
60
|
-
rescue Templater::ArgumentError
|
61
|
-
|
60
|
+
rescue Templater::ArgumentError => e
|
61
|
+
if @options[:debug]
|
62
|
+
raise e
|
63
|
+
else
|
64
|
+
self.help
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
if @options[:pretend]
|
data/lib/templater/cli/parser.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Templater
|
2
|
+
class EmptyDirectory
|
3
|
+
|
4
|
+
attr_reader :name, :destination
|
5
|
+
|
6
|
+
def initialize(name, destination)
|
7
|
+
@name, @destination = name, destination
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns the destination path relative to Dir.pwd. This is useful for prettier output in interfaces
|
11
|
+
# where the destination root is Dir.pwd.
|
12
|
+
#
|
13
|
+
# === Returns
|
14
|
+
# String:: The destination relative to Dir.pwd
|
15
|
+
def relative_destination
|
16
|
+
@destination.sub(::Dir.pwd + ::File::SEPARATOR, '')
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the contents of the source file as a String
|
20
|
+
#
|
21
|
+
# === Returns
|
22
|
+
# String:: The source file.
|
23
|
+
def render
|
24
|
+
::File.read(source)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Checks if the destination file already exists.
|
28
|
+
#
|
29
|
+
# === Returns
|
30
|
+
# Boolean:: true if the file exists, false otherwise.
|
31
|
+
def exists?
|
32
|
+
::File.exists?(destination)
|
33
|
+
end
|
34
|
+
|
35
|
+
# For empty directory this is in fact alias for exists? method.
|
36
|
+
#
|
37
|
+
# === Returns
|
38
|
+
# Boolean:: true if it is identical, false otherwise.
|
39
|
+
def identical?
|
40
|
+
exists?
|
41
|
+
end
|
42
|
+
|
43
|
+
# Renders the template and copies it to the destination.
|
44
|
+
def invoke!
|
45
|
+
::FileUtils.mkdir_p(destination)
|
46
|
+
end
|
47
|
+
|
48
|
+
# removes the destination file
|
49
|
+
def revoke!
|
50
|
+
::FileUtils.rm_rf(::File.expand_path(destination))
|
51
|
+
end
|
52
|
+
end # EmptyDirectory
|
53
|
+
end # Templater
|
data/lib/templater/file.rb
CHANGED
@@ -21,7 +21,7 @@ module Templater
|
|
21
21
|
# === Returns
|
22
22
|
# String:: The destination relative to Dir.pwd
|
23
23
|
def relative_destination
|
24
|
-
@destination.sub(::Dir.pwd +
|
24
|
+
@destination.sub(::Dir.pwd + ::File::SEPARATOR, '')
|
25
25
|
end
|
26
26
|
|
27
27
|
# Returns the contents of the source file as a String
|
@@ -60,4 +60,4 @@ module Templater
|
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
63
|
-
end
|
63
|
+
end
|
data/lib/templater/generator.rb
CHANGED
@@ -38,6 +38,16 @@ module Templater
|
|
38
38
|
# Array[Hash{Symbol=>Object}]:: A list of invocations
|
39
39
|
def invocations; @invocations ||= []; end
|
40
40
|
|
41
|
+
# Returns an array of hashes, where each hash describes a single empty directory created by generator.
|
42
|
+
#
|
43
|
+
# ==== Returns
|
44
|
+
# Array[Hash{Symbol=>Object}]:: A list of empty directories created by generator.
|
45
|
+
def empty_directories; @empty_directories ||= []; end
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
41
51
|
# A shorthand method for adding the first argument, see +Templater::Generator.argument+
|
42
52
|
def first_argument(*args); argument(0, *args); end
|
43
53
|
|
@@ -50,6 +60,10 @@ module Templater
|
|
50
60
|
# A shorthand method for adding the fourth argument, see +Templater::Generator.argument+
|
51
61
|
def fourth_argument(*args); argument(3, *args); end
|
52
62
|
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
53
67
|
# If the argument is omitted, simply returns the description for this generator, otherwise
|
54
68
|
# sets the description to the passed string.
|
55
69
|
#
|
@@ -244,6 +258,15 @@ module Templater
|
|
244
258
|
:render => false
|
245
259
|
}
|
246
260
|
end
|
261
|
+
|
262
|
+
def empty_directory(name, path = nil)
|
263
|
+
path = name.to_s unless path
|
264
|
+
|
265
|
+
self.empty_directories << {
|
266
|
+
:name => name,
|
267
|
+
:destination => path
|
268
|
+
}
|
269
|
+
end
|
247
270
|
|
248
271
|
# An easy way to add many templates to a generator, each item in the list is added as a
|
249
272
|
# template. The provided list can be either an array of Strings or a Here-Doc with templates
|
@@ -304,11 +327,12 @@ module Templater
|
|
304
327
|
# template_destination<Array[String]>:: A list of extensions. If a file has one of these
|
305
328
|
# extensions, it is considered a template and will be rendered with ERB.
|
306
329
|
# options<Hash{Symbol=>Object}>:: A list of options.
|
307
|
-
def glob!(dir = nil, template_extensions = %w(rb css js erb html yml), options={})
|
330
|
+
def glob!(dir = nil, template_extensions = %w(rb css js erb html yml Rakefile TODO LICENSE README), options={})
|
308
331
|
::Dir[::File.join(source_root, dir.to_s, '**/*')].each do |action|
|
309
332
|
unless ::File.directory?(action)
|
310
333
|
action = action.sub("#{source_root}/", '')
|
311
|
-
|
334
|
+
|
335
|
+
if template_extensions.include?(::File.extname(action)[1..-1]) or template_extensions.include?(::File.basename(action))
|
312
336
|
template(action.downcase.gsub(/[^a-z0-9]+/, '_').to_sym, action, action)
|
313
337
|
else
|
314
338
|
file(action.downcase.gsub(/[^a-z0-9]+/, '_').to_sym, action, action)
|
@@ -342,7 +366,12 @@ module Templater
|
|
342
366
|
raise Templater::SourceNotSpecifiedError, "Subclasses of Templater::Generator must override the source_root method, to specify where source templates are located."
|
343
367
|
end
|
344
368
|
|
345
|
-
end
|
369
|
+
end # end of eigenclass
|
370
|
+
|
371
|
+
|
372
|
+
#
|
373
|
+
# ==== Instance methods
|
374
|
+
#
|
346
375
|
|
347
376
|
attr_accessor :destination_root, :arguments, :options
|
348
377
|
|
@@ -394,6 +423,14 @@ module Templater
|
|
394
423
|
def file(name)
|
395
424
|
self.files.find { |f| f.name == name }
|
396
425
|
end
|
426
|
+
|
427
|
+
# Finds and returns all empty directories whose options match the generator options.
|
428
|
+
#
|
429
|
+
# === Returns
|
430
|
+
# [Templater::EmptyDirectory]:: The found empty directories that generator creates.
|
431
|
+
def empty_directory(name)
|
432
|
+
self.empty_directories.find { |d| d.name == name }
|
433
|
+
end
|
397
434
|
|
398
435
|
# Finds and returns all templates whose options match the generator options.
|
399
436
|
#
|
@@ -418,6 +455,16 @@ module Templater
|
|
418
455
|
end
|
419
456
|
files.compact
|
420
457
|
end
|
458
|
+
|
459
|
+
# Finds and returns all empty directories generator creates.
|
460
|
+
#
|
461
|
+
# === Returns
|
462
|
+
# [Templater::File]:: The found files.
|
463
|
+
def empty_directories
|
464
|
+
self.class.empty_directories.map do |t|
|
465
|
+
Templater::Proxy.new(self, t[:name], nil, t[:destination], &t[:block]).to_empty_directory
|
466
|
+
end.compact
|
467
|
+
end
|
421
468
|
|
422
469
|
# Finds and returns all templates whose options match the generator options.
|
423
470
|
#
|
@@ -445,7 +492,7 @@ module Templater
|
|
445
492
|
# === Returns
|
446
493
|
# [Templater::File, Templater::Template]:: The found templates and files.
|
447
494
|
def actions
|
448
|
-
actions = templates + files
|
495
|
+
actions = templates + files + empty_directories
|
449
496
|
actions += invocations.map { |i| i.actions }
|
450
497
|
actions.flatten
|
451
498
|
end
|
@@ -557,4 +604,4 @@ module Templater
|
|
557
604
|
end
|
558
605
|
end
|
559
606
|
|
560
|
-
end
|
607
|
+
end
|
data/lib/templater/proxy.rb
CHANGED
@@ -24,6 +24,11 @@ module Templater
|
|
24
24
|
instance_eval(&@block) if @block
|
25
25
|
Templater::File.new(@name, get_source, get_destination)
|
26
26
|
end
|
27
|
+
|
28
|
+
def to_empty_directory
|
29
|
+
instance_eval(&@block) if @block
|
30
|
+
Templater::EmptyDirectory.new(@name, get_destination)
|
31
|
+
end
|
27
32
|
|
28
33
|
def method_missing(method, *args, &block)
|
29
34
|
if @generator
|
@@ -52,4 +57,4 @@ module Templater
|
|
52
57
|
|
53
58
|
end
|
54
59
|
|
55
|
-
end
|
60
|
+
end
|
data/lib/templater/template.rb
CHANGED
@@ -25,7 +25,7 @@ module Templater
|
|
25
25
|
# === Returns
|
26
26
|
# String:: The destination relative to Dir.pwd
|
27
27
|
def relative_destination
|
28
|
-
@destination.sub(::Dir.pwd +
|
28
|
+
@destination.sub(::Dir.pwd + ::File::SEPARATOR, '')
|
29
29
|
end
|
30
30
|
|
31
31
|
# Renders the template using ERB and returns the result as a String.
|
@@ -64,4 +64,4 @@ module Templater
|
|
64
64
|
end
|
65
65
|
|
66
66
|
end
|
67
|
-
end
|
67
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Templater::EmptyDirectory, '.new' do
|
4
|
+
it "sets name and destination" do
|
5
|
+
Templater::EmptyDirectory.new(:monkey, '/path/to/destination').
|
6
|
+
name.should == :monkey
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'sets destination' do
|
10
|
+
Templater::EmptyDirectory.new(:monkey, '/path/to/destination').
|
11
|
+
destination.should == '/path/to/destination'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
describe Templater::EmptyDirectory, '#relative_destination' do
|
19
|
+
it "returns destination relative to the pwd" do
|
20
|
+
Dir.stub!(:pwd).and_return('/path/to')
|
21
|
+
file = Templater::EmptyDirectory.new(:monkey, '/path/to/destination/with/some/more/subdirs')
|
22
|
+
file.relative_destination.should == 'destination/with/some/more/subdirs'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
describe Templater::EmptyDirectory, '#render' do
|
30
|
+
it 'does nothing for empty directories?'
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
describe Templater::EmptyDirectory, '#exists?' do
|
37
|
+
|
38
|
+
it "should exist if the destination file exists" do
|
39
|
+
file = Templater::EmptyDirectory.new(:monkey, result_path('erb.rbs'))
|
40
|
+
file.should be_exists
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not exist if the destination file does not exist" do
|
44
|
+
file = Templater::EmptyDirectory.new(:monkey, result_path('some_weird_file.rbs'))
|
45
|
+
file.should_not be_exists
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
describe Templater::EmptyDirectory, '#identical' do
|
52
|
+
it "should not be identical if the destination file doesn't exist" do
|
53
|
+
file = Templater::EmptyDirectory.new(:monkey, result_path('some_weird/path/that_does/not_exist'))
|
54
|
+
file.should_not be_identical
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should not be identical if the destination file is not identical to the source file" do
|
58
|
+
file = Templater::EmptyDirectory.new(:monkey, result_path('simple_erb.rbs'))
|
59
|
+
file.should be_exists
|
60
|
+
file.should be_identical
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should be identical if the destination file is identical to the source file" do
|
64
|
+
file= Templater::EmptyDirectory.new(:monkey, result_path('file.rbs'))
|
65
|
+
file.should be_exists
|
66
|
+
file.should be_identical
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
describe Templater::EmptyDirectory, '#invoke!' do
|
73
|
+
it "should copy the source file to the destination" do
|
74
|
+
file = Templater::EmptyDirectory.new(:monkey, result_path('path/to/subdir/test2.rbs'))
|
75
|
+
|
76
|
+
file.invoke!
|
77
|
+
|
78
|
+
File.exists?(result_path('path/to/subdir/test2.rbs')).should be_true
|
79
|
+
|
80
|
+
# cleanup
|
81
|
+
FileUtils.rm_rf(result_path('path'))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
describe Templater::EmptyDirectory, '#revoke!' do
|
88
|
+
it "removes the destination directory" do
|
89
|
+
file = Templater::EmptyDirectory.new(:monkey, result_path('path/to/empty/subdir/'))
|
90
|
+
|
91
|
+
file.invoke!
|
92
|
+
File.exists?(result_path('path/to/empty/subdir/')).should be_true
|
93
|
+
|
94
|
+
file.revoke!
|
95
|
+
File.exists?(result_path('path/to/empty/subdir/')).should be_false
|
96
|
+
end
|
97
|
+
end
|