wedge 0.1.0 → 0.1.1
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/lib/roda/plugins/wedge.rb +4 -1
- data/lib/wedge.rb +33 -2
- data/lib/wedge/component.rb +7 -3
- data/lib/wedge/config.rb +1 -0
- data/lib/wedge/events.rb +2 -1
- data/lib/wedge/middleware.rb +104 -0
- data/lib/wedge/require.rb +47 -0
- data/lib/wedge/version.rb +1 -1
- data/test/dummy/components/layout.rb +2 -0
- data/test/dummy/components/root.rb +1 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0bb0fe7c7495477be902553128393527696afe1
|
4
|
+
data.tar.gz: 11a43824c93d96973043520a5429e73bc89f94df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 394f8a1cef109e32f546ea7d9166a67307f11ed6701739ce4feab23b9e7d6033397e0ef90b0e13b57a5311dd2e996ef6189452110f517c092eab5621924b007b
|
7
|
+
data.tar.gz: 49b95ed36fe62f5ab1fe7234e4bac2066d6f027c9dbea69082df961f091e2f5c5d50152fa5f5f4e419f4b05106cadf076078331bfa29d8f31d0fbd5ed8813eeb
|
data/lib/roda/plugins/wedge.rb
CHANGED
@@ -76,7 +76,10 @@ class Roda
|
|
76
76
|
method_args = [data]
|
77
77
|
res = scope.wedge(name).send(method_called, *method_args) || ''
|
78
78
|
else
|
79
|
-
|
79
|
+
# This used to send things like init, we need a better way to
|
80
|
+
# send client config data to the server
|
81
|
+
# res = scope.wedge(name, data).send(method_called, *method_args) || ''
|
82
|
+
res = scope.wedge(name).send(method_called, *method_args) || ''
|
80
83
|
end
|
81
84
|
|
82
85
|
scope.response.headers["WEDGE-CSRF-TOKEN"] = scope.csrf_token if scope.methods.include? :csrf_token
|
data/lib/wedge.rb
CHANGED
@@ -11,6 +11,7 @@ require 'base64'
|
|
11
11
|
unless RUBY_ENGINE == 'opal'
|
12
12
|
require 'nokogiri'
|
13
13
|
require 'wedge/utilis/nokogiri'
|
14
|
+
require 'wedge/middleware'
|
14
15
|
end
|
15
16
|
require 'wedge/html'
|
16
17
|
require 'wedge/dom'
|
@@ -31,6 +32,19 @@ class Wedge
|
|
31
32
|
"#{url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
|
32
33
|
end
|
33
34
|
|
35
|
+
def requires
|
36
|
+
@requires ||= IndifferentHash.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def assets_url_regex
|
40
|
+
@assets_url_regex ||= begin
|
41
|
+
assets_url = ::Wedge.assets_url.gsub(%r{^\/}, '')
|
42
|
+
# # We also allow for no assets key so when we post server methods there
|
43
|
+
# # isn't an error if the key has been changed since a browser refresh.
|
44
|
+
%r{(?:#{assets_url}|#{assets_url.sub("#{::Wedge.config.assets_key}/", '')})/(.*)\.(.*)$}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
34
48
|
def assets_url_with_host
|
35
49
|
"#{config.assets_url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
|
36
50
|
end
|
@@ -126,11 +140,28 @@ class Wedge
|
|
126
140
|
compiled_data = Base64.encode64 config.client_data.to_json
|
127
141
|
# We need to merge in some data that is only set on the server.
|
128
142
|
# i.e. path, assets_key etc....
|
129
|
-
js << Opal.compile("Wedge.config.data = HashObject.new(JSON.parse(Base64.decode64('#{compiled_data}'))
|
143
|
+
js << Opal.compile("Wedge.config.data = HashObject.new(Wedge.config.data.to_h.merge JSON.parse(Base64.decode64('#{compiled_data}')))")
|
130
144
|
# load all global plugins into wedge
|
131
145
|
config.plugins.each do |path|
|
132
146
|
js << Wedge.javascript(path)
|
133
147
|
end
|
148
|
+
elsif comp_class = Wedge.config.component_class[path_name.gsub(/\//, '__')]
|
149
|
+
comp_name = comp_class.config.name
|
150
|
+
compiled_data = Base64.encode64 comp_class.config.client_data.to_json
|
151
|
+
|
152
|
+
js << Opal.compile("Wedge.config.component_class[:#{comp_name}].config.data = HashObject.new(Wedge.config.component_class[:#{comp_name}].config.data.to_h.merge JSON.parse(Base64.decode64('#{compiled_data}')))")
|
153
|
+
|
154
|
+
if requires = config.requires[path_name.gsub(/\//, '__')]
|
155
|
+
|
156
|
+
requires.each do |path|
|
157
|
+
next unless comp_class = Wedge.config.component_class[path]
|
158
|
+
|
159
|
+
comp_name = comp_class.config.name
|
160
|
+
compiled_data = Base64.encode64 comp_class.config.client_data.to_json
|
161
|
+
|
162
|
+
js << Opal.compile("Wedge.config.component_class[:#{comp_name}].config.data = HashObject.new(Wedge.config.component_class[:#{comp_name}].config.data.to_h.merge JSON.parse(Base64.decode64('#{compiled_data}')))")
|
163
|
+
end
|
164
|
+
end
|
134
165
|
end
|
135
166
|
|
136
167
|
js
|
@@ -159,7 +190,7 @@ class Wedge
|
|
159
190
|
args = { klass: self, component_class: IndifferentHash.new }
|
160
191
|
|
161
192
|
unless RUBY_ENGINE == 'opal'
|
162
|
-
args[:path] = caller.first.gsub(/(?<=\.rb):.*/, '')
|
193
|
+
# args[:path] = caller.first.gsub(/(?<=\.rb):.*/, '')
|
163
194
|
args[:assets_key] = begin
|
164
195
|
if defined?(PlatformAPI) && ENV['HEROKU_TOKEN'] && ENV['HEROKU_APP']
|
165
196
|
heroku = PlatformAPI.connect_oauth(ENV['HEROKU_TOKEN'], default_headers: {'Range' => 'version ..; order=desc'})
|
data/lib/wedge/component.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'wedge/require'
|
2
|
+
|
1
3
|
class Wedge
|
2
4
|
class Component
|
3
5
|
include Methods
|
@@ -94,8 +96,10 @@ class Wedge
|
|
94
96
|
def wedge_dom &block
|
95
97
|
@wedge_dom ||= DOM.new wedge_config.html
|
96
98
|
|
97
|
-
|
98
|
-
|
99
|
+
unless RUBY_ENGINE == 'opal'
|
100
|
+
if block_given?
|
101
|
+
yield
|
102
|
+
end
|
99
103
|
end
|
100
104
|
|
101
105
|
@wedge_dom
|
@@ -166,7 +170,7 @@ class Wedge
|
|
166
170
|
# we want to remove the assets key from the call so we don't get
|
167
171
|
# an error if they assets_key has changed and the user hasn't
|
168
172
|
# refreshed the browser yet.
|
169
|
-
call_url = "#{Wedge.assets_url.sub("#{Wedge.config.assets_key}/")}/#{path_name}.call"
|
173
|
+
call_url = "#{Wedge.assets_url.sub("#{Wedge.config.assets_key}/",'')}/#{path_name}.call"
|
170
174
|
|
171
175
|
HTTP.post(call_url,
|
172
176
|
headers: {
|
data/lib/wedge/config.rb
CHANGED
data/lib/wedge/events.rb
CHANGED
@@ -0,0 +1,104 @@
|
|
1
|
+
class Wedge
|
2
|
+
class Middleware
|
3
|
+
def initialize(app, settings = {})
|
4
|
+
@app = app
|
5
|
+
|
6
|
+
# Add settings to wedge
|
7
|
+
settings.each do |k, v|
|
8
|
+
Wedge.config.send "#{k}=", v
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
responder = Responder.new(@app, env)
|
14
|
+
responder.respond
|
15
|
+
end
|
16
|
+
|
17
|
+
class Responder
|
18
|
+
attr_accessor :app, :env, :wedge_path, :extension
|
19
|
+
|
20
|
+
def initialize(app, env)
|
21
|
+
@app = app; @env = env
|
22
|
+
end
|
23
|
+
|
24
|
+
def respond
|
25
|
+
if path =~ Wedge.assets_url_regex
|
26
|
+
@wedge_path, @extension = $1, $2
|
27
|
+
body, headers, status = [], {}, 200
|
28
|
+
|
29
|
+
case extension
|
30
|
+
when 'map'
|
31
|
+
::Wedge.source_map wedge_path
|
32
|
+
when 'rb'
|
33
|
+
if wedge_path =~ /^wedge/
|
34
|
+
path = ::Wedge.config.path.gsub(/\/wedge.rb$/, '')
|
35
|
+
File.read("#{path}/#{wedge_path}.rb")
|
36
|
+
else
|
37
|
+
File.read("#{ROOT_PATH}/#{wedge_path}.rb")
|
38
|
+
end if Wedge.config.debug
|
39
|
+
when 'call'
|
40
|
+
body = scope.request.body.read
|
41
|
+
data = scope.request.params
|
42
|
+
|
43
|
+
begin
|
44
|
+
data.merge!(body ? JSON.parse(body) : {})
|
45
|
+
rescue
|
46
|
+
# can't be parsed by json
|
47
|
+
end
|
48
|
+
|
49
|
+
data = data.indifferent
|
50
|
+
name = data.delete(:wedge_name)
|
51
|
+
method_called = data.delete(:wedge_method_called)
|
52
|
+
method_args = data.delete(:wedge_method_args)
|
53
|
+
|
54
|
+
if method_args == 'wedge_data' && data
|
55
|
+
method_args = [data]
|
56
|
+
res = Wedge.scope!(app)[name].send(method_called, *method_args) || ''
|
57
|
+
else
|
58
|
+
res = Wedge.scope!(app)[name, data].send(method_called, *method_args) || ''
|
59
|
+
end
|
60
|
+
|
61
|
+
headers["WEDGE-CSRF-TOKEN"] = scope.csrf_token if scope.methods.include? :csrf_token
|
62
|
+
|
63
|
+
if res.is_a? Hash
|
64
|
+
headers["Content-Type"] = 'application/json; charset=UTF-8'
|
65
|
+
body = res.to_json
|
66
|
+
else
|
67
|
+
body = res.to_s
|
68
|
+
end
|
69
|
+
else
|
70
|
+
headers['Content-Type'] = 'application/javascript; charset=UTF-8'
|
71
|
+
|
72
|
+
if Wedge.config.debug
|
73
|
+
body << "#{Wedge.javascript(wedge_path)}\n//# sourceMappingURL=#{Wedge.assets_url}/#{wedge_path}.map"
|
74
|
+
else
|
75
|
+
binding.pry
|
76
|
+
body << Wedge.javascript(wedge_path)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
[status, headers, body.join]
|
81
|
+
else
|
82
|
+
response.finish
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def path
|
89
|
+
@env['PATH_INFO']
|
90
|
+
end
|
91
|
+
|
92
|
+
def request
|
93
|
+
@request ||= Rack::Request.new(@env)
|
94
|
+
end
|
95
|
+
|
96
|
+
def response
|
97
|
+
@response ||= begin
|
98
|
+
status, headers, body = @app.call(request.env)
|
99
|
+
Rack::Response.new(body, status, headers)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
unless RUBY_ENGINE == 'opal'
|
2
|
+
module Kernel
|
3
|
+
# make an alias of the original require
|
4
|
+
alias_method :wedge_original_require, :require
|
5
|
+
|
6
|
+
# rewrite require
|
7
|
+
def require(name)
|
8
|
+
return wedge_original_require(name) unless defined?(Wedge)
|
9
|
+
|
10
|
+
result = wedge_original_require name
|
11
|
+
|
12
|
+
if name[/\Awedge/] || name[Dir.pwd]
|
13
|
+
name = name.sub("#{Dir.pwd}/", '').gsub(/\.rb$/, '').gsub(/\//, '__')
|
14
|
+
caller_str = "#{caller[0]}".gsub(/(#{Dir.pwd}\/|.*(?=wedge))/, '').gsub(/:.+$/, '').gsub(/\.rb$/, '').gsub(/\//, '__')
|
15
|
+
|
16
|
+
if !caller_str['.'] && !(Wedge.config.requires[caller_str] ||= []).include?(name)
|
17
|
+
Wedge.config.requires[caller_str] << name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
result
|
22
|
+
end
|
23
|
+
|
24
|
+
# make an alias of the original require
|
25
|
+
alias_method :wedge_original_require_relative, :require_relative
|
26
|
+
|
27
|
+
# rewrite require_relative
|
28
|
+
def require_relative(name)
|
29
|
+
return wedge_original_require_relative(name) unless defined?(Wedge)
|
30
|
+
|
31
|
+
caller_str = "#{caller[0]}".gsub(/:.+$/, '').gsub(/\.rb$/, '')
|
32
|
+
caller_path_name = caller_str.gsub(%r{(#{Dir.pwd}/|.*wedge)}, '').gsub(/:.+$/, '').gsub(/^\//, '')
|
33
|
+
|
34
|
+
path_name = caller_path_name.gsub(/(?<=\/)([^\/]*)$/, "#{name}")
|
35
|
+
path_name = File.expand_path(path_name).sub("#{Dir.pwd}/", '') if path_name['..']
|
36
|
+
path_name = path_name.gsub(/\//, '__')
|
37
|
+
file = caller_str.gsub(/(?<=\/)([^\/]*)$/, "#{name}")
|
38
|
+
caller_path_name = caller_path_name.gsub(/\//, '__')
|
39
|
+
|
40
|
+
if !caller_path_name['.'] && !(Wedge.config.requires[caller_path_name] ||= []).include?(path_name)
|
41
|
+
Wedge.config.requires[caller_path_name] << path_name
|
42
|
+
end
|
43
|
+
|
44
|
+
wedge_original_require file
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/wedge/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wedge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|
@@ -169,12 +169,14 @@ files:
|
|
169
169
|
- lib/wedge/dom.rb
|
170
170
|
- lib/wedge/events.rb
|
171
171
|
- lib/wedge/html.rb
|
172
|
+
- lib/wedge/middleware.rb
|
172
173
|
- lib/wedge/opal.rb
|
173
174
|
- lib/wedge/plugins/form.rb
|
174
175
|
- lib/wedge/plugins/history.rb
|
175
176
|
- lib/wedge/plugins/location.rb
|
176
177
|
- lib/wedge/plugins/pjax.rb
|
177
178
|
- lib/wedge/plugins/validations.rb
|
179
|
+
- lib/wedge/require.rb
|
178
180
|
- lib/wedge/utilis/blank.rb
|
179
181
|
- lib/wedge/utilis/element.rb
|
180
182
|
- lib/wedge/utilis/hash.rb
|
@@ -218,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
218
220
|
version: '0'
|
219
221
|
requirements: []
|
220
222
|
rubyforge_project:
|
221
|
-
rubygems_version: 2.
|
223
|
+
rubygems_version: 2.4.3
|
222
224
|
signing_key:
|
223
225
|
specification_version: 4
|
224
226
|
summary: Components for the Browser and Server
|