sails 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +8 -1
- data/README.md +1 -1
- data/lib/sails/base.rb +23 -42
- data/lib/sails/cli.rb +1 -2
- data/lib/sails/daemon.rb +29 -16
- data/lib/sails/service/base.rb +17 -12
- data/lib/sails/service/callbacks.rb +28 -0
- data/lib/sails/service/interface.rb +18 -5
- data/lib/sails/service.rb +1 -0
- data/lib/sails/version.rb +1 -1
- data/spec/cli_spec.rb +1 -2
- data/spec/dummy/log/development.log +1402 -0
- data/spec/sails_spec.rb +1 -1
- data/spec/service/base_spec.rb +48 -0
- data/spec/service/callbacks_spec.rb +47 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/support/service_support.rb +13 -0
- metadata +9 -4
- data/spec/service_spec.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdca82274162d55762d2eddeb183930b7e0b77a5
|
4
|
+
data.tar.gz: 6008de27f43aed4eec5c4d2935abb318a5e64f46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a8a8dedb82895595fa18613dd058ed6c4f91f8db83cd10d8e3a02a51d85c3490c5a364d38cfa1c8f1ed55c7dd2535763b593223c61bd62d54d092a6758cba53
|
7
|
+
data.tar.gz: e7ee9fd640638548ed95a81a65bf1443c84fb09531d74c8cf70397f233e022979d4b4c16780400491a2885e900c14eec7f7944b6fc23d27607798f561f8d93c8
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
## 0.1.
|
1
|
+
## 0.1.2 / 2014-12-17
|
2
|
+
|
3
|
+
- `sails restart` use kill -USR2 signal, not kill master process.
|
4
|
+
- Use tail log file to instead of direct stdout.
|
5
|
+
- Add `before_action` support for Service layout;
|
6
|
+
- Add `params` like same name in ActionController for Service layout;
|
7
|
+
|
8
|
+
## 0.1.1 / 2014-12-10
|
2
9
|
|
3
10
|
- Add `sails s`, `sails c` commands.
|
4
11
|
- Refactor service layer, use class to instead module.
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Sails
|
2
2
|
=====
|
3
3
|
|
4
|
-
Sails, create [Thrift](thrift.apache.org) app server like Rails.
|
4
|
+
Sails, create [Thrift](http://thrift.apache.org) app server like Rails.
|
5
5
|
|
6
6
|
[](https://travis-ci.org/huacnlee/sails) [](http://badge.fury.io/rb/sails)
|
7
7
|
|
data/lib/sails/base.rb
CHANGED
@@ -2,7 +2,7 @@ Bundler.require()
|
|
2
2
|
|
3
3
|
module Sails
|
4
4
|
extend ActiveSupport::Autoload
|
5
|
-
|
5
|
+
|
6
6
|
autoload :Config
|
7
7
|
|
8
8
|
# Sails.config
|
@@ -69,7 +69,7 @@ module Sails
|
|
69
69
|
def self.root
|
70
70
|
@root ||= Pathname.new(Dir.pwd)
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
def self.root=(root)
|
74
74
|
@root = Pathname.new(root)
|
75
75
|
end
|
@@ -100,18 +100,18 @@ module Sails
|
|
100
100
|
#
|
101
101
|
def self.logger
|
102
102
|
return @logger if defined?(@logger)
|
103
|
-
|
103
|
+
log_file = File.join(Sails.root, "log/#{self.env}.log")
|
104
|
+
@logger = Logger.new(log_file)
|
104
105
|
@logger.formatter = proc { |severity, datetime, progname, msg|
|
105
|
-
self.stdout_logger.info msg if !Sails.env.test?
|
106
106
|
"#{msg}\n"
|
107
107
|
}
|
108
108
|
@logger
|
109
109
|
end
|
110
110
|
|
111
111
|
def self.init
|
112
|
-
$:.unshift self.root.join("lib")
|
113
112
|
# init root
|
114
113
|
return false if @inited == true
|
114
|
+
$:.unshift self.root.join("lib")
|
115
115
|
|
116
116
|
self.root
|
117
117
|
|
@@ -124,8 +124,6 @@ module Sails
|
|
124
124
|
|
125
125
|
require "sails/service"
|
126
126
|
|
127
|
-
puts "ENV: #{Sails.env}"
|
128
|
-
|
129
127
|
load_initialize
|
130
128
|
@inited = true
|
131
129
|
end
|
@@ -144,22 +142,23 @@ module Sails
|
|
144
142
|
#
|
145
143
|
# class UsersServiceTest
|
146
144
|
# def test_check_name_exist?
|
147
|
-
# assert_equal(Sails.service.check_name_exist?(name), true)
|
145
|
+
# assert_equal(Sails.service.check_name_exist?(name), true)
|
148
146
|
# end
|
149
147
|
# end
|
150
148
|
#
|
151
149
|
def self.service
|
152
150
|
@service ||= Sails::Service::Interface.new
|
153
151
|
end
|
154
|
-
|
152
|
+
|
155
153
|
# Force reload Sails cache classes in config.autoload_paths
|
156
154
|
def self.reload!(opts = {})
|
157
155
|
force = opts[:force] || false
|
158
156
|
if force || config.cache_classes == false
|
159
|
-
@service = nil
|
157
|
+
# @service = nil
|
160
158
|
ActiveSupport::Dependencies.clear
|
161
|
-
reload_server!
|
159
|
+
# reload_server!
|
162
160
|
end
|
161
|
+
return true
|
163
162
|
end
|
164
163
|
|
165
164
|
def self.reload_server!
|
@@ -168,8 +167,10 @@ module Sails
|
|
168
167
|
@server.instance_variable_set(:@processor, new_processor)
|
169
168
|
end
|
170
169
|
end
|
171
|
-
|
170
|
+
|
172
171
|
def self.start!(type)
|
172
|
+
logger.info "ENV: #{Sails.env}"
|
173
|
+
|
173
174
|
@server_type = type
|
174
175
|
if @server_type == "thread"
|
175
176
|
start_thread_pool_server!
|
@@ -177,14 +178,14 @@ module Sails
|
|
177
178
|
start_non_blocking_server!
|
178
179
|
end
|
179
180
|
end
|
180
|
-
|
181
|
+
|
181
182
|
def self.thrift_protocol_class
|
182
183
|
case config.protocol
|
183
184
|
when :compact
|
184
185
|
return ::Thrift::CompactProtocolFactory
|
185
186
|
when :json
|
186
187
|
return ::Thrift::JsonProtocolFactory
|
187
|
-
else
|
188
|
+
else
|
188
189
|
return ::Thrift::BinaryProtocolFactory
|
189
190
|
end
|
190
191
|
end
|
@@ -198,20 +199,15 @@ module Sails
|
|
198
199
|
processor = config.processor.new(self.service)
|
199
200
|
@server = ::Thrift::ThreadPoolServer.new(processor, transport, transport_factory, protocol_factory, config.thread_size)
|
200
201
|
|
201
|
-
|
202
|
-
|
203
|
-
|
202
|
+
logger.info "Boot on: #{Sails.root}"
|
203
|
+
logger.info "[#{Time.now}] Starting the Sails with ThreadPool size: #{Setting.pool_size}..."
|
204
|
+
logger.info "serve: 127.0.0.1:#{config.thread_port}"
|
204
205
|
|
205
206
|
begin
|
206
207
|
@server.serve
|
207
208
|
rescue => e
|
208
209
|
puts "Start thrift server exception! \n #{e.inspect}"
|
209
210
|
puts e.backtrace
|
210
|
-
|
211
|
-
if self.env != "development"
|
212
|
-
sleep 2
|
213
|
-
retry
|
214
|
-
end
|
215
211
|
end
|
216
212
|
end
|
217
213
|
|
@@ -223,33 +219,18 @@ module Sails
|
|
223
219
|
processor = config.processor.new(self.service)
|
224
220
|
@server = ::Thrift::NonblockingServer.new(processor, transport, transport_factory, protocol_factory, config.thread_size)
|
225
221
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
222
|
+
logger.info "Boot on: #{Sails.root}"
|
223
|
+
logger.info "[#{Time.now}] Starting the Sails with NonBlocking..."
|
224
|
+
logger.info "Protocol: #{thrift_protocol_class.name}"
|
225
|
+
logger.info "serve: 127.0.0.1:#{config.port}"
|
230
226
|
|
231
227
|
begin
|
232
228
|
@server.serve
|
233
229
|
rescue => e
|
234
230
|
puts "Start thrift server exception! \n #{e.inspect}"
|
235
231
|
puts e.backtrace
|
236
|
-
|
237
|
-
if self.env != "development"
|
238
|
-
sleep 2
|
239
|
-
retry
|
240
|
-
end
|
241
232
|
end
|
242
233
|
end
|
243
|
-
|
244
|
-
private
|
245
|
-
def self.stdout_logger
|
246
|
-
return @stdout_logger if defined?(@stdout_logger)
|
247
|
-
@stdout_logger = Logger.new(STDOUT)
|
248
|
-
@stdout_logger.formatter = proc { |severity, datetime, progname, msg|
|
249
|
-
"#{msg}\n"
|
250
|
-
}
|
251
|
-
@stdout_logger
|
252
|
-
end
|
253
234
|
|
254
235
|
def self.load_initialize
|
255
236
|
Dir["#{Sails.root}/config/initializers/*.rb"].each do |f|
|
@@ -258,4 +239,4 @@ module Sails
|
|
258
239
|
end
|
259
240
|
end
|
260
241
|
|
261
|
-
Sails.init()
|
242
|
+
Sails.init()
|
data/lib/sails/cli.rb
CHANGED
@@ -47,8 +47,7 @@ module Sails
|
|
47
47
|
desc "restart", "Restart Thrift server"
|
48
48
|
def restart()
|
49
49
|
Sails::Daemon.init(mode: options[:mode])
|
50
|
-
Sails::Daemon.
|
51
|
-
Sails::Daemon.start_process(daemon: true)
|
50
|
+
Sails::Daemon.restart_process
|
52
51
|
end
|
53
52
|
|
54
53
|
desc "new APP_NAME", "Create a project"
|
data/lib/sails/daemon.rb
CHANGED
@@ -28,7 +28,7 @@ module Sails
|
|
28
28
|
def start_process(options = {})
|
29
29
|
old_pid = read_pid
|
30
30
|
if old_pid != nil
|
31
|
-
|
31
|
+
Sails.logger.info "Current have #{app_name} process in running on pid #{old_pid}"
|
32
32
|
return
|
33
33
|
end
|
34
34
|
|
@@ -37,28 +37,41 @@ module Sails
|
|
37
37
|
File.open(pid_file, "w+") do |f|
|
38
38
|
f.puts @master_pid
|
39
39
|
end
|
40
|
-
|
41
|
-
|
40
|
+
|
41
|
+
Sails.logger.info "Started #{app_name} on pid: #{@master_pid}"
|
42
42
|
|
43
43
|
if options[:daemon] == false
|
44
|
+
log_file = Sails.root.join("log/#{Sails.env}.log")
|
45
|
+
system "tail -f #{log_file}"
|
44
46
|
Process.waitpid(@master_pid)
|
45
47
|
end
|
46
48
|
end
|
47
|
-
|
49
|
+
|
50
|
+
def restart_process(options = {})
|
51
|
+
old_pid = read_pid
|
52
|
+
if old_pid == nil
|
53
|
+
Sails.logger.info "#{app_name} process not found on pid #{old_pid}"
|
54
|
+
return
|
55
|
+
end
|
56
|
+
|
57
|
+
Process.kill("USR2", old_pid)
|
58
|
+
end
|
59
|
+
|
48
60
|
def fork_master_process!
|
49
61
|
fork do
|
50
62
|
$PROGRAM_NAME = self.app_name + " [master]"
|
51
63
|
@child_pid = fork_child_process!
|
52
|
-
|
53
|
-
Signal.trap("QUIT") {
|
64
|
+
|
65
|
+
Signal.trap("QUIT") {
|
54
66
|
Process.kill("QUIT", @child_pid)
|
55
67
|
exit
|
56
68
|
}
|
57
|
-
|
69
|
+
|
58
70
|
Signal.trap("USR2") {
|
59
|
-
|
71
|
+
puts @child_pid.inspect
|
72
|
+
Process.kill("QUIT", @child_pid)
|
60
73
|
}
|
61
|
-
|
74
|
+
|
62
75
|
loop do
|
63
76
|
sleep 1
|
64
77
|
begin
|
@@ -70,34 +83,34 @@ module Sails
|
|
70
83
|
end
|
71
84
|
end
|
72
85
|
end
|
73
|
-
|
86
|
+
|
74
87
|
def fork_child_process!
|
75
88
|
fork do
|
76
89
|
$PROGRAM_NAME = self.app_name
|
77
90
|
Sails.start!(self.mode)
|
78
|
-
|
91
|
+
|
79
92
|
Signal.trap("USR2") {
|
80
93
|
# TODO: reload Sails in current process
|
81
94
|
exit
|
82
95
|
}
|
83
96
|
end
|
84
97
|
end
|
85
|
-
|
98
|
+
|
86
99
|
def stop_process
|
87
100
|
pid = read_pid
|
88
101
|
if pid == nil
|
89
|
-
|
102
|
+
Sails.logger.info "#{app_name} process not found, pid #{pid}"
|
90
103
|
return
|
91
104
|
end
|
92
105
|
|
93
|
-
|
106
|
+
Sails.logger.info "Stopping #{app_name} with pid: #{pid}..."
|
94
107
|
begin
|
95
108
|
Process.kill("QUIT", pid)
|
96
109
|
ensure
|
97
110
|
File.delete(pid_file)
|
98
111
|
end
|
99
|
-
|
112
|
+
Sails.logger.info " [Done]"
|
100
113
|
end
|
101
114
|
end
|
102
115
|
end
|
103
|
-
end
|
116
|
+
end
|
data/lib/sails/service/base.rb
CHANGED
@@ -2,18 +2,7 @@ module Sails
|
|
2
2
|
module Service
|
3
3
|
# Like ActionController::Base
|
4
4
|
class Base
|
5
|
-
include
|
6
|
-
|
7
|
-
define_callbacks :action
|
8
|
-
|
9
|
-
set_callback :action, :before do |object|
|
10
|
-
# TODO: only reload on files changed
|
11
|
-
Sails.reload!
|
12
|
-
end
|
13
|
-
|
14
|
-
set_callback :action, :after do |object|
|
15
|
-
ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord::Base)
|
16
|
-
end
|
5
|
+
include Callbacks
|
17
6
|
|
18
7
|
class << self
|
19
8
|
def internal_methods
|
@@ -36,6 +25,22 @@ module Sails
|
|
36
25
|
end
|
37
26
|
end
|
38
27
|
|
28
|
+
# action params to Hash
|
29
|
+
#
|
30
|
+
# example:
|
31
|
+
#
|
32
|
+
# class FooService < Sails::Service::Base
|
33
|
+
# def foo(name, age)
|
34
|
+
# # you can use params in any instance methods
|
35
|
+
# puts params[:name]
|
36
|
+
# puts params[:age]
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
def params
|
41
|
+
@params ||= {}
|
42
|
+
end
|
43
|
+
|
39
44
|
# Raise a Sails::Service::Exception (Thrift::Exception)
|
40
45
|
# if you want custom error you can override this method in you ApplicationService
|
41
46
|
def raise_error(code, msg = nil)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Sails
|
2
|
+
module Service
|
3
|
+
module Callbacks
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
include ActiveSupport::Callbacks
|
7
|
+
|
8
|
+
included do
|
9
|
+
define_callbacks :action
|
10
|
+
|
11
|
+
set_callback :action, :before do |object|
|
12
|
+
end
|
13
|
+
|
14
|
+
set_callback :action, :after do |object|
|
15
|
+
ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord::Base)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def before_action(*names, &blk)
|
21
|
+
names.each do |name|
|
22
|
+
set_callback(:action, :before, name, &blk)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -27,7 +27,15 @@ module Sails
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
def set_params_with_method_args(instance, method_name, args)
|
31
|
+
method_args = instance.method(method_name.to_sym).parameters.map { |arg| arg[1] }
|
32
|
+
method_args.each_with_index do |arg, idx|
|
33
|
+
instance.params[arg] = args[idx]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
30
37
|
def run_action(instance, method_name, *args, &block)
|
38
|
+
set_params_with_method_args(instance, method_name, args)
|
31
39
|
instance.run_callbacks :action do
|
32
40
|
time = Time.now.to_f
|
33
41
|
|
@@ -38,17 +46,22 @@ module Sails
|
|
38
46
|
res = instance.send(method_name, *args, &block)
|
39
47
|
status = "Completed"
|
40
48
|
return res
|
41
|
-
rescue ActiveRecord::RecordNotFound => e
|
42
|
-
status = "Not Found"
|
43
|
-
instance.raise_error(404)
|
44
49
|
rescue Thrift::Exception => e
|
45
50
|
status = "Failed #{e.try(:code)}"
|
46
51
|
raise e
|
47
52
|
rescue => e
|
48
|
-
|
53
|
+
puts "------- #{e.inspect}"
|
54
|
+
if defined?(ActiveRecord) && e.is_a?(ActiveRecord::RecordNotFound)
|
55
|
+
status = "Not Found"
|
56
|
+
code = 404
|
57
|
+
else
|
58
|
+
status = "Error 500"
|
59
|
+
code = 500
|
60
|
+
end
|
61
|
+
|
49
62
|
Sails.logger.info "\"#{method_name}\" error : #{e.inspect}\n\n"
|
50
63
|
Sails.logger.info %Q(backtrace: #{e.backtrace.join("\n")}\n)
|
51
|
-
instance.raise_error(
|
64
|
+
instance.raise_error(code)
|
52
65
|
ensure
|
53
66
|
elapsed = format('%.3f', (Time.now.to_f - time) * 1000)
|
54
67
|
Sails.logger.info "#{status} in (#{elapsed}ms).\n\n" unless Sails.env.test?
|
data/lib/sails/service.rb
CHANGED
data/lib/sails/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -24,8 +24,7 @@ describe 'Sails::CLI' do
|
|
24
24
|
it { expect(cli).to respond_to(:restart) }
|
25
25
|
it {
|
26
26
|
# expect(Sails::Daemon).to receive(:init)
|
27
|
-
expect(Sails::Daemon).to receive(:
|
28
|
-
expect(Sails::Daemon).to receive(:start_process)
|
27
|
+
expect(Sails::Daemon).to receive(:restart_process)
|
29
28
|
cli.restart
|
30
29
|
}
|
31
30
|
end
|