esse-sequel 0.0.1.beta1

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.
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ module Sequel
5
+ module Model
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ def after_create
11
+ super
12
+ esse_after_commit(:create)
13
+ end
14
+
15
+ def after_update
16
+ super
17
+ esse_after_commit(:update)
18
+ end
19
+
20
+ def after_destroy
21
+ super
22
+ esse_after_commit(:destroy)
23
+ end
24
+
25
+ private
26
+
27
+ def esse_after_commit(event)
28
+ hooks = self.class.esse_commit_hooks.fetch(event, [])
29
+ return if hooks.empty?
30
+
31
+ db.after_commit do
32
+ hooks.each { |hook| instance_exec(&hook) }
33
+ end
34
+ end
35
+
36
+ module ClassMethods
37
+ extend Esse::Deprecations::Deprecate
38
+
39
+ def esse_callbacks
40
+ @esse_callbacks ||= {}.freeze
41
+ end
42
+
43
+ def esse_commit_hooks
44
+ @esse_commit_hooks ||= {}.freeze
45
+ end
46
+
47
+ def esse_callback(index_repo_name, operation_name, on: %i[create update destroy], identifier_suffix: nil, **options, &block)
48
+ @esse_callbacks = esse_callbacks.dup
49
+ @esse_commit_hooks = esse_commit_hooks.dup
50
+ cb_if = options.delete(:if)
51
+ cb_unless = options.delete(:unless)
52
+ if_enabled = -> {
53
+ (cb_if.nil? || (cb_if.respond_to?(:call) ? instance_exec(&cb_if) : send(cb_if))) &&
54
+ (cb_unless.nil? || (cb_unless.respond_to?(:call) ? !instance_exec(&cb_unless) : !send(cb_unless))) &&
55
+ Esse::Sequel::Hooks.enabled?(index_repo_name) &&
56
+ Esse::Sequel::Hooks.enabled_for_model?(self.class, index_repo_name)
57
+ }
58
+
59
+ Array(on).each do |event|
60
+ identifier, klass = Esse::Sequel::Callbacks.fetch!(operation_name, event)
61
+ if identifier_suffix
62
+ identifier = :"#{identifier}_#{identifier_suffix}"
63
+ end
64
+
65
+ if @esse_callbacks.dig(index_repo_name, identifier)
66
+ raise ArgumentError, format("index repository %<name>p already registered %<op>s operation", name: index_repo_name, op: operation_name)
67
+ end
68
+
69
+ @esse_callbacks[index_repo_name] = @esse_callbacks[index_repo_name]&.dup || {}
70
+ @esse_callbacks[index_repo_name][identifier] = [klass, options, block]
71
+
72
+ hook = -> {
73
+ next unless instance_exec(&if_enabled)
74
+
75
+ klass, options, block = self.class.esse_callbacks.fetch(index_repo_name).fetch(identifier)
76
+ repo = Esse::Sequel::Hooks.resolve_index_repository(index_repo_name)
77
+ block_result = instance_exec(&block) if block.respond_to?(:call)
78
+ klass.new(**options, repo: repo, block_result: block_result).call(self)
79
+ }
80
+ @esse_commit_hooks[event] = [*@esse_commit_hooks[event], hook].freeze
81
+ end
82
+
83
+ Esse::Sequel::Hooks.register_model(self)
84
+ ensure
85
+ @esse_callbacks&.each_value { |v| v.freeze }&.freeze
86
+ @esse_commit_hooks&.freeze
87
+ end
88
+
89
+ # Define callback for create/update/delete elasticsearch index document after model commit.
90
+ #
91
+ # @param [String] index_repo_name The path of index and repository name.
92
+ # For example a index with a single repository named `users` is `users`. And a index with
93
+ # multiple repositories named `animals` and `dog` as the repository name is `animals/dog`.
94
+ # For namespace, use `/` as the separator.
95
+ # @raise [ArgumentError] when the repo and events are already registered
96
+ # @raise [ArgumentError] when the specified index have multiple repos
97
+ def index_callback(index_repo_name, on: %i[create update destroy], with: nil, **options, &block)
98
+ if with
99
+ Array(on).each do |event|
100
+ if event == :update
101
+ esse_callback(index_repo_name, :indexing, on: event, with: with, **options, &block)
102
+ else
103
+ esse_callback(index_repo_name, :indexing, on: event, **options, &block)
104
+ end
105
+ end
106
+ else
107
+ esse_callback(index_repo_name, :indexing, on: on, **options, &block)
108
+ end
109
+ end
110
+
111
+ def update_lazy_attribute_callback(index_repo_name, attribute_name, on: %i[create update destroy], **options, &block)
112
+ options[:attribute_name] = attribute_name
113
+ esse_callback(index_repo_name, :update_lazy_attribute, identifier_suffix: attribute_name.to_sym, on: on, **options, &block)
114
+ end
115
+
116
+ # Disable indexing for the block execution on model level
117
+ # Example:
118
+ # User.without_indexing { }
119
+ # User.without_indexing(UsersIndex, AccountsIndex::User) { }
120
+ def without_indexing(*repos)
121
+ Esse::Sequel::Hooks.without_indexing_for_model(self, *repos) do
122
+ yield
123
+ end
124
+ end
125
+
126
+ def index_callbacks(*args, **options, &block)
127
+ index_callback(*args, **options, &block)
128
+ end
129
+ deprecate :index_callbacks, :index_callback, 2024, 12
130
+
131
+ def esse_index_repos
132
+ esse_callbacks
133
+ end
134
+ deprecate :esse_index_repos, :esse_callbacks, 2024, 12
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ module Sequel
5
+ VERSION = "0.0.1.beta1"
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "esse"
4
+ require "esse-hooks"
5
+ require "sequel"
6
+ require_relative "sequel/version"
7
+ require_relative "sequel/callbacks"
8
+ require_relative "sequel/model"
9
+ require_relative "sequel/hooks"
10
+ require_relative "sequel/collection"
11
+ require_relative "plugins/sequel"
12
+
13
+ module Esse
14
+ module Sequel
15
+ end
16
+ end
data/mise.toml ADDED
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ ruby = "latest"
metadata ADDED
@@ -0,0 +1,232 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: esse-sequel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.beta1
5
+ platform: ruby
6
+ authors:
7
+ - Marcos G. Zimmermann
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: esse
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 0.3.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 0.3.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: esse-hooks
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sequel
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '5.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: dotenv
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: pry
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rspec
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: webmock
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: standard
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.35.1
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 1.35.1
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubocop
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ - !ruby/object:Gem::Dependency
153
+ name: rubocop-performance
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: rubocop-rspec
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ description: Sequel extensions for Esse
181
+ email:
182
+ - mgzmaster@gmail.com
183
+ executables: []
184
+ extensions: []
185
+ extra_rdoc_files: []
186
+ files:
187
+ - ".rubocop.yml"
188
+ - CHANGELOG.md
189
+ - Gemfile
190
+ - LICENSE.txt
191
+ - README.md
192
+ - Rakefile
193
+ - docs/README.md
194
+ - docs/api.md
195
+ - docs/usage.md
196
+ - lib/esse/plugins/sequel.rb
197
+ - lib/esse/sequel.rb
198
+ - lib/esse/sequel/callbacks.rb
199
+ - lib/esse/sequel/callbacks/indexing_on_create.rb
200
+ - lib/esse/sequel/callbacks/indexing_on_destroy.rb
201
+ - lib/esse/sequel/callbacks/indexing_on_update.rb
202
+ - lib/esse/sequel/callbacks/update_lazy_attribute.rb
203
+ - lib/esse/sequel/collection.rb
204
+ - lib/esse/sequel/hooks.rb
205
+ - lib/esse/sequel/model.rb
206
+ - lib/esse/sequel/version.rb
207
+ - mise.toml
208
+ homepage: https://github.com/marcosgz/esse-sequel
209
+ licenses:
210
+ - MIT
211
+ metadata:
212
+ homepage_uri: https://github.com/marcosgz/esse-sequel
213
+ source_code_uri: https://github.com/marcosgz/esse-sequel
214
+ changelog_uri: https://github.com/marcosgz/esse-sequel/blob/main/CHANGELOG.md
215
+ rdoc_options: []
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 2.4.0
223
+ required_rubygems_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ requirements: []
229
+ rubygems_version: 4.0.20
230
+ specification_version: 4
231
+ summary: Sequel extensions for Esse
232
+ test_files: []