sidekiq-unique-jobs 5.0.11 → 6.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq-unique-jobs might be problematic. Click here for more details.

Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +17 -9
  3. data/.gitignore +1 -3
  4. data/.reek +105 -0
  5. data/.rubocop.yml +36 -1
  6. data/.simplecov +7 -2
  7. data/.travis.yml +11 -10
  8. data/Appraisals +3 -7
  9. data/CHANGELOG.md +17 -0
  10. data/Gemfile +16 -13
  11. data/Guardfile +55 -0
  12. data/README.md +85 -73
  13. data/examples/another_unique_job.rb +13 -0
  14. data/examples/custom_queue_job.rb +12 -0
  15. data/examples/custom_queue_job_with_filter_method.rb +13 -0
  16. data/examples/custom_queue_job_with_filter_proc.rb +16 -0
  17. data/examples/expiring_job.rb +12 -0
  18. data/examples/inline_worker.rb +12 -0
  19. data/examples/just_a_worker.rb +13 -0
  20. data/examples/long_running_job.rb +12 -0
  21. data/examples/main_job.rb +13 -0
  22. data/examples/my_job.rb +12 -0
  23. data/examples/my_unique_job.rb +16 -0
  24. data/examples/my_unique_job_with_filter_method.rb +21 -0
  25. data/examples/my_unique_job_with_filter_proc.rb +19 -0
  26. data/examples/notify_worker.rb +14 -0
  27. data/examples/plain_class.rb +13 -0
  28. data/examples/simple_worker.rb +15 -0
  29. data/examples/spawn_simple_worker.rb +12 -0
  30. data/examples/test_class.rb +9 -0
  31. data/examples/unique_across_workers_job.rb +20 -0
  32. data/examples/unique_job_with_conditional_parameter.rb +18 -0
  33. data/examples/unique_job_with_filter_method.rb +18 -0
  34. data/examples/unique_job_with_nil_unique_args.rb +20 -0
  35. data/examples/unique_job_with_no_unique_args_method.rb +16 -0
  36. data/examples/unique_job_withthout_unique_args_parameter.rb +18 -0
  37. data/examples/unique_on_all_queues_job.rb +16 -0
  38. data/examples/until_and_while_executing_job.rb +13 -0
  39. data/examples/until_executed_2_job.rb +24 -0
  40. data/examples/until_executed_job.rb +25 -0
  41. data/examples/until_executing_job.rb +11 -0
  42. data/examples/until_expired_job.rb +12 -0
  43. data/examples/until_global_expired_job.rb +12 -0
  44. data/examples/while_executing_job.rb +15 -0
  45. data/examples/while_executing_reject_job.rb +14 -0
  46. data/examples/without_argument_job.rb +13 -0
  47. data/lib/sidekiq-unique-jobs.rb +1 -91
  48. data/lib/sidekiq/simulator.rb +15 -16
  49. data/lib/sidekiq_unique_jobs.rb +79 -0
  50. data/lib/sidekiq_unique_jobs/cli.rb +9 -18
  51. data/lib/sidekiq_unique_jobs/client/middleware.rb +16 -18
  52. data/lib/sidekiq_unique_jobs/connection.rb +18 -0
  53. data/lib/sidekiq_unique_jobs/constants.rb +13 -17
  54. data/lib/sidekiq_unique_jobs/core_ext.rb +28 -55
  55. data/lib/sidekiq_unique_jobs/exceptions.rb +30 -0
  56. data/lib/sidekiq_unique_jobs/lock/base_lock.rb +84 -0
  57. data/lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb +11 -6
  58. data/lib/sidekiq_unique_jobs/lock/until_executed.rb +6 -58
  59. data/lib/sidekiq_unique_jobs/lock/until_executing.rb +6 -5
  60. data/lib/sidekiq_unique_jobs/lock/until_expired.rb +17 -0
  61. data/lib/sidekiq_unique_jobs/lock/while_executing.rb +20 -34
  62. data/lib/sidekiq_unique_jobs/lock/while_executing_reject.rb +78 -0
  63. data/lib/sidekiq_unique_jobs/lock/while_executing_requeue.rb +20 -0
  64. data/lib/sidekiq_unique_jobs/locksmith.rb +149 -0
  65. data/lib/sidekiq_unique_jobs/logging.rb +30 -0
  66. data/lib/sidekiq_unique_jobs/options_with_fallback.rb +27 -41
  67. data/lib/sidekiq_unique_jobs/scripts.rb +25 -24
  68. data/lib/sidekiq_unique_jobs/server/middleware.rb +12 -20
  69. data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +5 -5
  70. data/lib/sidekiq_unique_jobs/sidekiq_worker_methods.rb +42 -0
  71. data/lib/sidekiq_unique_jobs/testing.rb +40 -50
  72. data/lib/sidekiq_unique_jobs/timeout.rb +15 -0
  73. data/lib/sidekiq_unique_jobs/timeout/calculator.rb +49 -0
  74. data/lib/sidekiq_unique_jobs/unique_args.rb +33 -77
  75. data/lib/sidekiq_unique_jobs/unlockable.rb +5 -14
  76. data/lib/sidekiq_unique_jobs/util.rb +28 -90
  77. data/lib/sidekiq_unique_jobs/version.rb +1 -1
  78. data/redis/acquire_lock.lua +5 -3
  79. data/redis/create.lua +58 -0
  80. data/redis/delete.lua +11 -0
  81. data/redis/release_stale_locks.lua +90 -0
  82. data/redis/signal.lua +21 -0
  83. data/sidekiq-unique-jobs.gemspec +15 -8
  84. metadata +108 -32
  85. data/lib/sidekiq_unique_jobs/config.rb +0 -17
  86. data/lib/sidekiq_unique_jobs/lock.rb +0 -12
  87. data/lib/sidekiq_unique_jobs/lock/until_timeout.rb +0 -17
  88. data/lib/sidekiq_unique_jobs/run_lock_failed.rb +0 -3
  89. data/lib/sidekiq_unique_jobs/script_mock.rb +0 -66
  90. data/lib/sidekiq_unique_jobs/scripts/acquire_lock.rb +0 -47
  91. data/lib/sidekiq_unique_jobs/scripts/release_lock.rb +0 -49
  92. data/lib/sidekiq_unique_jobs/testing/sidekiq_overrides.rb +0 -50
  93. data/lib/sidekiq_unique_jobs/timeout_calculator.rb +0 -67
  94. data/redis/synchronize.lua +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87c40a03b7114fd7c5b1c56ceaaf8f4d96b19939bd06f0b76e0c3ce088e34ee1
