zelastic 0.6.1 → 0.8.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 118f50ebd50d4291a03b2274b4129a9d69e15aee8b744ce986524ab3a7496845
4
- data.tar.gz: ef294b31041ecf9a0cdae04008950eb76fd2e19c60058db234b19549dd646ea6
3
+ metadata.gz: 7b45ad7dd15f213cc571c3da4f021ff80129dcccb375ae98aedde7b22b759b05
4
+ data.tar.gz: '08328c62f6485a0b11300dc9c651ca3e8c99179c84ea2c3f5235a921ca676d9a'
5
5
  SHA512:
6
- metadata.gz: d22f6e8c566c3e400ab3d02e3a4fe6f6aa114ac00533ca42848058a297e2593450f3cefebb19206d21acaf5d62da74f08ad247be137af07404e9bdc388faf900
7
- data.tar.gz: 7e369fe3a13e13289e98ee18e1b55cd83c0034a85ab3e0282a4ab70c302b05b41cbb7a329a69261880285e437f42e654ad332e2143f08babda5efbc5f54e1208
6
+ metadata.gz: a3e38047bf9f47bc8e7353f8e52387a7bd6722e291f96291d09a50257cd28a43cf7fba2abcd9681abb3797aa5acce67f38b09cabb6ecbaf8e4638b2a7e6e21b6
7
+ data.tar.gz: 94572581d7fa5f6c6de6485cacd9232a310418379f981d12d0523183f6922f5bcbbeb290605e4452ccb51603f702aa5bf52a9540ed681002a1b2e389a2dff670
data/.circleci/config.yml CHANGED
@@ -1,88 +1,48 @@
1
- references:
2
- ruby: &ruby
3
- image: carwow/ruby-ci:2.4.4
4
- environment:
5
- ELASTICSEARCH_URL: http://localhost:9200
6
-
7
- elasticsearch_container: &elasticsearch_container
8
- image: carwow/elasticsearch-ci:5.5.1
1
+ version: 2.1
9
2
 
10
- elasticsearch_7_container: &elasticsearch_7_container
11
- image: carwow/elasticsearch-ci:7.6.1
12
-
13
- version: 2
14
3
  jobs:
15
- bundle:
16
- working_directory: ~/zelastic
17
- docker:
18
- - *ruby
19
- steps:
20
- - checkout
21
- - restore_cache:
22
- keys:
23
- - bundle-{{ checksum "Gemfile.lock" }}
24
- - bundle-
25
- - run: |
26
- bundle config --local path vendor/bundle &&
27
- bundle check || bundle install --jobs=4 --retry=3
28
- bundle clean --force
29
- - save_cache:
30
- key: bundle-{{ checksum "Gemfile.lock" }}
31
- paths: [vendor/bundle]
32
-
33
- rubocop:
34
- working_directory: ~/zelastic
35
- docker:
36
- - *ruby
37
- steps:
38
- - checkout
39
- - restore_cache: { keys: ['bundle-{{ checksum "Gemfile.lock" }}'] }
40
- - run: bundle exec rubocop
41
-
42
- tests:
43
- working_directory: ~/zelastic
44
- docker:
45
- - *ruby
46
- - *elasticsearch_container
47
- steps:
48
- - checkout
49
- - restore_cache: { keys: ['bundle-{{ checksum "Gemfile.lock" }}'] }
50
- - run:
51
- name: Wait for ES to be ready
52
- command: |
53
- until curl $ELASTICSEARCH_URL/_cat/health | egrep '(green|yellow)' 2>&1 > /dev/null; do
54
- echo -n .
55
- sleep 1
56
- done
57
- - run: |
58
- bundle exec rspec --pattern "**/*_spec.rb" --format "progress"
59
-
60
- tests_7:
61
- working_directory: ~/zelastic
4
+ test:
5
+ parameters:
6
+ ruby_version:
7
+ type: string
8
+ elasticsearch_version:
9
+ type: string
10
+ elasticsearch_gem_version:
11
+ type: string
62
12
  docker:
