developwithpassion_expander 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/Rakefile +1 -0
- data/bin/dwp_expand +4 -0
- data/develpwithpassion_expander.gemspec +29 -0
- data/lib/developwithpassion_expander.rb +32 -0
- data/lib/developwithpassion_expander/array.rb +8 -0
- data/lib/developwithpassion_expander/array_dsl.rb +34 -0
- data/lib/developwithpassion_expander/array_dsl_module_factory.rb +14 -0
- data/lib/developwithpassion_expander/array_mutator.rb +12 -0
- data/lib/developwithpassion_expander/array_mutator_step.rb +17 -0
- data/lib/developwithpassion_expander/array_readable_step.rb +15 -0
- data/lib/developwithpassion_expander/array_visitor.rb +12 -0
- data/lib/developwithpassion_expander/array_visitor_step.rb +16 -0
- data/lib/developwithpassion_expander/array_writeable_step.rb +15 -0
- data/lib/developwithpassion_expander/cli_interface.rb +41 -0
- data/lib/developwithpassion_expander/copy.rb +29 -0
- data/lib/developwithpassion_expander/copy_to_target.rb +13 -0
- data/lib/developwithpassion_expander/enumerable_extensions.rb +11 -0
- data/lib/developwithpassion_expander/erb_template_file.rb +33 -0
- data/lib/developwithpassion_expander/expansion.rb +84 -0
- data/lib/developwithpassion_expander/file.rb +32 -0
- data/lib/developwithpassion_expander/file_merge.rb +54 -0
- data/lib/developwithpassion_expander/kernel.rb +35 -0
- data/lib/developwithpassion_expander/log.rb +17 -0
- data/lib/developwithpassion_expander/mustache_template_file.rb +11 -0
- data/lib/developwithpassion_expander/object_extensions.rb +28 -0
- data/lib/developwithpassion_expander/shell.rb +9 -0
- data/lib/developwithpassion_expander/shell_action_against_file.rb +12 -0
- data/lib/developwithpassion_expander/string.rb +5 -0
- data/lib/developwithpassion_expander/template_processors.rb +24 -0
- data/lib/developwithpassion_expander/template_visitor.rb +20 -0
- data/lib/developwithpassion_expander/version.rb +5 -0
- data/spec/spec_helper.rb +77 -0
- data/spec/specs/array_dsl_spec.rb +38 -0
- data/spec/specs/array_mutator_step_spec.rb +47 -0
- data/spec/specs/array_readable_step_spec.rb +26 -0
- data/spec/specs/array_spec.rb +22 -0
- data/spec/specs/array_visitor_step_spec.rb +78 -0
- data/spec/specs/array_writeable_step_spec.rb +30 -0
- data/spec/specs/copy_spec.rb +89 -0
- data/spec/specs/copy_to_target_spec.rb +24 -0
- data/spec/specs/enumerable_extensions_spec.rb +27 -0
- data/spec/specs/erb_template_file_spec.rb +65 -0
- data/spec/specs/expansion_spec.rb +146 -0
- data/spec/specs/file_merge_spec.rb +133 -0
- data/spec/specs/file_spec.rb +81 -0
- data/spec/specs/kernel_spec.rb +56 -0
- data/spec/specs/mustache_template_file_spec.rb +50 -0
- data/spec/specs/object_spec.rb +202 -0
- data/spec/specs/sample.rb +5 -0
- data/spec/specs/shell_action_against_file_spec.rb +24 -0
- data/spec/specs/string_spec.rb +13 -0
- data/spec/specs/template_processors_spec.rb +64 -0
- data/spec/specs/template_visitor_spec.rb +86 -0
- metadata +202 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3@expander --create
|
data/Gemfile
ADDED
data/Guardfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/dwp_expand
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib",__FILE__)
|
3
|
+
require "developwithpassion_expander/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "developwithpassion_expander"
|
7
|
+
s.version = DevelopWithPassion::Expander::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Develop With Passion®"]
|
10
|
+
s.email = ["open_source@developwithpassion.com"]
|
11
|
+
s.homepage = "http://www.developwithpassion.com"
|
12
|
+
s.summary = %q{Simple Expansion Automation Utility}
|
13
|
+
s.description = %q{Automation utitlity that I use to support cross platform file maintenance}
|
14
|
+
s.rubyforge_project = "developwithpassion_expander"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
s.add_development_dependency "guard"
|
24
|
+
s.add_development_dependency "guard-rspec"
|
25
|
+
s.add_development_dependency "developwithpassion_fakes"
|
26
|
+
s.add_development_dependency "rb-notifu"
|
27
|
+
s.add_runtime_dependency "configatron"
|
28
|
+
s.add_runtime_dependency "mustache"
|
29
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'configatron'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'erb'
|
4
|
+
require 'singleton'
|
5
|
+
require 'mustache'
|
6
|
+
|
7
|
+
require 'developwithpassion_expander/array'
|
8
|
+
require 'developwithpassion_expander/array_dsl'
|
9
|
+
require 'developwithpassion_expander/array_dsl_module_factory'
|
10
|
+
require 'developwithpassion_expander/array_mutator'
|
11
|
+
require 'developwithpassion_expander/array_mutator_step'
|
12
|
+
require 'developwithpassion_expander/array_readable_step'
|
13
|
+
require 'developwithpassion_expander/array_visitor'
|
14
|
+
require 'developwithpassion_expander/array_visitor_step'
|
15
|
+
require 'developwithpassion_expander/array_writeable_step'
|
16
|
+
require 'developwithpassion_expander/cli_interface'
|
17
|
+
require 'developwithpassion_expander/copy'
|
18
|
+
require 'developwithpassion_expander/copy_to_target'
|
19
|
+
require 'developwithpassion_expander/enumerable_extensions'
|
20
|
+
require 'developwithpassion_expander/erb_template_file'
|
21
|
+
require 'developwithpassion_expander/expansion'
|
22
|
+
require 'developwithpassion_expander/file'
|
23
|
+
require 'developwithpassion_expander/file_merge'
|
24
|
+
require 'developwithpassion_expander/kernel'
|
25
|
+
require 'developwithpassion_expander/log'
|
26
|
+
require 'developwithpassion_expander/mustache_template_file'
|
27
|
+
require 'developwithpassion_expander/object_extensions'
|
28
|
+
require 'developwithpassion_expander/shell'
|
29
|
+
require 'developwithpassion_expander/shell_action_against_file'
|
30
|
+
require 'developwithpassion_expander/string'
|
31
|
+
require 'developwithpassion_expander/template_processors'
|
32
|
+
require 'developwithpassion_expander/template_visitor'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ArrayDSL
|
4
|
+
attr_accessor :mutators,:visitors,:name,:writable,:readable
|
5
|
+
|
6
|
+
def initialize(name)
|
7
|
+
@name = name
|
8
|
+
initialize_arrays :mutators,:visitors
|
9
|
+
initialize_false :writable,:readable
|
10
|
+
end
|
11
|
+
|
12
|
+
def mutator(value,&block)
|
13
|
+
@mutators.push(ArrayMutator.new(value,block))
|
14
|
+
end
|
15
|
+
|
16
|
+
def process_using(name,visitor)
|
17
|
+
@visitors.push(ArrayVisitor.new(name,visitor))
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_and_write
|
21
|
+
writable
|
22
|
+
readable
|
23
|
+
end
|
24
|
+
|
25
|
+
def writable
|
26
|
+
@writable = true
|
27
|
+
end
|
28
|
+
|
29
|
+
def readable
|
30
|
+
@readable = true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ArrayDSLModuleFactory
|
4
|
+
def create_modules_from(dsl)
|
5
|
+
return [
|
6
|
+
ArrayMutatorStep.new.run_using(dsl),
|
7
|
+
ArrayVisitorStep.new.run_using(dsl),
|
8
|
+
ArrayWriteableStep.new.run_using(dsl),
|
9
|
+
ArrayReadableStep.new.run_using(dsl)
|
10
|
+
]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ArrayMutatorStep
|
4
|
+
def run_using(builder)
|
5
|
+
Module.new do
|
6
|
+
builder.mutators.each do|mutator|
|
7
|
+
define_method(mutator.name) do|value|
|
8
|
+
array_var = instance_variable_get("@#{builder.name}")
|
9
|
+
array_var.push(value) unless mutator.block
|
10
|
+
mutator.block.call(value) if mutator.block
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ArrayReadableStep
|
4
|
+
def run_using(builder)
|
5
|
+
Module.new do
|
6
|
+
if (builder.readable)
|
7
|
+
define_method(builder.name) do
|
8
|
+
return instance_variable_get("@#{builder.name}")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ArrayVisitorStep
|
4
|
+
def run_using(builder)
|
5
|
+
Module.new do
|
6
|
+
builder.visitors.each do|visitor|
|
7
|
+
define_method(visitor.name) do
|
8
|
+
array_var = instance_variable_get("@#{builder.name}")
|
9
|
+
array_var.each{|item| visitor.visitor.respond_to?(:run_using) ? visitor.visitor.run_using(item) : item.send(visitor.visitor)}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ArrayWriteableStep
|
4
|
+
def run_using(builder)
|
5
|
+
Module.new do
|
6
|
+
if (builder.writable)
|
7
|
+
define_method("#{builder.name}=") do|value|
|
8
|
+
instance_variable_set("@#{builder.name}",value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class CLIInterface
|
4
|
+
def startup
|
5
|
+
[
|
6
|
+
TemplateProcessors,
|
7
|
+
TemplateVisitor,
|
8
|
+
Expansion,
|
9
|
+
Shell
|
10
|
+
].each{|item| item.send(:include,Singleton)}
|
11
|
+
|
12
|
+
TemplateProcessors.instance.register_processor(:erb,ERBTemplateFile.new)
|
13
|
+
TemplateProcessors.instance.register_processor(:mustache,MustacheTemplateFile.new)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_expansion_file_name(args)
|
17
|
+
return args.count > 0 ? args[0] : "Expansionfile"
|
18
|
+
end
|
19
|
+
|
20
|
+
def ensure_expansion_file_provided(file)
|
21
|
+
unless File.exist?(file)
|
22
|
+
print <<-prompt
|
23
|
+
dwp_expand aborted!
|
24
|
+
No Expansionfile found (looking for: Expansionfile)
|
25
|
+
prompt
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def run(args = [])
|
31
|
+
file_to_run = get_expansion_file_name(args)
|
32
|
+
ensure_expansion_file_provided file_to_run
|
33
|
+
startup
|
34
|
+
enable_logging
|
35
|
+
log "Running Expansions defined in file:#{file_to_run}"
|
36
|
+
load file_to_run
|
37
|
+
Expansion.instance.run
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class Copy
|
4
|
+
def initialize(copy_target)
|
5
|
+
array :sources do|a|
|
6
|
+
a.read_and_write
|
7
|
+
a.mutator :folder do|item|
|
8
|
+
register(item,true)
|
9
|
+
end
|
10
|
+
a.mutator :contents do|item|
|
11
|
+
register(item,false)
|
12
|
+
end
|
13
|
+
a.mutator :all_contents_in do|set_of_folders|
|
14
|
+
set_of_folders.each{|item| contents(item)}
|
15
|
+
end
|
16
|
+
a.mutator :all_folders_in do|set_of_folders|
|
17
|
+
set_of_folders.each{|item| folder(item)}
|
18
|
+
end
|
19
|
+
a.process_using :run, copy_target
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
:private
|
24
|
+
def register(folder,copy_containing_folder = false)
|
25
|
+
@sources.push(copy_containing_folder ? folder : File.join(folder,'.'))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class ERBTemplateFile
|
4
|
+
def prepare_template(template)
|
5
|
+
token_regex = /(@\w[\w\.\_]+\w@)/
|
6
|
+
|
7
|
+
hits = template.scan(token_regex)
|
8
|
+
tags = hits.map do |item|
|
9
|
+
item[0].gsub(/@/,'').squeeze
|
10
|
+
end
|
11
|
+
tags = tags.map{|tag| tag.to_sym}.uniq
|
12
|
+
|
13
|
+
tags.inject(template) do |text, tag|
|
14
|
+
text.gsub /@#{tag.to_s}@/, "<%= #{tag.to_s} %>"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def process_template(template,binding)
|
19
|
+
erb = ERB.new(template, 0, "%")
|
20
|
+
erb.result(binding)
|
21
|
+
end
|
22
|
+
|
23
|
+
def process(args)
|
24
|
+
template = prepare_template(File.read(args[:input]))
|
25
|
+
result = process_template(template,args[:binding])
|
26
|
+
|
27
|
+
File.open_for_write(args[:output]) do|file|
|
28
|
+
file.write(result)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class Expansion
|
4
|
+
attr_accessor :copies,:files_to_merge
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
initialize_hashes :files_to_merge,:copies
|
8
|
+
|
9
|
+
array :cleanup_items do|a|
|
10
|
+
a.readable
|
11
|
+
a.process_using :run_cleanup,:call
|
12
|
+
end
|
13
|
+
|
14
|
+
array :setup_items do|a|
|
15
|
+
a.readable
|
16
|
+
a.process_using :run_setup_items,:call
|
17
|
+
end
|
18
|
+
|
19
|
+
array :executable_files do|a|
|
20
|
+
a.mutator :register_executable
|
21
|
+
a.process_using :mark_files_executable,ShellActionAgainstFile.new("chmod +x")
|
22
|
+
end
|
23
|
+
|
24
|
+
array :templates do|a|
|
25
|
+
a.mutator :look_for_templates_in do|path|
|
26
|
+
@templates.concat(glob(path))
|
27
|
+
end
|
28
|
+
a.process_using :expand_templates,TemplateVisitor.instance
|
29
|
+
end
|
30
|
+
|
31
|
+
array :files_with_line_endings_to_fix do|a|
|
32
|
+
a.mutator :fix_line_endings_for
|
33
|
+
a.process_using :fix_line_endings,ShellActionAgainstFile.new("d2u")
|
34
|
+
end
|
35
|
+
|
36
|
+
array :folders_to_purge do|a|
|
37
|
+
a.mutator :register_folder_to_purge
|
38
|
+
a.process_using :purge_targets,ShellActionAgainstFile.new("rm -rf")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def copy_to target,&block
|
43
|
+
hash_process(target,@copies,lambda{|key| return Copy.new(CopyToTarget.new(key))},&block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def merge_to target,&block
|
47
|
+
hash_process(target,@files_to_merge,lambda{|key| return FileMerge.new(key)},&block)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def cleanup(&block)
|
52
|
+
@cleanup_items << block
|
53
|
+
end
|
54
|
+
|
55
|
+
def before(&block)
|
56
|
+
@setup_items << block
|
57
|
+
end
|
58
|
+
|
59
|
+
def run
|
60
|
+
run_setup_items
|
61
|
+
purge_targets
|
62
|
+
expand_templates
|
63
|
+
expand_items
|
64
|
+
merge_items
|
65
|
+
fix_line_endings
|
66
|
+
mark_files_executable
|
67
|
+
run_cleanup
|
68
|
+
end
|
69
|
+
|
70
|
+
:private
|
71
|
+
def hash_process(target,hash,factory,&block)
|
72
|
+
symbol = target.to_sym
|
73
|
+
hash[symbol] = factory.call(target) unless hash.has_key?(symbol)
|
74
|
+
hash[symbol].instance_eval(&block)
|
75
|
+
end
|
76
|
+
def expand_items
|
77
|
+
@copies.process_all_values_using{|copy| copy.run}
|
78
|
+
end
|
79
|
+
def merge_items
|
80
|
+
@files_to_merge.process_all_values_using{|merge| merge.run}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|