BuildMaster 1.0.9 → 1.1.9
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/lib/buildmaster/algorithms.rb +3 -0
- data/lib/buildmaster/algorithms/opn_compare.rb +108 -0
- data/lib/buildmaster/cotta/cotta_dir.rb +7 -4
- data/lib/buildmaster/cotta/cotta_file.rb +5 -2
- data/lib/buildmaster/cotta/in_memory_system.rb +28 -4
- data/lib/buildmaster/project/java.rb +4 -0
- data/lib/buildmaster/project/java/class_path.rb +0 -0
- data/lib/buildmaster/project/java/javac.rb +9 -0
- data/lib/buildmaster/project/mysql_served_driver.rb +15 -0
- data/lib/buildmaster/project/pscp_driver.rb +0 -1
- data/lib/buildmaster/project/svn_driver.rb +4 -4
- data/lib/buildmaster/project/svn_server_driver.rb +18 -0
- data/lib/buildmaster/project/svn_status_info.rb +45 -42
- data/lib/buildmaster/site/content_engine_repository.rb +9 -0
- data/lib/buildmaster/site/file_processor.rb +5 -1
- data/lib/buildmaster/site/site.rb +11 -4
- data/lib/buildmaster/site/site_server.rb +1 -1
- data/lib/buildmaster/site/templatelets/href.rb +1 -1
- data/lib/buildmaster/version +1 -1
- data/test/buildmaster/algorithms/tc_opn_compare.rb +44 -0
- data/test/buildmaster/common/tc_properties.rb +8 -8
- data/test/buildmaster/common/tc_tree_to_object.rb +8 -8
- data/test/buildmaster/cotta/cotta_dir_behaviors.rb +167 -0
- data/test/buildmaster/cotta/cotta_file_behaviors.rb +127 -0
- data/test/buildmaster/cotta/cotta_specifications.rb +20 -0
- data/test/buildmaster/cotta/file_system_behaviors.rb +167 -0
- data/test/buildmaster/cotta/tc_command_interface.rb +6 -6
- data/test/buildmaster/cotta/tc_command_runner.rb +5 -5
- data/test/buildmaster/cotta/tc_cotta.rb +12 -12
- data/test/buildmaster/cotta/tc_cotta_dir_in_memory.rb +17 -17
- data/test/buildmaster/cotta/tc_cotta_dir_physical.rb +5 -5
- data/test/buildmaster/cotta/tc_cotta_file_in_memory.rb +8 -9
- data/test/buildmaster/cotta/tc_cotta_file_physical.rb +11 -8
- data/test/buildmaster/cotta/tc_cotta_zip_support.rb +9 -9
- data/test/buildmaster/cotta/tc_in_memory_system.rb +7 -7
- data/test/buildmaster/cotta/tc_io_chain.rb +3 -3
- data/test/buildmaster/cotta/tc_pathname.rb +6 -6
- data/test/buildmaster/cotta/tc_physical_system.rb +7 -8
- data/test/buildmaster/project/tc_ant_driver.rb +8 -8
- data/test/buildmaster/project/tc_build_number_file.rb +5 -5
- data/test/buildmaster/project/tc_cvs_driver.rb +9 -9
- data/test/buildmaster/project/tc_java_manifest.rb +9 -11
- data/test/buildmaster/project/tc_release.rb +12 -12
- data/test/buildmaster/project/tc_server_manager.rb +8 -8
- data/test/buildmaster/project/tc_svn_driver.rb +18 -13
- data/test/buildmaster/project/tc_svn_status_info.rb +8 -8
- data/test/buildmaster/project/tc_version_number_file.rb +6 -6
- data/test/buildmaster/project/windows/tc_iis_driver.rb +4 -4
- data/test/buildmaster/project/windows/tc_sql_server_driver.rb +2 -2
- data/test/buildmaster/site/content/tc_content_engine_repository.rb +5 -5
- data/test/buildmaster/site/tc_element_processor_by_name.rb +4 -4
- data/test/buildmaster/site/tc_file_processor.rb +8 -9
- data/test/buildmaster/site/tc_site.rb +23 -7
- data/test/buildmaster/site/tc_site_server.rb +2 -2
- data/test/buildmaster/site/tc_site_spec.rb +5 -5
- data/test/buildmaster/site/tc_source_file_handler.rb +2 -2
- data/test/buildmaster/site/tc_template_builder.rb +22 -11
- data/test/buildmaster/site/tc_template_error.rb +2 -2
- data/test/buildmaster/site/tc_template_runner.rb +4 -4
- data/test/buildmaster/site/tc_templatelets.rb +4 -4
- data/test/buildmaster/site/tc_xtemplate.rb +5 -5
- data/test/buildmaster/site/templatelets/tc_attribute.rb +6 -6
- data/test/buildmaster/site/templatelets/tc_code.rb +10 -10
- data/test/buildmaster/site/templatelets/tc_each.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_href.rb +7 -7
- data/test/buildmaster/site/templatelets/tc_include.rb +3 -3
- data/test/buildmaster/site/templatelets/tc_link.rb +6 -6
- data/test/buildmaster/site/templatelets/tc_text.rb +4 -4
- data/test/buildmaster/site/templatelets/tc_when.rb +4 -4
- data/test/tmp/svn_test/repository/db/revprops/0 +1 -1
- data/test/tmp/svn_test/repository/db/revprops/1 +1 -1
- data/test/tmp/svn_test/repository/db/revprops/2 +1 -1
- data/test/tmp/svn_test/repository/db/revprops/3 +1 -1
- data/test/tmp/svn_test/repository/db/revprops/4 +1 -1
- data/test/tmp/svn_test/repository/db/uuid +1 -1
- metadata +60 -46
@@ -9,6 +9,7 @@ class ContentEngineRepository
|
|
9
9
|
@map['.markdown'] = MarkdownEngine.new
|
10
10
|
@map['.html'] = HtmlEngine.new
|
11
11
|
@map['.txt'] = TextileEngine.new
|
12
|
+
@map['.deplate'] = DeplateEngine.new
|
12
13
|
end
|
13
14
|
|
14
15
|
def supports?(extname)
|
@@ -80,4 +81,12 @@ class HtmlEngine
|
|
80
81
|
return full_content
|
81
82
|
end
|
82
83
|
end
|
84
|
+
|
85
|
+
class DeplateEngine
|
86
|
+
include ContentEngine
|
87
|
+
def convert_to_html(full_content)
|
88
|
+
require 'deplate/deplate-string'
|
89
|
+
process_content_with_title(full_content) {|content| DeplateString.new(content).to_html}
|
90
|
+
end
|
91
|
+
end
|
83
92
|
end
|
@@ -44,7 +44,11 @@ class FileProcessor
|
|
44
44
|
html_content = @content_engine.convert_to_html(content_file.load)
|
45
45
|
process_html(html_content)
|
46
46
|
end
|
47
|
-
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def out_of_date?
|
50
|
+
(not @target_file.exists?) || @target_file.older_than?(@content_file)
|
51
|
+
end
|
48
52
|
|
49
53
|
private
|
50
54
|
def process_html(html_content)
|
@@ -91,15 +91,22 @@ require 'buildmaster/site_tester'
|
|
91
91
|
build_directory(out_dir.dir(item.name), item, template)
|
92
92
|
elsif (item.respond_to? 'read')
|
93
93
|
@current_file_name = item
|
94
|
-
process_file(item, out_dir, content_dir, item)
|
95
|
-
|
94
|
+
if(process_file(item, out_dir, content_dir, item))
|
95
|
+
@count = @count + 1
|
96
|
+
end
|
96
97
|
end
|
97
98
|
end
|
98
99
|
end
|
99
100
|
|
100
101
|
def process_file(content_file, out_dir, content_dir, item)
|
101
|
-
|
102
|
-
|
102
|
+
processor = FileProcessor.new(@template, content_file, @spec)
|
103
|
+
processed = nil
|
104
|
+
if (processor.out_of_date?)
|
105
|
+
print ">> #{content_file.path.to_s}\n"
|
106
|
+
processor.write_to_target
|
107
|
+
processed = true
|
108
|
+
end
|
109
|
+
processed
|
103
110
|
end
|
104
111
|
|
105
112
|
end
|
data/lib/buildmaster/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.9
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmaster')
|
4
|
+
|
5
|
+
require 'algorithms/opn_compare'
|
6
|
+
|
7
|
+
module BuildMaster
|
8
|
+
module Algorithms
|
9
|
+
describe NegativeIndexArray do
|
10
|
+
it 'index with negative number' do
|
11
|
+
array = NegativeIndexArray.new(5, 5) {|index| 'default'}
|
12
|
+
array[-5].should == 'default'
|
13
|
+
array[5].should == 'default'
|
14
|
+
array[5] = '+5'
|
15
|
+
array[-5] = '-5'
|
16
|
+
array[5].should == '+5'
|
17
|
+
array[-5].should == '-5'
|
18
|
+
(-4..4).each {|index| array[index].should == 'default'}
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'default value' do
|
22
|
+
array = NegativeIndexArray.new(5, 5) {|index| index}
|
23
|
+
array[-1].should == -1
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe OpnCompare, 'O(pn) Compare Algorithm' do
|
28
|
+
it 'no diff' do
|
29
|
+
m = 'abcdefg'
|
30
|
+
n = 'abcdefg'
|
31
|
+
diff = OpnCompare.new(m, n).compare
|
32
|
+
# diff.should be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'one character change' do
|
36
|
+
m = 'abfcde'
|
37
|
+
n = 'abcdef'
|
38
|
+
diff = OpnCompare.new(m, n).compare
|
39
|
+
# diff.should have(1).edits
|
40
|
+
# diff.edits[0].should == EditStep.new(EditAction.Add, 5)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -6,19 +6,19 @@ require 'common/properties'
|
|
6
6
|
|
7
7
|
module BuildMaster::Common
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
describe Properties do
|
10
|
+
it 'parse io into hash' do
|
11
|
+
content = <<CONTENT
|
12
12
|
one : 1
|
13
13
|
two : 2
|
14
14
|
three : 3
|
15
15
|
|
16
16
|
CONTENT
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
hash = Properties.parse_io(StringIO.new(content))
|
18
|
+
hash.should have_key('one')
|
19
|
+
hash['one'].should == '1'
|
20
|
+
end
|
21
|
+
|
20
22
|
end
|
21
|
-
|
22
|
-
end
|
23
23
|
|
24
24
|
end
|
@@ -27,8 +27,8 @@ class SampleTwo
|
|
27
27
|
attr_writer :field, :index
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
describe TreeToObject do
|
31
|
+
it 'should_populate_string_fields' do
|
32
32
|
content = <<CONTENT
|
33
33
|
field_one: value_one
|
34
34
|
field_two: value_two
|
@@ -40,7 +40,7 @@ CONTENT
|
|
40
40
|
object.field_two.should == 'value_two'
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
it 'should_populate_array_fields' do
|
44
44
|
content = <<CONTENT
|
45
45
|
array_field:
|
46
46
|
- field: valueone
|
@@ -57,7 +57,7 @@ CONTENT
|
|
57
57
|
array[1].index.to_s.should == '2'
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
it 'should_populate_instance_fields' do
|
61
61
|
content = <<CONTENT
|
62
62
|
object_two:
|
63
63
|
field: my_field
|
@@ -69,7 +69,7 @@ CONTENT
|
|
69
69
|
actual.index.to_s.should == '5'
|
70
70
|
end
|
71
71
|
|
72
|
-
|
72
|
+
it 'should_raise_error_if_property_not_found' do
|
73
73
|
content = <<CONTENT
|
74
74
|
not_field: value
|
75
75
|
CONTENT
|
@@ -82,7 +82,7 @@ CONTENT
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
|
85
|
+
it 'should_raise_error_if_sub_property_not_found' do
|
86
86
|
content = <<CONTENT
|
87
87
|
not_sub_property:
|
88
88
|
field: value
|
@@ -96,7 +96,7 @@ CONTENT
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
-
|
99
|
+
it 'should_raise_error_if_array_property_not_found' do
|
100
100
|
content = <<CONTENT
|
101
101
|
not_array_property:
|
102
102
|
- name: title
|
@@ -111,7 +111,7 @@ CONTENT
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
|
114
|
+
it 'empty_content' do
|
115
115
|
object = TreeToObject.from_yaml('', SampleObject.new)
|
116
116
|
object.field_one.should == nil
|
117
117
|
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmaster')
|
2
|
+
|
3
|
+
require 'cotta'
|
4
|
+
require 'cotta/cotta_file'
|
5
|
+
require 'cotta/cotta_dir'
|
6
|
+
require 'spec'
|
7
|
+
require 'pathname'
|
8
|
+
|
9
|
+
module BuildMaster
|
10
|
+
describe 'CottaDirBehaviors', :shared=>true do
|
11
|
+
before do
|
12
|
+
create_system
|
13
|
+
@dir = BuildMaster::CottaDir.new(@system, Pathname.new('dir'))
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'load dir with basic information' do
|
17
|
+
@dir.name.should == 'dir'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'dir objects are value objects, equal on system and path' do
|
21
|
+
(BuildMaster::CottaDir.new(@system, Pathname.new('dir')) == @dir).should == true
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'dir should not be equal if path different' do
|
25
|
+
(BuildMaster::CottaDir.new(@system, Pathname.new('/dir')) == @dir).should == false
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should support relative path' do
|
29
|
+
sub_dir = @dir.dir('one/two/three')
|
30
|
+
sub_dir.relative_path_from(@dir).to_s.should == 'one/two/three'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'dir should know its parent' do
|
34
|
+
@dir.parent.name.should == '.'
|
35
|
+
@dir.parent.parent.should be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should raise error if not exits stat' do
|
39
|
+
Proc.new {
|
40
|
+
@dir.stat
|
41
|
+
}.should raise_error(Errno::ENOENT)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'support stat' do
|
45
|
+
@dir.mkdirs
|
46
|
+
@dir.stat.should_not be_nil
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'dir should handle root dir' do
|
50
|
+
dir = BuildMaster::CottaDir.new(@system, Pathname.new('/root'))
|
51
|
+
dir.parent.path.should == Pathname.new('/')
|
52
|
+
dir.parent.name.should == '/'
|
53
|
+
dir.parent.exists?.should == true
|
54
|
+
dir.parent.root?.should == true
|
55
|
+
dir.parent.parent.should be_nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'dir should handle root dir for drive letters' do
|
59
|
+
dir = BuildMaster::CottaDir.new(@system, Pathname.new('C:/Windows'))
|
60
|
+
dir.name.should == 'Windows'
|
61
|
+
dir.parent.path.should == Pathname.new('C:/')
|
62
|
+
dir.parent.name.should == 'C:/'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'dir should return sub directory' do
|
66
|
+
@dir.dir('sub').path.should == Pathname.new('dir/sub')
|
67
|
+
@dir.dir('sub').parent.should == @dir
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'dir should return a directory from a relative pathname' do
|
71
|
+
@dir.dir(Pathname.new('one/two/three')).should == @dir.dir('one').dir('two').dir('three')
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should get file in current directory' do
|
75
|
+
file = @dir.file('file.txt')
|
76
|
+
file.name.should == 'file.txt'
|
77
|
+
file.path.should == Pathname.new('dir/file.txt')
|
78
|
+
file.parent.should == @dir
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should create dir and its parent' do
|
82
|
+
dir = @dir.dir('one').dir('two')
|
83
|
+
dir.exists?.should == false
|
84
|
+
dir.parent.exists?.should == false
|
85
|
+
dir.mkdirs
|
86
|
+
dir.exists?.should == true
|
87
|
+
dir.parent.exists?.should == true
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should delete dir and its children' do
|
91
|
+
dir = @dir.dir('one').dir('two').dir('three')
|
92
|
+
dir.mkdirs
|
93
|
+
@dir.exists?.should == true
|
94
|
+
@dir.delete
|
95
|
+
dir.exists?.should == false
|
96
|
+
@dir.exists?.should == false
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should do nothing if dir already exists' do
|
100
|
+
dir = @dir.dir('one').dir('two')
|
101
|
+
dir.mkdirs
|
102
|
+
dir.mkdirs
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should list dirs' do
|
106
|
+
@dir.dir('one').mkdirs
|
107
|
+
@dir.file('one.txt').save
|
108
|
+
actual_dir_list = @dir.list
|
109
|
+
actual_dir_list.size.should == 2
|
110
|
+
actual_dir_list[0].name.should == 'one'
|
111
|
+
actual_dir_list[0].list.size.should == 0
|
112
|
+
actual_dir_list[1].name.should == 'one.txt'
|
113
|
+
actual_dir_list[1].save
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should move directory with its children' do
|
117
|
+
dir = BuildMaster::CottaDir.new(@system, Pathname.new('targetdir/child_dir'))
|
118
|
+
@dir.file('file.txt').save('file.txt')
|
119
|
+
@dir.dir('subdir').mkdirs
|
120
|
+
@dir.list.size.should == 2
|
121
|
+
@dir.move_to(dir)
|
122
|
+
@dir.exists?.should == false
|
123
|
+
dir.list.size.should == 2
|
124
|
+
dir.file('file.txt').load.should == 'file.txt'
|
125
|
+
dir.dir('subdir').exists?.should == true
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should copy directory with its children' do
|
129
|
+
dir = BuildMaster::CottaDir.new(@system, Pathname.new('targetdir/child_dir'))
|
130
|
+
@dir.file('file.txt').save('file.txt')
|
131
|
+
@dir.dir('subdir').mkdirs
|
132
|
+
@dir.list.size.should == 2
|
133
|
+
@dir.copy_to(dir)
|
134
|
+
@dir.exists?.should == true
|
135
|
+
dir.list.size.should == 2
|
136
|
+
dir.file('file.txt').load.should == 'file.txt'
|
137
|
+
dir.dir('subdir').exists?.should == true
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'dir takes relative path' do
|
141
|
+
dir = BuildMaster::CottaDir.new(@system, Pathname.new('targetdir/dir'))
|
142
|
+
@dir.dir('one/two/three').mkdirs
|
143
|
+
@dir.dir('one').exists?.should == true
|
144
|
+
@dir.dir('one').dir('two').exists?.should == true
|
145
|
+
@dir.dir('one').dir('two').dir('three').exists?.should == true
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'list on not existing directory' do
|
149
|
+
dir = BuildMaster::CottaDir.new(@system, Pathname.new('no/such/directory'))
|
150
|
+
Proc.new {
|
151
|
+
dir.list
|
152
|
+
}.should raise_error(Errno::ENOENT)
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'allow filter for archive' do
|
156
|
+
@dir.file('in/in.txt').save('test')
|
157
|
+
@dir.file('out/out.txt').save('test')
|
158
|
+
result = @dir.archive {|entry|
|
159
|
+
entry.name != 'out'
|
160
|
+
}
|
161
|
+
target = result.extract(@dir.dir('extract'))
|
162
|
+
target.dir('out').should_not be_exist
|
163
|
+
target.dir('in').should be_exist
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmaster')
|
2
|
+
|
3
|
+
require 'cotta'
|
4
|
+
require 'cotta/cotta_file'
|
5
|
+
require 'cotta/cotta_dir'
|
6
|
+
require 'cotta/in_memory_system'
|
7
|
+
require 'spec'
|
8
|
+
require 'pathname'
|
9
|
+
|
10
|
+
module BuildMaster
|
11
|
+
describe 'CottaFileBehaviors', :shared => true do
|
12
|
+
before do
|
13
|
+
create_system
|
14
|
+
@file = BuildMaster::CottaFile.new(@system, Pathname.new('dir/file.txt'))
|
15
|
+
end
|
16
|
+
it 'file can be created with system and pathname' do
|
17
|
+
@file.name.should == 'file.txt'
|
18
|
+
@file.path.should == Pathname.new('dir/file.txt')
|
19
|
+
@file.exists?.should == false
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'file should know properties like parent, name, etc.' do
|
23
|
+
@file.parent.should == BuildMaster::CottaDir.new(@system, Pathname.new('dir'))
|
24
|
+
@file.name.should == 'file.txt'
|
25
|
+
@file.path.should == Pathname.new('dir/file.txt')
|
26
|
+
@file.extname.should == '.txt'
|
27
|
+
@file.basename.should == 'file'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should support relative path' do
|
31
|
+
parent = @file.parent
|
32
|
+
file = parent.file('one/two/three.txt')
|
33
|
+
file.relative_path_from(parent).to_s.should == 'one/two/three.txt'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'file should support stat' do
|
37
|
+
@file.save('test')
|
38
|
+
@file.stat.should_not be_nil
|
39
|
+
@file.stat.size.should == 4
|
40
|
+
@file.stat.writable?.should == true
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should raise error if does not exist' do
|
44
|
+
Proc.new {
|
45
|
+
@file.stat
|
46
|
+
}.should raise_error(Errno::ENOENT)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should load and save file content' do
|
50
|
+
@file.exists?.should == false
|
51
|
+
@file.parent.exists?.should == false
|
52
|
+
@file.save("content to save\nsecond line")
|
53
|
+
@file.exists?.should == true
|
54
|
+
@file.load.should ==("content to save\nsecond line")
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should open file to read' do
|
58
|
+
@file.save("one\ntwo")
|
59
|
+
@file.read do |file|
|
60
|
+
file.gets.should ==("one\n")
|
61
|
+
file.gets.should ==('two')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should equal if same system and pathname' do
|
66
|
+
file2 = BuildMaster::CottaFile.new(@system, Pathname.new('dir/file.txt'))
|
67
|
+
file2.should == @file
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should copy to another file' do
|
71
|
+
file2 = BuildMaster::CottaFile.new(@system, Pathname.new('dir2/file.txt'))
|
72
|
+
file2.exists?.should == false
|
73
|
+
@file.save('my content')
|
74
|
+
@file.copy_to(file2)
|
75
|
+
file2.exists?.should == true
|
76
|
+
file2.load.should == 'my content'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should move file' do
|
80
|
+
file2 = BuildMaster::CottaFile.new(@system, Pathname.new('dir2/file.txt'))
|
81
|
+
file2.exists?.should == false
|
82
|
+
@file.save('content')
|
83
|
+
@file.move_to(file2)
|
84
|
+
file2.exists?.should == true
|
85
|
+
file2.load.should == 'content'
|
86
|
+
@file.exists?.should == false
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should support foreach' do
|
90
|
+
@file.write do |file|
|
91
|
+
file.puts 'line one'
|
92
|
+
file.puts 'line two'
|
93
|
+
end
|
94
|
+
collected = Array.new
|
95
|
+
@file.foreach do |line|
|
96
|
+
collected.push line
|
97
|
+
end
|
98
|
+
collected.size.should == 2
|
99
|
+
collected[0].should == "line one\n"
|
100
|
+
collected[1].should == "line two\n"
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should delete file' do
|
104
|
+
@file.save
|
105
|
+
@file.exists?.should == true
|
106
|
+
@file.delete
|
107
|
+
@file.exists?.should == false
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should raise error if file to delete does not exist' do
|
111
|
+
lambda {
|
112
|
+
@file.delete
|
113
|
+
}.should raise_error(Errno::ENOENT)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should check timestamp to see which one is older' do
|
117
|
+
@file.save
|
118
|
+
file2 = @file.parent.file('another.txt')
|
119
|
+
sleep 1
|
120
|
+
file2.save
|
121
|
+
file2.older_than?(@file).should == false
|
122
|
+
@file.older_than?(file2).should == true
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|