wedge 0.0.27 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/lib/roda/plugins/wedge.rb +14 -10
- data/lib/wedge.rb +71 -175
- data/lib/wedge/component.rb +94 -172
- data/lib/wedge/config.rb +33 -111
- data/lib/wedge/dom.rb +1 -1
- data/lib/wedge/events.rb +42 -31
- data/lib/wedge/html.rb +1 -1
- data/lib/wedge/opal.rb +1 -1
- data/lib/wedge/plugins/form.rb +5 -5
- data/lib/wedge/plugins/history.rb +2 -2
- data/lib/wedge/plugins/pjax.rb +4 -3
- data/lib/wedge/plugins/validations.rb +2 -2
- data/lib/wedge/utilis/hash.rb +28 -0
- data/lib/wedge/utilis/indifferent_hash.rb +1 -1
- data/lib/wedge/utilis/methods.rb +1 -1
- data/lib/wedge/version.rb +2 -2
- data/test/dummy/app.rb +15 -3
- data/test/dummy/components/bar.rb +7 -2
- data/test/dummy/components/base.rb +1 -1
- data/test/dummy/components/layout.rb +3 -3
- data/test/dummy/components/root.rb +5 -4
- data/test/dummy/forms/bar.rb +1 -1
- data/test/dummy/forms/foo.rb +3 -2
- data/test/test_basic_component.rb +5 -5
- data/test/test_helper.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef2f58249fc92d7275ded58a7adf02cb4c902cc7
|
4
|
+
data.tar.gz: 9ca0bf1765457342dc330f60e65fb2ae4f4fa388
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c00389efaee2f6a672c1631c6c9b5ed198a1236f4b8aa08e2b8b1a46952701b376d71561263a7a0027a9de68095bfb8e8bbfa8b9060c67eabd61c643e4ffde5
|
7
|
+
data.tar.gz: 1de60359395c01ef233f3c6e23cfcfc0aa264692d7bcc0ad4ada476c30004a2f29a5f437c35d22bc926226e75feab7d47e2015ba239fac67b2c308b74c1ad4f7
|
data/Gemfile
CHANGED
@@ -3,7 +3,9 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in BrowserIO.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
gem 'opal', github: 'opal/opal'
|
6
|
+
gem 'opal', github: 'opal/opal', path: '~/gems/opal'
|
7
7
|
gem 'opal-jquery', github: 'opal/opal-jquery'
|
8
|
+
gem 'binding_of_caller'
|
9
|
+
gem 'better_errors'
|
8
10
|
gem 'thin'
|
9
11
|
gem 'roda-bin'
|
data/lib/roda/plugins/wedge.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Roda
|
2
2
|
module RodaPlugins
|
3
|
-
|
3
|
+
class Wedge
|
4
4
|
def self.configure(app, opts = {})
|
5
5
|
if app.opts[:wedge]
|
6
6
|
app.opts[:wedge].merge!(opts)
|
@@ -16,27 +16,31 @@ class Roda
|
|
16
16
|
v.each { |p| ::Wedge.config.plugin p }
|
17
17
|
when 'scope'
|
18
18
|
begin
|
19
|
-
::Wedge.config.
|
19
|
+
::Wedge.config.scope = v.new
|
20
20
|
rescue
|
21
|
-
::Wedge.config.
|
21
|
+
::Wedge.config.scope = v.new({})
|
22
22
|
end
|
23
23
|
else
|
24
|
-
::Wedge.config.
|
24
|
+
::Wedge.config.send "#{k}=", v
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
# cache the javascript on load
|
29
|
+
Wedge.javascript if opts[:cache_assets]
|
27
30
|
end
|
28
31
|
|
29
32
|
module InstanceMethods
|
30
|
-
def wedge(*args)
|
31
|
-
|
32
|
-
::Wedge[*args]
|
33
|
+
def wedge(name, *args, &block)
|
34
|
+
::Wedge.scope!(self)[name, *args, &block]
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
38
|
module RequestClassMethods
|
37
39
|
def wedge_route_regex
|
38
40
|
assets_url = ::Wedge.assets_url.gsub(%r{^\/}, '')
|
39
|
-
|
41
|
+
# # We also allow for no assets key so when we post server methods there
|
42
|
+
# # isn't an error if the key has been changed since a browser refresh.
|
43
|
+
%r{(?:#{assets_url}|#{assets_url.sub("#{::Wedge.config.assets_key}/", '')})/(.*)\.(.*)$}
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
@@ -48,7 +52,7 @@ class Roda
|
|
48
52
|
::Wedge.source_map component
|
49
53
|
when 'rb'
|
50
54
|
if component =~ /^wedge/
|
51
|
-
path = ::Wedge.
|
55
|
+
path = ::Wedge.config.path.gsub(/\/wedge.rb$/, '')
|
52
56
|
File.read("#{path}/#{component}.rb")
|
53
57
|
else
|
54
58
|
File.read("#{ROOT_PATH}/#{component}.rb")
|
@@ -88,7 +92,7 @@ class Roda
|
|
88
92
|
else
|
89
93
|
scope.response.headers['Content-Type'] = 'application/javascript; charset=UTF-8'
|
90
94
|
|
91
|
-
if ::Wedge.
|
95
|
+
if ::Wedge.config.debug
|
92
96
|
"#{::Wedge.javascript(component)}\n//# sourceMappingURL=/assets/wedge/#{component}.map"
|
93
97
|
else
|
94
98
|
::Wedge.javascript(component)
|
data/lib/wedge.rb
CHANGED
@@ -14,33 +14,56 @@ unless RUBY_ENGINE == 'opal'
|
|
14
14
|
end
|
15
15
|
require 'wedge/html'
|
16
16
|
require 'wedge/dom'
|
17
|
+
require 'wedge/events'
|
17
18
|
require 'wedge/config'
|
18
19
|
require 'wedge/component'
|
19
20
|
|
20
|
-
|
21
|
+
class Wedge
|
21
22
|
include Methods
|
22
23
|
|
23
24
|
class << self
|
24
|
-
|
25
|
-
:wedge_javascript_loaded, :object_events, :browser_events, :events_triggered
|
25
|
+
ATTR_ACCESSORS = %i{scope store config events}
|
26
26
|
|
27
|
-
|
28
|
-
javascript
|
29
|
-
end
|
27
|
+
attr_accessor(*ATTR_ACCESSORS)
|
30
28
|
|
31
29
|
def assets_url
|
32
|
-
url =
|
33
|
-
"#{url}#{
|
30
|
+
url = config.assets_url.gsub(%r{^(http(|s)://[^\/]*\/|\/)}, '/')
|
31
|
+
"#{url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
|
34
32
|
end
|
35
33
|
|
36
34
|
def assets_url_with_host
|
37
|
-
"#{
|
35
|
+
"#{config.assets_url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
|
38
36
|
end
|
39
37
|
|
40
38
|
def script_tag
|
41
39
|
"<script src='#{assets_url}/wedge.js'></script>"
|
42
40
|
end
|
43
41
|
|
42
|
+
unless RUBY_ENGINE == 'opal'
|
43
|
+
def javascript_cache
|
44
|
+
@javascript_cache ||= IndifferentHash.new
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if RUBY_ENGINE == 'opal'
|
49
|
+
def trigger_browser_events
|
50
|
+
config.component_class.each do |k, klass|
|
51
|
+
next if klass.config.triggered_browser_events
|
52
|
+
klass.config.triggered_browser_events = true
|
53
|
+
|
54
|
+
Wedge.trigger klass.config.name, :browser_events
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def trigger(wedge_name, event_name, *args)
|
60
|
+
events.trigger wedge_name, event_name, *args
|
61
|
+
end
|
62
|
+
|
63
|
+
def events
|
64
|
+
@events ||= Events.new
|
65
|
+
end
|
66
|
+
|
44
67
|
# Used to call a component.
|
45
68
|
#
|
46
69
|
# @example
|
@@ -48,14 +71,19 @@ module Wedge
|
|
48
71
|
#
|
49
72
|
# @param name [String, Symbol, #to_s] The unique name given to a component.
|
50
73
|
# @return [Wedge::Component#method] Last line of the method called.
|
51
|
-
def [](name, *args)
|
52
|
-
|
53
|
-
|
54
|
-
component.klass.new(*args)
|
74
|
+
def [](name, *args, &block)
|
75
|
+
config.component_class[name].wedge_new self, *args, &block
|
55
76
|
end
|
56
77
|
|
57
|
-
|
58
|
-
|
78
|
+
%w(store scope).each do |meth|
|
79
|
+
define_method "#{meth}!" do |value|
|
80
|
+
klass = Class.new(self)
|
81
|
+
ATTR_ACCESSORS.each do |name|
|
82
|
+
klass.instance_variable_set(:"@#{name}", Wedge.instance_variable_get(:"@#{name}"))
|
83
|
+
end
|
84
|
+
klass.instance_variable_set(:"@#{meth}", value)
|
85
|
+
klass
|
86
|
+
end
|
59
87
|
end
|
60
88
|
|
61
89
|
unless RUBY_ENGINE == 'opal'
|
@@ -64,8 +92,7 @@ module Wedge
|
|
64
92
|
# @param path [String] require path to file to build.
|
65
93
|
# @return [String, Opal::Builder#build]
|
66
94
|
def build(path = 'wedge', options = {})
|
67
|
-
append_paths
|
68
|
-
Opal::Builder.build(path, options)
|
95
|
+
Opal::Builder.build(path, options) if append_paths
|
69
96
|
end
|
70
97
|
|
71
98
|
# Source maps for the javascript
|
@@ -78,7 +105,7 @@ module Wedge
|
|
78
105
|
# @return [Array] List of opal paths.
|
79
106
|
def append_paths
|
80
107
|
@append_paths ||= begin
|
81
|
-
file = method(:
|
108
|
+
file = method(:assets_url).source_location.first.sub('/wedge.rb', '')
|
82
109
|
gems_dir = ::Opal.gem_dir.gsub(/(?<=gems)\/opal-.*/, '')
|
83
110
|
Wedge::Opal.append_path file
|
84
111
|
Wedge::Opal.append_path Dir.pwd
|
@@ -90,176 +117,49 @@ module Wedge
|
|
90
117
|
end
|
91
118
|
|
92
119
|
# Return the opal javascript.
|
93
|
-
def javascript(path_name = 'wedge', options = {}
|
120
|
+
def javascript(path_name = 'wedge', options = {})
|
94
121
|
if server?
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
# events = Wedge[v.name].wedge_opts.events
|
107
|
-
# @object_events[v.name] = events.object_events
|
108
|
-
# @browser_events[v.name] = events.browser_events
|
109
|
-
javascript(v.klass.wedge_opts[:path_name])
|
122
|
+
javascript_cache[path_name] ||= begin
|
123
|
+
js = build(path_name, options).javascript
|
124
|
+
|
125
|
+
if path_name == 'wedge'
|
126
|
+
compiled_data = Base64.encode64 config.client_data.to_json
|
127
|
+
# We need to merge in some data that is only set on the server.
|
128
|
+
# i.e. path, assets_key etc....
|
129
|
+
js << Opal.compile("Wedge.config.data = HashObject.new(JSON.parse(Base64.decode64('#{compiled_data}')).merge Wedge.config.data.to_h)")
|
130
|
+
# load all global plugins into wedge
|
131
|
+
config.plugins.each do |path|
|
132
|
+
js << Wedge.javascript(path)
|
110
133
|
end
|
111
|
-
|
112
|
-
compiled_requires = Base64.encode64 requires.to_json
|
113
|
-
# compiled_object_events = Base64.encode64 object_events.to_json
|
114
|
-
assets_key = opts.assets_key
|
115
|
-
cache_assets = opts.cache_assets
|
116
|
-
|
117
|
-
js = build(path_name, options).javascript
|
118
|
-
js << Opal.compile("Wedge.instance_variable_set(:@requires, JSON.parse(Base64.decode64('#{compiled_requires}')))")
|
119
|
-
# fix: we need to just merge in all config opts and just reject
|
120
|
-
# certain ones
|
121
|
-
js << Opal.compile("Wedge.config.assets_key('#{assets_key}')") if assets_key
|
122
|
-
js << Opal.compile("Wedge.config.cache_assets('#{cache_assets}')") if cache_assets
|
123
|
-
js << Opal.compile("Wedge.config.assets_url('#{opts.assets_url}')")
|
124
|
-
js << Opal.compile("Wedge.config.assets_url_with_host('#{opts.assets_url_with_host}')")
|
125
|
-
##############################################################
|
126
|
-
js
|
127
134
|
end
|
128
|
-
else
|
129
|
-
@javascript_cache[path_name] ||= begin
|
130
|
-
js = build(path_name, options).javascript
|
131
|
-
comp_name = components.to_h.select { |k, v| v.path_name == path_name }.first.last.name
|
132
|
-
comp = Wedge[comp_name]
|
133
|
-
options = comp.client_wedge_opts
|
134
|
-
compiled_opts = Base64.encode64 options.to_json
|
135
|
-
js << Opal.compile("Wedge.components[:#{comp_name}].klass.instance_variable_set(:@wedge_config, Wedge::Config.new(Wedge.components[:#{comp_name}].klass.wedge_config.opts_dup.merge(JSON.parse(Base64.decode64('#{compiled_opts}')))))")
|
136
|
-
end
|
137
|
-
end
|
138
|
-
else
|
139
|
-
Wedge.events_triggered ||= []
|
140
|
-
Wedge.loaded_requires ||= []
|
141
|
-
Wedge.loaded_requires_events ||= []
|
142
|
-
reqs = Wedge.requires[options[:name].to_sym]
|
143
|
-
promise = Promise.new
|
144
135
|
|
145
|
-
|
146
|
-
requires = get_requires(reqs.dup)
|
147
|
-
load_requires(requires.dup, promise)
|
148
|
-
else
|
149
|
-
promise.resolve true
|
136
|
+
js
|
150
137
|
end
|
138
|
+
else
|
139
|
+
url = "#{Wedge.assets_url_with_host}/#{options[:path]}.js"
|
140
|
+
cache = options[:cache_assets]
|
151
141
|
|
152
|
-
|
153
|
-
|
154
|
-
method_called = options[:method_called]
|
155
|
-
method_args = options[:method_args]
|
156
|
-
name = options[:name]
|
157
|
-
comp = Wedge[name, options]
|
158
|
-
|
159
|
-
Document.ready? do
|
160
|
-
if method_called && !comp.wedge_opts.on_server_methods.include?(method_called)
|
161
|
-
comp.send(method_called, *method_args)
|
162
|
-
end
|
163
|
-
|
164
|
-
unless Wedge.events_triggered.include?(name)
|
165
|
-
comp.wedge_trigger :browser_events
|
166
|
-
Wedge.loaded_requires << name
|
167
|
-
Wedge.events_triggered << name
|
168
|
-
end
|
142
|
+
`jQuery.ajax({ url: url, dataType: "script", cache: cache }).done(function() {`
|
143
|
+
comp = Wedge.store!(options[:store].indifferent)[options[:name]]
|
169
144
|
|
170
|
-
|
171
|
-
|
145
|
+
if options[:method_args].any?
|
146
|
+
comp.send(options[:method_called], options[:method_args])
|
147
|
+
else
|
148
|
+
comp.send(options[:method_called])
|
172
149
|
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def trigger_requires_events requires
|
178
|
-
reqs = requires.shift
|
179
|
-
|
180
|
-
reqs.each do |r|
|
181
|
-
next if Wedge.loaded_requires_events.include? r[:name]
|
182
|
-
|
183
|
-
Wedge.loaded_requires_events << r[:name]
|
184
|
-
comp = Wedge[r[:name], r]
|
185
|
-
comp.wedge_trigger :browser_events
|
186
|
-
Wedge.events_triggered << r[:name]
|
187
|
-
end
|
188
|
-
|
189
|
-
trigger_requires_events requires if requires.any?
|
190
|
-
end
|
191
|
-
|
192
|
-
def load_requires requires, promise = Promise.new
|
193
|
-
reqs = requires.shift
|
194
|
-
promises = []
|
195
|
-
|
196
|
-
reqs.each do |r|
|
197
|
-
next if Wedge.loaded_requires.include? r[:name]
|
198
|
-
|
199
|
-
Wedge.loaded_requires << r[:name]
|
200
|
-
|
201
|
-
promises << -> { load_comp r }
|
202
|
-
end if reqs
|
203
|
-
|
204
|
-
Promise.when(*promises.map!(&:call)).then do
|
205
|
-
requires.any?? load_requires(requires, promise) : promise.resolve(true)
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
def get_requires reqs, requires_array = []
|
210
|
-
new_reqs = []
|
211
150
|
|
212
|
-
|
213
|
-
if r[:requires].any?
|
214
|
-
get_requires(r[:requires], requires_array)
|
215
|
-
end
|
151
|
+
Wedge.trigger_browser_events
|
216
152
|
|
217
|
-
|
153
|
+
`}).fail(function(jqxhr, settings, exception){ window.console.log(exception); })`
|
218
154
|
end
|
219
|
-
|
220
|
-
requires_array << new_reqs if new_reqs.any?
|
221
|
-
|
222
|
-
requires_array
|
223
|
-
end
|
224
|
-
|
225
|
-
def load_comp options = {}, promise = Promise.new
|
226
|
-
path_name = options[:path_name]
|
227
|
-
assets_url = Wedge.assets_url_with_host
|
228
|
-
|
229
|
-
if !Wedge.components[options[:name]]
|
230
|
-
# fix: this could give people unwanted behaviour, change getScript to just
|
231
|
-
# use ajax.
|
232
|
-
`jQuery.ajaxSetup({ cache: true })` if Wedge.opts.cache_assets
|
233
|
-
`$.getScript(assets_url + "/" + path_name + ".js").done(function(){`
|
234
|
-
promise.resolve true
|
235
|
-
`}).fail(function(jqxhr, settings, exception){ window.console.log(exception); });`
|
236
|
-
#########################################################################
|
237
|
-
else
|
238
|
-
promise.resolve true
|
239
|
-
end
|
240
|
-
|
241
|
-
promise
|
242
|
-
end
|
243
|
-
|
244
|
-
# Used to setup the component with default options.
|
245
|
-
#
|
246
|
-
# @example
|
247
|
-
# class SomeComponent < Component
|
248
|
-
# setup do |config|
|
249
|
-
# config.name :some
|
250
|
-
# end
|
251
|
-
# end
|
252
|
-
# @yield [Config]
|
253
|
-
def setup(&block)
|
254
|
-
block.call config if block_given?
|
255
155
|
end
|
256
156
|
|
257
157
|
def config
|
258
158
|
@config ||= begin
|
259
|
-
args = { klass: self }
|
159
|
+
args = { klass: self, component_class: IndifferentHash.new }
|
260
160
|
|
261
161
|
unless RUBY_ENGINE == 'opal'
|
262
|
-
args[:
|
162
|
+
args[:path] = caller.first.gsub(/(?<=\.rb):.*/, '')
|
263
163
|
args[:assets_key] = begin
|
264
164
|
if defined?(PlatformAPI) && ENV['HEROKU_TOKEN'] && ENV['HEROKU_APP']
|
265
165
|
heroku = PlatformAPI.connect_oauth(ENV['HEROKU_TOKEN'], default_headers: {'Range' => 'version ..; order=desc'})
|
@@ -274,9 +174,5 @@ module Wedge
|
|
274
174
|
Config.new(args)
|
275
175
|
end
|
276
176
|
end
|
277
|
-
|
278
|
-
def opts
|
279
|
-
config.opts
|
280
|
-
end
|
281
177
|
end
|
282
178
|
end
|
data/lib/wedge/component.rb
CHANGED
@@ -1,99 +1,73 @@
|
|
1
|
-
|
1
|
+
class Wedge
|
2
2
|
class Component
|
3
3
|
include Methods
|
4
4
|
|
5
|
-
ALLOWED_CLIENT_OPTS = %i(name path_name method_args method_called cache tmpl key cache_assets assets_key assets_url assets_url_with_host requires skip_method_wrap on_server_methods)
|
6
|
-
|
7
5
|
class << self
|
8
|
-
|
9
|
-
def new(*args, &block)
|
10
|
-
obj = allocate
|
11
|
-
obj.wedge_opts.js = args.delete(:js)
|
12
|
-
obj.wedge_opts.init = args.delete(:init)
|
13
|
-
|
14
|
-
if args.any? && obj.wedge_opts.skip_method_wrap
|
15
|
-
obj.wedge_opts.init = args
|
16
|
-
end
|
6
|
+
attr_accessor :wedge_on_count
|
17
7
|
|
18
|
-
|
19
|
-
|
8
|
+
def wedge_new(klass, *args, &block)
|
9
|
+
obj = allocate
|
20
10
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
obj.wedge_opts.events.add(*a.first.first, &a.first.last)
|
11
|
+
%w(store scope).each do |meth|
|
12
|
+
if value = klass.send(meth)
|
13
|
+
obj.config.send "#{meth}=", value
|
14
|
+
end
|
26
15
|
end
|
27
|
-
wedge_opts.added_class_events = true
|
28
16
|
|
29
|
-
if
|
30
|
-
|
31
|
-
obj.send :initialize, *obj.wedge_opts.init, &block
|
32
|
-
else
|
33
|
-
obj.send :initialize, obj.wedge_opts.init, &block
|
34
|
-
end
|
17
|
+
if args.any?
|
18
|
+
obj.send :initialize, *args, &block
|
35
19
|
else
|
36
20
|
obj.send :initialize, &block
|
37
21
|
end
|
38
22
|
|
39
|
-
|
40
|
-
|
41
|
-
obj.wedge_opts.methods_wrapped = wedge_opts.methods_wrapped = true
|
42
|
-
|
43
|
-
public_instance_methods(false).each do |meth|
|
44
|
-
alias_method :"wedge_original_#{meth}", :"#{meth}"
|
45
|
-
define_method "#{meth}" do |*d_args, &blk|
|
46
|
-
if server? && !wedge_opts.method_called && wedge_opts.js
|
47
|
-
wedge_opts.method_called = meth
|
48
|
-
wedge_opts.method_args = *d_args
|
49
|
-
end
|
23
|
+
obj
|
24
|
+
end
|
50
25
|
|
51
|
-
|
26
|
+
alias_method :original_name, :name
|
27
|
+
def wedge_name(*args)
|
28
|
+
if args.any?
|
29
|
+
unless RUBY_ENGINE == 'opal'
|
30
|
+
# set the file path
|
31
|
+
path = "#{caller[0]}".gsub(/(?<=\.rb):.*/, '')
|
32
|
+
.gsub(%r{(#{Dir.pwd}/|.*(?=wedge))}, '')
|
33
|
+
.gsub(/\.rb$/, '')
|
34
|
+
end
|
52
35
|
|
53
|
-
|
54
|
-
result = send(o_name, *d_args, &blk)
|
55
|
-
else
|
56
|
-
result = send(o_name, &blk)
|
57
|
-
end
|
36
|
+
@wedge_on_count = 0
|
58
37
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
result << wedge_javascript if result.is_a? String
|
63
|
-
end
|
38
|
+
args.each do |name|
|
39
|
+
# set the name
|
40
|
+
wedge_config.name = name
|
64
41
|
|
65
|
-
|
42
|
+
unless RUBY_ENGINE == 'opal'
|
43
|
+
# set the file path
|
44
|
+
wedge_config.path = path
|
45
|
+
# add it to the component class list allow path or name
|
46
|
+
Wedge.config.component_class[path.gsub(/\//, '__')] = self
|
66
47
|
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
if obj.wedge_opts.call
|
71
|
-
method_args = args.first
|
72
|
-
method_called = method_args.delete(:call)
|
73
48
|
|
74
|
-
|
75
|
-
obj.send(method_called, method_args)
|
76
|
-
else
|
77
|
-
obj.send(method_called)
|
49
|
+
Wedge.config.component_class[name] = self
|
78
50
|
end
|
79
51
|
else
|
80
|
-
|
52
|
+
original_name
|
81
53
|
end
|
82
54
|
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
55
|
+
alias_method :name, :wedge_name
|
56
|
+
|
57
|
+
def wedge_html(html, &block)
|
58
|
+
unless RUBY_ENGINE == 'opal'
|
59
|
+
wedge_config.html = begin
|
60
|
+
File.read html
|
61
|
+
rescue
|
62
|
+
html
|
63
|
+
end.strip
|
64
|
+
|
65
|
+
if block_given?
|
66
|
+
yield
|
67
|
+
end
|
68
|
+
end
|
95
69
|
end
|
96
|
-
alias_method :
|
70
|
+
alias_method :html, :wedge_html
|
97
71
|
|
98
72
|
# Set templates
|
99
73
|
#
|
@@ -103,11 +77,11 @@ module Wedge
|
|
103
77
|
def wedge_tmpl(name, dom = false, remove = true)
|
104
78
|
if dom
|
105
79
|
dom = remove ? dom.remove : dom
|
106
|
-
|
80
|
+
wedge_config.tmpl[name] = {
|
107
81
|
dom: dom,
|
108
82
|
html: dom.to_html
|
109
83
|
}
|
110
|
-
elsif t =
|
84
|
+
elsif t = wedge_config.tmpl[name]
|
111
85
|
dom = DOM.new t[:html]
|
112
86
|
else
|
113
87
|
false
|
@@ -117,57 +91,26 @@ module Wedge
|
|
117
91
|
end
|
118
92
|
alias_method :tmpl, :wedge_tmpl
|
119
93
|
|
120
|
-
def wedge_dom
|
121
|
-
@wedge_dom ||= DOM.new
|
122
|
-
end
|
123
|
-
alias_method :dom, :wedge_dom
|
94
|
+
def wedge_dom &block
|
95
|
+
@wedge_dom ||= DOM.new wedge_config.html
|
124
96
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
def wedge_components
|
129
|
-
Wedge.components ||= {}
|
130
|
-
end
|
131
|
-
alias_method :components, :wedge_components
|
97
|
+
if block_given?
|
98
|
+
yield
|
99
|
+
end
|
132
100
|
|
133
|
-
|
134
|
-
#
|
135
|
-
# @return [Openstruct, Config#opts]
|
136
|
-
def wedge_opts
|
137
|
-
wedge_config.opts
|
101
|
+
@wedge_dom
|
138
102
|
end
|
139
|
-
alias_method :
|
103
|
+
alias_method :dom, :wedge_dom
|
140
104
|
|
141
105
|
def wedge_config
|
142
|
-
@wedge_config ||=
|
143
|
-
args = Wedge.config.opts_dup.merge(klass: self, object_events: {})
|
144
|
-
|
145
|
-
unless RUBY_ENGINE == 'opal'
|
146
|
-
args[:file_path] = caller.first.gsub(/(?<=\.rb):.*/, '')
|
147
|
-
args[:path_name] = args[:file_path]
|
148
|
-
.gsub(%r{(#{Dir.pwd}/|.*(?=wedge))}, '')
|
149
|
-
.gsub(/\.rb$/, '')
|
150
|
-
end
|
151
|
-
|
152
|
-
c = Config.new(args)
|
153
|
-
|
154
|
-
# If extending from a plugin it will automatically require it.
|
155
|
-
ancestors.each do |klass|
|
156
|
-
next if klass.to_s == name.to_s
|
157
|
-
|
158
|
-
if klass.method_defined?(:wedge_opts) && klass.wedge_opts.name.to_s =~ /_plugin$/
|
159
|
-
c.requires klass.wedge_opts.name
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
c
|
164
|
-
end
|
106
|
+
@wedge_config ||= Config.new Wedge.config.data.dup.merge(klass: self)
|
165
107
|
end
|
166
108
|
alias_method :config, :wedge_config
|
167
109
|
|
168
110
|
def wedge_on(*args, &block)
|
169
111
|
if args.first.to_s != 'server'
|
170
|
-
|
112
|
+
@wedge_on_count += 1
|
113
|
+
Wedge.events.add config.name, *args, &block
|
171
114
|
else
|
172
115
|
wedge_on_server(&block)
|
173
116
|
end
|
@@ -175,17 +118,13 @@ module Wedge
|
|
175
118
|
alias_method :on, :wedge_on
|
176
119
|
|
177
120
|
def method_missing(method, *args, &block)
|
178
|
-
if
|
179
|
-
|
121
|
+
if config.scope.respond_to?(method, true)
|
122
|
+
config.scope.send method, *args, &block
|
180
123
|
else
|
181
124
|
super
|
182
125
|
end
|
183
126
|
end
|
184
127
|
|
185
|
-
def client_wedge_opts
|
186
|
-
wedge_config.opts_dup.select {|k, v| ALLOWED_CLIENT_OPTS.include? k }
|
187
|
-
end
|
188
|
-
|
189
128
|
def wedge_on_server(&block)
|
190
129
|
if server?
|
191
130
|
m = Module.new(&block)
|
@@ -193,7 +132,7 @@ module Wedge
|
|
193
132
|
yield
|
194
133
|
|
195
134
|
m.public_instance_methods(false).each do |meth|
|
196
|
-
|
135
|
+
config.server_methods << meth.to_s
|
197
136
|
|
198
137
|
alias_method :"wedge_on_server_#{meth}", :"#{meth}"
|
199
138
|
define_method "#{meth}" do |*args, &blk|
|
@@ -212,20 +151,22 @@ module Wedge
|
|
212
151
|
m = Module.new(&block)
|
213
152
|
|
214
153
|
m.public_instance_methods(false).each do |meth|
|
215
|
-
|
154
|
+
config.server_methods << meth.to_s
|
216
155
|
|
217
156
|
define_method "#{meth}" do |*args, &blk|
|
218
|
-
path_name =
|
219
|
-
# event_id = "comp-event-#{$faye.generate_id}"
|
157
|
+
path_name = config.path
|
220
158
|
|
221
|
-
payload =
|
159
|
+
payload = config.client_data.reject do |k, _|
|
222
160
|
%w(html tmpl requires plugins object_events js_loaded).include? k
|
223
161
|
end
|
224
162
|
payload[:wedge_name] = payload[:name]
|
225
163
|
payload[:wedge_method_called] = meth
|
226
164
|
payload[:wedge_method_args] = args
|
227
165
|
|
228
|
-
|
166
|
+
# we want to remove the assets key from the call so we don't get
|
167
|
+
# an error if they assets_key has changed and the user hasn't
|
168
|
+
# refreshed the browser yet.
|
169
|
+
call_url = "#{Wedge.assets_url.sub("#{Wedge.config.assets_key}/")}/#{path_name}.call"
|
229
170
|
|
230
171
|
HTTP.post(call_url,
|
231
172
|
headers: {
|
@@ -254,35 +195,29 @@ module Wedge
|
|
254
195
|
end
|
255
196
|
end
|
256
197
|
|
198
|
+
if RUBY_ENGINE == 'opal'
|
199
|
+
def wedge(*args)
|
200
|
+
Wedge[*args]
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
257
204
|
def wedge_scope
|
258
|
-
|
205
|
+
wedge_config.scope
|
259
206
|
end
|
260
207
|
alias_method :scope, :wedge_scope
|
261
208
|
|
262
|
-
def
|
263
|
-
|
209
|
+
def wedge_store
|
210
|
+
wedge_config.store
|
264
211
|
end
|
265
|
-
alias_method :
|
212
|
+
alias_method :store, :wedge_store
|
266
213
|
|
267
214
|
# Duplicate of class condig [Config]
|
268
215
|
# @return config [Config]
|
269
216
|
def wedge_config
|
270
|
-
@wedge_config ||=
|
271
|
-
c = Config.new(self.class.wedge_config.opts_dup.merge(events: Events.new))
|
272
|
-
c.opts.events.object_events = c.opts.object_events.dup
|
273
|
-
c.opts.object_events = {}
|
274
|
-
c
|
275
|
-
end
|
217
|
+
@wedge_config ||= Config.new(self.class.wedge_config.data.dup)
|
276
218
|
end
|
277
219
|
alias_method :config, :wedge_config
|
278
220
|
|
279
|
-
# Duplicated of config.opts [Config#opts]
|
280
|
-
# @return opts [Config#opts]
|
281
|
-
def wedge_opts
|
282
|
-
wedge_config.opts
|
283
|
-
end
|
284
|
-
alias_method :opts, :wedge_opts
|
285
|
-
|
286
221
|
# Grab a copy of the template
|
287
222
|
# @return dom [DOM]
|
288
223
|
def wedge_tmpl(name)
|
@@ -339,48 +274,35 @@ module Wedge
|
|
339
274
|
end
|
340
275
|
alias_method :from_client?, :wedge_from_client?
|
341
276
|
|
342
|
-
def wedge_javascript
|
277
|
+
def wedge_javascript(method = false, *args)
|
343
278
|
return unless server?
|
344
279
|
|
345
|
-
|
346
|
-
|
280
|
+
client_data = config.client_data.dup
|
281
|
+
client_data.merge! method_called: method, method_args: args
|
347
282
|
|
283
|
+
compiled_opts = Base64.encode64 client_data.to_json
|
348
284
|
javascript = <<-JS
|
349
|
-
Wedge.javascript('#{
|
285
|
+
Wedge.javascript('#{config.path}', JSON.parse(Base64.decode64('#{compiled_opts}')))
|
350
286
|
JS
|
351
287
|
"<script>#{Opal.compile(javascript)}</script>"
|
352
288
|
end
|
353
289
|
alias_method :javscript, :wedge_javascript
|
354
290
|
|
355
|
-
def
|
356
|
-
|
357
|
-
end
|
358
|
-
alias_method :client_opts, :client_wedge_opts
|
359
|
-
|
360
|
-
def wedge_trigger(*args)
|
361
|
-
wedge_opts.events.trigger(*args)
|
291
|
+
def wedge_trigger(event_name, *args)
|
292
|
+
Wedge.events.trigger config.name, event_name, *args
|
362
293
|
end
|
363
294
|
alias_method :trigger, :wedge_trigger
|
364
295
|
|
365
|
-
def
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
else
|
371
|
-
super *args, &block
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
|
-
if RUBY_ENGINE == 'opal'
|
376
|
-
def wedge(*args)
|
377
|
-
Wedge[*args]
|
378
|
-
end
|
296
|
+
def to_js(method = false, *args)
|
297
|
+
response = args.any? ? send(method, *args) : send(method)
|
298
|
+
response = response.to_html if response.is_a? DOM
|
299
|
+
response << wedge_javascript(method, *args) if response.is_a? String
|
300
|
+
response
|
379
301
|
end
|
380
302
|
|
381
303
|
def method_missing(method, *args, &block)
|
382
|
-
if
|
383
|
-
|
304
|
+
if config.scope.respond_to?(method, true)
|
305
|
+
config.scope.send method, *args, &block
|
384
306
|
else
|
385
307
|
super
|
386
308
|
end
|