maid 0.9.0.alpha.2 → 0.10.0.pre.alpha.2

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.act-env +1 -0
  3. data/.act-secrets.example +2 -0
  4. data/.github/workflows/coverage.yml +29 -0
  5. data/.github/workflows/lint.yml +24 -0
  6. data/.github/workflows/release.yml +62 -0
  7. data/.github/workflows/test.yml +2 -2
  8. data/.gitignore +2 -0
  9. data/.release-please-manifest.json +3 -0
  10. data/.rubocop.yml +35 -0
  11. data/.rubocop_todo.yml +372 -0
  12. data/.ruby-version +1 -1
  13. data/CHANGELOG.md +31 -0
  14. data/Gemfile +1 -1
  15. data/Guardfile +31 -4
  16. data/README.md +3 -3
  17. data/Rakefile +1 -1
  18. data/Vagrantfile +2 -2
  19. data/lib/maid/app.rb +48 -51
  20. data/lib/maid/maid.rb +38 -38
  21. data/lib/maid/numeric_extensions.rb +26 -25
  22. data/lib/maid/platform.rb +1 -1
  23. data/lib/maid/rake/task.rb +1 -1
  24. data/lib/maid/repeat.rb +8 -8
  25. data/lib/maid/rule_container.rb +3 -3
  26. data/lib/maid/rules.sample.rb +17 -17
  27. data/lib/maid/tools.rb +142 -127
  28. data/lib/maid/trash_migration.rb +4 -4
  29. data/lib/maid/user_agent.rb +2 -2
  30. data/lib/maid/version.rb +5 -2
  31. data/lib/maid/watch.rb +10 -12
  32. data/maid.gemspec +36 -18
  33. data/spec/dependency_spec.rb +9 -8
  34. data/spec/lib/maid/app_spec.rb +31 -23
  35. data/spec/lib/maid/maid_spec.rb +74 -52
  36. data/spec/lib/maid/numeric_extensions_spec.rb +1 -1
  37. data/spec/lib/maid/platform_spec.rb +1 -1
  38. data/spec/lib/maid/rake/single_rule_spec.rb +11 -6
  39. data/spec/lib/maid/rake/task_spec.rb +3 -5
  40. data/spec/lib/maid/rule_spec.rb +1 -1
  41. data/spec/lib/maid/tools_spec.rb +94 -92
  42. data/spec/lib/maid/trash_migration_spec.rb +12 -11
  43. data/spec/lib/maid/user_agent_spec.rb +5 -4
  44. data/spec/lib/maid_spec.rb +1 -1
  45. data/spec/spec_helper.rb +19 -3
  46. metadata +177 -61
data/lib/maid/watch.rb CHANGED
@@ -5,33 +5,31 @@ class Maid::Watch
5
5
 
6
6
  attr_reader :path, :listener, :logger
7
7
 
8
- def initialize(maid, path, options = {}, &rules)
8
+ def initialize(maid, path, options = {}, &block)
9
9
  @maid = maid
10
10
 
11
11
  if options.nil? || options.empty?
12
12
  @lazy = true
13
13
  @options = { wait_for_delay: 10,
14
- ignore: Maid::Downloading.downloading_file_regexps }
14
+ ignore: Maid::Downloading.downloading_file_regexps, }
15
15
  else
16
- @lazy = options.delete(:lazy) { |key| true }
16
+ @lazy = options.delete(:lazy) { |_key| true }
17
17
  @options = options
18
18
  end
19
19
 
20
20
  @logger = maid.logger # TODO: Maybe it's better to create seperate loggers?
21
21
  @path = File.expand_path(path)
22
- initialize_rules(&rules)
22
+ initialize_rules(&block)
23
23
  end
24
24
 
25
25
  def run
26
- unless rules.empty?
27
- @listener = Listen.to(path, @options) do |modified, added, removed|
28
- if !@lazy || added.any? || removed.any?
29
- follow_rules(modified, added, removed)
30
- end
31
- end
32
-
33
- @listener.start
26
+ return if rules.empty?
27
+
28
+ @listener = Listen.to(path, @options) do |modified, added, removed|
29
+ follow_rules(modified, added, removed) if !@lazy || added.any? || removed.any?
34
30
  end
