spiderfw 0.6.17 → 0.6.18
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.
- data/CHANGELOG +8 -0
- data/VERSION +1 -1
- data/apps/core/components/widgets/table/table.shtml +2 -2
- data/apps/messenger/config/test.config.yml +1 -6
- data/lib/spiderfw/config/options/spider.rb +2 -1
- data/lib/spiderfw/http/adapters/rack.rb +41 -19
- data/lib/spiderfw/i18n/cldr.rb +30 -7
- data/lib/spiderfw/setup/app_manager.rb +5 -3
- data/lib/spiderfw/spider.rb +32 -0
- metadata +4 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
= 0.6.18
|
2
|
+
== 16 September, 2011
|
3
|
+
* Thread management (keeps track of threads to wait for when exiting)
|
4
|
+
* Under Phusion Passenger, controller's 'after' is now executed when the response is sent
|
5
|
+
* Table widget now accepts a link_id not in the Table's shown elements
|
6
|
+
* CLDR fixes
|
7
|
+
* Updater fixes
|
8
|
+
|
1
9
|
= 0.6.17
|
2
10
|
== 13 September, 2011
|
3
11
|
* AppManager rewrite, with setup tasks; Migrations
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.18
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<tpl:pass sp:each_index="@rows |row_i|">
|
16
16
|
<tr class="row { (row_i%2==0) ? 'odd' : 'even' }">
|
17
17
|
<td sp:each="@elements |element|">
|
18
|
-
<a sp:tag-if="@link_el && element == @link_el" href="{ @link }{ Spider::HTTP.urlencode(@
|
18
|
+
<a sp:tag-if="@link_el && element == @link_el" href="{ @link }{ Spider::HTTP.urlencode(@data[row_i][@link_id]) }">
|
19
19
|
{ @rows[row_i][element] }
|
20
20
|
</a>
|
21
21
|
</td>
|
@@ -46,4 +46,4 @@
|
|
46
46
|
<div sp:if="!@rows || @rows.length < 1" class="no_result">
|
47
47
|
_(No element)
|
48
48
|
</div>
|
49
|
-
</div>
|
49
|
+
</div>
|
@@ -30,10 +30,11 @@ module Spider
|
|
30
30
|
:default => Proc.new{ Spider.config.get('runmode') == 'devel' ? true : false }
|
31
31
|
config_option 'webserver.port', _("Port to use for the http server"), :type => Fixnum, :default => 8080
|
32
32
|
config_option 'webserver.force_threads', _("Force threading on non-threaded adapters"), :type => Spider::DataTypes::Bool,
|
33
|
-
:default => Proc.new{ Spider.runmode != 'test' && RUBY_VERSION_PARTS[1] == '8'
|
33
|
+
:default => Proc.new{ Spider.runmode != 'test' && RUBY_VERSION_PARTS[1] == '8'}
|
34
34
|
config_option 'webserver.timeout', _("Time allowed for each request (in seconds)"), :type=> Fixnum, :default => nil
|
35
35
|
config_option 'webserver.respawn_on_change', _("Restart the webserver when application code changes"), :type => Spider::Bool,
|
36
36
|
:default => Proc.new{ RUBY_PLATFORM !~ /win32|mingw32/ && Spider.config.get('runmode') == 'devel' ? true : false }
|
37
|
+
config_option 'process.shutdown_timeout', _("Number of seconds a process is given to end"), :type => Fixnum, :default => 60
|
37
38
|
config_option 'static_content.mode', _("Mode to use for serving static files"), :type => String,
|
38
39
|
:choices => [nil, 'x-sendfile', 'x-accel-redirect', 'published'], :default => nil
|
39
40
|
config_option 'static_content.auto_publish', _("Automatically publish content to the home's public folder"),
|
@@ -77,8 +77,9 @@ module Spider; module HTTP
|
|
77
77
|
controller_request.action = path
|
78
78
|
controller_request.request_time = DateTime.now
|
79
79
|
|
80
|
+
w = nil
|
80
81
|
controller_response = Spider::Response.new
|
81
|
-
if
|
82
|
+
if Spider.conf.get('webserver.force_threads')
|
82
83
|
r, w = IO.pipe
|
83
84
|
rack_response_hash = {:body => r}
|
84
85
|
controller_response.server_output = RackIO.new(rack_response_hash, controller_response, w)
|
@@ -89,6 +90,7 @@ module Spider; module HTTP
|
|
89
90
|
end
|
90
91
|
|
91
92
|
|
93
|
+
controller = nil
|
92
94
|
controller_done = false
|
93
95
|
|
94
96
|
run_block = lambda do
|
@@ -97,39 +99,59 @@ module Spider; module HTTP
|
|
97
99
|
controller.extend(Spider::FirstResponder)
|
98
100
|
controller.before(path)
|
99
101
|
controller.execute(path)
|
102
|
+
if Spider.conf.get('webserver.force_threads')
|
103
|
+
w.close
|
104
|
+
controller_response.server_output.send_headers unless controller_response.server_output.headers_sent?
|
105
|
+
end
|
100
106
|
controller.after(path)
|
107
|
+
controller_done = true
|
101
108
|
Spider::Logger.debug("Controller done")
|
102
109
|
rescue => exc
|
103
110
|
Spider.logger.debug("Error:")
|
104
111
|
Spider.logger.debug(exc)
|
105
|
-
controller.ensure
|
112
|
+
controller.ensure if controller
|
113
|
+
controller = nil
|
106
114
|
ensure
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
val.
|
116
|
-
|
117
|
-
|
115
|
+
begin
|
116
|
+
if Spider.conf.get('webserver.force_threads')
|
117
|
+
controller_response.server_output.send_headers unless controller_response.server_output.headers_sent?
|
118
|
+
else
|
119
|
+
controller_response.prepare_headers
|
120
|
+
rack_response_hash[:status] = controller_response.status
|
121
|
+
rack_response_hash[:headers] = {}
|
122
|
+
controller_response.headers.each do |key, val|
|
123
|
+
if (val.is_a?(Array))
|
124
|
+
val.each{ |v| rack_response_hash[:headers][key] = v.to_s }
|
125
|
+
else
|
126
|
+
rack_response_hash[:headers][key] = val.to_s
|
127
|
+
end
|
118
128
|
end
|
129
|
+
w.rewind
|
130
|
+
end
|
131
|
+
Spider.request_finished
|
132
|
+
ensure
|
133
|
+
if Spider.conf.get('webserver.force_threads')
|
134
|
+
begin
|
135
|
+
w.close
|
136
|
+
rescue
|
137
|
+
end
|
138
|
+
Spider.remove_thread(Thread.current)
|
139
|
+
Thread.exit
|
119
140
|
end
|
120
|
-
w.rewind
|
121
141
|
end
|
122
|
-
controller_done = true
|
123
|
-
Spider.request_finished
|
124
142
|
end
|
125
143
|
end
|
126
144
|
|
127
|
-
if
|
145
|
+
if Spider.conf.get('webserver.force_threads')
|
128
146
|
controllerThread = Thread.start &run_block
|
129
|
-
|
147
|
+
t = Time.now
|
148
|
+
while !controller_done && !controller_response.server_output.headers_sent? && (Time.now - t) < 60
|
130
149
|
Thread.stop
|
131
150
|
end
|
132
|
-
|
151
|
+
if (Time.now - t) >= 60
|
152
|
+
controllerThread.kill
|
153
|
+
end
|
154
|
+
Spider.add_thread(controllerThread) unless controller_done
|
133
155
|
else
|
134
156
|
run_block.call
|
135
157
|
end
|
data/lib/spiderfw/i18n/cldr.rb
CHANGED
@@ -20,14 +20,18 @@ module Spider; module I18n
|
|
20
20
|
time_format = nil
|
21
21
|
date_format = nil
|
22
22
|
format_string = nil
|
23
|
+
calendar = options[:calendar].to_sym
|
23
24
|
if (object.respond_to?(:sec) && !options[:no_time])
|
24
|
-
time_format = @cldr.calendar.timeformats[
|
25
|
+
time_format = @cldr.calendar.timeformats[calendar][format.to_s].dup
|
25
26
|
end
|
26
27
|
if (object.is_a?(Date))
|
27
|
-
date_format = @cldr.calendar.dateformats[
|
28
|
+
date_format = @cldr.calendar.dateformats[calendar][format.to_s].dup
|
28
29
|
end
|
29
30
|
if (date_format && time_format)
|
30
|
-
|
31
|
+
# in CLDR 1.x, datetimeformats is an hash of strings indexed by strings;
|
32
|
+
# in CLDR 2.x, it is a hash of hashes indexed by symbols
|
33
|
+
fts = @cldr.calendar.datetimeformats[calendar] || @cldr.calendar.datetimeformats[calendar.to_s]
|
34
|
+
dt_f = fts.is_a?(String) ? fts : fts[format.to_s]
|
31
35
|
format_string = dt_f.sub('{1}', date_format).sub('{0}', time_format)
|
32
36
|
else
|
33
37
|
format_string = date_format ? date_format : time_format
|
@@ -137,17 +141,36 @@ module Spider; module I18n
|
|
137
141
|
|
138
142
|
def week_start(calendar = self.default_calendar)
|
139
143
|
wdays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
|
140
|
-
|
144
|
+
day = if @cldr.respond_to?(:supplemental)
|
145
|
+
@cldr.supplemental.week_data["firstDay"]
|
146
|
+
elsif @cldr.calendar.respond_to?(:week_firstdays) # CLDR 1
|
147
|
+
@cldr.calendar.week_firstdays[calendar.to_s]
|
148
|
+
end
|
149
|
+
day ||= 'mon'
|
150
|
+
wdays.index day
|
151
|
+
|
141
152
|
end
|
142
153
|
|
143
154
|
def weekend_start(calendar = self.default_calendar)
|
144
155
|
wdays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
|
145
|
-
|
156
|
+
day = if @cldr.respond_to?(:supplemental)
|
157
|
+
@cldr.supplemental.week_data["weekendStart"]
|
158
|
+
elsif @cldr.calendar.respond_to?(:weekend_starts) # CLDR 1
|
159
|
+
@cldr.calendar.weekend_starts[calendar.to_s]
|
160
|
+
end
|
161
|
+
day ||= 'sat'
|
162
|
+
wdays.index day
|
146
163
|
end
|
147
164
|
|
148
165
|
def weekend_end(calendar = self.default_calendar)
|
149
166
|
wdays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
|
150
|
-
|
167
|
+
day = if @cldr.respond_to?(:supplemental)
|
168
|
+
@cldr.supplemental.week_data["weekendEnd"]
|
169
|
+
elsif @cldr.calendar.respond_to?(:weekend_ends) # CLDR 1
|
170
|
+
@cldr.calendar.weekend_ends[calendar.to_s]
|
171
|
+
end
|
172
|
+
day ||= 'sun'
|
173
|
+
wdays.index day
|
151
174
|
end
|
152
175
|
|
153
176
|
def localize_number(object, precision=nil, options={})
|
@@ -195,4 +218,4 @@ module Spider; module I18n
|
|
195
218
|
|
196
219
|
end
|
197
220
|
|
198
|
-
end; end
|
221
|
+
end; end
|
@@ -62,8 +62,8 @@ module Spider
|
|
62
62
|
|
63
63
|
def self.get_apps(apps, options={})
|
64
64
|
specs = resolve(apps, options)
|
65
|
-
manager = self.new
|
66
|
-
manager.install(specs)
|
65
|
+
manager = self.new
|
66
|
+
manager.install(specs, options)
|
67
67
|
return specs
|
68
68
|
end
|
69
69
|
|
@@ -181,9 +181,11 @@ module Spider
|
|
181
181
|
tmp_path = File.join(self.tmp_path, "update-#{DateTime.now.strftime('%Y%m%d-%H%M')}")
|
182
182
|
@backup_path = tmp_path
|
183
183
|
FileUtils.mkdir_p(tmp_path)
|
184
|
+
@previous_apps = {}
|
184
185
|
specs.each do |spec|
|
185
186
|
app_path = File.join(@home_path, 'apps', spec.id)
|
186
187
|
FileUtils.cp_r(app_path, tmp_path)
|
188
|
+
@previous_apps[spec.app_id] = App::AppSpec.load(File.join(app_path, "#{spec.id}.appspec"))
|
187
189
|
end
|
188
190
|
end
|
189
191
|
|
@@ -193,7 +195,7 @@ module Spider
|
|
193
195
|
Spider.init_base
|
194
196
|
@done_tasks = {}
|
195
197
|
specs.each do |spec|
|
196
|
-
prev_spec =
|
198
|
+
prev_spec = @previous_apps[spec.app_id]
|
197
199
|
prev_v = prev_spec.version if prev_spec
|
198
200
|
@done_tasks[spec.app_id] = setup(spec.app_id, prev_v, spec.version)
|
199
201
|
end
|
data/lib/spiderfw/spider.rb
CHANGED
@@ -8,6 +8,7 @@ require 'spiderfw/autoload'
|
|
8
8
|
require 'spiderfw/requires'
|
9
9
|
|
10
10
|
require 'spiderfw/version'
|
11
|
+
require 'timeout'
|
11
12
|
|
12
13
|
begin
|
13
14
|
require 'fssm'
|
@@ -218,6 +219,23 @@ module Spider
|
|
218
219
|
end
|
219
220
|
@shutdown_done = true
|
220
221
|
Spider.logger.debug("Shutdown")
|
222
|
+
if @running_threads
|
223
|
+
begin
|
224
|
+
Timeout.timeout(Spider.conf.get('process.shutdown_timeout')) do
|
225
|
+
@running_threads.each do |thr|
|
226
|
+
thr.join if thr.alive?
|
227
|
+
end
|
228
|
+
end
|
229
|
+
rescue => exc
|
230
|
+
Spider.logger.error(exc)
|
231
|
+
@running_threads.each do |thr|
|
232
|
+
begin
|
233
|
+
thr.kill
|
234
|
+
rescue => exc
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
221
239
|
Debugger.post_mortem = false if Object.const_defined?(:Debugger) && Debugger.post_mortem?
|
222
240
|
@apps.each do |name, mod|
|
223
241
|
mod.app_shutdown if mod.respond_to?(:app_shutdown)
|
@@ -230,6 +248,20 @@ module Spider
|
|
230
248
|
def shutdown!
|
231
249
|
shutdown(true)
|
232
250
|
end
|
251
|
+
|
252
|
+
def add_thread(thr)
|
253
|
+
@running_threads ||= []
|
254
|
+
@threads_mutex ||= Mutex.new
|
255
|
+
@threads_mutex.synchronize do
|
256
|
+
@running_threads << thr
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def remove_thread(thr)
|
261
|
+
@threads_mutex.synchronize do
|
262
|
+
@running_threads.delete(thr)
|
263
|
+
end
|
264
|
+
end
|
233
265
|
|
234
266
|
def main_process_shutdown
|
235
267
|
if startup_done?
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spiderfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 35
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 18
|
10
|
+
version: 0.6.18
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ivan Pirlik
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-16 00:00:00 +02:00
|
19
19
|
default_executable: spider
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|