modularity-rails 0.15.0 → 0.16.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.
Files changed (89) hide show
  1. data/{LICENSE → MIT-LICENSE} +0 -0
  2. data/README.md +16 -15
  3. data/Rakefile +3 -14
  4. data/{vendor → app}/assets/javascripts/modularity/data/ajax_loader.coffee +0 -0
  5. data/{vendor → app}/assets/javascripts/modularity/data/cache.coffee +5 -0
  6. data/{vendor → app}/assets/javascripts/modularity/data/indexed_cache.coffee +8 -2
  7. data/{vendor → app}/assets/javascripts/modularity/data/persistence_manager.coffee +11 -0
  8. data/{vendor → app}/assets/javascripts/modularity/mixins/clickable.coffee +2 -2
  9. data/{vendor → app}/assets/javascripts/modularity/mixins/closable.coffee +0 -0
  10. data/{vendor/assets/javascripts/modularity.js.coffee → app/assets/javascripts/modularity/modularity.coffee} +3 -0
  11. data/{vendor → app}/assets/javascripts/modularity/modules/autogrow_textarea.coffee +2 -1
  12. data/{vendor → app}/assets/javascripts/modularity/modules/button.coffee +0 -0
  13. data/{vendor → app}/assets/javascripts/modularity/tools/array_tools.coffee +1 -0
  14. data/{vendor → app}/assets/javascripts/modularity/tools/object_tools.coffee +0 -0
  15. data/config/initializers/konacha.rb +6 -0
  16. data/lib/modularity-rails.rb +0 -1
  17. data/lib/modularity-rails/engine.rb +1 -0
  18. data/lib/modularity-rails/version.rb +1 -1
  19. metadata +80 -100
  20. data/.evergreen +0 -6
  21. data/.gitignore +0 -20
  22. data/.travis.yml +0 -8
  23. data/Gemfile +0 -4
  24. data/Guardfile +0 -8
  25. data/demo/.gitignore +0 -15
  26. data/demo/Gemfile +0 -23
  27. data/demo/README.rdoc +0 -261
  28. data/demo/Rakefile +0 -7
  29. data/demo/app/assets/images/rails.png +0 -0
  30. data/demo/app/assets/javascripts/application.coffee +0 -2
  31. data/demo/app/assets/stylesheets/application.css +0 -13
  32. data/demo/app/controllers/application_controller.rb +0 -3
  33. data/demo/app/helpers/application_helper.rb +0 -2
  34. data/demo/app/mailers/.gitkeep +0 -0
  35. data/demo/app/models/.gitkeep +0 -0
  36. data/demo/app/views/layouts/application.html.erb +0 -14
  37. data/demo/config.ru +0 -4
  38. data/demo/config/application.rb +0 -59
  39. data/demo/config/boot.rb +0 -6
  40. data/demo/config/database.yml +0 -25
  41. data/demo/config/environment.rb +0 -5
  42. data/demo/config/environments/development.rb +0 -37
  43. data/demo/config/environments/production.rb +0 -67
  44. data/demo/config/environments/test.rb +0 -37
  45. data/demo/config/initializers/backtrace_silencers.rb +0 -7
  46. data/demo/config/initializers/inflections.rb +0 -15
  47. data/demo/config/initializers/konacha.rb +0 -5
  48. data/demo/config/initializers/mime_types.rb +0 -5
  49. data/demo/config/initializers/secret_token.rb +0 -7
  50. data/demo/config/initializers/session_store.rb +0 -8
  51. data/demo/config/initializers/wrap_parameters.rb +0 -14
  52. data/demo/config/locales/en.yml +0 -5
  53. data/demo/config/routes.rb +0 -58
  54. data/demo/db/seeds.rb +0 -7
  55. data/demo/lib/assets/.gitkeep +0 -0
  56. data/demo/lib/tasks/.gitkeep +0 -0
  57. data/demo/log/.gitkeep +0 -0
  58. data/demo/public/404.html +0 -26
  59. data/demo/public/422.html +0 -26
  60. data/demo/public/500.html +0 -25
  61. data/demo/public/favicon.ico +0 -0
  62. data/demo/public/index.html +0 -241
  63. data/demo/public/robots.txt +0 -5
  64. data/demo/script/rails +0 -6
  65. data/demo/spec/javascripts/data/ajax_loader_spec.coffee +0 -132
  66. data/demo/spec/javascripts/data/cache_spec.coffee +0 -103
  67. data/demo/spec/javascripts/data/indexed_cache_spec.coffee +0 -51
  68. data/demo/spec/javascripts/data/persistence_manager_spec.coffee +0 -283
  69. data/demo/spec/javascripts/konacha_config.coffee +0 -2
  70. data/demo/spec/javascripts/mixins/closable_spec.coffee +0 -98
  71. data/demo/spec/javascripts/modularity_spec.coffee +0 -329
  72. data/demo/spec/javascripts/modules/autogrow_textarea_spec.coffee +0 -43
  73. data/demo/spec/javascripts/modules/button_spec.coffee +0 -39
  74. data/demo/spec/javascripts/modules/counter_button_spec.coffee +0 -57
  75. data/demo/spec/javascripts/sinon-chai.js +0 -116
  76. data/demo/spec/javascripts/sinon.js +0 -3555
  77. data/demo/spec/javascripts/spec_helper.coffee +0 -10
  78. data/demo/spec/javascripts/templates/autogrow_textarea.jst.ejs +0 -2
  79. data/demo/spec/javascripts/templates/button.jst.ejs +0 -3
  80. data/demo/spec/javascripts/templates/closable.jst.ejs +0 -14
  81. data/demo/spec/javascripts/templates/modularity.jst.ejs +0 -6
  82. data/demo/spec/javascripts/tools/array_tools_spec.coffee +0 -12
  83. data/demo/spec/javascripts/tools/object_tools_spec.coffee +0 -46
  84. data/demo/vendor/assets/javascripts/.gitkeep +0 -0
  85. data/demo/vendor/assets/stylesheets/.gitkeep +0 -0
  86. data/demo/vendor/plugins/.gitkeep +0 -0
  87. data/modularity-rails.gemspec +0 -22
  88. data/run_tests +0 -6
  89. data/vendor/assets/javascripts/modularity/modules/counter_button.coffee +0 -17
