fron 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3c081b3b50bd27657d9e5f50c8f2b69c6f6b89bc
4
- data.tar.gz: 3a71ea7cb7e1abfa225686200de85ef0ab5c99ca
3
+ metadata.gz: 3c8bd754f6372347b316b3fd740d149d0ae7c161
4
+ data.tar.gz: fd0f5c90f5555e54bee2643663ec94aab3932753
5
5
  SHA512:
6
- metadata.gz: 8fb542de4835a8f2a69d285396ed483afdcfc834df4a63bcb902c4be28db1786542253ca6e29ad3a50ae7b94458dfe8cb65121636e1236e47ccf615ae5f1c112
7
- data.tar.gz: d3c7799e2f0e7da34a820c17b8e104ba5156fd25ab83d6a7a63815dabbd418d5ac4d0163c90ec7c5bcde05807fa8faffd3854b0d57c03427f00ba09caed99389
6
+ metadata.gz: 4c592e4dd96a7653a6bd58a0f36766fe46be4b67483bf2bd5b5cc7fb391f056da487ced52ccf2ca53409b0cc2cdb7a855c7502908463d0c0cf9816799f548a9f
7
+ data.tar.gz: bb19996d1ec2c74df54787283a2262995ed0e5fa1bd554cbff18f67152322abcd15146780ea522e2c5beb3b04241824e0e8a480493f40dac33364a569e3a37f2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fron (0.1.1)
4
+ fron (0.1.3)
5
5
  opal (~> 0.6.2)
6
6
 
7
7
  GEM
@@ -1,3 +1,3 @@
1
1
  module Fron
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'opal'
2
+ require './fron/core-ext'
2
3
  require './fron/dom'
3
4
  require './fron/request'
4
5
  require './fron/storage'
@@ -0,0 +1,5 @@
1
+ require './core-ext/hash'
2
+ require './core-ext/kernel'
3
+ require './core-ext/numeric'
4
+ require './core-ext/proc'
5
+ require './core-ext/string'
@@ -14,4 +14,18 @@ class Hash
14
14
  end
15
15
  r
16
16
  end
17
+
18
+ def deepDiff(b)
19
+ a = self
20
+ (a.keys + b.keys).uniq.inject({}) do |diff, k|
21
+ if a[k] != b[k]
22
+ if a[k].respond_to?(:deepDiff) && b[k].respond_to?(:deepDiff)
23
+ diff[k] = a[k].deepDiff(b[k])
24
+ else
25
+ diff[k] = [a[k], b[k]]
26
+ end
27
+ end
28
+ diff
29
+ end
30
+ end
17
31
  end
@@ -0,0 +1,10 @@
1
+ module Kernel
2
+ def requestAnimationFrame(&block)
3
+ return unless `!!window.requestAnimationFrame`
4
+ `window.requestAnimationFrame(function(){ #{block.call} })`
5
+ end
6
+
7
+ def timeout(ms = 0,&block)
8
+ `setTimeout(function(){#{block.call}},#{ms})`
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class Numeric
2
+ def clamp min, max
3
+ [[self, max].min, min].max
4
+ end
5
+
6
+ def round(decimals = 0)
7
+ `#{self}.toFixed(#{decimals})`.to_f
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Proc
2
+ def throttle(ms)
3
+ Native `throttle(#{self},#{ms}, {leading: false})`
4
+ end
5
+
6
+ def debounce(ms, leading = false)
7
+ Native `debounce(#{self},#{ms},#{leading})`
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ class String
2
+ def camelize
3
+ `#{self}.replace(/(?:-|_|(\/))([a-z\d]*)/gi,function(m,first,second){
4
+ return second.charAt(0).toUpperCase() + second.substr(1).toLowerCase()
5
+ })`
6
+ end
7
+ end
@@ -16,14 +16,15 @@ module Fron
16
16
  block.call Fron::Storage::LocalStorage.get id
17
17
  end
18
18
 
19
- def set(id, data, &block)
19
+ def set(model, data, &block)
20
+ id = model.id
20
21
  id = SecureRandom.uuid unless id