63
- - *ruby
64
- - *elasticsearch_7_container
13
+ - image: "cimg/ruby:<< parameters.ruby_version >>"
14
+ - image: "elasticsearch:<< parameters.elasticsearch_version >>"
15
+ environment:
16
+ "discovery.type": single-node
17
+ "xpack.security.enabled": false
18
+ environment:
19
+ ELASTICSEARCH_GEM_VERSION: "<< parameters.elasticsearch_gem_version >>"
65
20
  steps:
66
21
  - checkout
67
- - restore_cache: { keys: ['bundle-{{ checksum "Gemfile.lock" }}'] }
68
- - run:
69
- name: Wait for ES to be ready
70
- command: |
71
- until curl $ELASTICSEARCH_URL/_cat/health | egrep '(green|yellow)' 2>&1 > /dev/null; do
72
- echo -n .
73
- sleep 1
74
- done
75
- - run: |
76
- bundle exec rspec --pattern "**/*_spec.rb" --format "progress"
22
+ - run: bin/setup
23
+ - run: bin/rubocop
24
+ - run: dockerize -wait http://localhost:9200 -timeout 1m
25
+ - run: bin/rspec
77
26
 
78
27
  workflows:
79
28
  version: 2
80
- build:
29
+ test:
81
30
  jobs:
82
- - bundle
83
- - rubocop:
84
- requires: [bundle]
85
- - tests:
86
- requires: [bundle]
87
- - tests_7:
88
- requires: [bundle]
31
+ - test:
32
+ name: "test with elasticsearch v8
33
+ and gem << matrix.elasticsearch_gem_version >>
34
+ and ruby v<< matrix.ruby_version >>"
35
+ elasticsearch_version: "8.3.3"
36
+ matrix:
37
+ parameters:
38
+ ruby_version: ["3.1", "2.7"]
39
+ elasticsearch_gem_version: ["~> 8", "~> 7"]
40
+ - test:
41
+ name: "test with elasticsearch v7
42
+ and gem << matrix.elasticsearch_gem_version >>
43
+ and ruby v<< matrix.ruby_version >>"
44
+ elasticsearch_version: "7.17.5"
45
+ matrix:
46
+ parameters:
47
+ ruby_version: ["3.1", "2.7"]
48
+ elasticsearch_gem_version: ["~> 7"]
@@ -0,0 +1,9 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: '09:00'
8
+ timezone: 'Europe/London'
9
+ open-pull-requests-limit: 10
data/.gitignore CHANGED
@@ -6,6 +6,8 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /log/*.log
10
+ /Gemfile.lock
9
11
 
10
12
  # rspec failure tracking
11
13
  .rspec_status
data/.rubocop.yml CHANGED
@@ -1,24 +1,13 @@
1
- inherit_from: .rubocop_todo.yml
1
+ inherit_gem:
2
+ carwow_rubocop:
3
+ - config/default.yml
2
4
 
3
- AllCops:
4
- TargetRubyVersion: 2.4
5
+ inherit_mode:
6
+ merge:
7
+ - Exclude
5
8
 
6
- # Configuration parameters: CountComments, ExcludedMethods.
7
- Metrics/BlockLength:
8
- Exclude:
9
- - '*.gemspec'
10
- - 'spec/**/*'
9
+ Metrics:
10
+ Enabled: false
11
11
 
12
- # Configuration parameters: CountComments.
13
- Metrics/MethodLength:
14
- Max: 18
15
-
16
- # Offense count: 2
17
- Style/Documentation:
18
- Exclude:
19
- - '**/*'
20
-
21
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
22
- # URISchemes: http, https
23
- Metrics/LineLength:
24
- Max: 100
12
+ Gemspec/RequireMFA:
13
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,15 +1,47 @@
1
- v0.5.1 - Aug 8th, 2018
2
- ---
1
+ # Changelog
3
2
 
