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.
Files changed (58) hide show
  1. data/.gitignore +3 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +4 -0
  4. data/Guardfile +5 -0
  5. data/Rakefile +1 -0
  6. data/bin/dwp_expand +4 -0
  7. data/develpwithpassion_expander.gemspec +29 -0
  8. data/lib/developwithpassion_expander.rb +32 -0
  9. data/lib/developwithpassion_expander/array.rb +8 -0
  10. data/lib/developwithpassion_expander/array_dsl.rb +34 -0
  11. data/lib/developwithpassion_expander/array_dsl_module_factory.rb +14 -0
  12. data/lib/developwithpassion_expander/array_mutator.rb +12 -0
  13. data/lib/developwithpassion_expander/array_mutator_step.rb +17 -0
  14. data/lib/developwithpassion_expander/array_readable_step.rb +15 -0
  15. data/lib/developwithpassion_expander/array_visitor.rb +12 -0
  16. data/lib/developwithpassion_expander/array_visitor_step.rb +16 -0
  17. data/lib/developwithpassion_expander/array_writeable_step.rb +15 -0
  18. data/lib/developwithpassion_expander/cli_interface.rb +41 -0
  19. data/lib/developwithpassion_expander/copy.rb +29 -0
  20. data/lib/developwithpassion_expander/copy_to_target.rb +13 -0
  21. data/lib/developwithpassion_expander/enumerable_extensions.rb +11 -0
  22. data/lib/developwithpassion_expander/erb_template_file.rb +33 -0
  23. data/lib/developwithpassion_expander/expansion.rb +84 -0
  24. data/lib/developwithpassion_expander/file.rb +32 -0
  25. data/lib/developwithpassion_expander/file_merge.rb +54 -0
  26. data/lib/developwithpassion_expander/kernel.rb +35 -0
  27. data/lib/developwithpassion_expander/log.rb +17 -0
  28. data/lib/developwithpassion_expander/mustache_template_file.rb +11 -0
  29. data/lib/developwithpassion_expander/object_extensions.rb +28 -0
  30. data/lib/developwithpassion_expander/shell.rb +9 -0
  31. data/lib/developwithpassion_expander/shell_action_against_file.rb +12 -0
  32. data/lib/developwithpassion_expander/string.rb +5 -0
  33. data/lib/developwithpassion_expander/template_processors.rb +24 -0
  34. data/lib/developwithpassion_expander/template_visitor.rb +20 -0
  35. data/lib/developwithpassion_expander/version.rb +5 -0
  36. data/spec/spec_helper.rb +77 -0
  37. data/spec/specs/array_dsl_spec.rb +38 -0
  38. data/spec/specs/array_mutator_step_spec.rb +47 -0
  39. data/spec/specs/array_readable_step_spec.rb +26 -0
  40. data/spec/specs/array_spec.rb +22 -0
  41. data/spec/specs/array_visitor_step_spec.rb +78 -0
  42. data/spec/specs/array_writeable_step_spec.rb +30 -0
  43. data/spec/specs/copy_spec.rb +89 -0
  44. data/spec/specs/copy_to_target_spec.rb +24 -0
  45. data/spec/specs/enumerable_extensions_spec.rb +27 -0
  46. data/spec/specs/erb_template_file_spec.rb +65 -0
  47. data/spec/specs/expansion_spec.rb +146 -0
  48. data/spec/specs/file_merge_spec.rb +133 -0
  49. data/spec/specs/file_spec.rb +81 -0
  50. data/spec/specs/kernel_spec.rb +56 -0
  51. data/spec/specs/mustache_template_file_spec.rb +50 -0
  52. data/spec/specs/object_spec.rb +202 -0
  53. data/spec/specs/sample.rb +5 -0
  54. data/spec/specs/shell_action_against_file_spec.rb +24 -0
  55. data/spec/specs/string_spec.rb +13 -0
  56. data/spec/specs/template_processors_spec.rb +64 -0
  57. data/spec/specs/template_visitor_spec.rb +86 -0
  58. metadata +202 -0
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ describe Array do
6
+ it "should be able to return the array contents as a glob pattern" do
7
+ items = %w[this is cool **/*.rb]
8
+ %w[this is cool **/*.rb].as_glob_pattern.should == File.join(items)
9
+ end
10
+
11
+ it "should map each item as a home item" do
12
+ items = %w[this is cool]
13
+ items.as_home_files.should == items.map{|item| item.as_home_file}
14
+ end
15
+
16
+ it "should be able to be converted to a glob pattern" do
17
+ %w[this is cool].as_glob_pattern.should == "this/is/cool"
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ describe ArrayVisitorStep do
6
+ class OurSet
7
+ attr_accessor :items
8
+
9
+ def initialize
10
+ @items = []
11
+ end
12
+
13
+ def add(item)
14
+ @items << item
15
+ end
16
+ end
17
+ class Speak
18
+ def initialize(invocations)
19
+ @invocations = invocations
20
+ end
21
+ def hello
22
+ @invocations.push(1)
23
+ end
24
+ end
25
+ context "when run" do
26
+ context "using a visitor that is symbol based" do
27
+ let(:target){OurSet.new}
28
+ let(:mutators){[]}
29
+ let(:invocations){[]}
30
+ let(:sut){ArrayVisitorStep.new}
31
+ let(:builder){ArrayDSL.new(:items)}
32
+ before (:each) do
33
+ (1..10).each{|item| target.add(Speak.new(invocations))}
34
+ builder.process_using(:run,:hello)
35
+ end
36
+ before (:each) do
37
+ target.extend(sut.run_using(builder))
38
+ end
39
+
40
+ it "should create a method on the target that triggers each item in the list using its provided action" do
41
+ target.run
42
+ invocations.count.should == 10
43
+ end
44
+ end
45
+ context "using a visitor that is class based" do
46
+ class TheVisitor
47
+ attr_accessor :items
48
+ def initialize
49
+ @items = []
50
+ end
51
+ def run_using(item)
52
+ @items << item
53
+ end
54
+ end
55
+ let(:target){OurSet.new}
56
+ let(:visitor){TheVisitor.new}
57
+ let(:mutators){[]}
58
+ let(:invocations){[]}
59
+ let(:sut){ArrayVisitorStep.new}
60
+ let(:builder){ArrayDSL.new(:items)}
61
+
62
+ before (:each) do
63
+ (1..10).each{|item| target.add(item)}
64
+ builder.process_using(:run,visitor)
65
+ end
66
+ before (:each) do
67
+ target.extend(sut.run_using(builder))
68
+ end
69
+
70
+ it "should create a method on the target that triggers the visitor once for each item in the list" do
71
+ target.run
72
+ (1..10).each{|item| visitor.items.include?(item).should be_true}
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ describe ArrayWriteableStep do
6
+ context "when run" do
7
+ context "using a dsl fragment that contains no block usage" do
8
+ let(:target){Sample.new}
9
+ let(:mutators){[]}
10
+ let(:sut){ArrayWriteableStep.new}
11
+ let(:builder){ArrayDSL.new(:numbers)}
12
+ before (:each) do
13
+ builder.writable
14
+ end
15
+ before (:each) do
16
+ target.extend(sut.run_using(builder))
17
+ end
18
+ it "should create a member on the target that allows assignment to the array" do
19
+ new_array = [1]
20
+ target.numbers = new_array
21
+ def target.numbers
22
+ return @numbers
23
+ end
24
+ target.numbers.should == new_array
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ class FakeVisitor
6
+ def initialize
7
+ array :sources do|a|
8
+ a.readable
9
+ a.writable
10
+ a.mutator :run_using
11
+ end
12
+ end
13
+ end
14
+ describe Copy do
15
+ let(:sources){[]}
16
+ let(:copy_visitor){FakeVisitor.new}
17
+
18
+ before (:each) do
19
+ @sut = Copy.new(copy_visitor)
20
+ @sut.sources = sources
21
+ end
22
+
23
+ context "when a folder is registered" do
24
+ let(:folder){"item"}
25
+
26
+ before (:each) do
27
+ @sut.folder(folder)
28
+ end
29
+
30
+ it "should be placed in the list of sources" do
31
+ sources[0].should == folder
32
+ end
33
+ end
34
+
35
+ context "when the contents of a folder is registered" do
36
+ let(:folder){"item"}
37
+
38
+ before (:each) do
39
+ @sut.contents(folder)
40
+ end
41
+
42
+ it "should be placed in the list of sources" do
43
+ sources[0].should == "#{folder}/."
44
+ end
45
+ end
46
+
47
+ context "when copying contents in a set of folders" do
48
+ let(:folder){"item"}
49
+
50
+ before (:each) do
51
+ @sut.all_contents_in(%w[1 2])
52
+ end
53
+
54
+ it "should place all of the folders in the sources set" do
55
+ sources[0].should == "1/."
56
+ sources[1].should == "2/."
57
+ end
58
+ end
59
+
60
+ context "when copying folders in a set of folders" do
61
+ let(:folder){"item"}
62
+
63
+ before (:each) do
64
+ @sut.all_folders_in(%w[1 2])
65
+ end
66
+
67
+ it "should place all of the folders in the sources set" do
68
+ sources[0].should == "1"
69
+ sources[1].should == "2"
70
+ end
71
+ end
72
+ context "when expanding all of the items" do
73
+ let(:folder){"item"}
74
+
75
+ before (:each) do
76
+ %w[1 2 3].each{|item| sources << item}
77
+ end
78
+
79
+ before (:each) do
80
+ @sut.run
81
+ end
82
+
83
+ it "should copy each of the sources tot he target" do
84
+ copy_visitor.sources.count.should == 3
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ describe CopyToTarget do
6
+ context "when performing a copy" do
7
+ let(:target){"the_target"}
8
+ let(:shell){fake}
9
+ let(:source){"the_source"}
10
+
11
+ before (:each) do
12
+ Shell.stub(:instance).and_return(shell)
13
+ @sut = CopyToTarget.new(target)
14
+ end
15
+ before (:each) do
16
+ @sut.run_using(source)
17
+ end
18
+ it "should copy the source to the target" do
19
+ shell.should have_received(:run,"cp -rf #{source} #{target}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Enumerable do
4
+ class Visitor
5
+ attr_accessor :items_processed
6
+
7
+ def initialize
8
+ @items_processed = 0
9
+ end
10
+ def run_using(item)
11
+ @items_processed += 1
12
+ end
13
+ end
14
+ context "when processing each item with a visitor" do
15
+ let(:visitor){Visitor.new}
16
+ let(:items){(1..10).to_a}
17
+
18
+ before (:each) do
19
+ items.process_all_items_using(visitor)
20
+ end
21
+
22
+ it "should run each item against the visitor" do
23
+ visitor.items_processed.should == 10
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ describe ERBTemplateFile do
6
+ before (:each) do
7
+ @original_template = <<-original
8
+ This is the first line @item@
9
+ This is the second line @item@
10
+ original
11
+ end
12
+ context "when preparing a template" do
13
+ let(:sut){ERBTemplateFile.new}
14
+
15
+ before (:each) do
16
+ @result = sut.prepare_template(@original_template)
17
+ end
18
+
19
+ it "should replace all occurences of @item@ with <%=item %>" do
20
+ @expected = <<-template
21
+ This is the first line <%= item %>
22
+ This is the second line <%= item %>
23
+ template
24
+
25
+ @result.should == @expected
26
+ end
27
+ end
28
+ context "when processing" do
29
+ let(:item){"yo"}
30
+ let(:file){fake}
31
+ let(:file_name){"blah.rb"}
32
+ let(:sut){ERBTemplateFile.new}
33
+
34
+ before (:each) do
35
+ @filesystem = RelativeFileSystem.new
36
+ @output = RelativeFileSystem.file_name("out.rb")
37
+ @original_template = <<-original
38
+ This is the first line @item@
39
+ This is the second line @item@
40
+ original
41
+
42
+ File.stub(:read).with(file_name).and_return(@original_template)
43
+ end
44
+
45
+ after(:each) do
46
+ @filesystem.teardown
47
+ end
48
+
49
+ before (:each) do
50
+ sut.process(:input => file_name,:output => @output,:binding => binding)
51
+ end
52
+
53
+ it "should expand everything" do
54
+ @expected = <<-template
55
+ This is the first line #{item}
56
+ This is the second line #{item}
57
+ template
58
+
59
+ File.read_all_text(@output).should == @expected
60
+ end
61
+
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ module DevelopWithPassion
4
+ module Expander
5
+ describe Expansion do
6
+ let(:sources){[]}
7
+ let(:template_visitor){fake}
8
+ let(:builders){{
9
+ :cleanup_items => fake,
10
+ :setup_items => fake,
11
+ :executable_files => fake,
12
+ :templates => fake,
13
+ :files_with_line_endings_to_fix => fake,
14
+ :folders_to_purge => fake
15
+ }}
16
+ let(:mark_executable_visitor){fake}
17
+ let(:dos_2_unix_visitor){fake}
18
+ let(:rm_rf_visitor){fake}
19
+ let(:module_factory){fake}
20
+
21
+ context "when created" do
22
+ before (:each) do
23
+ TemplateVisitor.stub(:instance).and_return(template_visitor)
24
+ the_module = Module.new do
25
+ end
26
+ ArrayDSLModuleFactory.stub(:new).and_return(module_factory)
27
+ builders.each do|name,builder|
28
+ ArrayDSL.stub(:new).with(name).and_return(builder)
29
+ module_factory.stub(:create_modules_from).with(builder).and_return([the_module])
30
+ end
31
+ ShellActionAgainstFile.stub(:new).with("chmod +x").and_return(mark_executable_visitor)
32
+ ShellActionAgainstFile.stub(:new).with("d2u").and_return(dos_2_unix_visitor)
33
+ ShellActionAgainstFile.stub(:new).with("rm -rf").and_return(rm_rf_visitor)
34
+ end
35
+ before (:each) do
36
+ Expansion.new
37
+ end
38
+
39
+ it "should scaffold the cleanup items list" do
40
+ cleanup_items_builder = builders[:cleanup_items]
41
+ cleanup_items_builder.should have_received(:readable)
42
+ cleanup_items_builder.should have_received(:process_using,:run_cleanup,:call)
43
+ end
44
+
45
+ it "should scaffold the setup items list" do
46
+ setup_items_builder = builders[:setup_items]
47
+ setup_items_builder.should have_received(:readable)
48
+ setup_items_builder.should have_received(:process_using,:run_setup_items,:call)
49
+ end
50
+
51
+ it "should scaffold the executable files list" do
52
+ executable_files_builder = builders[:executable_files]
53
+ executable_files_builder.should have_received(:mutator,:register_executable)
54
+ executable_files_builder.should have_received(:process_using,:mark_files_executable,mark_executable_visitor)
55
+ end
56
+
57
+ it "should scaffold the list of files ending to fix" do
58
+ line_endings_to_fix_builder_builder = builders[:files_with_line_endings_to_fix]
59
+ line_endings_to_fix_builder_builder.should have_received(:mutator,:fix_line_endings_for)
60
+ line_endings_to_fix_builder_builder.should have_received(:process_using,:fix_line_endings,dos_2_unix_visitor)
61
+ end
62
+
63
+ it "should scaffold the folders to purge list" do
64
+ folders_to_purge_builder_builder = builders[:folders_to_purge]
65
+ folders_to_purge_builder_builder.should have_received(:mutator,:register_folder_to_purge)
66
+ folders_to_purge_builder_builder.should have_received(:process_using,:purge_targets,rm_rf_visitor)
67
+ end
68
+
69
+ it "should scaffold the templates list" do
70
+ templates_builder_builder = builders[:templates]
71
+ templates_builder_builder.should have_received(:mutator,:look_for_templates_in)
72
+ templates_builder_builder.should have_received(:process_using,:expand_templates,template_visitor)
73
+ end
74
+ end
75
+
76
+ context "when specifying a copy" do
77
+ before (:each) do
78
+ TemplateVisitor.stub(:instance).and_return(template_visitor)
79
+ @sut = Expansion.new
80
+ end
81
+
82
+ before (:each) do
83
+ @sut.copy_to "blah" do
84
+ end
85
+ end
86
+
87
+ it "should not affect the merges" do
88
+ @sut.files_to_merge.count.should == 0
89
+ end
90
+
91
+ it "should add a new copy element to the list of copies to be performed" do
92
+ @sut.copies.values.count.should == 1
93
+ @sut.copies[:blah].should be_an(Copy)
94
+ end
95
+ end
96
+
97
+ context "when specifying a merge" do
98
+ before (:each) do
99
+ TemplateVisitor.stub(:instance).and_return(template_visitor)
100
+ @sut = Expansion.new
101
+ end
102
+ before (:each) do
103
+ @sut.merge_to "blah" do
104
+ end
105
+ end
106
+
107
+ it "should not alter the copy files" do
108
+ @sut.copies.count.should == 0
109
+ end
110
+
111
+ it "should add a new copy element to the list of copies to be performed" do
112
+ @sut.files_to_merge.values.count.should == 1
113
+ @sut.files_to_merge[:blah].should be_an(FileMerge)
114
+ end
115
+ end
116
+
117
+ context "when a cleanup is specified" do
118
+ before (:each) do
119
+ TemplateVisitor.stub(:instance).and_return(template_visitor)
120
+ @sut = Expansion.new
121
+ end
122
+ before (:each) do
123
+ @sut.cleanup do
124
+ end
125
+ end
126
+ it "should be added to the set of cleanup blocks" do
127
+ @sut.cleanup_items.count.should == 1
128
+ end
129
+ end
130
+
131
+ context "when a before is specified" do
132
+ before (:each) do
133
+ TemplateVisitor.stub(:instance).and_return(template_visitor)
134
+ @sut = Expansion.new
135
+ end
136
+ before (:each) do
137
+ @sut.before do
138
+ end
139
+ end
140
+ it "should be added to the set of setup blocks" do
141
+ @sut.setup_items.count.should == 1
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end