21
22
  data[:id] = id
22
23
  unless (errors = validate data)
23
24
  Fron::Storage::LocalStorage.set id, data
24
- block.call nil
25
+ block.call nil, data
25
26
  else
26
- block.call errors
27
+ block.call errors, {}
27
28
  end
28
29
  data
29
30
  end
@@ -8,9 +8,16 @@ module Fron
8
8
  @request.headers = {'Content-Type' => 'application/json'}
9
9
  end
10
10
 
11
- def all(&block)
11
+ def del(model,&block)
12
+ setUrl model
13
+ @request.request 'DELETE', transform({}) do
14
+ block.call
15
+ end
16
+ end
17
+
18
+ def all(data = nil, &block)
12
19
  setUrl nil
13
- @request.get { |response| block.call response.json }
20
+ @request.get(data) { |response| block.call response.json }
14
21
  end
15
22
 
16
23
  def get(id,&block)
@@ -18,29 +25,38 @@ module Fron
18
25
  @request.get { |response| block.call response.json }
19
26
  end
20
27
 
21
- def set(id,data,&block)
22
- setUrl id
23
- method = id ? 'put' : 'post'
28
+ def set(model,data,&block)
29
+ setUrl model
30
+ method = model.id ? 'put' : 'post'
24
31
  @request.send(method,transform(data)) do |response|
25
- block.call case response.status
32
+ error = case response.status
26
33
  when 201, 204
27
34
  nil
28
35
  when 422
29
36
  response.json
30
37
  end
38
+ block.call error, response.json
31
39
  end
32
40
  end
33
41
 
34
42
  private
35
43
 
36
- def setUrl(id)
37
- base = @options[:endpoint] + "/" + @options[:resources]
44
+ def setUrl(model)
45
+ id = model.is_a?(Fron::Model) ? model.id : model
46
+ endpoint = if @options[:endpoint].is_a? Proc
47
+ model.instance_eval &@options[:endpoint]
48
+ else
49
+ @options[:endpoint]
50
+ end
51
+ base = endpoint + "/" + @options[:resources]
38
52
  base += id ? "/" + id.to_s : ".json"
39
53
  @request.url = base
40
54
  end
41
55
 
42
56
  def transform(data)
43
57
  newdata = {}
58
+ meta = DOM::Document.head.find("meta[name=csrf-token]")
59
+ newdata[:authenticity_token] = meta['content'] if meta
44
60
  newdata[@options[:resource]] = data.dup
45
61
  newdata
46
62
  end
@@ -5,7 +5,7 @@ module Fron
5
5
  class Yield < Component
6
6
  end
7
7
 
8
- attr_accessor :title, :stylesheets, :logger
8
+ attr_accessor :title, :stylesheets, :logger, :injectBlock
9
9
  attr_reader :routeBlock, :main, :app
10
10
 
11
11
  def initialize
@@ -21,5 +21,9 @@ module Fron
21
21
  def layout(&block)
22
22
  @app.instance_exec @main, &block
23
23
  end
24
+
25
+ def customInject(&block)
26
+ @injectBlock = block
27
+ end
24
28
  end
25
29
  end
@@ -9,12 +9,12 @@ module Fron
9
9
  block
10
10
  end
11
11
 
12
- def trigger(event, triggerGlobal = true)
12
+ def trigger(event, data = {}, triggerGlobal = true)
13
13
  return unless @events
14
14
  return unless @events[event]
15
- Eventable.trigger event, false if triggerGlobal && self != Fron::Eventable
15
+ Eventable.trigger event, data, false if triggerGlobal && self != Fron::Eventable
16
16
  @events[event].each do |block|
17
- block.call
17
+ block.call data
18
18
  end
19
19
  end
20
20
 
@@ -24,8 +24,8 @@ module Fron
24
24
  end
25
25
  end
26
26
 
27
- def all(&block)
28
- @adapterObject.all do |items|
27
+ def all(data = nil, &block)
28
+ @adapterObject.all data do |items|
29
29
  break unless block_given?
