maid 0.1.2 → 0.1.3.beta.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.
@@ -0,0 +1,38 @@
1
+ # Migrate trash to correct directory on Linux due to a configuration bug in previous releases.
2
+ #
3
+ # It used to be that the default trash path was the same on every platform, so everything used to go to `~/.Trash` regardless of OS. (For what it's worth, that used to be the correct trash path on older releases of Ubuntu.)
4
+ module Maid
5
+ module TrashMigration
6
+ class << self
7
+ def incorrect_trash
8
+ File.expand_path('~/.Trash') + '/'
9
+ end
10
+
11
+ def correct_trash
12
+ Maid.new.trash_path
13
+ end
14
+
15
+ def needed?
16
+ Platform.linux? &&
17
+ File.directory?(incorrect_trash) &&
18
+ !ENV['MAID_NO_MIGRATE_TRASH']
19
+ end
20
+
21
+ def perform
22
+ maid = ::Maid::Maid.new(:trash_path => correct_trash)
23
+ # Use local variable so it's available in the closure used by `instance_eval`
24
+ path = incorrect_trash
25
+
26
+ # Might as well use Maid itself for this :)
27
+ maid.instance_eval do
28
+ rule 'Migrate Linux trash to correct path' do
29
+ trash(dir("#{ path }/*"))
30
+ trash(path)
31
+ end
32
+ end
33
+
34
+ maid.clean
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module Maid
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3.beta.1"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
3
  require "maid/version"
4
+ require "maid/platform"
4
5
 
5
6
  Gem::Specification.new do |s|
6
7
  s.name = "maid"
@@ -14,11 +15,21 @@ Gem::Specification.new do |s|
14
15
 
15
16
  s.rubyforge_project = "maid"
16
17
 
17
- s.add_dependency('thor', '~> 0.14.6')
18
- s.add_development_dependency('rake', '~> 0.8.7')
19
- s.add_development_dependency('rspec', '~> 2.5.0')
20
- s.add_development_dependency('timecop', '~> 0.3.5')
21
- s.add_development_dependency('ZenTest', '~> 4.4.2')
18
+ s.add_dependency('thor', '~> 0.16.0')
19
+ s.add_dependency('deprecated', '~> 3.0.1')
20
+ s.add_dependency('xdg', '~> 2.2.2') # Only used on Linux, but still required/tested on OSX
21
+ s.add_development_dependency('guard', '~> 1.4.0')
22
+ s.add_development_dependency('guard-rspec', '~> 2.1.0')
23
+ s.add_development_dependency('rake', '~> 0.9.2.2')
24
+ s.add_development_dependency('rspec', '~> 2.11.0')
25
+ s.add_development_dependency('timecop', '~> 0.5.2')
26
+ s.add_development_dependency('fakefs', '~> 0.4.0')
27
+
28
+ if Maid::Platform.linux?
29
+ s.add_development_dependency('rb-inotify', '~> 0.8.8')
30
+ elsif Maid::Platform.osx?
31
+ s.add_development_dependency('rb-fsevent', '~> 0.9.2')
32
+ end
22
33
 
23
34
  s.files = `git ls-files`.split("\n")
24
35
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
Binary file
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bash
2
+ # A simple shell-based provisioner for Vagrant.
3
+ #
4
+ # Documentation: [Shell Provisioner](http://vagrantup.com/v1/docs/provisioners/shell.html)
5
+ set -o errexit
6
+
7
+ sudo apt-get update
8
+
9
+ # ## Dependencies
10
+ sudo apt-get install -y ruby1.9.1
11
+
12
+ # ## Development dependencies
13
+ #
14
+ # For building `maid-x.y.z.gem`
15
+ sudo apt-get install -y git-core
16
+ # For building `ffi` for `guard`'s soft dependency on `rb-inotify`
17
+ sudo apt-get install -y make ruby1.9.1-dev libffi-dev
18
+
19
+ # ## RubyGems
20
+ cd /vagrant
21
+ sudo gem install bundler
22
+ bundle install
@@ -26,10 +26,13 @@ module Maid
26
26
  @app.stub!(:maid_options)