31
+
32
+ @listener.start
35
33
  end
36
34
 
37
35
  def stop
data/maid.gemspec CHANGED
@@ -1,34 +1,43 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path('../lib', __FILE__)
1
+ $:.push File.expand_path('lib', __dir__)
3
2
  require 'maid/version'
4
3
 
5
4
  Gem::Specification.new do |s|
6
5
  s.name = 'maid'
7
6
  s.version = Maid::VERSION
8
7
  s.platform = Gem::Platform::RUBY
9
- s.authors = ['Benjamin Oakes']
10
- s.email = %w(hello@benjaminoakes.com)
8
+ s.authors = ['Benjamin Oakes', 'Coaxial']
9
+ s.email = ['hello@benjaminoakes.com', 'c+rubygems@64b.it']
11
10
  s.license = 'GPLv2'
12
- s.homepage = 'http://github.com/benjaminoakes/maid'
11
+ s.homepage = 'http://github.com/maid/maid'
13
12
  s.summary = Maid::SUMMARY
14
13
  s.description = s.summary
14
+ s.files = Dir['lib/**/*.rb'] + Dir['bin/maid']
15
+ s.metadata = {
16
+ 'bug_tracker_uri' => 'https://github.com/maid/maid/issues',
17
+ 'changelog_uri' => 'https://github.com/maid/maid/blob/master/CHANGELOG.md',
18
+ 'documentation_uri' => 'https://github.com/maid/maid/blob/master/README.md',
19
+ 'source_code_uri' => 'https://github.com/maid/maid',
20
+ 'wiki_uri' => 'https://github.com/maid/maid/wiki',
21
+ 'rubygems_mfa_required' => 'true',
22
+ }
15
23
 
16
24
  s.rubyforge_project = 'maid'
17
25
 
18
26
  s.required_ruby_version = '>= 2.7.0'
19
27
 
20
28
  # Strategy: if possible, use ranges (so there are fewer chances of version conflicts)
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', '~> 1.2.1')
23
29
  s.add_dependency('deprecated', '~> 3.0.0')
24
30
  s.add_dependency('dimensions', '>= 1.0.0', '< 2.0')
31
+ # Used for better Ruby 1.8.7 support, could be replaced with `Shellwords`
32
+ s.add_dependency('escape', '>= 0.0.1', '< 0.1.0')
33
+ s.add_dependency('exifr', '~> 1.3.10')
34
+ s.add_dependency('geocoder', '~> 1.8.1')
35
+ s.add_dependency('listen', '~> 3.8.0')
25
36
  s.add_dependency('mime-types', '~> 3.0', '< 4.0')
26
37
  s.add_dependency('rubyzip', '~> 2.3.2')
27
- s.add_dependency('xdg', '~> 2.2.3') # previous versions had bugs
28
- s.add_dependency('listen', '~> 3.8.0')
29
38
  s.add_dependency('rufus-scheduler', '~> 3.8.2')
30
- s.add_dependency('exifr', '~> 1.3.10')
31
- s.add_dependency('geocoder', '~> 1.8.1')
39
+ s.add_dependency('thor', '~> 1.2.1')
40
+ s.add_dependency('xdg', '~> 2.2.3') # previous versions had bugs
32
41
 
33
42
  # TODO: use one of these two gems instead of `mdfind`. **But** They have to work on Linux as well.
34
43
  #
@@ -37,25 +46,34 @@ Gem::Specification.new do |s|
37
46
 
38
47
  # Strategy: specific versions (since they're just for development)
39
48
  s.add_development_dependency('fakefs', '~> 2.4.0')
