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 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