-
Notifications
You must be signed in to change notification settings - Fork 117
/
serve_command.rb
197 lines (148 loc) · 5.54 KB
/
serve_command.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
module Locomotive::Wagon
SiteFinder = Struct.new(:repository, :request) { def find; repository.first; end; }
class ServeCommand < Struct.new(:path, :options, :shell)
def initialize(path, options, shell)
super(path, options || {}, shell)
@parent_id = nil
end
def self.start(path, options = {}, shell)
new(path, options, shell).start
end
def self.stop(path, force = false, shell)
new(path, nil, shell).stop(force)
end
def start
# make sure a server is not running
stop(true) if options[:force]
# Steam is our rendering engine
require_steam
# in case the developer installed custom libs
Locomotive::Wagon.require_misc_gems
setup_signals
show_start_message
show_rack_middleware_stack if options[:debug]
# if a page, a content type or any resources of the site is getting modified,
# then the cache of Steam will be cleared.
listen
# let's start!
begin
server.start
rescue NoMethodError # Prevent the NilClass error from Puma to be displayed
nil
end
end
def stop(force = false)
unless File.exist?(server_pid_file)
shell.say "No Wagon server is running.", :red
return
end
pid = File.read(server_pid_file).to_i
Process.kill('TERM', pid)
shell.say "\nShutting down Wagon server"
# make sure we wait enough for the server process to stop
sleep(2) if force
end
private
def require_steam
require 'haml'
require 'locomotive/steam'
require 'locomotive/steam/server'
require 'locomotive/wagon/middlewares/error_page'
configure_logger
subscribe_to_notifications
Locomotive::Steam.configure do |config|
config.mode = :test
config.adapter = { name: :filesystem, path: File.expand_path(path), env: options[:env]&.to_sym || :local }
config.asset_path = File.expand_path(File.join(path, 'public'))
config.middleware.insert_before Rack::Lint, Locomotive::Wagon::Middlewares::ErrorPage
config.services_hook = -> (services) {
if services.request
services.defer(:site_finder) do
SiteFinder.new(services.repositories.site, services.request)
end
end
}
end
end
def listen
require 'puma/plugin'
Puma::Plugins.add_background -> {
require_relative '../tools/listen'
require 'locomotive/steam/adapters/filesystem/simple_cache_store'
cache = Locomotive::Steam::Adapters::Filesystem::SimpleCacheStore.new
Locomotive::Wagon::Listen.start(path, cache, options)
}
end
def server
@server ||= build_puma_server
end
def build_puma_server
require 'rackup'
require 'rack/handler/puma'
Rackup::Handler::Puma.run(Locomotive::Steam.to_app,
daemon: options[:daemonize],
pidfile: server_pid_file,
redirect_stdout: options[:daemonize] ? server_log_file : nil,
Threads: ENV['PUMA_THREADS'] || '1:4',
Host: options[:host],
Port: options[:port],
Verbose: ENV['PUMA_DEBUG_ON'] || false,
Silent: true
)
end
def configure_logger
# make sure the logs folder exist and get rid of that ugly error message if it doesn't
FileUtils.mkdir_p(File.join(path, 'log'))
Locomotive::Common.reset
Locomotive::Common.configure do |config|
logger = options[:daemonize] ? log_file : nil
config.notifier = Locomotive::Common::Logger.setup(logger)
end
end
def subscribe_to_notifications
# Page not found
ActiveSupport::Notifications.subscribe('steam.render.page_not_found') do |name, start, finish, id, payload|
fullpath, locale, default_locale = payload[:path], payload[:locale], payload[:default_locale]
filepath = File.join(File.expand_path(path), 'app', 'views', 'pages', fullpath + (locale != default_locale ? ".#{locale}" : '') + '.liquid')
message = if File.exist?(filepath)
"[Warning]".red + ' by default and unless you override the slug in the YAML header of your page, Wagon will replace underscores by dashes in your page slug. Try this instead: ' + fullpath.dasherize.light_white
else
"[Tip]".light_white + " add a new page in your Wagon site at this location: " + filepath.light_white
end
Locomotive::Common::Logger.info (' ' * 2) + message
end
end
def setup_signals
%w(INT TERM).each do |signal|
trap(signal) do
show_stop_message
EM.add_timer(1) do
server.stop
end
end
end
end
def server_pid_file
File.join(File.expand_path(path), 'log', 'server.pid')
end
def server_log_file
File.join(File.expand_path(path), 'log', 'server.log')
end
def log_file
File.expand_path(File.join(path, 'log', 'wagon.log'))
end
def show_rack_middleware_stack
shell.say "[Rendering stack]".colorize(color: :light_white, background: :blue)
Locomotive::Steam.configuration.middleware.list.each do |middleware|
shell.say "\t" + middleware.first.first.inspect
end
shell.say "\n"
end
def show_start_message
shell.say "Your site is served now.\nBrowse http://#{options[:host]}:#{options[:port]}\n\n", :green
end
def show_stop_message
shell.say "\nShutting down Wagon server"
end
end
end