@@ -1,5 +0,0 @@
1
- # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
- #
3
- # To ban all spiders from the entire site uncomment the next two lines:
4
- # User-Agent: *
5
- # Disallow: /
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
-
4
- APP_PATH = File.expand_path('../../config/application', __FILE__)
5
- require File.expand_path('../../config/boot', __FILE__)
6
- require 'rails/commands'
@@ -1,132 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/ajax_loader
3
-
4
-
5
- describe 'ajax_loader', ->
6
-  
7
- ajax_loader = spy = spy_get = spy_fire = null
8
- beforeEach ->
9
- spy = sinon.spy()
10
- spy_get = sinon.spy jQuery, 'get'
11
- spy_fire = sinon.spy modularity, 'fire_global_event'
12
-
13
- afterEach ->
14
- spy_get.restore()
15
- spy_fire.restore()
16
-
17
- describe 'constructor', ->
18
-
19
- it "stores the 'cache' settings", ->
20
- loader = new modularity.AjaxLoader {caching: yes}
21
- expect(loader.caching).to.be.true
22
-
23
- it 'defaults to no caching', ->
24
- loader = new modularity.AjaxLoader {}
25
- expect(loader.caching).to.be.false
26
-
27
-
28
-  describe 'get', ->
29
- url = "/users/4"
30
-
31
- beforeEach ->
32
- ajax_loader = new modularity.AjaxLoader {caching: yes}
33
-
34
- describe 'first time request', ->
35
-
36
- beforeEach ->
37
- ajax_loader.get url, spy
38
-
39
- it 'makes an ajax request', ->
40
- expect(jQuery.get).to.have.been.calledOnce
41
-
42
- it 'saves the callback for later', ->
43
- expect(ajax_loader.cb_cache.get(url)).to.have.length 1
44
- expect(ajax_loader.cb_cache.get(url)[0]).to.equal spy
45
-
46
- it 'returns without calling the callback', ->
47
- expect(spy).to.not.have.been.called
48
-
49
-
50
- describe 'the request is already in progress', ->
51
-
52
- existing_cb = sinon.spy()
53
- new_cb = sinon.spy()
54
- beforeEach ->
55
- ajax_loader.cb_cache.add url, [existing_cb]
56
- ajax_loader.get url, new_cb
57
-
58
- it 'adds the callback to the callback cache', ->
59
- expect(ajax_loader.cb_cache.get(url)).to.have.length 2
60
- expect(ajax_loader.cb_cache.get(url)[0]).to.equal existing_cb
61
- expect(ajax_loader.cb_cache.get(url)[1]).to.equal new_cb
62
-
63
- it 'returns without calling the callback', ->
64
- expect(new_cb).to.not.have.been.called
65
-
66
- it 'does not make another ajax request', ->
67
- expect(jQuery.get).to.not.have.been.called
68
-
69
- it "does not fire the 'loading' event", ->
70
- expect(modularity.fire_global_event).to.not.have.been.called
71
-
72
-
73
- describe 'ajax request returns successfully', ->
74
-
75
- old_jquery_get = null
76
- beforeEach ->
77
- jquery_callback = null
78
- old_jquery_get = jQuery.get
79
- jQuery.get = (url, callback) -> callback 'result'
80
-
81
- afterEach ->
82
- jQuery.get = old_jquery_get
83
-
84
- describe 'with caching enabled', ->
85
- beforeEach ->
86
- ajax_loader.caching = true
87
- ajax_loader.get url, spy
88
-
89
- it 'calls the given callbacks with the server data', ->
90
- expect(spy.calledWith('result')).to.be.true
91
-
92
- it 'removes the callbacks from the callback cache', ->
93
- expect(ajax_loader.cb_cache.get(url)).to.be.undefined
94
-
95
- it 'stores the data in the data cache', ->
96
- expect(ajax_loader.data_cache.get(url)).to.equal 'result'
97
-
98
- it "fires the 'loading' event", ->
99
- expect(modularity.fire_global_event.calledWith('AJAX_LOADED')).to.be.true
100
-
101
-
102
- describe 'with caching disabled', ->
103
- beforeEach ->
104
- ajax_loader.caching = false
105
- ajax_loader.get url, spy
106
-
107
- it 'calls the given callbacks with the server data', ->
108
- expect(spy.calledWith('result')).to.be.true
109
-
110
- it 'removes the callbacks from the callback cache', ->
111
- expect(ajax_loader.cb_cache.get(url)).to.be.undefined
112
-
113
- it 'does not store the data in the data cache', ->
114
- expect(ajax_loader.data_cache.get(url)).to.be.undefined
115
-
116
- it "fires the 'loading' event", ->
117
- expect(modularity.fire_global_event.calledWith('AJAX_LOADED')).to.be.true
118
-
119
-
120
- describe 'the data has already been loaded', ->
121
-
122
-    it 'calls the callback with the cached data', ->
123
- ajax_loader.data_cache.add url, "my data"
124
-
125
- ajax_loader.get(url, spy)
126
-
127
- expect(spy).to.have.been.called
128
- expect(spy.calledWith('my data')).to.be.true
129
-
130
- it "does not fire the 'loading' event", ->
131
- expect(modularity.fire_global_event).to.not.have.been.called
132
-
@@ -1,103 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/cache
3
-
4
-
5
- describe 'Cache', ->
6
-
7
- cache = null
8
- beforeEach ->
9
- cache = new modularity.Cache()
10
-
11
-
12
- describe 'constructor', ->
13
-
14
- it 'initializes with an empty cache', ->
15
- cache.cache.should.eql({})
16
-
17
-
18
- describe 'add', ->
19
-
20
- it 'stores the given data in the cache', ->
21
- cache.add 'foo', 'bar'
22
- cache.cache.should.eql({'foo': 'bar'})
23
-
24
- it 'overwrites existing entries', ->
25
- cache.cache = {'foo', 'bar'}
26
- cache.add 'foo', 'new'
27
- (cache.cache['foo']).should.be.equal('new')
28
-
29
-
30
- describe 'remove', ->
31
-
32
- it 'removes the entry with the given key from the chache', ->
33
- cache.add 'foo', 'bar'
34
- cache.remove 'foo'
35
- expect(cache.get('foo')).to.be.undefined
36
- cache.length().should.equal 0
37
-
38
- it 'only removes the given data and leaves the rest of the cache alone', ->
39
- cache.add 1, 'one'
40
- cache.add 2, 'two'
41
- cache.remove 1
42
- expect(cache.get(1)).to.be.undefined
43
- expect(cache.get(2)).to.equal 'two'
44
- cache.length().should.equal 1
45
-
46
-
47
- describe 'get', ->
48
-
49
- it "returns undefined if the entry doesn't exist", ->
50
- expect(cache.get('zonk')).to.be.undefined
51
-
52
- it "returns the entry if it exists", ->
53
- cache.add 'foo', 'bar'
54
- cache.get('foo').should.equal('bar')
55
-
56
-
57
- describe 'getMany', ->
58
-
59
- result = null
60
- beforeEach ->
61
- cache.add('one', 1)
62
- cache.add('two', 2)
63
- result = cache.getMany ['one', 'three']
64
-
65
- it "returns the values that exist in the 'found' structure", ->
66
- result.found.should.eql({'one': 1})
67
-
68
- it "returns the values that don't exist in the 'missing' structure", ->
69
- result.missing.should.eql(['three'])
70
-
71
-
72
- describe 'length', ->
73
-
74
- it 'returns 0 for empty cache', ->
75
- cache.length().should.equal 0
76
-
77
- it 'returns the number of objects in the cache', ->
78
- cache.add('foo', 'bar')
79
- cache.add('fooz', 'baz')
80
- cache.length().should.equal(2)
81
-
82
-
83
- describe 'replaceAll', ->
84
-
85
- it 'replaces the whole cache with the given data', ->
86
- cache.add 'one', 1
87
- cache.replaceAll {'one': 2, two: 3}
88
- cache.length().should.equal(2)
89
- cache.get('one').should.equal(2)
90
- cache.get('two').should.equal(3)
91
-
92
- describe 'with 2 parameters', ->
93
-
94
- it 'parses the given array, and indexes on the given key', ->
95
- ten = {id: 10, value: 'ten'}
96
- twelve = {id: 12, value: 'twelve'}
97
-
98
- cache.replaceAll [ten, twelve], 'id'
99
-
100
- cache.length().should.equal 2
101
- cache.get(10).should.equal ten
102
- cache.get(12).should.equal twelve
103
-
@@ -1,51 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/indexed_cache
3
-
4
-
5
- describe 'IndexedCache', ->
6
-
7
- indexed_cache = null
8
- entry_1 = {id: 1, value: 'one'}
9
- entry_2 = {id: 2, value: 'two'}
10
- beforeEach ->
11
- indexed_cache = new modularity.IndexedCache 'id'
12
-
13
-
14
- describe 'constructor', ->
15
-
16
- it 'stores the given key attribute', ->
17
- indexed_cache.key.should == 'id'
18
-
19
-
20
- describe 'add', ->
21
-
22
- beforeEach ->
23
- indexed_cache.add entry_1
24
-
25
- it 'adds the given element', ->
26
- indexed_cache.cache.length().should.equal 1
27
- indexed_cache.cache.cache[1].should.eql entry_1
28
-
29
-
30
- describe 'add_all', ->
31
- it 'adds all the given elements', ->
32
- indexed_cache.add_all [entry_1, entry_2]
33
- indexed_cache.length().should.equal 2
34
- indexed_cache.cache.cache[1].should.eql entry_1
35
- indexed_cache.cache.cache[2].should.eql entry_2
36
-
37
-
38
- describe 'remove', ->
39
- it 'removes the given object from the server', ->
40
- indexed_cache.add entry_1
41
- indexed_cache.remove entry_1
42
- indexed_cache.length().should.equal 0
43
-
44
- describe 'get', ->
45
- it 'returns the element indexed by the given key', ->
46
- indexed_cache.add entry_1
47
- indexed_cache.get(1).should.eql entry_1
48
-
49
- it "returns undefined if the element doesn't exist", ->
50
- expect(indexed_cache.get(2)).to.be.undefined
51
-
@@ -1,283 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/persistence_manager
3
- #= require jquery
4
-
5
-
6
- describe 'PersistenceManager', ->
7
-
8
- # Global variables for testing.
9
- persistence_manager = null
10
- entry_1 = {id: 1, value: 'one'}
11
- entry_2 = {id: 2, value: 'two'}
12
-
13
- beforeEach ->
14
- persistence_manager = new modularity.PersistenceManager {url: '/users'}
15
-
16
-
17
- describe 'constructor', ->
18
-
19
- it 'initializes an empty server data cache', ->
20
- persistence_manager.server_data.length().should.equal 0
21
-
22
- it 'initializes an empty client data cache', ->
23
- persistence_manager.client_data.length().should.eql 0
24
-
25
- it 'stores the given base url', ->
26
- persistence_manager.base_url.should.equal '/users'
27
-
28
- it 'stores the given index key', ->
29
- persistence_manager = new modularity.PersistenceManager {key: 'my_key', url: '/users'}
30
- persistence_manager.key.should.equal 'my_key'
31
-
32
- it "uses 'id' as the default if no key is given", ->
33
- persistence_manager.key.should.equal 'id'
34
-
35
-
36
- describe 'add_all', ->
37
-
38
- it 'adds the given data to the server_data cache', ->
39
- spy = sinon.spy persistence_manager.server_data, 'add_all'
40
- data = [{id: 1}, {id: 2}]
41
- persistence_manager.add_all data
42
- spy.should.have.been.calledOnce
43
-
44
- describe 'create', ->
45
- new_obj = {value: 'foo'}
46
-
47
- beforeEach ->
48
- sinon.stub(jQuery, 'ajax').yieldsTo('success', entry_2)
49
-
50
- afterEach ->
51
- jQuery.ajax.restore()
52
-
53
- it 'makes an ajax POST request to the CREATE url on the server', ->
54
- persistence_manager.create new_obj, ->
55
- jQuery.ajax.should.have.been.calledOnce
56
- args = jQuery.ajax.args[0][0]
57
- args.url.should.equal '/users.json'
58
- args.type.should.equal 'POST'
59
-
60
- it 'sends the object as payload', ->
61
- persistence_manager.create new_obj, ->
62
- args = jQuery.ajax.args[0][0]
63
- args.data.should.equal new_obj
64
-
65
- it "doesn't updates the server cache immediately because the object doesn't have an id", ->
66
- persistence_manager.create new_obj, ->
67
- expect(persistence_manager.server_data.get(1)).to.be.undefined
68
-
69
- it 'updates the server cache with the server data when the call returns', (done) ->
70
- persistence_manager.create {value: 'bar'}, (server_obj) ->
71
- persistence_manager.server_data.get(server_obj.id).should.equal entry_2
72
- done()
73
-
74
- it 'calls the given callback when done', (done) ->
75
- persistence_manager.create new_obj, ->
76
- done()
77
-
78
-
79
- describe 'delete', ->
80
-
81
- beforeEach ->
82
- sinon.stub(jQuery, 'ajax').yieldsTo('success')
83
-
84
- afterEach ->
85
- jQuery.ajax.restore()
86
-
87
- it 'makes an ajax DELETE request to the item url on the server', ->
88
- persistence_manager.delete entry_1
89
- jQuery.ajax.should.have.been.calledOnce
90
- args = jQuery.ajax.args[0][0]
91
- args.url.should.equal '/users/1.json'
92
- args.type.should.equal 'DELETE'
93
-
94
- it 'removes the object from the client and server cache', ->
95
- persistence_manager.server_data.add entry_1
96
- persistence_manager.client_data.add entry_1
97
- persistence_manager.delete entry_1
98
- persistence_manager.server_data.length().should.equal 0
99
- persistence_manager.client_data.length().should.equal 0
100
-
101
- it 'calls the given callback when done', (done) ->
102
- persistence_manager.delete entry_1, ->
103
- done()
104
-
105
-
106
- describe 'entry_url', ->
107
-
108
- it 'returns the url to access a single entry', ->
109
- persistence_manager.entry_url(entry_1).should.equal '/users/1.json'
110
-
111
-
112
- describe 'load', ->
113
-
114
- describe 'entry exists in client data cache', ->
115
- it 'returns the entry from the @client_data cache if it exists there', (done) ->
116
- persistence_manager.client_data.add entry_1
117
- persistence_manager.load 1, (entry) ->
118
- entry.should.equal entry_1
119
- done()
120
-
121
- describe 'entry exists in server data cache', ->
122
-
123
- beforeEach ->
124
- persistence_manager.server_data.add entry_1
125
-
126
- it 'adds the entry to the client data cache', (done) ->
127
- persistence_manager.load 1, ->
128
- persistence_manager.client_data.length().should.equal 1
129
- persistence_manager.client_data.get(1).should.eql entry_1
130
- done()
131
-
132
- it 'returns the entry from the client data cache', (done) ->
133
- persistence_manager.load 1, (entry) ->
134
- client_cache_entry = persistence_manager.client_data.get 1
135
- entry.should.equal client_cache_entry
136
- done()
137
-
138
- it 'returns a different hash than the server data, so that the user can make changes to it', (done) ->
139
- persistence_manager.load 1, (entry) ->
140
- server_cache_entry = persistence_manager.server_data.get 1
141
-
142
- entry.should.not.equal server_cache_entry
143
- done()
144
-
145
-
146
- describe "entry doesn't exist on the client at all", ->
147
-
148
- beforeEach ->
149
- sinon.stub(jQuery, 'ajax').yieldsTo('success', entry_1)
150
-
151
- afterEach ->
152
- jQuery.ajax.restore()
153
-
154
- it "retrieves the entry from the server", (done) ->
155
- persistence_manager.load 1, ->
156
- jQuery.ajax.should.have.been.calledOnce
157
- done()
158
-
159
-
160
- it 'stores the entry in the server cache', (done) ->
161
- persistence_manager.load 1, ->
162
- persistence_manager.server_data.length().should.equal 1
163
- persistence_manager.server_data.get(1).should.equal entry_1
164
- done()
165
-
166
- it 'stores a replica of the entry in the client cache', (done) ->
167
- persistence_manager.load 1, ->
168
- persistence_manager.client_data.get(1).should.not.equal entry_1
169
- persistence_manager.client_data.get(1).should.eql entry_1
170
- done()
171
-
172
- it 'returns the client replica', (done) ->
173
- persistence_manager.load 1, (entry) ->
174
- persistence_manager.client_data.get(1).should.equal entry
175
- persistence_manager.server_data.get(1).should.not.equal entry
176
- done()
177
-
178
-
179
- describe 'load_all', ->
180
-
181
- loading_done_callback = null
182
- beforeEach ->
183
- sinon.stub(jQuery, 'ajax').yieldsTo('success', [entry_1, entry_2])
184
- loading_done_callback = sinon.spy()
185
- persistence_manager.load_all loading_done_callback, {'q': 'foo'},
186
-
187
- afterEach ->
188
- jQuery.ajax.restore()
189
-
190
- it 'makes a request to the INDEX action of the server', ->
191
- jQuery.ajax.should.have.been.calledOnce
192
- jQuery.ajax.args[0][0].url.should.equal '/users.json'
193
-
194
- it 'provides the given data as parameters to the request', ->
195
- jQuery.ajax.args[0][0].data.should.eql {'q': 'foo'}
196
-
197
- it 'fills the server cache with the response data', ->
198
- persistence_manager.server_data.length().should.eql 2
199
- persistence_manager.server_data.get(1).should.eql entry_1
200
- persistence_manager.server_data.get(2).should.eql entry_2
201
-
202
- it 'calls the given callback method when the data is available', ->
203
- loading_done_callback.should.have.been.calledOnce
204
-
205
-
206
- describe 'load_many', ->
207
-
208
- describe 'all snippets in cache', ->
209
- it 'returns an array of all requested snippets', ->
210
- persistence_manager.add_all [{id: 1}, {id: 2}, {id: 3}]
211
- persistence_manager.load_many [1,2], (snippets) ->
212
- expect(snippets).to.have.length 2
213
- expect(snippets[0].id).to.equal 1
214
- expect(snippets[1].id).to.equal 2
215
-
216
-
217
- describe 'some snippets are not cached', ->
218
-
219
- it 'loads the missing snippets from the server'
220
-
221
-
222
- describe 'save', ->
223
-
224
- describe 'for unsaved objects', ->
225
- it "calls the 'create' action", ->
226
- sinon.stub persistence_manager, 'create'
227
- persistence_manager.save {value: 'foo'}, ->
228
- persistence_manager.create.should.have.been.calledOnce
229
-
230
- describe 'for objects from the server', ->
231
- it "calls the 'update' action", ->
232
- sinon.stub persistence_manager, 'update'
233
- persistence_manager.save entry_1, ->
234
- persistence_manager.update.should.have.been.calledOnce
235
-
236
-
237
- describe 'update', ->
238
-
239
- beforeEach ->
240
- sinon.stub(jQuery, 'ajax').yieldsTo('success', entry_2)
241
- server_entry = {id: 1, title: 'server title', desc: 'server desc'}
242
- persistence_manager.server_data.add server_entry
243
-
244
- afterEach ->
245
- jQuery.ajax.restore()
246
-
247
- it 'makes an ajax PUT request to the UPDATE url on the server', ->
248
- persistence_manager.update entry_1, ->
249
- jQuery.ajax.should.have.been.calledOnce
250
- args = jQuery.ajax.args[0][0]
251
- args.url.should.equal '/users/1.json'
252
- args.type.should.equal 'PUT'
253
-
254
- it 'sends only updated colums of the object as payload', (done) ->
255
- persistence_manager.load 1, (client_entry) ->
256
- client_entry.title = 'client title'
257
-
258
- persistence_manager.update client_entry
259
-
260
-
261
- args = jQuery.ajax.args[0][0]
262
- args.data.should.eql {id: 1, title: 'client title'}
263
- done()
264
-
265
- it "doesn't perform the call if nothing is changed", (done) ->
266
- persistence_manager.load 1, (client_entry) ->
267
- persistence_manager.update client_entry
268
- jQuery.ajax.should.not.have.been.called
269
- done()
270
-
271
- it 'updates the server cache immediately with the given object', ->
272
- persistence_manager.update entry_1, ->
273
- persistence_manager.server_data.get(1).should.equal entry_1
274
-
275
- it 'updates the server cache with the server object when done', (done) ->
276
- persistence_manager.update entry_1, (server_obj) ->
277
- persistence_manager.server_data.get(2).should.equal entry_2
278
- done()
279
-
280
- it 'calls the given callback when done', (done) ->
281
- persistence_manager.update entry_1, ->
282
- done()
283
-