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