ii_finder 2.0.1 → 2.1.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: 0af875699d606b3d6b00fc1dba12000c1eea5767d029b5bd125b10f7ef3cdabd
4
- data.tar.gz: e865e05b213f6e69522d3d9df5b96b2d2bffed9cfe62dd15e9e3ad0e964677bb
3
+ metadata.gz: e9c42e9402b1850eb69b928c7ea83e978e3ccbe3b3356eb4e5b1d24edf9424ce
4
+ data.tar.gz: d22e81c3f0c1bd32b9637d8722b5c6007ae5bf2c27c9b880c2c3b90e88f23363
5
5
  SHA512:
6
- metadata.gz: 89f8b24b33d997bf4f530673cf7066390864fbf3d4dbe56bd871edef522664febf803f4c06cd906a6792837dbb08336973c9f8538b2ca9c626f591d9939dee0c
7
- data.tar.gz: 8d65c22603983ed0cbd3c7dccdcc349f8f8466be5bf76be8241e45c7181db63c6d36bed2eb5431323da5ad74a4935e12b6cceaad79f615e0660a4aab4f955d38
6
+ metadata.gz: d5d8a31523c9cfa994a683c51723bbb62a1ca09891f1653ccc7f4af8a0b4a28a6927983886c504b86bfbb22e331f50e103f5378b5931e60e4111c49219e8670e
7
+ data.tar.gz: 1c0770784cc663a8bcba3c99b1d0af1439d29c23b8b5a885f7cc34a5c06136972879a9ce8d48d619ca4b6de80639f76c4eb4d51749597a619032f4d1324b54ed
@@ -4,21 +4,29 @@ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  test:
7
- runs-on: ubuntu-18.04
7
+ runs-on: ubuntu-20.04
8
8
  strategy:
9
9
  fail-fast: false
10
10
  matrix:
11
- ruby: [2.3, 2.4, 2.5, 2.6, 2.7, 3.0]
12
- gemfile: ['rails50', 'rails51', 'rails52', 'rails60', 'rails61']
11
+ ruby: [2.3, 2.4, 2.5, 2.6, 2.7, '3.0']
12
+ gemfile: ['rails50', 'rails51', 'rails52', 'rails60', 'rails61', 'rails70']
13
13
  exclude:
14
14
  - ruby: 2.3
15
15
  gemfile: rails60
16
16
  - ruby: 2.3
17
17
  gemfile: rails61
18
+ - ruby: 2.3
19
+ gemfile: rails70
18
20
  - ruby: 2.4
19
21
  gemfile: rails60
20
22
  - ruby: 2.4
21
23
  gemfile: rails61
24
+ - ruby: 2.4
25
+ gemfile: rails70
26
+ - ruby: 2.5
27
+ gemfile: rails70
28
+ - ruby: 2.6
29
+ gemfile: rails70
22
30
  - ruby: 3.0
23
31
  gemfile: rails50
24
32
  - ruby: 3.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.1.0
4
+
5
+ * Add traversal config.
6
+ * Add callbacks for `call_all`.
7
+ * Add calling instrumentation.
8
+ * Clear class cache when reloaded.
9
+ * Bump coactive version to 0.2.
10
+
3
11
  ## 2.0.1
4
12
 
5
13
  * Return relation after callbacks called.
data/README.md CHANGED
@@ -230,7 +230,9 @@ IIFinder::LogSubscriber.attach_to :ii_finder
230
230
  This subscriber will write logs in debug mode as the following example:
231
231
 
232
232
  ```
233
- Called ItemsFinder with {:id=>1} (Duration: 9.9ms, Allocations: 915)
233
+ Calling ItemsFinder with {:id=>1}
234
+ ...
235
+ Called ItemsFinder (Duration: 9.9ms, Allocations: 915)
234
236
  ```
235
237
 
236
238
  ## Contributing
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 7.0.0"
4
+
5
+ gemspec path: "../"
data/ii_finder.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib"]
19
19
 
20
20
  spec.add_dependency "activesupport", ">= 5.0"
21
- spec.add_dependency "coactive", ">= 0.1"
21
+ spec.add_dependency "coactive", ">= 0.2"
22
22
 
23
23
  spec.add_development_dependency "rails", ">= 5.0"
24
24
  spec.add_development_dependency "sqlite3"
@@ -5,6 +5,8 @@ require_relative 'parameters'
5
5
  require_relative 'callbacks'