30
30
  block.call items.map{ |item| self.new item }
31
31
  end
@@ -47,8 +47,8 @@ module Fron
47
47
  end
48
48
 
49
49
  def update(attributes = {}, &block)
50
- data = @data.dup.merge! attributes
51
- self.class.instance_variable_get("@adapterObject").set id, data do |errors|
50
+ data = gather.merge! attributes
51
+ self.class.instance_variable_get("@adapterObject").set self, data do |errors,data|
52
52
  @errors = errors
53
53
  merge data
54
54
  block.call if block_given?
@@ -61,9 +61,29 @@ module Fron
61
61
 
62
62
  private
63
63
 
64
+ def clone(data = {})
65
+ cl = self.class.new @data.merge data
66
+ cl.instance_variable_set "@errors", self.errors
67
+ cl
68
+ end
69
+
70
+ def destroy(&block)
71
+ self.class.instance_variable_get("@adapterObject").del self do
72
+ block.call if block_given?
73
+ end
74
+ end
75
+
76
+ def gather
77
+ @data.dup.reject{|key| !self.class.fields.include?(key)}
78
+ end
79
+
64
80
  def merge(data)
65
81
  data.each_pair do |key,value|
66
- self.send(key+"=", value) if self.respond_to?(key+"=")
82
+ if self.respond_to?(key+"=")
83
+ self.send(key+"=", value)
84
+ else
85
+ @data[key] = value
86
+ end
67
87
  end
68
88
  end
69
89
  end
@@ -31,17 +31,17 @@ module Fron
31
31
 
32
32
  def self.pathToRegexp(path)
33
33
  return path if path == "*"
34
- {regexp: Regexp.new('^'+path.gsub(/:(.+)/, '(.+)')), map: path.match(/:(.+)/).to_a[1..-1] }
34
+ {regexp: Regexp.new('^'+path.gsub(/:([^\/]+)/, '([^\/]+)')), map: path.scan(/:([^\/]+)/).flatten }
35
35
  end
36
36
 
37
- def route(hash = DOM::Window.hash, controller = nil)
37
+ def route(hash = DOM::Window.hash, controller = nil, startParams = {})
38
38
  routes = controller ? (controller.class.routes || []) : @routes
39
39
  routes.each do |r|
40
40
  if r[:path] == '*'
41
41
  if r[:controller]
42
- break route(hash,r[:controller])
42
+ break route(hash,r[:controller],startParams)
43
43
  else
44
- break applyRoute(controller,r)
44
+ break applyRoute(controller,r,startParams)
45
45
  end
46
46
  else
47
47
  matches = hash.match(r[:path][:regexp]).to_a[1..-1]
@@ -53,9 +53,9 @@ module Fron
53
53
  end
54
54
  end
55
55
  if r[:action]
56
- break applyRoute(controller,r,params)
56
+ break applyRoute(controller,r,startParams.merge(params))
57
57
  else
58
- break route hash.gsub(r[:path][:regexp],''), r[:controller]
58
+ break route hash.gsub(r[:path][:regexp],''), r[:controller], startParams.merge(params)
59
59
  end
60
60
  end
61
61
  end
@@ -72,10 +72,15 @@ module Fron
72
72
  end
73
73
  end
74
74
  end
75
+ controller.send(:empty) if controller.respond_to?(:empty)
75
76
  controller.send(route[:action], params)
76
77
  @config.logger.info "Navigate >> #{controller.class}##{route[:action]} with params #{params}"
77
78
  @config.main.empty
78
- @config.main << controller.base
79
+ if @config.injectBlock
80
+ @config.injectBlock.call controller.base
81
+ else
82
+ @config.main << controller.base
83
+ end
79
84
  end
80
85
  end
81
86
  end
@@ -10,3 +10,4 @@ require './dom/fragment'
10
10
  require './dom/document'
11
11
  require './dom/window'
12
12
  require './dom/event'