27
27
  @app.stub!(:say)
28
28
 
29
+ TrashMigration.stub(:needed?) { false }
30
+
29
31
  # NOTE It's pretty important that this is stubbed, unless you want your rules to be run over and over when you test!
30
32
  @maid = mock('Maid')
31
33
  @maid.stub!(:clean)
32
34
  @maid.stub!(:log_device)
35
+ @maid.stub!(:load_rules)
33
36
  Maid.stub!(:new).and_return(@maid)
34
37
  end
35
38
 
@@ -63,12 +66,6 @@ module Maid
63
66
  end
64
67
  end
65
68
 
66
- describe App, 'sample rules' do
67
- it 'should be able to run' do
68
- lambda { App.start(%w[clean --silent --noop --rules=lib/maid/rules.sample.rb]) }.should_not raise_error(SyntaxError)
69
- end
70
- end
71
-
72
69
  describe App, '#version' do
73
70
  it 'should print out the gem version' do
74
71
  app = App.new
@@ -85,6 +82,7 @@ module Maid
85
82
  it 'should log to STDOUT for testing purposes when given noop' do
86
83
  opts = @app.maid_options('noop' => true)
87
84
  opts[:file_options][:noop].should be_true
85
+ opts[:logger].should be_false
88
86
  opts[:log_device].should == STDOUT
89
87
  opts[:log_formatter].call(nil, nil, nil, 'hello').should == "hello\n"
90
88
  end
@@ -3,8 +3,7 @@ require 'spec_helper'
3
3
  module Maid
4
4
  describe Maid do
5
5
  before :each do
6
- @logger = mock('Logger')
7
- @logger.stub!(:progname=)
6
+ @logger = double('Logger').as_null_object
8
7
  Logger.stub!(:new).and_return(@logger)
9
8
  FileUtils.stub(:mkdir_p)
10
9
  end
@@ -26,16 +25,55 @@ module Maid
26
25
  Maid.new(:log_device => '/home/username/log/maid.log')
27
26
  end
28
27
 
29
- it 'should set the trash to the default path' do
30
- trash_path = Maid::DEFAULTS[:trash_path]
31
- FileUtils.should_receive(:mkdir_p).with(trash_path).once
32
- maid = Maid.new
33
- maid.trash_path.should_not be_nil
34
- maid.trash_path.should == trash_path
28
+ it 'should take a logger object during intialization' do
29
+ Logger.unstub!(:new)
30
+ maid = Maid.new(:logger => @logger)
31
+ maid.logger.should == @logger
32
+ end
33
+
34
+ describe 'platform-specific behavior' do
35
+ before do
36
+ Platform.stub(:linux?)
37
+ Platform.stub(:osx?)
38
+ @home = File.expand_path('~')
39
+ end
40
+
41
+ context 'when running on Linux' do
42
+ before do
43
+ Platform.stub(:linux?) { true }
44
+ XDG.stub(:[]).with('DATA_HOME') { "#{ @home }/.local/share" }
45
+ end
46
+
47
+ it 'should set the trash to the correct default path' do
48
+ trash_path = "#{ @home }/.local/share/Trash/files/"
49
+ FileUtils.should_receive(:mkdir_p).with(trash_path).once
50
+ maid = Maid.new
51
+ maid.trash_path.should == trash_path
52
+ end
53
+ end
54
+
55
+ context 'when running on OS X' do
56
+ before do
57
+ Platform.stub(:osx?) { true }
58
+ end
59
+
60
+ it 'should set the trash to the correct default path' do
61
+ trash_path = "#{ @home }/.Trash/"
62
+ FileUtils.should_receive(:mkdir_p).with(trash_path).once
63
+ maid = Maid.new
64
+ maid.trash_path.should == trash_path
65
+ end
66
+ end
67
+
68
+ context 'when running on an unsupported platform' do
69
+ it 'does not implement trashing files' do
70
+ lambda { Maid.new }.should raise_error(NotImplementedError)
71
+ end
72
+ end
35
73
  end