40
- s.add_development_dependency('guard', '~> 2.12.5')
41
- s.add_development_dependency('guard-rspec', '~> 4.6.2')
49
+ s.add_development_dependency('fuubar')
50
+ s.add_development_dependency('guard', '~> 2.18.0')
51
+ s.add_development_dependency('guard-bundler', '~> 3.0.1')
52
+ s.add_development_dependency('guard-rspec', '~> 4.7.3')
53
+ s.add_development_dependency('guard-rubocop')
54
+ s.add_development_dependency('pry-byebug')
42
55
  s.add_development_dependency('rake', '~> 13.0.6')
43
56
  s.add_development_dependency('redcarpet', '~> 3.6.0') # Soft dependency of `yard`
44
57
  s.add_development_dependency('rspec', '~> 3.12.0')
58
+ s.add_development_dependency('rubocop')
59
+ s.add_development_dependency('rubocop-rake')
60
+ s.add_development_dependency('rubocop-rspec')
61
+ s.add_development_dependency('simplecov')
45
62
  s.add_development_dependency('timecop', '~> 0.9.6')
46
63
  s.add_development_dependency('yard', '>= 0.9.11')
47
- s.add_development_dependency('pry-byebug')
48
64
 
49
65
  # In Vagrant, polling won't cross over the OS boundary if you develop in the host OS but run your tests in the
50
66
  # guest. One way around this is to force polling instead:
51
67
  #
52
68
  # bundle exec guard --force-polling
53
69
  #
54
- s.add_development_dependency('rb-inotify', '~> 0.10.1')
55
70
  s.add_development_dependency('rb-fsevent', '~> 0.11.2')
71
+ s.add_development_dependency('rb-inotify', '~> 0.10.1')
56
72
 
57
73
  s.files = `git ls-files -z`.split("\0")
58
- s.test_files = `git ls-files -z -- {test,spec,features}/*`.split("\0")
59
- s.executables = `git ls-files -z -- bin/*`.split("\0").map{ |f| File.basename(f) }
60
- s.require_paths = %w(lib)
74
+ s.executables = `git ls-files -z -- bin/*`.split("\0").map { |f| File.basename(f) }
75
+ s.require_paths = %w[lib]
76
+
77
+ s.post_install_message = "🙏 Thank you for installing Maid, we hope it's " \
78
+ "useful to you! Visit #{s.homepage} to report issues or contribute code."
61
79
  end
@@ -20,12 +20,13 @@ describe 'Dependency expectations' do
20
20
  end
21
21
 
22
22
  describe Logger do
23
- # Depending on the situation, `Logger` might have been overwritten to have a different interface. (I'm looking at you, Rails.)
23
+ # Depending on the situation, `Logger` might have been overwritten to have
24
+ # a different interface. (I'm looking at you, Rails.)
24
25
  it 'logs with the expected interface' do
25
26
  io = StringIO.new
26
27
  logger = Logger.new(io)
27
28
  logger.info('my message')
28
- logger.formatter = lambda { |_, _, _, msg| msg }
29
+ logger.formatter = ->(_, _, _, msg) { msg }
29
30
  expect(io.string).to match(/my message/)
30
31
  end
31
32
  end
@@ -68,28 +69,28 @@ describe 'Dependency expectations' do
68
69
 
69
70
  describe Zip::File do
70
71
  it 'makes entries available with #entries' do
71
- Zip::File.open("#@file_fixtures_path/foo.zip") do |zip_file|
72
- expect(zip_file.entries.map { |entry| entry.name }).to match_array(%w(README.txt foo.exe subdir/anything.txt))
72
+ Zip::File.open("#{@file_fixtures_path}/foo.zip") do |zip_file|
73
+ expect(zip_file.entries.map { |entry| entry.name }).to match_array(%w[README.txt foo.exe subdir/anything.txt])
73
74
  end
74
75
  end
75
76
 
76
77
  it 'supports UTF-8 filenames' do
77
78
  # Filename is a Japanese character
78
- Zip::File.open("#@file_fixtures_path/\343\201\225.zip") do |zip_file|
79
- expect(zip_file.entries.map { |entry| entry.name }).to eq(%w(anything.txt))
79
+ Zip::File.open("#{@file_fixtures_path}/\343\201\225.zip") do |zip_file|
80
+ expect(zip_file.entries.map { |entry| entry.name }).to eq(%w[anything.txt])
80
81
  end
