wedge 0.0.27 → 0.1.0
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/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
|