36
74
 
37
75
  it 'should set the trash to the given path, if provided' do
38
- trash_path = '/home/username/.local/share/Trash/files/'
76
+ trash_path = '/home/username/tmp/my_trash/'
39
77
  FileUtils.should_receive(:mkdir_p).with(trash_path).once
40
78
  maid = Maid.new(:trash_path => trash_path)
41
79
  maid.trash_path.should_not be_nil
@@ -79,7 +117,6 @@ module Maid
79
117
  describe '#clean' do
80
118
  before :each do
81
119
  @maid = Maid.new
82
- @maid.stub!(:add_rules)
83
120
  @logger.stub!(:info)
84
121
  end
85
122
 
@@ -89,19 +126,13 @@ module Maid
89
126
  @maid.clean
90
127
  end
91
128
 
92
- it 'should process the default rules' do
93
- @maid.should_receive(:add_rules).with(Maid::DEFAULTS[:rules_path])
94
- @maid.clean
95
- end
96
-
97
- it 'should follow the given rules, if provided' do
98
- @maid.should_receive(:add_rules)
129
+ it 'should follow the given rules' do
99
130
  @maid.should_receive(:follow_rules)
100
131
  @maid.clean
101
132
  end
102
133
  end
103
134
 
104
- describe '#add_rules' do
135
+ describe '#load_rules' do
105
136
  before :each do
106
137
  Kernel.stub!(:load)
107
138
  @maid = Maid.new
@@ -109,19 +140,13 @@ module Maid
109
140
 
110
141
  it 'should set the Maid instance' do
111
142
  ::Maid.should_receive(:with_instance).with(@maid)
112
- @maid.add_rules('path')
113
- end
114
-
115
- it 'should load the path' do
116
- path = 'rules.rb'
117
- Kernel.should_receive(:load).with(path)
118
- @maid.add_rules(path)
143
+ @maid.load_rules
119
144
  end
120
145
 
121
146
  it 'should give an error on STDERR if there is a LoadError' do
122
147
  Kernel.stub!(:load).and_raise(LoadError)
123
148
  STDERR.should_receive(:puts)
124
- @maid.add_rules('path')
149
+ @maid.load_rules
125
150
  end
126
151
  end
127
152
 
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Maid::NumericExtensions, '#since?' do
3
+ describe Maid::NumericExtensions::Time, '#since?' do
4
4
  it 'should tell you that 1 week ago happened after 2 weeks ago' do
5
5
  (1.week.since? 2.weeks.ago).should be_true
6
6
  end
@@ -9,3 +9,17 @@ describe Maid::NumericExtensions, '#since?' do
9
9
  (2.week.since? 1.weeks.ago).should be_false
10
10
  end
11
11
  end
12
+
13
+ describe Maid::NumericExtensions::SizeToKb do
14
+ it 'should tell you that 1 megabyte equals 1024 kilobytes' do
15
+ (1.megabyte == 1024.kilobytes).should be_true
16
+ end
17
+
18
+ it 'should tell you that 1 gigabyte equals 1024 megabytes' do
19
+ (1.gigabyte == 1024.megabytes).should be_true
20
+ end
21
+
22
+ it 'should tell you that 1 terabyte equals 1024 gigabytes' do
23
+ (1.terabyte == 1024.gigabytes).should be_true
24
+ end
25
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module Maid
4
+ describe Platform do
5
+ def stub_host_os(value)
6
+ RbConfig::CONFIG.stub(:[]).with('host_os') { value }
7
+ end
8
+
9
+ describe 'determining the host OS' do
10
+ it 'delegates to RbConfig' do
11
+ stub_host_os('foo')
12
+ subject.host_os.should == 'foo'
13
+ end
14
+ end
15
+
16
+ context 'when running on Ubuntu' do
17
+ before do
18
+ stub_host_os('linux-gnu')
19
+ end
20
+
21
+ it 'is identified as Linux' do
22
+ subject.linux?.should be_true
23
+ end
24
+
25
+ it 'is not identified as OS X' do
26
+ subject.osx?.should be_false
27
+ end
28
+ end
29
+
30
+ context 'when running on Mac OS X' do
31
+ before do
32
+ stub_host_os('darwin10.0')
33
+ end
34
+
35
+ it 'is not identified as Linux' do
36
+ subject.linux?.should be_false
37
+ end
38
+
39
+ it 'is identified as OS X' do
40
+ subject.osx?.should be_true
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,75 +1,192 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Maid
4
- describe Tools do
4
+ # NOTE: Please use FakeFS instead of mocking and stubbing specific calls which happen to modify the filesystem.
5
+ #
6
+ # More info:
7
+ #
8
+ # * [FakeFS](https://github.com/defunkt/fakefs)
9
+ describe Tools, :fakefs => true do
5
10
  before :each do
