elasticsearch-persistence 5.1.0 → 6.0.0.pre

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/Gemfile +9 -0
  4. data/README.md +164 -323
  5. data/Rakefile +8 -8
  6. data/elasticsearch-persistence.gemspec +4 -5
  7. data/lib/elasticsearch/persistence.rb +2 -110
  8. data/lib/elasticsearch/persistence/repository.rb +212 -53
  9. data/lib/elasticsearch/persistence/repository/dsl.rb +94 -0
  10. data/lib/elasticsearch/persistence/repository/find.rb +27 -10
  11. data/lib/elasticsearch/persistence/repository/response/results.rb +17 -5
  12. data/lib/elasticsearch/persistence/repository/search.rb +15 -4
  13. data/lib/elasticsearch/persistence/repository/serialize.rb +65 -7
  14. data/lib/elasticsearch/persistence/repository/store.rb +38 -44
  15. data/lib/elasticsearch/persistence/version.rb +1 -1
  16. data/spec/repository/find_spec.rb +179 -0
  17. data/spec/repository/response/results_spec.rb +105 -0
  18. data/spec/repository/search_spec.rb +181 -0
  19. data/spec/repository/serialize_spec.rb +53 -0
  20. data/spec/repository/store_spec.rb +327 -0
  21. data/spec/repository_spec.rb +716 -0
  22. data/spec/spec_helper.rb +28 -0
  23. metadata +25 -80
  24. data/lib/elasticsearch/persistence/client.rb +0 -51
  25. data/lib/elasticsearch/persistence/model.rb +0 -153
  26. data/lib/elasticsearch/persistence/model/base.rb +0 -87
  27. data/lib/elasticsearch/persistence/model/errors.rb +0 -8
  28. data/lib/elasticsearch/persistence/model/find.rb +0 -180
  29. data/lib/elasticsearch/persistence/model/rails.rb +0 -47
  30. data/lib/elasticsearch/persistence/model/store.rb +0 -254
  31. data/lib/elasticsearch/persistence/model/utils.rb +0 -0
  32. data/lib/elasticsearch/persistence/repository/class.rb +0 -71
  33. data/lib/elasticsearch/persistence/repository/naming.rb +0 -115
  34. data/lib/rails/generators/elasticsearch/model/model_generator.rb +0 -21
  35. data/lib/rails/generators/elasticsearch/model/templates/model.rb.tt +0 -9
  36. data/lib/rails/generators/elasticsearch_generator.rb +0 -2
  37. data/test/integration/model/model_basic_test.rb +0 -238
  38. data/test/integration/repository/custom_class_test.rb +0 -85
  39. data/test/integration/repository/customized_class_test.rb +0 -82
  40. data/test/integration/repository/default_class_test.rb +0 -116
  41. data/test/integration/repository/virtus_model_test.rb +0 -118
  42. data/test/test_helper.rb +0 -55
  43. data/test/unit/model_base_test.rb +0 -72
  44. data/test/unit/model_find_test.rb +0 -153
  45. data/test/unit/model_gateway_test.rb +0 -101
  46. data/test/unit/model_rails_test.rb +0 -112
  47. data/test/unit/model_store_test.rb +0 -576
  48. data/test/unit/persistence_test.rb +0 -32
  49. data/test/unit/repository_class_test.rb +0 -51
  50. data/test/unit/repository_client_test.rb +0 -32
  51. data/test/unit/repository_find_test.rb +0 -388
  52. data/test/unit/repository_indexing_test.rb +0 -37
  53. data/test/unit/repository_module_test.rb +0 -146
  54. data/test/unit/repository_naming_test.rb +0 -146
  55. data/test/unit/repository_response_results_test.rb +0 -98
  56. data/test/unit/repository_search_test.rb +0 -117
  57. data/test/unit/repository_serialize_test.rb +0 -57
  58. data/test/unit/repository_store_test.rb +0 -303