4
- data.tar.gz: 7b41fc69c8cd77117a56beb1d15a17b523f4bff7a742317735cfcc28cda121de
3
+ metadata.gz: 2df5975505fc4b3764d2cdd9dd64ecc9f3be6c553d88c3a15c7c5393acc6c4a0
4
+ data.tar.gz: ad888ea1fc3c717c91975b79f5105d186384b21b534e96ce2a13b474e0b5201b
5
5
  SHA512:
6
- metadata.gz: 78dbf85901350c5b9e9e10889b25de771ef1c9757ac1e9a3565bc7b447501d0505770a3e9befda2242f855319c373777fee01e9c92c37bf1facdbeac87cb052e
7
- data.tar.gz: ae243b12f6a0b4db056f474584e53017076226a93e87cc9fd45f7525f7e4a0e44da076a5725895405a3f6db6588578664cd0bc3fba746f139bb0ff65aba8f565
6
+ metadata.gz: a7161efd989f5c27e95a9a3f0b7943b245ed4448e7584f568210ed81fc0ef2f816750c34336e38e612c73486d6749935907c3ff3931c2530f871e0b406339e36
7
+ data.tar.gz: 17d7880b7856baee9e474b68c57edab8966e7f16599b0c08250949996d46ef5f22e665a32e625f3b69be03687beb1f63f30ee24662e9f26b9e43904e7a6e23fd
data/.codeclimate.yml CHANGED
@@ -1,22 +1,30 @@
1
1
  ---
2
- engines:
2
+ version: '2'
3
+ plugins:
3
4
  bundler-audit:
4
5
  enabled: false
