sails 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/huacnlee/sails.svg)](https://travis-ci.org/huacnlee/sails) [![Gem Version](https://badge.fury.io/rb/sails.svg)](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
|