spiderfw 0.5.16 → 0.5.17
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/VERSION +1 -1
- data/apps/core/components/assets.rb +2 -1
- data/apps/core/components/public/js/spider.js +2 -0
- data/apps/core/forms/widgets/form/form.rb +4 -2
- data/apps/core/forms/widgets/inputs/html_area/html_area.shtml +1 -1
- data/lib/spiderfw/cmd/commands/app.rb +7 -3
- data/lib/spiderfw/config/options/spider.rb +2 -0
- data/lib/spiderfw/controller/request.rb +1 -0
- data/lib/spiderfw/i18n/cldr.rb +1 -0
- data/lib/spiderfw/model/base_model.rb +1 -0
- data/lib/spiderfw/model/condition.rb +2 -2
- data/lib/spiderfw/model/mappers/mapper.rb +10 -1
- data/lib/spiderfw/model/storage/base_storage.rb +3 -3
- data/lib/spiderfw/model/storage/db/adapters/oracle.rb +7 -3
- data/lib/spiderfw/model/storage/db/connectors/oci8.rb +1 -0
- data/lib/spiderfw/model/storage/db/db_storage.rb +1 -0
- data/lib/spiderfw/patches/hpricot.rb +13 -0
- data/lib/spiderfw/setup/app_manager.rb +17 -9
- data/lib/spiderfw/templates/blocks/widget.rb +16 -2
- data/lib/spiderfw/templates/layout.rb +208 -192
- data/lib/spiderfw/templates/template.rb +15 -30
- data/lib/spiderfw/utils/http_client.rb +2 -0
- data/spider.gemspec +1 -1
- metadata +6 -5
data/CHANGELOG
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.17
|
@@ -1,6 +1,7 @@
|
|
1
1
|
Spider::Template.define_named_asset 'jquery', [
|
2
|
-
[:js, 'js/jquery/jquery-1.4.3.js', Spider::Components]
|
2
|
+
[:js, 'js/jquery/jquery-1.4.3.js', Spider::Components, {:cdn => 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js'}]
|
3
3
|
]
|
4
|
+
|
4
5
|
Spider::Template.define_named_asset 'spider', [
|
5
6
|
[:js, 'js/inheritance.js', Spider::Components],
|
6
7
|
[:js, 'js/spider.js', Spider::Components],
|
@@ -199,6 +199,7 @@ Spider.Widget = Class.extend({
|
|
199
199
|
if (options.before) options.before();
|
200
200
|
},
|
201
201
|
success: function(res){
|
202
|
+
w.trigger('ajaxifyResponse', form);
|
202
203
|
w.replaceHTML(res);
|
203
204
|
w.removeLoading();
|
204
205
|
if (options.onLoad) options.onLoad(form);
|
@@ -231,6 +232,7 @@ Spider.Widget = Class.extend({
|
|
231
232
|
type: 'GET',
|
232
233
|
dataType: 'html',
|
233
234
|
success: function(res){
|
235
|
+
w.trigger('ajaxifyResponse', a);
|
234
236
|
w.replaceHTML(res);
|
235
237
|
w.removeLoading();
|
236
238
|
if (options.onLoad) options.onLoad(a);
|
@@ -78,8 +78,10 @@ module Spider; module Forms
|
|
78
78
|
@model = const_get_full(@model) if @model.is_a?(String)
|
79
79
|
if @model.method_defined?(:to_subclass) # FIXME: this is a quick hack, standardize
|
80
80
|
@obj ||= load
|
81
|
-
|
82
|
-
|
81
|
+
if @obj
|
82
|
+
@obj = @obj.to_subclass
|
83
|
+
@model = @obj.class
|
84
|
+
end
|
83
85
|
end
|
84
86
|
if (@elements.is_a?(String))
|
85
87
|
@elements = @elements.split(',').map{ |e| @model.elements[e.strip.to_sym] }.reject{ |i| i.nil? }
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<tpl:asset type="js" src="html_area.js" /><tpl:asset type="js" src="text_area.js" />
|
5
5
|
<!--- <tpl:asset type="css" src="jwysiwyg/jquery.wysiwyg.css" />
|
6
6
|
<tpl:asset type="js" src="jwysiwyg/jquery.wysiwyg.js" /> -->
|
7
|
-
<tpl:asset type="js" src="ckeditor/ckeditor.js" />
|
7
|
+
<tpl:asset type="js" src="ckeditor/ckeditor.js" compressed="true"/>
|
8
8
|
<tpl:asset type="js" src="ckeditor/adapters/jquery.js" />
|
9
9
|
<div class="initial_html" style="display:none">{ @initial_html }</div>
|
10
10
|
<div class="css" style="display:none">{ @css }</div>
|
@@ -109,6 +109,7 @@ class AppCommand < CmdParse::Command
|
|
109
109
|
opt.on("--no-optional-gems", _("Don't install optional gem dependencies"), "-G"){ |g|
|
110
110
|
@no_optional_gems = true
|
111
111
|
}
|
112
|
+
opt.on("--ssh-user [USERNAME]", _("SSH user")){ |s| @ssh_user = s }
|
112
113
|
end
|
113
114
|
install.set_execution_block do |args|
|
114
115
|
unless File.exist?('init.rb') && File.directory?('apps')
|
@@ -121,7 +122,8 @@ class AppCommand < CmdParse::Command
|
|
121
122
|
begin
|
122
123
|
require 'grit'
|
123
124
|
use_git = true
|
124
|
-
rescue
|
125
|
+
rescue => exc
|
126
|
+
puts exc.message
|
125
127
|
puts "Grit not available; install Grit for Git support"
|
126
128
|
end
|
127
129
|
end
|
@@ -147,11 +149,13 @@ class AppCommand < CmdParse::Command
|
|
147
149
|
puts _("The following apps will be installed as a dependency:")
|
148
150
|
puts (deps - apps).inspect
|
149
151
|
end
|
150
|
-
|
152
|
+
options = {
|
151
153
|
:use_git => use_git,
|
152
154
|
:no_gems => @no_gems,
|
153
155
|
:no_optional_gems => @no_optional_gems
|
154
|
-
}
|
156
|
+
}
|
157
|
+
options[:ssh_user] = @ssh_user if @ssh_user
|
158
|
+
Spider::AppManager.install(specs, Dir.pwd, options)
|
155
159
|
end
|
156
160
|
self.add_command(install)
|
157
161
|
|
@@ -156,6 +156,8 @@ module Spider
|
|
156
156
|
:default => lambda{ Spider.config.get('runmode') == 'production' ? true : false }, :type => Spider::DataTypes::Bool
|
157
157
|
config_option 'css.cachebuster', _("Use cache busters for CSS urls"), :type => Symbol,
|
158
158
|
:default => :soft, :choices => [false, :soft, :hard, :hardcopy]
|
159
|
+
config_option 'assets.use_cdn', _("Use a Content Delivery Network for assets if defined"), :type => Spider::Bool,
|
160
|
+
:default => lambda{ Spider.config.get('runmode') == 'production' ? true : false }
|
159
161
|
|
160
162
|
config_option 'http_proxy', _("Proxy to use for http clients (http://user:pass@host:port)"), :type => String,
|
161
163
|
:do => lambda{ |val| ENV['http_proxy'] = val }
|
data/lib/spiderfw/i18n/cldr.rb
CHANGED
@@ -376,6 +376,7 @@ module Spider; module Model
|
|
376
376
|
end
|
377
377
|
if (@subclasses)
|
378
378
|
@subclasses.each do |sub|
|
379
|
+
next if sub == type && attributes[:added_reverse] && sub.elements[attributes[:reverse]].type == self # subclass ref to parent
|
379
380
|
next if sub.elements[name] # if subclass already defined an element with this name, don't overwrite it
|
380
381
|
sub.elements[name] = @elements[name].clone
|
381
382
|
sub.elements_order << name
|
@@ -169,10 +169,10 @@ module Spider; module Model
|
|
169
169
|
|
170
170
|
# Sets a comparison.
|
171
171
|
def set(field, comparison, value)
|
172
|
-
if
|
172
|
+
if value.is_a?(QuerySet)
|
173
173
|
value = value.to_a
|
174
174
|
end
|
175
|
-
if
|
175
|
+
if value.is_a?(Array) && comparison != 'between'
|
176
176
|
or_cond = self.class.or
|
177
177
|
value.uniq.each do |v|
|
178
178
|
or_cond.set(field, comparison, v)
|
@@ -253,7 +253,7 @@ module Spider; module Model
|
|
253
253
|
# Elements that are associated to this one externally.
|
254
254
|
def association_elements
|
255
255
|
els = @model.elements_array.select{ |el|
|
256
|
-
mapped?(el) && !el.integrated? && !have_references?(el) && !(el.attributes[:added_reverse] && el.type
|
256
|
+
mapped?(el) && !el.integrated? && !have_references?(el) && !(el.attributes[:added_reverse] && el.type <= @model)
|
257
257
|
}
|
258
258
|
if @unit_of_work_task
|
259
259
|
els = els.select{ |el| el.attributes[:junction] && !el.attributes[:keep_junction] }
|
@@ -404,6 +404,7 @@ module Spider; module Model
|
|
404
404
|
# Deletes an object, or objects according to a condition.
|
405
405
|
# Will not delete with null condition (i.e. all objects) unless force is true
|
406
406
|
def delete(obj_or_condition, force=false)
|
407
|
+
|
407
408
|
def prepare_delete_condition(obj)
|
408
409
|
condition = Condition.and
|
409
410
|
@model.primary_keys.each do |key|
|
@@ -882,6 +883,14 @@ module Spider; module Model
|
|
882
883
|
condition = @model.prepare_condition(condition)
|
883
884
|
basic_preprocess(condition)
|
884
885
|
end
|
886
|
+
if @model.attributes[:integrated_models]
|
887
|
+
@model.attributes[:integrated_models].each do |im, iel|
|
888
|
+
if im.respond_to?(:prepare_condition)
|
889
|
+
condition = im.prepare_condition(condition)
|
890
|
+
basic_preprocess(condition)
|
891
|
+
end
|
892
|
+
end
|
893
|
+
end
|
885
894
|
|
886
895
|
# Utility function to set conditions on
|
887
896
|
def set_pks_condition(condition, el, val, prefix) # :nodoc:
|
@@ -6,7 +6,7 @@ module Spider; module Model; module Storage
|
|
6
6
|
attr_accessor :instance_name
|
7
7
|
|
8
8
|
def self.sequence_sync
|
9
|
-
@sequence_sync ||= Sync.new
|
9
|
+
@sequence_sync ||= ::Sync.new
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.base_types
|
@@ -96,7 +96,7 @@ module Spider; module Model; module Storage
|
|
96
96
|
f.flock File::LOCK_UN
|
97
97
|
f.close
|
98
98
|
end
|
99
|
-
self.class.sequence_sync.lock(Sync::UN)
|
99
|
+
self.class.sequence_sync.lock(::Sync::UN)
|
100
100
|
return seq
|
101
101
|
end
|
102
102
|
|
@@ -112,4 +112,4 @@ module Spider; module Model; module Storage
|
|
112
112
|
|
113
113
|
|
114
114
|
|
115
|
-
end; end; end
|
115
|
+
end; end; end
|
@@ -194,10 +194,10 @@ module Spider; module Model; module Storage; module Db
|
|
194
194
|
sql = "#{key} #{comp} NULL"
|
195
195
|
else
|
196
196
|
if comp.to_s.downcase == 'between'
|
197
|
-
if
|
198
|
-
val0, val1 = value
|
199
|
-
else
|
197
|
+
if bound_vars
|
200
198
|
val0 = ":#{(curr[:bind_cnt] += 1)}"; val1 = ":#{(curr[:bind_cnt] += 1)}"
|
199
|
+
else
|
200
|
+
val0, val1 = value
|
201
201
|
end
|
202
202
|
sql = "#{key} #{comp} #{val0} AND #{val1}"
|
203
203
|
else
|
@@ -263,6 +263,10 @@ module Spider; module Model; module Storage; module Db
|
|
263
263
|
##############################################################
|
264
264
|
# Methods to get information from the db #
|
265
265
|
##############################################################
|
266
|
+
|
267
|
+
def post_execute
|
268
|
+
curr[:bind_cnt] = 0
|
269
|
+
end
|
266
270
|
|
267
271
|
def list_tables
|
268
272
|
return execute("SELECT TABLE_NAME FROM user_tables ORDER BY table_name").map{ |r| r['TABLE_NAME'] }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Hpricot
|
2
|
+
class DocType
|
3
|
+
def output(out, opts = {})
|
4
|
+
out <<
|
5
|
+
if_output(opts) do
|
6
|
+
"<!DOCTYPE #{target}" +
|
7
|
+
(public_id ? " PUBLIC \"#{public_id}\"" : "") +
|
8
|
+
(system_id ? " SYSTEM #{html_quote(system_id)}" : "") + ">"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -11,25 +11,33 @@ module Spider
|
|
11
11
|
pre_setup(specs, options)
|
12
12
|
specs.each do |spec|
|
13
13
|
if spec.git_repo && options[:use_git]
|
14
|
-
git_install(spec, home_path)
|
14
|
+
git_install(spec, home_path, options)
|
15
15
|
else
|
16
|
-
pack_install(spec, home_path)
|
16
|
+
pack_install(spec, home_path, options)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.git_install(spec, home_path)
|
21
|
+
def self.git_install(spec, home_path, options={})
|
22
22
|
require 'grit'
|
23
|
+
if ::File.exist?("apps/#{spec.id}")
|
24
|
+
puts _("%s already installed, skipping") % spec.id
|
25
|
+
return
|
26
|
+
end
|
23
27
|
repo = Grit::Repo.new(home_path)
|
24
28
|
puts _("Fetching %s from %s") % [spec.app_id, spec.git_repo]
|
25
|
-
|
29
|
+
repo_url = spec.git_repo
|
30
|
+
if options[:ssh_user] && repo_url =~ /ssh:\/\/([^@]+@)?(.+)/
|
31
|
+
repo_url = "ssh://#{options[:ssh_user]}@#{$2}"
|
32
|
+
end
|
33
|
+
`#{Grit::Git.git_binary} submodule add #{repo_url} apps/#{spec.id}`
|
26
34
|
repo.git.submodule({}, "init")
|
27
35
|
repo.git.submodule({}, "update")
|
28
36
|
repo.add('.gitmodules', "apps/#{spec.id}")
|
29
37
|
repo.commit_index(_("Added app %s") % spec.id)
|
30
38
|
end
|
31
39
|
|
32
|
-
def self.pack_install(spec, home_path)
|
40
|
+
def self.pack_install(spec, home_path, options={})
|
33
41
|
require 'rubygems/package'
|
34
42
|
client = AppServerClient.new(spec.app_server)
|
35
43
|
print _("Fetching %s from server... ") % spec.app_id
|
@@ -82,14 +90,14 @@ module Spider
|
|
82
90
|
pre_setup(specs, options)
|
83
91
|
specs.each do |spec|
|
84
92
|
if spec.git_repo && options[:use_git]
|
85
|
-
git_update(spec, home_path)
|
93
|
+
git_update(spec, home_path, options)
|
86
94
|
else
|
87
|
-
pack_update(spec, home_path)
|
95
|
+
pack_update(spec, home_path, options)
|
88
96
|
end
|
89
97
|
end
|
90
98
|
end
|
91
99
|
|
92
|
-
def self.git_update(spec, home_path)
|
100
|
+
def self.git_update(spec, home_path, options={})
|
93
101
|
require 'grit'
|
94
102
|
home_repo = Grit::Repo.new(home_path)
|
95
103
|
app_path = File.join(home_path, "apps/#{spec.id}")
|
@@ -116,7 +124,7 @@ module Spider
|
|
116
124
|
home_repo.commit_index(_("Updated app %s") % spec.id)
|
117
125
|
end
|
118
126
|
|
119
|
-
def self.pack_update(spec, home_path)
|
127
|
+
def self.pack_update(spec, home_path, options={})
|
120
128
|
require 'fileutils'
|
121
129
|
require 'date'
|
122
130
|
require 'time'
|
@@ -32,7 +32,6 @@ module Spider; module TemplateBlocks
|
|
32
32
|
init, c = klass.compile_block(@el, id, @el.attributes.to_hash, options)
|
33
33
|
return CompiledBlock.new(init, c)
|
34
34
|
end
|
35
|
-
init_params = self.class.attributes_to_init_params(@el.attributes.to_hash)
|
36
35
|
|
37
36
|
html = ""
|
38
37
|
@el.each_child do |ch|
|
@@ -43,7 +42,15 @@ module Spider; module TemplateBlocks
|
|
43
42
|
|
44
43
|
template = nil
|
45
44
|
overrides += @template.overrides_for(id)
|
45
|
+
|
46
|
+
asset_profiles = @el.get_attribute('sp:asset-profiles')
|
47
|
+
if asset_profiles
|
48
|
+
asset_profiles = asset_profiles.split(/,\s*/).map{ |pr| pr.to_sym }
|
49
|
+
@el.remove_attribute('sp:asset-profiles')
|
50
|
+
end
|
51
|
+
|
46
52
|
template = klass.load_template(template_attr || klass.default_template)
|
53
|
+
template.asset_profiles = asset_profiles if asset_profiles
|
47
54
|
if (overrides.length > 0)
|
48
55
|
#template_name = klass.find_template(template_attr)
|
49
56
|
template.add_overrides overrides
|
@@ -55,12 +62,19 @@ module Spider; module TemplateBlocks
|
|
55
62
|
|
56
63
|
init = ""
|
57
64
|
t_param = 'nil'
|
65
|
+
t_options = {}
|
66
|
+
|
67
|
+
t_options[:asset_profiles] = asset_profiles if asset_profiles
|
68
|
+
|
58
69
|
if (template)
|
59
70
|
# FIXME: the subtemplate shouldn't be loaded at this point
|
60
|
-
init = "t = load_subtemplate('#{id}')\n"
|
71
|
+
init = "t = load_subtemplate('#{id}', #{t_options.inspect})\n"
|
61
72
|
t_param = 't'
|
62
73
|
end
|
63
74
|
html.gsub!("'", "\\\\'")
|
75
|
+
|
76
|
+
init_params = self.class.attributes_to_init_params(@el.attributes.to_hash)
|
77
|
+
|
64
78
|
init += "add_widget('#{id}', #{klass}.new(@request, @response), {#{init_params.join(', ')}}, '#{html}', #{t_param})\n"
|
65
79
|
c = "yield :\"#{id}\"\n"
|
66
80
|
return CompiledBlock.new(init, c)
|
@@ -19,53 +19,93 @@ module Spider
|
|
19
19
|
super
|
20
20
|
end
|
21
21
|
|
22
|
+
def only_asset_profiles(*profiles)
|
23
|
+
@only_asset_profiles = profiles
|
24
|
+
end
|
25
|
+
|
26
|
+
def no_asset_profiles(*profiles)
|
27
|
+
@no_asset_profiles = profiles
|
28
|
+
end
|
29
|
+
|
22
30
|
def prepare_assets
|
23
31
|
@template_assets = { :css => [], :js => [] }
|
32
|
+
assets = {:css => [], :js => []}
|
24
33
|
seen = {}
|
25
|
-
js = []
|
26
|
-
css = []
|
27
|
-
runtime = []
|
28
34
|
js_messages = []
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
use_cdn = Spider.conf.get('assets.use_cdn')
|
36
|
+
compress_assets = {:js => {}, :css => {}}
|
37
|
+
cname = File.basename(@path, '.layout.shtml')
|
38
|
+
cname = File.basename(cname, '.shtml')
|
39
|
+
cname += "-#{@asset_set}" if @asset_set
|
40
|
+
pub_dest = nil
|
41
|
+
all_assets.each do |ass|
|
42
|
+
seen_check = ass[:runtime] || ass[:src]
|
43
|
+
next if !ass[:src] || ass[:src].empty?
|
44
|
+
next if seen[seen_check]
|
45
|
+
seen[seen_check] = true
|
46
|
+
type = ass[:type].to_sym
|
47
|
+
compress_config = case type
|
48
|
+
when :js
|
49
|
+
'javascript.compress'
|
50
|
+
when :css
|
51
|
+
'css.compress'
|
52
|
+
end
|
53
|
+
no_compress = @scene.__is_error_page || !Spider.conf.get(compress_config) || \
|
54
|
+
ass[:runtime] || ass[:if_ie_lte] || ass[:media] || (use_cdn && ass[:cdn])
|
55
|
+
|
56
|
+
if no_compress
|
57
|
+
if ass[:runtime]
|
58
|
+
assets[type] << Spider::Template.runtime_assets[ass[:runtime]].call(@request, @response, @scene)
|
59
|
+
else
|
60
|
+
assets[type] << ass
|
61
|
+
end
|
62
|
+
else
|
63
|
+
unless pub_dest
|
64
|
+
pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
|
65
|
+
FileUtils.mkdir_p(pub_dest)
|
66
|
+
end
|
67
|
+
if comp = ass[:compressed_path]
|
68
|
+
name = File.basename(comp)
|
69
|
+
unless File.exist?(File.join(pub_dest, name))
|
70
|
+
File.cp(comp, pub_dest)
|
71
|
+
end
|
72
|
+
ass[:src] = Spider::HomeController.pub_url+'/'+COMPILED_FOLDER+'/'+name
|
73
|
+
assets[type] << ass
|
74
|
+
else
|
75
|
+
name = ass[:compress] || cname
|
76
|
+
unless compress_assets[type][name]
|
77
|
+
cpr = {:name => name, :assets => [], :cpr => true}
|
78
|
+
assets[type] << cpr
|
79
|
+
compress_assets[type][name] = cpr
|
80
|
+
end
|
81
|
+
compress_assets[type][name][:assets] << ass
|
82
|
+
end
|
37
83
|
end
|
38
|
-
|
39
|
-
|
40
|
-
seen[res[:src]] = true
|
41
|
-
@template_assets[res[:type].to_sym] ||= []
|
42
|
-
@template_assets[res[:type].to_sym] << res[:src]
|
43
|
-
js << res if Spider.conf.get('javascript.compress') && res[:type].to_sym == :js
|
44
|
-
css << res if Spider.conf.get('css.compress') && res[:type].to_sym == :css
|
45
|
-
if res[:gettext] && res[:type].to_sym == :js
|
46
|
-
msg_path = asset_gettext_messages_file(res[:path])
|
84
|
+
if ass[:gettext] && type == :js
|
85
|
+
msg_path = asset_gettext_messages_file(ass[:path])
|
47
86
|
js_messages += JSON.parse(File.read(msg_path))
|
48
87
|
end
|
49
88
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
Spider::HomeController.pub_url+'/'+COMPILED_FOLDER+'/'+
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
@template_assets[:css] = combined.map{ |c|
|
59
|
-
Spider::HomeController.pub_url+'/'+COMPILED_FOLDER+'/'+c
|
60
|
-
}
|
89
|
+
assets[:js].each do |ass|
|
90
|
+
if ass[:cpr]
|
91
|
+
compressed = compress_javascript(ass)
|
92
|
+
@template_assets[:js] << Spider::HomeController.pub_url+'/'+COMPILED_FOLDER+'/'+compressed
|
93
|
+
else
|
94
|
+
ass[:src] = ass[:cdn] if ass[:cdn] && use_cdn
|
95
|
+
@template_assets[:js] << ass[:src]
|
96
|
+
end
|
61
97
|
end
|
62
|
-
|
63
|
-
if
|
64
|
-
|
98
|
+
assets[:css].each do |ass|
|
99
|
+
if ass[:cpr]
|
100
|
+
compressed = compress_css(ass)
|
101
|
+
@template_assets[:css] << Spider::HomeController.pub_url+'/'+COMPILED_FOLDER+'/'+compressed
|
65
102
|
else
|
66
|
-
|
103
|
+
ass[:src] = ass[:cdn] if ass[:cdn] && use_cdn
|
104
|
+
is_dyn = ass[:if_ie_lte] || ass[:media]
|
105
|
+
@template_assets[:css] << (is_dyn ? ass : ass[:src])
|
67
106
|
end
|
68
107
|
end
|
108
|
+
|
69
109
|
@content[:yield_to] = @template
|
70
110
|
@scene.assets = @template_assets
|
71
111
|
@scene.extend(LayoutScene)
|
@@ -95,7 +135,14 @@ module Spider
|
|
95
135
|
end
|
96
136
|
|
97
137
|
def all_assets
|
98
|
-
|
138
|
+
assets = @template.assets + self.assets
|
139
|
+
if @only_asset_profiles
|
140
|
+
assets = assets.select{ |ass| ass[:profiles] && !(ass[:profiles] & @only_asset_profiles).empty? }
|
141
|
+
end
|
142
|
+
if @no_asset_profiles
|
143
|
+
assets = assets.select{ |ass| !ass[:profiles] || (ass[:profiles] & @no_asset_profiles).empty? }
|
144
|
+
end
|
145
|
+
assets
|
99
146
|
end
|
100
147
|
|
101
148
|
COMPILED_FOLDER = '_c'
|
@@ -106,188 +153,155 @@ module Spider
|
|
106
153
|
File.join(dir, "#{name}.i18n.json")
|
107
154
|
end
|
108
155
|
|
109
|
-
def compress_javascript(
|
156
|
+
def compress_javascript(cpr)
|
110
157
|
require 'yui/compressor'
|
111
|
-
res = []
|
112
|
-
compress = {}
|
113
|
-
compressed = []
|
114
|
-
cname = File.basename(@path, '.layout.shtml')
|
115
|
-
cname += "-#{@asset_set}" if @asset_set
|
116
|
-
assets.each do |ass|
|
117
|
-
if ass[:compressed]
|
118
|
-
compressed << ass[:compressed_path]
|
119
|
-
else
|
120
|
-
name = ass[:compress] || cname
|
121
|
-
compress[name] ||= []
|
122
|
-
compress[name] << ass
|
123
|
-
end
|
124
|
-
end
|
125
|
-
pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
|
126
|
-
FileUtils.mkdir_p(pub_dest)
|
127
158
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
159
|
+
pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
|
160
|
+
name = cpr[:name]
|
161
|
+
|
162
|
+
already_compressed = Dir.glob(pub_dest+'/'+name+'.*.js')
|
163
|
+
unless already_compressed.empty?
|
164
|
+
return File.basename(already_compressed.first)
|
165
|
+
end
|
166
|
+
|
167
|
+
tmp_combined = Spider.paths[:tmp]+'/_'+name+'.js'
|
168
|
+
File.open(tmp_combined, 'w') do |f|
|
169
|
+
cpr[:assets].each.each do |a|
|
170
|
+
f.write IO.read(a[:path])+"\n"
|
134
171
|
end
|
172
|
+
end
|
135
173
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
curr.each do |f|
|
146
|
-
name = File.basename(f)
|
147
|
-
if name =~ /(\d+)\.js$/
|
148
|
-
version = $1.to_i if $1.to_i > version
|
149
|
-
File.unlink(f)
|
150
|
-
end
|
174
|
+
|
175
|
+
version = 0
|
176
|
+
curr = Dir.glob(pub_dest+"/._#{name}.*.js")
|
177
|
+
unless curr.empty?
|
178
|
+
curr.each do |f|
|
179
|
+
name = File.basename(f)
|
180
|
+
if name =~ /(\d+)\.js$/
|
181
|
+
version = $1.to_i if $1.to_i > version
|
182
|
+
File.unlink(f)
|
151
183
|
end
|
152
184
|
end
|
153
|
-
|
154
|
-
|
155
|
-
|
185
|
+
end
|
186
|
+
version += 1
|
187
|
+
compiled_name = "#{name}.#{version}.js"
|
188
|
+
combined = "#{pub_dest}/._#{compiled_name}"
|
156
189
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
end
|
166
|
-
res << compiled_name
|
190
|
+
dest = "#{pub_dest}/#{compiled_name}"
|
191
|
+
File.cp(tmp_combined, combined)
|
192
|
+
File.unlink(tmp_combined)
|
193
|
+
compressor = YUI::JavaScriptCompressor.new("charset" => "UTF-8")
|
194
|
+
io = open(combined, 'r')
|
195
|
+
cjs = compressor.compress(io)
|
196
|
+
open(dest, 'w') do |f|
|
197
|
+
f << cjs
|
167
198
|
end
|
199
|
+
return compiled_name
|
168
200
|
|
169
|
-
compressed.uniq.each do |comp|
|
170
|
-
name = File.basename(comp)
|
171
|
-
unless File.exist?("#{pub_dest}/#{name}")
|
172
|
-
File.cp(comp, pub_dest)
|
173
|
-
end
|
174
|
-
res << name
|
175
|
-
end
|
176
|
-
res
|
177
201
|
end
|
178
202
|
|
179
|
-
def compress_css(
|
180
|
-
|
181
|
-
combine = {}
|
182
|
-
cname = File.basename(@path, '.layout.shtml')
|
183
|
-
cname += "-#{@asset_set}" if @asset_set
|
184
|
-
assets.each do |ass|
|
185
|
-
name = ass[:combine] || cname
|
186
|
-
combine[name] ||= []
|
187
|
-
combine[name] << ass
|
188
|
-
end
|
203
|
+
def compress_css(cpr)
|
204
|
+
|
189
205
|
pub_dest = Spider::HomeController.pub_path+'/'+COMPILED_FOLDER
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
206
|
+
name = cpr[:name]
|
207
|
+
|
208
|
+
already_compressed = Dir.glob(pub_dest+'/'+name+'.*.css')
|
209
|
+
unless already_compressed.empty?
|
210
|
+
return File.basename(already_compressed.first)
|
211
|
+
end
|
212
|
+
|
213
|
+
tmp_combined = Spider.paths[:tmp]+'/_'+name+'.css'
|
198
214
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
215
|
+
File.open(tmp_combined, 'w') do |f|
|
216
|
+
cpr[:assets].each do |a|
|
217
|
+
path = a[:path]
|
218
|
+
src_dir = File.dirname(path)
|
219
|
+
app = a[:app]
|
220
|
+
if app
|
221
|
+
app_relative_path = a[:app].relative_path
|
222
|
+
app_path = app.path
|
223
|
+
elsif path.index(Spider::SpiderController.pub_path) == 0
|
224
|
+
app_relative_path = 'spider'
|
225
|
+
app_path = Spider::SpiderController.pub_path
|
226
|
+
end
|
211
227
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
228
|
+
pub_app = "#{pub_dest}/#{app_relative_path}"
|
229
|
+
FileUtils.mkdir_p(pub_app)
|
230
|
+
src_files = Spider::ContentUtils.resolve_css_includes(path)
|
231
|
+
src = ""
|
232
|
+
src_files.each do |src_file|
|
233
|
+
src += IO.read(src_file)+"\n"
|
234
|
+
end
|
235
|
+
src.gsub!(/^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]*))?\1\)?(?:[^?;]*);?/i, "")
|
220
236
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
+
src.scan(/url\([\s"']*([^\)"'\s]*)[\s"']*\)/m).uniq.collect do |url|
|
238
|
+
url = url.first
|
239
|
+
next if url =~ %r{^/} || url =~ %r{^[a-z]+://}
|
240
|
+
path = ""
|
241
|
+
url_dest = File.expand_path(File.join(pub_app, url))
|
242
|
+
url_src = File.expand_path(File.join(src_dir, url))
|
243
|
+
unless url_src.index(app_path) == 0
|
244
|
+
raise "Can't combine CSS if paths go outside app: #{url} in #{path}"
|
245
|
+
end
|
246
|
+
FileUtils.mkdir_p(File.dirname(url_dest))
|
247
|
+
cachebuster = Spider.conf.get('css.cachebuster')
|
248
|
+
new_url = "#{app_relative_path}/#{url}"
|
249
|
+
if File.exist?(url_src)
|
250
|
+
mtime = File.mtime(url_src).to_i
|
251
|
+
if cachebuster && File.exist?(url_dest) && mtime > File.mtime(url_dest).to_i
|
252
|
+
if cachebuster == :soft
|
253
|
+
File.cp(url_src, url_dest)
|
254
|
+
new_url += "?cb=#{mtime}"
|
255
|
+
elsif cachebuster == :hard || cachebuster == :hardcopy
|
256
|
+
url_dir = File.dirname(url)
|
257
|
+
url_ext = File.extname(url)
|
258
|
+
url_basename = File.basename(url, url_ext)
|
259
|
+
url_dest_dir = File.dirname(url_dest)
|
260
|
+
cb_file_name = "#{url_basename}-cb#{mtime}#{url_ext}"
|
261
|
+
new_url = "#{url_dir}/#{cb_file_name}"
|
262
|
+
if cachebuster == :hard
|
237
263
|
File.cp(url_src, url_dest)
|
238
|
-
|
239
|
-
|
240
|
-
url_dir = File.dirname(url)
|
241
|
-
url_ext = File.extname(url)
|
242
|
-
url_basename = File.basename(url, url_ext)
|
243
|
-
url_dest_dir = File.dirname(url_dest)
|
244
|
-
cb_file_name = "#{url_basename}-cb#{mtime}#{url_ext}"
|
245
|
-
new_url = "#{url_dir}/#{cb_file_name}"
|
246
|
-
if cachebuster == :hard
|
247
|
-
File.cp(url_src, url_dest)
|
248
|
-
else
|
249
|
-
File.cp(url_src, "#{url_dest_dir}/#{cb_file_name}")
|
250
|
-
end
|
264
|
+
else
|
265
|
+
File.cp(url_src, "#{url_dest_dir}/#{cb_file_name}")
|
251
266
|
end
|
252
|
-
else
|
253
|
-
File.cp(url_src, url_dest)
|
254
267
|
end
|
255
268
|
else
|
256
|
-
|
269
|
+
File.cp(url_src, url_dest)
|
257
270
|
end
|
258
|
-
|
271
|
+
else
|
272
|
+
Spider.logger.error("CSS referenced file not found: #{url_src}")
|
259
273
|
end
|
260
|
-
|
274
|
+
src.gsub!(/\([\s"']*#{url}[\s"']*\)/m, "(#{new_url})")
|
261
275
|
end
|
276
|
+
f.write(src+"\n")
|
262
277
|
end
|
278
|
+
end
|
263
279
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
end
|
280
|
+
version = 0
|
281
|
+
curr = Dir.glob(pub_dest+"/._#{name}.*.css")
|
282
|
+
unless curr.empty?
|
283
|
+
curr.each do |f|
|
284
|
+
currname = File.basename(f)
|
285
|
+
if currname =~ /(\d+)\.js$/
|
286
|
+
version = $1.to_i if $1.to_i > version
|
287
|
+
File.unlink(f)
|
273
288
|
end
|
274
289
|
end
|
275
|
-
|
276
|
-
|
277
|
-
|
290
|
+
end
|
291
|
+
version += 1
|
292
|
+
compiled_name = "#{name}.#{version}.css"
|
293
|
+
combined = "#{pub_dest}/._#{compiled_name}"
|
278
294
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
end
|
288
|
-
res << compiled_name
|
295
|
+
dest = "#{pub_dest}/#{compiled_name}"
|
296
|
+
File.cp(tmp_combined, combined)
|
297
|
+
File.unlink(tmp_combined)
|
298
|
+
compressor = YUI::CssCompressor.new("charset" => "UTF-8")
|
299
|
+
io = open(combined, 'r')
|
300
|
+
cjs = compressor.compress(io)
|
301
|
+
open(dest, 'w') do |f|
|
302
|
+
f << cjs
|
289
303
|
end
|
290
|
-
|
304
|
+
return compiled_name
|
291
305
|
end
|
292
306
|
|
293
307
|
end
|
@@ -296,6 +310,7 @@ module Spider
|
|
296
310
|
|
297
311
|
def output_assets(type=nil)
|
298
312
|
types = type ? [type] : self.assets.keys
|
313
|
+
use_cdn = Spider.conf.get('assets.use_cdn')
|
299
314
|
if types.include?(:js)
|
300
315
|
self.assets[:js].each do |ass|
|
301
316
|
ass = {:src => ass} if ass.is_a?(String)
|
@@ -305,7 +320,7 @@ module Spider
|
|
305
320
|
if types.include?(:css)
|
306
321
|
self.assets[:css].each do |ass|
|
307
322
|
ass = {:src => ass} if ass.is_a?(String)
|
308
|
-
link = "<link rel=\"stylesheet\" href=\"#{ass[:src]}\""
|
323
|
+
link = "<link rel=\"stylesheet\" type=\"text/css\" href=\"#{ass[:src]}\""
|
309
324
|
link += " media=\"#{ass[:media]}\"" if ass[:media]
|
310
325
|
link += ">\n"
|
311
326
|
if ass[:if_ie_lte]
|
@@ -318,4 +333,5 @@ module Spider
|
|
318
333
|
|
319
334
|
end
|
320
335
|
|
321
|
-
|
336
|
+
|
337
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'hpricot'
|
2
|
+
require 'spiderfw/patches/hpricot'
|
2
3
|
require 'spiderfw/templates/template_blocks'
|
3
4
|
require 'spiderfw/cache/template_cache'
|
4
5
|
begin
|
@@ -27,6 +28,7 @@ module Spider
|
|
27
28
|
attr_accessor :assets
|
28
29
|
attr_accessor :runtime_overrides
|
29
30
|
attr_reader :overrides, :path, :subtemplates, :widgets
|
31
|
+
attr_accessor :asset_profiles
|
30
32
|
|
31
33
|
@@registered = {}
|
32
34
|
@@widget_plugins = {}
|
@@ -331,7 +333,7 @@ module Spider
|
|
331
333
|
wt.load
|
332
334
|
# sub_c = sub.compile(options.merge({:mode => :widget}))
|
333
335
|
@assets = wt.compiled.assets + @assets
|
334
|
-
end
|
336
|
+
end
|
335
337
|
|
336
338
|
seen = {}
|
337
339
|
# @assets.each_index do |i|
|
@@ -339,6 +341,7 @@ module Spider
|
|
339
341
|
# if ass[:name]
|
340
342
|
# end
|
341
343
|
@assets.each do |ass|
|
344
|
+
ass[:profiles] = ((ass[:profiles] || []) + @asset_profiles).uniq if @asset_profiles
|
342
345
|
next if seen[ass.inspect]
|
343
346
|
res_init += "@assets << #{ass.inspect}\n"
|
344
347
|
# res_init += "@assets << {
|
@@ -364,6 +367,9 @@ module Spider
|
|
364
367
|
if attributes[:name]
|
365
368
|
named = Spider::Template.get_named_asset(attributes[:name])
|
366
369
|
raise "Can't find named asset #{attributes[:name]}" unless named
|
370
|
+
if attributes[:profiles]
|
371
|
+
named.each{ |nmdass| nmdass[:profiles] = attributes[:profiles] }
|
372
|
+
end
|
367
373
|
return named.map{ |nmdass|
|
368
374
|
parse_asset(nmdass[:type], nmdass[:src], nmdass)
|
369
375
|
}.flatten
|
@@ -391,7 +397,7 @@ module Spider
|
|
391
397
|
ass[:path] = res.path if res
|
392
398
|
base_url = nil
|
393
399
|
if controller.respond_to?(:pub_url)
|
394
|
-
if src[0].chr == '/'
|
400
|
+
if src[0].chr == '/' && !(controller <= Spider::HomeController)
|
395
401
|
# strips the app path from the src. FIXME: should probably be done somewhere else
|
396
402
|
src = src[(2+controller.app.relative_path.length)..-1]
|
397
403
|
end
|
@@ -406,17 +412,17 @@ module Spider
|
|
406
412
|
processor = TemplateAssets.const_get(ass_info[:processor])
|
407
413
|
ass = processor.process(ass)
|
408
414
|
end
|
409
|
-
if attributes['sp:if']
|
410
|
-
ass[:if] = Spider::TemplateBlocks::Block.vars_to_scene(attributes['sp:if']).gsub("'", "\\'")
|
411
|
-
end
|
412
415
|
if attributes[:compressed]
|
413
416
|
compressed_res = Spider.find_resource(type.to_sym, attributes[:compressed], @path, [owner_class, @definer_class])
|
414
417
|
ass[:compressed_path] = compressed_res.path
|
415
418
|
ass[:compressed] = base_url+attributes[:compressed]
|
416
419
|
end
|
417
|
-
[:gettext, :media, :if_ie_lte].each do |key|
|
420
|
+
[:gettext, :media, :if_ie_lte, :cdn].each do |key|
|
418
421
|
ass[key] = attributes[key] if attributes.key?(key)
|
419
422
|
end
|
423
|
+
if attributes[:profiles]
|
424
|
+
ass[:profiles] = attributes[:profiles].split(/,\s*/).map{ |p| p.to_sym }
|
425
|
+
end
|
420
426
|
return [ass]
|
421
427
|
end
|
422
428
|
|
@@ -685,10 +691,11 @@ module Spider
|
|
685
691
|
end
|
686
692
|
|
687
693
|
|
688
|
-
def load_subtemplate(id) # :nodoc:
|
694
|
+
def load_subtemplate(id, options={}) # :nodoc:
|
689
695
|
load unless loaded?
|
690
696
|
return nil unless @compiled.subtemplates[id]
|
691
697
|
t = Template.new
|
698
|
+
t.asset_profiles = options[:asset_profiles] if options[:asset_profiles]
|
692
699
|
t.compiled = @compiled.subtemplates[id]
|
693
700
|
return t
|
694
701
|
end
|
@@ -769,29 +776,7 @@ module Spider
|
|
769
776
|
end
|
770
777
|
end
|
771
778
|
|
772
|
-
|
773
|
-
def conditional_assets
|
774
|
-
res = []
|
775
|
-
@assets.each do |ass|
|
776
|
-
# FIXME: is this the best place to check if? Maybe it's better to do it when printing resources?
|
777
|
-
res << ass unless ass[:if] && !ass[:if].empty? && !@scene.instance_eval(ass[:if])
|
778
|
-
end
|
779
|
-
return res
|
780
|
-
end
|
781
|
-
|
782
|
-
# # Assets for the template and contained widgets.
|
783
|
-
# def all_assets
|
784
|
-
# res = []
|
785
|
-
# seen = {}
|
786
|
-
# @widgets.each do |id, w|
|
787
|
-
# # next if seen[w.class]
|
788
|
-
# seen[w.class] = true
|
789
|
-
# res += w.assets
|
790
|
-
# end
|
791
|
-
# res += assets
|
792
|
-
# return res
|
793
|
-
# end
|
794
|
-
|
779
|
+
|
795
780
|
def with_widget(path, &proc)
|
796
781
|
first, rest = path.split('/', 2)
|
797
782
|
@widget_procs[first.to_sym] ||= []
|
data/spider.gemspec
CHANGED
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.add_dependency("macaddr", [">= 1.0.0"])
|
42
42
|
s.add_development_dependency("rake", ["> 0.7.3"])
|
43
43
|
s.add_development_dependency("ruby-debug", ["> 0.9.3"])
|
44
|
-
s.requirements << "Optional dependencies: json, openssl, sqlite3, webrick, mongrel, ruby-oci8 >2.0, mysql, yui-compressor, home_run"
|
44
|
+
s.requirements << "Optional dependencies: json, openssl, sqlite3, webrick, mongrel, ruby-oci8 >2.0, mysql, yui-compressor, home_run, cldr"
|
45
45
|
# optional dependencies
|
46
46
|
#
|
47
47
|
end
|
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: 41
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 5
|
9
|
-
-
|
10
|
-
version: 0.5.
|
9
|
+
- 17
|
10
|
+
version: 0.5.17
|
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: 2010-12-
|
18
|
+
date: 2010-12-20 00:00:00 +01:00
|
19
19
|
default_executable: spider
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -1029,6 +1029,7 @@ files:
|
|
1029
1029
|
- lib/spiderfw/model/sync.rb
|
1030
1030
|
- lib/spiderfw/model/type.rb
|
1031
1031
|
- lib/spiderfw/model/unit_of_work.rb
|
1032
|
+
- lib/spiderfw/patches/hpricot.rb
|
1032
1033
|
- lib/spiderfw/requires.rb
|
1033
1034
|
- lib/spiderfw/resource.rb
|
1034
1035
|
- lib/spiderfw/setup/app_manager.rb
|
@@ -1127,7 +1128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1127
1128
|
- 0
|
1128
1129
|
version: "0"
|
1129
1130
|
requirements:
|
1130
|
-
- "Optional dependencies: json, openssl, sqlite3, webrick, mongrel, ruby-oci8 >2.0, mysql, yui-compressor, home_run"
|
1131
|
+
- "Optional dependencies: json, openssl, sqlite3, webrick, mongrel, ruby-oci8 >2.0, mysql, yui-compressor, home_run, cldr"
|
1131
1132
|
rubyforge_project:
|
1132
1133
|
rubygems_version: 1.3.7
|
1133
1134
|
signing_key:
|