81
82
  end
82
83
  end
83
84
 
84
85
  describe Dimensions do
85
86
  it 'returns dimensions as an array' do
86
- expect(Dimensions.dimensions("#@file_fixtures_path/sydney.jpg")).to eq([100, 75])
87
+ expect(Dimensions.dimensions("#{@file_fixtures_path}/sydney.jpg")).to eq([100, 75])
87
88
  end
88
89
  end
89
90
 
90
91
  describe EXIFR::JPEG do
91
92
  it 'returns latitude and longitude' do
92
- gps = EXIFR::JPEG.new("#@file_fixtures_path/sydney.jpg").gps
93
+ gps = EXIFR::JPEG.new("#{@file_fixtures_path}/sydney.jpg").gps
93
94
  expect([gps.latitude, gps.longitude]).to eq([-33.85608611111111, 151.219925])
94
95
  end
95
96
  end
@@ -1,6 +1,10 @@
1
1
  require 'spec_helper'
2
2
  require 'stringio'
3
3
 
4
+ # FIXME: this clobbers rspec's output in the console. out.truncate(0) flushes
5
+ # the StringIO object but fails the test. Maybe stubbing Kernel.warn and
6
+ # Kernel.info would silence the output?
7
+ # Something like spec/lib/maid/maid_spec.rb:5 and :172
4
8
  def capture_stdout
5
9
  out = StringIO.new
6
10
  $stdout = out
@@ -10,6 +14,10 @@ ensure
10
14
  $stdout = STDOUT
11
15
  end
12
16
 
17
+ # FIXME: this clobbers rspec's output in the console. out.truncate(0) flushes
18
+ # the StringIO object but fails the test. Maybe stubbing Kernel.warn and
19
+ # Kernel.info would silence the output?
20
+ # Something like spec/lib/maid/maid_spec.rb:5 and :172
13
21
  def capture_stderr
14
22
  out = StringIO.new
15
23
  $stderr = out
@@ -21,33 +29,33 @@ end
21
29
 
22
30
  module Maid
23
31
  describe App, '#clean' do
24
-
25
32
  before do
26
33
  @app = App.new
27
- @app.stub(:maid_options)
28
- @app.stub(:say)
34
+ allow(@app).to receive(:maid_options)
35
+ allow(@app).to receive(:say)
29
36
 
30
- TrashMigration.stub(:needed?) { false }
37
+ allow(TrashMigration).to receive(:needed?).and_return(false)
31
38
 
32
- # NOTE: It's pretty important that this is stubbed, unless you want your rules to be run over and over when you test!
39
+ # NOTE: It's pretty important that this is stubbed, unless you want your
40
+ # rules to be run over and over when you test!
33
41
  @maid = double('Maid')
34
- @maid.stub(:clean)
35
- @maid.stub(:log_device)
36
- @maid.stub(:load_rules)
37
- Maid.stub(:new) { @maid }
42
+ allow(@maid).to receive(:clean)
43
+ allow(@maid).to receive(:log_device)
44
+ allow(@maid).to receive(:load_rules)
45
+ allow(Maid).to receive(:new).and_return(@maid)
38
46
  end
39
47
 
40
48
  it 'makes a new Maid with the options' do
41
- opts = { :foo => 'bar' }
42
- @app.stub(:maid_options).and_return(opts)
49
+ opts = { foo: 'bar' }
50
+ allow(@app).to receive(:maid_options).and_return(opts)
43
51
  expect(Maid).to receive(:new).with(opts).and_return(@maid)
44
52
  @app.clean
45
53
  end
46
54
 
47
- it 'cleans when --force is specified' do
55
+ it 'cleans when --force is specified' do
48
56
  expect(@maid).to receive(:clean)
49
57
  App.start(['clean', '--force'])
50
- end
58
+ end
51
59
 
52
60
  it 'issues deprecation notice when called without option, but still clean' do
53
61
  expect(@maid).to receive(:clean).twice
