elasticsearch-persistence 6.0.0.pre → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -24
  3. data/examples/notes/application.rb +3 -4
  4. data/lib/elasticsearch/persistence/repository/response/results.rb +9 -8
  5. data/lib/elasticsearch/persistence/repository/search.rb +18 -17
  6. data/lib/elasticsearch/persistence/version.rb +1 -1
  7. data/spec/repository/response/results_spec.rb +23 -0
  8. metadata +4 -26
  9. data/examples/music/album.rb +0 -54
  10. data/examples/music/artist.rb +0 -70
  11. data/examples/music/artists/_form.html.erb +0 -8
  12. data/examples/music/artists/artists_controller.rb +0 -67
  13. data/examples/music/artists/artists_controller_test.rb +0 -53
  14. data/examples/music/artists/index.html.erb +0 -60
  15. data/examples/music/artists/show.html.erb +0 -54
  16. data/examples/music/assets/application.css +0 -257
  17. data/examples/music/assets/autocomplete.css +0 -48
  18. data/examples/music/assets/blank_artist.png +0 -0
  19. data/examples/music/assets/blank_cover.png +0 -0
  20. data/examples/music/assets/form.css +0 -113
  21. data/examples/music/index_manager.rb +0 -73
  22. data/examples/music/search/index.html.erb +0 -95
  23. data/examples/music/search/search_controller.rb +0 -41
  24. data/examples/music/search/search_controller_test.rb +0 -12
  25. data/examples/music/search/search_helper.rb +0 -15
  26. data/examples/music/suggester.rb +0 -69
  27. data/examples/music/template.rb +0 -430
  28. data/examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.css +0 -7
  29. data/examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.js +0 -6
  30. data/examples/music/vendor/assets/stylesheets/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd3b68c6704df1a51940545080b631c127701074727d9879c5eaf9bf29513d63
4
- data.tar.gz: 966be9deff09a99f149b8c7206b383737be278dd96f368fbda45d30b59fc0439
3
+ metadata.gz: 31bf48d65a26143768e093d3ef1a26f0d95adb5f4f009448b1b48cde4f1b643a
4
+ data.tar.gz: bf4f4581573e35a873cb8d1f2db6ec86ddf39420010fcaab6e00fced48f91376
5
5
  SHA512:
6
- metadata.gz: 0ffc1d1c058660ee3060ffaac44449e4a19b0ee34b2f12f1818aa22753c4a670c7c3dfe9975f44bc41cff8913cb6604bcc6e8e61633e8263ef1888c4a024382b
7
- data.tar.gz: 2e589e4a386389e4c41a95c92738d79def0ff49ec18ee2add9ba07e813ae4d2704156dbbe0a9dafeff3cc9767fda38fbfd570ad3c6a7d0be7973f92ab33e35b4
6
+ metadata.gz: 4e353c41e60cfa475821d87107aaceffaf399f0da68a28d8ecc529b5aadf3257bdc0df61f07a22055645ad143279cc1d30e895b505837bf540813e089622a95a
7
+ data.tar.gz: ec8f36fb64a038a5d0ec91bb51404b0c15d1d2b731175eba456098030c841c7e4d269c0e9f14c425b79a52b6531af1402c968a556560b29a8608df27c36b14a3
data/README.md CHANGED
@@ -42,7 +42,7 @@ The library provides the Repository pattern for adding persistence to your Ruby
42
42
 
43
43
  The `Elasticsearch::Persistence::Repository` module provides an implementation of the