5
- fixme:
6
- enabled: true
7
6
  duplication:
8
7
  enabled: true
9
8
  config:
10
9
  languages:
11
10
  - ruby
11
+ # editorconfig:
12
+ # enabled: true
13
+ # channel: beta
14
+ # config:
15
+ # editorconfig: .editorconfig
16
+ flog:
17
+ enabled: true
18
+ fixme:
19
+ enabled: true
20
+ markdownlint:
21
+ enabled: true
22
+ reek:
23
+ enabled: true
12
24
  rubocop:
13
25
  enabled: true
14
- ratings:
15
- paths:
16
- - lib/**
17
- - bin/**
18
- - "**.rb"
19
- exclude_paths:
26
+ channel: rubocop-0-54
27
+ exclude_patterns:
20
28
  - Gemfile
21
29
  - "*.gemspec"
22
30
  - Appraisals
data/.gitignore CHANGED
@@ -17,8 +17,6 @@ rails_example/spec/examples.txt
17
17
 
18
18
  /sidekiq/
19
19
 
20
- /spec/examples.txt
20
+ .rspec_status
21
21
 
22
22
  /gemfiles/.bundle/
23
-
24
- /.rspec_status
data/.reek ADDED
@@ -0,0 +1,105 @@
1
+ ---
2
+ exclude_paths:
3
+ - rails_example
4
+ - redis
5
+ - spec
6
+ - tmp
7
+ - gemfiles
8
+ - examples
9
+ DuplicateMethodCall:
10
+ exclude:
11
+ - Sidekiq#self.use_options
12
+ IrresponsibleModule:
13
+ exclude:
14
+ - Sidekiq::Simulator
15
+ - SidekiqUniqueJobs::Cli
16
+ - SidekiqUniqueJobs::Client::Middleware
17
+ - SidekiqUniqueJobs
18
+ - Array
19
+ - Hash
20
+ - SidekiqUniqueJobs::JidMissing
21
+ - SidekiqUniqueJobs::LockTimeout
22
+ - SidekiqUniqueJobs::MaxLockTimeMissing
23
+ - SidekiqUniqueJobs::RunLockFailed
24
+ - SidekiqUniqueJobs::ScriptError
25
+ - SidekiqUniqueJobs::UnexpectedValue
26
+ - SidekiqUniqueJobs::UniqueKeyMissing
27
+ - SidekiqUniqueJobs::UnknownLock
28
+ - SidekiqUniqueJobs::Lock::BaseLock
29
+ - SidekiqUniqueJobs::Lock::UntilAndWhileExecuting
30
+ - SidekiqUniqueJobs::Lock::UntilExecuted
31
+ - SidekiqUniqueJobs::Lock::UntilExecuting
32
+ - SidekiqUniqueJobs::Lock::UntilExpired
33
+ - SidekiqUniqueJobs::Lock::WhileExecuting
34
+ - SidekiqUniqueJobs::Lock::WhileExecutingReject
35
+ - SidekiqUniqueJobs::Lock::WhileExecutingRequeue
36
+ - SidekiqUniqueJobs::Locksmith
37
+ - SidekiqUniqueJobs::Middleware
38
+ - SidekiqUniqueJobs::Normalizer
39
+ - SidekiqUniqueJobs::Scripts
40
+ - SidekiqUniqueJobs::Server::Middleware
41
+ - Sidekiq::Job
42
+ - Sidekiq::Job::UniqueExtension
43
+ - Sidekiq::JobSet
44
+ - Sidekiq::JobSet::UniqueExtension
45
+ - Sidekiq::Queue
46
+ - Sidekiq::Queue::UniqueExtension
47
+ - Sidekiq::ScheduledSet
48
+ - Sidekiq::ScheduledSet::UniqueExtension
49
+ - Sidekiq::SortedEntry
50
+ - Sidekiq::SortedEntry::UniqueExtension
51
+ - Sidekiq
52
+ - Sidekiq::Worker
53
+ - Sidekiq::Worker::ClassMethods
54
+ - Sidekiq::Worker::Overrides
55
+ - Sidekiq::Worker::Overrides::Testing
56
+ - SidekiqUniqueJobs::Timeout::Calculator
57
+ - SidekiqUniqueJobs::Timeout
58
+ - SidekiqUniqueJobs::Unlockable
59
+ - SidekiqUniqueJobs::Util
60
+ TooManyStatements:
61
+ exclude:
62
+ - initialize
63
+ - Hash#slice!
64
+ - SidekiqUniqueJobs::Middleware#configure_server_middleware
65
+ - SidekiqUniqueJobs::Server::Middleware#call
66
+ - SidekiqUniqueJobs::UniqueArgs#filtered_args
67
+ - SidekiqUniqueJobs::Util#del
68
+ UncommunicativeVariableName:
69
+ exclude:
70
+ - Hash#slice
71
+ BooleanParameter:
72
+ exclude:
73
+ - SidekiqUniqueJobs::Cli#self.banner
74
+ UtilityFunction:
75
+ enabled: false
76
+ TooManyConstants:
77
+ exclude:
78
+ - SidekiqUniqueJobs
79
+ ManualDispatch:
80
+ enabled: true
81
+ exclude:
82
+ - Hash#slice
83
+ - Hash#slice!
84
+ - SidekiqUniqueJobs::Lock::WhileExecutingReject#deadset_kill?
85
+ - SidekiqUniqueJobs::SidekiqWorkerMethods#worker_method_defined?
86
+ PrimaDonnaMethod:
87
+ exclude:
88
+ - Array
89
+ NilCheck:
90
+ enabled: false
91
+ FeatureEnvy:
92
+ exclude:
93
+ - SidekiqUniqueJobs::Lock::WhileExecutingReject#push_to_deadset
94
+ - SidekiqUniqueJobs::Util#batch_delete
95
+ NestedIterators:
96
+ exclude:
97
+ - SidekiqUniqueJobs::Middleware#configure_client_middleware
98
+ - SidekiqUniqueJobs::Middleware#configure_server_middleware
99
+ - SidekiqUniqueJobs::Util#batch_delete
100
+ TooManyInstanceVariables:
101
+ exclude:
102
+ - SidekiqUniqueJobs::Locksmith
103
+ TooManyMethods:
104
+ exclude:
105
+ - SidekiqUniqueJobs::Locksmith
data/.rubocop.yml CHANGED
@@ -1,9 +1,11 @@
1
+ require: rubocop-rspec
1
2
  AllCops:
2
3
  Include:
3
4
  - '**/Rakefile'