@@ -94,13 +102,13 @@ module Maid
94
102
  # FIXME: This is ugly. Maybe use `Maid.start(%w(version --long))` instead.
95
103
 
96
104
  # We can't simply stub `long?` because `options` is a frozen object.
97
- options = double('options', :long? => true)
105
+ options = double('options', long?: true)
98
106
  @app.options = options
99
107
  end
100
108
 
101
109
  it 'prints out the gem version' do
102
110
  ua = 'Maid/0.0.1'
103
- UserAgent.stub(:value) { ua }
111
+ allow(UserAgent).to receive(:value).and_return(ua)
104
112
  expect(@app).to receive(:say).with(ua)
105
113
  @app.version
106
114
  end
@@ -129,10 +137,10 @@ module Maid
129
137
  describe App, '#logs' do
130
138
  before do
131
139
  @maid = double('Maid')
132
- @maid.stub(:clean)
133
- @maid.stub(:log_device) { '/var/log/maid.log' }
134
- @maid.stub(:load_rules)
135
- Maid.stub(:new) { @maid }
140
+ allow(@maid).to receive(:clean)
141
+ allow(@maid).to receive(:log_device).and_return('/var/log/maid.log')
142
+ allow(@maid).to receive(:load_rules)
143
+ allow(Maid).to receive(:new).and_return(@maid)
136
144
  end
137
145
 
138
146
  describe 'prints out the log' do
@@ -142,11 +150,11 @@ module Maid
142
150
  @log_file.write(@log)
143
151
  @log_file.close
144
152
 
145
- @maid.stub(:log_device) { @log_file.path }
153
+ allow(@maid).to receive(:log_device).and_return(@log_file.path)
146
154
  end
147
155
 
148
156
  after do
149
- @log_file.unlink if !@log_file.nil?
157
+ @log_file.unlink unless @log_file.nil?
150
158
  end
151
159
 
152
160
  it 'dumps the last log entries when invoked without an option' do
@@ -154,14 +162,14 @@ module Maid
154
162
  end
155
163
 
156
164
  it 'prints an error when log does not exist' do
157
- @maid.stub(:log_device) { '/maid/file-does-not-exist' }
165
+ allow(@maid).to receive(:log_device).and_return('/maid/file-does-not-exist')
158
166
  message = "Log file #{@maid.log_device} does not exist.\n"
159
167
 
160
168
  expect(capture_stderr { App.start(['logs']) }).to eq(message)
161
169
  end
162
170
 
163
171
  it 'does not tail when log does not exist' do
164
- @maid.stub(:log_device) { '/maid/file-does-not-exist' }
172
+ allow(@maid).to receive(:log_device).and_return('/maid/file-does-not-exist')
165
173
  message = "Log file #{@maid.log_device} does not exist.\n"
166
174
 
167
175
  expect(capture_stderr { App.start(['logs', '--tail']) }).to eq(message)
@@ -2,10 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  module Maid
4
4
  describe Maid do
5
+ let(:logger) { instance_spy('Logger') }
6
+
5
7
  before do
6
- @logger = double('Logger').as_null_object
7
- Logger.stub(:new) { @logger }
8
- FileUtils.stub(:mkdir_p)
8
+ allow(Logger).to receive(:new).and_return(logger)
9
+ allow(FileUtils).to receive(:mkdir_p)
9
10
  end
10
11
 
11
12
  describe '.new' do
@@ -17,45 +18,46 @@ module Maid
17
18
  it 'sets up a logger with the given path, when provided' do
18
19
  log_device = '/var/log/maid.log'
19
20
  expect(Logger).to receive(:new).with(log_device, anything, anything)
20
- Maid.new(:log_device => log_device)
21
+ Maid.new(log_device: log_device)
21
22
  end
22
23
 
23
24
  it 'rotates the log with the default settings' do
24
- expect(Logger).to receive(:new).with(anything, Maid::DEFAULTS[:log_shift_age], Maid::DEFAULTS[:log_shift_size])
25
+ expect(Logger).to receive(:new).with(anything, Maid::DEFAULTS[:log_shift_age],
26
+ Maid::DEFAULTS[:log_shift_size],)
25
27
  Maid.new
