isolator 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3330be0a90b276b54420aa7a44a79417cacb5c55edb2fc59bc1f6fa85774d5d3
4
- data.tar.gz: d97281da4ea2e8f8cfb92703035b76e1e47969477fb1f462c9f382183439ce7d
3
+ metadata.gz: 1f375e040a8810bf83286b3bd78172a5b3e17504c21dc71d74dcc09b6313427d
4
+ data.tar.gz: faf57a3cc344a2fb889cc0ba87a1b47b33514330247b5d44574cf765e763c451
5
5
  SHA512:
6
- metadata.gz: 7e74da7cd7c11f149b3e2d80f1b23ea6ee605de8219d9ae54576019bb42ef010f53f185e648dae4fe1fc007e7f38d3dd2ad19b1fdf6542266ff2f03f50cc6cdd
7
- data.tar.gz: 91ab7e065521a8a0ebb001528fbf31e6df2008089b0e9f544a4c2c128278f321f652bde932d0e3c46eb79f8121289de763946f012946f57eba72ba6a027b1616
6
+ metadata.gz: 4136572ecead2ed8eaef576958c317ef2ff42d8502a9caa04c974ca1ce5e5661231c42dfa83039e81d6cca45e13926115709c61223d381e42e83bf24f8ca9395
7
+ data.tar.gz: 42de6787f0c17d7b5da48be6b465479a37b4e20e7590cafaf261edf5f0ca29a9a341d451dfb6293aacb7e9958d0e47cf3aefcd53c77c900fe5ff3e04de15de6e
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.4.0 (2018-06-15)
6
+
7
+ - [PR [#13](https://github.com/palkan/isolator/pull/13)] Allow load ignored offences from YML file using `load_ignore_config`. ([@DmitryTsepelev][])
8
+
5
9
  ## 0.3.0 (2018-04-02)
6
10
 
7
11
  - Add support for the [database_cleaner](https://github.com/DatabaseCleaner/database_cleaner) gem. ([@Envek][])
@@ -42,3 +46,4 @@
42
46
  [@TheSmartnik]: https://github.com/TheSmartnik
43
47
  [@dsalahutdinov]: https://github.com/dsalahutdinov
44
48
  [@Envek]: https://github.com/Envek
49
+ [@DmitryTsepelev]: https://github.com/DmitryTsepelev
data/README.md CHANGED
@@ -131,6 +131,10 @@ Isolator.adapters.http.disable!
131
131
  Isolator.adapters.http.enable!
132
132
  ```
133
133
 
134
+ ### Fix Offenses
135
+
136
+ For the actions that should be executed only after successful transaction commit (which is mostly always so), you can try to use the `after_commit` callback from [after_commit_everywhere] gem (or use native AR callback in models if it's applicable).
137
+
134
138
  ### Ignore Offenses
135
139
 
136
140
  Since Isolator adapter is just a wrapper over original code, it may lead to false positives when there is another library patching the same behaviour. In that case you might want to ignore some offenses.
@@ -145,6 +149,22 @@ Isolator.adapters.sidekiq.ignore_if { Thread.current[:sidekiq_postpone] }
145
149
 
146
150
  You can add as many _ignores_ as you want, the offense is registered iff all of them return false.
147
151
 
152
+ ### Using with legacy Rails codebases
153
+
154
+ If you already have a huge Rails project it can be a tricky to turn Isolator on because you'll immediately get a lot of failed specs. If you want to fix detected issues one by one, you can list all of them in the special file `.isolator_todo.yml` in a following way:
155
+
156
+ ```
157
+ sidekiq:
158
+ - app/models/user.rb:20
159
+ - app/models/sales/**/*.rb
160
+ ```
161
+
162
+ All the exceptions raised in the listed lines will be ignored.
163
+
164
+ ### Using with legacy Ruby codebases
165
+
166
+ If you are not using Rails, you'll have to load ignores from file manually, using `Isolator#load_ignore_config`, for instance `Isolator.load_ignore_config("./config/.isolator_todo.yml")`
167
+
148
168
  ## Custom Adapters
149
169
 
150
170
  An adapter is just a combination of a _method wrapper_ and lifecycle hooks.
@@ -157,10 +177,10 @@ Suppose that you have a class `Danger` with a method `#explode`, which is not sa
157
177
  #
158
178
  # The second argument is the method owner and
159
179
  # the third one is a method name.
160
- Isolotar.isolate :danger, Danger, :explode, **options
180
+ Isolator.isolate :danger, Danger, :explode, options
161
181
 
162
182
  # NOTE: if you want to isolate a class method, use signleton_class instead
163
- Isolator.isolate :danger, Danger.singleton_class, :explode, **options
183
+ Isolator.isolate :danger, Danger.singleton_class, :explode, options
164
184
  ```
165
185
 
166
186
  Possible `options` are:
@@ -189,3 +209,4 @@ The gem is available as open source under the terms of the [MIT License](http://
189
209
 
190
210
  [Sniffer]: https://github.com/aderyabin/sniffer
191
211
  [uniform_notifier]: https://github.com/flyerhzm/uniform_notifier
212
+ [after_commit_everywhere]: https://github.com/Envek/after_commit_everywhere
data/isolator.gemspec CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rspec", "~> 3.0"
28
28
  spec.add_development_dependency "rspec-rails", "~> 3.0"
29
29
  spec.add_development_dependency "minitest", "~> 5.10.0"
30
- spec.add_development_dependency "rubocop", "~> 0.51"
30
+ spec.add_development_dependency "rubocop", "~> 0.56.0"
31
31
  spec.add_development_dependency "rubocop-md", "~> 0.2"
32
32
 
33
33
  spec.add_development_dependency "uniform_notifier", "~> 1.11"
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Isolator
4
+ # Add .load_ignore_config function for ignoring patterns from file
5
+ module Ignorer
6
+ def load_ignore_config(path)
7
+ return unless File.exist?(path)
8
+
9
+ todos = YAML.load_file(path)
10
+
11
+ adapters.each do |id, adapter|
12
+ ignored_paths = todos.fetch(id, [])
13
+ configure_adapter(adapter, ignored_paths)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def configure_adapter(adapter, ignored_paths)
20
+ ignores = build_ignore_list(ignored_paths)
21
+ return if ignores.blank?
22
+
23
+ regex = Regexp.new("^.*(#{ignores.join('|')}):.*$")
24
+ adapter.ignore_if { caller.any? { |row| regex =~ row } }
25
+ end
26
+
27
+ def build_ignore_list(ignored_paths)
28
+ ignored_paths.each_with_object([]) do |path, result|
29
+ ignored_files = Dir[path]
30
+
31
+ if ignored_files.blank?
32
+ result << path.to_s
33
+ else
34
+ result.concat(ignored_files)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -5,7 +5,7 @@ module Isolator
5
5
  module Isolate
6
6
  def isolate(id, **options)
7
7
  raise "Adapter already registered: #{id}" if Isolator.adapters.key?(id.to_s)
8
- adapter = AdapterBuilder.call(**options)
8
+ adapter = AdapterBuilder.call(options)
9
9
  Isolator.adapters[id.to_s] = adapter
10
10
  end
11
11
  end
@@ -7,6 +7,8 @@ module Isolator
7
7
  # (when all deps are likely to be loaded).
8
8
  load File.join(__dir__, "adapters.rb")
9
9
 
10
+ Isolator.load_ignore_config(Rails.root.join(".isolator_todo.yml"))
11
+
10
12
  next unless Rails.env.test?
11
13
 
12
14
  if defined?(::ActiveRecord::TestFixtures)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Isolator
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/isolator.rb CHANGED
@@ -6,6 +6,7 @@ require "isolator/adapter_builder"
6
6
  require "isolator/notifier"
7
7
  require "isolator/errors"
8
8
  require "isolator/simple_hashie"
9
+ require "isolator/ignorer"
9
10
 
10
11
  require "isolator/callbacks"
11
12
  require "isolator/isolate"
@@ -105,6 +106,7 @@ module Isolator
105
106
 
106
107
  include Isolator::Isolate
107
108
  include Isolator::Callbacks
109
+ include Isolator::Ignorer
108
110
  end
109
111
  end
110
112
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isolator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-02 00:00:00.000000000 Z
11
+ date: 2018-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sniffer
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.51'
103
+ version: 0.56.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.51'
110
+ version: 0.56.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rubocop-md
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -290,6 +290,7 @@ files:
290
290
  - lib/isolator/database_cleaner_support.rb
291
291
  - lib/isolator/errors.rb
292
292
  - lib/isolator/ext/thread_fetch.rb
293
+ - lib/isolator/ignorer.rb
293
294
  - lib/isolator/isolate.rb
294
295
  - lib/isolator/notifier.rb
295
296
  - lib/isolator/orm_adapters.rb
@@ -319,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
319
320
  version: '0'
320
321
  requirements: []
321
322
  rubyforge_project:
322
- rubygems_version: 2.7.4
323
+ rubygems_version: 2.7.6
323
324
  signing_key:
324
325
  specification_version: 4
325
326
  summary: Detect non-atomic interactions within DB transactions