@@ -0,0 +1,28 @@
1
+ require 'pry-nav'
2
+ require 'elasticsearch/persistence'
3
+
4
+ RSpec.configure do |config|
5
+ config.formatter = 'documentation'
6
+ config.color = true
7
+
8
+ config.after(:suite) do
9
+ DEFAULT_CLIENT.indices.delete(index: '_all')
10
+ end
11
+ end
12
+
13
+ # The default client to be used by the repositories.
14
+ #
15
+ # @since 6.0.0
16
+ DEFAULT_CLIENT = Elasticsearch::Client.new(host: "localhost:#{(ENV['TEST_CLUSTER_PORT'] || 9250)}",
17
+ tracer: (ENV['QUIET'] ? nil : ::Logger.new(STDERR)))
18
+
19
+ class MyTestRepository
20
+ include Elasticsearch::Persistence::Repository
21
+ include Elasticsearch::Persistence::Repository::DSL
22
+ client DEFAULT_CLIENT
23
+ end
24
+
25
+ # The default repository to be used by tests.
26
+ #
27
+ # @since 6.0.0
28
+ DEFAULT_REPOSITORY = MyTestRepository.new(index_name: 'my_test_repository', document_type: 'test')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elasticsearch-persistence
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 6.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karel Minarik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-04 00:00:00.000000000 Z
11
+ date: 2018-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: elasticsearch
@@ -16,26 +16,26 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5'
19
+ version: '6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5'
26
+ version: '6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: elasticsearch-model
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '5'
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
40
  version: '5'
41
41
  - !ruby/object:Gem::Dependency
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: virtus
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: bundler
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -314,6 +300,7 @@ extra_rdoc_files:
314
300
  - LICENSE.txt
315
301
  files:
316
302
  - ".gitignore"
303
+ - ".rspec"
317
304
  - CHANGELOG.md
318
305
  - Gemfile
319
306
  - LICENSE.txt
@@ -349,48 +336,21 @@ files:
349
336
  - examples/notes/config.ru
350
337
  - examples/notes/test.rb
351
338
  - lib/elasticsearch/persistence.rb
352
- - lib/elasticsearch/persistence/client.rb
353
- - lib/elasticsearch/persistence/model.rb
354
- - lib/elasticsearch/persistence/model/base.rb
355
- - lib/elasticsearch/persistence/model/errors.rb
356
- - lib/elasticsearch/persistence/model/find.rb
357
- - lib/elasticsearch/persistence/model/rails.rb
358
- - lib/elasticsearch/persistence/model/store.rb
359
- - lib/elasticsearch/persistence/model/utils.rb
360
339
  - lib/elasticsearch/persistence/repository.rb
361
- - lib/elasticsearch/persistence/repository/class.rb
340
+ - lib/elasticsearch/persistence/repository/dsl.rb
362
341
  - lib/elasticsearch/persistence/repository/find.rb
363
- - lib/elasticsearch/persistence/repository/naming.rb
364
342
  - lib/elasticsearch/persistence/repository/response/results.rb
365
343
  - lib/elasticsearch/persistence/repository/search.rb
366
344
  - lib/elasticsearch/persistence/repository/serialize.rb
367
345
  - lib/elasticsearch/persistence/repository/store.rb
368
346
  - lib/elasticsearch/persistence/version.rb