6
6
  require_relative 'instrumentation'
7
7
  require_relative 'lookup'
8
+ require_relative 'context'
9
+ require_relative 'contextualizer'
8
10
  require_relative 'coactors'
9
11
 
10
12
  module IIFinder
@@ -14,6 +16,7 @@ module IIFinder
14
16
  include Callbacks
15
17
  include Instrumentation
16
18
  include Lookup
19
+ include Contextualizer
17
20
  include Coactors
18
21
  end
19
22
  end
@@ -6,18 +6,35 @@ module IIFinder
6
6
  include ActiveSupport::Callbacks
7
7
 
8
8
  included do
9
+ define_callbacks :all
9
10
  define_callbacks :call
10
11
  end
11
12
 
13
+ def call_all
14
+ run_callbacks :all do
15
+ super
16
+ end
17
+ end
18
+
12
19
  def call
13
20
  run_callbacks :call do
14
21
  super
15
22
  end
16
-
17
- @relation
18
23
  end
19
24
 
20
25
  class_methods do
26
+ def before_all(*args, &block)
27
+ set_callback(:all, :before, *args, &block)
28
+ end
29
+
30
+ def after_all(*args, &block)
31
+ set_callback(:all, :after, *args, &block)
32
+ end
33
+
34
+ def around_all(*args, &block)
35
+ set_callback(:all, :around, *args, &block)
36
+ end
37
+
21
38
  def before_call(*args, &block)
22
39
  set_callback(:call, :before, *args, &block)
23
40
  end
@@ -18,12 +18,5 @@ module IIFinder
18
18
  alias_method :chain, :coact
19
19
  end
20
20
  end
21
-
22
- def call
23
- coactors.each do |finder|
24
- merge_relation!(finder.call(*@_args))
25
- end
26
- super
27
- end
28
21
  end
29
22
  end
@@ -6,7 +6,8 @@ module IIFinder
6
6
 
7
7
  self.data = {
8
8
  lookup_cache: true,
9
- merge_relation: true
9
+ merge_relation: true,
10
+ traversal: :postorder,
10
11
  }
11
12
 
12
13
  data.keys.each do |key|
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIFinder
4
+ class Context < Coactive::Context
5
+ def to_s
6
+ "#<#{self.class} model=#{@_data[:model]} criteria=#{@_data[:criteria].to_s.truncate(300)}>"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIFinder
4
+ module Contextualizer
5
+ extend ActiveSupport::Concern
6
+ include Coactive::Contextualizer
7
+
8
+ def call
9
+ contextualize do
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,24 +3,40 @@
3
3
  module IIFinder
4
4
  module Core
5
5
  extend ActiveSupport::Concern
6
+ include Coactive::Initializer
6
7
 
7
8
  included do
8
- attr_reader :relation, :criteria, :model, :table
9
+ self.context_class = IIFinder::Context
10
+ context :relation, output: true
11
+ context :criteria, :model, :table
9
12
  end
10
13
 
11
14
  def initialize(*args)
12
- @_args = args;
13
- if args.size == 0 || args.size == 1
14
- @model = self.class.lookup
15
- raise IIFinder::Error.new("could not find model for #{self.class}") unless @model
16
- @relation = @model.all
17
- @criteria = args[0] || {}
15
+ if args[0].is_a?(self.class.context_class)
16
+ super(args[0])
18
17
  else
19
- @relation = args[0]
20
- @criteria = args[1]
21
- @model = @relation.klass
18
+ relation, criteria = Core.resolve_args(self, *args)
19
+ model = relation.klass
20
+ table = model.arel_table if model.respond_to?(:arel_table)
21
+ super(relation: relation, criteria: criteria, model: model, table: table)
22
+ end
23
+ end
24
+
25
+ def call_all
26
+ planned = case IIFinder.config.traversal
27
+ when :preorder
28
+ [self] + coactors
29
+ when :postorder
30
+ coactors + [self]
31
+ when :inorder
32
+ planned = coactors.in_groups(2, false)
33
+ planned[0] + [self] + planned[1]
34
+ end
35
+
36
+ planned.each do |finder|
37
+ relation = finder == self ? call : finder.call(@context)
38
+ @context.relation = @context.relation.merge(relation) if relation.respond_to?(:merge)
22
39
  end
23
- @table = @model.arel_table if @model.respond_to?(:arel_table)
24
40
  end
