forked from woahdae/tire
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rails-application-template.rb
249 lines (201 loc) · 6.95 KB
/
rails-application-template.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# ===================================================================================================================
# Template for generating a no-frills Rails application with support for ElasticSearch full-text search via Tire
# ===================================================================================================================
#
# This file creates a basic, fully working Rails application with support for ElasticSearch full-text search
# via the Tire gem [http://github.com/karmi/tire].
#
# You DON'T NEED ELASTICSEARCH INSTALLED, it is installed and launched automatically by this script.
#
# Requirements
# ------------
#
# * Git
# * Ruby >= 1.8.7
# * Rubygems
# * Rails >= 3.0.7
# * Sun Java 6 (for ElasticSearch)
#
#
# Usage
# -----
#
# $ rails new tired -m https://github.com/karmi/tire/raw/master/examples/rails-application-template.rb
#
# ===================================================================================================================
require 'rubygems'
begin
require 'restclient'
rescue LoadError
puts "\n"
say_status "ERROR", "Rubygem 'rest-client' not installed\n", :red
puts '-'*80
say_status "", "gem install rest-client"
puts "\n"
if yes?("Should I install it for you?", :bold)
say_status "gem", "install rest-client", :yellow
system "gem install rest-client"
else
exit(1)
end
end
at_exit do
pid = File.read("#{destination_root}/tmp/pids/elasticsearch.pid") rescue nil
if pid
say_status "Stop", "ElasticSearch", :yellow
run "kill #{pid}"
end
end
run "rm public/index.html"
run "rm public/images/rails.png"
run "touch tmp/.gitignore log/.gitignore vendor/.gitignore"
run "rm -f .gitignore"
file ".gitignore", <<-END.gsub(/ /, '')
.DS_Store
log/*.log
tmp/**/*
config/database.yml
db/*.sqlite3
vendor/elasticsearch-0.16.0/
END
git :init
git :add => '.'
git :commit => "-m 'Initial commit: Clean application'"
unless (RestClient.get('http://localhost:9200') rescue false)
COMMAND = <<-COMMAND.gsub(/^ /, '')
curl -k -L -# -o elasticsearch-0.16.0.tar.gz \
"http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.16.0.tar.gz"
tar -zxf elasticsearch-0.16.0.tar.gz
rm -f elasticsearch-0.16.0.tar.gz
./elasticsearch-0.16.0/bin/elasticsearch -p #{destination_root}/tmp/pids/elasticsearch.pid
COMMAND
puts "\n"
say_status "ERROR", "ElasticSearch not running!\n", :red
puts '-'*80
say_status '', "It appears that ElasticSearch is not running on this machine."
say_status '', "Is it installed? Do you want me to install it for you with this command?\n\n"
COMMAND.each_line { |l| say_status '', "$ #{l}" }
puts
say_status '', "(To uninstall, just remove the generated application directory.)"
puts '-'*80, ''
if yes?("Install ElasticSearch?", :bold)
puts
say_status "Install", "ElasticSearch", :yellow
commands = COMMAND.split("\n")
exec = commands.pop
inside("vendor") do
commands.each { |command| run command }
run "(#{exec})" # Launch ElasticSearch in subshell
end
end
end
puts
say_status "Rubygems", "Adding Rubygems into Gemfile...\n", :yellow
puts '-'*80, ''; sleep 1
gem 'tire'
gem 'will_paginate', '~>3.0.pre'
git :add => '.'
git :commit => "-m 'Added gems'"
puts
say_status "Rubygems", "Installing Rubygems...", :yellow
puts '-'*80, ''
puts "********************************************************************************"
puts " Running `bundle install`. Let's watch a movie!"
puts "********************************************************************************", ""
run "bundle install"
puts
say_status "Model", "Adding the Article resource...", :yellow
puts '-'*80, ''; sleep 1
generate :scaffold, "Article title:string content:text published_on:date"
route "root :to => 'articles#index'"
rake "db:migrate"
git :add => '.'
git :commit => "-m 'Added the Article resource'"
puts
say_status "Database", "Seeding the database with data...", :yellow
puts '-'*80, ''; sleep 0.25
run "rm -f db/seeds.rb"
file 'db/seeds.rb', <<-CODE
contents = [
'Lorem ipsum dolor sit amet.',
'Consectetur adipisicing elit, sed do eiusmod tempor incididunt.',
'Labore et dolore magna aliqua.',
'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.',
'Excepteur sint occaecat cupidatat non proident.'
]
puts "Deleting all articles..."
Article.delete_all
puts "Creating articles..."
%w[ One Two Three Four Five ].each_with_index do |title, i|
Article.create :title => title, :content => contents[i], :published_on => i.days.ago.utc
end
CODE
rake "db:seed"
git :add => "db/seeds.rb"
git :commit => "-m 'Added database seeding script'"
puts
say_status "Model", "Adding search support into the Article model...", :yellow
puts '-'*80, ''; sleep 1
run "rm -f app/models/article.rb"
file 'app/models/article.rb', <<-CODE
class Article < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
end
CODE
initializer 'tire.rb', <<-CODE
Tire.configure do
logger STDERR
end
CODE
git :commit => "-a -m 'Added Tire support into the Article class and an initializer'"
puts
say_status "Controller", "Adding controller action, route, and HTML for search...", :yellow
puts '-'*80, ''; sleep 1
gsub_file 'app/controllers/articles_controller.rb', %r{# GET /articles/1$}, <<-CODE
# GET /articles/search
def search
@articles = Article.search params[:q]
render :action => "index"
end
# GET /articles/1
CODE
gsub_file 'app/views/articles/index.html.erb', %r{<h1>Listing articles</h1>}, <<-CODE
<h1>Listing articles</h1>
<%= form_tag search_articles_path, :method => 'get' do %>
<%= label_tag :query %>
<%= text_field_tag :q, params[:q] %>
<%= submit_tag :search %>
<% end %>
<hr>
CODE
gsub_file 'app/views/articles/index.html.erb', %r{<%= link_to 'New Article', new_article_path %>}, <<-CODE
<%= link_to 'New Article', new_article_path %>
<%= link_to 'Back', articles_path if params[:q] %>
CODE
gsub_file 'config/routes.rb', %r{resources :articles}, <<-CODE
resources :articles do
collection { get :search }
end
CODE
git :commit => "-a -m 'Added Tire support into the frontend of application'"
puts
say_status "Index", "Indexing the database...", :yellow
puts '-'*80, ''; sleep 0.5
rake "environment tire:import CLASS='Article' FORCE=true"
puts
say_status "Git", "Details about the application:", :yellow
puts '-'*80, ''
run "git log --reverse --pretty=format:'%Cblue%h%Creset | %s'"
if (begin; RestClient.get('http://localhost:3000'); rescue Errno::ECONNREFUSED; false; rescue Exception; true; end)
puts "\n"
say_status "ERROR", "Some other application is running on port 3000!\n", :red
puts '-'*80
port = ask("Please provide free port:", :bold)
else
port = '3000'
end
puts "", "="*80
say_status "DONE", "\e[1mStarting the application. Open http://localhost:#{port}\e[0m", :yellow
puts "="*80, ""
run "rails server --port=#{port}"