13
+ require './dom/file-reader'
@@ -1,11 +1,15 @@
1
1
  module DOM
2
2
  module Document
3
+ def self.activeElement
4
+ find ':focus'
5
+ end
6
+
3
7
  def self.head
4
- find 'head'
8
+ @head ||= find 'head'
5
9
  end
6
10
 
7
11
  def self.body
8
- find 'body'
12
+ @body ||= find 'body'
9
13
  end
10
14
 
11
15
  def self.title
@@ -87,10 +87,6 @@ module DOM
87
87
  `#{@el}.innerHTML = #{value}`
88
88
  end
89
89
 
90
- def empty
91
- self.html = ''
92
- end
93
-
94
90
  def value
95
91
  `#{@el}.value`
96
92
  end
@@ -107,6 +103,22 @@ module DOM
107
103
  `#{@el}.checked = #{value}`
108
104
  end
109
105
 
106
+ def disabled
107
+ `#{@el}.disabled`
108
+ end
109
+
110
+ def disabled=(value)
111
+ `#{@el}.disabled = #{value}`
112
+ end
113
+
114
+ def focus
115
+ `#{@el}.focus()`
116
+ end
117
+
118
+ def files
119
+ Native `#{@el}.files`
120
+ end
121
+
110
122
  def tag
111
123
  `#{@el}.tagName`.downcase
112
124
  end
@@ -1,10 +1,125 @@
1
1
  module DOM
2
2
  class Event
3
+
4
+ SPECIAL_KEYS = {
5
+ 8 => 'backspace',
6
+ 9 => 'tab',
7
+ 12 => 'num',
8
+ 13 => 'enter',
9
+ 16 => 'shift',
10
+ 17 => 'ctrl',
11
+ 18 => 'alt',
12
+ 19 => 'pause',
13
+ 20 => 'capslock',
14
+ 27 => 'esc',
15
+ 32 => 'space',
16
+ 33 => 'pageup',
17
+ 34 => 'pagedown',
18
+ 35 => 'end',
19
+ 36 => 'home',
20
+ 37 => 'left',
21
+ 38 => 'up',
22
+ 39 => 'right',
23
+ 40 => 'down',
24
+ 44 => 'print',
25
+ 45 => 'insert',
26
+ 46 => 'delete',
27
+ 48 => '0',
28
+ 49 => '1',
29
+ 50 => '2',
30
+ 51 => '3',
31
+ 52 => '4',
32
+ 53 => '5',
33
+ 54 => '6',
34
+ 55 => '7',
35
+ 56 => '8',
36
+ 57 => '9',
37
+ 65 => 'a',
38
+ 66 => 'b',
39
+ 67 => 'c',
40
+ 68 => 'd',
41
+ 69 => 'e',
42
+ 70 => 'f',
43
+ 71 => 'g',
44
+ 72 => 'h',
45
+ 73 => 'i',
46
+ 74 => 'j',
47
+ 75 => 'k',
48
+ 76 => 'l',
49
+ 77 => 'm',
50
+ 78 => 'n',
51
+ 79 => 'o',
52
+ 80 => 'p',
53
+ 81 => 'q',
54
+ 82 => 'r',
55
+ 83 => 's',
56
+ 84 => 't',
57
+ 85 => 'u',
58
+ 86 => 'v',
59
+ 87 => 'w',
60
+ 88 => 'x',
61
+ 89 => 'y',
62
+ 90 => 'z',
63
+ 91 => 'cmd',
64
+ 92 => 'cmd',
65
+ 93 => 'cmd',
66
+ 96 => 'num_0',
67
+ 97 => 'num_1',
68
+ 98 => 'num_2',
69
+ 99 => 'num_3',
70
+ 100 => 'num_4',
71
+ 101 => 'num_5',
72
+ 102 => 'num_6',
73
+ 103 => 'num_7',
74
+ 104 => 'num_8',
75
+ 105 => 'num_9',
76
+ 106 => 'multiply',
77
+ 107 => 'add',
78
+ 108 => 'enter',
79
+ 109 => 'subtract',
80
+ 110 => 'decimal',
81
+ 111 => 'divide',
82
+ 124 => 'print',
83
+ 144 => 'num',
84
+ 145 => 'scroll',
85
+ 186 => ';',
86
+ 187 => '=',
87
+ 188 => ',',
88
+ 189 => '-',
89
+ 190 => '.',
90
+ 191 => '/',
91
+ 192 => '`',
92
+ 219 => '[',
93
+ 220 => '\\',
94
+ 221 => ']',
95
+ 222 => '\'',
96
+ 224 => 'cmd',
97
+ 57392 => 'ctrl',
98
+ 63289 => 'num'
99
+ }
100
+
3
101
  def initialize(e,targetClass)
