thor-tree 0.2.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 471568ac26bad590864b2d59805462e84017e011
4
+ data.tar.gz: 2135ab48ad2ca7b35587a532d4e75b4006a235ee
5
+ SHA512:
6
+ metadata.gz: 166980fdc94f00ca409915b4d5a26807e4731a18df7b91e18970f08415f4129cdd4e372ab3da1cf87568c04494e848ede9a5ce4d8908df2737c78ec5112510f2
7
+ data.tar.gz: 7530dcf55d8e411234572d9a0fd4431abdeb68a1dff380d58a43d0f6c98b2223d8342b79840902f3fcabb1755e0168a838d21679fa28ec6eb1ce64f379887c8b
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ spec/sandbox
19
+ .todo/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1 @@
1
+ 2.1.0@thor-tree-gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Chris Enedah
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ Thor::Tree
2
+ ==========
3
+
4
+ Description
5
+ -----------
6
+ Thor::Tree is a file and directory generator extension for [Thor][thor]. It will parse a file tree described in a YAML file and generate the desired file and directory structure. File content may be specified with templates or copied from source files.
7
+
8
+ [thor]: https://github.com/erikhuda/thor
9
+
10
+ Installation
11
+ ------------
12
+ gem install thor-tree
13
+
14
+ Usage
15
+ -----
16
+ Please see [the specifications][specs] and [example YAML file][example_yml] for an example.
17
+
18
+ [specs]: https://github.com/ikezue/thor-tree/blob/master/spec/thor/tree_spec.rb
19
+ [example_yml]: https://github.com/ikezue/thor-tree/blob/master/spec/fixtures/example.yml
@@ -0,0 +1,8 @@
1
+ Bundler.require
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new
6
+
7
+ task :default => :spec
8
+ task :test => :spec
@@ -0,0 +1,9 @@
1
+ class Hash
2
+ # From Rails ActiveSupport
3
+ def symbolize_keys!
4
+ keys.each do |key|
5
+ self[(key.to_sym rescue key) || key] = delete(key)
6
+ end
7
+ self
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ require 'safe_yaml'
2
+ require 'core_ext/hash'
3
+ require 'path'
4
+ require 'thor'
5
+ require 'thor/actions'
6
+ require 'thor/tree/directory'
7
+ require 'thor/tree/file'
8
+ require 'thor/tree/version'
9
+ require 'thor/tree/writer'
10
+
11
+ class Thor
12
+ class Tree
13
+ def initialize(file)
14
+ @options = YAML.load_file(Path(file).expand, safe: true).symbolize_keys!
15
+ end
16
+
17
+ def set_template_variable(key, value)
18
+ Tree::File.set_template_variable key, value
19
+ end
20
+
21
+ def write
22
+ source_paths.each do |path|
23
+ Tree::File.source_paths << path
24
+ end
25
+
26
+ Tree::Writer.new([], {}, destination_root: options[:destination_root]).tap do |w|
27
+ w.write options[:content]
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def options
34
+ @options ||= {}
35
+ end
36
+
37
+ def source_paths
38
+ options[:source_paths] ||= []
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,60 @@
1
+ class Thor
2
+ class Tree
3
+ class Directory < Thor
4
+ include Thor::Actions
5
+
6
+ attr_reader :path
7
+
8
+ class << self
9
+ def ===(args)
10
+ args.is_a?(Hash) &&
11
+ (args.empty? || args.keys.all? { |key| key.start_with?(':') == false })
12
+ end
13
+ end
14
+
15
+ def initialize(args, options = {}, config = {})
16
+ @path = Path.new args.first.to_s
17
+ super
18
+ self.destination_root = Writer.root_path
19
+ end
20
+
21
+ no_tasks do
22
+ def add(path, args)
23
+ case args
24
+ when File
25
+ add_file path, args
26
+ when Directory
27
+ add_subdirectory path, args
28
+ end
29
+ end
30
+
31
+ def write
32
+ empty_directory @path
33
+ subdirectories.each { |dir| dir.write }
34
+ files.each { |file| file.write }
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def add_file(file_path, options)
41
+ files << File.new([@path / file_path, options])
42
+ end
43
+
44
+ def add_subdirectory(dir_path, contents)
45
+ path = @path / dir_path
46
+
47
+ subdirectories.find { |dir| dir.path == path } || Tree::Directory.new([path]).tap do |dir|
48
+ subdirectories << dir
49
+ end.tap do |dir|
50
+ contents.each do |content_path, options|
51
+ dir.add content_path, options
52
+ end
53
+ end
54
+ end
55
+
56
+ def files; @files ||= []; end
57
+ def subdirectories; @subdirectories ||= []; end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,71 @@
1
+ class Thor
2
+ class Tree
3
+ class File < Thor
4
+ include Thor::Actions
5
+
6
+ class << self
7
+ def ===(args)
8
+ args.is_a?(String) ||
9
+ args.is_a?(Hash) && !args.empty? && args.keys.first.start_with?(':')
10
+ end
11
+
12
+ def set_template_variable(key, value)
13
+ @_template_variables ||= {}
14
+ @_template_variables[key] = value
15
+ end
16
+
17
+ def template_variables
18
+ @_template_variables || {}
19
+ end
20
+ end
21
+
22
+ # @examples
23
+ # File.new [ 'path/to/dst', ':create_file' ]
24
+ # File.new [ 'path/to/dst', { ':create_file' => 'file content' } ]
25
+ # File.new [ 'path/to/dst', ':copy_file' ]
26
+ # File.new [ 'path/to/dst', { ':copy_file' => 'source_file' } ]
27
+ # File.new [ 'path/to/dst', ':template' ]
28
+ # File.new [ 'path/to/dst', { ':template' => 'source_file' } ]
29
+ def initialize(args, options = {}, config = {})
30
+ @_path = Path.new args[0].to_s
31
+ @_filename = @_path.basename
32
+ options.merge! options_from_args(args[1])
33
+ super
34
+ self.destination_root = Writer.root_path
35
+ File.template_variables.each { |key, value| instance_variable_set key, value }
36
+ end
37
+
38
+ no_tasks do
39
+ def write
40
+ case options[:action]
41
+ when :copy_file
42
+ copy_file options[:source] || @_filename, @_path, options[:thor_opts]
43
+ when :create_file
44
+ create_file @_path, options[:content].to_s, options[:thor_opts]
45
+ when :template
46
+ template options[:source] || @_filename, @_path, options[:thor_opts]
47
+ end
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def options_from_args(args)
54
+ Hash.new.tap do |opts|
55
+ [:copy_file, :create_file, :template].tap do |actions|
56
+ case args
57
+ when String
58
+ opts[:action] = actions.find { |action| action == args[1..-1].to_sym } || :create_file
59
+ when Hash
60
+ h = args.map { |k, v| [k[1..-1].to_sym, v] }.to_h
61
+ opts[:action] = actions.find { |action| action == h.keys.first } || :create_file
62
+ opts[:content] = h.delete :create_file
63
+ opts[:source] = h.delete(:copy_file) || h.delete(:template)
64
+ opts[:thor_opts] = h
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ class Thor
2
+ class Tree
3
+ VERSION = '0.2.1'
4
+ end
5
+ end
@@ -0,0 +1,30 @@
1
+ class Thor
2
+ class Tree
3
+ class Writer < Thor
4
+ include Thor::Actions
5
+
6
+ class << self
7
+ # Destination root for class
8
+ def root_path=(path); @_destination_root = path; end
9
+ def root_path; @_destination_root; end
10
+ end
11
+
12
+ def initialize(args=[], options={}, config={})
13
+ super
14
+ Writer.root_path = Path(destination_root).expand
15
+ end
16
+
17
+ no_tasks do
18
+ def write(contents)
19
+ return unless contents.is_a?(Hash)
20
+
21
+ Tree::Directory.new([Writer.root_path]).tap do |root|
22
+ contents.each do |content_path, options|
23
+ root.add content_path, options
24
+ end
25
+ end.write
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ destination_root: 'spec/sandbox'
2
+
3
+ source_paths:
4
+ - 'spec/fixtures'
5
+ - 'spec/fixtures/templates'
6
+
7
+ content:
8
+ fa0: { ':create_file': 'fa0 content' }
9
+ fa1: ':create_file'
10
+ fa2: { ':copy_file': 'd0/fa2'}
11
+ fa3: ':copy_file'
12
+ fa4: { ':template': 'd0/fa4' }
13
+ fa5: ':template'
14
+ da0: {}
15
+ da1:
16
+ fb0: ':create_file'
17
+ fb1: { ':copy_file': 'd0/fb1' }
18
+ fb2: { ':template': 'd0/fb2' }
19
+ db0:
20
+ dc0: {}
21
+ fc0: ':copy_file'
22
+ fc1: ':template'
@@ -0,0 +1 @@
1
+ fa2 content
@@ -0,0 +1 @@
1
+ <%= @fa4_content %>
@@ -0,0 +1 @@
1
+ fb1 content
@@ -0,0 +1 @@
1
+ <%= @fb2_content %>
@@ -0,0 +1 @@
1
+ fa3 content
@@ -0,0 +1 @@
1
+ <%= @fa5_content %>
@@ -0,0 +1 @@
1
+ fc0 content
@@ -0,0 +1 @@
1
+ <%= @fc1_content %>
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ # config.run_all_when_everything_filtered = true
10
+ # config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
@@ -0,0 +1,257 @@
1
+ require 'spec_helper'
2
+ require 'thor/tree'
3
+
4
+ describe Thor::Tree do
5
+ describe "#set_template_variable" do
6
+ let(:tmp_dir) { Path.tmpdir }
7
+ let(:src) { tmp_dir / 'src' }
8
+ let(:dst) { tmp_dir / 'dst' }
9
+ let(:tree_yaml) { tmp_dir / 'tree.yml' }
10
+ let(:ivar_value) { 'some value' }
11
+
12
+ before do
13
+ File.open src, 'w' do |f|
14
+ f.write "<%= @ivar %>\n"
15
+ end
16
+
17
+ File.open tree_yaml, 'w' do |f|
18
+ f.write "destination_root: #{tmp_dir}\n"
19
+ f.write "source_paths:\n"
20
+ f.write "- #{tmp_dir}\n"
21
+ f.write "content:\n"
22
+ f.write " dst: { ':template': 'src' }\n"
23
+ end
24
+
25
+ tree_writer = Thor::Tree.new(tree_yaml)
26
+ tree_writer.set_template_variable '@ivar', ivar_value
27
+ tree_writer.write
28
+ end
29
+
30
+ after do
31
+ tmp_dir.rm_rf
32
+ end
33
+
34
+ it "sets a value for an ERB variable" do
35
+ expect(File.read dst).to match(ivar_value)
36
+ end
37
+ end
38
+
39
+ describe "#write" do
40
+ describe "file creation" do
41
+ context "with :create_file" do
42
+ let(:tmp_dir) { Path.tmpdir }
43
+ let(:file1) { tmp_dir / 'file1' }
44
+ let(:file2) { tmp_dir / 'file2' }
45
+ let(:tree_yaml) { tmp_dir / 'tree.yml' }
46
+ let(:file2_content) { 'some_content' }
47
+
48
+ before do
49
+ File.open tree_yaml, 'w' do |f|
50
+ f.write "destination_root: #{tmp_dir}\n"
51
+ f.write "content:\n"
52
+ f.write " file1: ':create_file'\n"
53
+ f.write " file2: { ':create_file': #{file2_content} }\n"
54
+ end
55
+
56
+ Thor::Tree.new(tree_yaml).write
57
+ end
58
+
59
+ after do
60
+ tmp_dir.rm_rf
61
+ end
62
+
63
+ it "creates the named file" do
64
+ expect(file1).to exist
65
+ end
66
+
67
+ it "creates files with the specified content" do
68
+ expect(File.read file2).to eq(file2_content)
69
+ end
70
+ end
71
+
72
+ context "with :copy_file" do
73
+ let(:tmp_dir) { Path.tmpdir }
74
+ let(:src) { tmp_dir / 'src' }
75
+ let(:dst) { tmp_dir / 'dst' }
76
+ let(:tree_yaml) { tmp_dir / 'tree.yml' }
77
+ let(:src_content) { 'some content' }
78
+
79
+ before do
80
+ File.open src, 'w' do |f|
81
+ f.write src_content
82
+ end
83
+
84
+ File.open tree_yaml, 'w' do |f|
85
+ f.write "destination_root: #{tmp_dir}\n"
86
+ f.write "source_paths:\n"
87
+ f.write "- #{tmp_dir}\n"
88
+ f.write "content:\n"
89
+ f.write " dst: { ':copy_file': 'src' }\n"
90
+ end
91
+
92
+ Thor::Tree.new(tree_yaml).write
93
+ end
94
+
95
+ after do
96
+ tmp_dir.rm_rf
97
+ end
98
+
99
+ it "creates a copy of the source file" do
100
+ expect(File.read dst).to eq(src_content)
101
+ end
102
+ end
103
+
104
+ context "with :template" do
105
+ let(:tmp_dir) { Path.tmpdir }
106
+ let(:src) { tmp_dir / 'src' }
107
+ let(:dst) { tmp_dir / 'dst' }
108
+ let(:tree_yaml) { tmp_dir / 'tree.yml' }
109
+ let(:src_content) { 'some content with a <%= @variable %>' }
110
+ let(:variable_value) { 'some value' }
111
+
112
+ before do
113
+ File.open src, 'w' do |f|
114
+ f.write src_content
115
+ end
116
+
117
+ File.open tree_yaml, 'w' do |f|
118
+ f.write "destination_root: #{tmp_dir}\n"
119
+ f.write "source_paths:\n"
120
+ f.write "- #{tmp_dir}\n"
121
+ f.write "content:\n"
122
+ f.write " dst: { ':template': 'src' }\n"
123
+ end
124
+
125
+ tree_writer = Thor::Tree.new(tree_yaml)
126
+ tree_writer.set_template_variable '@variable', variable_value
127
+ tree_writer.write
128
+ end
129
+
130
+ after do
131
+ tmp_dir.rm_rf
132
+ end
133
+
134
+ it "creates a copy of the source file with interpolated source content" do
135
+ expect(File.read dst).to eq(src_content.gsub(/<%=.*%>/, variable_value))
136
+ end
137
+ end
138
+ end
139
+
140
+ describe "directory creation" do
141
+ let(:tmp_dir) { Path.tmpdir }
142
+ let(:tree_yaml) { tmp_dir / 'tree.yml' }
143
+
144
+ before do
145
+ File.open tree_yaml, 'w' do |f|
146
+ f.write "destination_root: #{tmp_dir}\n"
147
+ f.write "content:\n"
148
+ f.write " dir_1:\n"
149
+ f.write " dir_11:\n"
150
+ f.write " file_111: ':create_file'\n"
151
+ f.write " dir_12:\n"
152
+ f.write " dir_121: {}\n"
153
+ end
154
+
155
+ Thor::Tree.new(tree_yaml).write
156
+ end
157
+
158
+ after do
159
+ tmp_dir.rm_rf
160
+ end
161
+
162
+ it "creates the directory tree" do
163
+ root = tmp_dir / 'dir_1'
164
+ expect(root).to exist
165
+ expect(root.children).to eq([root/'dir_11', root/'dir_12'])
166
+ expect((root/'dir_11').children).to eq([root/'dir_11'/'file_111'])
167
+ expect((root/'dir_12').children).to eq([root/'dir_12'/'dir_121'])
168
+ expect(root / 'dir_12' / 'dir_121').to be_a_directory
169
+ expect(root / 'dir_11' / 'file_111').to be_a_file
170
+ end
171
+ end
172
+ end
173
+
174
+ context "example.yml" do
175
+ let(:output) do
176
+ {
177
+ files_to_create: {
178
+ 'fa0' => 'fa0 content',
179
+ 'fa1' => '',
180
+ 'da1/fb0' => '',
181
+ },
182
+ files_to_copy: {
183
+ 'fa2' => 'fa2 content',
184
+ 'fa3' => 'fa3 content',
185
+ 'da1/fb1' => 'fb1 content',
186
+ 'da1/db0/fc0' => 'fc0 content',
187
+ },
188
+ files_to_template: {
189
+ 'fa4' => 'fa4 content',
190
+ 'fa5' => 'fa5 content',
191
+ 'da1/fb2' => 'fb2 content',
192
+ 'da1/db0/fc1' => 'fc1 content',
193
+ },
194
+ directories: {
195
+ 'da0' => [],
196
+ 'da1' => ['fb0', 'db0'],
197
+ 'da1/db0' => ['dc0'],
198
+ 'da1/db0/dc0' => [],
199
+ }
200
+ }
201
+ end
202
+
203
+ let(:directories) { output[:directories].keys }
204
+ let(:files_to_create) { output[:files_to_create].keys }
205
+ let(:files_to_copy) { output[:files_to_copy].keys }
206
+ let(:files_to_template) { output[:files_to_template].keys }
207
+
208
+ before do
209
+ (Path.dir / '..' / 'sandbox').rm_rf
210
+
211
+ template_variables = Hash.new.tap do |h|
212
+ h['@fa4_content'] = 'fa4 content'
213
+ h['@fa5_content'] = 'fa5 content'
214
+ h['@fb2_content'] = 'fb2 content'
215
+ h['@fc1_content'] = 'fc1 content'
216
+ end
217
+
218
+ example_yaml = Path.dir / '..' / 'fixtures' / 'example.yml'
219
+
220
+ Thor::Tree.new(example_yaml).tap do |tree|
221
+ template_variables.each do |key, value|
222
+ tree.set_template_variable key, value
223
+ end
224
+ end.write
225
+ end
226
+
227
+ it "creates the tree" do
228
+ files_to_create.each do |file|
229
+ (Path.dir / '..' / 'sandbox' / file).should exist
230
+ end
231
+
232
+ files_to_create.each do |file|
233
+ File.read(Path.dir / '..' / 'sandbox' / file).strip.should == output[:files_to_create][file]
234
+ end
235
+
236
+ files_to_copy.each do |file|
237
+ File.read(Path.dir / '..' / 'sandbox' / file).strip.should == output[:files_to_copy][file]
238
+ end
239
+
240
+ files_to_template.each do |file|
241
+ File.read(Path.dir / '..' / 'sandbox' / file).strip.should == output[:files_to_template][file]
242
+ end
243
+
244
+ directories.each do |dir|
245
+ (Path.dir / '..' / 'sandbox' / dir).should exist
246
+ end
247
+
248
+ directories.each do |dir|
249
+ (Path.dir / '..' / 'sandbox' / dir).children(false).map { |c| c.to_s }.tap do |subdirs|
250
+ output[:directories][dir].each do |sub|
251
+ subdirs.should include sub
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'thor/tree/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'thor-tree'
8
+ gem.version = Thor::Tree::VERSION
9
+ gem.authors = ['ikezue']
10
+ gem.email = ['ikezue@gmail.com']
11
+ gem.description = %q{A thor extension for generating directory structures from file trees defined in YAML}
12
+ gem.summary = gem.description
13
+ gem.homepage = 'https://github.com/ikezue/thor-tree'
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.add_dependency 'path', '~> 1.3.1'
22
+ gem.add_dependency 'safe_yaml', '~> 0.9.4'
23
+ gem.add_dependency 'thor', '~> 0.18.1'
24
+ gem.add_development_dependency 'bundler', '~> 1.5.2'
25
+ gem.add_development_dependency 'rake', '~> 10.1.0'
26
+ gem.add_development_dependency 'rspec', '~> 2.14.1'
27
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thor-tree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - ikezue
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: path
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: safe_yaml
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.18.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.18.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.5.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 10.1.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 10.1.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.14.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.14.1
97
+ description: A thor extension for generating directory structures from file trees
98
+ defined in YAML
99
+ email:
100
+ - ikezue@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".ruby-version"
108
+ - Gemfile
109
+ - LICENSE
110
+ - README.md
111
+ - Rakefile
112
+ - lib/core_ext/hash.rb
113
+ - lib/thor/tree.rb
114
+ - lib/thor/tree/directory.rb
115
+ - lib/thor/tree/file.rb
116
+ - lib/thor/tree/version.rb
117
+ - lib/thor/tree/writer.rb
118
+ - spec/fixtures/example.yml
119
+ - spec/fixtures/templates/d0/fa2
120
+ - spec/fixtures/templates/d0/fa4
121
+ - spec/fixtures/templates/d0/fb1
122
+ - spec/fixtures/templates/d0/fb2
123
+ - spec/fixtures/templates/fa3
124
+ - spec/fixtures/templates/fa5
125
+ - spec/fixtures/templates/fc0
126
+ - spec/fixtures/templates/fc1
127
+ - spec/spec_helper.rb
128
+ - spec/thor/tree_spec.rb
129
+ - thor-tree.gemspec
130
+ homepage: https://github.com/ikezue/thor-tree
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.2.1
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: A thor extension for generating directory structures from file trees defined
154
+ in YAML
155
+ test_files:
156
+ - spec/fixtures/example.yml
157
+ - spec/fixtures/templates/d0/fa2
158
+ - spec/fixtures/templates/d0/fa4
159
+ - spec/fixtures/templates/d0/fb1
160
+ - spec/fixtures/templates/d0/fb2
161
+ - spec/fixtures/templates/fa3
162
+ - spec/fixtures/templates/fa5
163
+ - spec/fixtures/templates/fc0
164
+ - spec/fixtures/templates/fc1
165
+ - spec/spec_helper.rb
166
+ - spec/thor/tree_spec.rb