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.
data/lib/wedge/config.rb CHANGED
@@ -1,139 +1,61 @@
1
- require 'ostruct'
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 :opts
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
- opts = {
18
- cache_assets: false,
19
- cache: IndifferentHash.new,
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
- tmpl: IndifferentHash.new,
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
- assets_url: '/assets/wedge',
31
- plugins: []
32
- }.merge opts
33
-
34
- @opts = OpenStruct.new(opts)
35
- end
36
-
37
- # Set the unique name of the component
38
- #
39
- # @param name [<String, Symbol>, #to_sym]
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 skip_method_wrap
89
- opts.skip_method_wrap = true
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
- previous_requires.each { |p| requires.delete(p) }
45
+ klass = Wedge.config.component_class[:"#{name}_plugin"]
46
+ plugins << klass.config.path unless plugins.include? klass.config.path
116
47
 
117
- requires.each do |r|
118
- begin
119
- klass = Wedge.components[r.to_sym].klass
120
- rescue
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
- list << o
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
@@ -1,4 +1,4 @@
1
- module Wedge
1
+ class Wedge
2
2
  class DOM
3
3
  include Methods
4
4
 
data/lib/wedge/events.rb CHANGED
@@ -1,18 +1,32 @@
1
- module Wedge
1
+ class Wedge
2
2
  class Events
3
- attr_accessor :scope, :browser_events, :object_events
3
+ attr_accessor :events
4
4
 
5
5
  VIP_ORDER_LIST = %w(history_change)
6
6
 
7
7
  def initialize
8
- @browser_events = []
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: args.shift,
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[:component] = scope.wedge_opts.name
33
-
34
- if !scope.class.wedge_opts.added_class_events && for_component = event[:options].delete(:for)
35
- wedge_opts = Wedge.components[for_component].klass.wedge_opts
36
- events = wedge_opts.object_events[event.delete(:name)] ||= []
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(name, options = {})
46
- name = name.to_s
47
- options = options.indifferent
57
+ def trigger(wedge_name, event_name, *args)
58
+ event_name = event_name.to_s
48
59
 
49
- case name
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
- # fix: we need to change the way events are stored
59
- wedge_events = (Wedge.components[scope.wedge_opts.name].klass.wedge_opts.object_events[name] || [])
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[scope.wedge_opts.name]
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], init: [params_obj[key], opts]]
127
+ form = Wedge[event[:options][:form], params_obj[key], opts]
117
128
  else
118
- form = Wedge[event[:options][:form], init: [params_obj, opts]]
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
@@ -1,4 +1,4 @@
1
- module Wedge
1
+ class Wedge
2
2
  module HTML
3
3
  include Methods
4
4
 
data/lib/wedge/opal.rb CHANGED
@@ -12,7 +12,7 @@ unless RUBY_ENGINE == 'opal'
12
12
  end
13
13
  end
14
14
 
15
- module Wedge
15
+ class Wedge
16
16
  # Create our own opal instance.
17
17
  Opal = ::Opal.dup
18
18
  end
@@ -1,10 +1,10 @@
1
1
  require 'wedge/plugins/validations'
2
2
  require 'forwardable'
3
3
 
4
- module Wedge
4
+ class Wedge
5
5
  module Plugins
6
6
  class Form < Component
7
- config.name :form_plugin
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, init: _data.send(key))
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, init: atts[att]).attributes
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, init: d)
172
+ f = wedge(form_name, d)
173
173
  k = "#{k}_attributes"
174
174
  dt = f.model_attributes
175
175
 
@@ -1,7 +1,7 @@
1
- module Wedge
1
+ class Wedge
2
2
  module Plugins
3
3
  class History < Component
4
- config.name :history_plugin
4
+ name :history_plugin
5
5
  end
6
6
  end
7
7
  end
@@ -11,11 +11,12 @@ if RUBY_ENGINE == 'opal'
11
11
  end
12
12
  end
13
13
 
14
- module Wedge
14
+ require 'wedge/plugins/history'
15
+
16
+ class Wedge
15
17
  module Plugins
16
18
  class Pjax < Component
17
- config.name :pjax, :pjax_plugin
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
- module Wedge
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, init: [_attributes.send(att).attributes, options])
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)
@@ -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
@@ -1,4 +1,4 @@
1
- module Wedge
1
+ class Wedge
2
2
  class IndifferentHash < Hash
3
3
 
4
4
  def initialize(constructor = {}, &block)
@@ -1,4 +1,4 @@
1
- module Wedge
1
+ class Wedge
2
2
  module Methods
3
3
  def self.included(base)
4
4
  base.extend(ClassMethods)