elasticsearch-persistence 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +238 -7
  4. data/elasticsearch-persistence.gemspec +4 -1
  5. data/examples/music/album.rb +34 -0
  6. data/examples/music/artist.rb +50 -0
  7. data/examples/music/artists/_form.html.erb +8 -0
  8. data/examples/music/artists/artists_controller.rb +67 -0
  9. data/examples/music/artists/artists_controller_test.rb +53 -0
  10. data/examples/music/artists/index.html.erb +57 -0
  11. data/examples/music/artists/show.html.erb +51 -0
  12. data/examples/music/assets/application.css +226 -0
  13. data/examples/music/assets/autocomplete.css +48 -0
  14. data/examples/music/assets/blank_cover.png +0 -0
  15. data/examples/music/assets/form.css +113 -0
  16. data/examples/music/index_manager.rb +60 -0
  17. data/examples/music/search/index.html.erb +93 -0
  18. data/examples/music/search/search_controller.rb +41 -0
  19. data/examples/music/search/search_controller_test.rb +9 -0
  20. data/examples/music/search/search_helper.rb +15 -0
  21. data/examples/music/suggester.rb +45 -0
  22. data/examples/music/template.rb +392 -0
  23. data/examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.css +7 -0
  24. data/examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.js +6 -0
  25. data/examples/{sinatra → notes}/.gitignore +0 -0
  26. data/examples/{sinatra → notes}/Gemfile +0 -0
  27. data/examples/{sinatra → notes}/README.markdown +0 -0
  28. data/examples/{sinatra → notes}/application.rb +0 -0
  29. data/examples/{sinatra → notes}/config.ru +0 -0
  30. data/examples/{sinatra → notes}/test.rb +0 -0
  31. data/lib/elasticsearch/persistence.rb +19 -0
  32. data/lib/elasticsearch/persistence/model.rb +129 -0
  33. data/lib/elasticsearch/persistence/model/base.rb +75 -0
  34. data/lib/elasticsearch/persistence/model/errors.rb +8 -0
  35. data/lib/elasticsearch/persistence/model/find.rb +171 -0
  36. data/lib/elasticsearch/persistence/model/rails.rb +39 -0
  37. data/lib/elasticsearch/persistence/model/store.rb +239 -0
  38. data/lib/elasticsearch/persistence/model/utils.rb +0 -0
  39. data/lib/elasticsearch/persistence/repository.rb +3 -1
  40. data/lib/elasticsearch/persistence/repository/search.rb +25 -0
  41. data/lib/elasticsearch/persistence/version.rb +1 -1
  42. data/lib/rails/generators/elasticsearch/model/model_generator.rb +21 -0
  43. data/lib/rails/generators/elasticsearch/model/templates/model.rb.tt +9 -0
  44. data/lib/rails/generators/elasticsearch_generator.rb +2 -0
  45. data/test/integration/model/model_basic_test.rb +157 -0
  46. data/test/integration/repository/default_class_test.rb +6 -0
  47. data/test/unit/model_base_test.rb +40 -0
  48. data/test/unit/model_find_test.rb +147 -0
  49. data/test/unit/model_gateway_test.rb +99 -0
  50. data/test/unit/model_rails_test.rb +88 -0
  51. data/test/unit/model_store_test.rb +493 -0
  52. data/test/unit/repository_search_test.rb +17 -0
  53. metadata +79 -9