26
28
  end
27
29
 
28
30
  it 'rotates the log with the given settings, when provided' do
29
31
  expect(Logger).to receive(:new).with(anything, 42, 1_000_000)
30
- Maid.new(:log_shift_age => 42, :log_shift_size => 1_000_000)
32
+ Maid.new(log_shift_age: 42, log_shift_size: 1_000_000)
31
33
  end
32
34
 
33
35
  it 'makes the log directory in case it does not exist' do
34
36
  expect(FileUtils).to receive(:mkdir_p).with('/home/username/log')
35
- Maid.new(:log_device => '/home/username/log/maid.log')
37
+ Maid.new(log_device: '/home/username/log/maid.log')
36
38
  end
37
39
 
38
40
  it 'takes a logger object during intialization' do
39
- Logger.unstub(:new)
40
- maid = Maid.new(:logger => @logger)
41
- expect(maid.logger).to eq(@logger)
41
+ allow(Logger).to receive(:new).and_call_original
42
+ maid = Maid.new(logger: logger)
43
+ expect(maid.logger).to eq(logger)
42
44
  end
43
45
 
44
46
  describe 'platform-specific behavior' do
45
47
  before do
46
- Platform.stub(:linux?)
47
- Platform.stub(:osx?)
48
+ allow(Platform).to receive(:linux?)
49
+ allow(Platform).to receive(:osx?)
48
50
  @home = File.expand_path('~')
49
51
  end
50
52
 
51
53
  context 'when running on Linux' do
52
54
  before do
53
- Platform.stub(:linux?) { true }
54
- XDG.stub(:[]).with('DATA_HOME') { "#{ @home }/.local/share" }
55
+ allow(Platform).to receive(:linux?).and_return(true)
56
+ allow(XDG).to receive(:[]).with('DATA_HOME').and_return("#{@home}/.local/share")
55
57
  end
56
58
 
57
59
  it 'set the trash to the correct default path' do
58
- trash_path = "#{ @home }/.local/share/Trash/files/"
60
+ trash_path = "#{@home}/.local/share/Trash/files/"
59
61
  expect(FileUtils).to receive(:mkdir_p).with(trash_path).once
60
62
  maid = Maid.new
61
63
  expect(maid.trash_path).to eq(trash_path)
@@ -64,11 +66,11 @@ module Maid
64
66
 
65
67
  context 'when running on OS X' do
66
68
  before do
67
- Platform.stub(:osx?) { true }
69
+ allow(Platform).to receive(:osx?).and_return(true)
68
70
  end
69
71
 
70
72
  it 'sets the trash to the correct default path' do
71
- trash_path = "#{ @home }/.Trash/"
73
+ trash_path = "#{@home}/.Trash/"
72
74
  expect(FileUtils).to receive(:mkdir_p).with(trash_path).once
73
75
  maid = Maid.new
74
76
  expect(maid.trash_path).to eq(trash_path)
@@ -77,7 +79,7 @@ module Maid
77
79
 
78
80
  context 'when running on an unsupported platform' do
79
81
  it 'does not implement trashing files' do
80
- expect(lambda { Maid.new }).to raise_error(NotImplementedError)
82
+ expect { Maid.new }.to raise_error(NotImplementedError)
81
83
  end
82
84
  end
83
85
  end
@@ -85,19 +87,21 @@ module Maid
85
87
  it 'sets the trash to the given path, if provided' do
86
88
  trash_path = '/home/username/tmp/my_trash/'
87
89
  expect(FileUtils).to receive(:mkdir_p).with(trash_path).once
88
- maid = Maid.new(:trash_path => trash_path)
90
+ maid = Maid.new(trash_path: trash_path)
89
91
  expect(maid.trash_path).not_to be_nil
90
92
  expect(maid.trash_path).to eq(trash_path)
91
93
  end
92
94
 
93
95
  it 'sets the progname for the logger' do
