maid 0.5.0 → 0.6.0.alpha.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/.ruby-version +1 -1
- data/.travis.yml +6 -1
- data/AUTHORS.md +2 -0
- data/ChangeLog +10 -0
- data/README.md +25 -1
- data/Rakefile +10 -0
- data/lib/maid/rake/single_rule.rb +34 -0
- data/lib/maid/rake/task.rb +38 -0
- data/lib/maid/tools.rb +35 -16
- data/lib/maid/version.rb +1 -1
- data/lib/maid.rb +2 -0
- data/maid.gemspec +4 -4
- data/script/vagrant-provision +14 -3
- data/spec/dependency_spec.rb +10 -10
- data/spec/lib/maid/app_spec.rb +32 -32
- data/spec/lib/maid/maid_spec.rb +56 -56
- data/spec/lib/maid/numeric_extensions_spec.rb +10 -10
- data/spec/lib/maid/platform_spec.rb +7 -7
- data/spec/lib/maid/rake/single_rule_spec.rb +93 -0
- data/spec/lib/maid/rake/task_spec.rb +51 -0
- data/spec/lib/maid/rule_spec.rb +2 -2
- data/spec/lib/maid/tools_spec.rb +134 -131
- data/spec/lib/maid/trash_migration_spec.rb +9 -9
- data/spec/lib/maid/user_agent_spec.rb +1 -1
- data/spec/lib/maid_spec.rb +10 -9
- data/spec/spec_helper.rb +4 -4
- metadata +158 -62
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.1.2
|
data/.travis.yml
CHANGED
data/AUTHORS.md
CHANGED
@@ -3,6 +3,7 @@ In alphabetical order:
|
|
3
3
|
* Benjamin Oakes (@benjaminoakes)
|
4
4
|
* Bradley Smith (@bradleyd)
|
5
5
|
* Graham Siener (@gsiener)
|
6
|
+
* Jayson Rhynas (@jayrhynas)
|
6
7
|
* John Colvin (@JohnColvin)
|
7
8
|
* Justin Hileman (@bobthecow)
|
8
9
|
* Larry Lv (@larrylv)
|
@@ -11,5 +12,6 @@ In alphabetical order:
|
|
11
12
|
* Mark Jaquith (@markjaquith)
|
12
13
|
* Mikael Hultgren (@blomma)
|
13
14
|
* Mu Ye (@yemutex)
|
15
|
+
* Pedro Lambert (@p-lambert)
|
14
16
|
* Shiro Hazuki (@HazukiShiro)
|
15
17
|
* Vladimir Agafonkin (@mourner)
|
data/ChangeLog
CHANGED
@@ -1,5 +1,15 @@
|
|
1
|
+
maid (0.6.0) unstable; urgency=low
|
2
|
+
|
3
|
+
* Jayson Rhynas: Add Safari download detection to "downloading?" (Closes: #121)
|
4
|
+
* Pedro Lambert: Add support for Rake tasks defined by Maid (Closes: #68, #123)
|
5
|
+
|
6
|
+
-- Benjamin Oakes <hello@benjaminoakes.com> TODO
|
7
|
+
|
1
8
|
maid (0.5.0) stable; urgency=low
|
2
9
|
|
10
|
+
* Stats! { 'collaborators' => 13, 'downloads' => 9570, 'forks' => 38,
|
11
|
+
'open_issues' => 28, 'closed_issues' => 86, 'stars' => 722,
|
12
|
+
'users_sharing_rules' => 25 }
|
3
13
|
* Started official support Ruby 2.1.0 (Closes: #114)
|
4
14
|
* Shiro Hazuki (public domain code): New utility methods: "dir_safe",
|
5
15
|
"downloading?" (Closes: #107)
|
data/README.md
CHANGED
@@ -85,7 +85,7 @@ Modern Ruby versions and Unix-like operating systems should work, but only OS X
|
|
85
85
|
Offically supported:
|
86
86
|
|
87
87
|
* **OS:** Mac OS X, Ubuntu
|
88
|
-
* **Ruby:** 1.9.3+ (2.0.0 or 2.1.
|
88
|
+
* **Ruby:** 1.9.3+ (2.0.0, 2.1.0, or 2.1.1 are preferred)
|
89
89
|
|
90
90
|
Some features require OS X. See the [documentation][] for more details.
|
91
91
|
|
@@ -210,6 +210,30 @@ Example for every day at 1am:
|
|
210
210
|
# minute hour day_of_month month day_of_week command_to_execute
|
211
211
|
0 1 * * * /bin/bash -li -c "maid clean --force --silent"
|
212
212
|
|
213
|
+
### Rake Tasks
|
214
|
+
|
215
|
+
Maid includes helpers that make file managment easier. You may find them useful if you need to automate tasks in your Ruby projects. This is available via support for Maid-based Rake tasks:
|
216
|
+
|
217
|
+
```ruby
|
218
|
+
# File: Rakefile
|
219
|
+
require 'maid'
|
220
|
+
|
221
|
+
Maid::Rake::Task.new :clean do
|
222
|
+
# Clean up Rubinius-compilied Ruby
|
223
|
+
trash(dir('**/*.rbc'))
|
224
|
+
end
|
225
|
+
```
|
226
|
+
|
227
|
+
In fact, the Maid project uses Maid in [its Rakefile](https://github.com/benjaminoakes/maid/blob/master/Rakefile).
|
228
|
+
|
229
|
+
You can also provide a custom description:
|
230
|
+
|
231
|
+
```ruby
|
232
|
+
Maid::Rake::Task.new clean_torrents: [:dependency], description: 'Clean Torrents' do
|
233
|
+
trash(dir('~/Downloads/*.torrent'))
|
234
|
+
end
|
235
|
+
```
|
236
|
+
|
213
237
|
## Warranty
|
214
238
|
|
215
239
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'bundler'
|
2
|
+
require 'maid'
|
2
3
|
require 'rake'
|
3
4
|
require 'rspec/core/rake_task'
|
4
5
|
require 'yard'
|
@@ -12,3 +13,12 @@ YARD::Rake::YardocTask.new
|
|
12
13
|
task :console do
|
13
14
|
sh('irb -I lib -r maid')
|
14
15
|
end
|
16
|
+
|
17
|
+
Maid::Rake::Task.new :clean do
|
18
|
+
# Clean up Rubinius-compilied Ruby
|
19
|
+
trash(dir('**/*.rbc'))
|
20
|
+
|
21
|
+
# Get rid of old rubygems packages
|
22
|
+
trash('pkg')
|
23
|
+
mkdir('pkg')
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Maid
|
2
|
+
module Rake
|
3
|
+
class SingleRule
|
4
|
+
attr_writer :maid_instance
|
5
|
+
attr_reader :name, :task
|
6
|
+
|
7
|
+
def initialize(name, task)
|
8
|
+
@name = name
|
9
|
+
@task = task
|
10
|
+
end
|
11
|
+
|
12
|
+
def clean
|
13
|
+
maid_instance.clean
|
14
|
+
end
|
15
|
+
|
16
|
+
def maid_instance
|
17
|
+
@maid_instance ||= ::Maid::Maid.new(rules_path: '/dev/null')
|
18
|
+
end
|
19
|
+
|
20
|
+
def define
|
21
|
+
maid_instance.rule name do
|
22
|
+
maid_instance.instance_eval(&task)
|
23
|
+
end
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def perform(name, task)
|
29
|
+
new(name, task).define.clean
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
module Maid
|
5
|
+
module Rake
|
6
|
+
class Task < ::Rake::TaskLib
|
7
|
+
DEFAULT_DESCRIPTION = 'Maid Task'
|
8
|
+
|
9
|
+
def initialize(*args, &task)
|
10
|
+
@args = args
|
11
|
+
@task_proc = task
|
12
|
+
define
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :task_proc
|
18
|
+
|
19
|
+
def args
|
20
|
+
@args.reject(&:empty?)
|
21
|
+
end
|
22
|
+
|
23
|
+
def task_description
|
24
|
+
@task_description ||= begin
|
25
|
+
opts = args.detect { |arg| arg.is_a?(Hash) }
|
26
|
+
(opts && opts.delete(:description)) || DEFAULT_DESCRIPTION
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def define
|
31
|
+
desc task_description
|
32
|
+
task *args do |task|
|
33
|
+
SingleRule.perform(task.name, task_proc)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/maid/tools.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'digest/
|
1
|
+
require 'digest/sha1'
|
2
2
|
require 'find'
|
3
3
|
require 'fileutils'
|
4
4
|
require 'time'
|
@@ -28,11 +28,11 @@ module Maid::Tools
|
|
28
28
|
# Single path:
|
29
29
|
#
|
30
30
|
# move('~/Downloads/foo.zip', '~/Archive/Software/Mac OS X/')
|
31
|
-
#
|
31
|
+
#
|
32
32
|
# Multiple paths:
|
33
33
|
#
|
34
34
|
# move(['~/Downloads/foo.zip', '~/Downloads/bar.zip'], '~/Archive/Software/Mac OS X/')
|
35
|
-
# move(dir('~/Downloads/*.zip'), '~/Archive/Software/Mac OS X/')
|
35
|
+
# move(dir('~/Downloads/*.zip'), '~/Archive/Software/Mac OS X/')
|
36
36
|
def move(sources, destination)
|
37
37
|
destination = expand(destination)
|
38
38
|
|
@@ -84,11 +84,11 @@ module Maid::Tools
|
|
84
84
|
#
|
85
85
|
# The path is still moved if a file already exists in the trash with the same name. However, the current date and
|
86
86
|
# time is appended to the filename.
|
87
|
-
#
|
87
|
+
#
|
88
88
|
# **Note:** the OS-native "restore" or "put back" functionality for trashed files is not currently supported. (See
|
89
89
|
# [issue #63](https://github.com/benjaminoakes/maid/issues/63).) However, they can be restored manually, and the Maid
|
90
90
|
# log can help assist with this.
|
91
|
-
#
|
91
|
+
#
|
92
92
|
# ## Options
|
93
93
|
#
|
94
94
|
# `:remove_over => Fixnum` (e.g. `1.gigabyte`, `1024.megabytes`)
|
@@ -102,7 +102,7 @@ module Maid::Tools
|
|
102
102
|
# Single path:
|
103
103
|
#
|
104
104
|
# trash('~/Downloads/foo.zip')
|
105
|
-
#
|
105
|
+
#
|
106
106
|
# Multiple paths:
|
107
107
|
#
|
108
108
|
# trash(['~/Downloads/foo.zip', '~/Downloads/bar.zip'])
|
@@ -146,7 +146,7 @@ module Maid::Tools
|
|
146
146
|
# Delete the files at the given path recursively.
|
147
147
|
#
|
148
148
|
# **NOTE**: In most cases, `trash` is a safer choice, since the files will be recoverable by retreiving them from the trash. Once you delete a file using `remove`, it's gone! Please use `trash` whenever possible and only use `remove` when necessary.
|
149
|
-
#
|
149
|
+
#
|
150
150
|
# ## Options
|
151
151
|
#
|
152
152
|
# `:force => boolean`
|
@@ -234,11 +234,11 @@ module Maid::Tools
|
|
234
234
|
dir(globs).
|
235
235
|
select { |f| File.file?(f) }
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
# Escape characters that have special meaning as a part of path global patterns.
|
239
239
|
#
|
240
240
|
# Useful when using `dir` with file names that may contain `{ } [ ]` characters.
|
241
|
-
#
|
241
|
+
#
|
242
242
|
# ## Example
|
243
243
|
#
|
244
244
|
# escape_glob('test [tmp]') # => 'test \\[tmp\\]'
|
@@ -328,7 +328,7 @@ module Maid::Tools
|
|
328
328
|
#
|
329
329
|
# See also: `dir_safe`
|
330
330
|
def downloading?(path)
|
331
|
-
chrome_downloading?(path) || firefox_downloading?(path)
|
331
|
+
!!(chrome_downloading?(path) || firefox_downloading?(path) || safari_downloading?(path))
|
332
332
|
end
|
333
333
|
|
334
334
|
# Find all duplicate files in the given globs.
|
@@ -430,7 +430,7 @@ module Maid::Tools
|
|
430
430
|
raw = cmd("du -s #{ sh_escape(path) }")
|
431
431
|
# FIXME: This reports in kilobytes, but should probably report in bytes.
|
432
432
|
usage_kb = raw.split(/\s+/).first.to_i
|
433
|
-
|
433
|
+
|
434
434
|
if usage_kb.zero?
|
435
435
|
raise "Stopping pessimistically because of unexpected value from du (#{ raw.inspect })"
|
436
436
|
else
|
@@ -493,9 +493,9 @@ module Maid::Tools
|
|
493
493
|
#
|
494
494
|
# ## Examples
|
495
495
|
#
|
496
|
-
# checksum_of('foo.zip') # => "
|
496
|
+
# checksum_of('foo.zip') # => "67258d750ca654d5d3c7b06bd2a1c792ced2003e"
|
497
497
|
def checksum_of(path)
|
498
|
-
Digest::
|
498
|
+
Digest::SHA1.hexdigest(File.read(path))
|
499
499
|
end
|
500
500
|
|
501
501
|
# @deprecated
|
@@ -521,7 +521,7 @@ module Maid::Tools
|
|
521
521
|
# The host OS must provide `rsync`. See the `rsync` man page for a detailed description.
|
522
522
|
#
|
523
523
|
# man rsync
|
524
|
-
#
|
524
|
+
#
|
525
525
|
# ## Options
|
526
526
|
#
|
527
527
|
# `:delete => boolean`
|
@@ -610,7 +610,7 @@ module Maid::Tools
|
|
610
610
|
# media_type('bar.jpg') # => "image"
|
611
611
|
def media_type(path)
|
612
612
|
type = MIME::Types.type_for(path)[0]
|
613
|
-
|
613
|
+
|
614
614
|
if type
|
615
615
|
type.media_type
|
616
616
|
end
|
@@ -634,7 +634,7 @@ module Maid::Tools
|
|
634
634
|
# where_content_type(dir('~/Downloads/*'), 'image/jpeg')
|
635
635
|
#
|
636
636
|
# ### Using Spotlight content types
|
637
|
-
#
|
637
|
+
#
|
638
638
|
# Less portable, but richer data in some cases.
|
639
639
|
#
|
640
640
|
# where_content_type(dir('~/Downloads/*'), 'public.image')
|
@@ -654,6 +654,10 @@ module Maid::Tools
|
|
654
654
|
path =~ /\.crdownload$/
|
655
655
|
end
|
656
656
|
|
657
|
+
def safari_downloading?(path)
|
658
|
+
path =~ /\.download$/
|
659
|
+
end
|
660
|
+
|
657
661
|
def sh_escape(array)
|
658
662
|
Escape.shell_command(Array(array))
|
659
663
|
end
|
@@ -681,4 +685,19 @@ module Maid::Tools
|
|
681
685
|
clean = raw[1, raw.length - 2]
|
682
686
|
clean.split(/,\s+/).map { |s| t = s.strip; t[1, t.length - 2] }
|
683
687
|
end
|
688
|
+
|
689
|
+
# ---
|
690
|
+
# Something @benjaminoakes wrote:
|
691
|
+
|
692
|
+
# Maid.rules do
|
693
|
+
# dir('*-2012.pdf').each do |p|
|
694
|
+
# move(p, normalize_date(p))
|
695
|
+
# end
|
696
|
+
# end
|
697
|
+
|
698
|
+
def normalize_date(path)
|
699
|
+
basename = File.basename(path, '.pdf')
|
700
|
+
latent_date = Date.strptime(basename, '%m-%d-%Y')
|
701
|
+
latent_date.strftime('%Y.%m.%d.pdf')
|
702
|
+
end
|
684
703
|
end
|
data/lib/maid/version.rb
CHANGED
data/lib/maid.rb
CHANGED
data/maid.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
|
20
20
|
# Strategy: if possible, use ranges (so there are fewer chances of version conflicts)
|
21
21
|
s.add_dependency('escape', '>= 0.0.1', '< 0.1.0') # Used for better Ruby 1.8.7 support, could be replaced with `Shellwords`
|
22
|
-
s.add_dependency('thor', '>= 0.14.0', '< 0.
|
22
|
+
s.add_dependency('thor', '>= 0.14.0', '< 1.0.0')
|
23
23
|
s.add_dependency('deprecated', '~> 3.0.0')
|
24
24
|
s.add_dependency('mime-types', '~> 2.0')
|
25
25
|
s.add_dependency('rubyzip', '~> 1.1.0')
|
@@ -32,11 +32,11 @@ Gem::Specification.new do |s|
|
|
32
32
|
# Strategy: specific versions (since they're just for development)
|
33
33
|
s.add_development_dependency('fakefs', '~> 0.4.2')
|
34
34
|
s.add_development_dependency('guard', '~> 2.2.2')
|
35
|
-
s.add_development_dependency('guard-rspec', '~> 4.
|
35
|
+
s.add_development_dependency('guard-rspec', '~> 4.2.1')
|
36
36
|
s.add_development_dependency('rake', '~> 10.1.0')
|
37
37
|
s.add_development_dependency('redcarpet', '~> 3.0.0') # Soft dependency of `yard`
|
38
|
-
s.add_development_dependency('rspec', '
|
39
|
-
s.add_development_dependency('timecop', '~> 0.
|
38
|
+
s.add_development_dependency('rspec', '>= 2.14', '< 3.0')
|
39
|
+
s.add_development_dependency('timecop', '~> 0.7.0')
|
40
40
|
s.add_development_dependency('yard', '~> 0.8.4')
|
41
41
|
|
42
42
|
# In Vagrant, polling won't cross over the OS boundary if you develop in the host OS but run your tests in the
|
data/script/vagrant-provision
CHANGED
@@ -22,11 +22,14 @@ function install-pkg-if-ruby {
|
|
22
22
|
fi
|
23
23
|
}
|
24
24
|
|
25
|
+
sudo apt-get update
|
26
|
+
sudo apt-get install -y python-software-properties
|
27
|
+
sudo add-apt-repository -y ppa:brightbox/ruby-ng
|
25
28
|
sudo apt-get update
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
install-pkg-if-ruby '1.9.3' 'ruby1.9.1'
|
30
|
+
## Dependencies
|
31
|
+
install-pkg-if-ruby '2.1.0' 'ruby2.1'
|
32
|
+
install-pkg-if-ruby '1.9.3' 'ruby1.9.1' # Installs `ruby 1.9.3p0`
|
30
33
|
install-pkg-if-ruby 'jruby' 'jruby'
|
31
34
|
|
32
35
|
# ## Development dependencies
|
@@ -38,6 +41,14 @@ install-pkg 'make'
|
|
38
41
|
install-pkg 'libffi-dev'
|
39
42
|
install-pkg-if-ruby '1.9.3' 'ruby1.9.1-dev'
|
40
43
|
|
44
|
+
# # wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
|
45
|
+
# wget 'http://192.168.0.1:3000/serv/Software/Source/ruby-2.1.1.tar.gz'
|
46
|
+
# tar xvfz ruby-2.1.1.tar.gz
|
47
|
+
# cd ruby-2.1.1
|
48
|
+
# ./configure
|
49
|
+
# make
|
50
|
+
# sudo make install
|
51
|
+
|
41
52
|
sudo gem install bundler
|
42
53
|
cd /vagrant
|
43
54
|
bundle install
|
data/spec/dependency_spec.rb
CHANGED
@@ -23,31 +23,31 @@ describe 'Dependency expectations' do
|
|
23
23
|
logger = Logger.new(io)
|
24
24
|
logger.info('my message')
|
25
25
|
logger.formatter = lambda { |_, _, _, msg| msg }
|
26
|
-
io.string.
|
26
|
+
expect(io.string).to match(/my message/)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe MIME::Types do
|
31
31
|
it 'reports media types and sub types when given a path' do
|
32
32
|
types = MIME::Types.type_for('anything.jpg')
|
33
|
-
types.length.
|
33
|
+
expect(types.length).to eq(1)
|
34
34
|
type = types[0]
|
35
|
-
type.media_type.
|
36
|
-
type.sub_type.
|
35
|
+
expect(type.media_type).to eq('image')
|
36
|
+
expect(type.sub_type).to eq('jpeg')
|
37
37
|
end
|
38
38
|
|
39
39
|
context 'when the type is unknown' do
|
40
40
|
it 'returns []' do
|
41
41
|
types = MIME::Types.type_for('unknown.foo')
|
42
|
-
types.length.
|
43
|
-
types[0].
|
42
|
+
expect(types.length).to eq(0)
|
43
|
+
expect(types[0]).to be_nil
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
describe RbConfig do
|
49
49
|
it 'identifies the host operating system' do
|
50
|
-
RbConfig::CONFIG['host_os'].
|
50
|
+
expect(RbConfig::CONFIG['host_os']).to match(/[a-z]+/)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -59,21 +59,21 @@ describe 'Dependency expectations' do
|
|
59
59
|
# More info:
|
60
60
|
#
|
61
61
|
# * [XDG Base Directory Specification](http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html)
|
62
|
-
XDG['DATA_HOME'].to_s.
|
62
|
+
expect(XDG['DATA_HOME'].to_s).to match(%r{^/.*?/\.local/share$})
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
describe Zip::File do
|
67
67
|
it 'makes entries available with #entries' do
|
68
68
|
Zip::File.open("#@file_fixtures_path/foo.zip") do |zip_file|
|
69
|
-
zip_file.entries.map { |entry| entry.name }.
|
69
|
+
expect(zip_file.entries.map { |entry| entry.name }).to match_array(%w(README.txt foo.exe subdir/anything.txt))
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'supports UTF-8 filenames' do
|
74
74
|
# Filename is a Japanese character
|
75
75
|
Zip::File.open("#@file_fixtures_path/\343\201\225.zip") do |zip_file|
|
76
|
-
zip_file.entries.map { |entry| entry.name }.
|
76
|
+
expect(zip_file.entries.map { |entry| entry.name }).to eq(%w(anything.txt))
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
data/spec/lib/maid/app_spec.rb
CHANGED
@@ -7,7 +7,7 @@ module Maid
|
|
7
7
|
out = StringIO.new
|
8
8
|
$stdout = out
|
9
9
|
yield
|
10
|
-
|
10
|
+
out.string
|
11
11
|
ensure
|
12
12
|
$stdout = STDOUT
|
13
13
|
end
|
@@ -16,7 +16,7 @@ module Maid
|
|
16
16
|
out = StringIO.new
|
17
17
|
$stderr = out
|
18
18
|
yield
|
19
|
-
|
19
|
+
out.string
|
20
20
|
ensure
|
21
21
|
$stderr = STDERR
|
22
22
|
end
|
@@ -36,41 +36,41 @@ module Maid
|
|
36
36
|
Maid.stub(:new) { @maid }
|
37
37
|
end
|
38
38
|
|
39
|
-
it '
|
39
|
+
it 'makes a new Maid with the options' do
|
40
40
|
opts = { :foo => 'bar' }
|
41
41
|
@app.stub(:maid_options).and_return(opts)
|
42
|
-
Maid.
|
42
|
+
expect(Maid).to receive(:new).with(opts).and_return(@maid)
|
43
43
|
@app.clean
|
44
44
|
end
|
45
45
|
|
46
|
-
it '
|
47
|
-
@maid.
|
46
|
+
it 'cleans when --force is specified' do
|
47
|
+
expect(@maid).to receive(:clean)
|
48
48
|
App.start(['clean', '--force'])
|
49
49
|
end
|
50
50
|
|
51
|
-
it '
|
52
|
-
@maid.
|
53
|
-
capture_stderr { App.start(['clean']) }.
|
54
|
-
capture_stderr { App.start(['clean', '--silent']) }.
|
51
|
+
it 'issues deprecation notice when called without option, but still clean' do
|
52
|
+
expect(@maid).to receive(:clean).twice
|
53
|
+
expect(capture_stderr { App.start(['clean']) }).to match(/deprecated/)
|
54
|
+
expect(capture_stderr { App.start(['clean', '--silent']) }).to match(/deprecated/)
|
55
55
|
end
|
56
56
|
|
57
|
-
it '
|
58
|
-
capture_stdout { App.start(['clean', '--force']) }.
|
57
|
+
it 'is not silent if not given the --silent option' do
|
58
|
+
expect(capture_stdout { App.start(['clean', '--force']) }).not_to eq('')
|
59
59
|
end
|
60
60
|
|
61
|
-
it '
|
61
|
+
it 'is silent if given the --silent option' do
|
62
62
|
# TODO: It might even make sense to wrap `maid.clean` in `capture_stdout { ... }`
|
63
|
-
capture_stdout { App.start(['clean', '--noop', '--silent']) }.
|
64
|
-
capture_stdout { App.start(['clean', '--force', '--silent']) }.
|
63
|
+
expect(capture_stdout { App.start(['clean', '--noop', '--silent']) }).to eq('')
|
64
|
+
expect(capture_stdout { App.start(['clean', '--force', '--silent']) }).to eq('')
|
65
65
|
end
|
66
66
|
|
67
|
-
it '
|
68
|
-
capture_stderr { App.start(['clean', '--slient']) }.
|
69
|
-
capture_stderr { App.start(['clean', '--noop', '--slient']) }.
|
67
|
+
it 'complains about a MISSPELLED option' do
|
68
|
+
expect(capture_stderr { App.start(['clean', '--slient']) }).to match(/Unknown/)
|
69
|
+
expect(capture_stderr { App.start(['clean', '--noop', '--slient']) }).to match(/Unknown/)
|
70
70
|
end
|
71
71
|
|
72
|
-
it '
|
73
|
-
capture_stderr { App.start(['rules.rb']) }.
|
72
|
+
it 'complains about an undefined task' do
|
73
|
+
expect(capture_stderr { App.start(['rules.rb']) }).to match(/Could not find/)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -79,13 +79,13 @@ module Maid
|
|
79
79
|
@app = App.new
|
80
80
|
end
|
81
81
|
|
82
|
-
it '
|
83
|
-
@app.
|
82
|
+
it 'prints out the gem version' do
|
83
|
+
expect(@app).to receive(:say).with(VERSION)
|
84
84
|
@app.version
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'is mapped as --version' do
|
88
|
-
App.start(['--version']).
|
88
|
+
expect(App.start(['--version'])).to eq(@app.version)
|
89
89
|
end
|
90
90
|
|
91
91
|
context 'with the "long" option' do
|
@@ -97,10 +97,10 @@ module Maid
|
|
97
97
|
@app.options = options
|
98
98
|
end
|
99
99
|
|
100
|
-
it '
|
100
|
+
it 'prints out the gem version' do
|
101
101
|
ua = 'Maid/0.0.1'
|
102
102
|
UserAgent.stub(:value) { ua }
|
103
|
-
@app.
|
103
|
+
expect(@app).to receive(:say).with(ua)
|
104
104
|
@app.version
|
105
105
|
end
|
106
106
|
end
|
@@ -111,17 +111,17 @@ module Maid
|
|
111
111
|
@app = App.new
|
112
112
|
end
|
113
113
|
|
114
|
-
it '
|
114
|
+
it 'logs to STDOUT for testing purposes when given noop' do
|
115
115
|
opts = @app.maid_options('noop' => true)
|
116
|
-
opts[:file_options][:noop].
|
117
|
-
opts[:logger].
|
118
|
-
opts[:log_device].
|
119
|
-
opts[:log_formatter].call(nil, nil, nil, 'hello').
|
116
|
+
expect(opts[:file_options][:noop]).to be(true)
|
117
|
+
expect(opts[:logger]).to be(false)
|
118
|
+
expect(opts[:log_device]).to eq(STDOUT)
|
119
|
+
expect(opts[:log_formatter].call(nil, nil, nil, 'hello')).to eq("hello\n")
|
120
120
|
end
|
121
121
|
|
122
|
-
it '
|
122
|
+
it 'sets the rules path when given rules' do
|
123
123
|
opts = @app.maid_options('rules' => 'maid_rules.rb')
|
124
|
-
opts[:rules_path].
|
124
|
+
expect(opts[:rules_path]).to match(/maid_rules.rb$/)
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|