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 +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
data/lib/wedge/config.rb
CHANGED
@@ -1,139 +1,61 @@
|
|
1
|
-
|
2
|
-
require 'wedge/events'
|
3
|
-
|
4
|
-
module Wedge
|
1
|
+
class Wedge
|
5
2
|
class Config
|
6
3
|
include Methods
|
7
4
|
|
8
5
|
# Stores the options for the config
|
9
6
|
#
|
10
7
|
# @return [OpenStruct]
|
11
|
-
attr_accessor :
|
8
|
+
attr_accessor :data
|
12
9
|
|
13
10
|
# Setup initial opts values
|
14
11
|
#
|
15
12
|
# @param opts [Hash] The initial params for #opts.
|
16
13
|
def initialize(opts = {})
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
@data = HashObject.new({
|
15
|
+
name: nil,
|
16
|
+
path: nil,
|
17
|
+
html: nil,
|
18
|
+
scope: nil,
|
19
|
+
debug: false,
|
20
|
+
assets_url: '/assets/wedge',
|
20
21
|
assets_key: false,
|
21
|
-
|
22
|
-
scope: false,
|
23
|
-
loaded: false,
|
24
|
-
requires: [],
|
25
|
-
skip_method_wrap: false,
|
26
|
-
on: [],
|
27
|
-
on_server_methods: [],
|
28
|
-
object_events: {},
|
22
|
+
cache_assets: false,
|
29
23
|
is_plugin: false,
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def name(*names)
|
41
|
-
names.each do |name|
|
42
|
-
opts.name = name.to_sym
|
43
|
-
opts.is_plugin = true if name.to_s =~ /_plugin$/
|
44
|
-
Wedge.components ||= {}
|
45
|
-
Wedge.components[opts.name] = opts
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def is_plugin?
|
50
|
-
opts.is_plugin
|
51
|
-
end
|
52
|
-
|
53
|
-
# Used to set and update the dom
|
54
|
-
def dom
|
55
|
-
if server?
|
56
|
-
yield
|
57
|
-
end
|
58
|
-
end
|
59
|
-
alias_method :setup, :dom
|
60
|
-
|
61
|
-
# Set the raw html
|
62
|
-
# @param html [String]
|
63
|
-
def html(html)
|
64
|
-
unless RUBY_ENGINE == 'opal'
|
65
|
-
opts.html = begin
|
66
|
-
File.read html
|
67
|
-
rescue
|
68
|
-
html
|
69
|
-
end.strip
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def requires(*args)
|
74
|
-
unless RUBY_ENGINE == 'opal'
|
75
|
-
args.each do |a|
|
76
|
-
if a.to_s[/_plugin$/]
|
77
|
-
require "wedge/plugins/#{a.to_s.gsub(/_plugin$/, '')}"
|
78
|
-
end
|
79
|
-
opts.requires << a
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def opts_dup
|
85
|
-
opts.to_h.inject({}) {|copy, (key, value)| copy[key] = value.dup rescue value; copy}
|
24
|
+
triggered_browser_events: false,
|
25
|
+
store: IndifferentHash.new,
|
26
|
+
settings: IndifferentHash.new,
|
27
|
+
tmpl: IndifferentHash.new,
|
28
|
+
on_block: [],
|
29
|
+
on_block_count: 0,
|
30
|
+
server_methods: [],
|
31
|
+
plugins: [],
|
32
|
+
allowed_client_data: %w(name path method_args method_called store tmpl key cache_assets assets_key assets_url assets_url_with_host)
|
33
|
+
}.merge(opts))
|
86
34
|
end
|
87
35
|
|
88
|
-
def
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
%w(scope assets_url assets_url_with_host cache_assets assets_key debug).each do |m|
|
93
|
-
define_method m do |v|
|
94
|
-
opts[m] = v
|
95
|
-
end
|
36
|
+
def client_data
|
37
|
+
@data.dup.select {|k, v| allowed_client_data.include? k }
|
96
38
|
end
|
97
39
|
|
98
40
|
def plugin(name)
|
99
41
|
unless RUBY_ENGINE == 'opal'
|
100
42
|
require "wedge/plugins/#{name}"
|
101
|
-
klass = Wedge.components[:"#{name}_plugin"].klass
|
102
|
-
Wedge::Component.include(klass::InstanceMethods) if defined?(klass::InstanceMethods)
|
103
|
-
Wedge::Component.extend(klass::ClassMethods) if defined?(klass::ClassMethods)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def get_requires(requires = false, previous_requires = [])
|
108
|
-
list = []
|
109
|
-
|
110
|
-
unless requires
|
111
|
-
requires ||= opts.requires.dup
|
112
|
-
previous_requires << opts.name.to_sym
|
113
43
|
end
|
114
44
|
|
115
|
-
|
45
|
+
klass = Wedge.config.component_class[:"#{name}_plugin"]
|
46
|
+
plugins << klass.config.path unless plugins.include? klass.config.path
|
116
47
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
raise "No component named: #{r}"
|
122
|
-
end
|
123
|
-
o = klass.client_wedge_opts.select do |k, v|
|
124
|
-
%w(path_name name requires).include? k.to_s
|
125
|
-
end
|
126
|
-
|
127
|
-
# We don't want to get a stack limit error so we stop something
|
128
|
-
# requiring itself
|
129
|
-
pr = previous_requires.dup << o[:name].to_sym
|
130
|
-
|
131
|
-
o[:requires] = get_requires o[:requires].dup, pr if o[:requires].present?
|
48
|
+
# Merge in instance/class methods
|
49
|
+
Wedge::Component.include(klass::InstanceMethods) if defined?(klass::InstanceMethods)
|
50
|
+
Wedge::Component.extend(klass::ClassMethods) if defined?(klass::ClassMethods)
|
51
|
+
end
|
132
52
|
|
133
|
-
|
53
|
+
def method_missing(method, *args, &block)
|
54
|
+
if @data.respond_to?(method, true)
|
55
|
+
@data.send method, *args, &block
|
56
|
+
else
|
57
|
+
super
|
134
58
|
end
|
135
|
-
|
136
|
-
list
|
137
59
|
end
|
138
60
|
end
|
139
61
|
end
|
data/lib/wedge/dom.rb
CHANGED
data/lib/wedge/events.rb
CHANGED
@@ -1,18 +1,32 @@
|
|
1
|
-
|
1
|
+
class Wedge
|
2
2
|
class Events
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :events
|
4
4
|
|
5
5
|
VIP_ORDER_LIST = %w(history_change)
|
6
6
|
|
7
7
|
def initialize
|
8
|
-
@
|
9
|
-
@object_events = {}
|
8
|
+
@events = IndifferentHash.new
|
10
9
|
end
|
11
10
|
|
12
|
-
def add(*args, &block)
|
11
|
+
def add(wedge_name, *args, &block)
|
12
|
+
event_name = args.shift
|
13
|
+
|
14
|
+
events = @events[wedge_name] ||= IndifferentHash.new({
|
15
|
+
browser_events: [],
|
16
|
+
object_events: IndifferentHash.new,
|
17
|
+
on_count: 0
|
18
|
+
})
|
19
|
+
|
20
|
+
# fix: there is a bug in opal where even though it's only including a
|
21
|
+
# module once it is loading the class twice. So this stops on events being
|
22
|
+
# double added
|
23
|
+
return if events[:on_count] >= Wedge[wedge_name].class.wedge_on_count
|
24
|
+
events[:on_count] += 1
|
25
|
+
|
13
26
|
event = {
|
14
|
-
name:
|
27
|
+
name: event_name,
|
15
28
|
block: block,
|
29
|
+
wedge_name: wedge_name,
|
16
30
|
options: {}
|
17
31
|
}
|
18
32
|
|
@@ -27,46 +41,43 @@ module Wedge
|
|
27
41
|
end
|
28
42
|
|
29
43
|
if %w(ready history_change).include?(event[:name].to_s) || event[:name] =~ /[:\s]/ || event[:selector]
|
30
|
-
browser_events << event
|
44
|
+
events[:browser_events] << event
|
31
45
|
else
|
32
|
-
event[:
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
events << event
|
38
|
-
else
|
39
|
-
events = object_events[event.delete(:name)] ||= []
|
40
|
-
events << event
|
46
|
+
if for_component = event[:options].delete(:for)
|
47
|
+
events = @events[for_component] ||= IndifferentHash.new({
|
48
|
+
browser_events: [],
|
49
|
+
object_events: IndifferentHash.new
|
50
|
+
})
|
41
51
|
end
|
52
|
+
|
53
|
+
(events[:object_events][event_name] ||= []) << event
|
42
54
|
end
|
43
55
|
end
|
44
56
|
|
45
|
-
def trigger(
|
46
|
-
|
47
|
-
options = options.indifferent
|
57
|
+
def trigger(wedge_name, event_name, *args)
|
58
|
+
event_name = event_name.to_s
|
48
59
|
|
49
|
-
|
60
|
+
return unless events = @events[wedge_name]
|
61
|
+
|
62
|
+
case event_name
|
50
63
|
when 'browser_events'
|
64
|
+
browser_events = events[:browser_events]
|
65
|
+
|
51
66
|
# We make sure anything in the VIP_ORDER_LIST goes first
|
52
67
|
(browser_events.sort_by do |x|
|
53
68
|
[VIP_ORDER_LIST.index(x[:name]) || VIP_ORDER_LIST.length, browser_events.index(x)]
|
54
69
|
end).each do |event|
|
55
|
-
trigger_browser_event event
|
70
|
+
trigger_browser_event wedge_name, event
|
56
71
|
end
|
57
72
|
else
|
58
|
-
|
59
|
-
|
60
|
-
events = wedge_events.concat(object_events[name] || [])
|
61
|
-
##################################################
|
62
|
-
events.each do |event|
|
63
|
-
Wedge[event[:component]].instance_exec options, &event[:block]
|
73
|
+
(events[:object_events][event_name] || []).each do |event|
|
74
|
+
Wedge[event[:wedge_name]].instance_exec(*args, &event[:block])
|
64
75
|
end
|
65
76
|
end
|
66
77
|
end
|
67
78
|
|
68
|
-
def trigger_browser_event event
|
69
|
-
comp = Wedge[
|
79
|
+
def trigger_browser_event wedge_name, event
|
80
|
+
comp = Wedge[wedge_name]
|
70
81
|
|
71
82
|
case
|
72
83
|
when event[:name].to_s == 'ready'
|
@@ -113,9 +124,9 @@ module Wedge
|
|
113
124
|
opts[:dom] = el
|
114
125
|
|
115
126
|
if opts && key = opts[:key]
|
116
|
-
form = Wedge[event[:options][:form],
|
127
|
+
form = Wedge[event[:options][:form], params_obj[key], opts]
|
117
128
|
else
|
118
|
-
form = Wedge[event[:options][:form],
|
129
|
+
form = Wedge[event[:options][:form], params_obj, opts]
|
119
130
|
end
|
120
131
|
|
121
132
|
el.find(opts[:error_selector] || '.field-error').remove
|
data/lib/wedge/html.rb
CHANGED
data/lib/wedge/opal.rb
CHANGED
data/lib/wedge/plugins/form.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'wedge/plugins/validations'
|
2
2
|
require 'forwardable'
|
3
3
|
|
4
|
-
|
4
|
+
class Wedge
|
5
5
|
module Plugins
|
6
6
|
class Form < Component
|
7
|
-
|
7
|
+
name :form_plugin
|
8
8
|
|
9
9
|
include Methods
|
10
10
|
include Validations
|
@@ -105,7 +105,7 @@ module Wedge
|
|
105
105
|
_form.each do |key, form_name|
|
106
106
|
opts = {}
|
107
107
|
if _data.respond_to?(key)
|
108
|
-
opts[key] = wedge(form_name,
|
108
|
+
opts[key] = wedge(form_name, _data.send(key))
|
109
109
|
end
|
110
110
|
@_attributes.set_values opts
|
111
111
|
|
@@ -155,7 +155,7 @@ module Wedge
|
|
155
155
|
atts[att] = _attributes.send(att)
|
156
156
|
|
157
157
|
if form_name = _form[att.to_s.to_sym]
|
158
|
-
atts[att] = wedge(form_name,
|
158
|
+
atts[att] = wedge(form_name, atts[att]).attributes
|
159
159
|
end
|
160
160
|
end
|
161
161
|
end
|
@@ -169,7 +169,7 @@ module Wedge
|
|
169
169
|
d = data[k]
|
170
170
|
d = d.attributes if d.is_a?(Form)
|
171
171
|
|
172
|
-
f = wedge(form_name,
|
172
|
+
f = wedge(form_name, d)
|
173
173
|
k = "#{k}_attributes"
|
174
174
|
dt = f.model_attributes
|
175
175
|
|
data/lib/wedge/plugins/pjax.rb
CHANGED
@@ -11,11 +11,12 @@ if RUBY_ENGINE == 'opal'
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
require 'wedge/plugins/history'
|
15
|
+
|
16
|
+
class Wedge
|
15
17
|
module Plugins
|
16
18
|
class Pjax < Component
|
17
|
-
|
18
|
-
config.requires :history_plugin
|
19
|
+
name :pjax, :pjax_plugin
|
19
20
|
|
20
21
|
def get href = false
|
21
22
|
`$(document).trigger('page:get')`
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class Wedge
|
2
2
|
module Plugins
|
3
3
|
class Form < Component
|
4
4
|
# Provides a base implementation for extensible validation routines.
|
@@ -134,7 +134,7 @@ module Wedge
|
|
134
134
|
options = {}
|
135
135
|
options[:key] = _options[:key] if _options.key? :key
|
136
136
|
|
137
|
-
f = wedge(form_name,
|
137
|
+
f = wedge(form_name, _attributes.send(att).attributes, options)
|
138
138
|
assert(f.valid?, [att, f.errors])
|
139
139
|
else
|
140
140
|
assert(!_attributes.send(att).to_s.empty?, error)
|
data/lib/wedge/utilis/hash.rb
CHANGED
@@ -16,6 +16,7 @@ class Hash
|
|
16
16
|
## create the setter that sets the instance variable
|
17
17
|
self.class.send(:define_method, "#{k}=", proc{|v| self.instance_variable_set("@#{k}", v)})
|
18
18
|
end
|
19
|
+
|
19
20
|
return self
|
20
21
|
end
|
21
22
|
|
@@ -75,3 +76,30 @@ class Hash
|
|
75
76
|
Wedge::IndifferentHash.new self
|
76
77
|
end
|
77
78
|
end
|
79
|
+
|
80
|
+
class HashObject
|
81
|
+
def initialize(hash = {})
|
82
|
+
hash.each do |k,v|
|
83
|
+
if v.kind_of? Hash
|
84
|
+
self.instance_variable_set("@#{k}", HashObject.new(v))
|
85
|
+
end
|
86
|
+
|
87
|
+
self.instance_variable_set("@#{k}", v)
|
88
|
+
self.class.send(:define_method, k, proc{self.instance_variable_get("@#{k}")})
|
89
|
+
self.class.send(:define_method, "#{k}=", proc{|vv| self.instance_variable_set("@#{k}", vv)})
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_h
|
94
|
+
hash_to_return = Wedge::IndifferentHash.new
|
95
|
+
self.instance_variables.each do |var|
|
96
|
+
value = self.instance_variable_get(var)
|
97
|
+
hash_to_return[var.to_s.gsub("@","")] = value.is_a?(HashObject) ? value.to_h : value
|
98
|
+
end
|
99
|
+
return hash_to_return
|
100
|
+
end
|
101
|
+
|
102
|
+
def dup
|
103
|
+
Wedge::IndifferentHash.new self.to_h.inject({}) {|copy, (key, value)| copy[key] = value.dup rescue value; copy}
|
104
|
+
end
|
105
|
+
end
|
data/lib/wedge/utilis/methods.rb
CHANGED