skeleton_creator 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +0 -0
- data/README.rdoc +108 -8
- data/lib/file_system/directory/directory_creator.rb +12 -0
- data/lib/file_system/{fake_directory.rb → directory/fake_directory.rb} +0 -2
- data/lib/file_system/{fake_file.rb → file/fake_file.rb} +1 -1
- data/lib/file_system/file/file_creator.rb +12 -0
- data/lib/file_system/link/fake_symbolic_link.rb +24 -0
- data/lib/file_system/link/symbolic_link_creator.rb +22 -0
- data/lib/file_system/traverser.rb +95 -23
- data/lib/skeleton_creator.rb +17 -5
- data/spec/skeleton_creator_spec.rb +23 -16
- metadata +9 -5
- data/lib/file_system/directory.rb +0 -10
- data/lib/file_system/file.rb +0 -9
data/README
ADDED
File without changes
|
data/README.rdoc
CHANGED
@@ -2,19 +2,103 @@
|
|
2
2
|
|
3
3
|
Script to facilitate quick and easy creation of complex directory/file structures.
|
4
4
|
|
5
|
-
1. Create a YAML directory structure file
|
6
|
-
Structure should be similar to the examples in config-files
|
7
5
|
|
8
|
-
|
9
|
-
|
6
|
+
== YAML config file
|
7
|
+
|
8
|
+
Create a YAML directory structure file
|
9
|
+
The structure should be similar to the examples in config-files, links.yml shows how to define symbolic links
|
10
|
+
|
11
|
+
By default any leaf node results in a File being created.
|
12
|
+
|
13
|
+
root:
|
14
|
+
meta: ONLY_DIRS
|
15
|
+
a:
|
16
|
+
- bee
|
17
|
+
- cee
|
18
|
+
|
19
|
+
Here a is created as a dir, with bee and cee as empty files
|
20
|
+
|
21
|
+
To override this, postfix entry with DIR, fx
|
10
22
|
- my_dir DIR
|
11
23
|
|
12
|
-
|
13
|
-
|
24
|
+
Example: DIR
|
25
|
+
root:
|
26
|
+
a:
|
27
|
+
- bee DIR
|
28
|
+
- cee
|
29
|
+
|
30
|
+
Here a and bee are created as a dirs, while cee is an empty file
|
31
|
+
|
32
|
+
=== Special meta data
|
33
|
+
|
34
|
+
If you want all nodes in a tree to be created as dirs, supply a meta: in the root of the tree
|
35
|
+
|
36
|
+
meta: ONLY_DIRS
|
37
|
+
|
38
|
+
This will ensure all the following nodes in the tree are treated as dirs, until a REVERT is encountered (see below)
|
39
|
+
|
40
|
+
Example: ONLY_DIRS
|
41
|
+
|
42
|
+
root:
|
43
|
+
meta: ONLY_DIRS
|
44
|
+
a:
|
45
|
+
- bee
|
46
|
+
- cee
|
47
|
+
|
48
|
+
Here bee and cee are created as dirs
|
49
|
+
|
50
|
+
Example:
|
51
|
+
Using ONLY_DIRS and REVERT
|
52
|
+
|
53
|
+
root:
|
54
|
+
- ONLY_DIRS
|
55
|
+
- bee
|
56
|
+
- cee
|
57
|
+
- REVERT
|
58
|
+
- dee
|
59
|
+
-
|
60
|
+
eee:
|
61
|
+
meta: ONLY_DIRS
|
62
|
+
x:
|
63
|
+
- y
|
64
|
+
- z
|
14
65
|
|
15
|
-
|
66
|
+
Here bee and cee will be created as dirs while dee and eee become empty files. Later y and x also are dirs because of the meta: ONLY_DIRS
|
67
|
+
|
68
|
+
Symbolic links:
|
69
|
+
|
70
|
+
apps:
|
71
|
+
category: &app-category
|
72
|
+
- games ALIAS c-games
|
73
|
+
- business
|
74
|
+
- utils
|
75
|
+
- other
|
76
|
+
all: &app-runtype
|
77
|
+
- my_games REF c-games
|
78
|
+
|
79
|
+
Here an alias c-games is created for the entry apps/category/games
|
80
|
+
Later the symbolic link my-games is created to point at whatever the alias c-games currently points to, in this case apps/category/games
|
81
|
+
An alias can be overridden later... this is illustrated below.
|
82
|
+
|
83
|
+
apps:
|
84
|
+
category: &app-category
|
85
|
+
- games ALIAS c-games
|
86
|
+
- business
|
87
|
+
- my_games REF c-games
|
88
|
+
- other
|
89
|
+
- cool-games ALIAS c-games
|
90
|
+
all: &app-runtype
|
91
|
+
- my_cool_games REF c-games
|
92
|
+
|
93
|
+
Results in this:
|
94
|
+
|
95
|
+
my_games --> (c-games) --> games
|
96
|
+
my_cool_games --> (c-games) --> cool-games
|
16
97
|
|
17
|
-
|
98
|
+
== Usage
|
99
|
+
|
100
|
+
Use the following ruby code as a 'template'. As shown, the options argument is optional
|
101
|
+
|
18
102
|
require 'skeleton_creator'
|
19
103
|
|
20
104
|
runner = FileSystem::Runner.new file_name [, options]
|
@@ -24,6 +108,22 @@ Fx to generate the skeleton structure inside ~/testing as per the apps.yml file
|
|
24
108
|
runner = FileSystem::Runner.new 'apps.yml'
|
25
109
|
runner.run "~/testing"
|
26
110
|
|
111
|
+
OR using fake file and directory creators to simulate first
|
112
|
+
runner = FileSystem::Runner.new 'apps.yml', :fake => true
|
113
|
+
runner.run "~/testing"
|
114
|
+
runner.run "~/testing2"
|
115
|
+
|
116
|
+
OR
|
117
|
+
runner = FileSystem::Runner.new 'apps.yml'
|
118
|
+
runner.run "~/testing"
|
119
|
+
runner.run "~/testing2", :fake => true
|
120
|
+
|
121
|
+
The options :fake is false by default. Setting it on the call to run overrides the initial value (set with Runner.new) for that particular run
|
122
|
+
|
123
|
+
OR
|
124
|
+
runner.run ["testing2", "testing4"], :fake => true, :root => '~'
|
125
|
+
|
126
|
+
Creates dirs in '~/testing2' and '~/testing4'
|
27
127
|
|
28
128
|
== Note on Patches/Pull Requests
|
29
129
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module FileSystem
|
2
|
+
class FakeSymbolicLink
|
3
|
+
|
4
|
+
attr_accessor :old_name, :new_name
|
5
|
+
def initialize(traverser, old_name, new_name)
|
6
|
+
@old_name = old_name
|
7
|
+
@new_name = File.join(traverser.current_dir, new_name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
puts "SYMBOLIC LINK: #{new_name} --> #{old_name}"
|
12
|
+
# puts "ln_s #{old_name} #{new_name}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def is_file?
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_dir?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'file_system/link/fake_symbolic_link'
|
3
|
+
|
4
|
+
module FileSystem
|
5
|
+
class SymbolicLinkCreator < FakeSymbolicLink
|
6
|
+
def create
|
7
|
+
if !File.exist?(old_name)
|
8
|
+
puts "Can't to link to '#{old_name}' since it does not exist"
|
9
|
+
return
|
10
|
+
end
|
11
|
+
if File.exist?(new_name)
|
12
|
+
puts "Can't create alias '#{new_name}' since a file of that name already exists"
|
13
|
+
return
|
14
|
+
end
|
15
|
+
FileUtils.ln_s old_name, new_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def exist?(name)
|
19
|
+
File.exist?(name) || File.symlink?(name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,17 +1,22 @@
|
|
1
|
-
require 'file_system/
|
2
|
-
require 'file_system/
|
3
|
-
require 'file_system/file'
|
4
|
-
require 'file_system/directory'
|
5
|
-
|
1
|
+
require 'file_system/directory/directory_creator'
|
2
|
+
require 'file_system/link/symbolic_link_creator'
|
3
|
+
require 'file_system/file/file_creator'
|
6
4
|
|
7
5
|
module FileSystem
|
8
6
|
class Traverser
|
9
|
-
attr_accessor :root_dir, :dir_stack, :options
|
7
|
+
attr_accessor :root_dir, :dir_stack, :options, :reference_hash, :dirs_only
|
8
|
+
|
9
|
+
ONLY_DIRS = 'ONLY_DIRS'
|
10
|
+
REVERT = 'REVERT'
|
11
|
+
ALIAS = 'ALIAS'
|
12
|
+
REF = 'REF'
|
13
|
+
DIR = 'DIR'
|
10
14
|
|
11
15
|
def initialize(root_dir, options = {})
|
12
16
|
@root_dir ||= root_dir
|
13
17
|
@dir_stack = []
|
14
18
|
@options = options
|
19
|
+
@dirs_only = false
|
15
20
|
end
|
16
21
|
|
17
22
|
def traverse(obj, &blk)
|
@@ -26,7 +31,7 @@ module FileSystem
|
|
26
31
|
end
|
27
32
|
|
28
33
|
def current_dir
|
29
|
-
|
34
|
+
File.join(root_dir, dir_stack.join('/'))
|
30
35
|
end
|
31
36
|
|
32
37
|
def visit_dir(name)
|
@@ -42,9 +47,7 @@ module FileSystem
|
|
42
47
|
def handle_hash(obj, &blk)
|
43
48
|
# Forget keys because I don't know what to do with them
|
44
49
|
obj.each do |dir_name, dir_content|
|
45
|
-
|
46
|
-
blk.call(create_directory dir_name) if !(options && options[:dirs_only])
|
47
|
-
options.delete :dirs_only
|
50
|
+
blk.call(create_directory dir_name)
|
48
51
|
traverse(dir_content, &blk)
|
49
52
|
leave_dir
|
50
53
|
end
|
@@ -58,34 +61,103 @@ module FileSystem
|
|
58
61
|
|
59
62
|
def handle_single(obj, &blk)
|
60
63
|
if obj
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
blk.call(
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
return if parse_meta(obj)
|
65
|
+
file_name = obj
|
66
|
+
if ref?(obj)
|
67
|
+
blk.call(create_symbolic_link ref_name(obj), name(obj))
|
68
|
+
return
|
69
|
+
end
|
70
|
+
name = name(obj)
|
71
|
+
if alias?(obj)
|
72
|
+
create_reference alias_name(obj), name
|
68
73
|
end
|
74
|
+
handle_single_entry(name, &blk)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def handle_single_entry(file_name, &blk)
|
79
|
+
if enforce_dir? file_name
|
80
|
+
dir_name = file_name.gsub( /\s#{DIR}\s/, '').strip
|
81
|
+
blk.call(create_directory dir_name)
|
82
|
+
leave_dir
|
83
|
+
else
|
84
|
+
blk.call(create_file file_name)
|
69
85
|
end
|
70
86
|
end
|
87
|
+
|
88
|
+
def enforce_dir?(file_name)
|
89
|
+
dirs_only || !/\sDIR\s/.match(file_name).nil?
|
90
|
+
end
|
91
|
+
|
92
|
+
def create_reference(alias_name, name)
|
93
|
+
@reference_hash ||= {}
|
94
|
+
dir = File.join(root_dir, dir_stack.join(File::SEPARATOR), name)
|
95
|
+
@reference_hash.merge!({alias_name.to_sym => dir})
|
96
|
+
end
|
71
97
|
|
72
98
|
def create_directory(name)
|
73
99
|
return FileSystem::FakeDirectory.new(self, name) if options[:fake]
|
74
|
-
FileSystem::
|
100
|
+
FileSystem::DirectoryCreator.new(self, name)
|
75
101
|
end
|
76
102
|
|
77
103
|
def create_file(name)
|
78
104
|
return FileSystem::FakeFile.new(self, name) if options[:fake]
|
79
|
-
FileSystem::
|
105
|
+
FileSystem::FileCreator.new(self, name)
|
106
|
+
end
|
107
|
+
|
108
|
+
def create_symbolic_link(ref_name, new_name)
|
109
|
+
old_name = reference_hash[ref_name.to_sym].strip
|
110
|
+
# puts "create_symbolic_link: r:#{ref_name}, n:#{new_name}, o:#{old_name}"
|
111
|
+
return FileSystem::FakeSymbolicLink.new(self, old_name, new_name) if options[:fake]
|
112
|
+
FileSystem::SymbolicLinkCreator.new(self, old_name, new_name)
|
80
113
|
end
|
114
|
+
|
81
115
|
|
82
|
-
def parse_meta(key, value)
|
83
|
-
|
84
|
-
|
116
|
+
def parse_meta(key, value = "")
|
117
|
+
if revert?(key, value)
|
118
|
+
@dirs_only = false
|
119
|
+
return true
|
120
|
+
end
|
121
|
+
if only_dirs?(key, value)
|
122
|
+
@dirs_only = true
|
123
|
+
return true
|
124
|
+
end
|
125
|
+
false
|
126
|
+
end
|
127
|
+
|
128
|
+
def only_dirs?(key, value = "")
|
129
|
+
key == ONLY_DIRS || key == 'meta' && value == ONLY_DIRS
|
130
|
+
end
|
131
|
+
|
132
|
+
def revert?(key, value = "")
|
133
|
+
key == REVERT || key == 'meta' && value == REVERT
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
def name(value)
|
138
|
+
value = value.gsub(/\s#{ALIAS}\s/, ',').gsub(/\s#{REF}\s/, ',')
|
139
|
+
value.split(',').first.strip
|
140
|
+
end
|
141
|
+
|
142
|
+
def alias?(value)
|
143
|
+
value.include?(ALIAS)
|
85
144
|
end
|
86
145
|
|
146
|
+
def alias_name(value)
|
147
|
+
value.split(ALIAS).last.strip
|
148
|
+
end
|
149
|
+
|
150
|
+
def ref?(value)
|
151
|
+
value.include?(REF)
|
152
|
+
end
|
153
|
+
|
154
|
+
def ref_name(value)
|
155
|
+
value.split(REF).last.strip
|
156
|
+
end
|
157
|
+
|
158
|
+
|
87
159
|
def dirs_only?
|
88
|
-
|
160
|
+
dirs_only
|
89
161
|
end
|
90
162
|
|
91
163
|
end
|
data/lib/skeleton_creator.rb
CHANGED
@@ -6,23 +6,35 @@ require 'file_system/traverser'
|
|
6
6
|
module FileSystem
|
7
7
|
class Runner
|
8
8
|
attr_accessor :yml_content, :options
|
9
|
+
attr_reader :root_dir
|
9
10
|
|
10
|
-
def initialize(filename, options =
|
11
|
+
def initialize(filename, options = {})
|
11
12
|
@yml_content = YAML.load_file(filename)
|
12
13
|
@options = options
|
13
14
|
end
|
14
15
|
|
15
|
-
def run(
|
16
|
+
def run(dir, options = {})
|
17
|
+
return run_list(dir, options) if dir.respond_to? :each
|
18
|
+
|
16
19
|
@options = options if !options.nil?
|
17
|
-
|
20
|
+
@root_dir = dir.gsub /\~/, "#{ENV['HOME']}"
|
18
21
|
yml_content.each do |key, value|
|
19
|
-
if key == 'DIRECTORY'
|
20
|
-
traverser = FileSystem::Traverser.new
|
22
|
+
if key == 'DIRECTORY'
|
23
|
+
traverser = FileSystem::Traverser.new root_dir, options
|
21
24
|
traverser.traverse(value) do |file_node|
|
22
25
|
file_node.create
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
def run_list(dir_list, options = {})
|
33
|
+
dir_list.each do |dir|
|
34
|
+
dir = File.join(options[:root], dir) if options[:root]
|
35
|
+
run(dir, options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
27
39
|
end
|
28
40
|
end
|
@@ -4,37 +4,44 @@ require 'rake'
|
|
4
4
|
describe "SkeletonCreator" do
|
5
5
|
it "should create a directory structure" do
|
6
6
|
file_name = File.expand_path(File.join(Dir.pwd, '../config-files/apps.yml'))
|
7
|
-
puts "=========="
|
8
|
-
puts file_name
|
9
7
|
runner = FileSystem::Runner.new file_name
|
10
8
|
root_dir = "~/testing"
|
11
9
|
runner.run root_dir
|
12
|
-
FileUtils.cd root_dir do
|
10
|
+
FileUtils.cd runner.root_dir do
|
13
11
|
FileList['**/*'].size.should > 30
|
14
|
-
FileUtils.rm_rf root_dir
|
12
|
+
FileUtils.rm_rf runner.root_dir
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
16
|
+
it "should create a directory structure with symbolic links" do
|
17
|
+
file_name = File.expand_path(File.join(Dir.pwd, '../config-files/links.yml'))
|
18
|
+
runner = FileSystem::Runner.new file_name
|
19
|
+
root_dir = "~/testing"
|
20
|
+
runner.run root_dir
|
21
|
+
FileUtils.cd File.join(runner.root_dir, '_tags/all') do
|
22
|
+
File.symlink?('my_games').should == true
|
23
|
+
end
|
24
|
+
FileUtils.rm_rf runner.root_dir
|
25
|
+
end
|
26
|
+
|
18
27
|
it "should not create a directory structure if set to fake" do
|
19
28
|
file_name = File.expand_path(File.join(Dir.pwd, '../config-files/apps.yml'))
|
20
|
-
puts "=========="
|
21
|
-
puts file_name
|
22
29
|
runner = FileSystem::Runner.new file_name
|
23
30
|
root_dir = "~/testing4"
|
24
31
|
runner.run root_dir, :fake => true
|
25
|
-
File.directory?(root_dir).should == false
|
26
|
-
end
|
32
|
+
File.directory?(runner.root_dir).should == false
|
33
|
+
end
|
27
34
|
|
28
|
-
it "should create multiple of the same directory structures in differet
|
35
|
+
it "should create multiple of the same directory structures in differet locations" do
|
29
36
|
file_name = File.expand_path(File.join(Dir.pwd, '../config-files/apps.yml'))
|
30
37
|
runner = FileSystem::Runner.new file_name
|
31
|
-
root_dirs = ["
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
FileUtils.rm_rf
|
38
|
+
root_dirs = ["testing2", "testing4"]
|
39
|
+
runner.run root_dirs, :root => '~'
|
40
|
+
root_dirs.each do |root_dir|
|
41
|
+
dir = File.join("#{ENV['HOME']}", root_dir)
|
42
|
+
File.directory?(dir).should == true
|
43
|
+
FileUtils.rm_rf dir
|
37
44
|
end
|
38
|
-
end
|
45
|
+
end
|
39
46
|
|
40
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skeleton_creator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kristian Mandrup
|
@@ -30,15 +30,19 @@ extensions: []
|
|
30
30
|
|
31
31
|
extra_rdoc_files:
|
32
32
|
- LICENSE
|
33
|
+
- README
|
33
34
|
- README.rdoc
|
34
35
|
files:
|
35
|
-
- lib/file_system/directory.rb
|
36
|
-
- lib/file_system/fake_directory.rb
|
37
|
-
- lib/file_system/fake_file.rb
|
38
|
-
- lib/file_system/file.rb
|
36
|
+
- lib/file_system/directory/directory_creator.rb
|
37
|
+
- lib/file_system/directory/fake_directory.rb
|
38
|
+
- lib/file_system/file/fake_file.rb
|
39
|
+
- lib/file_system/file/file_creator.rb
|
40
|
+
- lib/file_system/link/fake_symbolic_link.rb
|
41
|
+
- lib/file_system/link/symbolic_link_creator.rb
|
39
42
|
- lib/file_system/traverser.rb
|
40
43
|
- lib/skeleton_creator.rb
|
41
44
|
- LICENSE
|
45
|
+
- README
|
42
46
|
- README.rdoc
|
43
47
|
has_rdoc: true
|
44
48
|
homepage: http://github.com/aslakhellesoy/cucumber-rails
|