opal-connect 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opal/connect.rb +79 -37
- data/lib/opal/connect/plugins/dom.rb +84 -42
- data/lib/opal/connect/plugins/events.rb +5 -2
- data/lib/opal/connect/plugins/scope.rb +29 -0
- data/lib/opal/connect/plugins/server.rb +6 -5
- data/lib/opal/connect/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8eb1755efb4187fb0fe313046b83862a7943ac3
|
4
|
+
data.tar.gz: fd330a60e16e736d1e5cb29e402ef3b83233a761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bce04a189804b540bd3382d6de3722ce6e177dd9e7c8b98e2d1e720cc9f9dabf392bf14dd45f60eb7d1a9ec3ef3ed15f75dc47006b9b7e643532857e13cfdc3d
|
7
|
+
data.tar.gz: fecc33e53a01ddffb92dea830892eee8f7578d216524011fe3a3f855ea46bfaee70c4086272f136ee287010dbddc83398f17d94bea00305ec56e5ca6c44efe52
|
data/lib/opal/connect.rb
CHANGED
@@ -13,15 +13,33 @@ end
|
|
13
13
|
# Opal corelib is already loaded from CDN
|
14
14
|
module Opal
|
15
15
|
module Connect
|
16
|
+
|
17
|
+
CLIENT_OPTIONS = %w'url plugins' unless RUBY_ENGINE == 'opal'
|
18
|
+
|
16
19
|
class << self
|
17
|
-
def
|
18
|
-
@options ||= Connect::ConnectCache.new(
|
20
|
+
def options
|
21
|
+
@options ||= Connect::ConnectCache.new(
|
22
|
+
hot_reload: false,
|
23
|
+
url: '/connect',
|
24
|
+
plugins: []
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def options=(opts)
|
29
|
+
@options = opts
|
30
|
+
end if RUBY_ENGINE == 'opal'
|
19
31
|
|
20
|
-
|
32
|
+
def setup
|
33
|
+
yield(options) if block_given?
|
21
34
|
|
22
|
-
|
35
|
+
# make sure we include the default plugins with connect
|
36
|
+
options[:plugins].each { |plug| Connect.plugin plug.to_sym }
|
37
|
+
|
38
|
+
unless RUBY_ENGINE == 'opal'
|
39
|
+
write_plugins_file
|
40
|
+
write_entry_file
|
41
|
+
end
|
23
42
|
end
|
24
|
-
alias options __options__
|
25
43
|
|
26
44
|
def included(klass)
|
27
45
|
if RUBY_ENGINE != 'opal'
|
@@ -30,19 +48,21 @@ module Opal
|
|
30
48
|
end
|
31
49
|
|
32
50
|
klass.extend ConnectPlugins::Base::ClassMethods
|
33
|
-
|
34
|
-
|
35
|
-
klass.plugin
|
36
|
-
klass.plugin :events
|
51
|
+
|
52
|
+
# include default plugins
|
53
|
+
Connect.options[:plugins].each { |plug| klass.plugin plug.to_sym }
|
37
54
|
end
|
38
55
|
|
56
|
+
# We need to wripte a plugins.rb file which has all the plugins required
|
57
|
+
# by the server, so that the client can require them. Opal doesn't handle
|
58
|
+
# dynamically generated imports, which is the reason we make a single file.
|
39
59
|
def write_plugins_file
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
60
|
+
path = "#{Dir.pwd}/.connect/plugins.rb"
|
61
|
+
FileUtils.mkdir_p(File.dirname(path))
|
62
|
+
File.open(path, 'w+') do |file|
|
63
|
+
ConnectPlugins.plugins.each do |name, _|
|
64
|
+
file.puts "require 'opal/connect/plugins/#{name}'"
|
65
|
+
end
|
46
66
|
end
|
47
67
|
end
|
48
68
|
end
|
@@ -78,6 +98,14 @@ module Opal
|
|
78
98
|
@mutex.synchronize { @hash.to_json }
|
79
99
|
end
|
80
100
|
|
101
|
+
def hash
|
102
|
+
if RUBY_ENGINE == 'opal'
|
103
|
+
@hash
|
104
|
+
else
|
105
|
+
@mutex.synchronize { @hash }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
81
109
|
def each
|
82
110
|
if RUBY_ENGINE == 'opal'
|
83
111
|
@hash.each { |key, value| yield key, value }
|
@@ -152,8 +180,8 @@ module Opal
|
|
152
180
|
plugin.load_dependencies(self, *args, &block) if plugin.respond_to?(:load_dependencies)
|
153
181
|
include(plugin::InstanceMethods) if defined?(plugin::InstanceMethods)
|
154
182
|
extend(plugin::ClassMethods) if defined?(plugin::ClassMethods)
|
155
|
-
|
156
|
-
|
183
|
+
Connect.extend(plugin::ConnectClassMethods) if defined?(plugin::ConnectClassMethods)
|
184
|
+
Connect.include(plugin::ConnectInstanceMethods) if defined?(plugin::ConnectInstanceMethods)
|
157
185
|
plugin.configure(self, *args, &block) if plugin.respond_to?(:configure)
|
158
186
|
nil
|
159
187
|
end
|
@@ -166,21 +194,13 @@ module Opal
|
|
166
194
|
def build(code)
|
167
195
|
builder = Opal::Builder.new
|
168
196
|
|
169
|
-
builder.build_str(code, '(inline)'
|
170
|
-
, dynamic_require_severity: :ignore).to_s
|
197
|
+
builder.build_str(code, '(inline)').to_s
|
171
198
|
end
|
172
199
|
|
173
200
|
def javascript(klass, method, *options)
|
174
|
-
|
175
|
-
required_files = Connect.files.map do |file|
|
176
|
-
"`require('#{file}')`"
|
177
|
-
end.join(';')
|
178
|
-
end
|
201
|
+
return unless klass
|
179
202
|
|
180
203
|
%{
|
181
|
-
#{!hot_reload ? '' : 'Opal::Connect.events_teardown'}
|
182
|
-
#{!hot_reload ? '' : required_files}
|
183
|
-
|
184
204
|
Opal::Connect.server_methods = JSON.parse(
|
185
205
|
Base64.decode64('#{Base64.encode64 Connect.server_methods.to_json}')
|
186
206
|
)
|
@@ -197,17 +217,41 @@ module Opal
|
|
197
217
|
}
|
198
218
|
end
|
199
219
|
|
200
|
-
def write_entry_file(klass, method, *options)
|
220
|
+
def write_entry_file(klass = false, method = false, *options)
|
201
221
|
Opal.use_gem 'opal-jquery'
|
202
222
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
223
|
+
path = "#{Dir.pwd}/.connect/entry.js"
|
224
|
+
|
225
|
+
required_files = Connect.files.map do |file|
|
226
|
+
"`require('#{file}')`"
|
227
|
+
end.join(';')
|
228
|
+
|
229
|
+
client_options = Connect.options.hash.select do |key, _|
|
230
|
+
CLIENT_OPTIONS.include? key.to_s
|
231
|
+
end
|
232
|
+
|
233
|
+
client_options = Base64.encode64 client_options.to_json
|
234
|
+
templates = Base64.encode64 Connect.templates.hash.to_json
|
235
|
+
|
236
|
+
code = "Opal::Connect.options = JSON.parse(Base64.decode64('#{client_options}'));"
|
237
|
+
code = "#{code} Opal::Connect.setup;"
|
238
|
+
code = "#{code} Opal::Connect.templates = JSON.parse(Base64.decode64('#{templates}'));"
|
239
|
+
|
240
|
+
if !Connect.options[:hot_reload]
|
241
|
+
code = "#{code} #{required_files}"
|
242
|
+
else
|
243
|
+
code << %{
|
244
|
+
`if (module.hot) {`
|
245
|
+
`module.hot.accept()`
|
246
|
+
#{required_files}
|
247
|
+
Opal::Connect.events_teardown
|
248
|
+
#{Connect.javascript(klass, method, *options)}
|
249
|
+
`}`
|
250
|
+
}
|
251
|
+
end
|
209
252
|
|
210
|
-
|
253
|
+
FileUtils.mkdir_p(File.dirname(path))
|
254
|
+
File.write(path, build(code))
|
211
255
|
end
|
212
256
|
end
|
213
257
|
end
|
@@ -220,7 +264,5 @@ module Opal
|
|
220
264
|
|
221
265
|
extend ConnectPlugins::Base::ClassMethods
|
222
266
|
plugin ConnectPlugins::Base
|
223
|
-
plugin :server
|
224
|
-
plugin :events
|
225
267
|
end
|
226
268
|
end
|
@@ -9,45 +9,72 @@ module Opal
|
|
9
9
|
# A thread safe cache class, offering only #[] and #[]= methods,
|
10
10
|
# each protected by a mutex.
|
11
11
|
module Dom
|
12
|
-
|
12
|
+
module ConnectClassMethods
|
13
|
+
def templates
|
14
|
+
@templates ||= ConnectCache.new
|
15
|
+
end
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
path
|
17
|
+
if RUBY_ENGINE == 'opal'
|
18
|
+
def templates=(tmpls)
|
19
|
+
@templates = tmpls
|
20
|
+
end
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
|
23
|
-
if
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
module ClassMethods
|
25
|
+
if RUBY_ENGINE != 'opal'
|
26
|
+
def html_file(caller)
|
27
|
+
path = "#{Dir.pwd}/.connect/html/#{caller[0][/[^:]*/].sub(Dir.pwd, '')[1..-1].sub('.rb', '.html')}"
|
28
|
+
FileUtils.mkdir_p(File.dirname(path))
|
29
|
+
path
|
30
|
+
end
|
27
31
|
end
|
28
|
-
end
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
else
|
34
|
-
file_name = html_file(caller)
|
33
|
+
def cache
|
34
|
+
@cache ||= (Connect.templates[self.name] ||= {})
|
35
|
+
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
def html(scope = false, &block)
|
38
|
+
if !block_given?
|
39
|
+
HTML::DSL.html(&scope).to_html
|
40
|
+
else
|
41
|
+
HTML::DSL.scope!(scope).html(&block).to_html
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
|
45
|
+
def dom
|
46
|
+
if RUBY_ENGINE == 'opal'
|
47
|
+
selector = 'html'
|
48
|
+
else
|
49
|
+
selector = false
|
50
|
+
end
|
51
|
+
|
52
|
+
@dom ||= Instance.new false, cache
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module InstanceMethods
|
57
|
+
def cache
|
58
|
+
self.class.cache
|
59
|
+
end
|
60
|
+
|
61
|
+
def dom
|
62
|
+
if RUBY_ENGINE == 'opal'
|
63
|
+
selector = 'html'
|
64
|
+
else
|
65
|
+
selector = cache[:html]
|
66
|
+
end
|
67
|
+
|
68
|
+
@dom ||= Instance.new selector, cache
|
69
|
+
end
|
43
70
|
end
|
44
71
|
|
45
72
|
class Instance
|
46
|
-
attr_reader :selector, :
|
73
|
+
attr_reader :selector, :cache, :dom
|
47
74
|
|
48
|
-
def initialize(selector,
|
49
|
-
@selector
|
50
|
-
@
|
75
|
+
def initialize(selector, cache)
|
76
|
+
@selector = selector
|
77
|
+
@cache = cache
|
51
78
|
|
52
79
|
if selector.is_a?(String)
|
53
80
|
if RUBY_ENGINE == 'opal'
|
@@ -57,7 +84,7 @@ module Opal
|
|
57
84
|
if selector["\n"]
|
58
85
|
@dom = Oga.parse_html(selector)
|
59
86
|
else
|
60
|
-
@dom =
|
87
|
+
@dom = cache[:html]
|
61
88
|
@dom = dom.css(selector) unless selector == 'html'
|
62
89
|
end
|
63
90
|
end
|
@@ -66,15 +93,34 @@ module Opal
|
|
66
93
|
end
|
67
94
|
end
|
68
95
|
|
69
|
-
|
70
|
-
|
96
|
+
def set html
|
97
|
+
@dom = Instance.new(html, cache)
|
98
|
+
end
|
99
|
+
alias set! set
|
100
|
+
|
101
|
+
def save template_name = false, remove = true
|
102
|
+
if template_name
|
103
|
+
cache[:"#{template_name}"] = self.to_html
|
104
|
+
dom.remove if remove
|
105
|
+
else
|
106
|
+
cache[:html] = self.to_html
|
107
|
+
end
|
108
|
+
end
|
109
|
+
alias save! save
|
110
|
+
|
111
|
+
def to_html
|
112
|
+
if RUBY_ENGINE == 'opal'
|
113
|
+
node.html
|
114
|
+
else
|
71
115
|
if node.respond_to?(:first)
|
72
116
|
node.first.to_xml
|
73
117
|
else
|
74
118
|
node.to_xml
|
75
119
|
end
|
76
120
|
end
|
121
|
+
end
|
77
122
|
|
123
|
+
if RUBY_ENGINE != 'opal'
|
78
124
|
def to_s
|
79
125
|
if dom.respond_to?(:first)
|
80
126
|
dom.first.to_xml
|
@@ -83,16 +129,6 @@ module Opal
|
|
83
129
|
end
|
84
130
|
end
|
85
131
|
|
86
|
-
def save template_name = false, remove = true
|
87
|
-
if template_name
|
88
|
-
File.write("#{file_name}.#{template_name.to_s}", self.to_html)
|
89
|
-
dom.remove if remove
|
90
|
-
else
|
91
|
-
File.write(file_name, self.to_html)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
alias save! save
|
95
|
-
|
96
132
|
def text(content)
|
97
133
|
if node.respond_to?(:inner_text)
|
98
134
|
node.inner_text = content
|
@@ -132,6 +168,14 @@ module Opal
|
|
132
168
|
end
|
133
169
|
end
|
134
170
|
|
171
|
+
def tmpl(name)
|
172
|
+
if cached_tmpl = cache[:"#{name}"]
|
173
|
+
Instance.new(cached_tmpl, cache)
|
174
|
+
else
|
175
|
+
puts "There is no template `#{name}`"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
135
179
|
def append(content, &block)
|
136
180
|
# content becomes scope in this case
|
137
181
|
content = HTML::DSL.scope!(content).html(&block).to_html if block_given?
|
@@ -212,11 +256,11 @@ module Opal
|
|
212
256
|
end
|
213
257
|
end
|
214
258
|
|
215
|
-
Instance.new(new_node,
|
259
|
+
Instance.new(new_node, cache)
|
216
260
|
end
|
217
261
|
|
218
262
|
def each
|
219
|
-
node.each { |n| yield Instance.new(n,
|
263
|
+
node.each { |n| yield Instance.new(n, cache) }
|
220
264
|
end
|
221
265
|
|
222
266
|
def node
|
@@ -243,5 +287,3 @@ module Opal
|
|
243
287
|
end
|
244
288
|
end
|
245
289
|
end
|
246
|
-
|
247
|
-
Dom = Opal::Connect::ConnectPlugins::Dom
|
@@ -9,18 +9,21 @@ module Opal
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def __events_el__ el = false
|
13
13
|
@connect_el = el if el
|
14
14
|
@connect_el
|
15
15
|
end
|
16
|
+
alias events_el __events_el__
|
16
17
|
|
17
|
-
|
18
|
+
|
19
|
+
def __on__(name, selector = nil, method = nil, &handler)
|
18
20
|
if RUBY_ENGINE == 'opal'
|
19
21
|
handler = proc { |evt| __send__(method, evt) } if method
|
20
22
|
event = [name, selector, handler]
|
21
23
|
connect_events << event unless connect_events.include? event
|
22
24
|
end
|
23
25
|
end
|
26
|
+
alias on __on__
|
24
27
|
end
|
25
28
|
|
26
29
|
if RUBY_ENGINE == 'opal'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Opal
|
2
|
+
module Connect
|
3
|
+
module ConnectPlugins
|
4
|
+
module Scope
|
5
|
+
module InstanceMethods
|
6
|
+
def scope(new_scope = false)
|
7
|
+
if new_scope
|
8
|
+
@scope = new_scope
|
9
|
+
|
10
|
+
self
|
11
|
+
else
|
12
|
+
@scope
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(method, *args, &block)
|
17
|
+
if scope.respond_to?(method, true)
|
18
|
+
scope.send(method, *args, &block)
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
register_plugin :scope, Scope
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -17,7 +17,7 @@ module Opal
|
|
17
17
|
Connect.server_methods[self.name] ||= []
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def __server__(m = false, &block)
|
21
21
|
return if RUBY_ENGINE == 'opal'
|
22
22
|
|
23
23
|
m ||= Module.new(&block)
|
@@ -28,10 +28,11 @@ module Opal
|
|
28
28
|
connect_server_methods << meth unless connect_server_methods.include? meth
|
29
29
|
end
|
30
30
|
end
|
31
|
+
alias server __server__
|
31
32
|
end
|
32
33
|
|
33
|
-
module
|
34
|
-
def
|
34
|
+
module InstanceMethods
|
35
|
+
def __server__(method, *args)
|
35
36
|
if Connect.server_methods[self.class.name].include? method
|
36
37
|
promise = Promise.new
|
37
38
|
|
@@ -41,7 +42,7 @@ module Opal
|
|
41
42
|
klass: self.class.name
|
42
43
|
}
|
43
44
|
|
44
|
-
HTTP.post(
|
45
|
+
HTTP.post(Connect.options[:url], payload: payload) do |response|
|
45
46
|
if response.ok?
|
46
47
|
res = JSON.from_object(`response`)
|
47
48
|
promise.resolve res[:body], response
|
@@ -55,7 +56,7 @@ module Opal
|
|
55
56
|
raise "#{method} is not a server method"
|
56
57
|
end
|
57
58
|
end
|
58
|
-
alias
|
59
|
+
alias server __server__
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
data/lib/opal/connect/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal-connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- lib/opal/connect/plugins/dom.rb
|
97
97
|
- lib/opal/connect/plugins/events.rb
|
98
98
|
- lib/opal/connect/plugins/html.rb
|
99
|
+
- lib/opal/connect/plugins/scope.rb
|
99
100
|
- lib/opal/connect/plugins/server.rb
|
100
101
|
- lib/opal/connect/version.rb
|
101
102
|
- opal-connect.gemspec
|