4
102
  @e = e
5
103
  @targetClass = targetClass
6
104
  end
7
105
 
106
+ def key
107
+ return SPECIAL_KEYS[keyCode] if SPECIAL_KEYS[keyCode]
108
+ `String.fromCharCode(#{keyCode}).toLowerCase()`
109
+ end
110
+
111
+ def stopImmediatePropagation
112
+ `#{@e}.stopImmediatePropagation()`
113
+ end
114
+
115
+ def dataTransfer
116
+ Native `#{@e}.dataTransfer`
117
+ end
118
+
119
+ def button
120
+ `#{@e}.button`
121
+ end
122
+
8
123
  def target
9
124
  @targetClass.new `#{@e}.target`
10
125
  end
@@ -0,0 +1,14 @@
1
+ module DOM
2
+ class FileReader
3
+ include Events
4
+
5
+ def initialize
6
+ @el = `new FileReader()`
7
+ end
8
+
9
+ def readAsDataURL(file)
10
+ return unless file
11
+ `#{@el}.readAsDataURL(file.native)`
12
+ end
13
+ end
14
+ end
@@ -1,8 +1,10 @@
1
1
  module DOM
2
2
  module Events
3
+ attr_reader :listeners
4
+
3
5
  def trigger(type, data = {})
4
6
  %x{
5
- event = document.createEvent("HTMLEvents");
7
+ var event = document.createEvent("HTMLEvents");
6
8
  event.initEvent(#{type}, true, true);
7
9
  for (key in #{data}) {
8
10
  value = #{data}[key];
@@ -12,28 +14,20 @@ module DOM
12
14
  }
13
15
  end
14
16
 
15
- def on(type, &listener)
16
- klass = if defined? self.class::EVENT_TARGET_CLASS
17
- self.class::EVENT_TARGET_CLASS
18
- else
19
- Hash
20
- end
21
- method = `function(e){#{ listener.call Event.new(`e`,klass)}}`
22
-
23
- @listeners ||= {}
24
- @listeners[type] ||= []
25
- @listeners[type] << method
17
+ def on!(type, &listener)
18
+ _on type, true, &listener
19
+ end
26
20
 
27
- `#{@el}.addEventListener(#{type},#{method})`
28
- method
21
+ def on(type, &listener)
22
+ _on type, &listener
29
23
  end
30
24
 
31
25
  def off(type = nil, method = nil)
32
26
  return unless @listeners
33
27
 
34
28
  if type == nil
35
- @listeners.keys.each do |type|
36
- removeListeners type
29
+ @listeners.keys.each do |ltype|
30
+ removeListeners ltype
37
31
  end
38
32
  elsif method == nil
39
33
  removeListeners type
@@ -41,6 +35,7 @@ module DOM
41
35
  return unless @listeners[type].index(method)
42
36
  @listeners[type].delete method
43
37
  `#{@el}.removeEventListener(#{type},#{method})`
38
+ `#{@el}.removeEventListener(#{type},#{method},true)`
44
39
  end
45
40
  end
46
41
 
@@ -54,6 +49,22 @@ module DOM
54
49
 
55
50
  private
56
51
 
52
+ def _on(type, capture = false, &listener)
53
+ klass = if defined? self.class::EVENT_TARGET_CLASS
54
+ self.class::EVENT_TARGET_CLASS
55
+ else
56
+ Hash
57
+ end
58
+ method = `function(e){#{ listener.call Event.new(`e`,klass)}}`
59
+
60
+ @listeners ||= {}
61
+ @listeners[type] ||= []
62
+ @listeners[type] << method
63
+
64
+ `#{@el}.addEventListener(#{type},#{method},#{capture})`
65
+ method
66
+ end
67
+
57
68
  def removeListeners(type)
58
69
  @listeners[type].each do |method|
59
70
  @listeners[type].delete method
@@ -35,6 +35,10 @@ module DOM
35
35
  el ? DOM::NODE.new(el) : nil
36
36
  end
37
37
 
38
+ def empty
39
+ children.each { |node| node.remove! }
40
+ end
41
+
38
42
  def empty?
39
43
  `#{@el}.childNodes.length === 0`
40
44
  end
@@ -65,7 +69,8 @@ module DOM
65
69
  end
66
70
 
67
71
  def insertBefore(what,where)
68
- `#{@el}.insertBefore(#{what},#{where})`
72
+ return what >> self unless where # Fir for firefox...
73
+ `#{@el}.insertBefore(#{NODE.getElement what},#{NODE.getElement where})`
69
74
  end
70
75
 
71
76
  # Text manipulation
@@ -1,3 +1,2 @@
1
- require './core-ext/hash'
2
1
  require './request/response'
3
2
  require './request/request'
@@ -33,21 +33,21 @@ describe Fron::Adapters::LocalAdapter do
33
33
  describe "#set" do
34
34
  it "should call localStorage#set" do
35
35
  Fron::Storage::LocalStorage.should receive(:set).once
36
- subject.set 0, {name: 'test'}, &proc
36
+ subject.set double(id: 0), {name: 'test'}, &proc
37
37
  end
38
38
 
39
39
  it "should run the block with nil if there are no errors" do
40
- proc.should receive(:call).with nil
41
- subject.set 0, {name: 'test'}, &proc
40
+ proc.should receive(:call).with nil, {name: 'test', id: 0}
41
+ subject.set double(id: 0), {name: 'test'}, &proc
42
42
  end
43
43
 
44
44
  it "should run the block with erros if ther are any" do
45
- proc.should receive(:call).with({name: ["can't be blank"]})
46
- subject.set 0, {name: ''}, &proc
45
+ proc.should receive(:call).with({name: ["can't be blank"]}, {})
46
+ subject.set double(id: 0), {name: ''}, &proc
47
47
  end
48
48
 
49
49
  it "should add id if there isn't any" do
50
- result = subject.set nil, {name: ''}, &proc
50
+ result = subject.set double(id: nil), {name: ''}, &proc
51
51
  result[:id].should_not be nil
52
52
  end
53
53
  end
@@ -1,6 +1,9 @@
1
1
  require 'fron/core'
2
2
  require 'fron/storage'
3
3
 
4
+ class TestModel < Fron::Model
5
+ end
6
+
4
7
  describe Fron::Adapters::RailsAdapter do
5
8
 
6
9
  subject do
@@ -14,6 +17,8 @@ describe Fron::Adapters::RailsAdapter do
14
17
 
15
18
  let(:proc) { Proc.new {} }
16
19
  let(:request) { double :request }
20
+ let(:model) { TestModel.new({ id: 0 }) }
21
+ let(:newModel) { TestModel.new }
17
22
 
18
23
  before do
19
24
  subject.instance_variable_set "@request", request
@@ -45,19 +50,19 @@ describe Fron::Adapters::RailsAdapter do
45
50
  it "should call POST request for new record" do
46
51
  request.should receive(:url=).with "test/users.json"
47
52
  request.should receive(:post) do |&block|
48
- block.call double status: 201
53
+ block.call double status: 201, json: ''
49
54
  end
50
55
  proc.should receive(:call)
51
- subject.set nil, {}, &proc
56
+ subject.set newModel, {}, &proc
52
57
  end
53
58
 
54
59
  it "should call PUT request for exsistsing record" do
55
60
  request.should receive(:url=).with "test/users/0"
56
61
  request.should receive(:put) do |&block|
57
- block.call double status: 201
62
+ block.call double status: 201, json: ''
58
63
  end
59
64
  proc.should receive(:call)
60
- subject.set 0, {}, &proc
65
+ subject.set model, {}, &proc
61
66
  end
62
67
 
63
68
  it "should call block with error" do
@@ -65,8 +70,8 @@ describe Fron::Adapters::RailsAdapter do
65
70
  request.should receive(:put) do |&block|
66
71
  block.call double status: 422, json: 'error'
67
72
  end
68
- proc.should receive(:call).with 'error'
69
- subject.set 0, {}, &proc
73
+ proc.should receive(:call).with 'error', 'error'
74
+ subject.set model, {}, &proc
70
75
  end
71
76
  end
72
77
  end
@@ -12,11 +12,11 @@ class MockAdapter
12
12
  block.call({name: 'User'})
13
13
  end
14
14
 
15
- def set(id,&block)
16
- if id == 0
17
- block.call
15
+ def set(model,data,&block)
16
+ if model.id == 0
17
+ block.call(nil, data)
18
18
  else
19
- block.call({errors: true})
19
+ block.call({errors: true}, {})
20
20
  end
21
21
  end
22
22
  end
@@ -10,10 +10,6 @@ class TestRouteController < Fron::Controller
10
10
  route "show/:id", :show
11
11
  route "*", :test
12
12
 
13
- before :empty, [:show]
14
-
15
- def empty
16
- end
17
13
  def show
18
14
  end
19
15
  def test
@@ -27,6 +23,7 @@ describe Fron::Router do
27
23
  let(:window_listeners) {window.instance_variable_get("@listeners")}
28
24
  let(:controller) { TestRouteController.new }
29
25
  let(:config) { double :config, {
26
+ injectBlock: nil,
30
27
  logger: double(:logger,info: true),
31
28
  main: double(:main, :"<<" => true, "empty" => true)
32
29
  }
@@ -45,7 +42,7 @@ describe Fron::Router do
45
42
  it "should return regexp for path" do
46
43
  result = described_class.map "/test", :test
47
44
  result[:path][:regexp].should eq Regexp.new "^/test"
48
- result[:path][:map].should eq nil
45
+ result[:path][:map].should eq []
49
46
  result[:action].should eq :test
50
47
  end
51
48
 
@@ -17,6 +17,7 @@ describe DOM::Event do
17
17
  metaKey: false,
18
18
  preventDefault: function(){return 1},
19
19
  stopPropagation: function(){return 2},
20
+ stopImmediatePropagation: function(){},
20
21
  target: {test: 'data'} }
21
22
  }}
22
23
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusztav Szikszai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-26 00:00:00.000000000 Z
11
+ date: 2014-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opal
@@ -57,7 +57,12 @@ files:
57
57
  - lib/fron.rb
58
58
  - lib/fron/version.rb
59
59
  - opal/fron.rb
60
+ - opal/fron/core-ext.rb
60
61
  - opal/fron/core-ext/hash.rb
62
+ - opal/fron/core-ext/kernel.rb
63
+ - opal/fron/core-ext/numeric.rb
64
+ - opal/fron/core-ext/proc.rb
65
+ - opal/fron/core-ext/string.rb
61
66
  - opal/fron/core.rb
62
67
  - opal/fron/core/adapters/local.rb
63
68
  - opal/fron/core/adapters/rails.rb
@@ -73,6 +78,7 @@ files:
73
78
  - opal/fron/dom/document.rb
74
79
  - opal/fron/dom/element.rb
75
80
  - opal/fron/dom/event.rb
81
+ - opal/fron/dom/file-reader.rb
76
82
  - opal/fron/dom/fragment.rb
77
83
  - opal/fron/dom/modules/classlist.rb
78
84
  - opal/fron/dom/modules/dimensions.rb