@@ -0,0 +1,60 @@
1
+ require 'open-uri'
2
+
3
+ class IndexManager
4
+ def self.create_index(options={})
5
+ client = Artist.gateway.client
6
+ index_name = Artist.index_name
7
+
8
+ client.indices.delete index: index_name rescue nil if options[:force]
9
+
10
+ settings = Artist.settings.to_hash.merge(Album.settings.to_hash)
11
+ mappings = Artist.mappings.to_hash.merge(Album.mappings.to_hash)
12
+
13
+ client.indices.create index: index_name,
14
+ body: {
15
+ settings: settings.to_hash,
16
+ mappings: mappings.to_hash }
17
+ end
18
+
19
+ def self.import_from_yaml(source, options={})
20
+ create_index force: true if options[:force]
21
+
22
+ input = open(source)
23
+ artists = YAML.load_documents input
24
+
25
+ artists.each do |artist|
26
+ Artist.create artist.update(
27
+ 'album_count' => artist['releases'].size,
28
+ 'members_combined' => artist['members'].join(', '),
29
+ 'suggest_name' => {
30
+ 'input' => artist['namevariations'].unshift(artist['name']),
31
+ 'output' => artist['name'],
32
+ 'payload' => { 'url' => "/artists/#{artist['id']}" }
33
+ },
34
+ 'suggest_member' => {
35
+ 'input' => artist['members'],
36
+ 'output' => artist['name'],
37
+ 'payload' => { 'url' => "/artists/#{artist['id']}" }
38
+ }
39
+ )
40
+
41
+ artist['releases'].each do |album|
42
+ album.update(
43
+ 'suggest_title' => {
44
+ 'input' => album['title'],
45
+ 'output' => album['title'],
46
+ 'payload' => { 'url' => "/artists/#{artist['id']}#album_#{album['id']}" }
47
+ },
48
+ 'suggest_track' => {
49
+ 'input' => album['tracklist'].map { |d| d['title'] },
50
+ 'output' => album['title'],
51
+ 'payload' => { 'url' => "/artists/#{artist['id']}#album_#{album['id']}" }
52
+ }
53
+ )
54
+ album['notes'] = album['notes'].to_s.gsub(/<.+?>/, '').gsub(/ {2,}/, '')
55
+ album['released'] = nil if album['released'] < 1
56
+ Album.create album, id: album['id'], parent: artist['id']
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,93 @@
1
+ <header>
2
+ <h1>
3
+ <span class="back"><%= link_to "〈".html_safe, :back, title: "Back" %></span>
4
+ Artists &amp; Albums
5
+ </h1>
6
+ </header>
7
+
8
+ <section id="searchbox">
9
+ <%= form_tag search_path, method: 'get' do %>
10
+ <input type="text" name="q" value="<%= params[:q] %>" id="q" autofocus="autofocus" placeholder="start typing to search..." tabindex="0" />
11
+ <% end %>
12
+ </section>
13
+
14
+ <section class="artists">
15
+ <% @artists.each do |artist| %>
16
+ <%= content_tag :div, class: 'result clearfix' do %>
17
+ <h2>
18
+ <%= link_to artist do %>
19
+ <span class="name"><%= highlighted(artist, :name) %></span>
20
+ <small><%= pluralize artist.album_count, 'album' %></small>
21
+ <% end %>
22
+ </h2>
23
+ <% if highlight = highlight(artist, :members_combined) %>
24
+ <p class="small">
25
+ <span class="label">Members</span>
26
+ <%= highlight.first.html_safe %>
27
+ </p>
28
+ <% end %>
29
+ <% if highlight = highlight(artist, :profile) %>
30
+ <p class="small">
31
+ <span class="label">Profile</span>
32
+ <%= highlight.join('&hellip;').html_safe %>
33
+ </p>
34
+ <% end %>
35
+ <% end %>
36
+ <% end %>
37
+ </section>
38
+
39
+ <section class="albums">
40
+ <% @albums.each do |album| %>
41
+ <%= content_tag :div, class: 'result clearfix' do %>
42
+ <h2>
43
+ <%= link_to artist_path(album.artist_id, anchor: "album_#{album.id}") do %>
44
+ <span class="name"><%= highlighted(album, :title) %></span>
45
+ <small><%= album.artist %></small>
46
+ <small>(<%= [album.meta.formats.first, album.released].compact.join(' ') %>)</small>
47
+ <% end %>
48
+ </h2>
49
+
50
+ <% if highlight = highlight(album, 'tracklist.title') %>
51
+ <p class="small">
52
+ <span class="label">Tracks</span>
53
+ <%= highlight.join('&hellip;').html_safe %>
54
+ </p>
55
+ <% end %>
56
+
57
+ <% if highlight = highlight(album, :notes) %>
58
+ <p class="small">
59
+ <span class="label">Notes</span>
60
+ <%= highlight.map { |d| d.gsub(/^\.\s?/, '') }.join('&hellip;').html_safe %>
61
+ </p>
62
+ <% end %>
63
+ <% end %>
64
+ <% end %>
65
+ </section>
66
+
67
+ <% if @artists.empty? && @albums.empty? %>
68
+ <section class="no-results">
69
+ <p>The search hasn't returned any results...</p>
70
+ </section>
71
+ <% end %>
72
+
73
+ <script>
74
+ $.widget( "custom.suggest", $.ui.autocomplete, {
75
+ _renderMenu: function( ul, items ) {
76
+ $.each( items, function( index, item ) {
77
+ var category = ul.append( "<li class='ui-autocomplete-category'>" + item.label + "</li>" );
78
+
79
+ $.each( item.value, function( index, item ) {
80
+ var li = $('<li class="ui-autocomplete-item"><a href="<%= Rails.application.config.relative_url_root %>'+ item.payload.url +'">'+ item.text +'</a></li>').data('ui-autocomplete-item', item )
81
+ category.append(li)
82
+ } )
83
+ });
84
+ }
85
+ });
86
+
87
+ $( "#q" ).suggest({
88
+ source: '<%= suggest_path %>',
89
+ select: function(event, ui) {
90
+ document.location.href = '<%= Rails.application.config.relative_url_root %>'+ui.item.payload.url
91
+ }
92
+ });
93
+ </script>
@@ -0,0 +1,41 @@
1
+ class SearchController < ApplicationController
2
+
3
+ def index
4
+ tags = { pre_tags: '<em class="hl">', post_tags: '</em>' }
5
+ @artists = Artist.search \
6
+ query: {
7
+ multi_match: {
8
+ query: params[:q],
9
+ fields: ['name^10','members^2','profile']
10
+ }
11
+ },
12
+ highlight: {
13
+ tags_schema: 'styled',
14
+ fields: {
15
+ name: { number_of_fragments: 0 },
16
+ members_combined: { number_of_fragments: 0 },
17
+ profile: { fragment_size: 50 }
18
+ }
19
+ }
20
+
21
+ @albums = Album.search \
22
+ query: {
23
+ multi_match: {
24
+ query: params[:q],
25
+ fields: ['title^100','tracklist.title^10','notes^1']
26
+ }
27
+ },
28
+ highlight: {
29
+ tags_schema: 'styled',
30
+ fields: {
31
+ title: { number_of_fragments: 0 },
32
+ 'tracklist.title' => { number_of_fragments: 0 },
33
+ notes: { fragment_size: 50 }
34
+ }
35
+ }
36
+ end
37
+
38
+ def suggest
39
+ render json: Suggester.new(params)
40
+ end
41
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class SearchControllerTest < ActionController::TestCase
4
+ test "should get suggest" do
5
+ get :suggest
6
+ assert_response :success
7
+ end
8
+
9
+ end
@@ -0,0 +1,15 @@
1
+ module SearchHelper
2
+
3
+ def highlight(object, field)
4
+ object.try(:hit).try(:highlight).try(field)
5
+ end
6
+
7
+ def highlighted(object, field)
8
+ if h = object.try(:hit).try(:highlight).try(field).try(:first)
9
+ h.html_safe
10
+ else
11
+ field.to_s.split('.').reduce(object) { |result,item| result.try(item) }
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,45 @@
1
+ class Suggester
2
+ attr_reader :response
3
+
4
+ def initialize(params={})
5
+ @term = params[:term]
6
+ end
7
+
8
+ def response
9
+ @response ||= begin
10
+ Elasticsearch::Persistence.client.suggest \
11
+ index: Artist.index_name,
12
+ body: {
13
+ artists: {
14
+ text: @term,
15
+ completion: { field: 'suggest_name' }
16
+ },
17
+ members: {
18
+ text: @term,
19
+ completion: { field: 'suggest_member' }
20
+ },
21
+ albums: {
22
+ text: @term,
23
+ completion: { field: 'suggest_title' }
24
+ },
25
+ tracks: {
26
+ text: @term,
27
+ completion: { field: 'suggest_track' }
28
+ }
29
+ }
30
+ end
31
+ end
32
+
33
+ def as_json(options={})
34
+ response
35
+ .except('_shards')
36
+ .reduce([]) do |sum,d|
37
+ # category = { d.first => d.second.first['options'] }
38
+ item = { :label => d.first.titleize, :value => d.second.first['options'] }
39
+ sum << item
40
+ end
41
+ .reject do |d|
42
+ d[:value].empty?
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,392 @@
1
+ # ======================================================================================
2
+ # Template for generating a Rails application with support for Elasticsearch persistence
3
+ # ======================================================================================
4
+ #
5
+ # This file creates a fully working Rails application with support for storing and retrieving models
6
+ # in Elasticsearch, using the `elasticsearch-persistence` gem
7
+ # (https://github.com/elasticsearch/elasticsearch-rails/tree/persistence-model/elasticsearch-persistence).
8
+ #
9
+ # Requirements:
10
+ # -------------
11
+ #
12
+ # * Git
13
+ # * Ruby >= 1.9.3
14
+ # * Rails >= 4
15
+ # * Java >= 7 (for Elasticsearch)
16
+ #
17
+ # Usage:
18
+ # ------
19
+ #
20
+ # $ time rails new music --force --skip --skip-bundle --skip-active-record --template /Users/karmi/Contracts/Elasticsearch/Projects/Clients/Ruby/elasticsearch-rails/elasticsearch-persistence/examples/music/template.rb
21
+ #
22
+ # =====================================================================================================
23
+
24
+ STDOUT.sync = true
25
+ STDERR.sync = true
26
+
27
+ require 'uri'
28
+ require 'net/http'
29
+
30
+ at_exit do
31
+ pid = File.read("#{destination_root}/tmp/pids/elasticsearch.pid") rescue nil
32
+ if pid
33
+ say_status "Stop", "Elasticsearch", :yellow
34
+ run "kill #{pid}"
35
+ end
36
+ end
37
+
38
+ run "touch tmp/.gitignore"
39
+
40
+ append_to_file ".gitignore", "vendor/elasticsearch-1.2.1/\n"
41
+
42
+ git :init
43
+ git add: "."
44
+ git commit: "-m 'Initial commit: Clean application'"
45
+
46
+ # ----- Download Elasticsearch --------------------------------------------------------------------
47
+
48
+ unless (Net::HTTP.get(URI.parse('http://localhost:9200')) rescue false)
49
+ COMMAND = <<-COMMAND.gsub(/^ /, '')
50
+ curl -# -O "http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.2.1.tar.gz"
51
+ tar -zxf elasticsearch-1.2.1.tar.gz
52
+ rm -f elasticsearch-1.2.1.tar.gz
53
+ ./elasticsearch-1.2.1/bin/elasticsearch -d -p #{destination_root}/tmp/pids/elasticsearch.pid
54
+ COMMAND
55
+
56
+ puts "\n"
57
+ say_status "ERROR", "Elasticsearch not running!\n", :red
58
+ puts '-'*80
59
+ say_status '', "It appears that Elasticsearch is not running on this machine."
60
+ say_status '', "Is it installed? Do you want me to install it for you with this command?\n\n"
61
+ COMMAND.each_line { |l| say_status '', "$ #{l}" }
62
+ puts
63
+ say_status '', "(To uninstall, just remove the generated application directory.)"
64
+ puts '-'*80, ''
65
+
66
+ if yes?("Install Elasticsearch?", :bold)
67
+ puts
68
+ say_status "Install", "Elasticsearch", :yellow
69
+
70
+ java_info = `java -version 2>&1`
71
+
72
+ unless java_info.match /1\.[7-9]/
73
+ puts
74
+ say_status "ERROR", "Required Java version (1.7) not found, exiting...", :red
75
+ exit(1)
76
+ end
77
+
78
+ commands = COMMAND.split("\n")
79
+ exec = commands.pop
80
+ inside("vendor") do
81
+ commands.each { |command| run command }
82
+ run "(#{exec})" # Launch Elasticsearch in subshell
83
+ end
84
+ end
85
+ end unless ENV['RAILS_NO_ES_INSTALL']
86
+
87
+ # ----- Add README --------------------------------------------------------------------------------
88
+
89
+ puts
90
+ say_status "README", "Adding Readme...\n", :yellow
91
+ puts '-'*80, ''; sleep 0.25
92
+
93
+ remove_file 'README.rdoc'
94
+
95
+ create_file 'README.rdoc', <<-README
96
+ = Ruby on Rails and Elasticsearch persistence: Example application
97
+
98
+ README
99
+
100
+
101
+ git add: "."
102
+ git commit: "-m 'Added README for the application'"
103
+
104
+ # ----- Use Thin ----------------------------------------------------------------------------------
105
+
106
+ begin
107
+ require 'thin'
108
+ puts
109
+ say_status "Rubygems", "Adding Thin into Gemfile...\n", :yellow
110
+ puts '-'*80, '';
111
+
112
+ gem 'thin'
113
+ rescue LoadError
114
+ end
115
+
116
+ # ----- Auxiliary gems ----------------------------------------------------------------------------
117
+
118
+ # ----- Remove CoffeeScript, Sass and "all that jazz" ---------------------------------------------
119
+
120
+ comment_lines 'Gemfile', /gem 'coffee/
121
+ comment_lines 'Gemfile', /gem 'sass/
122
+ comment_lines 'Gemfile', /gem 'uglifier/
123
+ uncomment_lines 'Gemfile', /gem 'therubyracer/
124
+
125
+ # ----- Add gems into Gemfile ---------------------------------------------------------------------
126
+
127
+ puts
128
+ say_status "Rubygems", "Adding Elasticsearch libraries into Gemfile...\n", :yellow
129
+ puts '-'*80, ''; sleep 0.75
130
+
131
+ gem "quiet_assets"
132
+ gem "simple_form"
133
+
134
+ gem 'elasticsearch', git: 'git://github.com/elasticsearch/elasticsearch-ruby.git'
135
+ gem 'elasticsearch-persistence', git: 'git://github.com/elasticsearch/elasticsearch-rails.git', branch: 'persistence-model', require: 'elasticsearch/persistence/model'
136
+ gem 'elasticsearch-rails', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
137
+
138
+ git add: "Gemfile*"
139
+ git commit: "-m 'Added libraries into Gemfile'"
140
+
141
+ # ----- Install gems ------------------------------------------------------------------------------
142
+
143
+ puts
144
+ say_status "Rubygems", "Installing Rubygems...", :yellow
145
+ puts '-'*80, ''
146
+
147
+ run "bundle install"
148
+
149
+ # ----- Autoload ./lib ----------------------------------------------------------------------------
150
+
151
+ puts
152
+ say_status "Application", "Adding autoloading of ./lib...", :yellow
153
+ puts '-'*80, ''
154
+
155
+ insert_into_file 'config/application.rb',
156
+ '
157
+ config.autoload_paths += %W(#{config.root}/lib)
158
+
159
+ ',
160
+ after: 'class Application < Rails::Application'
161
+
162
+ git commit: "-a -m 'Added autoloading of the ./lib folder'"
163
+
164
+ # ----- Add jQuery UI ----------------------------------------------------------------------------
165
+
166
+ puts
167
+ say_status "Assets", "Adding jQuery UI...", :yellow
168
+ puts '-'*80, ''; sleep 0.25
169
+
170
+ if ENV['LOCAL']
171
+ copy_file File.expand_path('../vendor/assets/jquery-ui-1.10.4.custom.min.js', __FILE__),
172
+ 'vendor/assets/javascripts/jquery-ui-1.10.4.custom.min.js'
173
+ copy_file File.expand_path('../vendor/assets/jquery-ui-1.10.4.custom.min.css', __FILE__),
174
+ 'vendor/assets/stylesheets/ui-lightness/jquery-ui-1.10.4.custom.min.css'
175
+ else
176
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.js',
177
+ 'vendor/assets/javascripts/jquery-ui-1.10.4.custom.min.js'
178
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/vendor/assets/jquery-ui-1.10.4.custom.min.css',
179
+ 'vendor/assets/stylesheets/ui-lightness/jquery-ui-1.10.4.custom.min.css'
180
+ end
181
+
182
+ append_to_file 'app/assets/javascripts/application.js', "//= require jquery-ui-1.10.4.custom.min.js"
183
+
184
+ git commit: "-a -m 'Added jQuery UI'"
185
+
186
+ # ----- Generate Artist scaffold ------------------------------------------------------------------
187
+
188
+ puts
189
+ say_status "Model", "Generating the Artist scaffold...", :yellow
190
+ puts '-'*80, ''; sleep 0.25
191
+
192
+ generate :scaffold, "Artist name:String --orm=elasticsearch"
193
+ route "root to: 'artists#index'"
194
+
195
+ git add: "."
196
+ git commit: "-m 'Added the generated Artist scaffold'"
197
+
198
+ # ----- Generate Album model ----------------------------------------------------------------------
199
+
200
+ puts
201
+ say_status "Model", "Generating the Album model...", :yellow
202
+ puts '-'*80, ''; sleep 0.25
203
+
204
+ generate :model, "Album --orm=elasticsearch"
205
+
206
+ git add: "."
207
+ git commit: "-m 'Added the generated Album model'"
208
+
209
+ # ----- Add proper model classes ------------------------------------------------------------------
210
+
211
+ puts
212
+ say_status "Model", "Adding Album, Artist and Suggester models implementation...", :yellow
213
+ puts '-'*80, ''; sleep 0.25
214
+
215
+ if ENV['LOCAL']
216
+ copy_file File.expand_path('../artist.rb', __FILE__), 'app/models/artist.rb'
217
+ copy_file File.expand_path('../album.rb', __FILE__), 'app/models/album.rb'
218
+ copy_file File.expand_path('../suggester.rb', __FILE__), 'app/models/suggester.rb'
219
+ else
220
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/artist.rb',
221
+ 'app/models/artist.rb'
222
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/album.rb',
223
+ 'app/models/album.rb'
224
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/suggester.rb',
225
+ 'app/models/suggester.rb'
226
+ end
227
+
228
+ git add: "./app/models"
229
+ git commit: "-m 'Added Album, Artist and Suggester models implementation'"
230
+
231
+ # ----- Add controllers and views -----------------------------------------------------------------
232
+
233
+ puts
234
+ say_status "Views", "Adding ArtistsController and views...", :yellow
235
+ puts '-'*80, ''; sleep 0.25
236
+
237
+ if ENV['LOCAL']
238
+ copy_file File.expand_path('../artists/artists_controller.rb', __FILE__), 'app/controllers/artists_controller.rb'
239
+ copy_file File.expand_path('../artists/index.html.erb', __FILE__), 'app/views/artists/index.html.erb'
240
+ copy_file File.expand_path('../artists/show.html.erb', __FILE__), 'app/views/artists/show.html.erb'
241
+ copy_file File.expand_path('../artists/_form.html.erb', __FILE__), 'app/views/artists/_form.html.erb'
242
+ copy_file File.expand_path('../artists/artists_controller_test.rb', __FILE__),
243
+ 'test/controllers/artists_controller_test.rb'
244
+ else
245
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/artists/artists_controller.rb',
246
+ 'app/controllers/artists_controller.rb'
247
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/artists/index.html.erb',
248
+ 'app/views/artists/index.html.erb'
249
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/artists/show.html.erb',
250
+ 'app/views/artists/show.html.erb'
251
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/artists/_form.html.erb',
252
+ 'app/views/artists/_form.html.erb'
253
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/artists/artists_controller_test.rb',
254
+ 'test/controllers/artists_controller_test.rb'
255
+ end
256
+
257
+ git commit: "-a -m 'Added ArtistsController and related views'"
258
+
259
+ puts
260
+ say_status "Views", "Adding SearchController and views...", :yellow
261
+ puts '-'*80, ''; sleep 0.25
262
+
263
+ if ENV['LOCAL']
264
+ copy_file File.expand_path('../search/search_controller.rb', __FILE__), 'app/controllers/search_controller.rb'
265
+ copy_file File.expand_path('../search/search_helper.rb', __FILE__), 'app/helpers/search_helper.rb'
266
+ copy_file File.expand_path('../search/index.html.erb', __FILE__), 'app/views/search/index.html.erb'
267
+ copy_file File.expand_path('../search/search_controller_test.rb', __FILE__),
268
+ 'test/controllers/search_controller_test.rb'
269
+ else
270
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/search/search_controller.rb',
271
+ 'app/controllers/search_controller.rb'
272
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/search/search_helper.rb',
273
+ 'app/helpers/search_helper.rb'
274
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/search/index.html.erb',
275
+ 'app/views/search/index.html.erb'
276
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/search/search_controller_test.rb',
277
+ 'test/controllers/search_controller_test.rb'
278
+ end
279
+
280
+ route "get 'search', to: 'search#index'"
281
+ route "get 'suggest', to: 'search#suggest'"
282
+
283
+ comment_lines 'test/test_helper.rb', /fixtures \:all/
284
+
285
+ git add: "."
286
+ git commit: "-m 'Added SearchController and related views'"
287
+
288
+ # ----- Add assets -----------------------------------------------------------------
289
+
290
+ puts
291
+ say_status "Views", "Adding application assets...", :yellow
292
+ puts '-'*80, ''; sleep 0.25
293
+
294
+ git rm: 'app/assets/stylesheets/scaffold.css'
295
+
296
+ gsub_file 'app/views/layouts/application.html.erb', /<body>/, '<body class="<%= controller.action_name %>">'
297
+
298
+ if ENV['LOCAL']
299
+ copy_file File.expand_path('../assets/application.css', __FILE__), 'app/assets/stylesheets/application.css'
300
+ copy_file File.expand_path('../assets/autocomplete.css', __FILE__), 'app/assets/stylesheets/autocomplete.css'
301
+ copy_file File.expand_path('../assets/form.css', __FILE__), 'app/assets/stylesheets/form.css'
302
+ copy_file File.expand_path('../assets/blank_cover.png', __FILE__), 'public/images/blank_cover.png'
303
+ else
304
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/assets/application.css',
305
+ 'app/assets/stylesheets/application.css'
306
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/assets/autocomplete.css',
307
+ 'app/assets/stylesheets/autocomplete.css'
308
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/assets/form.css',
309
+ 'app/assets/stylesheets/form.css'
310
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/assets/blank_cover.png',
311
+ 'public/images/blank_cover.png'
312
+ end
313
+
314
+ git add: "."
315
+ git commit: "-m 'Added application assets'"
316
+
317
+ # ----- Add an Elasticsearch initializer ----------------------------------------------------------
318
+
319
+ puts
320
+ say_status "Initializer", "Adding an Elasticsearch initializer...", :yellow
321
+ puts '-'*80, ''; sleep 0.25
322
+
323
+ initializer 'elasticsearch.rb', %q{
324
+ Elasticsearch::Persistence.client = Elasticsearch::Client.new host: ENV['ELASTICSEARCH_URL'] || 'localhost:9200'
325
+
326
+ if Rails.env.development?
327
+ logger = ActiveSupport::Logger.new(STDERR)
328
+ logger.level = Logger::INFO
329
+ logger.formatter = proc { |s, d, p, m| "\e[2m#{m}\n\e[0m" }
330
+ Elasticsearch::Persistence.client.transport.logger = logger
331
+ end
332
+ }.gsub(/^ /, '')
333
+
334
+ git add: "./config"
335
+ git commit: "-m 'Added an Elasticsearch initializer'"
336
+
337
+ # ----- Add IndexManager -----------------------------------------------------------------
338
+
339
+ puts
340
+ say_status "Application", "Adding the IndexManager class...", :yellow
341
+ puts '-'*80, ''; sleep 0.25
342
+
343
+ if ENV['LOCAL']
344
+ copy_file File.expand_path('../index_manager.rb', __FILE__), 'lib/index_manager.rb'
345
+ else
346
+ get 'https://raw.githubusercontent.com/elasticsearch/elasticsearch-rails/persistence-model/elasticsearch-persistence/examples/music/index_manager.rb',
347
+ 'lib/index_manager.rb'
348
+ end
349
+
350
+ # TODO: get 'https://raw.github.com/...', '...'
351
+
352
+ git add: "."
353
+ git commit: "-m 'Added the IndexManager class'"
354
+
355
+ # ----- Import the data ---------------------------------------------------------------------------
356
+
357
+ puts
358
+ say_status "Data", "Import the data...", :yellow
359
+ puts '-'*80, ''; sleep 0.25
360
+
361
+ source = ENV.fetch('DATA_SOURCE', 'http://ruby-demo-assets.s3.amazonaws.com/dischord.yml')
362
+
363
+ run "rails runner 'IndexManager.import_from_yaml(\"#{source}\", force: true)'"
364
+
365
+ # ----- Print Git log -----------------------------------------------------------------------------
366
+
367
+ puts
368
+ say_status "Git", "Details about the application:", :yellow
369
+ puts '-'*80, ''
370
+
371
+ run "git --no-pager log --reverse --oneline"
372
+
373
+ # ----- Start the application ---------------------------------------------------------------------
374
+
375
+ unless ENV['RAILS_NO_SERVER_START']
376
+ require 'net/http'
377
+ if (begin; Net::HTTP.get(URI('http://localhost:3000')); rescue Errno::ECONNREFUSED; false; rescue Exception; true; end)
378
+ puts "\n"
379
+ say_status "ERROR", "Some other application is running on port 3000!\n", :red
380
+ puts '-'*80
381
+
382
+ port = ask("Please provide free port:", :bold)
383
+ else
384
+ port = '3000'
385
+ end
386
+
387
+ puts "", "="*80
388
+ say_status "DONE", "\e[1mStarting the application.\e[0m", :yellow
389
+ puts "="*80, ""
390
+
391
+ run "rails server --port=#{port}"
392
+ end