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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2423b8d5acb640ee673e87efd91c7521940ed508
4
- data.tar.gz: 2fd4bca2a845a52e5ed71b541c76991dde0a7f8f
3
+ metadata.gz: ef2f58249fc92d7275ded58a7adf02cb4c902cc7
4
+ data.tar.gz: 9ca0bf1765457342dc330f60e65fb2ae4f4fa388
5
5
  SHA512:
6
- metadata.gz: 11772071118c3afd17cae4b17625e2cf7c5e694bb1f5e0b5d400c54eac0d700979543b9cdd8e4c75662094feeef439cb529f07623d5a4af940e77fb060e04085
7
- data.tar.gz: 4a6c220aa19f86805af5567eeb70519218615d3ec35dd261c9110a8981201b30ef0708172eda4f1d6c4155e7d92b58613bf5ebd95d9b34da223aea568a919e68
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'
@@ -1,6 +1,6 @@
1
1
  class Roda
2
2
  module RodaPlugins
3
- module Wedge
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.opts[:scope] = v.new
19
+ ::Wedge.config.scope = v.new
20
20
  rescue
21
- ::Wedge.config.opts[:scope] = v.new({})
21
+ ::Wedge.config.scope = v.new({})
22
22
  end
23
23
  else
24
- ::Wedge.config.opts[k.to_sym] = v
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
- args << { scope: self }
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
- %r{#{assets_url}/(.*)\.(.*)$}
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.opts.file_path.gsub(/\/wedge.rb$/, '')
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.opts[:debug]
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
- module Wedge
21
+ class Wedge
21
22
  include Methods
22
23
 
23
24
  class << self
24
- attr_accessor :requires, :loaded_requires, :loaded_requires_events, :javascript_cache,
25
- :wedge_javascript_loaded, :object_events, :browser_events, :events_triggered
25
+ ATTR_ACCESSORS = %i{scope store config events}
26
26
 
27
- def compile_opal
28
- javascript
29
- end
27
+ attr_accessor(*ATTR_ACCESSORS)
30
28
 
31
29
  def assets_url
32
- url = opts.assets_url.gsub(%r{^(http(|s)://[^\/]*\/|\/)}, '/')
33
- "#{url}#{opts.cache_assets ? "/#{opts.assets_key}" : ''}"
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
- "#{opts.assets_url}#{opts.cache_assets ? "/#{opts.assets_key}" : ''}"
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
- component = components[name.to_sym]
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
- def components
58
- @components ||= OpenStruct.new
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(:components).source_location.first.sub('/wedge.rb', '')
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 = {}, promise = false)
120
+ def javascript(path_name = 'wedge', options = {})
94
121
  if server?
95
- if path_name == 'wedge'
96
- @wedge_javascript ||= begin
97
- @wedge_javascript_loaded = true
98
- requires = {}
99
- @object_events = {}
100
- @browser_events = {}
101
-
102
- @javascript_cache ||= {}
103
-
104
- components.to_h.each do |k, v|
105
- requires[k] = v.klass.wedge_config.get_requires
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
- if reqs
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
- promise.then do
153
- load_comp(options).then do
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
- trigger_requires_events requires.dup
171
- end
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
- reqs.each do |r|
213
- if r[:requires].any?
214
- get_requires(r[:requires], requires_array)
215
- end
151
+ Wedge.trigger_browser_events
216
152
 
217
- new_reqs << r
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[:file_path] = caller.first.gsub(/(?<=\.rb):.*/, '')
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
@@ -1,99 +1,73 @@
1
- module Wedge
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
- # Override the default new behaviour
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
- # Merge other args into opts
19
- args.each { |a| a.each {|k, v| obj.wedge_opts[k] = v } } if args.any?
8
+ def wedge_new(klass, *args, &block)
9
+ obj = allocate
20
10
 
21
- obj.wedge_opts.events.scope = obj
22
-
23
- # Set all the on events
24
- obj.wedge_opts.on.each do |*a, &b|
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 obj.wedge_opts.init
30
- if obj.wedge_opts.init.is_a? Array
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
- # don't need to wrap the method if it's opal
40
- unless RUBY_ENGINE == 'opal' || wedge_opts.methods_wrapped || wedge_opts.skip_method_wrap
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
- o_name = "wedge_original_#{meth}"
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
- if client? || method(o_name).parameters.length > 0
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
- # Append the initialize javscript
60
- if server? && meth == wedge_opts.method_called && opts.js
61
- result = result.to_html if result.is_a? DOM
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
- result
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
- if method_args.any?
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
- obj
52
+ original_name
81
53
  end
82
54
  end
83
-
84
- # Used to setup the component with default options.
85
- #
86
- # @example
87
- # class SomeComponent < Component
88
- # setup do |config|
89
- # config.name :some
90
- # end
91
- # end
92
- # @yield [Config]
93
- def wedge_setup(&block)
94
- block.call wedge_config
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 :setup, :wedge_setup
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
- wedge_opts.tmpl[name] = {
80
+ wedge_config.tmpl[name] = {
107
81
  dom: dom,
108
82
  html: dom.to_html
109
83
  }
110
- elsif t = wedge_opts.tmpl[name]
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 wedge_opts.html
122
- end
123
- alias_method :dom, :wedge_dom
94
+ def wedge_dom &block
95
+ @wedge_dom ||= DOM.new wedge_config.html
124
96
 
125
- # Shortcut for Wedge.components
126
- #
127
- # @return [Hash, Wedge.components]
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
- # Shortcut for the Config#opts
134
- #
135
- # @return [Openstruct, Config#opts]
136
- def wedge_opts
137
- wedge_config.opts
101
+ @wedge_dom
138
102
  end
139
- alias_method :opts, :wedge_opts
103
+ alias_method :dom, :wedge_dom
140
104
 
141
105
  def wedge_config
142
- @wedge_config ||= begin
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
- wedge_opts.on << [args, block]
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 wedge_opts.scope.respond_to?(method, true)
179
- wedge_opts.scope.send method, *args, &block
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
- wedge_opts.on_server_methods << meth.to_s
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
- wedge_opts.on_server_methods << meth.to_s
154
+ config.server_methods << meth.to_s
216
155
 
217
156
  define_method "#{meth}" do |*args, &blk|
218
- path_name = wedge_opts.path_name
219
- # event_id = "comp-event-#{$faye.generate_id}"
157
+ path_name = config.path
220
158
 
221
- payload = client_wedge_opts.reject do |k, _|
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
- call_url = "#{Wedge.assets_url}/#{path_name}.call"
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
- wedge_opts[:scope]
205
+ wedge_config.scope
259
206
  end
260
207
  alias_method :scope, :wedge_scope
261
208
 
262
- def wedge_cache
263
- wedge_opts[:cache]
209
+ def wedge_store
210
+ wedge_config.store
264
211
  end
265
- alias_method :cache, :wedge_cache
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 ||= begin
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
- compiled_opts = Base64.encode64 client_wedge_opts.to_json
346
- name = wedge_opts.file_path.gsub("#{Dir.pwd}/", '').gsub(/\.rb$/, '')
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('#{name}', JSON.parse(Base64.decode64('#{compiled_opts}')))
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 client_wedge_opts
356
- wedge_config.opts_dup.select {|k, v| ALLOWED_CLIENT_OPTS.include? k }
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 wedge_super *args, &block
366
- if server?
367
- caller_str = "#{caller[0]}"
368
- calling_method = (caller_str =~ /`([^']*)'/ and $1)
369
- self.class.superclass.instance_method(:"wedge_original_#{calling_method}").bind(self).call(*args, &block)
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 wedge_opts.scope.respond_to?(method, true)
383
- wedge_opts.scope.send method, *args, &block
304
+ if config.scope.respond_to?(method, true)
305
+ config.scope.send method, *args, &block
384
306
  else
385
307
  super
386
308
  end