spiderfw 0.5.16 → 0.5.17
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 +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:
|