4
- - Fix re-indexing log output upon initial index creation (#7)
3
+ All notable changes to this project will be documented in this file.
5
4
 
6
- v0.5.0 - Aug 3rd, 2018
7
- ---
5
+ The format is based on [Keep a Changelog],
6
+ and this project adheres to [Semantic Versioning].
8
7
 
9
- - An _ESTIMATED_ % completion of ES re-indexing is logged, as the new index gets populated (#5)
8
+ [Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
9
+ [Semantic Versioning]: https://semver.org/spec/v2.0.0.html
10
10
 
11
+ ## How do I make a good changelog?
11
12
 
12
- v0.4.0 - May 29th, 2018
13
- ---
13
+ ### Guiding Principles
14
14
 
15
- - Warning rather than exception on ignorable version conflicts (#4)
15
+ - Changelogs are for humans, not machines.
16
+ - There should be an entry for every single version.
17
+ - The same types of changes should be grouped.
18
+ - Versions and sections should be linkable.
19
+ - The latest version comes first.
20
+ - The release date of each version is displayed.
21
+ - Keep an `Unreleased` section at the top to track upcoming changes.
22
+
23
+ ### Types of changes
24
+
25
+ - `Added` for new features.
26
+ - `Changed` for changes in existing functionality.
27
+ - `Deprecated` for soon-to-be removed features.
28
+ - `Removed` for now removed features.
29
+ - `Fixed` for any bug fixes.
30
+ - `Security` in case of vulnerabilities.
31
+
32
+ ## [Unreleased] - XXXX-XX-XX
33
+
34
+ ## [0.8.0] - 2022-08-19
35
+ ### Added
36
+ - Support for Ruby 3 (and keep support for 2.7).
37
+ - Support for Elasticsearch v8 (and keep support for v7).
38
+ - Support setting a logger in `Config`.
39
+ - Support refresh on `IndexManager#populate_index`.
40
+ - Support Proc in `Config#data_source` so it can be lazily evaluated.
41
+
42
+ ### Removed
43
+ - Drop support for Ruby 2.6.
44
+ - Drop support for Elasticsearch v5 and v6.
45
+
46
+ [Unreleased]: https://github.com/carwow/zelastic/compare/v0.8.0...HEAD
47
+ [0.8.0]: https://github.com/carwow/zelastic/releases/tag/v0.8.0
data/Gemfile CHANGED
@@ -3,3 +3,5 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
+
7
+ gem 'elasticsearch', ENV['ELASTICSEARCH_GEM_VERSION'] if ENV['ELASTICSEARCH_GEM_VERSION']
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # Zero-downtime indexing from ActiveRecord->Elasticsearch
1
+ # Zelastic
2
+
3
+ Zero-downtime Elasticsearch tooling for managing indices and indexing from
4
+ ActiveRecord with PostgreSQL to Elasticsearch.
2
5
 
3
6
  ## Installation
4
7
 
@@ -10,13 +13,14 @@ gem 'zelastic'
10
13
 
11
14
  And then execute:
12
15
 
13
- $ bundle
16
+ $ bundle install
14
17
 
15
18
  Or install it yourself as:
16
19
 
17
20
  $ gem install zelastic
18
21
 
19
22
  ## Usage
23
+
20
24
  ### Setup
21
25
 
22
26
  For each ActiveRecord scope you want to index, you'll need a configuration:
@@ -46,7 +50,6 @@ You can also override some defaults, if you wish:
46
50
  here
47
51
  - `read_alias`: by default this is the table name of the `data_source`
48
52
  - `write_alias`: by default this is the `read_alias`, with `_write` appended
49
- - `type`: by default this is `read_alias.singularize`
50
53
 
51
54
  If you pass an array to as the `client` argument, all writes will be applied to every client in the
52
55
  array.
data/bin/rspec ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
12
+
13
+ bundle_binstub = File.expand_path('bundle', __dir__)
14
+
15
+ if File.file?(bundle_binstub)
16
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
17
+ load(bundle_binstub)
18
+ else
19
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21
+ end
22
+ end
23
+
24
+ require 'rubygems'
25
+ require 'bundler/setup'
26
+
27
+ load Gem.bin_path('rspec-core', 'rspec')
data/bin/rubocop ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rubocop' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
12
+
13
+ bundle_binstub = File.expand_path('bundle', __dir__)
14
+
15
+ if File.file?(bundle_binstub)
16
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
17
+ load(bundle_binstub)
18
+ else
19
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21
+ end
22
+ end
23
+
24
+ require 'rubygems'
25
+ require 'bundler/setup'
26
+
27
+ load Gem.bin_path('rubocop', 'rubocop')
@@ -2,31 +2,36 @@
2
2
 
3
3
  module Zelastic
4
4
  class Config
5
- attr_reader :clients, :data_source
5
+ attr_reader :clients
6
6
 
7
7
  def initialize(
8
8
  client:,
9
9
  data_source:,
10
10
  mapping:,
11
+ logger: nil,
11
12
  **overrides,
12
13
  &index_data
13
14
  )
14
15
  @clients = Array(client)
15
16
  @data_source = data_source
16
17
  @mapping = mapping
17
- @index_data = index_data
18
- @_type = overrides.fetch(:type, true)
18
+ @logger = logger
19
19
  @overrides = overrides
20
- end
21
-
22
- def type?
23
- @_type
20
+ @index_data = index_data
24
21
  end
25
22
 
26
23
  def index_data(model)
27
24
  @index_data.call(model)
28
25
  end
29
26
 
27
+ def data_source
28
+ if @data_source.respond_to? :call
29
+ @data_source.call
30
+ else
31
+ @data_source
32
+ end
33
+ end
34
+
30
35
  def read_alias
31
36
  @read_alias ||= overrides.fetch(:read_alias) { data_source.table_name }
32
37
  end
@@ -35,20 +40,16 @@ module Zelastic
35
40
  @write_alias ||= overrides.fetch(:write_alias) { [read_alias, 'write'].join('_') }
36
41
  end
37
42
 
38
- def type
39
- @type ||= overrides.fetch(:type, read_alias.singularize)
40
- end
41
-
42
43
  def logger
43
44
  return Rails.logger if defined?(Rails)
44
45
 
45
- @logger ||= Logger.new(STDOUT)
46
+ @logger ||= Logger.new($stdout)
46
47
  end
47
48
 
48
49
  def index_definition
49
50
  {
50
51
  settings: overrides.fetch(:index_settings, {}),
51
- mappings: type ? { type => mapping } : mapping
52
+ mappings: mapping
52
53
  }
53
54
  end
54
55
 
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Zelastic
4
- # rubocop:disable Metrics/AbcSize
5
- class IndexManager # rubocop:disable Metrics/ClassLength
4
+ class IndexManager
6
5
  extend Forwardable
7
6
 
8
7
  def initialize(config, client: nil)
@@ -17,12 +16,12 @@ module Zelastic
17
16
  client.indices.put_alias(index: index_name, name: config.write_alias)
18
17
  end
19
18
 
20
- def populate_index(unique_name = nil, batch_size: 3000)
19
+ def populate_index(unique_name = nil, batch_size: 3000, refresh: false)
21
20
  index_name = index_name_from_unique(unique_name)
22
21
 
23
22
  config.data_source.find_in_batches(batch_size: batch_size).with_index do |batch, i|
24
23
  logger.info(populate_index_log(batch_size: batch_size, batch_number: i + 1))
25
- indexer.index_batch(batch, client: client, index_name: index_name)
24
+ indexer.index_batch(batch, client: client, index_name: index_name, refresh: refresh)
26
25
  end
27
26
  end
28
27
 
@@ -37,12 +36,14 @@ module Zelastic
37
36
  remove_action =
38
37
  ({ remove: { index: old_index, alias: config.read_alias } } if old_index)
39
38
 
40
- client.indices.update_aliases(body: {
41
- actions: [
42
- remove_action,
43
- { add: { index: new_index, alias: config.read_alias } }
44
- ].compact
45
- })
39
+ client.indices.update_aliases(
40
+ body: {
41
+ actions: [
42
+ remove_action,
43
+ { add: { index: new_index, alias: config.read_alias } }
44
+ ].compact
45
+ }
46
+ )
46
47
  end
47
48
 
48
49
  def stop_dual_writes
@@ -52,14 +53,15 @@ module Zelastic
52
53
  logger.info("Currently used index is #{current_index}")
53
54
 
54
55
  other_write_indices = client.indices.get_alias(name: config.write_alias).keys
55
- .reject { |name| name == current_index }
56
+ .reject { |name| name == current_index }
56
57
 
57
58
  if other_write_indices.none?
58
59
  logger.info("No write indexes that aren't the read index. Nothing to do!")
59
60
  return
60
61
  end
61
62
  logger.info("Stopping writes to #{other_write_indices.count} old ES indices: " \
62
- "#{other_write_indices.join(', ')}")
63
+ "#{other_write_indices.join(', ')}"
64
+ )
63
65
 
64
66
  actions = other_write_indices.map do |index|
65
67
  { remove: { index: index, alias: config.write_alias } }
@@ -74,11 +76,11 @@ module Zelastic
74
76
  logger.info("Currently used index is #{current_index}")
75
77
 
76
78
  indices_to_delete = client
77
- .cat
78
- .indices(format: :json)
79
- .map { |index| index['index'] }
80
- .select { |name| name.start_with?(config.read_alias) }
81
- .reject { |name| name == current_index }
79
+ .cat
80
+ .indices(format: :json)
81
+ .map { |index| index['index'] }
82
+ .select { |name| name.start_with?(config.read_alias) }
83
+ .reject { |name| name == current_index }
82
84
 
83
85
  if indices_to_delete.none?
84
86
  logger.info('Nothing to do: no old indices')
@@ -93,6 +95,7 @@ module Zelastic
93
95
  private
94
96
 
95
97
  attr_reader :config, :client
98
+
96
99
  def_delegators :config, :logger
97
100
 
98
101
  def indexer
@@ -113,18 +116,11 @@ module Zelastic
113
116
  else
114
117
  'First index'
115
118
  end
116
- "ES: (#{progress}) Indexing #{config.type} records"
119
+ "ES: (#{progress}) Indexing records"
117
120
  end
118
121
 
119
122
  def current_index_size
120
- @current_index_size ||= client.count(**count_params)['count']
121
- end
122
-
123
- def count_params
124
- {
125
- index: config.read_alias,
126
- type: config.type? ? config.type : nil
127
- }.compact
123
+ @current_index_size ||= client.count(index: config.read_alias)['count']
128
124
  end
129
125
 
130
126
  def indexed_percent(batch_size, batch_number)
@@ -135,5 +131,4 @@ module Zelastic
135
131
  client.indices.exists?(index: config.read_alias)
136
132
  end
137
133
  end
138
- # rubocop:enable Metrics/AbcSize
139
134
  end
@@ -17,19 +17,19 @@ module Zelastic
17
17
  @config = config
18
18
  end
19
19
 
20
- def index_batch(batch, client: nil, index_name: nil)
20
+ def index_batch(batch, client: nil, index_name: nil, refresh: false)
21
21
  version = current_version
22
- execute_bulk(client: client, index_name: index_name) do |index|
22
+ execute_bulk(client: client, index_name: index_name, refresh: refresh) do |index|
23
23
  batch.map do |record|
24
24
  index_command(index: index, version: version, record: record)
25
25
  end
26
26
  end
27
27
  end
28
28
 
29
- def index_record(record)
29
+ def index_record(record, refresh: false)
30
30
  version = current_version
31
31
 
32
- execute_bulk do |index_name|
32
+ execute_bulk(refresh: refresh) do |index_name|
33
33
  [index_command(index: index_name, version: version, record: record)]
34
34
  end
35
35
  end
@@ -43,10 +43,7 @@ module Zelastic
43
43
 
44
44
  execute_bulk do |index_name|
45
45
  ids.map do |id|
46
- delete_params = { _index: index_name, _id: id }
47
- delete_params[:_type] = config.type if config.type?
48
-
49
- { delete: delete_params }
46
+ { delete: { _index: index_name, _id: id } }
50
47
  end
51
48
  end
52
49
  end
@@ -62,12 +59,13 @@ module Zelastic
62
59
  private
63
60
 
64
61
  attr_reader :config
62
+
65
63
  def_delegators :config, :logger
66
64
 
67
65
  def current_version
68
66
  config.data_source.connection
69
- .select_one('SELECT txid_snapshot_xmax(txid_current_snapshot()) as xmax')
70
- .fetch('xmax')
67
+ .select_one('SELECT txid_snapshot_xmax(txid_current_snapshot()) as xmax')
68
+ .fetch('xmax')
71
69
  end
72
70
 
73
71
  def write_indices(client)
@@ -75,31 +73,26 @@ module Zelastic
75
73
  end
76
74
 
77
75
  def index_command(index:, version:, record:)
78
- version_params =
79
- if config.type?
80
- { _version: version, _version_type: :external, _type: config.type }
81
- else
82
- { version: version, version_type: :external }
83
- end
84
-
85
76
  {
86
77
  index: {
87
78
  _index: index,
88
79
  _id: record.id,
89
- data: config.index_data(record)
90
- }.merge(version_params)
80
+ data: config.index_data(record),
81
+ version: version,
82
+ version_type: :external
83
+ }
91
84
  }
92
85
  end
93
86
 
94
- def execute_bulk(client: nil, index_name: nil)
87
+ def execute_bulk(client: nil, index_name: nil, refresh: false, &block)
95
88
  clients = Array(client || config.clients)
96
89
 
97
90
  clients.map do |current_client|
98
91
  indices = Array(index_name || write_indices(current_client))
99
92
 
100
- commands = indices.flat_map { |index| yield(index) }
93
+ commands = indices.flat_map(&block)
101
94
 
102
- current_client.bulk(body: commands).tap do |result|
95
+ current_client.bulk(body: commands, refresh: refresh).tap do |result|
103
96
  check_errors!(result)
104
97
  end
105
98
  end
@@ -109,11 +102,10 @@ module Zelastic
109
102
  return false unless result['errors']
110
103
 
111
104
  errors = result['items']
112
- .map { |item| item['error'] || item.fetch('index', {})['error'] }
113
- .compact
105
+ .filter_map { |item| item['error'] || item.fetch('index', {})['error'] }
114
106
 
115
107
  ignorable_errors, important_errors = errors
116
- .partition { |error| ignorable_error?(error) }
108
+ .partition { |error| ignorable_error?(error) }
117
109
 
118
110
  logger.warn("Ignoring #{ignorable_errors.count} version conflicts") if ignorable_errors.any?
119
111
 
@@ -123,16 +115,11 @@ module Zelastic
123
115
  end
124
116
 
125
117
  def ignorable_error?(error)
126
- # rubocop:disable Metrics/LineLength
127
- regexp =
128
- if config.type?
129
- /^\[#{config.type}\]\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/
130
- else
131
- /^\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/
132
- end
133
- # rubocop:enable Metrics/LineLength
134
118
  error['type'] == 'version_conflict_engine_exception' &&
135
- error['reason'] =~ regexp
119
+ error['reason'] =~ VERSION_CONFLICT_ERROR_REGEXP
136
120
  end
121
+
122
+ VERSION_CONFLICT_ERROR_REGEXP =
123
+ /^\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/.freeze
137
124
  end
138
125
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Zelastic
4
- VERSION = '0.6.1'
4
+ VERSION = '0.8.0'
5
5
  end
data/log/.keep ADDED
File without changes
data/zelastic.gemspec CHANGED
@@ -22,13 +22,14 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
+ spec.add_dependency 'elasticsearch', '>= 7', '< 9'
26
+
27
+ spec.add_dependency 'activerecord'
25
28
  spec.add_dependency 'activesupport'
26
29
 
27
- spec.add_development_dependency 'activerecord'
28
- spec.add_development_dependency 'bundler'
29
- spec.add_development_dependency 'elasticsearch'
30
- spec.add_development_dependency 'pry'
31
- spec.add_development_dependency 'rake'
32
- spec.add_development_dependency 'rspec'
33
- spec.add_development_dependency 'rubocop'
30
+ spec.add_development_dependency 'bundler', '~> 2'
31
+ spec.add_development_dependency 'carwow_rubocop', '~> 4'
32
+ spec.add_development_dependency 'pry', '~> 0.14'
33
+ spec.add_development_dependency 'rake', '~> 13'
34
+ spec.add_development_dependency 'rspec', '~> 3'
34
35
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zelastic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - carwow Developers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-24 00:00:00.000000000 Z
11
+ date: 2022-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
14
+ name: elasticsearch
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '7'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '9'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: '7'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '9'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: activerecord
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -31,7 +37,7 @@ dependencies:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '0'
34
- type: :development
40
+ type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
@@ -39,13 +45,13 @@ dependencies:
39
45
  - !ruby/object:Gem::Version
40
46
  version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
- name: bundler
48
+ name: activesupport
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - ">="
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
- type: :development
54
+ type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
@@ -53,75 +59,75 @@ dependencies:
53
59
  - !ruby/object:Gem::Version
54
60
  version: '0'
55
61
  - !ruby/object:Gem::Dependency
56
- name: elasticsearch
62
+ name: bundler
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - ">="
65
+ - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '0'
67
+ version: '2'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - ">="
72
+ - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '0'
74
+ version: '2'
69
75
  - !ruby/object:Gem::Dependency
70
- name: pry
76
+ name: carwow_rubocop
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - ">="
79
+ - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '0'
81
+ version: '4'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
- - - ">="
86
+ - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '0'
88
+ version: '4'
83
89
  - !ruby/object:Gem::Dependency
84
- name: rake
90
+ name: pry
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - ">="
93
+ - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '0'
95
+ version: '0.14'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - ">="
100
+ - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '0'
102
+ version: '0.14'
97
103
  - !ruby/object:Gem::Dependency
98
- name: rspec
104
+ name: rake
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
- - - ">="
107
+ - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: '0'
109
+ version: '13'
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
- - - ">="
114
+ - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '0'
116
+ version: '13'
111
117
  - !ruby/object:Gem::Dependency
112
- name: rubocop
118
+ name: rspec
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
115
- - - ">="
121
+ - - "~>"
116
122
  - !ruby/object:Gem::Version
117
- version: '0'
123
+ version: '3'
118
124
  type: :development
119
125
  prerelease: false
120
126
  version_requirements: !ruby/object:Gem::Requirement
121
127
  requirements:
122
- - - ">="
128
+ - - "~>"
123
129
  - !ruby/object:Gem::Version
124
- version: '0'
130
+ version: '3'
125
131
  description: An index manager for Elasticsearch and ActiveRecord
126
132
  email:
127
133
  - developers@carwow.co.uk
@@ -130,29 +136,31 @@ extensions: []
130
136
  extra_rdoc_files: []
131
137
  files:
132
138
  - ".circleci/config.yml"
139
+ - ".github/dependabot.yml"
133
140
  - ".gitignore"
134
141
  - ".rspec"
135
142
  - ".rubocop.yml"
136
- - ".rubocop_todo.yml"
137
143
  - CHANGELOG.md
138
144
  - Gemfile
139
- - Gemfile.lock
140
145
  - LICENSE.txt
141
146
  - README.md
142
147
  - Rakefile
143
148
  - bin/console
149
+ - bin/rspec
150
+ - bin/rubocop
144
151
  - bin/setup
145
152
  - lib/zelastic.rb
146
153
  - lib/zelastic/config.rb
147
154
  - lib/zelastic/index_manager.rb
148
155
  - lib/zelastic/indexer.rb
149
156
  - lib/zelastic/version.rb
157
+ - log/.keep
150
158
  - zelastic.gemspec
151
159
  homepage: https://github.com/carwow/zelastic
152
160
  licenses:
153
161
  - MIT
154
162
  metadata: {}
155
- post_install_message:
163
+ post_install_message:
156
164
  rdoc_options: []
157
165
  require_paths:
158
166
  - lib
@@ -167,8 +175,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
175
  - !ruby/object:Gem::Version
168
176
  version: '0'
169
177
  requirements: []
170
- rubygems_version: 3.0.3
171
- signing_key:
178
+ rubygems_version: 3.3.11
179
+ signing_key:
172
180
  specification_version: 4
173
181
  summary: Zero-downtime (re-)indexing of ActiveRecord models into Elasticsearch.
174
182
  test_files: []
data/.rubocop_todo.yml DELETED
@@ -1,32 +0,0 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2018-05-27 17:11:31 +0100 using RuboCop version 0.52.1.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 1
10
- Lint/ShadowingOuterLocalVariable:
11
- Exclude:
12
- - 'lib/zelastic/indexer.rb'
13
-
14
- # Offense count: 1
15
- Metrics/AbcSize:
16
- Max: 17
17
-
18
- # Offense count: 1
19
- # Configuration parameters: CountComments, ExcludedMethods.
20
- Metrics/BlockLength:
21
- Max: 83
22
-
23
- # Offense count: 4
24
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
25
- # URISchemes: http, https
26
- Metrics/LineLength:
27
- Max: 146
28
-
29
- # Offense count: 1
30
- Naming/AccessorMethodName:
31
- Exclude:
32
- - 'spec/zelastic/indexer_spec.rb'
data/Gemfile.lock DELETED
@@ -1,91 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- zelastic (0.6.0)
5
- activesupport
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- activemodel (5.1.4)
11
- activesupport (= 5.1.4)
12
- activerecord (5.1.4)
13
- activemodel (= 5.1.4)
14
- activesupport (= 5.1.4)
15
- arel (~> 8.0)
16
- activesupport (5.1.4)
17
- concurrent-ruby (~> 1.0, >= 1.0.2)
18
- i18n (~> 0.7)
19
- minitest (~> 5.1)
20
- tzinfo (~> 1.1)
21
- arel (8.0.0)
22
- ast (2.3.0)
23
- coderay (1.1.2)
24
- concurrent-ruby (1.0.5)
25
- diff-lcs (1.3)
26
- elasticsearch (6.0.2)
27
- elasticsearch-api (= 6.0.2)
28
- elasticsearch-transport (= 6.0.2)
29
- elasticsearch-api (6.0.2)
30
- multi_json
31
- elasticsearch-transport (6.0.2)
32
- faraday
33
- multi_json
34
- faraday (0.15.2)
35
- multipart-post (>= 1.2, < 3)
36
- i18n (0.9.1)
37
- concurrent-ruby (~> 1.0)
38
- method_source (0.9.0)
39
- minitest (5.11.1)
40
- multi_json (1.13.1)
41
- multipart-post (2.0.0)
42
- parallel (1.12.1)
43
- parser (2.4.0.2)
44
- ast (~> 2.3)
45
- powerpack (0.1.1)
46
- pry (0.11.3)
47
- coderay (~> 1.1.0)
48
- method_source (~> 0.9.0)
49
- rainbow (3.0.0)
50
- rake (13.0.1)
51
- rspec (3.7.0)
52
- rspec-core (~> 3.7.0)
53
- rspec-expectations (~> 3.7.0)
54
- rspec-mocks (~> 3.7.0)
55
- rspec-core (3.7.1)
56
- rspec-support (~> 3.7.0)
57
- rspec-expectations (3.7.0)
58
- diff-lcs (>= 1.2.0, < 2.0)
59
- rspec-support (~> 3.7.0)
60
- rspec-mocks (3.7.0)
61
- diff-lcs (>= 1.2.0, < 2.0)
62
- rspec-support (~> 3.7.0)
63
- rspec-support (3.7.0)
64
- rubocop (0.52.1)
65
- parallel (~> 1.10)
66
- parser (>= 2.4.0.2, < 3.0)
67
- powerpack (~> 0.1)
68
- rainbow (>= 2.2.2, < 4.0)
69
- ruby-progressbar (~> 1.7)
70
- unicode-display_width (~> 1.0, >= 1.0.1)
71
- ruby-progressbar (1.9.0)
72
- thread_safe (0.3.6)
73
- tzinfo (1.2.4)
74
- thread_safe (~> 0.1)
75
- unicode-display_width (1.3.0)
76
-
77
- PLATFORMS
78
- ruby
79
-
80
- DEPENDENCIES
81
- activerecord
82
- bundler
83
- elasticsearch
84
- pry
85
- rake
86
- rspec
87
- rubocop
88
- zelastic!
89
-
90
- BUNDLED WITH
91
- 1.17.2