6
11
  @home = File.expand_path('~')
7
- FileUtils.stub!(:mv)
12
+ @now = Time.now
8
13
 
9
14
  Maid.ancestors.should include(Tools)
10
- @maid = Maid.new
11
- @logger = @maid.instance_eval { @logger }
15
+
16
+ @logger = double('Logger').as_null_object
17
+ @maid = Maid.new(:logger => @logger)
18
+
19
+ # Prevent warnings from showing when testing deprecated methods:
20
+ @maid.stub(:__deprecated_run_action__)
21
+
22
+ # For safety, stub `cmd` to prevent running commands:
23
+ @maid.stub(:cmd)
12
24
  end
13
25
 
14
26
  describe '#move' do
15
27
  before :each do
16
- @from = '~/Downloads/foo.zip'
17
- @to = '~/Reference/'
18
- @options = @maid.file_options
28
+ @src_file = (@src_dir = '~/Source/') + (@file_name = 'foo.zip')
29
+ FileUtils.mkdir_p(@src_dir)
30
+ FileUtils.touch(@src_file)
31
+ FileUtils.mkdir_p(@dst_dir = '~/Destination/')
19
32
  end
20
33
 
21
34
  it 'should move expanded paths, passing file_options' do
22
- FileUtils.should_receive(:mv).with("#{@home}/Downloads/foo.zip", "#{@home}/Reference", @options)
23
- @maid.move('~/Downloads/foo.zip', '~/Reference/')
35
+ @maid.move(@src_file, @dst_dir)
36
+ File.exists?(@dst_dir + @file_name).should be_true
24
37
  end
25
38
 
26
39
  it 'should log the move' do
27
40
  @logger.should_receive(:info)
28
- @maid.move(@from, @to)
41
+ @maid.move(@src_file, @dst_dir)
29
42
  end
30
43
 
31
44
  it 'should not move if the target already exists' do
32
- File.stub!(:exist?).and_return(true)
33
- FileUtils.should_not_receive(:mv)
45
+ FileUtils.touch(@dst_dir + @file_name)
34
46
  @logger.should_receive(:warn)
35
47
 
36
- @maid.move(@from, @to)
48
+ @maid.move(@src_file, @dst_dir)
49
+ end
50
+
51
+ it 'should handle multiple from paths' do
52
+ second_src_file = @src_dir + (second_file_name = 'bar.zip')
53
+ FileUtils.touch(second_src_file)
54
+ src_files = [@src_file, second_src_file]
55
+
56
+ @maid.move(src_files, @dst_dir)
57
+ File.exist?(@dst_dir + @file_name).should be_true
58
+ File.exist?(@dst_dir + second_file_name).should be_true
37
59
  end
38
60
  end
39
61
 
40
62
  describe '#trash' do
41
63
  before :each do
42
64
  @trash_path = @maid.trash_path
