temp 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.mdown +7 -15
- data/bin/temp +1 -2
- data/lib/temp.rb +5 -1
- data/lib/temp/config.rb +37 -0
- data/lib/temp/exceptions.rb +10 -0
- data/lib/temp/project.rb +54 -0
- data/lib/temp/runner.rb +41 -22
- data/lib/temp/tempfile.rb +51 -0
- data/lib/temp/template.rb +40 -0
- data/lib/temp/version.rb +1 -1
- data/spec/spec_helper.rb +33 -0
- data/spec/temp_spec.rb +174 -78
- data/spec/tempconf.yml +1 -2
- metadata +8 -16
- data/lib/temp/copier.rb +0 -76
- data/spec/template/template.txt +0 -1
- data/spec/template/template1/.tempignore +0 -1
- data/spec/template/template1/foo/bar/baz.txt +0 -1
- data/spec/template/template1/foo/bar/ignore-me.txt +0 -1
- data/spec/template/template1/hello.txt +0 -1
- data/spec/template/template1/ignore-me.txt +0 -1
data/Readme.mdown
CHANGED
@@ -10,25 +10,17 @@ You can install Temp with `gem install temp`.
|
|
10
10
|
|
11
11
|
### Templates
|
12
12
|
|
13
|
-
By default, Temp will look for templates in `~/.temp
|
14
|
-
|
15
|
-
|
13
|
+
By default, Temp will look for templates in `~/.temp`, but you can specify a
|
14
|
+
different template directory with the `~/.tempconf` file.
|
15
|
+
|
16
|
+
Templates can contain Tempfiles that specify the name, description, files to
|
17
|
+
ignore, etc. for a template.
|
16
18
|
|
17
19
|
### Project
|
18
20
|
|
19
21
|
To create a project from a template, use `temp project_dir template_name`. Temp
|
20
|
-
will create a project directory and copy
|
21
|
-
|
22
|
-
|
23
|
-
## Later
|
24
|
-
|
25
|
-
Temp isn't very useful at the moment but I do have some features planned for
|
26
|
-
later:
|
27
|
-
|
28
|
-
- A DSL for the templates
|
29
|
-
- Passing options to the DSL so that, for example, a file can be ignored if the
|
30
|
-
user specifies a certain option on the command line
|
31
|
-
- Allow ERB to be used in files
|
22
|
+
will create a project directory and copy the files from a template of the given
|
23
|
+
name.
|
32
24
|
|
33
25
|
## License
|
34
26
|
|
data/bin/temp
CHANGED
data/lib/temp.rb
CHANGED
data/lib/temp/config.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Temp
|
4
|
+
|
5
|
+
# A Config object loads the Temp configuration file and provides access to its
|
6
|
+
# values for other parts of Temp.
|
7
|
+
class Config
|
8
|
+
|
9
|
+
DEFAULT_CONF_FILE = File.expand_path('~/.tempconf')
|
10
|
+
DEFAULT_TEMP_DIR = File.expand_path('~/.temp')
|
11
|
+
|
12
|
+
attr_reader :file, :vals, :template_dir
|
13
|
+
attr_accessor :template_options
|
14
|
+
|
15
|
+
# Load a configuration file and set the configuration variables to the
|
16
|
+
# values in the file. If not given a filename, load the default
|
17
|
+
# configuration file. If the configuration file doesn't exist, use default
|
18
|
+
# configuration values. Also accepts template options to make it easier to
|
19
|
+
# pass to tempfiles.
|
20
|
+
def initialize(file = DEFAULT_CONF_FILE, template_options = {})
|
21
|
+
@file = file
|
22
|
+
@template_options = template_options
|
23
|
+
|
24
|
+
if File.file? @file
|
25
|
+
@vals = YAML::load_file(@file)
|
26
|
+
else
|
27
|
+
@vals = {
|
28
|
+
:template_dir => DEFAULT_TEMP_DIR
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
@template_dir = File.expand_path(@vals[:template_dir])
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/temp/project.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Temp
|
5
|
+
|
6
|
+
# A Project object represents a project and provides a method for copying the
|
7
|
+
# files from a template to create a project.
|
8
|
+
class Project
|
9
|
+
|
10
|
+
attr_reader :name, :path, :template
|
11
|
+
|
12
|
+
# Initialize all the required information for creating the project and make
|
13
|
+
# sure the project doesn't already exist
|
14
|
+
def initialize(path, template)
|
15
|
+
@path = File.expand_path(path)
|
16
|
+
@template = template
|
17
|
+
if File.file? @path
|
18
|
+
raise Temp::Exceptions::ProjectExistsError
|
19
|
+
elsif File.directory? @path
|
20
|
+
@name = @template.filename
|
21
|
+
@path = File.join(@path, @name)
|
22
|
+
raise Temp::Exceptions::ProjectExistsError if File.exist? @path
|
23
|
+
else
|
24
|
+
@name = File.basename(@path)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Create the project
|
29
|
+
def create
|
30
|
+
if File.file? @template.path
|
31
|
+
FileUtils.cp(@template.path, @path)
|
32
|
+
else
|
33
|
+
FileUtils.mkdir_p(path)
|
34
|
+
(@template.files - @template.tempfile.ignore_files).each do |file|
|
35
|
+
t_file = File.join(@template.path, file)
|
36
|
+
p_file = File.join(@path, file)
|
37
|
+
if File.file? t_file
|
38
|
+
if @template.tempfile.erb_files.include? file
|
39
|
+
renderer = ERB.new(File.read(t_file))
|
40
|
+
File.open(p_file, 'w') { |f|
|
41
|
+
f.write renderer.result(@template.tempfile.get_binding) }
|
42
|
+
else
|
43
|
+
FileUtils.cp(t_file, p_file)
|
44
|
+
end
|
45
|
+
else
|
46
|
+
Dir.mkdir(p_file)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
data/lib/temp/runner.rb
CHANGED
@@ -1,43 +1,62 @@
|
|
1
|
-
require 'yaml'
|
2
1
|
require 'optparse'
|
3
2
|
|
4
3
|
module Temp
|
5
4
|
|
6
|
-
|
5
|
+
# The Runner module contains methods for Temp's command line interface.
|
6
|
+
module Runner
|
7
7
|
|
8
|
-
|
8
|
+
# Run Temp as a command line program
|
9
|
+
def self.start!(args)
|
10
|
+
conf = Temp::Config.new(Temp::Config::DEFAULT_CONF_FILE)
|
11
|
+
options = {}
|
9
12
|
|
10
|
-
def initialize(options = {})
|
11
|
-
@conf_file = File.expand_path(options[:conf_file])
|
12
|
-
@conf = { :template_dir => '~/.temp' }
|
13
|
-
@args = options[:args] || {}
|
14
|
-
|
15
|
-
if @conf_file && File.file?(@conf_file)
|
16
|
-
@conf = YAML::load_file(@conf_file)
|
17
|
-
else
|
18
|
-
File.open(@conf_file, 'w') { |f| f.write(@conf.to_yaml) }
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def start!
|
23
13
|
OptionParser.new do |o|
|
24
14
|
o.banner = 'Usage: temp [options] [project] [template]'
|
25
15
|
|
26
16
|
o.on('-v', '--version', 'Show version information') do
|
27
17
|
puts "Temp #{Temp::VERSION}"
|
18
|
+
exit
|
28
19
|
end
|
29
|
-
end.parse!(@args)
|
30
20
|
|
31
|
-
|
21
|
+
o.on('-l', '--list [name]', 'List all templates') do |name|
|
22
|
+
if name
|
23
|
+
t = Temp::Template.new(name, conf)
|
24
|
+
puts "#{t.name} - #{t.desc}"
|
25
|
+
else
|
26
|
+
Temp::Template.all(conf).each do |t|
|
27
|
+
puts "#{t.name} - #{t.desc}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
|
33
|
+
o.on('-t', '--template-options [opts]',
|
34
|
+
'Pass comma-separated option flags to the template') do |opts|
|
35
|
+
opts.split(',').each { |o| options[o.to_sym] = true }
|
36
|
+
end
|
37
|
+
end.parse!(args)
|
38
|
+
conf.template_options = options
|
39
|
+
|
32
40
|
if ARGV.size == 0
|
33
|
-
|
41
|
+
puts 'No template specified.'
|
34
42
|
elsif ARGV.size == 1
|
35
|
-
|
43
|
+
template = Temp::Template.new(ARGV[0], conf)
|
44
|
+
Temp::Project.new(Dir.pwd, template).create
|
36
45
|
else
|
37
|
-
|
46
|
+
template = Temp::Template.new(ARGV[1], conf)
|
47
|
+
Temp::Project.new(ARGV[0], template).create
|
38
48
|
end
|
39
49
|
rescue => e
|
40
|
-
|
50
|
+
case e.exception
|
51
|
+
when Temp::Exceptions::ProjectExistsError
|
52
|
+
puts 'Cannot create project because file exists there.'
|
53
|
+
when Temp::Exceptions::TemplateNonExistentError
|
54
|
+
puts 'The specified template does not exist.'
|
55
|
+
when OptionParser::InvalidOption
|
56
|
+
puts e.message
|
57
|
+
else
|
58
|
+
raise e
|
59
|
+
end
|
41
60
|
end
|
42
61
|
|
43
62
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Temp
|
2
|
+
|
3
|
+
# A Tempfile object acts as a sandbox for the Tempfile DSL.
|
4
|
+
class Tempfile
|
5
|
+
|
6
|
+
attr_reader :options, :info, :ignore_files, :erb_files
|
7
|
+
|
8
|
+
# Load a Tempfile in the specified directory. Options can be passed so that
|
9
|
+
# they can be accessed from the Tempfile.
|
10
|
+
def initialize(dir, options = {})
|
11
|
+
@dir = File.expand_path(dir)
|
12
|
+
@file = File.join(@dir, 'Tempfile')
|
13
|
+
@options = options
|
14
|
+
@info = {}
|
15
|
+
@ignore_files = []
|
16
|
+
@erb_files = []
|
17
|
+
instance_eval File.read(@file) if File.file? @file
|
18
|
+
end
|
19
|
+
|
20
|
+
# Public method to get the object's binding
|
21
|
+
def get_binding
|
22
|
+
binding
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set the template name
|
26
|
+
def name(str)
|
27
|
+
info[:name] = str
|
28
|
+
end
|
29
|
+
|
30
|
+
# Set the template description
|
31
|
+
def desc(str)
|
32
|
+
info[:desc] = str
|
33
|
+
end
|
34
|
+
|
35
|
+
# Add files to the ignore list by expanding the given glob(s)
|
36
|
+
def ignore(*files)
|
37
|
+
@ignore_files |= files.map do |file|
|
38
|
+
Dir.glob(File.join(@dir, file)).map { |f| f.sub(@dir + '/', '') }
|
39
|
+
end.flatten
|
40
|
+
end
|
41
|
+
|
42
|
+
# Add files to the ERB list by expanding the given glob(s)
|
43
|
+
def use_erb(*files)
|
44
|
+
@erb_files |= files.map do |file|
|
45
|
+
Dir.glob(File.join(@dir, file)).map { |f| f.sub(@dir + '/', '') }
|
46
|
+
end.flatten
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Temp
|
4
|
+
|
5
|
+
# A Template object represents a template and provides information about it.
|
6
|
+
class Template
|
7
|
+
|
8
|
+
attr_reader :conf, :tempfile, :path, :filename, :name, :desc, :files
|
9
|
+
|
10
|
+
# Return an array of all templates in the template directory
|
11
|
+
def self.all(conf)
|
12
|
+
Dir.entries(conf.template_dir).map do |t|
|
13
|
+
unless t == '.' || t == '..'
|
14
|
+
Temp::Template.new(t, conf)
|
15
|
+
end
|
16
|
+
end.compact
|
17
|
+
end
|
18
|
+
|
19
|
+
# Load a template
|
20
|
+
def initialize(name, conf)
|
21
|
+
@conf = conf
|
22
|
+
@path = File.join(@conf.template_dir, name)
|
23
|
+
@filename = name
|
24
|
+
raise Temp::Exceptions::TemplateNonExistentError unless File.exist? @path
|
25
|
+
|
26
|
+
@tempfile = Temp::Tempfile.new(@path, @conf.template_options)
|
27
|
+
@name = @tempfile.info[:name] || name
|
28
|
+
@desc = @tempfile.info[:desc] || ''
|
29
|
+
@files = Template.find_files(@path) - @tempfile.ignore_files
|
30
|
+
end
|
31
|
+
|
32
|
+
# Find all of the files in a path
|
33
|
+
def self.find_files(path)
|
34
|
+
path = File.expand_path(path)
|
35
|
+
Dir.glob(File.join(path, '**/*')).map { |f| f.sub(path + '/', '') }
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/lib/temp/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,36 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib',
|
3
3
|
'temp.rb'))
|
4
|
+
|
5
|
+
# Create a template and return a hash with all the template's information
|
6
|
+
def create_template(path, name, desc, files, ignore, erb)
|
7
|
+
path = File.expand_path(path)
|
8
|
+
Dir.mkdir(path)
|
9
|
+
|
10
|
+
files.each do |file|
|
11
|
+
file = File.join(path, file)
|
12
|
+
if file =~ /.*\..*/
|
13
|
+
File.open(file, 'w') { |f| f.write("Hello, World!\n") }
|
14
|
+
else
|
15
|
+
Dir.mkdir(file)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
tempfile = "name '#{name}'\ndesc '#{desc}'\n\n"
|
20
|
+
ignore.each { |f| tempfile << "ignore '#{f}'\n" }
|
21
|
+
erb.each { |f| tempfile << "use_erb '#{f}'\n" }
|
22
|
+
tempfile << "\n@foo = 'Foo'\n"
|
23
|
+
File.open(File.join(path, 'Tempfile'), 'w') { |f| f.write(tempfile) }
|
24
|
+
|
25
|
+
{
|
26
|
+
:path => path,
|
27
|
+
:filename => File.basename(path),
|
28
|
+
:name => name,
|
29
|
+
:desc => desc,
|
30
|
+
:files => (['Tempfile'] + files).sort,
|
31
|
+
:ignore => ignore.map { |f| Dir.glob(File.join(path, f)) }.flatten.
|
32
|
+
map { |f| f.sub(path + '/', '') },
|
33
|
+
:erb => erb.map { |f| Dir.glob(File.join(path, f)) }.flatten.
|
34
|
+
map { |f| f.sub(path + '/', '') },
|
35
|
+
}
|
36
|
+
end
|
data/spec/temp_spec.rb
CHANGED
@@ -5,140 +5,236 @@ describe Temp do
|
|
5
5
|
before :each do
|
6
6
|
@dir = File.expand_path(File.dirname(__FILE__))
|
7
7
|
@test_dir = File.join(@dir, 'test')
|
8
|
-
@
|
9
|
-
|
8
|
+
@template_dir = File.join(@test_dir, 'template')
|
9
|
+
|
10
|
+
FileUtils.mkdir_p(@template_dir)
|
11
|
+
File.open(File.join(@test_dir, 'foo.txt'), 'w') { |f|
|
12
|
+
f.write "Hello, World!\n" }
|
13
|
+
|
14
|
+
@conf_file = File.join(@dir, 'tempconf.yml')
|
15
|
+
@conf = Temp::Config.new(@conf_file)
|
16
|
+
|
17
|
+
@template1_info = create_template(File.join(@template_dir, 'template1'),
|
18
|
+
'Template 1',
|
19
|
+
'A test template.',
|
20
|
+
['hello.txt',
|
21
|
+
'ignore.txt',
|
22
|
+
'foo',
|
23
|
+
'foo/bar',
|
24
|
+
'foo/bar/baz.txt'],
|
25
|
+
['**/*ignore*'],
|
26
|
+
['hello.txt'])
|
27
|
+
@template1_hello_erb = 'Hello, <%= @foo %>!'
|
28
|
+
@template1_hello = 'Hello, Foo!'
|
29
|
+
File.open(File.join(@template1_info[:path], 'hello.txt'), 'w') { |f|
|
30
|
+
f.write @template1_hello_erb }
|
31
|
+
@template2_info = { :path => File.join(@template_dir, 'template2.txt'),
|
32
|
+
:name => 'template2.txt' }
|
33
|
+
File.open(@template2_info[:path], 'w') { |f| f.write("Hello, World!\n") }
|
34
|
+
@template1 = Temp::Template.new(@template1_info[:filename], @conf)
|
35
|
+
@template2 = Temp::Template.new(@template2_info[:name], @conf)
|
10
36
|
end
|
11
37
|
|
12
38
|
after :each do
|
13
39
|
FileUtils.rm_r(@test_dir)
|
14
40
|
end
|
15
41
|
|
16
|
-
describe Temp::
|
42
|
+
describe Temp::Config do
|
17
43
|
|
18
|
-
|
44
|
+
it 'should load the config file' do
|
45
|
+
Temp::Config.new(@conf_file)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should have the default template directory' do
|
49
|
+
conf = Temp::Config.new('hopefully-nonexistent-file.txt')
|
50
|
+
conf.template_dir.should == Temp::Config::DEFAULT_TEMP_DIR
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should have the template directory specified in the config file' do
|
54
|
+
conf = Temp::Config.new(@conf_file)
|
55
|
+
conf.template_dir.should == @template_dir
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe Temp::Tempfile do
|
61
|
+
|
62
|
+
describe 'template1 tempfile' do
|
19
63
|
|
20
64
|
before :each do
|
21
|
-
@
|
22
|
-
|
65
|
+
@tempfile = Temp::Tempfile.new(@template1_info[:path])
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should have the correct name' do
|
69
|
+
@tempfile.info[:name].should == @template1_info[:name]
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should have the correct description' do
|
73
|
+
@tempfile.info[:desc].should == @template1_info[:desc]
|
23
74
|
end
|
24
75
|
|
25
|
-
it 'should
|
26
|
-
|
27
|
-
runner.conf[:test].should == 'test'
|
76
|
+
it 'should ignore certain files' do
|
77
|
+
@tempfile.ignore_files.sort.should == @template1_info[:ignore]
|
28
78
|
end
|
29
79
|
|
30
|
-
it 'should
|
31
|
-
|
32
|
-
File.file?(@conf_file2)
|
80
|
+
it 'should use ERB on some files' do
|
81
|
+
@tempfile.erb_files.should == @template1_info[:erb]
|
33
82
|
end
|
34
83
|
|
35
84
|
end
|
36
85
|
|
37
86
|
end
|
38
87
|
|
39
|
-
describe Temp::
|
88
|
+
describe Temp::Template do
|
40
89
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
@template1 = File.join(@temp_dir, @template1_name)
|
45
|
-
@template2_name = 'template.txt'
|
46
|
-
@template2 = File.join(@temp_dir, @template2_name)
|
90
|
+
it 'should return all templates' do
|
91
|
+
Temp::Template.all(@conf).map { |t| t.name }.should ==
|
92
|
+
[@template1_info[:name], @template2_info[:name]]
|
47
93
|
end
|
48
94
|
|
49
|
-
describe '
|
95
|
+
describe 'load template1' do
|
50
96
|
|
51
97
|
before :each do
|
52
|
-
@
|
53
|
-
f.sub(@template1 + '/', '') }.sort
|
54
|
-
@ignore = ['.tempignore'] | Dir.glob(File.read(File.join(@template1,
|
55
|
-
'.tempignore')).split(?\n)).map {
|
56
|
-
|f| File.expand_path(f).sub(@template1 + '/', '') }.sort
|
98
|
+
@template = Temp::Template.new(@template1_info[:filename], @conf)
|
57
99
|
end
|
58
100
|
|
59
|
-
it 'should
|
60
|
-
@
|
101
|
+
it 'should have correct name' do
|
102
|
+
@template.name.should == @template1_info[:name]
|
61
103
|
end
|
62
104
|
|
63
|
-
it 'should
|
64
|
-
@
|
105
|
+
it 'should have correct description' do
|
106
|
+
@template.desc.should == @template1_info[:desc]
|
65
107
|
end
|
66
108
|
|
67
|
-
it 'should
|
68
|
-
@
|
69
|
-
@ignore
|
109
|
+
it 'should have the correct files' do
|
110
|
+
@template.files.sort.should == @template1_info[:files] -
|
111
|
+
@template1_info[:ignore]
|
70
112
|
end
|
71
113
|
|
72
114
|
end
|
73
115
|
|
74
|
-
describe '
|
116
|
+
describe 'failure' do
|
75
117
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
@project2_file = File.join(@test_dir, @template2_name)
|
118
|
+
it 'should raise an exception when given a non-existing template name' do
|
119
|
+
lambda do
|
120
|
+
Temp::Template.new('foo', @conf)
|
121
|
+
end.should raise_error Temp::Exceptions::TemplateNonExistentError
|
81
122
|
end
|
82
123
|
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
describe Temp::Project do
|
129
|
+
|
130
|
+
before :each do
|
131
|
+
@conf = Temp::Config.new(@conf_file)
|
132
|
+
end
|
133
|
+
|
134
|
+
describe 'initialization' do
|
135
|
+
|
83
136
|
describe 'success' do
|
84
137
|
|
85
|
-
|
86
|
-
|
87
|
-
|
138
|
+
describe 'template1 with non-existent path' do
|
139
|
+
|
140
|
+
before :each do
|
141
|
+
@name = 'foo'
|
142
|
+
@path = File.join(@test_dir, @name)
|
143
|
+
@proj = Temp::Project.new(@path, @template1_info)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should have the correct name' do
|
147
|
+
@proj.name.should == @name
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should have the correct path' do
|
151
|
+
@proj.path.should == @path
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
describe 'template1 with existing path' do
|
157
|
+
|
158
|
+
before :each do
|
159
|
+
@name = @template1_info[:filename]
|
160
|
+
@path = File.join(@test_dir, @name)
|
161
|
+
@proj = Temp::Project.new(@test_dir, @template1)
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'should have the correct name' do
|
165
|
+
@proj.name.should == @name
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should have the correct path' do
|
169
|
+
@proj.path.should == @path
|
170
|
+
end
|
171
|
+
|
88
172
|
end
|
89
173
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
174
|
+
end
|
175
|
+
|
176
|
+
describe 'failure' do
|
177
|
+
|
178
|
+
describe 'template1 with existing file as path' do
|
179
|
+
|
180
|
+
it 'should raise an exception' do
|
181
|
+
lambda do
|
182
|
+
Temp::Project.new(File.join(@test_dir, 'foo.txt'),
|
183
|
+
@template1_info)
|
184
|
+
end.should raise_error Temp::Exceptions::ProjectExistsError
|
185
|
+
end
|
186
|
+
|
96
187
|
end
|
97
188
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
189
|
+
describe 'template1 with existing path and template in path' do
|
190
|
+
|
191
|
+
it 'should raise an exception' do
|
192
|
+
Dir.mkdir(File.join(@test_dir, @template1_info[:filename]))
|
193
|
+
lambda do
|
194
|
+
Temp::Project.new(@test_dir, @template1)
|
195
|
+
end.should raise_error Temp::Exceptions::ProjectExistsError
|
196
|
+
end
|
197
|
+
|
104
198
|
end
|
105
199
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
describe 'creation' do
|
205
|
+
|
206
|
+
describe 'template1' do
|
207
|
+
|
208
|
+
before :each do
|
209
|
+
@proj_dir = File.join(@test_dir, 'project1')
|
210
|
+
@proj = Temp::Project.new(@proj_dir, @template1)
|
115
211
|
end
|
116
212
|
|
117
|
-
it 'should
|
118
|
-
@
|
119
|
-
File.
|
213
|
+
it 'should have copied the correct files' do
|
214
|
+
@proj.create
|
215
|
+
Dir.glob(File.join(@proj_dir, '**/*')).map { |f|
|
216
|
+
f.sub(@proj_dir + '/', '') }.sort.should ==
|
217
|
+
@template1_info[:files] - @template1_info[:ignore]
|
120
218
|
end
|
121
219
|
|
122
|
-
it 'should
|
123
|
-
@
|
124
|
-
File.
|
220
|
+
it 'should use ERB on a file' do
|
221
|
+
@proj.create
|
222
|
+
File.read(File.join(@proj_dir, 'hello.txt')).should ==
|
223
|
+
@template1_hello
|
125
224
|
end
|
126
225
|
|
127
226
|
end
|
128
227
|
|
129
|
-
describe '
|
228
|
+
describe 'template2' do
|
130
229
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
@copier.create_project(@project1_dir, @template1_name)
|
135
|
-
end.should raise_error
|
230
|
+
before :each do
|
231
|
+
@proj_file = File.join(@test_dir, 'project.txt')
|
232
|
+
@proj = Temp::Project.new(@proj_file, @template2)
|
136
233
|
end
|
137
234
|
|
138
|
-
it 'should
|
139
|
-
|
140
|
-
|
141
|
-
end.should raise_error
|
235
|
+
it 'should have copied the template file' do
|
236
|
+
@proj.create
|
237
|
+
File.file?(@proj_file).should be_true
|
142
238
|
end
|
143
239
|
|
144
240
|
end
|
data/spec/tempconf.yml
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Austin Gatchell
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-10-09 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -48,18 +48,16 @@ files:
|
|
48
48
|
- Readme.mdown
|
49
49
|
- bin/temp
|
50
50
|
- lib/temp.rb
|
51
|
-
- lib/temp/
|
51
|
+
- lib/temp/config.rb
|
52
|
+
- lib/temp/exceptions.rb
|
53
|
+
- lib/temp/project.rb
|
52
54
|
- lib/temp/runner.rb
|
55
|
+
- lib/temp/tempfile.rb
|
56
|
+
- lib/temp/template.rb
|
53
57
|
- lib/temp/version.rb
|
54
58
|
- spec/spec_helper.rb
|
55
59
|
- spec/temp_spec.rb
|
56
60
|
- spec/tempconf.yml
|
57
|
-
- spec/template/template.txt
|
58
|
-
- spec/template/template1/.tempignore
|
59
|
-
- spec/template/template1/foo/bar/baz.txt
|
60
|
-
- spec/template/template1/foo/bar/ignore-me.txt
|
61
|
-
- spec/template/template1/hello.txt
|
62
|
-
- spec/template/template1/ignore-me.txt
|
63
61
|
- temp.gemspec
|
64
62
|
has_rdoc: true
|
65
63
|
homepage: https://github.com/ausgat/temp
|
@@ -97,9 +95,3 @@ test_files:
|
|
97
95
|
- spec/spec_helper.rb
|
98
96
|
- spec/temp_spec.rb
|
99
97
|
- spec/tempconf.yml
|
100
|
-
- spec/template/template.txt
|
101
|
-
- spec/template/template1/.tempignore
|
102
|
-
- spec/template/template1/foo/bar/baz.txt
|
103
|
-
- spec/template/template1/foo/bar/ignore-me.txt
|
104
|
-
- spec/template/template1/hello.txt
|
105
|
-
- spec/template/template1/ignore-me.txt
|
data/lib/temp/copier.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
|
-
module Temp
|
4
|
-
|
5
|
-
# A Copier object provides various methods for creating a project from a
|
6
|
-
# template. It can also be given a path to the directory where templates can
|
7
|
-
# be found.
|
8
|
-
class Copier
|
9
|
-
|
10
|
-
attr_reader :options
|
11
|
-
|
12
|
-
def initialize(options = {})
|
13
|
-
@options = options
|
14
|
-
@template_dir = File.expand_path(options[:template_dir] || '~/.temp')
|
15
|
-
end
|
16
|
-
|
17
|
-
# Creates a new project from a template. If a path is supplied, the
|
18
|
-
# project's name will be the last item in the path. Otherwise, it will have
|
19
|
-
# the same name as the template and be created in the current working
|
20
|
-
# directory.
|
21
|
-
def create_project(project = nil, template)
|
22
|
-
project = File.expand_path(project || template)
|
23
|
-
template_path = File.expand_path(File.join(@template_dir, template))
|
24
|
-
|
25
|
-
raise 'project already exists' if File.exist? project
|
26
|
-
raise 'template does not exist' unless File.exist? template_path
|
27
|
-
|
28
|
-
ignore = read_tempignore(template)
|
29
|
-
files = find_files(template, ignore)
|
30
|
-
|
31
|
-
if File.file? template_path
|
32
|
-
FileUtils.cp(template_path, project)
|
33
|
-
else
|
34
|
-
FileUtils.mkdir(project)
|
35
|
-
files.each do |file|
|
36
|
-
p = File.join(project, file)
|
37
|
-
t = File.join(template_path, file)
|
38
|
-
|
39
|
-
if File.directory? t
|
40
|
-
FileUtils.mkdir(p)
|
41
|
-
else
|
42
|
-
FileUtils.cp(t, p)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Returns an array of all files in a template, optionally ignoring all files
|
49
|
-
# in ignore.
|
50
|
-
def find_files(template, ignore = [])
|
51
|
-
template = File.expand_path(File.join(@template_dir, template))
|
52
|
-
Dir.glob(File.join(template, '**/*')).map do |file|
|
53
|
-
file.sub(template + '/', '')
|
54
|
-
end - ignore
|
55
|
-
end
|
56
|
-
|
57
|
-
# Returns an array of files in a template to ignore.
|
58
|
-
def read_tempignore(template)
|
59
|
-
template = File.expand_path(File.join(@template_dir, template))
|
60
|
-
tempignore = File.join(template, '.tempignore')
|
61
|
-
files = ['.tempignore']
|
62
|
-
|
63
|
-
if File.exist? tempignore
|
64
|
-
files |= File.read(tempignore).split(?\n).map do |line|
|
65
|
-
Dir.glob(File.join(template, line)).map do |file|
|
66
|
-
file.sub(template + '/', '')
|
67
|
-
end
|
68
|
-
end.flatten
|
69
|
-
end
|
70
|
-
|
71
|
-
files
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
data/spec/template/template.txt
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
I am a template.
|
@@ -1 +0,0 @@
|
|
1
|
-
**/ignore-me.txt
|
@@ -1 +0,0 @@
|
|
1
|
-
foobar
|
@@ -1 +0,0 @@
|
|
1
|
-
I should be ignored.
|
@@ -1 +0,0 @@
|
|
1
|
-
Hello, World!
|
@@ -1 +0,0 @@
|
|
1
|
-
I should be ignored.
|