44
44
  [repository pattern](http://martinfowler.com/eaaCatalog/repository.html) and allows
45
- to save, delete, find and search objects stored in Elasticsearch, as well as configure
45
+ you to save, delete, find and search objects stored in Elasticsearch, as well as configure
46
46
  mappings and settings for the index. It's an unobtrusive and decoupled way of adding
47
47
  persistence to your Ruby objects.
48
48
 
@@ -76,7 +76,7 @@ We can save a `Note` instance into the repository...
76
76
  note = Note.new id: 1, text: 'Test'
77
77
 
78
78
  repository.save(note)
79
- # PUT http://localhost:9200/repository/note/1 [status:201, request:0.210s, query:n/a]
79
+ # PUT http://localhost:9200/repository/_doc/1 [status:201, request:0.210s, query:n/a]
80
80
  # > {"id":1,"text":"Test"}
81
81
  # < {"_index":"repository","_type":"note","_id":"1","_version":1,"created":true}
82
82
  ```
@@ -85,7 +85,7 @@ repository.save(note)
85
85
 
86
86
  ```ruby
87
87
  n = repository.find(1)
88
- # GET http://localhost:9200/repository/_all/1 [status:200, request:0.003s, query:n/a]
88
+ # GET http://localhost:9200/repository/_doc/1 [status:200, request:0.003s, query:n/a]
89
89
  # < {"_index":"repository","_type":"note","_id":"1","_version":2,"found":true, "_source" : {"id":1,"text":"Test"}}
90
90
  => <Note:0x007fcbfc0c4980 @attributes={"id"=>1, "text"=>"Test"}>
91
91
  ```
@@ -104,7 +104,7 @@ repository.search(query: { match: { text: 'test' } }).first
104
104
 
105
105
  ```ruby
106
106
  repository.delete(note)
107
- # DELETE http://localhost:9200/repository/note/1 [status:200, request:0.014s, query:n/a]
107
+ # DELETE http://localhost:9200/repository/_doc/1 [status:200, request:0.014s, query:n/a]
108
108
  # < {"found":true,"_index":"repository","_type":"note","_id":"1","_version":3}
109
109
  => {"found"=>true, "_index"=>"repository", "_type"=>"note", "_id"=>"1", "_version"=>2}
110
110
  ```
@@ -145,7 +145,7 @@ class MyRepository
145
145
  end
146
146
 
147
147
  client = Elasticsearch::Client.new(url: ENV['ELASTICSEARCH_URL'], log: true)
148
- repository = MyRepository.new(client: client, index_name: :my_notes, type: :my_note, klass: Note)
148
+ repository = MyRepository.new(client: client, index_name: :my_notes, type: :note, klass: Note)
149
149
  repository.settings number_of_shards: 1 do
150
150
  mapping do
151
151
  indexes :text, analyzer: 'snowball'
@@ -168,7 +168,7 @@ Save the document with extra properties added by the `serialize` method:
168
168
 
169
169
  ```ruby
170
170
  repository.save(note)
171
- # PUT http://localhost:9200/my_notes/my_note/1
171
+ # PUT http://localhost:9200/my_notes/note/1
172
172
  # > {"id":1,"text":"Test","my_special_key":"my_special_stuff"}
173
173
  {"_index"=>"my_notes", "_type"=>"my_note", "_id"=>"1", "_version"=>4, ... }
174
174
  ```
@@ -177,7 +177,7 @@ And `deserialize` it:
177
177
 
178
178
  ```ruby
179
179
  repository.find(1)
180
- # ***** CUSTOM DESERIALIZE LOGIC KICKING IN... *****
180
+ # ***** CUSTOM DESERIALIZE LOGIC... *****
181
181
  <Note:0x007f9bd782b7a0 @attributes={... "my_special_key"=>"my_special_stuff"}>
182
182
  ```
183
183
 
@@ -245,10 +245,10 @@ repository.create_index!(force: true)
245
245
  note = Note.new('id' => 1, 'text' => 'Document with image', 'image' => '... BINARY DATA ...')
246
246
 
247
247
  repository.save(note)
248
- # PUT http://localhost:9200/notes_development/note/1
248
+ # PUT http://localhost:9200/notes_development/_doc/1
249
249
  # > {"id":1,"text":"Document with image","image":"Li4uIEJJTkFSWSBEQVRBIC4uLg==\n"}
250
250
  puts repository.find(1).attributes['image']
251
- # GET http://localhost:9200/notes_development/note/1
251
+ # GET http://localhost:9200/notes_development/_doc/1
252
252
  # < {... "_source" : { ... "image":"Li4uIEJJTkFSWSBEQVRBIC4uLg==\n"}}
253
253
  # => ... BINARY DATA ...
254
254
  ```
@@ -257,9 +257,9 @@ puts repository.find(1).attributes['image']
257
257
 
258
258
  Each of the following configurations can be set for a repository instance.
259
259
  If you have included the `Elasticsearch::Persistence::Repository::DSL` mixin, then you can use the class-level DSL
260
- methods to set each configuration. You can override the configuration for any instance by passing options to the
260
+ methods to set each value. You can still override the configuration for any instance by passing options to the
261
261
  `#initialize` method.
262
- If you don't use the DSL mixin, you can set also the instance configuration with options passed the `#initialize` method.
262
+ Even if you don't use the DSL mixin, you can set the instance configuration with options passed the `#initialize` method.
263
263
 
264
264
  ##### Client
265
265
 
@@ -269,6 +269,9 @@ The repository uses the standard Elasticsearch [client](https://github.com/elast
269
269
  client = Elasticsearch::Client.new(url: 'http://search.server.org')
270
270
  repository = NoteRepository.new(client: client)
271
271
  repository.client.transport.logger = Logger.new(STDERR)
272
+ repository.client
273
+ # => Elasticsearch::Client
274
+
272
275
  ```
273
276
 
274
277
  or with the DSL mixin:
@@ -282,6 +285,8 @@ class NoteRepository
282
285
  end
283
286
 
284
287
  repository = NoteRepository.new
288
+ repository.client
289
+ # => Elasticsearch::Client
285
290
 
286
291
  ```
287
292
 
@@ -292,6 +297,9 @@ is 'repository'.
292
297
 
293
298
  ```ruby
294
299
  repository = NoteRepository.new(index_name: 'notes_development')
300
+ repository.index_name
301
+ # => 'notes_development'
302
+
295
303
  ```
296
304
 
297
305
  or with the DSL mixin:
@@ -305,15 +313,20 @@ class NoteRepository
305
313
  end
306
314
 
307
315
  repository = NoteRepository.new
316
+ repository.index_name
317
+ # => 'notes_development'
308
318
 
309
319
  ```
310
320
 
311
- The `type` method specifies the Elasticsearch document type to use for storage, lookup and search. The default value is
321
+ The `document_type` method specifies the Elasticsearch document type to use for storage, lookup and search. The default value is
312
322
  '_doc'. Keep in mind that future versions of Elasticsearch will not allow you to set this yourself and will use the type,
313
323
  '_doc'.
314
324
 
315
325
  ```ruby
316
326
  repository = NoteRepository.new(document_type: 'note')
327
+ repository.document_type
328
+ # => 'note'
329
+
317
330
  ```
318
331
 
319
332
  or with the DSL mixin:
@@ -327,6 +340,8 @@ class NoteRepository
327
340
  end
328
341
 
329
342
  repository = NoteRepository.new
343
+ repository.document_type
344
+ # => 'note'
330
345
 
331
346
  ```
332
347
 
@@ -336,6 +351,9 @@ returned instead.
336
351
 
337
352
  ```ruby
338
353
  repository = NoteRepository.new(klass: Note)
354
+ repository.klass
355
+ # => Note
356
+
339
357
  ```
340
358
 
341
359
  or with the DSL mixin:
@@ -349,6 +367,8 @@ class NoteRepository
349
367
  end
350
368
 
351
369
  repository = NoteRepository.new
370
+ repository.klass
371
+ # => Note
352
372
 
353
373
  ```
354
374
 
@@ -383,8 +403,10 @@ repository = NoteRepository.new
383
403
 
384
404
  ```
385
405
 
386
- You can also use the `#create` method defined on the repository class to create and set the mappings and settings
387
- on an instance with a block in one call:
406
+ ##### Create a Repository and set its configuration with a block
407
+
408
+ You can also use the `#create` method to instantiate and set the mappings and settings on an instance
409
+ with a block in one call:
388
410
 
389
411
  ```ruby
390
412
  repository = NoteRepository.create(index_name: 'notes_development') do
@@ -399,13 +421,15 @@ repository = NoteRepository.create(index_name: 'notes_development') do
399
421
  end
400
422
  ```
401
423
 
424
+ ##### Index Management
425
+
402
426
  The convenience methods `create_index!`, `delete_index!` and `refresh_index!` allow you to manage the index lifecycle.
403
427
  These methods can only be called on repository instances and are not implemented at the class level.
404
428
 
405
429
  ##### Serialization
406
430
 
407
- The `serialize` and `deserialize` methods allow you to customize the serialization of the document when passing it
408
- to the storage, and the initialization procedure when loading it from the storage:
431
+ The `serialize` and `deserialize` methods allow you to customize the serialization of the document when it
432
+ is persisted to Elasticsearch, and define the initialization procedure when loading it from the storage:
409
433
 
410
434
  ```ruby
411
435
  class NoteRepository
@@ -428,7 +452,7 @@ The `save` method allows you to store a domain object in the repository:
428
452
  ```ruby
429
453
  note = Note.new id: 1, title: 'Quick Brown Fox'
430
454
  repository.save(note)
431
- # => {"_index"=>"notes_development", "_type"=>"my_note", "_id"=>"1", "_version"=>1, "created"=>true}
455
+ # => {"_index"=>"notes_development", "_type"=>"_doc", "_id"=>"1", "_version"=>1, "created"=>true}
432
456
  ```
433
457
 
434
458
  The `update` method allows you to perform a partial update of a document in the repository.
@@ -436,18 +460,18 @@ Use either a partial document:
436
460
 
437
461
  ```ruby
438
462
  repository.update id: 1, title: 'UPDATED', tags: []
439
- # => {"_index"=>"notes_development", "_type"=>"note", "_id"=>"1", "_version"=>2}
463
+ # => {"_index"=>"notes_development", "_type"=>"_doc", "_id"=>"1", "_version"=>2}
440
464
  ```
441
465
 
442
466
  Or a script (optionally with parameters):
443
467
 
444
468
  ```ruby
445
469
  repository.update 1, script: 'if (!ctx._source.tags.contains(t)) { ctx._source.tags += t }', params: { t: 'foo' }
446
- # => {"_index"=>"notes_development", "_type"=>"note", "_id"=>"1", "_version"=>3}
470
+ # => {"_index"=>"notes_development", "_type"=>"_doc", "_id"=>"1", "_version"=>3}
447
471
  ```
448
472
 
449
473
 
450
- The `delete` method allows to remove objects from the repository (pass either the object itself or its ID):
474
+ The `delete` method allows you to remove objects from the repository (pass either the object itself or its ID):
451
475
 
452
476
  ```ruby
453
477
  repository.delete(note)
@@ -456,7 +480,7 @@ repository.delete(1)
456
480
 
457
481
  ##### Finding
458
482
 
459
- The `find` method allows to find one or many documents in the storage and returns them as deserialized Ruby objects:
483
+ The `find` method allows you to find one or many documents in the storage and returns them as deserialized Ruby objects:
460
484
 
461
485
  ```ruby
462
486
  repository.save Note.new(id: 2, title: 'Fast White Dog')
@@ -479,15 +503,15 @@ Handle the missing objects in the application code, or call `compact` on the res
479
503
 
480
504
  ##### Search
481
505
 
482
- The `search` method to retrieve objects from the repository by a query string or definition in the Elasticsearch DSL:
506
+ The `search` method is used to retrieve objects from the repository by a query string or definition in the Elasticsearch DSL:
483
507
 
484
508
  ```ruby
485
509
  repository.search('fox or dog').to_a
486
- # GET http://localhost:9200/notes_development/my_note/_search?q=fox
510
+ # GET http://localhost:9200/notes_development/_doc/_search?q=fox
487
511
  # => [<MyNote ... FOX ...>, <MyNote ... DOG ...>]
488
512
 
489
513
  repository.search(query: { match: { title: 'fox dog' } }).to_a
490
- # GET http://localhost:9200/notes_development/my_note/_search
514
+ # GET http://localhost:9200/notes_development/_doc/_search
491
515
  # > {"query":{"match":{"title":"fox dog"}}}
492
516
  # => [<MyNote ... FOX ...>, <MyNote ... DOG ...>]
493
517
  ```
@@ -54,11 +54,12 @@ end
54
54
 
55
55
  class NoteRepository
56
56
  include Elasticsearch::Persistence::Repository
57
+ include Elasticsearch::Persistence::Repository::DSL
57
58
 
58
59
  client Elasticsearch::Client.new url: ENV['ELASTICSEARCH_URL'], log: true
59
60
 
60
- index :notes
61
- type :note
61
+ index_name :notes
62
+ document_type :note
62
63
 
63
64
  mapping do
64
65
  indexes :text, analyzer: 'snowball'
@@ -66,8 +67,6 @@ class NoteRepository
66
67
  indexes :created_at, type: 'date'
67
68
  end
68
69
 
69
- create_index!
70
-
71
70
  def deserialize(document)
72
71
  Note.new document['_source'].merge('id' => document['_id'])
73
72
  end
@@ -11,6 +11,7 @@ module Elasticsearch
11
11
  include Enumerable
12
12
 
13
13
  attr_reader :repository
14
+ attr_reader :raw_response
14
15
 
15
16
  # The key for accessing the results in an Elasticsearch query response.
16
17
  #
@@ -30,8 +31,8 @@ module Elasticsearch
30
31
  #
31
32
  def initialize(repository, response, options={})
32
33
  @repository = repository
33
- @response = Elasticsearch::Model::HashWrapper.new(response)
34
- @options = options
34
+ @raw_response = response
35
+ @options = options
35
36
  end
36
37
 
37
38
  def method_missing(method_name, *arguments, &block)
@@ -45,25 +46,25 @@ module Elasticsearch
45
46
  # The number of total hits for a query
46
47
  #
47
48
  def total
48
- response[HITS][TOTAL]
49
+ raw_response[HITS][TOTAL]
49
50
  end
50
51
 
51
52
  # The maximum score for a query
52
53
  #
53
54
  def max_score
54
- response[HITS][MAX_SCORE]
55
+ raw_response[HITS][MAX_SCORE]
55
56
  end
56
57
 
57
58
  # Yields [object, hit] pairs to the block
58
59
  #
59
60
  def each_with_hit(&block)
60
- results.zip(response[HITS][HITS]).each(&block)
61
+ results.zip(raw_response[HITS][HITS]).each(&block)
61
62
  end
62
63
 
63
64
  # Yields [object, hit] pairs and returns the result
64
65
  #
65
66
  def map_with_hit(&block)
66
- results.zip(response[HITS][HITS]).map(&block)
67
+ results.zip(raw_response[HITS][HITS]).map(&block)
67
68
  end
68
69
 
69
70
  # Return the collection of domain objects
@@ -76,7 +77,7 @@ module Elasticsearch
76
77
  # @return [Array]
77
78
  #
78
79
  def results
79
- @results ||= response[HITS][HITS].map do |document|
80
+ @results ||= raw_response[HITS][HITS].map do |document|
80
81
  repository.deserialize(document.to_hash)
81
82
  end
82
83
  end
@@ -93,7 +94,7 @@ module Elasticsearch
93
94
  # @return [Elasticsearch::Model::HashWrapper]
94
95
  #
95
96
  def response
96
- @response
97
+ @response ||= Elasticsearch::Model::HashWrapper.new(raw_response)
97
98
  end
98
99
  end
99
100
  end
@@ -43,18 +43,18 @@ module Elasticsearch
43
43
  # @return [Elasticsearch::Persistence::Repository::Response::Results]
44
44
  #
45
45
  def search(query_or_definition, options={})
46
- type = document_type
47
-
48
- case
49
- when query_or_definition.respond_to?(:to_hash)
50
- response = client.search( { index: index_name, type: type, body: query_or_definition.to_hash }.merge(options) )
51
- when query_or_definition.is_a?(String)
52
- response = client.search( { index: index_name, type: type, q: query_or_definition }.merge(options) )
46
+ request = { index: index_name,
47
+ type: document_type }
48
+ if query_or_definition.respond_to?(:to_hash)
49
+ request[:body] = query_or_definition.to_hash
50
+ elsif query_or_definition.is_a?(String)
51
+ request[:q] = query_or_definition
53
52
  else
54
53
  raise ArgumentError, "[!] Pass the search definition as a Hash-like object or pass the query as a String" +
55
- " -- #{query_or_definition.class} given."
54
+ " -- #{query_or_definition.class} given."
56
55
  end
57
- Response::Results.new(self, response)
56
+
57
+ Response::Results.new(self, client.search(request.merge(options)))
58
58
  end
59
59
 
60
60
  # Return the number of domain object in the index
@@ -81,18 +81,19 @@ module Elasticsearch
81
81
  #
82
82
  def count(query_or_definition=nil, options={})
83
83
  query_or_definition ||= { query: { match_all: {} } }
84
- type = document_type
84
+ request = { index: index_name,
85
+ type: document_type }
85
86
 
86
- case
87
- when query_or_definition.respond_to?(:to_hash)
88
- response = client.count( { index: index_name, type: type, body: query_or_definition.to_hash }.merge(options) )
89
- when query_or_definition.is_a?(String)
90
- response = client.count( { index: index_name, type: type, q: query_or_definition }.merge(options) )
87
+ if query_or_definition.respond_to?(:to_hash)
88
+ request[:body] = query_or_definition.to_hash
89
+ elsif query_or_definition.is_a?(String)
90
+ request[:q] = query_or_definition
91
91
  else
92
- raise ArgumentError, "[!] Pass the search definition as a Hash-like object or pass the query as a String, not as [#{query_or_definition.class}]"
92
+ raise ArgumentError, "[!] Pass the search definition as a Hash-like object or pass the query as a String" +
93
+ " -- #{query_or_definition.class} given."
93
94
  end
94
95
 
95
- response[COUNT]
96
+ client.count(request.merge(options))[COUNT]
96
97
  end
97
98
 
98
99
  private
@@ -1,5 +1,5 @@
1
1
  module Elasticsearch
2
2
  module Persistence
3
- VERSION = '6.0.0.pre'
3
+ VERSION = '6.0.0'
4
4
  end
5
5
  end
@@ -66,6 +66,22 @@ describe Elasticsearch::Persistence::Repository::Response::Results do
66
66
  it 'wraps the response in a HashWrapper' do
67
67
  expect(results.response._shards.total).to eq(5)
68
68
  end
69
+
70
+ context 'when the response method is not called' do
71
+
72
+ it 'does not create an instance of HashWrapper' do
73
+ expect(Elasticsearch::Model::HashWrapper).not_to receive(:new)
74
+ results
75
+ end
76
+ end
77
+
78
+ context 'when the response method is called' do
79
+
80
+ it 'does create an instance of HashWrapper' do
81
+ expect(Elasticsearch::Model::HashWrapper).to receive(:new)
82
+ results.response
83
+ end
84
+ end
69
85
  end
70
86
 
71
87
  describe '#total' do
@@ -102,4 +118,11 @@ describe Elasticsearch::Persistence::Repository::Response::Results do
102
118
  expect(results.map_with_hit { |pair| pair[0] }).to eq(['Object', 'Object'])
103
119
  end
104
120
  end
121
+
122
+ describe '#raw_response' do
123
+
124
+ it 'returns the raw response from Elasticsearch' do
125
+ expect(results.raw_response).to eq(response)
126
+ end
127
+ end
105
128
  end
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: 6.0.0.pre
4
+ version: 6.0.0
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-08-13 00:00:00.000000000 Z
11
+ date: 2018-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: elasticsearch
@@ -307,28 +307,6 @@ files:
307
307
  - README.md
308
308
  - Rakefile
309
309
  - elasticsearch-persistence.gemspec
310
- - examples/music/album.rb
311
- - examples/music/artist.rb
312
- - examples/music/artists/_form.html.erb
313
- - examples/music/artists/artists_controller.rb
314
- - examples/music/artists/artists_controller_test.rb
315
- - examples/music/artists/index.html.erb
316
- - examples/music/artists/show.html.erb
317
- - examples/music/assets/application.css
318
- - examples/music/assets/autocomplete.css
319
- - examples/music/assets/blank_artist.png
320
- - examples/music/assets/blank_cover.png
321
- - examples/music/assets/form.css
322
- - examples/music/index_manager.rb
323
- - examples/music/search/index.html.erb
324
- - examples/music/search/search_controller.rb
325
- - examples/music/search/search_controller_test.rb
326
- - examples/music/search/search_helper.rb
327
- - examples/music/suggester.rb
328
- - examples/music/template.rb
329
- - examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.css
330
- - examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.js
331
- - examples/music/vendor/assets/stylesheets/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
332
310
  - examples/notes/.gitignore
333
311
  - examples/notes/Gemfile
334
312
  - examples/notes/README.markdown
@@ -367,9 +345,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
367
345
  version: 1.9.3
368
346
  required_rubygems_version: !ruby/object:Gem::Requirement
369
347
  requirements:
370
- - - ">"
348
+ - - ">="
371
349
  - !ruby/object:Gem::Version
372
- version: 1.3.1
350
+ version: '0'
373
351
  requirements: []
374
352
  rubyforge_project:
375
353
  rubygems_version: 2.7.7