43
- @path = '~/Downloads/foo.zip'
65
+ @src_file = (@src_dir = '~/Source/') + (@file_name = 'foo.zip')
66
+ FileUtils.mkdir_p(@src_dir)
67
+ FileUtils.touch(@src_file)
68
+
69
+ @trash_file = File.join(@trash_path, @file_name)
44
70
  end
45
71
 
46
72
  it 'should move the path to the trash' do
47
- @maid.should_receive(:move).with(@path, @trash_path)
48
- @maid.trash(@path)
73
+ @maid.trash(@src_file)
74
+ File.exist?(@trash_file).should be_true
49
75
  end
50
76
 
51
77
  it 'should use a safe path if the target exists' do
52
78
  # Without an offset, ISO8601 parses to local time, which is what we want here.
53
79
  Timecop.freeze(Time.parse('2011-05-22T16:53:52')) do
54
- File.stub!(:exist?).and_return(true)
55
- @maid.should_receive(:move).with(@path, "#{@trash_path}/foo.zip 2011-05-22-16-53-52")
56
- @maid.trash(@path)
80
+ FileUtils.touch(@trash_file)
81
+ @maid.trash(@src_file)
82
+ new_trash_file = File.join(@trash_path, @file_name + ' 2011-05-22-16-53-52')
83
+ File.exist?(new_trash_file).should be_true
57
84
  end
58
85
  end
86
+
87
+ it 'should handle multiple paths' do
88
+ second_src_file = @src_dir + (second_file_name = 'bar.zip')
89
+ FileUtils.touch(second_src_file)
90
+ @src_files = [@src_file, second_src_file]
91
+ @maid.trash(@src_files)
92
+
93
+ second_trash_file = File.join(@trash_path, second_file_name)
94
+ File.exist?(@trash_file).should be_true
95
+ File.exist?(second_trash_file).should be_true
96
+ end
97
+
98
+ it 'should remove files greater then the remove option size' do
99
+ @maid.stub!(:disk_usage).and_return(1025)
100
+ @maid.trash(@src_file, :remove_over => 1.mb)
101
+ File.exist?(@src_file).should_not be_true
102
+ File.exist?(@trash_file).should_not be_true
103
+ end
104
+
105
+ it 'should trash files less then the remove option size' do
106
+ @maid.stub!(:disk_usage).and_return(1023)
107
+ @maid.trash(@src_file, :remove_over => 1.mb)
108
+ File.exist?(@trash_file).should be_true
109
+ end
110
+ end
111
+
112
+ describe '#remove' do
113
+ before :each do
114
+ @src_file = (@src_dir = '~/Source/') + (@file_name = 'foo.zip')
115
+ FileUtils.mkdir_p(@src_dir)
116
+ FileUtils.touch(@src_file)
117
+ @src_file_expand_path = File.expand_path(@src_file)
118
+ @options = @maid.file_options
119
+ end
120
+
121
+ it 'should remove expanded paths, passing options' do
122
+ @maid.remove(@src_file)
123
+ File.exist?(@src_file).should be_false
124
+ end
125
+
126
+ it 'should log the remove' do
127
+ @logger.should_receive(:info)
128
+ @maid.remove(@src_file)
129
+ end
130
+
131
+ it 'should set the secure option' do
132
+ @options = @options.merge(:secure => true)
133
+ FileUtils.should_receive(:rm_r).with(@src_file_expand_path, @options)
134
+ @maid.remove(@src_file, :secure => true)
135
+ end
136
+
137
+ it 'should set the force option' do
138
+ @options = @options.merge(:force => true)
139
+ FileUtils.should_receive(:rm_r).with(@src_file_expand_path, @options)
140
+ @maid.remove(@src_file, :force => true)
141
+ end
142
+
143
+ it 'should handle multiple paths' do
144
+ second_src_file = @src_dir + (second_file_name = 'bar.zip')
145
+ FileUtils.touch(second_src_file)
146
+ @src_files = [@src_file, second_src_file]
147
+
148
+ @maid.remove(@src_files)
149
+ File.exist?(@src_file).should be_false
150
+ File.exist?(second_src_file).should be_false
151
+ end
59
152
  end
