volt 0.9.4 → 0.9.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/Gemfile +3 -1
- data/lib/volt/cli/asset_compile.rb +8 -9
- data/lib/volt/extra_core/object.rb +3 -1
- data/lib/volt/models/associations.rb +9 -6
- data/lib/volt/models/buffer.rb +3 -0
- data/lib/volt/models/field_helpers.rb +38 -21
- data/lib/volt/models/model.rb +1 -1
- data/lib/volt/models/permissions.rb +2 -2
- data/lib/volt/models/validations/validations.rb +5 -1
- data/lib/volt/models/validators/numericality_validator.rb +6 -2
- data/lib/volt/page/bindings/each_binding.rb +7 -0
- data/lib/volt/page/bindings/view_binding.rb +22 -20
- data/lib/volt/server/component_templates.rb +21 -7
- data/lib/volt/server/message_bus/message_encoder.rb +4 -0
- data/lib/volt/server/message_bus/peer_to_peer/peer_connection.rb +1 -1
- data/lib/volt/server/middleware/default_middleware_stack.rb +1 -5
- data/lib/volt/server/rack/asset_files.rb +59 -13
- data/lib/volt/server/rack/component_code.rb +1 -7
- data/lib/volt/server/rack/index_files.rb +12 -4
- data/lib/volt/server/rack/opal_files.rb +29 -7
- data/lib/volt/server/template_handlers/sprockets_component_handler.rb +163 -0
- data/lib/volt/server.rb +2 -3
- data/lib/volt/utils/generic_pool.rb +1 -1
- data/lib/volt/version.rb +1 -1
- data/lib/volt/volt/app.rb +1 -1
- data/lib/volt.rb +6 -1
- data/spec/apps/kitchen_sink/config/base/index.html +3 -7
- data/spec/integration/bindings_spec.rb +1 -0
- data/spec/models/associations_spec.rb +18 -0
- data/spec/models/buffer_spec.rb +12 -0
- data/spec/server/rack/asset_files_spec.rb +35 -25
- data/templates/project/config/base/index.html +2 -7
- data/volt.gemspec +5 -5
- metadata +13 -28
- data/lib/volt/server/component_handler.rb +0 -42
- data/lib/volt/server/template_handlers/handlers.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a75b8e5c26d8b7a65f1db6e74aa3a439409b9dd
|
4
|
+
data.tar.gz: d672f1462c31eb1dfc1cc757019445290648ba96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9462ea295ea9bf43b4e5acdebec5fd6962451a68c2cb656316b0cca67f259f85442df3c1d9ecb7175f8ecbbf9a5402032c552479b5e0164f2e15414c75abf07
|
7
|
+
data.tar.gz: 78804d64f6f96755c02cf27b980e4a831a5cd86fb43679d5dacea621381f0c848a3960510fea4e6da39f0392aec60a85b81652feb5781b285fe81fc59e636624
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## 0.9.
|
3
|
+
## 0.9.5
|
4
|
+
### Added
|
5
|
+
- You can now disable auto-import of JS/CSS with ```disable_auto_import``` in a dependencies.rb file
|
6
|
+
|
7
|
+
## 0.9.4
|
4
8
|
### Lingo Change
|
5
9
|
the base collections will now be called "Repositories" or "Repo's" for short. This will only matter directly for internal volt code, but for the data provider api, this will help.
|
6
10
|
|
data/Gemfile
CHANGED
@@ -10,8 +10,10 @@ gem 'volt-mongo'
|
|
10
10
|
gem 'rbnacl', require: false
|
11
11
|
gem 'rbnacl-libsodium', require: false
|
12
12
|
|
13
|
+
# temp until 0.8.0 of opal
|
14
|
+
# gem 'opal-rspec', github: 'opal/opal-rspec'
|
13
15
|
|
14
|
-
group :development do
|
16
|
+
group :development, :test do
|
15
17
|
# For testing the kitchen sink app
|
16
18
|
# Twitter bootstrap
|
17
19
|
gem 'volt-bootstrap'
|
@@ -18,6 +18,7 @@ module Volt
|
|
18
18
|
require 'volt'
|
19
19
|
require 'volt/volt/core'
|
20
20
|
require 'volt/boot'
|
21
|
+
require 'volt/server'
|
21
22
|
|
22
23
|
@root_path ||= Dir.pwd
|
23
24
|
Volt.root = @root_path
|
@@ -26,7 +27,6 @@ module Volt
|
|
26
27
|
|
27
28
|
require 'volt/server/rack/component_paths'
|
28
29
|
require 'volt/server/rack/component_code'
|
29
|
-
require 'volt/server/component_handler'
|
30
30
|
|
31
31
|
@app_path = File.expand_path(File.join(@root_path, 'app'))
|
32
32
|
|
@@ -34,7 +34,6 @@ module Volt
|
|
34
34
|
@app = Rack::Builder.new
|
35
35
|
@opal_files = OpalFiles.new(@app, @app_path, @component_paths)
|
36
36
|
@index_files = IndexFiles.new(@app, volt_app, @component_paths, @opal_files)
|
37
|
-
@component_handler = ComponentHandler.new(@component_paths)
|
38
37
|
|
39
38
|
puts 'Compile Opal for components'
|
40
39
|
write_component_js
|
@@ -49,10 +48,13 @@ module Volt
|
|
49
48
|
end
|
50
49
|
|
51
50
|
def logical_paths_and_full_paths
|
52
|
-
@opal_files.environment
|
53
|
-
|
51
|
+
env = @opal_files.environment
|
52
|
+
env.each_file do |full_path|
|
53
|
+
# logical_path = env[full_path].logical_path
|
54
|
+
# logical_path = @opal_files.environment.send(:logical_path_for_filename, full_path, []).to_s
|
55
|
+
# puts "FULL PATH: #{full_path.inspect} -- #{logical_path}"
|
54
56
|
|
55
|
-
yield(logical_path, full_path.to_s)
|
57
|
+
# yield(logical_path, full_path.to_s)
|
56
58
|
end
|
57
59
|
|
58
60
|
end
|
@@ -94,10 +96,7 @@ module Volt
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def write_component_js
|
97
|
-
|
98
|
-
|
99
|
-
path = File.join(Volt.root, '/public/components/main.js')
|
100
|
-
write_file(path, javascript_code)
|
99
|
+
write_sprocket_file('components/main.js')
|
101
100
|
end
|
102
101
|
|
103
102
|
def write_index
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'volt/utils/ejson'
|
2
|
+
|
1
3
|
class Object
|
2
4
|
# Setup a default pretty_inspect
|
3
5
|
# alias_method :pretty_inspect, :inspect
|
@@ -13,7 +15,7 @@ class Object
|
|
13
15
|
# TODO: Need a real implementation of this
|
14
16
|
def deep_clone
|
15
17
|
if RUBY_PLATFORM == 'opal'
|
16
|
-
|
18
|
+
Volt::EJSON.parse(Volt::EJSON.stringify(self))
|
17
19
|
else
|
18
20
|
Marshal.load(Marshal.dump(self))
|
19
21
|
end
|
@@ -1,19 +1,22 @@
|
|
1
1
|
module Volt
|
2
2
|
module Associations
|
3
3
|
module ClassMethods
|
4
|
-
def belongs_to(method_name,
|
5
|
-
|
4
|
+
def belongs_to(method_name, options = {})
|
5
|
+
collection ||= options.fetch(:collection, method_name)
|
6
|
+
foreign_key ||= options.fetch(:foreign_key, :id)
|
7
|
+
local_key ||= options.fetch(:local_key, "#{method_name}_id")
|
8
|
+
|
6
9
|
# Add a field for the association_id
|
7
|
-
field(
|
10
|
+
field(local_key)
|
8
11
|
|
9
12
|
# getter
|
10
13
|
define_method(method_name) do
|
11
14
|
association_with_root_model('belongs_to') do |root|
|
12
15
|
# Lookup the associated model id
|
13
|
-
lookup_key = get(
|
16
|
+
lookup_key = get(local_key)
|
14
17
|
|
15
18
|
# Return a promise for the belongs_to
|
16
|
-
root.get(
|
19
|
+
root.get(collection.pluralize).where(foreign_key => lookup_key).first
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
@@ -21,7 +24,7 @@ module Volt
|
|
21
24
|
id = obj.is_a?(Fixnum) ? obj : obj.id
|
22
25
|
|
23
26
|
# Assign the current model's something_id to the object's id
|
24
|
-
set(
|
27
|
+
set(local_key, id)
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
data/lib/volt/models/buffer.rb
CHANGED
@@ -2,16 +2,48 @@
|
|
2
2
|
module FieldHelpers
|
3
3
|
class InvalidFieldClass < RuntimeError; end
|
4
4
|
|
5
|
+
NUMERIC_CAST = lambda do |convert_method, val|
|
6
|
+
begin
|
7
|
+
orig = val
|
8
|
+
val = send(convert_method, val)
|
9
|
+
|
10
|
+
if RUBY_PLATFORM == 'opal'
|
11
|
+
# Opal has a bug in 0.7.2 that gives us back NaN without an
|
12
|
+
# error sometimes.
|
13
|
+
val = orig if val.nan?
|
14
|
+
end
|
15
|
+
rescue TypeError, ArgumentError => e
|
16
|
+
# ignore, unmatched types will be caught below.
|
17
|
+
val = orig
|
18
|
+
end
|
19
|
+
|
20
|
+
return val
|
21
|
+
end
|
22
|
+
|
23
|
+
FIELD_CASTS = {
|
24
|
+
String => :to_s.to_proc,
|
25
|
+
Fixnum => lambda {|val| NUMERIC_CAST[:Integer, val] },
|
26
|
+
Numeric => lambda {|val| NUMERIC_CAST[:Float, val] },
|
27
|
+
Float => lambda {|val| NUMERIC_CAST[:Float, val] },
|
28
|
+
Time => nil,
|
29
|
+
TrueClass => nil,
|
30
|
+
FalseClass => nil
|
31
|
+
}
|
32
|
+
VALID_FIELD_CLASSES = FIELD_CASTS.keys
|
33
|
+
|
34
|
+
|
5
35
|
module ClassMethods
|
6
36
|
# field lets you declare your fields instead of using the underscore syntax.
|
7
37
|
# An optional class restriction can be passed in.
|
8
|
-
def field(name, klass = nil)
|
9
|
-
if klass && !
|
10
|
-
|
38
|
+
def field(name, klass = nil, auto_cast = true)
|
39
|
+
if klass && !VALID_FIELD_CLASSES.include?(klass)
|
40
|
+
klass_names = VALID_FIELD_CLASSES.map(&:to_s).join(', ')
|
41
|
+
msg = "valid field types is currently limited to #{klass_names}"
|
42
|
+
fail FieldHelpers::InvalidFieldClass, msg
|
11
43
|
end
|
12
44
|
|
13
45
|
if klass
|
14
|
-
|
46
|
+
# Add type validation, execpt for String, since anything can be a string.
|
15
47
|
unless klass == String
|
16
48
|
validate name, type: klass
|
17
49
|
end
|
@@ -25,23 +57,8 @@ module FieldHelpers
|
|
25
57
|
# Check if the value assigned matches the class restriction
|
26
58
|
if klass
|
27
59
|
# Cast to the right type
|
28
|
-
if
|
29
|
-
val = val
|
30
|
-
elsif klass == Numeric
|
31
|
-
begin
|
32
|
-
orig = val
|
33
|
-
unless val.is_a?(Numeric)
|
34
|
-
val = Float(val)
|
35
|
-
end
|
36
|
-
|
37
|
-
if RUBY_PLATFORM == 'opal'
|
38
|
-
# Opal has a bug in 0.7.2 that gives us back NaN without an
|
39
|
-
# error sometimes.
|
40
|
-
val = orig if val.nan?
|
41
|
-
end
|
42
|
-
rescue TypeError, ArgumentError => e
|
43
|
-
# ignore, unmatched types will be caught below.
|
44
|
-
end
|
60
|
+
if (func = FIELD_CASTS[klass])
|
61
|
+
val = func[val]
|
45
62
|
end
|
46
63
|
end
|
47
64
|
|
data/lib/volt/models/model.rb
CHANGED
@@ -18,8 +18,8 @@ module Volt
|
|
18
18
|
end # When the model is created, assign it the user_id (if the user is logged in)
|
19
19
|
on(:new) do
|
20
20
|
# Only assign the user_id if there isn't already one and the user is logged in.
|
21
|
-
if
|
22
|
-
|
21
|
+
if get(:user_id).nil? && !(user_id = Volt.current_user_id).nil?
|
22
|
+
set(key, user_id)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -127,7 +127,11 @@ module Volt
|
|
127
127
|
def validate!
|
128
128
|
errors.clear
|
129
129
|
|
130
|
-
|
130
|
+
# Run the before_validate callbacks
|
131
|
+
run_callbacks(:before_validate).then do
|
132
|
+
# Run the actual validations
|
133
|
+
run_validations
|
134
|
+
end.then do
|
131
135
|
# See if any server errors are in place and merge them in if they are
|
132
136
|
errors.merge!(server_errors.to_h) if Volt.client?
|
133
137
|
end.then do
|
@@ -17,8 +17,12 @@ module Volt
|
|
17
17
|
# Convert to float if it is a string for a float
|
18
18
|
# The nil check and the nan? check are only require for opal 0.6
|
19
19
|
unless @value.nil?
|
20
|
-
|
21
|
-
|
20
|
+
begin
|
21
|
+
@value = Kernel.Float(@value)
|
22
|
+
rescue ArgumentError => e
|
23
|
+
@value = nil
|
24
|
+
end
|
25
|
+
# @value = nil if RUBY_PLATFORM == 'opal' && @value.nan?
|
22
26
|
end
|
23
27
|
|
24
28
|
check_errors
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'volt/page/bindings/base_binding'
|
2
2
|
|
3
3
|
module Volt
|
4
|
+
class InvalidObjectForEachBinding < Exception ; end
|
5
|
+
|
4
6
|
class EachBinding < BaseBinding
|
5
7
|
def initialize(volt_app, target, context, binding_name, getter, variable_name, index_name, template_name)
|
6
8
|
super(volt_app, target, context, binding_name)
|
@@ -57,6 +59,11 @@ module Volt
|
|
57
59
|
|
58
60
|
Volt.run_in_mode(:no_model_promises) do
|
59
61
|
templates_size = @templates.size
|
62
|
+
|
63
|
+
unless values.respond_to?(:size)
|
64
|
+
fail InvalidObjectForEachBinding, "Each binding's require an object that responds to size and [] methods. The binding received: #{values.inspect}"
|
65
|
+
end
|
66
|
+
|
60
67
|
values_size = values.size
|
61
68
|
end
|
62
69
|
|
@@ -69,26 +69,25 @@ module Volt
|
|
69
69
|
|
70
70
|
full_path, controller_path = @view_lookup.path_for_template(path, section)
|
71
71
|
|
72
|
-
|
72
|
+
if full_path
|
73
|
+
@starting_controller_handler, generated_new, chain_stopped = create_controller_handler(full_path, controller_path)
|
74
|
+
|
75
|
+
# Check if chain was stopped when the action ran
|
76
|
+
if chain_stopped
|
77
|
+
# An action stopped the chain. When this happens, we stop running here.
|
78
|
+
remove_starting_controller
|
79
|
+
else
|
80
|
+
# None of the actions stopped the chain
|
81
|
+
# Wait until the controller is loaded before we actually render.
|
82
|
+
@waiting_for_load = -> { @starting_controller_handler.controller.loaded? }.watch_until!(true) do
|
83
|
+
render_next_template(full_path, path)
|
84
|
+
end
|
85
|
+
|
86
|
+
queue_clear_grouped_controller
|
87
|
+
end
|
88
|
+
else
|
73
89
|
# if we don't have a full path, then we have a missing template
|
74
90
|
render_next_template(full_path, path)
|
75
|
-
return
|
76
|
-
end
|
77
|
-
|
78
|
-
@starting_controller_handler, generated_new, chain_stopped = create_controller_handler(full_path, controller_path)
|
79
|
-
|
80
|
-
# Check if chain was stopped when the action ran
|
81
|
-
if chain_stopped
|
82
|
-
# An action stopped the chain. When this happens, we stop running here.
|
83
|
-
remove_starting_controller
|
84
|
-
else
|
85
|
-
# None of the actions stopped the chain
|
86
|
-
# Wait until the controller is loaded before we actually render.
|
87
|
-
@waiting_for_load = -> { @starting_controller_handler.controller.loaded? }.watch_until!(true) do
|
88
|
-
render_next_template(full_path, path)
|
89
|
-
end
|
90
|
-
|
91
|
-
queue_clear_grouped_controller
|
92
91
|
end
|
93
92
|
end
|
94
93
|
end
|
@@ -155,8 +154,11 @@ module Volt
|
|
155
154
|
end
|
156
155
|
|
157
156
|
if @grouped_controller && @current_controller_handler
|
158
|
-
#
|
159
|
-
|
157
|
+
# We remove the controller after all of the current rendering is done.
|
158
|
+
Timers.next_tick do
|
159
|
+
# Remove a reference for the controller in the group.
|
160
|
+
@grouped_controller.remove(@current_controller_handler.controller.class)
|
161
|
+
end
|
160
162
|
end
|
161
163
|
|
162
164
|
@controller = nil
|
@@ -138,9 +138,10 @@ module Volt
|
|
138
138
|
explicit_controllers = Dir["#{controllers_path}*_controller.rb"].sort
|
139
139
|
|
140
140
|
controllers = (implicit_controllers + explicit_controllers).uniq
|
141
|
+
|
141
142
|
controllers.each do |path|
|
142
143
|
if File.exists?(path)
|
143
|
-
code <<
|
144
|
+
code << "require '#{localize_path(path)}'\n"
|
144
145
|
else
|
145
146
|
# parts = path.scan(/([^\/]+)\/controllers\/([^\/]+)_controller[.]rb$/)
|
146
147
|
# component, controller = parts[0]
|
@@ -159,9 +160,12 @@ module Volt
|
|
159
160
|
models_path = "#{@component_path}/models/"
|
160
161
|
|
161
162
|
Dir["#{models_path}*.rb"].sort.each do |model_path|
|
162
|
-
code << File.read(model_path) + "\n\n"
|
163
|
+
# code << File.read(model_path) + "\n\n"
|
163
164
|
|
164
|
-
model_name = model_path.match(/([^\/]+)[.]rb$/)[1]
|
165
|
+
# model_name = model_path.match(/([^\/]+)[.]rb$/)[1]
|
166
|
+
if File.exists?(model_path)
|
167
|
+
code << "require '#{localize_path(model_path)}'\n"
|
168
|
+
end
|
165
169
|
end
|
166
170
|
|
167
171
|
code
|
@@ -200,16 +204,26 @@ module Volt
|
|
200
204
|
end
|
201
205
|
|
202
206
|
def generate_initializers_code
|
207
|
+
# Include the root initializers
|
208
|
+
paths = Dir["#{Volt.root}/config/initializers/*.rb"]
|
209
|
+
paths += Dir["#{Volt.root}/config/initializers/client/*.rb"]
|
210
|
+
|
203
211
|
paths = Dir["#{@component_path}/config/initializers/*.rb"]
|
204
212
|
paths += Dir["#{@component_path}/config/initializers/client/*.rb"]
|
205
213
|
|
206
|
-
|
207
|
-
paths.map! {|path| @component_name + path[cpath_size..-1]}
|
208
|
-
|
209
|
-
code = "\n" + paths.map { |path| "require '#{path}'" }.join("\n")
|
214
|
+
code = "\n" + paths.map { |path| "require '#{localize_path(path)}'" }.join("\n")
|
210
215
|
|
211
216
|
code
|
212
217
|
end
|
213
218
|
|
219
|
+
private
|
220
|
+
|
221
|
+
# Takes a full path and returns the localized version so opal supprots it
|
222
|
+
def localize_path(path)
|
223
|
+
cpath_size = @component_path.size
|
224
|
+
return @component_name + path[cpath_size..-1]
|
225
|
+
end
|
226
|
+
|
227
|
+
|
214
228
|
end
|
215
229
|
end
|
@@ -32,6 +32,10 @@ module Volt
|
|
32
32
|
raise e
|
33
33
|
end
|
34
34
|
|
35
|
+
if Volt.config.app_secret.blank?
|
36
|
+
raise "No app_secret has been specified in Volt.config"
|
37
|
+
end
|
38
|
+
|
35
39
|
# use the first 32 chars of the app secret for the encryption key.
|
36
40
|
key = Base64.decode64(Volt.config.app_secret)[0..31]
|
37
41
|
|
@@ -96,7 +96,7 @@ module Volt
|
|
96
96
|
# @worker_thread.kill
|
97
97
|
|
98
98
|
# Wait for the worker to publish all messages
|
99
|
-
@worker_thread.join if Thread.current != @worker_thread
|
99
|
+
@worker_thread.join if Thread.current != @worker_thread && @worker_thread
|
100
100
|
|
101
101
|
@message_bus.remove_peer_connection(self)
|
102
102
|
end
|
@@ -39,13 +39,9 @@ module Volt
|
|
39
39
|
# Setup the middleware that we need to wait for components to boot before we
|
40
40
|
# can set them up.
|
41
41
|
def self.postboot_setup(volt_app, rack_app)
|
42
|
-
component_paths = volt_app.component_paths
|
43
|
-
rack_app.map '/components' do
|
44
|
-
run ComponentHandler.new(component_paths)
|
45
|
-
end
|
46
|
-
|
47
42
|
# Serve the opal files
|
48
43
|
opal_files = OpalFiles.new(rack_app, volt_app.app_path, volt_app.component_paths)
|
44
|
+
volt_app.opal_files = opal_files
|
49
45
|
volt_app.sprockets = opal_files.environment
|
50
46
|
|
51
47
|
# Serve the main html files from public, also figure out
|
@@ -10,7 +10,7 @@ module Volt
|
|
10
10
|
@included_components = {}
|
11
11
|
@components = []
|
12
12
|
@disable_auto_import = []
|
13
|
-
|
13
|
+
|
14
14
|
# Include each of the default included components
|
15
15
|
Volt.config.default_components.each do |def_comp_name|
|
16
16
|
component(def_comp_name)
|
@@ -22,7 +22,7 @@ module Volt
|
|
22
22
|
def disable_auto_import
|
23
23
|
@disable_auto_import.push(*@current_component).uniq
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def load_dependencies(path, component_name)
|
27
27
|
if path
|
28
28
|
dependencies_file = File.join(path, 'config/dependencies.rb')
|
@@ -80,11 +80,11 @@ module Volt
|
|
80
80
|
end
|
81
81
|
locator
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def url_or_path?(url)
|
85
85
|
(url =~ URI::regexp || url =~ /^\/(\/)?.*/) ? true : false
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
def component_paths
|
89
89
|
@components
|
90
90
|
end
|
@@ -94,31 +94,58 @@ module Volt
|
|
94
94
|
@assets << [:folder, asset_folder] if File.directory?(asset_folder)
|
95
95
|
end
|
96
96
|
|
97
|
-
def javascript_files(
|
97
|
+
def javascript_files(*args)
|
98
|
+
fail "Deprecation: #javascript_files is deprecated in config/base/index.html, opal 0.8 required a new format. For an updated config/base/index.html file, see https://gist.github.com/ryanstout/0858cf7dfc32c514f790"
|
99
|
+
end
|
100
|
+
|
101
|
+
def css_files(*args)
|
102
|
+
fail "Deprecation: #css_files is deprecated in config/base/index.html, opal 0.8 required a new format. For an updated config/base/index.html file, see https://gist.github.com/ryanstout/0858cf7dfc32c514f790"
|
103
|
+
end
|
104
|
+
|
105
|
+
# Returns script tags that should be included
|
106
|
+
def javascript_tags(volt_app)
|
107
|
+
@opal_tag_generator ||= Opal::Server::Index.new(nil, volt_app.opal_files.server)
|
108
|
+
|
98
109
|
javascript_files = []
|
99
110
|
@assets.each do |type, path|
|
100
111
|
case type
|
101
112
|
when :folder
|
113
|
+
# for a folder, we search for all .js files and return a tag for them
|
102
114
|
javascript_files += Dir["#{path}/**/*.js"].sort.map { |folder| '/assets' + folder[path.size..-1] }
|
103
115
|
when :javascript_file
|
116
|
+
# javascript_file is a cdn path to a JS file
|
104
117
|
javascript_files << path
|
105
118
|
end
|
106
119
|
end
|
107
120
|
|
108
|
-
|
109
|
-
|
110
|
-
|
121
|
+
javascript_files = javascript_files.uniq
|
122
|
+
|
123
|
+
scripts = javascript_files.map {|url| "<script src=\"#{url}\"></script>" }
|
124
|
+
|
125
|
+
# Include volt itself. Unless we are running with MAPS=all, just include
|
126
|
+
# the main file without sourcemaps.
|
127
|
+
volt_path = 'volt/volt/app'
|
128
|
+
if ENV['MAPS'] == 'all'
|
129
|
+
scripts << @opal_tag_generator.javascript_include_tag(volt_path)
|
111
130
|
else
|
112
|
-
|
131
|
+
scripts << "<script src=\"/assets/#{volt_path}.js\"></script>"
|
132
|
+
scripts << "<script>#{Opal::Processor.load_asset_code(volt_app.sprockets, volt_path)}</script>"
|
113
133
|
end
|
114
|
-
opal_js_files << '/components/main.js'
|
115
134
|
|
116
|
-
|
135
|
+
scripts << @opal_tag_generator.javascript_include_tag('components/main')
|
136
|
+
|
137
|
+
scripts.join("\n")
|
138
|
+
end
|
117
139
|
|
118
|
-
|
140
|
+
# Returns the link tags for the css
|
141
|
+
def css_tags
|
142
|
+
css.map do |url|
|
143
|
+
"<link href=\"#{url}\" media=\"all\" rel=\"stylesheet\" type=\"text/css\" />"
|
144
|
+
end.join("\n")
|
119
145
|
end
|
120
146
|
|
121
|
-
|
147
|
+
# Returns an array of all css files that should be included.
|
148
|
+
def css
|
122
149
|
css_files = []
|
123
150
|
@assets.each do |type, path|
|
124
151
|
case type
|
@@ -136,5 +163,24 @@ module Volt
|
|
136
163
|
|
137
164
|
css_files.uniq
|
138
165
|
end
|
166
|
+
|
167
|
+
# #javascript is only used on the server
|
168
|
+
unless RUBY_PLATFORM == 'opal'
|
169
|
+
# Parses the javascript tags to reutrn the following:
|
170
|
+
# [[:url, '/somefile.js'], [:body, 'var inlinejs = true;']]
|
171
|
+
def javascript(volt_app)
|
172
|
+
javascript_tags(volt_app)
|
173
|
+
.scan(/[<]script([^>]*)[>](.*?)[<]\/script[^>]*[>]/)
|
174
|
+
.map do |attrs, body|
|
175
|
+
src = attrs.match(/[\s|$]src\s*[=]\s*["']([^"']+?)["']/)
|
176
|
+
|
177
|
+
if src
|
178
|
+
[:src, src[1]]
|
179
|
+
else
|
180
|
+
[:body, body]
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
139
185
|
end
|
140
186
|
end
|
@@ -28,13 +28,7 @@ module Volt
|
|
28
28
|
|
29
29
|
def generate_config_code
|
30
30
|
# Setup Volt.config on the client
|
31
|
-
|
32
|
-
|
33
|
-
# Include the root initializers
|
34
|
-
code << "require_tree '#{Volt.root}/config/initializers'\n"
|
35
|
-
code << "require_tree '#{Volt.root}/config/initializers/client'\n"
|
36
|
-
|
37
|
-
code
|
31
|
+
"\nVolt.setup_client_config(#{Volt.config.public.to_h.inspect})\n"
|
38
32
|
end
|
39
33
|
end
|
40
34
|
end
|
@@ -48,13 +48,21 @@ module Volt
|
|
48
48
|
ERB.new(html, nil, '-').result(binding)
|
49
49
|
end
|
50
50
|
|
51
|
-
def javascript_files
|
51
|
+
def javascript_files(*args)
|
52
|
+
fail "Deprecation: #javascript_files is deprecated in config/base/index.html, opal 0.8 required a new format."
|
53
|
+
end
|
54
|
+
|
55
|
+
def css_files(*args)
|
56
|
+
fail "Deprecation: #css_files is deprecated in config/base/index.html, opal 0.8 required a new format."
|
57
|
+
end
|
58
|
+
|
59
|
+
def javascript_tags
|
52
60
|
# TODO: Cache somehow, this is being loaded every time
|
53
|
-
AssetFiles.new('main', @component_paths).
|
61
|
+
AssetFiles.new('main', @component_paths).javascript_tags(@volt_app)
|
54
62
|
end
|
55
63
|
|
56
|
-
def
|
57
|
-
AssetFiles.new('main', @component_paths).
|
64
|
+
def css_tags
|
65
|
+
AssetFiles.new('main', @component_paths).css_tags
|
58
66
|
end
|
59
67
|
end
|
60
68
|
end
|