spiderfw 0.6.25 → 0.6.26.pre1
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 +15 -0
- data/VERSION +1 -1
- data/apps/core/auth/controllers/login_controller.rb +2 -0
- data/apps/core/auth/controllers/mixins/auth_helper.rb +1 -1
- data/apps/core/auth/public/css/login.css +49 -0
- data/apps/core/auth/views/login.layout.shtml +14 -0
- data/apps/core/auth/views/login.shtml +1 -0
- data/apps/core/components/public/js/jquery/plugins/jquery.ui.nestedSortable.js +356 -0
- data/apps/core/forms/public/date_time.js +1 -1
- data/apps/core/forms/public/select.js +1 -1
- data/apps/core/forms/tags/element_row.erb +2 -2
- data/apps/core/forms/widgets/form/form.rb +34 -22
- data/apps/messenger/_init.rb +1 -0
- data/apps/messenger/views/admin/index.shtml +1 -1
- data/apps/messenger/views/index.shtml +1 -1
- data/blueprints/.DS_Store +0 -0
- data/blueprints/home/.DS_Store +0 -0
- data/blueprints/install/.DS_Store +0 -0
- data/data/keys/spider.rsa +27 -0
- data/data/keys/spider.rsa.pub +1 -0
- data/lib/spiderfw/app.rb +64 -4
- data/lib/spiderfw/autoload.rb +0 -1
- data/lib/spiderfw/cmd/commands/app.rb +2 -1
- data/lib/spiderfw/controller/controller.rb +189 -90
- data/lib/spiderfw/controller/dispatcher.rb +13 -3
- data/lib/spiderfw/controller/http_controller.rb +18 -4
- data/lib/spiderfw/controller/mixins/http_mixin.rb +37 -10
- data/lib/spiderfw/controller/mixins/visual.rb +14 -5
- data/lib/spiderfw/http/http.rb +5 -0
- data/lib/spiderfw/model/base_model.rb +1 -11
- data/lib/spiderfw/model/condition.rb +7 -4
- data/lib/spiderfw/model/mappers/mapper.rb +2 -2
- data/lib/spiderfw/requires.rb +1 -0
- data/lib/spiderfw/setup/app_manager.rb +7 -2
- data/lib/spiderfw/setup/setup_task.rb +1 -1
- data/lib/spiderfw/setup/spider_setup_wizard.rb +1 -1
- data/lib/spiderfw/spider.rb +4 -1
- data/lib/spiderfw/templates/layout.rb +8 -3
- data/lib/spiderfw/templates/template.rb +2 -1
- data/lib/spiderfw/test/rack_tester.rb +10 -0
- data/lib/spiderfw/widget/widget_plugin.rb +8 -1
- metadata +254 -157
- data/lib/spiderfw/model/storage/db/connectors/mysql.rb +0 -16
- data/lib/spiderfw/model/storage/db/connectors/mysql2.rb +0 -9
@@ -43,10 +43,12 @@ module Spider
|
|
43
43
|
@request.params = Spider::HTTP.parse_query(@request.env['QUERY_STRING'])
|
44
44
|
@request.get = @request.params
|
45
45
|
end
|
46
|
-
if @request.env['REQUEST_METHOD']
|
46
|
+
if ['POST', 'PUT', 'DELETE'].include?(@request.env['REQUEST_METHOD']) && @request.env['HTTP_CONTENT_TYPE']
|
47
47
|
if @request.env['HTTP_CONTENT_TYPE'].include?('application/x-www-form-urlencoded')
|
48
|
-
|
49
|
-
@request.
|
48
|
+
data = Spider::HTTP.parse_query(@request.read_body)
|
49
|
+
req_meth = @request.env['REQUEST_METHOD'].downcase
|
50
|
+
@request.send(:"#{req_meth}=", data)
|
51
|
+
@request.params.merge!(@request.send(:"#{req_meth}"))
|
50
52
|
elsif @request.env['HTTP_CONTENT_TYPE'] =~ Spider::HTTP::MULTIPART_REGEXP
|
51
53
|
multipart_params, multipart_files = Spider::HTTP.parse_multipart(@request.body, $1, @request.env['CONTENT_LENGTH'].to_i)
|
52
54
|
@request.params.merge!(multipart_params)
|
@@ -176,7 +178,7 @@ module Spider
|
|
176
178
|
end
|
177
179
|
|
178
180
|
module HTTPRequest
|
179
|
-
attr_accessor :http_method, :http_host, :domain, :port, :post, :get
|
181
|
+
attr_accessor :http_method, :http_host, :domain, :port, :post, :get, :put, :delete
|
180
182
|
|
181
183
|
# Returns PATH_INFO reversing any proxy mappings if needed.
|
182
184
|
def path
|
@@ -228,6 +230,10 @@ module Spider
|
|
228
230
|
def get
|
229
231
|
@get ||= {}
|
230
232
|
end
|
233
|
+
|
234
|
+
def put
|
235
|
+
@put ||= {}
|
236
|
+
end
|
231
237
|
|
232
238
|
def post?
|
233
239
|
self.http_method == :POST
|
@@ -236,6 +242,14 @@ module Spider
|
|
236
242
|
def get?
|
237
243
|
self.http_method == :GET
|
238
244
|
end
|
245
|
+
|
246
|
+
def put?
|
247
|
+
self.http_method == :PUT
|
248
|
+
end
|
249
|
+
|
250
|
+
def delete?
|
251
|
+
self.http_method == :DELETE
|
252
|
+
end
|
239
253
|
|
240
254
|
end
|
241
255
|
|
@@ -12,6 +12,11 @@ module Spider; module ControllerMixins
|
|
12
12
|
klass.extend(ClassMethods)
|
13
13
|
end
|
14
14
|
|
15
|
+
# Sets the headers to redirect the browser to the given url, and calls
|
16
|
+
# {Controller#done} to terminate the execution of the Controller chain
|
17
|
+
# @param [String] url
|
18
|
+
# @param [Fixnum] code HTTP status to send
|
19
|
+
# @return void
|
15
20
|
def redirect(url, code=Spider::HTTP::SEE_OTHER)
|
16
21
|
debug "REDIRECTING TO #{url}"
|
17
22
|
@request.session.persist if @request.session # It might be too late afterwards
|
@@ -22,30 +27,35 @@ module Spider; module ControllerMixins
|
|
22
27
|
done
|
23
28
|
end
|
24
29
|
|
25
|
-
|
26
|
-
|
30
|
+
# Takes a url path that the framework would accept, and transforms it
|
31
|
+
# into the url path the webserver would send, given the settings in http.proxy_mapping
|
32
|
+
# @param [Strint] url_path
|
33
|
+
# @return [String] The transformed url path
|
34
|
+
def self.reverse_proxy_mapping(url_path)
|
35
|
+
return '' unless url_path
|
27
36
|
if (maps = Spider.conf.get('http.proxy_mapping'))
|
28
37
|
maps.each do |proxy, spider|
|
29
38
|
spider ||= ''
|
30
|
-
return proxy +
|
39
|
+
return proxy + url_path[spider.length..-1] if (spider == "" || url_path[0..spider.length-1] == spider)
|
31
40
|
end
|
32
41
|
end
|
33
|
-
return
|
42
|
+
return url_path
|
34
43
|
end
|
35
44
|
|
36
45
|
# Returns the http path used to call the current controller & action.
|
37
46
|
# Reverses any proxy mappings to the Controller#request_path.
|
47
|
+
# @return [String]
|
38
48
|
def request_path
|
39
49
|
HTTPMixin.reverse_proxy_mapping(super)
|
40
50
|
end
|
41
51
|
|
42
|
-
#
|
52
|
+
# @return [String] the request_path prefixed with http:// and the current host.
|
43
53
|
def request_url
|
44
54
|
return request_path unless @request.env['HTTP_HOST']
|
45
55
|
'http://'+@request.env['HTTP_HOST']+request_path
|
46
56
|
end
|
47
57
|
|
48
|
-
#
|
58
|
+
# @return [String] the request_url with query params, if any
|
49
59
|
def request_full_url
|
50
60
|
url = request_url
|
51
61
|
if (@request.env['QUERY_STRING'] && !@request.env['QUERY_STRING'].empty?)
|
@@ -54,11 +64,18 @@ module Spider; module ControllerMixins
|
|
54
64
|
return url
|
55
65
|
end
|
56
66
|
|
57
|
-
|
67
|
+
# Sets or returns the charset for the controller
|
68
|
+
# @param [String|nil] The charset
|
69
|
+
# @return [String] The charset in use
|
70
|
+
def self.output_charset(val=nil)
|
58
71
|
@output_charset = val if val
|
59
72
|
@output_charset || Spider.conf.get('http.charset')
|
60
73
|
end
|
61
74
|
|
75
|
+
# Sets a Content type
|
76
|
+
# @param [String|Symbol] Content type, or a symbol representing it
|
77
|
+
# (Can be :text, :json, :js, :javascript, :html, :xml)
|
78
|
+
# @return [String] The value of the "Content-Type" header
|
62
79
|
def content_type(ct)
|
63
80
|
if ct.is_a?(Symbol)
|
64
81
|
ct = {
|
@@ -73,6 +90,9 @@ module Spider; module ControllerMixins
|
|
73
90
|
@response.headers["Content-Type"] = "#{ct};charset=utf-8"
|
74
91
|
end
|
75
92
|
|
93
|
+
#
|
94
|
+
# @param [String] action
|
95
|
+
# @param [*Object] arguments
|
76
96
|
def before(action='', *arguments)
|
77
97
|
return super if self.is_a?(Spider::Widget)
|
78
98
|
# FIXME: the Spider::Widget check
|
@@ -89,14 +109,17 @@ module Spider; module ControllerMixins
|
|
89
109
|
super
|
90
110
|
end
|
91
111
|
|
112
|
+
# @return [String] the base URL to which the installation responds
|
92
113
|
def self.base_url
|
93
114
|
HTTPMixin.reverse_proxy_mapping("")
|
94
115
|
end
|
95
116
|
|
117
|
+
# @return [String] the base URL to which the installation responds
|
96
118
|
def base_url
|
97
119
|
HTTPMixin.base_url
|
98
120
|
end
|
99
121
|
|
122
|
+
|
100
123
|
def prepare_scene(scene)
|
101
124
|
scene = super
|
102
125
|
scene.base_url = base_url
|
@@ -212,13 +235,17 @@ module Spider; module ControllerMixins
|
|
212
235
|
end
|
213
236
|
|
214
237
|
|
215
|
-
def
|
216
|
-
return
|
238
|
+
def url(action=nil)
|
239
|
+
return super unless Spider.site
|
217
240
|
u = "http://#{Spider.site.domain}"
|
218
241
|
u += ":#{Spider.site.port}" unless Spider.site.port == 80
|
219
|
-
u += HTTPMixin.reverse_proxy_mapping(
|
242
|
+
u += HTTPMixin.reverse_proxy_mapping(super(action))
|
220
243
|
u
|
221
244
|
end
|
245
|
+
|
246
|
+
def http_url(action=nil)
|
247
|
+
url(action)
|
248
|
+
end
|
222
249
|
|
223
250
|
end
|
224
251
|
|
@@ -39,9 +39,9 @@ module Spider; module ControllerMixins
|
|
39
39
|
return super unless action_target?
|
40
40
|
format = nil
|
41
41
|
req_format = self.is_a?(Widget) && @is_target && @request.params['_wf'] ? @request.params['_wf'].to_sym : @request.format
|
42
|
-
if
|
42
|
+
if req_format && self.class.output_formats[@executed_method]
|
43
43
|
format = req_format if self.class.output_format?(@executed_method, req_format)
|
44
|
-
if
|
44
|
+
if format
|
45
45
|
format_params = self.class.output_format_params(@executed_method, format)
|
46
46
|
end
|
47
47
|
if @executed_method && !format || (format_params && format_params[:widgets] && !target_mode?)
|
@@ -50,6 +50,11 @@ module Spider; module ControllerMixins
|
|
50
50
|
end
|
51
51
|
format ||= self.class.output_format(@executed_method)
|
52
52
|
format_params ||= self.class.output_format_params(@executed_method, format)
|
53
|
+
|
54
|
+
unless !format_params || format_params[:http_method].blank?
|
55
|
+
format_params[:http_method] = [format_params[:http_method]] unless format_params[:http_method].is_a?(Enumerable)
|
56
|
+
raise Forbidden unless format_params[:http_method].include?(@request.http_method)
|
57
|
+
end
|
53
58
|
output_format_headers(format)
|
54
59
|
@executed_format = format
|
55
60
|
@executed_format_params = format_params
|
@@ -100,7 +105,7 @@ module Spider; module ControllerMixins
|
|
100
105
|
@is_target = false if target_mode? && !self.is_a?(Spider::Widget)
|
101
106
|
if (self.is_a?(Widget) && @is_target && @request.params['_wp'])
|
102
107
|
params = @request.params['_wp']
|
103
|
-
elsif
|
108
|
+
elsif @visual_params.is_a?(Hash) && @visual_params[:params]
|
104
109
|
p_first, p_rest = action.split('/')
|
105
110
|
params = format_params[:params].call(p_rest) if p_rest
|
106
111
|
end
|
@@ -192,7 +197,11 @@ module Spider; module ControllerMixins
|
|
192
197
|
template._widget_action = @request.params['_action']
|
193
198
|
else
|
194
199
|
template._action_to = options[:action_to]
|
195
|
-
|
200
|
+
template_action = @current_action.to_s.split('/')
|
201
|
+
if template_action.first == @executed_method.to_s
|
202
|
+
template_action = template_action[1..-1]
|
203
|
+
end
|
204
|
+
template._action = template_action.join('/')
|
196
205
|
end
|
197
206
|
return template
|
198
207
|
end
|
@@ -462,7 +471,7 @@ module Spider; module ControllerMixins
|
|
462
471
|
@output_formats[method] << format
|
463
472
|
@output_format_params[method] ||= {}
|
464
473
|
@output_format_params[method][format] = params
|
465
|
-
|
474
|
+
controller_action(method, params)
|
466
475
|
return format
|
467
476
|
end
|
468
477
|
return @default_output_format unless @output_formats[method] && @output_formats[method][0]
|
data/lib/spiderfw/http/http.rb
CHANGED
@@ -15,6 +15,11 @@ module Spider
|
|
15
15
|
FILENAME_REGEX = /Content-Disposition:.* filename="?([^\";]*)"?/ni.freeze
|
16
16
|
CRLF = "\r\n".freeze
|
17
17
|
EOL = CRLF
|
18
|
+
|
19
|
+
METHODS = [
|
20
|
+
:GET, :POST, :PUT, :DELETE, :HEAD, :TRACE, :CONNECT,
|
21
|
+
:PROPFIND, :PROPPATCH, :MKCOL, :COPY, :MOVE, :LOCK, :UNLOCK
|
22
|
+
]
|
18
23
|
|
19
24
|
module StatusCodes
|
20
25
|
|
@@ -52,6 +52,7 @@ module Spider; module Model
|
|
52
52
|
# p salmon_lovers[0].name
|
53
53
|
# => 'Cat'
|
54
54
|
class BaseModel
|
55
|
+
include App::AppClass
|
55
56
|
include Spider::Logger
|
56
57
|
include DataTypes
|
57
58
|
include Spider::QueryFuncs
|
@@ -138,17 +139,6 @@ module Spider; module Model
|
|
138
139
|
@subclasses || []
|
139
140
|
end
|
140
141
|
|
141
|
-
# Returns the parent Spider::App of the module
|
142
|
-
# @return [Spider::App]
|
143
|
-
def self.app
|
144
|
-
return @app if @app
|
145
|
-
app = self
|
146
|
-
while app && !app.include?(Spider::App)
|
147
|
-
app = app.parent_module
|
148
|
-
end
|
149
|
-
@app = app
|
150
|
-
end
|
151
|
-
|
152
142
|
|
153
143
|
#######################################
|
154
144
|
# Model definition methods #
|
@@ -110,6 +110,9 @@ module Spider; module Model
|
|
110
110
|
@comparisons = {}
|
111
111
|
@subconditions = []
|
112
112
|
params.reject!{ |p| p.nil? }
|
113
|
+
if params[0].is_a?(Proc)
|
114
|
+
params[0] = params[0].call
|
115
|
+
end
|
113
116
|
if (params.length == 1 && params[0].is_a?(Hash) && !params[0].is_a?(Condition))
|
114
117
|
params[0].each do |k, v|
|
115
118
|
set(k, '=', v)
|
@@ -193,14 +196,14 @@ module Spider; module Model
|
|
193
196
|
end
|
194
197
|
|
195
198
|
# Adds a subcondtion.
|
196
|
-
# @param [Condition] condition
|
199
|
+
# @param [Condition|Hash|Proc|String] condition
|
197
200
|
# @return [void]
|
198
201
|
def <<(condition)
|
199
|
-
if
|
202
|
+
if condition.class == self.class
|
200
203
|
@subconditions << condition
|
201
|
-
elsif
|
204
|
+
elsif condition.is_a?(Hash) || condition.is_a?(Proc)
|
202
205
|
@subconditions << self.class.new(condition)
|
203
|
-
elsif
|
206
|
+
elsif condition.class == String
|
204
207
|
key, val, comparison = parse_comparison(condition)
|
205
208
|
set(key, val, comparison)
|
206
209
|
end
|
@@ -1113,8 +1113,8 @@ module Spider; module Model
|
|
1113
1113
|
rescue TypeError => exc
|
1114
1114
|
raise TypeError, "Can't convert #{v} to #{element.type} for element #{k} (#{exc.message})"
|
1115
1115
|
end
|
1116
|
-
elsif element.type
|
1117
|
-
v =
|
1116
|
+
elsif [DateTime, Date].include?(element.type) && v && !v.is_a?(Date) && !v.is_a?(Time)
|
1117
|
+
v = element.type.parse(v)
|
1118
1118
|
changed_v = true
|
1119
1119
|
elsif element.model? && v.is_a?(Spider::Model::Condition)
|
1120
1120
|
unless v.primary_keys_only?(element.model)
|
data/lib/spiderfw/requires.rb
CHANGED
@@ -27,6 +27,7 @@ require 'spiderfw/utils/http_client'
|
|
27
27
|
require 'spiderfw/utils/gems'
|
28
28
|
require 'spiderfw/config/configuration'
|
29
29
|
require 'spiderfw/config/configurable'
|
30
|
+
require 'spiderfw/app'
|
30
31
|
require 'spiderfw/model/model'
|
31
32
|
require 'spiderfw/home'
|
32
33
|
require 'spiderfw/site'
|
@@ -90,8 +90,8 @@ module Spider
|
|
90
90
|
do_update(spec, options)
|
91
91
|
end
|
92
92
|
post_update(specs[:update], options)
|
93
|
-
rescue
|
94
|
-
rollback_update
|
93
|
+
rescue
|
94
|
+
rollback_update unless options[:no_rollback]
|
95
95
|
raise
|
96
96
|
end
|
97
97
|
unless options[:no_activate]
|
@@ -496,6 +496,11 @@ module Spider
|
|
496
496
|
|
497
497
|
private
|
498
498
|
|
499
|
+
def git_command(command)
|
500
|
+
#`GIT_SSH='ssh -i #{File.join(Spider.paths[:data], 'keys', 'spider.rsa')}' git #{command}`
|
501
|
+
`git #{command}`
|
502
|
+
end
|
503
|
+
|
499
504
|
def reset_git_env
|
500
505
|
ENV['GIT_WORK_TREE'] = nil
|
501
506
|
ENV["GIT_INDEX_FILE"] = nil
|
data/lib/spiderfw/spider.rb
CHANGED
@@ -154,7 +154,10 @@ module Spider
|
|
154
154
|
@runmode = nil
|
155
155
|
self.runmode = $SPIDER_RUNMODE if $SPIDER_RUNMODE
|
156
156
|
load_configuration File.join($SPIDER_PATH, 'config')
|
157
|
-
|
157
|
+
begin
|
158
|
+
user_rc = File.join(Etc.getpwuid.dir, '.spider.conf.yml')
|
159
|
+
rescue NoMethodError # No getpwuid under windows
|
160
|
+
end
|
158
161
|
if File.file?(user_rc)
|
159
162
|
load_configuration_file(user_rc)
|
160
163
|
end
|
@@ -270,9 +270,14 @@ module Spider
|
|
270
270
|
compiler.compile(ass[:path], dest)
|
271
271
|
rescue Exception
|
272
272
|
if ext == '.less'
|
273
|
-
|
274
|
-
|
275
|
-
|
273
|
+
msg = "Unable to compile LESS file #{ass[:path]}."
|
274
|
+
msg += "Please ensure you have a JS backend (see https://github.com/sstephenson/execjs)"
|
275
|
+
elsif ext == '.scss' || ext == '.sass'
|
276
|
+
msg = "Unable to compile SASS file #{ass[:path]}."
|
277
|
+
msg += "Please ensure that you have the 'sass' (and optionally 'compass') gems installed."
|
278
|
+
end
|
279
|
+
Spider.logger.error(msg)
|
280
|
+
unless File.exist?(dest)
|
276
281
|
raise
|
277
282
|
end
|
278
283
|
end
|
@@ -405,7 +405,8 @@ module Spider
|
|
405
405
|
ass[:app] = asset_owner.app if asset_owner.respond_to?(:app)
|
406
406
|
# FIXME! @definer_class is not correct for Spider::HomeController
|
407
407
|
raise "Asset type not given for #{src}" unless type
|
408
|
-
search_classes = [asset_owner
|
408
|
+
search_classes = [asset_owner]
|
409
|
+
search_classes << @definer_class if @definer_class
|
409
410
|
dfnr = @definer_class.superclass if @definer_class && @definer_class.respond_to?(:superclass)
|
410
411
|
while dfnr && dfnr < Spider::Widget
|
411
412
|
search_classes << dfnr
|
@@ -50,6 +50,13 @@ module Spider
|
|
50
50
|
end
|
51
51
|
@controller_actions
|
52
52
|
end
|
53
|
+
|
54
|
+
def controller_action(method, params)
|
55
|
+
@controller_actions ||= []
|
56
|
+
@controller_actions << method
|
57
|
+
@controller_action_params ||= {}
|
58
|
+
@controller_action_params[method] = params
|
59
|
+
end
|
53
60
|
|
54
61
|
def controller_action?(method)
|
55
62
|
@controller_actions && @controller_actions.include?(method)
|
@@ -59,4 +66,4 @@ module Spider
|
|
59
66
|
|
60
67
|
end
|
61
68
|
|
62
|
-
end
|
69
|
+
end
|