wedge 0.0.27 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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)