369
- - lib/rails/generators/elasticsearch/model/model_generator.rb
370
- - lib/rails/generators/elasticsearch/model/templates/model.rb.tt
371
- - lib/rails/generators/elasticsearch_generator.rb
372
- - test/integration/model/model_basic_test.rb
373
- - test/integration/repository/custom_class_test.rb
374
- - test/integration/repository/customized_class_test.rb
375
- - test/integration/repository/default_class_test.rb
376
- - test/integration/repository/virtus_model_test.rb
377
- - test/test_helper.rb
378
- - test/unit/model_base_test.rb
379
- - test/unit/model_find_test.rb
380
- - test/unit/model_gateway_test.rb
381
- - test/unit/model_rails_test.rb
382
- - test/unit/model_store_test.rb
383
- - test/unit/persistence_test.rb
384
- - test/unit/repository_class_test.rb
385
- - test/unit/repository_client_test.rb
386
- - test/unit/repository_find_test.rb
387
- - test/unit/repository_indexing_test.rb
388
- - test/unit/repository_module_test.rb
389
- - test/unit/repository_naming_test.rb
390
- - test/unit/repository_response_results_test.rb
391
- - test/unit/repository_search_test.rb
392
- - test/unit/repository_serialize_test.rb
393
- - test/unit/repository_store_test.rb
347
+ - spec/repository/find_spec.rb
348
+ - spec/repository/response/results_spec.rb
349
+ - spec/repository/search_spec.rb
350
+ - spec/repository/serialize_spec.rb
351
+ - spec/repository/store_spec.rb
352
+ - spec/repository_spec.rb
353
+ - spec/spec_helper.rb
394
354
  homepage: https://github.com/elasticsearch/elasticsearch-rails/
395
355
  licenses:
396
356
  - Apache 2
@@ -407,35 +367,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
407
367
  version: 1.9.3
408
368
  required_rubygems_version: !ruby/object:Gem::Requirement
409
369
  requirements:
410
- - - ">="
370
+ - - ">"
411
371
  - !ruby/object:Gem::Version
412
- version: '0'
372
+ version: 1.3.1
413
373
  requirements: []
414
374
  rubyforge_project:
415
- rubygems_version: 2.7.6
375
+ rubygems_version: 2.7.7
416
376
  signing_key:
417
377
  specification_version: 4
418
378
  summary: Persistence layer for Ruby models and Elasticsearch.
419
379
  test_files:
