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
@@ -0,0 +1,32 @@
|
|
1
|
+
class File
|
2
|
+
def self.open_for_read(file)
|
3
|
+
File.open(file,'r').each do|line|
|
4
|
+
yield line
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.read_all_text(file)
|
9
|
+
File.read_all_text_after_skipping_lines(file,0)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.read_all_text_after_skipping_lines(file,number_of_lines_to_skip)
|
13
|
+
index = 1
|
14
|
+
contents = ''
|
15
|
+
|
16
|
+
if File.exist?(file)
|
17
|
+
File.open_for_read(file) do |line|
|
18
|
+
contents += line if index > number_of_lines_to_skip
|
19
|
+
index+=1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
return contents
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.open_for_write(file)
|
27
|
+
File.open(file,'w') do|new_file|
|
28
|
+
yield new_file
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class FileMerge
|
4
|
+
attr_accessor :before_files,:after_files,:read_original_contents
|
5
|
+
|
6
|
+
def initialize(output_file)
|
7
|
+
array :before_files do|a|
|
8
|
+
a.read_and_write
|
9
|
+
a.mutator :add_before_original_contents do|file|
|
10
|
+
add_merge_file(@before_files,file)
|
11
|
+
end
|
12
|
+
a.mutator :add do|file|
|
13
|
+
add_before_original_contents(file)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
array :after_files do|a|
|
17
|
+
a.readable
|
18
|
+
a.writable
|
19
|
+
a.mutator :add_after_original_contents do|file|
|
20
|
+
add_merge_file(@after_files,file)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
@output_file = output_file
|
24
|
+
@read_original_contents = true
|
25
|
+
end
|
26
|
+
|
27
|
+
def dont_read_original_file_contents
|
28
|
+
@read_original_contents = false
|
29
|
+
end
|
30
|
+
|
31
|
+
def run
|
32
|
+
original_contents = File.read_all_text(@output_file)
|
33
|
+
FileUtils.rm_f @output_file
|
34
|
+
File.open_for_write(@output_file) do |file|
|
35
|
+
merge_files(@before_files,file)
|
36
|
+
file.write original_contents if @read_original_contents
|
37
|
+
merge_files(@after_files,file)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def merge_files(source_files,target)
|
42
|
+
source_files.each do|source|
|
43
|
+
target.write File.read_all_text(source)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
:private
|
48
|
+
def add_merge_file(items,file)
|
49
|
+
return if items.include?(file)
|
50
|
+
items << file if File.exists?(file)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Kernel
|
2
|
+
def expand(title = "Expansion",&block)
|
3
|
+
DevelopWithPassion::Expander::Expansion.instance.instance_eval(&block)
|
4
|
+
end
|
5
|
+
|
6
|
+
def glob(path)
|
7
|
+
items = Dir.glob(path,File::FNM_DOTMATCH)
|
8
|
+
items.each{|item| yield item if block_given?}
|
9
|
+
return items
|
10
|
+
end
|
11
|
+
|
12
|
+
def disable_logging
|
13
|
+
DevelopWithPassion::Expander::Log.disable
|
14
|
+
end
|
15
|
+
|
16
|
+
def enable_logging
|
17
|
+
DevelopWithPassion::Expander::Log.enable
|
18
|
+
end
|
19
|
+
|
20
|
+
def delayed
|
21
|
+
Configatron::Delayed.new do
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def dynamic
|
27
|
+
Configatron::Dynamic.new do
|
28
|
+
yield
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def log(message)
|
33
|
+
DevelopWithPassion::Expander::Log.message(message)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class MustacheTemplateFile
|
4
|
+
def process(args)
|
5
|
+
template = File.read_all_text(args[:input])
|
6
|
+
|
7
|
+
File.open_for_write(args[:output]){|file| file << Mustache.render(template,configatron.to_hash)}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Object
|
2
|
+
def initialize_defaults(factory,*items)
|
3
|
+
items.each do|item|
|
4
|
+
instance_variable_set("@#{item}",factory.call)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize_arrays(*items)
|
9
|
+
initialize_defaults(lambda{[]},*items)
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize_hashes(*items)
|
13
|
+
initialize_defaults(lambda{{}},*items)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize_false(*items)
|
17
|
+
initialize_defaults(lambda{false},*items)
|
18
|
+
end
|
19
|
+
|
20
|
+
def array(name,&block)
|
21
|
+
initialize_arrays(name)
|
22
|
+
dsl = DevelopWithPassion::Expander::ArrayDSL.new(name)
|
23
|
+
yield dsl if block_given?
|
24
|
+
modules = DevelopWithPassion::Expander::ArrayDSLModuleFactory.new.create_modules_from(dsl)
|
25
|
+
modules.each{|new_module| self.extend(new_module)}
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class TemplateProcessors
|
4
|
+
def initialize(processors = {})
|
5
|
+
@processors = processors
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_processor_for(file_name)
|
9
|
+
template_type = File.extname(file_name).gsub(/\./,'').to_sym
|
10
|
+
raise "There is no processor for #{file_name}" unless processor_exists_for(template_type)
|
11
|
+
return @processors[template_type]
|
12
|
+
end
|
13
|
+
|
14
|
+
def register_processor(template_type,processor)
|
15
|
+
raise "The processor for the template already exists" if processor_exists_for(template_type)
|
16
|
+
@processors[template_type.to_sym] = processor
|
17
|
+
end
|
18
|
+
|
19
|
+
def processor_exists_for(template_type)
|
20
|
+
return @processors.has_key?(template_type.to_sym)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DevelopWithPassion
|
2
|
+
module Expander
|
3
|
+
class TemplateVisitor
|
4
|
+
def initialize(args = {})
|
5
|
+
@processor_registry = args.fetch(:processor_registry,TemplateProcessors.instance)
|
6
|
+
@file = args.fetch(:file,File)
|
7
|
+
end
|
8
|
+
|
9
|
+
def run_using(file_name)
|
10
|
+
processor = @processor_registry.get_processor_for(file_name)
|
11
|
+
generated_name = File.basename(file_name,File.extname(file_name))
|
12
|
+
generated_name = generated_name.gsub(/\.dotfile/,"")
|
13
|
+
generated_name = ".#{generated_name}" if (/\.dotfile/ =~ file_name)
|
14
|
+
output = File.join(File.dirname(file_name),generated_name)
|
15
|
+
@file.delete(output) if @file.exists?(output)
|
16
|
+
processor.process(:input => file_name,:output => output)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'developwithpassion_fakes'
|
4
|
+
|
5
|
+
Dir.chdir(File.join(File.dirname(__FILE__),"..,lib".split(','))) do
|
6
|
+
Dir.glob("**/*.rb").each do |file|
|
7
|
+
full_path = File.expand_path(file)
|
8
|
+
$:.unshift File.expand_path(File.dirname(full_path))
|
9
|
+
require full_path
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class RelativeFileSystem
|
14
|
+
class << self
|
15
|
+
def base_path
|
16
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)),"spec_filesytem")
|
17
|
+
|
18
|
+
return path
|
19
|
+
end
|
20
|
+
|
21
|
+
def file_name(name)
|
22
|
+
item = File.join(base_path,name)
|
23
|
+
return item
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
@files = []
|
29
|
+
FileUtils.mkdir_p(RelativeFileSystem.base_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def teardown
|
34
|
+
FileUtils.rm_rf(RelativeFileSystem.base_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
def write_file(name,contents)
|
38
|
+
FileUtils.mkdir_p File.dirname(RelativeFileSystem.file_name(name))
|
39
|
+
File.open(RelativeFileSystem.file_name(name),'w') do |file|
|
40
|
+
file << contents
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def fake
|
46
|
+
DevelopWithPassion::Fakes::Fake.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def catch_exception
|
50
|
+
begin
|
51
|
+
yield
|
52
|
+
rescue Exception => e
|
53
|
+
exception = e
|
54
|
+
end
|
55
|
+
exception
|
56
|
+
end
|
57
|
+
|
58
|
+
module RSpec
|
59
|
+
Matchers.define :have_received do|symbol,*args|
|
60
|
+
match do|fake|
|
61
|
+
fake.received(symbol).called_with(*args) != nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Matchers.define :never_receive do|symbol,*args|
|
66
|
+
match do|fake|
|
67
|
+
item = fake.received(symbol)
|
68
|
+
result = true
|
69
|
+
if (item == nil)
|
70
|
+
result = (args.count == 0)
|
71
|
+
else
|
72
|
+
result = (item.called_with(*args) == nil)
|
73
|
+
end
|
74
|
+
result
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module DevelopWithPassion
|
4
|
+
module Expander
|
5
|
+
describe ArrayDSL do
|
6
|
+
context "when a mutator is specified" do
|
7
|
+
let(:mutator){fake}
|
8
|
+
let(:name){"sdfsdf"}
|
9
|
+
let(:sut){ArrayDSL.new("sdf")}
|
10
|
+
before (:each) do
|
11
|
+
ArrayMutator.stub(:new).with(name,nil).and_return(mutator)
|
12
|
+
end
|
13
|
+
before (:each) do
|
14
|
+
sut.mutator(name)
|
15
|
+
end
|
16
|
+
it "should be added to the list of mutators for the list" do
|
17
|
+
sut.mutators[0].should == mutator
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when a visitor is specified" do
|
22
|
+
let(:visitor){fake}
|
23
|
+
let(:the_visitor){fake}
|
24
|
+
let(:name){"sdfsdf"}
|
25
|
+
let(:sut){ArrayDSL.new("sdf")}
|
26
|
+
before (:each) do
|
27
|
+
ArrayVisitor.stub(:new).with(name,the_visitor).and_return(visitor)
|
28
|
+
end
|
29
|
+
before (:each) do
|
30
|
+
sut.process_using(name,the_visitor)
|
31
|
+
end
|
32
|
+
it "should be added to the list of visitors for the list" do
|
33
|
+
sut.visitors[0].should == visitor
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module DevelopWithPassion
|
4
|
+
module Expander
|
5
|
+
describe ArrayMutatorStep do
|
6
|
+
context "when run" do
|
7
|
+
let(:numbers){[]}
|
8
|
+
let(:target){Sample.new(numbers)}
|
9
|
+
let(:mutators){[]}
|
10
|
+
let(:sut){ArrayMutatorStep.new}
|
11
|
+
let(:builder){ArrayDSL.new(:numbers)}
|
12
|
+
|
13
|
+
context "using a dsl fragment that contains no block usage" do
|
14
|
+
before (:each) do
|
15
|
+
builder.mutator(:add_a_number)
|
16
|
+
end
|
17
|
+
before (:each) do
|
18
|
+
target.extend(sut.run_using(builder))
|
19
|
+
end
|
20
|
+
it "should create a member on the target that allows mutation of the original list" do
|
21
|
+
target.respond_to?(:add_a_number).should be_true
|
22
|
+
target.add_a_number(2)
|
23
|
+
numbers[0].should == 2
|
24
|
+
end
|
25
|
+
end
|
26
|
+
context "using a dsl fragment that contains block usage" do
|
27
|
+
before (:each) do
|
28
|
+
builder.mutator(:add_a_number) do|value|
|
29
|
+
@value_attempted_to_be_added = value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
before (:each) do
|
33
|
+
target.extend(sut.run_using(builder))
|
34
|
+
end
|
35
|
+
it "should create a member on the target that intercepts mutation using the provided block" do
|
36
|
+
target.respond_to?(:add_a_number).should be_true
|
37
|
+
target.add_a_number(2)
|
38
|
+
numbers.count.should == 0
|
39
|
+
@value_attempted_to_be_added.should == 2
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module DevelopWithPassion
|
4
|
+
module Expander
|
5
|
+
describe ArrayReadableStep do
|
6
|
+
context "when run" do
|
7
|
+
let(:target){Sample.new}
|
8
|
+
let(:mutators){[]}
|
9
|
+
let(:sut){ArrayReadableStep.new}
|
10
|
+
let(:builder){ArrayDSL.new(:numbers)}
|
11
|
+
|
12
|
+
context "using a dsl fragment that contains no block usage" do
|
13
|
+
before (:each) do
|
14
|
+
builder.readable
|
15
|
+
end
|
16
|
+
before (:each) do
|
17
|
+
target.extend(sut.run_using(builder))
|
18
|
+
end
|
19
|
+
it "should create a member on the target that allows reading of the array" do
|
20
|
+
target.numbers.should be_a(Array)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|