94
- expect(@logger).to receive(:progname=).with(Maid::DEFAULTS[:progname])
95
96
  Maid.new
97
+
98
+ expect(logger).to have_received(:progname=).with(Maid::DEFAULTS[:progname])
96
99
  end
97
100
 
98
101
  it 'sets the progname for the logger to the given name, if provided' do
99
- expect(@logger).to receive(:progname=).with('Fran')
100
- Maid.new(:progname => 'Fran')
102
+ Maid.new(progname: 'Fran')
103
+
104
+ expect(logger).to have_received(:progname=).with('Fran')
101
105
  end
102
106
 
103
107
  it 'sets the file options to the defaults' do
@@ -105,8 +109,8 @@ module Maid
105
109
  end
106
110
 
107
111
  it 'sets the file options to the given options, if provided' do
108
- maid = Maid.new(:file_options => { :verbose => true })
109
- expect(maid.file_options).to eq(:verbose => true)
112
+ maid = Maid.new(file_options: { verbose: true })
113
+ expect(maid.file_options).to eq(verbose: true)
110
114
  end
111
115
 
112
116
  it 'sets the rules path' do
@@ -114,12 +118,12 @@ module Maid
114
118
  end
115
119
 
116
120
  it 'sets the rules pathto the given path, if provided' do
117
- maid = Maid.new(:rules_path => 'Maidfile')
121
+ maid = Maid.new(rules_path: 'Maidfile')
118
122
  expect(maid.rules_path).to eq('Maidfile')
119
123
  end
120
124
 
121
125
  it 'ignores nil options' do
122
- maid = Maid.new(:rules_path => nil)
126
+ maid = Maid.new(rules_path: nil)
123
127
  expect(maid.rules_path).to eq(Maid::DEFAULTS[:rules_path])
124
128
  end
125
129
  end
@@ -127,13 +131,14 @@ module Maid
127
131
  describe '#clean' do
128
132
  before do
129
133
  @maid = Maid.new
130
- @logger.stub(:info)
134
+ allow(logger).to receive(:info)
131
135
  end
132
136
 
133
137
  it 'logs start and finish' do
134
- expect(@logger).to receive(:info).with('Started')
135
- expect(@logger).to receive(:info).with('Finished')
136
138
  @maid.clean
139
+
140
+ expect(logger).to have_received(:info).with('Started')
141
+ expect(logger).to have_received(:info).with('Finished')
137
142
  end
138
143
 
139
144
  it 'follows the given rules' do
@@ -143,20 +148,32 @@ module Maid
143
148
  end
144
149
 
145
150
  describe '#load_rules' do
146
- before do
147
- Kernel.stub(:load)
148
- @maid = Maid.new
149
- end
151
+ context 'when there is no LoadError' do
152
+ before do
153
+ allow(Kernel).to receive(:load)
154
+ end
155
+
156
+ let(:maid) { Maid.new }
150
157
 
151
- it 'sets the Maid instance' do
152
- expect(::Maid).to receive(:with_instance).with(@maid)
153
- @maid.load_rules
158
+ it 'sets the Maid instance' do
159
+ expect(::Maid).to receive(:with_instance).with(maid)
160
+ maid.load_rules
161
+ end
154
162
  end
155
163
 
156
- it 'gives an error on STDERR if there is a LoadError' do
157
- Kernel.stub(:load).and_raise(LoadError)
158
- expect(STDERR).to receive(:puts)
159
- @maid.load_rules
164
+ context 'when there is a LoadError' do
165
+ let(:maid) { Maid.new }
166
+
167
+ before do
168
+ allow(Kernel).to receive(:load).and_raise(LoadError)
169
+ allow(Logger).to receive(:warn)
170
+ end
171
+
172
+ it 'gives an error on STDERR if there is a LoadError' do
173
+ maid.load_rules
174
+
175
+ expect(logger).to have_received(:warn).once
176
+ end
160
177
  end
161
178
  end
162
179
 
@@ -179,8 +196,8 @@ module Maid
179
196
 
180
197
  describe '#watch' do