4
5
  - 'lib/**/*.rb'
5
6
  - 'bin/**/*.rb'
6
7
  - 'spec/**/*.rb'
8
+ - 'examples/**/*.rb'
7
9
  Exclude:
8
10
  - 'Gemfile.lock'
9
11
  - 'gemfiles/**/*'
@@ -30,7 +32,7 @@ Metrics/MethodLength:
30
32
  Metrics/BlockLength:
31
33
  Enabled: true
32
34
  Exclude:
33
- - '**/spec/**/*_spec.rb'
35
+ - '**/spec/**/*.rb'
34
36
 
35
37
  Metrics/PerceivedComplexity:
36
38
  Max: 8
@@ -49,12 +51,45 @@ Naming/FileName:
49
51
  - '**/Appraisals'
50
52
  - '**/*.gemspec'
51
53
 
54
+ Naming/UncommunicativeMethodParamName:
55
+ AllowedNames:
56
+ - ex
57
+
58
+ RSpec/DescribeClass:
59
+ Enabled: false
60
+
61
+ RSpec/ExampleLength:
62
+ Enabled: false
63
+
64
+ RSpec/ExpectActual:
65
+ Enabled: false
66
+
67
+ RSpec/ExpectInHook:
68
+ Enabled: false
69
+
70
+ RSpec/MessageSpies:
71
+ Enabled: false
72
+
73
+ RSpec/MultipleExpectations:
74
+ Enabled: false
75
+
76
+ RSpec/NestedGroups:
77
+ Max: 4
78
+ Enabled: true
79
+
80
+ RSpec/RepeatedExample:
81
+ Enabled: false
82
+
52
83
  Style/FrozenStringLiteralComment:
