maid 0.1.0.beta1
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 +20 -0
- data/.rspec +0 -0
- data/Gemfile +4 -0
- data/LICENSE +339 -0
- data/README.rdoc +215 -0
- data/Rakefile +16 -0
- data/bin/maid +5 -0
- data/lib/maid.rb +31 -0
- data/lib/maid/app.rb +40 -0
- data/lib/maid/maid.rb +67 -0
- data/lib/maid/numeric_extensions.rb +76 -0
- data/lib/maid/rule.rb +6 -0
- data/lib/maid/tools.rb +119 -0
- data/lib/maid/version.rb +3 -0
- data/maid.gemspec +26 -0
- data/spec/lib/maid/app_spec.rb +54 -0
- data/spec/lib/maid/maid_spec.rb +151 -0
- data/spec/lib/maid/rule_spec.rb +10 -0
- data/spec/lib/maid/tools_spec.rb +118 -0
- data/spec/lib/maid_spec.rb +26 -0
- data/spec/spec_helper.rb +9 -0
- metadata +160 -0
@@ -0,0 +1,151 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Maid
|
4
|
+
describe Maid do
|
5
|
+
before :each do
|
6
|
+
@logger = mock('Logger')
|
7
|
+
@logger.stub!(:progname=)
|
8
|
+
Logger.stub!(:new).and_return(@logger)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.new' do
|
12
|
+
it 'should set up a logger with the default path' do
|
13
|
+
Logger.should_receive(:new).with(Maid::DEFAULTS[:log_path])
|
14
|
+
Maid.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should set up a logger with the given path, if provided' do
|
18
|
+
log_path = '/var/log/maid.log'
|
19
|
+
Logger.should_receive(:new).with(log_path)
|
20
|
+
Maid.new(:log_path => log_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should make the log directory in case it does not exist' do
|
24
|
+
FileUtils.should_receive(:mkdir_p).with('/home/username/log')
|
25
|
+
Maid.new(:log_path => '/home/username/log/maid.log')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should set the trash to the default path' do
|
29
|
+
maid = Maid.new
|
30
|
+
maid.trash_path.should_not be_nil
|
31
|
+
maid.trash_path.should == Maid::DEFAULTS[:trash_path]
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should set the trash to the given path, if provided' do
|
35
|
+
trash_path = '/home/username/.local/share/Trash/files/'
|
36
|
+
maid = Maid.new(:trash_path => trash_path)
|
37
|
+
maid.trash_path.should_not be_nil
|
38
|
+
maid.trash_path.should == trash_path
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should set the progname for the logger' do
|
42
|
+
@logger.should_receive(:progname=).with(Maid::DEFAULTS[:progname])
|
43
|
+
Maid.new
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should set the progname for the logger to the given name, if provided' do
|
47
|
+
@logger.should_receive(:progname=).with('Fran')
|
48
|
+
Maid.new(:progname => 'Fran')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should set the file options to the defaults' do
|
52
|
+
Maid.new.file_options.should == Maid::DEFAULTS[:file_options]
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should set the file options to the given options, if provided' do
|
56
|
+
maid = Maid.new(:file_options => {:verbose => true})
|
57
|
+
maid.file_options.should == {:verbose => true}
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should set the rules path' do
|
61
|
+
Maid.new.rules_path.should == Maid::DEFAULTS[:rules_path]
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should set the ruels pathto the given path, if provided' do
|
65
|
+
maid = Maid.new(:rules_path => 'Maidfile')
|
66
|
+
maid.rules_path.should == 'Maidfile'
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should ignore nil options' do
|
70
|
+
maid = Maid.new(:rules_path => nil)
|
71
|
+
maid.rules_path.should == Maid::DEFAULTS[:rules_path]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#clean' do
|
76
|
+
before :each do
|
77
|
+
@maid = Maid.new
|
78
|
+
@maid.stub!(:add_rules)
|
79
|
+
@logger.stub!(:info)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should log start and finish' do
|
83
|
+
@logger.should_receive(:info).with('Started')
|
84
|
+
@logger.should_receive(:info).with('Finished')
|
85
|
+
@maid.clean
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should process the default rules' do
|
89
|
+
@maid.should_receive(:add_rules).with(Maid::DEFAULTS[:rules_path])
|
90
|
+
@maid.clean
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should follow the given rules, if provided' do
|
94
|
+
@maid.should_receive(:add_rules)
|
95
|
+
@maid.should_receive(:follow_rules)
|
96
|
+
@maid.clean
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#add_rules' do
|
101
|
+
before :each do
|
102
|
+
Kernel.stub!(:require)
|
103
|
+
@maid = Maid.new
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should set the Maid instance' do
|
107
|
+
::Maid.should_receive(:with_instance).with(@maid)
|
108
|
+
@maid.add_rules('path')
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should require the path' do
|
112
|
+
path = 'rules.rb'
|
113
|
+
Kernel.should_receive(:require).with(path)
|
114
|
+
@maid.add_rules(path)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#rule' do
|
119
|
+
before :each do
|
120
|
+
@maid = Maid.new
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should add a rule to the list of rules' do
|
124
|
+
@maid.rules.length.should == 0
|
125
|
+
|
126
|
+
@maid.rule 'description' do
|
127
|
+
'instructions'
|
128
|
+
end
|
129
|
+
|
130
|
+
@maid.rules.length.should == 1
|
131
|
+
@maid.rules.first.description.should == 'description'
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe '#follow_rules' do
|
136
|
+
it 'should follow each rule' do
|
137
|
+
n = 3
|
138
|
+
maid = Maid.new
|
139
|
+
@logger.should_receive(:info).exactly(n).times
|
140
|
+
rules = (1..n).map do |n|
|
141
|
+
mock = mock("rule ##{n}", :description => 'description')
|
142
|
+
mock.should_receive(:follow)
|
143
|
+
mock
|
144
|
+
end
|
145
|
+
maid.instance_eval { @rules = rules }
|
146
|
+
|
147
|
+
maid.follow_rules
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Maid
|
4
|
+
describe Tools do
|
5
|
+
before :each do
|
6
|
+
@home = File.expand_path('~')
|
7
|
+
FileUtils.stub!(:mv)
|
8
|
+
|
9
|
+
Maid.ancestors.should include(Tools)
|
10
|
+
@maid = Maid.new
|
11
|
+
@logger = @maid.instance_eval { @logger }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#move' do
|
15
|
+
before :each do
|
16
|
+
@from = '~/Downloads/foo.zip'
|
17
|
+
@to = '~/Reference/'
|
18
|
+
@options = @maid.file_options
|
19
|
+
end
|
20
|
+
|
21
|
+
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/')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should log the move' do
|
27
|
+
@logger.should_receive(:info)
|
28
|
+
@maid.move(@from, @to)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should not move if the target already exists' do
|
32
|
+
File.stub!(:exist?).and_return(true)
|
33
|
+
FileUtils.should_not_receive(:mv)
|
34
|
+
@logger.should_receive(:warn)
|
35
|
+
|
36
|
+
@maid.move(@from, @to)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#trash' do
|
41
|
+
before :each do
|
42
|
+
@trash_path = @maid.trash_path
|
43
|
+
@path = '~/Downloads/foo.zip'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should move the path to the trash' do
|
47
|
+
@maid.should_receive(:move).with(@path, @trash_path)
|
48
|
+
@maid.trash(@path)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should use a safe path if the target exists' do
|
52
|
+
Timecop.freeze(Time.parse('2011-05-22T16:53:52-04:00')) do
|
53
|
+
File.stub!(:exist?).and_return(true)
|
54
|
+
@maid.should_receive(:move).with(@path, "#{@trash_path}/foo.zip 2011-05-22-16-53-52")
|
55
|
+
@maid.trash(@path)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#dir' do
|
61
|
+
it 'should delegate to Dir#[] with an expanded path' do
|
62
|
+
Dir.should_receive(:[]).with("#@home/Downloads/*.zip")
|
63
|
+
@maid.dir('~/Downloads/*.zip')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#find' do
|
68
|
+
it 'should delegate to Find.find with an expanded path' do
|
69
|
+
f = lambda { }
|
70
|
+
Find.should_receive(:find).with("#@home/Downloads/foo.zip", &f)
|
71
|
+
@maid.find('~/Downloads/foo.zip', &f)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#downloaded_from' do
|
76
|
+
it 'should use Spotlight metadata to determine the download site' do
|
77
|
+
@maid.should_receive(:cmd).and_return(%Q{(\n "http://www.site.com/foo.zip",\n"http://www.site.com/"\n)})
|
78
|
+
@maid.downloaded_from('foo.zip').should == ['http://www.site.com/foo.zip', 'http://www.site.com/']
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#duration_s' do
|
83
|
+
it 'should use Spotlight metadata to determine audio length' do
|
84
|
+
@maid.should_receive(:cmd).and_return('235.705')
|
85
|
+
@maid.duration_s('foo.mp3').should == 235.705
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#locate' do
|
90
|
+
it 'should use Spotlight to locate a file by name' do
|
91
|
+
@maid.should_receive(:cmd).and_return("/a/foo.zip\n/b/foo.zip\n")
|
92
|
+
@maid.locate('foo.zip').should == ['/a/foo.zip', '/b/foo.zip']
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#zipfile_contents' do
|
97
|
+
it 'should use unzip to inspect the contents of a .zip file' do
|
98
|
+
@maid.should_receive(:cmd).and_return("foo/foo.exe\nfoo/README.txt\n")
|
99
|
+
@maid.zipfile_contents('foo.zip').should == ['foo/foo.exe', 'foo/README.txt']
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '#disk_usage' do
|
104
|
+
it 'should use du to find the disk usage of a file' do
|
105
|
+
@maid.should_receive(:cmd).and_return("136 foo.zip")
|
106
|
+
@maid.disk_usage('foo.zip').should == 136
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#git_piston' do
|
111
|
+
it 'should pull and push the given git repository, logging the action' do
|
112
|
+
@maid.should_receive(:cmd).with(%Q{cd "#@home/code/projectname" && git pull && git push 2>&1})
|
113
|
+
@logger.should_receive(:info)
|
114
|
+
@maid.git_piston('~/code/projectname')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Maid do
|
4
|
+
it 'should include Maid::NumericExtensions' do
|
5
|
+
1.minute.should == 60
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Maid, '.with_instance' do
|
10
|
+
it 'should temporarily set the instance to the given argument and execute the block' do
|
11
|
+
instance = mock('instance')
|
12
|
+
Maid.with_instance(instance) { 0 }.should == 0
|
13
|
+
Maid.instance_eval { @instance }.should be_nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe Maid, '.rules' do
|
18
|
+
it 'should run in the context of the Maid::Maid instance' do
|
19
|
+
instance = mock('instance')
|
20
|
+
instance.should_receive(:foo)
|
21
|
+
|
22
|
+
Maid.with_instance(instance) do
|
23
|
+
Maid.rules { foo }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: maid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 62196401
|
5
|
+
prerelease: 6
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
- beta
|
11
|
+
- 1
|
12
|
+
version: 0.1.0.beta1
|
13
|
+
platform: ruby
|
14
|
+
authors:
|
15
|
+
- Benjamin Oakes
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2011-05-24 00:00:00 -04:00
|
21
|
+
default_executable:
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
24
|
+
name: thor
|
25
|
+
prerelease: false
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 43
|
32
|
+
segments:
|
33
|
+
- 0
|
34
|
+
- 14
|
35
|
+
- 6
|
36
|
+
version: 0.14.6
|
37
|
+
type: :runtime
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: rspec
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 27
|
48
|
+
segments:
|
49
|
+
- 2
|
50
|
+
- 5
|
51
|
+
- 0
|
52
|
+
version: 2.5.0
|
53
|
+
type: :development
|
54
|
+
version_requirements: *id002
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: timecop
|
57
|
+
prerelease: false
|
58
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 25
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
- 3
|
67
|
+
- 5
|
68
|
+
version: 0.3.5
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id003
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: ZenTest
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ~>
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 43
|
80
|
+
segments:
|
81
|
+
- 4
|
82
|
+
- 4
|
83
|
+
- 2
|
84
|
+
version: 4.4.2
|
85
|
+
type: :development
|
86
|
+
version_requirements: *id004
|
87
|
+
description: Maid cleans up after you, based on rules you define.
|
88
|
+
email:
|
89
|
+
- hello@benjaminoakes.com
|
90
|
+
executables:
|
91
|
+
- maid
|
92
|
+
extensions: []
|
93
|
+
|
94
|
+
extra_rdoc_files: []
|
95
|
+
|
96
|
+
files:
|
97
|
+
- .gitignore
|
98
|
+
- .rspec
|
99
|
+
- Gemfile
|
100
|
+
- LICENSE
|
101
|
+
- README.rdoc
|
102
|
+
- Rakefile
|
103
|
+
- bin/maid
|
104
|
+
- lib/maid.rb
|
105
|
+
- lib/maid/app.rb
|
106
|
+
- lib/maid/maid.rb
|
107
|
+
- lib/maid/numeric_extensions.rb
|
108
|
+
- lib/maid/rule.rb
|
109
|
+
- lib/maid/tools.rb
|
110
|
+
- lib/maid/version.rb
|
111
|
+
- maid.gemspec
|
112
|
+
- spec/lib/maid/app_spec.rb
|
113
|
+
- spec/lib/maid/maid_spec.rb
|
114
|
+
- spec/lib/maid/rule_spec.rb
|
115
|
+
- spec/lib/maid/tools_spec.rb
|
116
|
+
- spec/lib/maid_spec.rb
|
117
|
+
- spec/spec_helper.rb
|
118
|
+
has_rdoc: true
|
119
|
+
homepage: http://www.benjaminoakes.com/
|
120
|
+
licenses: []
|
121
|
+
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
hash: 3
|
133
|
+
segments:
|
134
|
+
- 0
|
135
|
+
version: "0"
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ">"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
hash: 25
|
142
|
+
segments:
|
143
|
+
- 1
|
144
|
+
- 3
|
145
|
+
- 1
|
146
|
+
version: 1.3.1
|
147
|
+
requirements: []
|
148
|
+
|
149
|
+
rubyforge_project: maid
|
150
|
+
rubygems_version: 1.6.2
|
151
|
+
signing_key:
|
152
|
+
specification_version: 3
|
153
|
+
summary: Maid cleans up after you, based on rules you define.
|
154
|
+
test_files:
|
155
|
+
- spec/lib/maid/app_spec.rb
|
156
|
+
- spec/lib/maid/maid_spec.rb
|
157
|
+
- spec/lib/maid/rule_spec.rb
|
158
|
+
- spec/lib/maid/tools_spec.rb
|
159
|
+
- spec/lib/maid_spec.rb
|
160
|
+
- spec/spec_helper.rb
|