420
- - test/integration/model/model_basic_test.rb
421
- - test/integration/repository/custom_class_test.rb
422
- - test/integration/repository/customized_class_test.rb
423
- - test/integration/repository/default_class_test.rb
424
- - test/integration/repository/virtus_model_test.rb
425
- - test/test_helper.rb
426
- - test/unit/model_base_test.rb
427
- - test/unit/model_find_test.rb
428
- - test/unit/model_gateway_test.rb
429
- - test/unit/model_rails_test.rb
430
- - test/unit/model_store_test.rb
431
- - test/unit/persistence_test.rb
432
- - test/unit/repository_class_test.rb
433
- - test/unit/repository_client_test.rb
434
- - test/unit/repository_find_test.rb
435
- - test/unit/repository_indexing_test.rb
436
- - test/unit/repository_module_test.rb
437
- - test/unit/repository_naming_test.rb
438
- - test/unit/repository_response_results_test.rb
439
- - test/unit/repository_search_test.rb
440
- - test/unit/repository_serialize_test.rb
441
- - test/unit/repository_store_test.rb
380
+ - spec/repository/find_spec.rb
381
+ - spec/repository/response/results_spec.rb
382
+ - spec/repository/search_spec.rb
383
+ - spec/repository/serialize_spec.rb
384
+ - spec/repository/store_spec.rb
385
+ - spec/repository_spec.rb
386
+ - spec/spec_helper.rb
@@ -1,51 +0,0 @@
1
- module Elasticsearch
2
- module Persistence
3
- module Repository
4
-
5
- # Wraps the Elasticsearch Ruby
6
- # [client](https://github.com/elasticsearch/elasticsearch-ruby/tree/master/elasticsearch#usage)
7
- #
8
- module Client
9
-
10
- # Get or set the default client for this repository
11
- #
12
- # @example Set and configure the client for the repository class
13
- #
14
- # class MyRepository
15
- # include Elasticsearch::Persistence::Repository
16
- # client Elasticsearch::Client.new host: 'http://localhost:9200', log: true
17
- # end
18
- #
19
- # @example Set and configure the client for this repository instance
20
- #
21
- # repository.client Elasticsearch::Client.new host: 'http://localhost:9200', tracer: true
22
- #
23
- # @example Perform an API request through the client
24
- #
25
- # MyRepository.client.cluster.health
26
- # repository.client.cluster.health
27
- # # => { "cluster_name" => "elasticsearch" ... }
28
- #
29
- def client client=nil
30
- @client = client || @client || Elasticsearch::Persistence.client
31
- end
32
-
33
- # Set the default client for this repository
34
- #
35
- # @example Set and configure the client for the repository class
36
- #
37
- # MyRepository.client = Elasticsearch::Client.new host: 'http://localhost:9200', log: true
38
- #
39
- # @example Set and configure the client for this repository instance
40
- #
41
- # repository.client = Elasticsearch::Client.new host: 'http://localhost:9200', tracer: true
42
- #
43
- def client=(client)
44
- @client = client
45
- @client
46
- end
47
- end
48
-
49
- end
50
- end
51
- end
@@ -1,153 +0,0 @@
1
- require 'active_support/core_ext/module/delegation'
2
-
3
- require 'active_model'
4
- require 'virtus'
5
-
6
- require 'elasticsearch/persistence'
7
- require 'elasticsearch/persistence/model/base'
8
- require 'elasticsearch/persistence/model/errors'
9
- require 'elasticsearch/persistence/model/store'
10
- require 'elasticsearch/persistence/model/find'
11
-
12
- module Elasticsearch
13
- module Persistence
14
-
15
- # When included, extends a plain Ruby class with persistence-related features via the ActiveRecord pattern
16
- #
17
- # @example Include the repository in a custom class
18
- #
19
- # require 'elasticsearch/persistence/model'
20
- #
21
- # class MyObject
22
- # include Elasticsearch::Persistence::Repository
23
- # end
24
- #
25
- module Model
26
- def self.included(base)
27
- base.class_eval do
28
- include ActiveModel::Naming
29
- include ActiveModel::Conversion
30
- include ActiveModel::Serialization
31
- include ActiveModel::Serializers::JSON
32
- include ActiveModel::Validations
33
-
34
- include Virtus.model
35
-
36
- extend ActiveModel::Callbacks
37
- define_model_callbacks :create, :save, :update, :destroy
38
- define_model_callbacks :find, :touch, only: :after
39
-
40
- include Elasticsearch::Persistence::Model::Base::InstanceMethods
41
-
42
- extend Elasticsearch::Persistence::Model::Store::ClassMethods
43
- include Elasticsearch::Persistence::Model::Store::InstanceMethods
44
-
45
- extend Elasticsearch::Persistence::Model::Find::ClassMethods
46
-
47
- class << self
48
- # Re-define the Virtus' `attribute` method, to configure Elasticsearch mapping as well
49
- #
50
- def attribute(name, type=nil, options={}, &block)
51
- mapping = options.delete(:mapping) || {}
52
- super
53
-
54
- gateway.mapping do
55
- indexes name, {type: Utils::lookup_type(type)}.merge(mapping)
56
- end
57
-
58
- gateway.mapping(&block) if block_given?
59
- end
60
-
61
- # Return the {Repository::Class} instance
62
- #
63
- def gateway(&block)
64
- @gateway ||= Elasticsearch::Persistence::Repository::Class.new host: self
65
- block.arity < 1 ? @gateway.instance_eval(&block) : block.call(@gateway) if block_given?
66
- @gateway
67
- end
68
-
69
- DEPRECATION_WARNING = "This (ActiveRecord) persistence pattern is deprecated. It will be removed in " +
70
- "version 6.0 in favor of the Repository pattern. Please see the ReadMe for " +
71
- "details on the alternative pattern.\n" +
72
- "https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-persistence" +
73
- "#the-repository-pattern".freeze
74
-
75
- # Warn that this ActiveRecord persistence pattern is deprecated.
76
- #
77
- def raise_deprecation_warning!
78
- if STDERR.tty?
79
- Kernel.warn("\e[31;1m#{DEPRECATION_WARNING}\e[0m")
80
- else
81
- Kernel.warn(DEPRECATION_WARNING)
82
- end
83
- end
84
-
85
- # Delegate methods to repository
86
- #
87
- delegate :settings,
88
- :mappings,
89
- :mapping,
90
- :document_type=,
91
- :index_name,
92
- :index_name=,
93
- :find,
94
- :exists?,
95
- :create_index!,
96
- :refresh_index!,
97
- to: :gateway
98
-
99
- # forward document type to mappings when set
100
- def document_type(type = nil)
101
- return gateway.document_type unless type
102
- gateway.document_type type
103
- mapping.type = type
104
- end
105
- end
106
-
107
- # Configure the repository based on the model (set up index_name, etc)
108
- #
109
- gateway do
110
- klass base
111
- index_name base.model_name.collection.gsub(/\//, '-')
112
- document_type base.model_name.element
113
-
114
- def serialize(document)
115
- document.to_hash.except(:id, 'id')
116
- end
117
-
118
- def deserialize(document)
119
- object = klass.new document['_source']
120
-
121
- # Set the meta attributes when fetching the document from Elasticsearch
122
- #
123
- object.instance_variable_set :@_id, document['_id']
124
- object.instance_variable_set :@_index, document['_index']
125
- object.instance_variable_set :@_type, document['_type']
126
- object.instance_variable_set :@_version, document['_version']
127
- object.instance_variable_set :@_source, document['_source']
128
-
129
- # Store the "hit" information (highlighting, score, ...)
130
- #
131
- object.instance_variable_set :@hit,
132
- Elasticsearch::Model::HashWrapper.new(document.except('_index', '_type', '_id', '_version', '_source'))
133
-
134
- object.instance_variable_set(:@persisted, true)
135
- object
136
- end
137
- end
138
-
139
- # Set up common attributes
140
- #
141
- attribute :created_at, Time, default: lambda { |o,a| Time.now.utc }
142
- attribute :updated_at, Time, default: lambda { |o,a| Time.now.utc }
143
-
144
- attr_reader :hit
145
-
146
- raise_deprecation_warning!
147
- end
148
-
149
- end
150
- end
151
-
152
- end
153
- end
@@ -1,87 +0,0 @@
1
- module Elasticsearch
2
- module Persistence
3
- module Model
4
- # This module contains the base interface for models
5
- #
6
- module Base
7
- module InstanceMethods
8
-
9
- # Model initializer sets the `@id` variable if passed
10
- #
11
- def initialize(attributes={})
12
- @_id = attributes[:id] || attributes['id']
13
- super
14
- end
15
-
16
- # Return model attributes as a Hash, merging in the `id`
17
- #
18
- def attributes
19
- super.merge id: id
20
- end
21
-
22
- # Return the document `_id`
23
- #
24
- def id
25
- @_id
26
- end; alias :_id :id
27
-
28
- # Set the document `_id`
29
- #
30
- def id=(value)
31
- @_id = value
32
- end; alias :_id= :id=
33
-
34
- # Return the document `_index`
35
- #
36
- def _index
37
- @_index
38
- end
39
-
40
- # Return the document `_type`
41
- #
42
- def _type
43
- @_type
44
- end
45
-
46
- # Return the document `_version`
47
- #
48
- def _version
49
- @_version
50
- end
51
-
52
- # Return the raw document `_source`
53
- #
54
- def _source
55
- @_source
56
- end
57
-
58
- def to_s
59
- "#<#{self.class} #{attributes.to_hash.inspect.gsub(/:(\w+)=>/, '\1: ')}>"
60
- end; alias :inspect :to_s
61
- end
62
- end
63
-
64
- # Utility methods for {Elasticsearch::Persistence::Model}
65
- #
66
- module Utils
67
-
68
- # Return Elasticsearch type based on passed Ruby class (used in the `attribute` method)
69
- #
70
- def lookup_type(type)
71
- case
72
- when type == String
73
- 'text'
74
- when type == Integer
75
- 'integer'
76
- when type == Float
77
- 'float'
78
- when type == Date || type == Time || type == DateTime
79
- 'date'
80
- when type == Virtus::Attribute::Boolean
81
- 'boolean'
82
- end
83
- end; module_function :lookup_type
84
- end
85
- end
86
- end
87
- end