maid 0.8.0.alpha.4 → 0.9.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 59a42ca675fafa12a22f7610385f2e4dcd0ca1e3e6fc663befbf7c6f821e303f
4
+ data.tar.gz: 381ae0030809aa1ac6847df528af641fb0b1a42d5387600a3de70c079fb10cc1
5
+ SHA512:
6
+ metadata.gz: df4a95605641bba6cdf041925aab0832f40225548858bf0eb68d572447c6257c42b4695371790ab86c57d4e5ee78ee68267a384e5fa049309acac962a5fe748f
7
+ data.tar.gz: 5f67557c5bdd8be613545b99602c5989dea1e976b677018e76eb9457be2546b27bc976774873e6b63505091c956c4cdc6dc4082bf1719df08d174a488395d599
@@ -0,0 +1,36 @@
1
+ name: Maid
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ test:
13
+ strategy:
14
+ matrix:
15
+ os:
16
+ - ubuntu-20.04
17
+ - ubuntu-22.04
18
+ - macos-11
19
+ - macos-12
20
+ ruby-version:
21
+ - 2.7
22
+ - 3.0
23
+ - 3.1
24
+ - 3.2
25
+ runs-on: ${{ matrix.os }}
26
+ steps:
27
+ - uses: actions/checkout@v3
28
+ - name: Set up Ruby
29
+ uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby-version }}
32
+ bundler-cache: true
33
+ - name: Install dependencies
34
+ run: bundle install
35
+ - name: Run tests
36
+ run: bundle exec rake
data/.ruby-gemset CHANGED
@@ -1 +1 @@
1
- maid
1
+ maid-dev
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.1.5
1
+ 3.1.3
data/AUTHORS.md CHANGED
@@ -13,10 +13,12 @@ In alphabetical order:
13
13
  * Lewis O'Driscoll (@loddy1234)
14
14
  * Lloyd Philbrook (@phoolish)
15
15
  * Mark Jaquith (@markjaquith)
16
+ * Mark Przepiora (@markprzepiora)
16
17
  * Mikael Hultgren (@blomma)
17
18
  * Mu Ye (@yemutex)
18
19
  * Nico Ritschel (@nicosuave)
19
20
  * Pedro Lambert (@p-lambert)
21
+ * Pierre Rock (@coaxial)
20
22
  * Shiro Hazuki (@HazukiShiro)
21
23
  * Song Chen Wen (宋辰文, @songchenwen)
22
24
  * Vladimir Agafonkin (@mourner)
data/ChangeLog CHANGED
@@ -1,6 +1,14 @@
1
+ maid (0.9.0) unstable; urgency=low
2
+ * Mark Przepiora: Support passing scheduler options to Rufus
3
+ * Pierre Rock: Support Ruby 3
4
+ * Pierre Rock: Update most dependencies
5
+
6
+ -- Pierre Rock <coaxial@users.noreply.github.com> Sat, 18 Mar 2023 12:06:00
7
+ +0100
8
+
1
9
  maid (0.8.0) unstable; urgency=low
2
10
 
