developwithpassion_expander 0.0.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.
- 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
|