53
84
  Enabled: true
54
85
 
55
86
  Style/Documentation:
56
87
  Enabled: false
57
88
 
89
+ Style/SignalException:
90
+ EnforcedStyle: only_fail
91
+ Enabled: false
92
+
58
93
  Style/GlobalVars:
59
94
  Enabled: true
60
95
 
data/.simplecov CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'simplecov-json'
2
- require 'codeclimate-test-reporter'
3
2
 
4
- SimpleCov.command_name 'rspec'
3
+ SimpleCov.command_name 'RSpec'
5
4
  # SimpleCov.refuse_coverage_drop
6
5
  SimpleCov.formatters = [
7
6
  SimpleCov::Formatter::HTMLFormatter,
@@ -12,4 +11,10 @@ SimpleCov.start do
12
11
  add_filter '/spec/'
13
12
  add_filter '/bin/'
14
13
  add_filter '/gemfiles/'
14
+ add_filter '/examples/'
15
+
16
+ add_group 'Client', 'lib/sidekiq_unique_jobs/client'
17
+ add_group 'Locks', 'lib/sidekiq_unique_jobs/lock'
18
+ add_group 'Server', 'lib/sidekiq_unique_jobs/server'
19
+ add_group 'Timeout', 'lib/sidekiq_unique_jobs/timeout'
15
20
  end
data/.travis.yml CHANGED
@@ -8,29 +8,31 @@ dist: trusty
8
8
  sudo: required
9
9
  language: ruby
10
10
  cache: bundler
11
- services:
12
- - redis-server
13
11
 
14
12
  before_install:
13
+ - sudo rm -rf /etc/apt/sources.list.d/rwky-redis.list
14
+ - sudo add-apt-repository ppa:chris-lea/redis-server -y
15
+ - sudo apt-get update -qy
16
+ - sudo apt-get install redis-server
17
+ - sudo service redis-server start
18
+ before_script:
15
19
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
16
20
  - chmod +x ./cc-test-reporter
17
- before_script:
18
21
  - ./cc-test-reporter before-build
19
22
  script:
20
23
  - if [[ "${COV}" = "true" ]]; then bundle exec rubocop -P; fi;
21
- - bundle exec rspec
22
- after_script:
24
+ - bundle exec rspec spec
23
25
  - if [[ "${COV}" = "true" ]]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi;
26
+
24
27
  rvm:
25
- - 2.5.3
28
+ - 2.5.1
26
29
  - 2.4.2
27
30
  - 2.3.2
28
- - 2.2.7
29
- - jruby-9.2.0.0
31
+ - jruby-9.1.15.0
30
32
  matrix:
31
33
  fast_finish: true
32
34
  include:
33
- - rvm: 2.5.3
35
+ - rvm: 2.5.1
34
36
  gemfile: gemfiles/sidekiq_develop.gemfile
35
37
  env: COV=true
36
38
  gemfile:
@@ -40,7 +42,6 @@ gemfile:
40
42
  - gemfiles/sidekiq_4.2.gemfile
41
43
  - gemfiles/sidekiq_5.0.gemfile
42
44
  - gemfiles/sidekiq_5.1.gemfile
43
- - gemfiles/sidekiq_5.2.gemfile
44
45
 
45
46
  notifications:
46
47
  email:
data/Appraisals CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  appraise 'sidekiq-develop' do
4
- gem 'sidekiq', github: 'mperham/sidekiq'
4
+ gem 'sidekiq', git: 'https://github.com/mperham/sidekiq.git'
5
5
  end
6
6
 
7
7
  appraise 'sidekiq-4.0' do
@@ -17,13 +17,9 @@ appraise 'sidekiq-4.2' do
17
17
  end
18
18
 
19
19
  appraise 'sidekiq-5.0' do
20
- gem 'sidekiq', '>= 5.0.0', '< 5.1'
20
+ gem 'sidekiq', '~> 5.0.0'
21
21
  end
22
22
 
23
23
  appraise 'sidekiq-5.1' do
24
- gem 'sidekiq', '>= 5.1.0', '< 5.2'
25
- end
26
-
27
- appraise 'sidekiq-5.2' do
28
- gem 'sidekiq', '>= 5.2.0', '< 6'
24
+ gem 'sidekiq', '~> 5.1.0'
29
25
  end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## v6.0.0
2
+
3
+ - Complete rewrite of the locking mechanism
4
+ - Improved README
5
+ - Improved reliability
6
+ - Improved coverage
7
+ - Removed a ton of default configuration
8
+ - Removed support for ActiveJob
9
+ - Added WhileExecutingReject `unique: :while_executing_reject`
10
+ - Renamed `UntilTimeout` to `UntilExpired`
11
+ - Removed concurrency for now (a0cff5bc42edbe7190d6ede7e7f845074d2d7af6)
12
+ - Improved integration testing for locks
13
+
14
+ ## v5.1.0
15
+
16
+ - Refactoring the runtime locks (WhileExecuting)
17
+
1
18
  ## v5.0.10
2
19
 
3
20
  - Cleans up test setup and make tests more readable
data/Gemfile CHANGED
@@ -3,19 +3,22 @@
3
3
  source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
- gem 'appraisal', '>= 2.0.0'
7
- gem 'rspec-its', require: false
8
- gem 'rspec-wait', require: false
6
+ gem 'appraisal', '~> 2.2.0'
7
+ gem 'rspec-its', require: false
8
+ gem 'rspec-retry', require: false
9
+ gem 'rspec-eventually', require: false
9
10
 
10
11
  platforms :mri_25 do
11
- gem 'benchmark-ips', require: false
12
- gem 'codeclimate-test-reporter', '>= 1.0.8', require: false
13
- gem 'fasterer', require: false
14
- gem 'memory_profiler', require: false
15
- gem 'mock_redis', require: false
16
- gem 'pry-byebug', require: false
17
- gem 'rubocop', require: false
18
- gem 'simplecov', '>= 0.13', require: false
19
- gem 'simplecov-json', require: false
20
- gem 'travis', require: false
12
+ gem 'benchmark-ips', require: false
13
+ gem 'fasterer', require: false
14
+ gem 'guard', require: false
15
+ gem 'guard-reek', require: false
16
+ gem 'guard-rspec', require: false
17
+ gem 'guard-rubocop', require: false
18
+ gem 'memory_profiler', require: false
19
+ gem 'pry-byebug', require: false
20
+ gem 'rubocop', require: false
21
+ gem 'rubocop-rspec', require: false
22
+ gem 'simplecov-json', require: false
23
+ gem 'travis', require: false
21
24
  end
data/Guardfile ADDED
@@ -0,0 +1,55 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ # Note: The cmd option is now required due to the increasing number of ways
19
+ # rspec may be run, below are examples of the most common uses.
20
+ # * bundler: 'bundle exec rspec'
21
+ # * bundler binstubs: 'bin/rspec'
22
+ # * spring: 'bin/rspec' (This will use spring if running and you have
23
+ # installed the spring binstubs per the docs)
24
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
25
+ # * 'just' rspec: 'rspec'
26
+
27
+ guard :rspec, cmd: "env COV=false bundle exec rspec" do
28
+ require "guard/rspec/dsl"
29
+ dsl = Guard::RSpec::Dsl.new(self)
30
+
31
+ # Feel free to open issues for suggestions and improvements
32
+
33
+ # RSpec files
34
+ rspec = dsl.rspec
35
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
36
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/integration/#{m[1]}_spec.rb" }
37
+ watch(%r{^examples/(.+)\.rb$}) { |m| "spec/examples/#{m[1]}_spec.rb" }
38
+ watch(rspec.spec_helper) { rspec.spec_dir }
39
+ watch(rspec.spec_support) { rspec.spec_dir }
40
+ watch(rspec.spec_files)
41
+
42
+ # Ruby files
43
+ ruby = dsl.ruby
44
+ dsl.watch_spec_files_for(ruby.lib_files)
45
+ end
46
+
47
+ guard :rubocop do
48
+ watch(%r{.+\.rb$})
49
+ watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
50
+ end
51
+
52
+ guard 'reek' do
53
+ watch(%r{.+\.rb$})
54
+ watch('.reek')
55
+ end