3
- * Started official support for Ruby 2.2.2.
11
+ * Started official support for Ruby 2.2 - 2.6. (Closes: #174)
4
12
  * Song Chen Wen: Added OSX tagging tools (depends on `brew install tag`):
5
13
  "tags", "has_tags?", "contains_tag?", "add_tag", "remove_tag", "set_tag"
6
14
  (Closes: #125)
@@ -8,8 +16,10 @@ maid (0.8.0) unstable; urgency=low
8
16
  tools, using OSX Spotlight metadata when available
9
17
  * Song Chen Wen: Added Aria2 and Tunder support to "downloading?" tool
10
18
  * Song Chen Wen: Reduce "watch" CPU usage by throttling (Closes: #149, #150)
19
+ * Phylor: Add command to manage logs (Closes: #169, #143)
11
20
  * Updated development dependencies, except for FakeFS (help appreciated!)
12
21
  * Updated dependencies: "listen", "rufus-scheduler"
22
+ * Phylor: Fix geolookup
13
23
 
14
24
  -- Benjamin Oakes <hello@benjaminoakes.com> TODO
15
25
 
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
1
  # Maid
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/maid.png)](http://badge.fury.io/rb/maid)
4
- [![Build Status](https://secure.travis-ci.org/benjaminoakes/maid.png)](http://travis-ci.org/benjaminoakes/maid)
5
- [![Dependency Status](https://gemnasium.com/benjaminoakes/maid.png)](https://gemnasium.com/benjaminoakes/maid)
6
- [![Code Climate](https://codeclimate.com/github/benjaminoakes/maid.png)](https://codeclimate.com/github/benjaminoakes/maid)
3
+ [![Gem Version](https://badge.fury.io/rb/maid.svg)](http://badge.fury.io/rb/maid)
4
+ [![Build Status](https://secure.travis-ci.org/benjaminoakes/maid.svg)](http://travis-ci.org/benjaminoakes/maid)
5
+ [![Code Climate](https://codeclimate.com/github/benjaminoakes/maid.svg)](https://codeclimate.com/github/benjaminoakes/maid)
7
6
  [![Hakiri](https://hakiri.io/github/benjaminoakes/maid/stable.svg)](https://hakiri.io/github/benjaminoakes/maid/stable)
8
7
  [![StackOverflow](http://img.shields.io/badge/stackoverflow-maid-blue.svg)](http://stackoverflow.com/questions/tagged/maid)
9
8
 
@@ -86,7 +85,7 @@ Modern Ruby versions and Unix-like operating systems should work, but only OS X
86
85
  Offically supported:
87
86
 
88
87
  * **OS:** Mac OS X, Ubuntu
89
- * **Ruby:** 1.9.3+ (2.0.x or 2.1.x are preferred)
88
+ * **Ruby:** 2.7.0+ (3.0.0+ preferred)
90
89
 
91
90
  Some features require OS X. See the [documentation][] for more details.
92
91
 
@@ -99,7 +98,7 @@ Consider `rbenv` or `rvm`, especially if only Ruby 1.8.7 is available (e.g. if y
99
98
  System Ruby works fine too, though:
100
99
 
101
100
  * **Mac OS X:** Ruby 2.0.0 comes preinstalled in OS X 10.9.
102
- * **Ubuntu:** Ruby is not preinstalled. To install Ruby 1.9.3: `sudo apt-get install ruby1.9.1` (sic)
101
+ * **Ubuntu:** Ruby is not preinstalled. To install Ruby 2.7: `sudo apt-get install ruby2.7`
103
102
  ([Interested in a package?](https://github.com/benjaminoakes/maid/issues/3))
104
103
 
105
104
  Then, you can install via RubyGems. Open a terminal and run:
@@ -137,7 +136,7 @@ For example, this is a rule:
137
136
  Maid.rules do
138
137
  rule 'Old files downloaded while developing/testing' do
139
138
  dir('~/Downloads/*').each do |path|
140
- if downloaded_from(path).any? {|u| u.match 'http://localhost'} && 1.week.since?(last_accessed(path))
139
+ if downloaded_from(path).any? {|u| u.match 'http://localhost'} && 1.week.since?(accessed_at(path))
141
140
  trash(path)
142
141
  end
143
142
  end
data/Vagrantfile CHANGED
@@ -3,8 +3,7 @@
3
3
 
4
4
  Vagrant.configure('2') do |config|
5
5
  # See also: `script/vagrant-test`, `script/vagrant-test-all`
6
- config.vm.box = ENV['MAID_TARGET_BOX'] || 'precise64'
7
- config.vm.box_url = 'http://files.vagrantup.com/precise64.box' if 'precise64' == config.vm.box
6
+ config.vm.box = ENV['MAID_TARGET_BOX'] || 'hashicorp/precise64'
8
7
 
9
8
  config.vm.provider :virtualbox do |vb|
10
9
  # Maid has very low system requirements
data/lib/maid/app.rb CHANGED
@@ -93,6 +93,27 @@ EOF
93
93
  maid.daemonize
94
94
  end
95
95
 
96
+ desc 'logs', 'Manages logs written by maid'
97
+ method_option :path, :type => :boolean, :aliases => %w(-p)
98
+ method_option :tail, :type => :boolean, :aliases => %w(-t)
99
+ def logs
100
+ maid = Maid::Maid.new(maid_options(options))
101
+
102
+ if options.path?
103
+ say maid.log_device
104
+ else
105
+ unless File.readable?(maid.log_device)
106
+ error "Log file #{maid.log_device} does not exist."
107
+ else
108
+ if options.tail?
109
+ system("tail -f #{maid.log_device}")
110
+ else
111
+ say `tail #{maid.log_device}`
112
+ end
113
+ end
114
+ end
115
+ end
116
+
96
117
  no_tasks do
97
118
  def maid_options(options)
98
119
  h = {}
data/lib/maid/maid.rb CHANGED
@@ -89,8 +89,8 @@ class Maid::Maid
89
89
  @watches << ::Maid::Watch.new(self, path, options, &rules)
90
90
  end
91
91
 
92
- def repeat(timestring, &rules)
93
- @repeats << ::Maid::Repeat.new(self, timestring, &rules)
92
+ def repeat(timestring, options = {}, &rules)
93
+ @repeats << ::Maid::Repeat.new(self, timestring, options, &rules)
94
94
  end
95
95
 
96
96
  # Daemonizes the process by starting all watches and repeats and joining
data/lib/maid/repeat.rb CHANGED
@@ -4,17 +4,18 @@ class Maid::Repeat
4
4
 
5
5
  attr_reader :timestring, :scheduler, :logger
6
6
 
7
- def initialize(maid, timestring, &rules)
7
+ def initialize(maid, timestring, options = {}, &rules)
8
8
  @maid = maid
9
9
  @logger = maid.logger # TODO: Maybe it's better to create seperate loggers?
10
10
  @scheduler = Rufus::Scheduler.singleton
11
11
  @timestring = timestring
12
+ @options = options
12
13
  initialize_rules(&rules)
13
14
  end
14
15
 
15
16
  def run
16
17
  unless rules.empty?
17
- @scheduler.repeat(timestring) { follow_rules }
18
+ @scheduler.repeat(timestring, @options) { follow_rules }
18
19
  end
19
20
  end
20
21
 
@@ -40,7 +40,7 @@ Maid.rules do
40
40
 
41
41
  rule 'Mac OS X applications in zip files' do
42
42
  found = dir('~/Downloads/*.zip').select { |path|
43
- zipfile_contents(path).any? { |c| c.match(/\.app$/) }
43
+ zipfile_contents(path).any? { |c| c.match(/\.app\/Contents\//) }
44
44
  }
45
45
 
46
46
  trash(found)
data/lib/maid/tools.rb CHANGED
@@ -3,7 +3,7 @@ require 'find'
3
3
  require 'fileutils'
4
4
  require 'time'
5
5
 
6
- require 'exifr'
6
+ require 'exifr/jpeg'
7
7
  require 'geocoder'
8
8
  require 'mime/types'
9
9
  require 'dimensions'
@@ -39,16 +39,16 @@ module Maid::Tools
39
39
  # move(['~/Downloads/foo.zip', '~/Downloads/bar.zip'], '~/Archive/Software/Mac OS X/')
40
40
  # move(dir('~/Downloads/*.zip'), '~/Archive/Software/Mac OS X/')
41
41
  def move(sources, destination)
42
- destination = expand(destination)
42
+ expanded_destination = expand(destination)
43
43
 
44
- if File.directory?(destination)
44
+ if File.directory?(expanded_destination)
45
45
  expand_all(sources).each do |source|
46
- log("move #{ sh_escape(source) } #{ sh_escape(destination) }")
47
- FileUtils.mv(source, destination, @file_options)
46
+ log("move #{ sh_escape(source) } #{ sh_escape(expanded_destination) }")
47
+ FileUtils.mv(source, expanded_destination, @file_options)
48
48
  end
49
49
  else
50
50
  # Unix `mv` warns about the target not being a directory with multiple sources. Maid checks the same.
51
- warn("skipping move because #{ sh_escape(destination) } is not a directory (use 'mkdir' to create first, or use 'rename')")
51
+ warn("skipping move because #{ sh_escape(expanded_destination) } is not a directory (use 'mkdir' to create first, or use 'rename')")
52
52
  end
53
53
  end
54
54
 
@@ -456,7 +456,7 @@ module Maid::Tools
456
456
  gps = EXIFR::JPEG.new(path).gps
457
457
  coordinates_string = [gps.latitude, gps.longitude]
458
458
  location = Geocoder.search(coordinates_string).first
459
- [location.city, location.province, location.country_code].join(', ')
459
+ [location.city, location.province, location.country_code.upcase].join(', ')
460
460
  end
461
461
  end
462
462
 
data/lib/maid/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Maid
2
- VERSION = '0.8.0.alpha.4'
2
+ VERSION = '0.9.0.alpha.2'
3
3
  SUMMARY = 'Be lazy. Let Maid clean up after you, based on rules you define. Think of it as "Hazel for hackers".'
4
4
  end
data/maid.gemspec CHANGED
@@ -15,43 +15,44 @@ Gem::Specification.new do |s|
15
15
 
16
16
  s.rubyforge_project = 'maid'
17
17
 
18
- s.required_ruby_version = '>= 1.9.3'
18
+ s.required_ruby_version = '>= 2.7.0'
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', '< 1.0.0')
22
+ s.add_dependency('thor', '~> 1.2.1')
23
23
  s.add_dependency('deprecated', '~> 3.0.0')
24
24
  s.add_dependency('dimensions', '>= 1.0.0', '< 2.0')
25
- s.add_dependency('mime-types', '~> 2.0')
26
- s.add_dependency('rubyzip', '~> 1.1.0')
25
+ s.add_dependency('mime-types', '~> 3.0', '< 4.0')
26
+ s.add_dependency('rubyzip', '~> 2.3.2')
27
27
  s.add_dependency('xdg', '~> 2.2.3') # previous versions had bugs
28
- s.add_dependency('listen', '>= 2.8.0', '< 3.1.0')
29
- s.add_dependency('rufus-scheduler', '>= 3.0.6', '< 3.2.0')
30
- s.add_dependency('exifr', '~> 1.2.0')
31
- s.add_dependency('geocoder', '~> 1.2.0')
32
-
28
+ s.add_dependency('listen', '~> 3.8.0')
29
+ s.add_dependency('rufus-scheduler', '~> 3.8.2')
30
+ s.add_dependency('exifr', '~> 1.3.10')
31
+ s.add_dependency('geocoder', '~> 1.8.1')
32
+
33
33
  # TODO: use one of these two gems instead of `mdfind`. **But** They have to work on Linux as well.
34
34
  #
35
35
  # s.add_dependency('mac-spotlight', '~> 0.0.4')
36
36
  # s.add_dependency('spotlight', '~> 0.0.6')
37
37
 
38
38
  # Strategy: specific versions (since they're just for development)
39
- s.add_development_dependency('fakefs', '~> 0.4.3')
39
+ s.add_development_dependency('fakefs', '~> 2.4.0')
40
40
  s.add_development_dependency('guard', '~> 2.12.5')
41
41
  s.add_development_dependency('guard-rspec', '~> 4.6.2')
42
- s.add_development_dependency('rake', '~> 10.4.2')
43
- s.add_development_dependency('redcarpet', '~> 3.3.2') # Soft dependency of `yard`
44
- s.add_development_dependency('rspec', '~> 3.3.0')
45
- s.add_development_dependency('timecop', '~> 0.7.0')
46
- s.add_development_dependency('yard', '~> 0.8.4')
42
+ s.add_development_dependency('rake', '~> 13.0.6')
43
+ s.add_development_dependency('redcarpet', '~> 3.6.0') # Soft dependency of `yard`
44
+ s.add_development_dependency('rspec', '~> 3.12.0')
45
+ s.add_development_dependency('timecop', '~> 0.9.6')
46
+ s.add_development_dependency('yard', '>= 0.9.11')
47
+ s.add_development_dependency('pry-byebug')
47
48
 
48
49
  # In Vagrant, polling won't cross over the OS boundary if you develop in the host OS but run your tests in the
49
50
  # guest. One way around this is to force polling instead:
50
51
  #
51
52
  # bundle exec guard --force-polling
52
53
  #
53
- s.add_development_dependency('rb-inotify', '~> 0.9.0')
54
- s.add_development_dependency('rb-fsevent', '~> 0.9.2')
54
+ s.add_development_dependency('rb-inotify', '~> 0.10.1')
55
+ s.add_development_dependency('rb-fsevent', '~> 0.11.2')
55
56
 
56
57
  s.files = `git ls-files -z`.split("\0")
57
58
  s.test_files = `git ls-files -z -- {test,spec,features}/*`.split("\0")
@@ -28,7 +28,7 @@
28
28
  # * [Vagrant Boxes List](http://www.vagrantbox.es/)
29
29
  # * [Contributing Guide](https://github.com/benjaminoakes/maid/wiki/Contributing)
30
30
 
31
- MAID_TARGET_BOX='precise32' MAID_TARGET_RUBY='1.9.3' script/vagrant-test
32
- MAID_TARGET_BOX='precise64' MAID_TARGET_RUBY='1.9.3' script/vagrant-test
31
+ MAID_TARGET_BOX='hashicorp/precise32' MAID_TARGET_RUBY='1.9.3' script/vagrant-test
32
+ MAID_TARGET_BOX='hashicorp/precise64' MAID_TARGET_RUBY='1.9.3' script/vagrant-test
33
33
  # TODO: Locate and add box for `saucy32`
34
34
  # TODO: Locate and add box for `saucy64`
@@ -1,5 +1,5 @@
1
1
  require 'dimensions'
2
- require 'exifr'
2
+ require 'exifr/jpeg'
3
3
  require 'logger'
4
4
  require 'geocoder'
5
5
  require 'mime/types'
@@ -1,25 +1,26 @@
1
1
  require 'spec_helper'
2
2
  require 'stringio'
3
3
 
4
+ def capture_stdout
5
+ out = StringIO.new
6
+ $stdout = out
7
+ yield
8
+ out.string
9
+ ensure
10
+ $stdout = STDOUT
11
+ end
12
+
13
+ def capture_stderr
14
+ out = StringIO.new
15
+ $stderr = out
16
+ yield
17
+ out.string
18
+ ensure
19
+ $stderr = STDERR
20
+ end
21
+
4
22
  module Maid
5
23
  describe App, '#clean' do
6
- def capture_stdout
7
- out = StringIO.new
8
- $stdout = out
9
- yield
10
- out.string
11
- ensure
12
- $stdout = STDOUT
13
- end
14
-
15
- def capture_stderr
16
- out = StringIO.new
17
- $stderr = out
18
- yield
19
- out.string
20
- ensure
21
- $stderr = STDERR
22
- end
23
24
 
24
25
  before do
25
26
  @app = App.new
@@ -124,4 +125,53 @@ module Maid
124
125
  expect(opts[:rules_path]).to match(/maid_rules.rb$/)
125
126
  end
126
127
  end
128
+
129
+ describe App, '#logs' do
130
+ before do
131
+ @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 }
136
+ end
137
+
138
+ describe 'prints out the log' do
139
+ before do
140
+ @log = "A maid log\nAnother log"
141
+ @log_file = Tempfile.new('maid.log')
142
+ @log_file.write(@log)
143
+ @log_file.close
144
+
145
+ @maid.stub(:log_device) { @log_file.path }
146
+ end
147
+
148
+ after do
149
+ @log_file.unlink if !@log_file.nil?
150
+ end
151
+
152
+ it 'dumps the last log entries when invoked without an option' do
153
+ expect(capture_stdout { App.start(['logs']) }).to eq("#{@log}\n")
154
+ end
155
+
156
+ it 'prints an error when log does not exist' do
157
+ @maid.stub(:log_device) { '/maid/file-does-not-exist' }
158
+ message = "Log file #{@maid.log_device} does not exist.\n"
159
+
160
+ expect(capture_stderr { App.start(['logs']) }).to eq(message)
161
+ end
162
+
163
+ it 'does not tail when log does not exist' do
164
+ @maid.stub(:log_device) { '/maid/file-does-not-exist' }
165
+ message = "Log file #{@maid.log_device} does not exist.\n"
166
+
167
+ expect(capture_stderr { App.start(['logs', '--tail']) }).to eq(message)
168
+ end
169
+ end
170
+
171
+ it 'prints out the log path' do
172
+ ['--path', '-p'].each do |option|
173
+ expect(capture_stdout { App.start(['logs', option]) }).to eq("/var/log/maid.log\n")
174
+ end
175
+ end
176
+ end
127
177
  end
@@ -231,6 +231,21 @@ module Maid
231
231
  expect(@maid.repeats.length).to eq(1)
232
232
  expect(@maid.repeats.first.timestring).to eq('1s')
233
233
  end
234
+
235
+ it 'accepts a hash of options and passes them to Rufus' do
236
+ scheduler = double('scheduler')
237
+ expect(Rufus::Scheduler).to receive(:singleton).and_return(scheduler)
238
+
239
+ hash = { :some => :options }
240
+ @maid.repeat('1s', hash) do
241
+ rule 'test' do
242
+ end
243
+ end
244
+
245
+ expect(scheduler).to receive(:repeat).with('1s', hash)
246
+
247
+ @maid.repeats.last.run
248
+ end
234
249
  end
235
250
 
236
251
  describe '#follow_rules' do