60
153
 
61
154
  describe '#dir' do
62
- it 'should delegate to Dir#[] with an expanded path' do
63
- Dir.should_receive(:[]).with("#@home/Downloads/*.zip")
64
- @maid.dir('~/Downloads/*.zip')
155
+ before :each do
156
+ @file = (dir = "#@home/Downloads/") + 'foo.zip'
157
+ FileUtils.mkdir_p(dir)
158
+ end
159
+
160
+ it 'lists files in a directory' do
161
+ FileUtils.touch(@file)
162
+ @maid.dir('~/Downloads/*.zip').should == [@file]
163
+ end
164
+ end
165
+
166
+ describe '#mkdir' do
167
+ it 'should create a directory successfully' do
168
+ @maid.mkdir('~/Downloads/Music/Pink.Floyd')
169
+ File.exist?("#@home/Downloads/Music/Pink.Floyd").should be_true
65
170
  end
66
171
  end
67
172
 
68
173
  describe '#find' do
174
+ before :each do
175
+ @file = (@dir = '~/Source/') + (@file_name = 'foo.zip')
176
+ FileUtils.mkdir_p(@dir)
177
+ FileUtils.touch(@file)
178
+ @dir_expand_path = File.expand_path(@dir)
179
+ @file_expand_path = File.expand_path(@file)
180
+ end
181
+
69
182
  it 'should delegate to Find.find with an expanded path' do
70
183
  f = lambda { }
71
- Find.should_receive(:find).with("#@home/Downloads/foo.zip", &f)
72
- @maid.find('~/Downloads/foo.zip', &f)
184
+ Find.should_receive(:find).with(@file_expand_path, &f)
185
+ @maid.find(@file, &f)
186
+ end
187
+
188
+ it "should return an array of all the files' names when no block is given" do
189
+ @maid.find(@dir).should == [@dir_expand_path, @file_expand_path]
73
190
  end
74
191
  end
75
192
 
@@ -82,7 +199,7 @@ module Maid
82
199
 
83
200
  describe '#downloaded_from' do
84
201
  it 'should determine the download site' do
85
- @maid.should_receive(:cmd).and_return(%Q{(\n "http://www.site.com/foo.zip",\n"http://www.site.com/"\n)})
202
+ @maid.should_receive(:cmd).and_return(%((\n "http://www.site.com/foo.zip",\n"http://www.site.com/"\n)))
86
203
  @maid.downloaded_from('foo.zip').should == ['http://www.site.com/foo.zip', 'http://www.site.com/']
87
204
  end
88
205
  end
@@ -103,25 +220,110 @@ module Maid
103
220
 
104
221
  describe '#disk_usage' do
105
222
  it 'should give the disk usage of a file' do
106
- @maid.should_receive(:cmd).and_return("136 foo.zip")
223
+ @maid.should_receive(:cmd).and_return('136 foo.zip')
107
224
  @maid.disk_usage('foo.zip').should == 136
108
225
  end
226
+
227
+ context 'when the file does not exist' do
228
+ it 'raises an error' do
229
+ @maid.should_receive(:cmd).and_return('du: cannot access `foo.zip\': No such file or directory')
230
+ lambda { @maid.disk_usage('foo.zip') }.should raise_error(RuntimeError)
231
+ end
232
+ end
233
+ end
234
+
235
+ describe '#created_at' do
236
+ before do
237
+ @path = "~/test.txt"
238
+ end
239
+
240
+ it 'should give the created time of the file' do
241
+ Timecop.freeze(@now) do
242
+ FileUtils.touch(File.expand_path(@path))
243
+ @maid.created_at(@path).should == Time.now
244
+ end
245
+ end
109
246
  end
110
247
 
111
- describe '#last_accessed' do
248
+ describe '#accessed_at' do
249
+ # FakeFS does not implement atime.
112
250
  it 'should give the last accessed time of the file' do
