typesensual 0.1.0

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: 9231d4598d045c7089f290474867722966f4c4e720cc34a8de0ef960b5ac650a
4
+ data.tar.gz: 6b9400c0f282f3df2b3bec0f310f453b3383ddd05846894a1390176db60b206e
5
+ SHA512:
6
+ metadata.gz: 7ebec05f05e05762734582d0b5080844a567002313aff70b4009642da0aeb20874fbe7a12e9b523dcc2f702bf0b98c24342f3f23dcf751582b42399f21542114
7
+ data.tar.gz: 709890ec4af5c9da8b680910c865d4900d0eae090cd9cc471bfb50c0860e486854cbcb01ee934aac1bfa124da6722771b2154d2a80b7a911416876ff9598257e
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,293 @@
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-performance
4
+ AllCops:
5
+ NewCops: enable
6
+ DisplayCopNames: false
7
+ DisplayStyleGuide: true
8
+ StyleGuideCopsOnly: false
9
+ TargetRubyVersion: 2.7
10
+ Layout/ArgumentAlignment:
11
+ EnforcedStyle: with_fixed_indentation
12
+ Style/BlockDelimiters:
13
+ EnforcedStyle: braces_for_chaining
14
+ Style/CollectionMethods:
15
+ PreferredMethods:
16
+ collect: map
17
+ collect!: map!
18
+ inject: reduce
19
+ detect: find
20
+ find_all: select
21
+ Style/CommentAnnotation:
22
+ Enabled: true
23
+ Keywords:
24
+ - TODO
25
+ - FIXME
26
+ - OPTIMIZE
27
+ - HACK
28
+ - REVIEW
29
+ - DEPRECATED
30
+ Layout/DotPosition:
31
+ EnforcedStyle: leading
32
+ Layout/EmptyLineAfterGuardClause:
33
+ Enabled: false
34
+ Style/FormatString:
35
+ Enabled: true
36
+ EnforcedStyle: format
37
+ Style/FrozenStringLiteralComment:
38
+ SafeAutoCorrect: true
39
+ Enabled: true
40
+ Style/GlobalVars:
41
+ Enabled: false
42
+ Style/GuardClause:
43
+ Enabled: true
44
+ MinBodyLength: 3
45
+ Style/IfUnlessModifier:
46
+ Enabled: true
47
+ Layout/FirstArrayElementIndentation:
48
+ EnforcedStyle: consistent
49
+ Layout/FirstHashElementIndentation:
50
+ EnforcedStyle: consistent
51
+ Style/LambdaCall:
52
+ Enabled: true
53
+ Style/Next:
54
+ Enabled: true
55
+ MinBodyLength: 3
56
+ Style/NumericLiterals:
57
+ Enabled: true
58
+ MinDigits: 5
59
+ Style/PercentLiteralDelimiters:
60
+ Enabled: true
61
+ PreferredDelimiters:
62
+ '%': '[]'
63
+ '%i': '[]'
64
+ '%q': '[]'
65
+ '%Q': '[]'
66
+ '%r': '{}'
67
+ '%s': '()'
68
+ '%w': '[]'
69
+ '%W': '[]'
70
+ '%x': '[]'
71
+ Style/RaiseArgs:
72
+ Enabled: true
73
+ EnforcedStyle: exploded
74
+ Style/SingleLineMethods:
75
+ Enabled: true
76
+ AllowIfMethodIsEmpty: true
77
+ Style/StringLiterals:
78
+ EnforcedStyle: single_quotes
79
+ Layout/SpaceAroundEqualsInParameterDefault:
80
+ Enabled: true
81
+ EnforcedStyle: space
82
+ Layout/SpaceBeforeBlockBraces:
83
+ Enabled: true
84
+ EnforcedStyle: space
85
+ Layout/SpaceInsideBlockBraces:
86
+ Enabled: true
87
+ EnforcedStyle: space
88
+ EnforcedStyleForEmptyBraces: no_space
89
+ SpaceBeforeBlockParameters: true
90
+ Layout/SpaceInsideHashLiteralBraces:
91
+ Enabled: true
92
+ EnforcedStyle: space
93
+ EnforcedStyleForEmptyBraces: no_space
94
+ Style/SymbolProc:
95
+ Enabled: true
96
+ Layout/TrailingEmptyLines:
97
+ Enabled: true
98
+ EnforcedStyle: final_newline
99
+ Style/TrailingCommaInArguments:
100
+ Enabled: true
101
+ EnforcedStyleForMultiline: no_comma
102
+ Style/TrailingCommaInArrayLiteral:
103
+ Enabled: true
104
+ EnforcedStyleForMultiline: no_comma
105
+ Style/TrailingCommaInHashLiteral:
106
+ Enabled: true
107
+ EnforcedStyleForMultiline: no_comma
108
+ Style/TrivialAccessors:
109
+ Enabled: true
110
+ AllowDSLWriters: true
111
+ Naming/VariableName:
112
+ Enabled: true
113
+ EnforcedStyle: snake_case
114
+ Style/WordArray:
115
+ Enabled: true
116
+ MinSize: 2
117
+ Metrics/AbcSize:
118
+ Enabled: false
119
+ Metrics/BlockNesting:
120
+ Enabled: true
121
+ Max: 5
122
+ Metrics/BlockLength:
123
+ Enabled: false
124
+ Metrics/ClassLength:
125
+ Enabled: true
126
+ CountComments: false
127
+ Max: 500
128
+ Metrics/ModuleLength:
129
+ Enabled: true
130
+ CountComments: false
131
+ Max: 500
132
+ Metrics/CyclomaticComplexity:
133
+ Enabled: false
134
+ Layout/LineLength:
135
+ Enabled: true
136
+ Max: 100
137
+ AllowURI: true
138
+ IgnoreCopDirectives: true
139
+ Exclude:
140
+ - config/routes.rb
141
+ Metrics/MethodLength:
142
+ Enabled: true
143
+ CountComments: false
144
+ Max: 100
145
+ Metrics/ParameterLists:
146
+ Enabled: true
147
+ Max: 5
148
+ CountKeywordArgs: false
149
+ Metrics/PerceivedComplexity:
150
+ Enabled: false
151
+ Lint/AssignmentInCondition:
152
+ Enabled: true
153
+ AllowSafeAssignment: true
154
+ Style/InlineComment:
155
+ Enabled: false
156
+ Style/MethodCalledOnDoEndBlock:
157
+ Enabled: true
158
+ Style/SymbolArray:
159
+ Enabled: true
160
+ Naming/AccessorMethodName:
161
+ Enabled: true
162
+ Style/Alias:
163
+ Enabled: true
164
+ EnforcedStyle: prefer_alias_method
165
+ Style/ArrayJoin:
166
+ Enabled: true
167
+ Style/AsciiComments:
168
+ Enabled: false
169
+ Naming/AsciiIdentifiers:
170
+ Enabled: true
171
+ Style/Attr:
172
+ Enabled: true
173
+ Style/BlockComments:
174
+ Enabled: true
175
+ Style/ColonMethodCall:
176
+ Enabled: true
177
+ Style/Documentation:
178
+ Enabled: false
179
+ Style/EmptyLiteral:
180
+ Enabled: true
181
+ Style/EvenOdd:
182
+ Enabled: true
183
+ Lint/FlipFlop:
184
+ Enabled: true
185
+ Style/IfWithSemicolon:
186
+ Enabled: true
187
+ Style/Lambda:
188
+ EnforcedStyle: literal
189
+ # HACK: Until Rubocop is released with EnforcedStyle
190
+ Enabled: true
191
+ Layout/LeadingCommentSpace:
192
+ Enabled: true
193
+ Style/MultilineBlockChain:
194
+ Enabled: true
195
+ Style/MultilineTernaryOperator:
196
+ Enabled: true
197
+ Style/NegatedIf:
198
+ Enabled: true
199
+ Style/NestedTernaryOperator:
200
+ Enabled: true
201
+ Style/NilComparison:
202
+ Enabled: true
203
+ Style/Not:
204
+ Enabled: true
205
+ Style/OneLineConditional:
206
+ Enabled: true
207
+ Style/PerlBackrefs:
208
+ Enabled: true
209
+ Style/RedundantBegin:
210
+ Enabled: true
211
+ Style/RedundantSelf:
212
+ Enabled: true
213
+ Style/RescueModifier:
214
+ Enabled: true
215
+ Style/SelfAssignment:
216
+ Enabled: true
217
+ Style/ClassAndModuleChildren:
218
+ Enabled: true
219
+ Exclude:
220
+ - app/graphql/**/*
221
+ Style/HashEachMethods:
222
+ Enabled: true
223
+ Style/HashTransformKeys:
224
+ Enabled: true
225
+ Style/HashTransformValues:
226
+ Enabled: true
227
+ Layout/SpaceBeforeFirstArg:
228
+ Enabled: true
229
+ Layout/SpaceAfterColon:
230
+ Enabled: true
231
+ Layout/SpaceAfterComma:
232
+ Enabled: true
233
+ Layout/SpaceAroundKeyword:
234
+ Enabled: true
235
+ Layout/SpaceAfterMethodName:
236
+ Enabled: true
237
+ Layout/SpaceAfterNot:
238
+ Enabled: true
239
+ Layout/SpaceAfterSemicolon:
240
+ Enabled: true
241
+ Layout/SpaceBeforeComma:
242
+ Enabled: true
243
+ Layout/SpaceBeforeComment:
244
+ Enabled: true
245
+ Layout/SpaceBeforeSemicolon:
246
+ Enabled: true
247
+ Layout/SpaceAroundOperators:
248
+ Enabled: true
249
+ Layout/SpaceInsideParens:
250
+ Enabled: true
251
+ Layout/SpaceInsideRangeLiteral:
252
+ Enabled: true
253
+ Style/SpecialGlobalVars:
254
+ Enabled: true
255
+ Layout/TrailingWhitespace:
256
+ Enabled: true
257
+ Style/UnlessElse:
258
+ Enabled: true
259
+ Style/VariableInterpolation:
260
+ Enabled: true
261
+ Style/WhenThen:
262
+ Enabled: true
263
+ Lint/Debugger:
264
+ Enabled: true
265
+ Lint/DeprecatedClassMethods:
266
+ Enabled: true
267
+ Security/Eval:
268
+ Enabled: true
269
+ Lint/SuppressedException:
270
+ Enabled: true
271
+ Lint/LiteralInInterpolation:
272
+ Enabled: true
273
+ Lint/Loop:
274
+ Enabled: true
275
+ Lint/ParenthesesAsGroupedExpression:
276
+ Enabled: true
277
+ Lint/RequireParentheses:
278
+ Enabled: false
279
+ Lint/UnderscorePrefixedVariableName:
280
+ Enabled: true
281
+ Lint/UselessSetterCall:
282
+ Enabled: true
283
+ RSpec/ExampleLength:
284
+ Max: 20
285
+ RSpec/ImplicitSubject:
286
+ EnforcedStyle: single_statement_only
287
+ Enabled: true
288
+ RSpec/NamedSubject:
289
+ Enabled: false
290
+ RSpec/NestedGroups:
291
+ Max: 4
292
+ RSpec/Focus:
293
+ AutoCorrect: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.1.4
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --markup markdown
2
+ --markup-provider commonmarker
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in typesensual.gemspec
6
+ gemspec
7
+
8
+ gem 'rake'
9
+ gem 'rspec'
10
+ gem 'rubocop'
11
+ gem 'rubocop-performance'
12
+ gem 'rubocop-rspec'
13
+ gem 'simplecov'
14
+
15
+ # Documentation
16
+ gem 'commonmarker'
17
+ gem 'rack'
18
+ gem 'webrick'
19
+ gem 'yard'
data/Gemfile.lock ADDED
@@ -0,0 +1,111 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ typesensual (0.1.0)
5
+ activesupport (>= 6.1.5)
6
+ paint (>= 2.0.0)
7
+ typesense (>= 0.13.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activesupport (7.0.5)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 1.6, < 2)
15
+ minitest (>= 5.1)
16
+ tzinfo (~> 2.0)
17
+ ast (2.4.2)
18
+ commonmarker (0.23.9)
19
+ concurrent-ruby (1.2.2)
20
+ diff-lcs (1.5.0)
21
+ docile (1.4.0)
22
+ ethon (0.16.0)
23
+ ffi (>= 1.15.0)
24
+ ffi (1.15.5)
25
+ i18n (1.13.0)
26
+ concurrent-ruby (~> 1.0)
27
+ json (2.6.3)
28
+ minitest (5.18.0)
29
+ oj (3.14.3)
30
+ paint (2.3.0)
31
+ parallel (1.23.0)
32
+ parser (3.2.2.1)
33
+ ast (~> 2.4.1)
34
+ rack (2.2.7)
35
+ rainbow (3.1.1)
36
+ rake (13.0.6)
37
+ regexp_parser (2.8.0)
38
+ rexml (3.2.5)
39
+ rspec (3.12.0)
40
+ rspec-core (~> 3.12.0)
41
+ rspec-expectations (~> 3.12.0)
42
+ rspec-mocks (~> 3.12.0)
43
+ rspec-core (3.12.2)
44
+ rspec-support (~> 3.12.0)
45
+ rspec-expectations (3.12.3)
46
+ diff-lcs (>= 1.2.0, < 2.0)
47
+ rspec-support (~> 3.12.0)
48
+ rspec-mocks (3.12.5)
49
+ diff-lcs (>= 1.2.0, < 2.0)
50
+ rspec-support (~> 3.12.0)
51
+ rspec-support (3.12.0)
52
+ rubocop (1.51.0)
53
+ json (~> 2.3)
54
+ parallel (~> 1.10)
55
+ parser (>= 3.2.0.0)
56
+ rainbow (>= 2.2.2, < 4.0)
57
+ regexp_parser (>= 1.8, < 3.0)
58
+ rexml (>= 3.2.5, < 4.0)
59
+ rubocop-ast (>= 1.28.0, < 2.0)
60
+ ruby-progressbar (~> 1.7)
61
+ unicode-display_width (>= 2.4.0, < 3.0)
62
+ rubocop-ast (1.28.1)
63
+ parser (>= 3.2.1.0)
64
+ rubocop-capybara (2.18.0)
65
+ rubocop (~> 1.41)
66
+ rubocop-factory_bot (2.23.1)
67
+ rubocop (~> 1.33)
68
+ rubocop-performance (1.18.0)
69
+ rubocop (>= 1.7.0, < 2.0)
70
+ rubocop-ast (>= 0.4.0)
71
+ rubocop-rspec (2.22.0)
72
+ rubocop (~> 1.33)
73
+ rubocop-capybara (~> 2.17)
74
+ rubocop-factory_bot (~> 2.22)
75
+ ruby-progressbar (1.13.0)
76
+ simplecov (0.22.0)
77
+ docile (~> 1.1)
78
+ simplecov-html (~> 0.11)
79
+ simplecov_json_formatter (~> 0.1)
80
+ simplecov-html (0.12.3)
81
+ simplecov_json_formatter (0.1.4)
82
+ typesense (0.14.1)
83
+ oj (~> 3.11)
84
+ typhoeus (~> 1.4)
85
+ typhoeus (1.4.0)
86
+ ethon (>= 0.9.0)
87
+ tzinfo (2.0.6)
88
+ concurrent-ruby (~> 1.0)
89
+ unicode-display_width (2.4.2)
90
+ webrick (1.7.0)
91
+ yard (0.9.34)
92
+
93
+ PLATFORMS
94
+ x86_64-darwin-19
95
+ x86_64-darwin-22
96
+
97
+ DEPENDENCIES
98
+ commonmarker
99
+ rack
100
+ rake
101
+ rspec
102
+ rubocop
103
+ rubocop-performance
104
+ rubocop-rspec
105
+ simplecov
106
+ typesensual!
107
+ webrick
108
+ yard
109
+
110
+ BUNDLED WITH
111
+ 2.3.13
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 Emma Lejeck
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # Typesensual
2
+
3
+ Typesensual is a small wrapper around the [Typesense Ruby client][typesense-gem] which provides a
4
+ more familiar, rubyish interface for interacting with [Typesense][typesense-website]. Similar to
5
+ [Chewy][chewy-gem], it provides a DSL for defining your schema, manages the life-cycle of your
6
+ collections, and provides a simple interface for indexing, searching, and deleting documents.
7
+
8
+ Unlike Chewy, it does *not* handle loading, denormalizing, or formatting your data for search
9
+ purposes. It can be combined with an ORM such as ActiveRecord or Sequel, or even used with plain SQL
10
+ queries, but that integration is left to you. This is a concious decision, since loading and
11
+ transforming data is often a complex and application-specific task that is best left to the
12
+ application developer, since you know best.
13
+
14
+ [typesense-gem]: https://github.com/typesense/typesense-ruby
15
+ [typesense-website]: https://typesense.org/
16
+ [chewy-gem]: https://github.com/toptal/chewy
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ ```ruby
23
+ gem 'typesensual'
24
+ ```
25
+
26
+ And then execute:
27
+
28
+ $ bundle
29
+
30
+ Or install it yourself as:
31
+
32
+ $ gem install typesensual
33
+
34
+ ## Usage
35
+
36
+ ### Configuring the client
37
+
38
+ The first step is to configure the client. This is done by calling `Typesensual.configure` and
39
+ passing a block to configure your parameters:
40
+
41
+ ```ruby
42
+ # config/initializers/typesensual.rb
43
+ Typesensual.configure do |config|
44
+ # The nodes in your cluster to connect to
45
+ config.nodes = [{ host: 'localhost', port: 8108, protocol: 'http' }]
46
+ # The API key to use for authentication
47
+ config.api_key = 'xyz'
48
+ # The environment you are running in (in Rails, this is set automatically)
49
+ config.env = 'test'
50
+ end
51
+ ```
52
+
53
+ ### Creating your first index
54
+
55
+ Once the client is configured, you can create your first index. This is done by creating a subclass
56
+ of `Typesensual::Index` and defining your schema and how to load the data. For example, the
57
+ following index might be used to index movies from an ActiveRecord model:
58
+
59
+ ```ruby
60
+ # app/indices/movie_index.rb
61
+ class MoviesIndex < Typesensual::Index
62
+ # The schema of the collection
63
+ schema do
64
+ enable_nested_fields
65
+
66
+ field 'title', type: 'string'
67
+ field 'release_date\..*', type: 'int32', facet: true
68
+ field 'average_rating', type: 'float', facet: true
69
+ field 'user_count', type: 'int32'
70
+ field 'genres', type: 'string[]', facet: true
71
+ end
72
+
73
+ def index_one(id)
74
+ movie = Movie.find(id).includes(:genres)
75
+
76
+ {
77
+ id: movie.id,
78
+ title: movie.title,
79
+ release_date: {
80
+ year: movie.release_date.year,
81
+ month: movie.release_date.month,
82
+ day: movie.release_date.day
83
+ },
84
+ average_rating: movie.average_rating,
85
+ user_count: movie.user_count,
86
+ genres: movie.genres.map(&:name)
87
+ }
88
+ end
89
+
90
+ def index_many(ids)
91
+ Movies.where(id: ids).includes(:genres).find_each do |movie|
92
+ yield {
93
+ id: movie.id,
94
+ title: movie.title,
95
+ release_date: {
96
+ year: movie.release_date.year,
97
+ month: movie.release_date.month,
98
+ day: movie.release_date.day
99
+ },
100
+ average_rating: movie.average_rating,
101
+ user_count: movie.user_count,
102
+ genres: movie.genres.map(&:name)
103
+ }
104
+ end
105
+ end
106
+ end
107
+ ```
108
+
109
+ ### Loading data into your index
110
+
111
+ Once you have defined your index, you can load data into it and update the alias to point to the
112
+ indexed data. Typesensual provides rake tasks for this purpose if you use ActiveRecord:
113
+
114
+ ```console
115
+ $ bundle exec rake typesensual:load[MoviesIndex,Movie]
116
+ ==> Indexing Movie into MoviesIndex (Version 1690076097)
117
+
118
+ $ bundle exec rake typesensual:update_alias[MoviesIndex,1690076097]
119
+ ==> Alias for MoviesIndex
120
+ Old: None (N/A)
121
+ New: 1690076097 (2023-05-07 18:01:37)
122
+ ```
123
+
124
+ Otherwise you can do similar to the following:
125
+
126
+ ```ruby
127
+ collection = MoviesIndex.create!
128
+ collection.index_many(Movie.ids, collection: collection)
129
+ MoviesIndex.update_alias(collection)
130
+ ```
131
+
132
+ ### Searching your index
133
+
134
+ Now that you have data in your index, you can search it! Typesensual provides a simple interface for
135
+ this purpose, including pagination support:
136
+
137
+ ```ruby
138
+ query = MoviesIndex.search(query: 'Your Name', query_by: 'title')
139
+ query.per(10).page(2).load
140
+ ```
141
+
142
+ The full interface for this is documented in the `Search`, `Results`, and `Hit` classes.
143
+
144
+ ## Development
145
+
146
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
147
+
148
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
149
+
150
+ ## Contributing
151
+
152
+ Bug reports, feature requests, and pull requests are welcome on [our GitHub][github].
153
+
154
+ [github]: https://github.com/hummingbird-me/typesensual
155
+
156
+ ## License
157
+
158
+ The gem is available as open source under the terms of the [MIT License][mit-license].
159
+
160
+ [mit-license]: https://opensource.org/licenses/MIT
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :typesensual do
4
+ desc 'List typesensual indices and their collections'
5
+ task list: :environment do
6
+ Typesensual::RakeHelper.list_collections
7
+ end
8
+
9
+ desc 'Update the alias for an index'
10
+ task :update_alias, %i[index version] => :environment do |_, args|
11
+ Typesensual::RakeHelper.update_alias(
12
+ index: args[:index],
13
+ version: args[:version]
14
+ )
15
+ end
16
+
17
+ desc 'Index all records from a model into an index'
18
+ task :index, %i[index model] => :environment do |_, args|
19
+ Typesensual::RakeHelper.index(
20
+ index: args[:index],
21
+ model: args[:model]
22
+ )
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Typesensual
4
+ class Callbacks
5
+ def initialize(index, should_update: ->(_record) { true })
6
+ @index = index
7
+ @should_update = should_update
8
+ end
9
+
10
+ def after_create_commit(record)
11
+ @index.index_one(record.id)
12
+ end
13
+
14
+ def after_update_commit(record)
15
+ @should_update.call(record) && @index.index_one(record.id)
16
+ end
17
+
18
+ def after_destroy_commit(record)
19
+ @index.remove_one(record.id)
20
+ end
21
+ end
22
+ end