181
198
  before do
182
- Listen.stub(:to)
183
- Listen.stub(:start)
199
+ allow(Listen).to receive(:to)
200
+ allow(Listen).to receive(:start)
184
201
  @maid = Maid.new
185
202
  end
186
203
 
@@ -195,8 +212,9 @@ module Maid
195
212
  expect(@maid.watches.first.path).to eq(File.expand_path('watch_dir'))
196
213
  end
197
214
 
198
- it 'accepts a hash of options and passes them to Listen' do
199
- hash = { :some => :options }
215
+ # FIXME: Example is too long, shouldn't need the rubocop::disable
216
+ it 'accepts a hash of options and passes them to Listen' do # rubocop:disable RSpec/ExampleLength
217
+ hash = { some: :options }
200
218
  @maid.watch('some_dir', hash) do
201
219
  rule 'test' do
202
220
  end
@@ -232,11 +250,12 @@ module Maid
232
250
  expect(@maid.repeats.first.timestring).to eq('1s')
233
251
  end
234
252
 
235
- it 'accepts a hash of options and passes them to Rufus' do
253
+ # FIXME: Example is too long, shouldn't need the rubocop::disable
254
+ it 'accepts a hash of options and passes them to Rufus' do # rubocop:disable RSpec/ExampleLength
236
255
  scheduler = double('scheduler')
237
256
  expect(Rufus::Scheduler).to receive(:singleton).and_return(scheduler)
238
257
 
239
- hash = { :some => :options }
258
+ hash = { some: :options }
240
259
  @maid.repeat('1s', hash) do
241
260
  rule 'test' do
242
261
  end
@@ -249,18 +268,21 @@ module Maid
249
268
  end
250
269
 
251
270
  describe '#follow_rules' do
252
- it 'follows each rule' do
271
+ # FIXME: Example is too long, shouldn't need the rubocop::disable
272
+ it 'follows each rule' do # rubocop:disable RSpec/ExampleLength
253
273
  n = 3
254
274
  maid = Maid.new
255
- expect(@logger).to receive(:info).exactly(n).times
275
+
256
276
  rules = (1..n).map do |i|
257
- d = double("rule ##{ i }", :description => 'description')
277
+ d = double("rule ##{i}", description: 'description')
258
278
  expect(d).to receive(:follow)
259
279
  d
260
280
  end
261
281
  maid.instance_eval { @rules = rules }
262
282
 
263
283
  maid.follow_rules
284
+
285
+ expect(logger).to have_received(:info).exactly(n).times
264
286
  end
265
287
  end
266
288
 
@@ -270,11 +292,11 @@ module Maid
270
292
  end
271
293
 
272
294
  it 'reports `not-a-real-command` as not being a supported command' do
273
- expect(lambda { @maid.cmd('not-a-real-command arg1 arg2') }).to raise_error(NotImplementedError)
295
+ expect { @maid.cmd('not-a-real-command arg1 arg2') }.to raise_error(NotImplementedError)
274
296
  end
275
297
 
276
- it 'should report `echo` as a real command' do
277
- expect(lambda { @maid.cmd('echo .') }).not_to raise_error
298
+ it 'reports `echo` as a real command' do
299
+ expect { @maid.cmd('echo .') }.not_to raise_error
278
300
  end
279
301
  end
280
302
  end
@@ -18,7 +18,7 @@ describe Maid::NumericExtensions::SizeToKb do
18
18
  it 'tells you that 1 gigabyte equals 1024 megabytes' do
19
19
  expect(1.gigabyte).to eq(1024.megabytes)
20
20
  end
21
-
21
+
22
22
  it 'tells you that 1 terabyte equals 1024 gigabytes' do
23
23
  expect(1.terabyte).to eq(1024.gigabytes)
24
24
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module Maid
4
4
  describe Platform do
5
5
  def stub_host_os(value)
6
- RbConfig::CONFIG.stub(:[]).with('host_os') { value }
6
+ allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return(value)
7
7
  end
8
8
 
9
9
  describe 'determining the host OS' do