25
41
 
26
42
  def call
@@ -30,8 +46,6 @@ module IIFinder
30
46
  merge_relation!(send(param.name, value))
31
47
  end
32
48
  end
33
-
34
- @relation
35
49
  end
36
50
 
37
51
  def fetch_criteria(name)
@@ -50,7 +64,20 @@ module IIFinder
50
64
 
51
65
  class_methods do
52
66
  def call(*args)
53
- new(*args).call
67
+ finder = new(*args).tap(&:call_all)
68
+ finder.context.relation
69
+ end
70
+ end
71
+
72
+ class << self
73
+ def resolve_args(finder, *args)
74
+ if args.size == 0 || args.size == 1
75
+ model = finder.class.lookup
76
+ raise IIFinder::Error.new("could not find model for #{finder.class}") unless model
77
+ return model.all, args[0] || {}
78
+ else
79
+ return args[0], args[1]
80
+ end
54
81
  end
55
82
  end
56
83
  end
@@ -4,6 +4,11 @@ module IIFinder
4
4
  module Instrumentation
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ def call_all
8
+ ActiveSupport::Notifications.instrument 'calling.ii_finder', finder: self
9
+ super
10
+ end
11
+
7
12
  def call
8
13
  ActiveSupport::Notifications.instrument 'call.ii_finder', finder: self do
9
14
  super
@@ -2,13 +2,22 @@
2
2
 
3
3
  module IIFinder
4
4
  class LogSubscriber < ActiveSupport::LogSubscriber
5
+ def calling(event)
6
+ debug do
7
+ finder = event.payload[:finder]
8
+ "Calling #{finder.class} with #{finder.context}"
9
+ end
10
+ end
11
+
5
12
  def call(event)
6
13
  debug do
7
14
  finder = event.payload[:finder]
8
- "Called #{finder.class} with #{finder.criteria} (#{additional_log(event)})"
15
+ "Called #{finder.class} (#{additional_log(event)})"
9
16
  end
10
17
  end
11
18
 
19
+ private
20
+
12
21
  def additional_log(event)
13
22
  additions = ["Duration: %.1fms" % event.duration]
14
23
  additions << "Allocations: %d" % event.allocations if event.respond_to?(:allocations)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIFinder
4
+ class Railtie < Rails::Railtie
5
+ ActiveSupport::Reloader.to_prepare do
6
+ IIFinder::Lookup.cache.clear
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IIFinder
4
- VERSION = '2.0.1'
4
+ VERSION = '2.1.0'
5
5
  end
data/lib/ii_finder.rb CHANGED
@@ -7,6 +7,7 @@ require 'ii_finder/errors'
7
7
  require 'ii_finder/base'
8
8
  require 'ii_finder/scope'
9
9
  require 'ii_finder/log_subscriber'
10
+ require 'ii_finder/railtie' if defined?(Rails)
10
11
 
11
12
  module IIFinder
12
13
  class << self
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ii_finder
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshikazu Kaneta
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-02 00:00:00.000000000 Z
11
+ date: 2022-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0.1'
33
+ version: '0.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0.1'
40
+ version: '0.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rails
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -130,12 +130,15 @@ files:
130
130
  - gemfiles/rails52.gemfile
131
131
  - gemfiles/rails60.gemfile
132
132
  - gemfiles/rails61.gemfile
133
+ - gemfiles/rails70.gemfile
133
134
  - ii_finder.gemspec
134
135
  - lib/ii_finder.rb
135
136
  - lib/ii_finder/base.rb
136
137
  - lib/ii_finder/callbacks.rb
137
138
  - lib/ii_finder/coactors.rb
138
139
  - lib/ii_finder/config.rb
140
+ - lib/ii_finder/context.rb
141
+ - lib/ii_finder/contextualizer.rb
139
142
  - lib/ii_finder/core.rb
140
143
  - lib/ii_finder/errors.rb
141
144
  - lib/ii_finder/instrumentation.rb
@@ -143,6 +146,7 @@ files:
143
146
  - lib/ii_finder/lookup.rb
144
147
  - lib/ii_finder/parameter.rb
145
148
  - lib/ii_finder/parameters.rb
149
+ - lib/ii_finder/railtie.rb
146
150
  - lib/ii_finder/scope.rb
147
151
  - lib/ii_finder/version.rb
148
152
  homepage: https://github.com/kanety/ii_finder