113
- time = Time.now
114
- File.should_receive(:atime).with("#@home/foo.zip").and_return(time)
115
- @maid.last_accessed('~/foo.zip').should == time
251
+ File.should_receive(:atime).with("#@home/foo.zip").and_return(@now)
252
+ @maid.accessed_at('~/foo.zip').should == @now
253
+ end
254
+
255
+ it 'should trigger deprecation warning when last_accessed is used, but still run' do
256
+ File.should_receive(:atime).with("#@home/foo.zip").and_return(@now)
257
+ @maid.should have_deprecated_method(:last_accessed)
258
+ @maid.last_accessed('~/foo.zip').should == @now
259
+ end
260
+ end
261
+
262
+ describe '#modified_at' do
263
+ before do
264
+ @path = "~/test.txt"
265
+ FileUtils.touch(File.expand_path(@path))
266
+ end
267
+
268
+ it 'should give the modified time of the file' do
269
+ Timecop.freeze(@now) do
270
+ File.open(@path, 'w') { |f| f.write('Test') }
271
+ end
272
+
273
+ # use to_i to ignore milliseconds during test
274
+ @maid.modified_at(@path).to_i.should == @now.to_i
116
275
  end
117
276
  end
118
277
 
119
278
  describe '#git_piston' do
279
+ it 'is deprecated' do
280
+ @maid.should have_deprecated_method(:git_piston)
281
+ @maid.git_piston('~/code/projectname')
282
+ end
283
+
120
284
  it 'should pull and push the given git repository, logging the action' do
121
- @maid.should_receive(:cmd).with(%Q{cd "#@home/code/projectname" && git pull && git push 2>&1})
285
+ @maid.should_receive(:cmd).with(%(cd "#@home/code/projectname" && git pull && git push 2>&1))
122
286
  @logger.should_receive(:info)
123
287
  @maid.git_piston('~/code/projectname')
124
288
  end
125
289
  end
290
+
291
+ describe '#sync' do
292
+ before :each do
293
+ @src_dir = '~/Downloads/'
294
+ @dst_dir = '~/Reference'
295
+ end
296
+
297
+ it 'should sync the expanded paths, retaining backslash' do
298
+ @maid.should_receive(:cmd).with(%(rsync -a -u "#@home/Downloads/" "#@home/Reference" 2>&1))
299
+ @maid.sync(@src_dir, @dst_dir)
300
+ end
301
+
302
+ it 'should log the action' do
303
+ @logger.should_receive(:info)
304
+ @maid.sync(@src_dir, @dst_dir)
305
+ end
306
+
307
+ it 'should have no options' do
308
+ @maid.should_receive(:cmd).with(%(rsync "#@home/Downloads/" "#@home/Reference" 2>&1))
309
+ @maid.sync(@src_dir, @dst_dir, :archive => false, :update => false)
310
+ end
311
+
312
+ it 'should add all options' do
313
+ @maid.should_receive(:cmd).with(%(rsync -a -v -u -m --exclude=".git" --delete "#@home/Downloads/" "#@home/Reference" 2>&1))
314
+ @maid.sync(@src_dir, @dst_dir, :archive => true, :update => true, :delete => true, :verbose => true, :prune_empty => true, :exclude => '.git')
315
+ end
316
+
317
+ it 'should add multiple exlcude options' do
318
+ @maid.should_receive(:cmd).with(%(rsync -a -u --exclude=".git" --exclude=".rvmrc" "#@home/Downloads/" "#@home/Reference" 2>&1))
319
+ @maid.sync(@src_dir, @dst_dir, :exclude => ['.git', '.rvmrc'])
320
+ end
321
+
322
+ it 'should add noop option' do
323
+ @maid.file_options[:noop] = true
324
+ @maid.should_receive(:cmd).with(%(rsync -a -u -n "#@home/Downloads/" "#@home/Reference" 2>&1))
325
+ @maid.sync(@src_dir, @dst_dir)
326
+ end
327
+ end
126
328
  end
127
329
  end