volt 0.9.3.pre6 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -1
- data/lib/volt/cli/generate.rb +1 -1
- data/lib/volt/controllers/http_controller.rb +7 -1
- data/lib/volt/models/array_model.rb +29 -6
- data/lib/volt/reactive/reactive_array.rb +2 -2
- data/lib/volt/server/rack/http_response_renderer.rb +7 -1
- data/lib/volt/server/rack/quiet_common_logger.rb +4 -1
- data/lib/volt/utils/promise_extensions.rb +5 -0
- data/lib/volt/version.rb +1 -1
- data/spec/server/rack/http_response_renderer_spec.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73635c7ae6b384dcaecd996e5c28bd99773c508d
|
4
|
+
data.tar.gz: 73703d5c1aff47c1ac8d7cd2fa514da542b1ee28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6faeee73ca44c142b8c88264dd89599d0351a6638b962d5b127aa54656bec4549caa22ba753a3b506a634bb212e3d1ef46175ec68b63c0e21f1bd58b6ebf009d
|
7
|
+
data.tar.gz: 83ef2428fe1b75ae3e7140f0acbb3008a31c22c0643adacabe27844ab3921457eca5bbf7e6370cf5328cd9b113cd3c205266424b82cb9cf267d4cfcb2813f8b0
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## 0.9.3
|
3
|
+
## 0.9.3
|
4
|
+
|
4
5
|
### Added
|
5
6
|
- Added validations block for conditional validation runs
|
6
7
|
- you can now set the NO_FORKING=true ENV to prevent using the forking server in development.
|
@@ -17,6 +18,7 @@
|
|
17
18
|
- You can now use .create to make a new item on a collection.
|
18
19
|
- .inspect for models is now cleaner
|
19
20
|
- Volt.current_user now works in HttpController's
|
21
|
+
- HttpControllers now can take promises in render.
|
20
22
|
- You can now add your own middleware to the middleware stack. (see docs)
|
21
23
|
- Added a threadpool for Tasks, and options to customize pool size in config/app.rb
|
22
24
|
- Volt now handles Syntax errors much better, it will display an error message when your app does not compile, and can reload from that page when things change. (in development)
|
@@ -37,6 +39,7 @@
|
|
37
39
|
- Each bindings now support promises.
|
38
40
|
- Volt.fetch_current_user has been deprecated and Volt.current_user now returns a promise.
|
39
41
|
- Volt.current_user? now returns a promise that yields a boolean
|
42
|
+
- Lots of bug fixes. (see github)
|
40
43
|
|
41
44
|
## 0.9.2
|
42
45
|
### Changed
|
data/lib/volt/cli/generate.rb
CHANGED
@@ -54,7 +54,7 @@ class Generate < Thor
|
|
54
54
|
method_option :name, type: :string, banner: 'The name of the HTTP Controller.'
|
55
55
|
method_option :component, type: :string, default: 'main', banner: 'The component the http_controller should be created in.', required: false
|
56
56
|
def http_controller(name, component = 'main')
|
57
|
-
name = name.underscore
|
57
|
+
name = name.underscore + '_controller' unless name =~ /_controller$/
|
58
58
|
|
59
59
|
output_file = Dir.pwd + "/app/#{component}/controllers/server/#{name.underscore}.rb"
|
60
60
|
spec_file = Dir.pwd + "/spec/app/#{component.underscore}/controllers/server/#{name}_spec.rb"
|
@@ -22,7 +22,7 @@ module Volt
|
|
22
22
|
@params = Volt::Model.new(request.params.symbolize_keys.merge(params), persistor: Volt::Persistors::Params)
|
23
23
|
end
|
24
24
|
|
25
|
-
def perform(action)
|
25
|
+
def perform(action='index')
|
26
26
|
filtered = run_actions(:before, action)
|
27
27
|
send(action.to_sym) unless filtered
|
28
28
|
run_actions(:after, action) unless filtered
|
@@ -55,6 +55,12 @@ module Volt
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def respond
|
58
|
+
unless @response_status
|
59
|
+
# render was not called, show an error
|
60
|
+
@response_body = ['Error: render was not called in controller action']
|
61
|
+
@response_status = 500
|
62
|
+
end
|
63
|
+
|
58
64
|
Rack::Response.new(response_body, response_status, response_headers)
|
59
65
|
end
|
60
66
|
|
@@ -6,6 +6,8 @@ require 'volt/models/state_helpers'
|
|
6
6
|
require 'volt/data_stores/data_store'
|
7
7
|
|
8
8
|
module Volt
|
9
|
+
class RecordNotFoundException < Exception ; end
|
10
|
+
|
9
11
|
class ArrayModel < ReactiveArray
|
10
12
|
include ModelWrapper
|
11
13
|
include ModelHelpers
|
@@ -114,12 +116,10 @@ module Volt
|
|
114
116
|
model
|
115
117
|
end.fail do |err|
|
116
118
|
# remove from the collection because it failed to save on the server
|
117
|
-
|
119
|
+
# we don't need to call delete on the server.
|
120
|
+
index = @array.index(model)
|
121
|
+
delete_at(index, true)
|
118
122
|
|
119
|
-
# TODO: the model might be in at a different position already, so we should use a full delete
|
120
|
-
trigger_removed!(@array.size - 1)
|
121
|
-
trigger_size_change!
|
122
|
-
#
|
123
123
|
# re-raise, err might not be an Error object, so we use a rejected promise to re-raise
|
124
124
|
Promise.new.reject(err)
|
125
125
|
end
|
@@ -161,6 +161,12 @@ module Volt
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
+
# Same as first, except it returns a promise (even on page collection), and
|
165
|
+
# it fails with a RecordNotFoundException if no result is found.
|
166
|
+
def first!
|
167
|
+
fail_not_found_if_nil(first)
|
168
|
+
end
|
169
|
+
|
164
170
|
# Return the first item in the collection, or create one if one does not
|
165
171
|
# exist yet.
|
166
172
|
def first_or_create
|
@@ -256,7 +262,13 @@ module Volt
|
|
256
262
|
end
|
257
263
|
|
258
264
|
def to_json
|
259
|
-
to_a
|
265
|
+
array = to_a
|
266
|
+
|
267
|
+
if array.is_a?(Promise)
|
268
|
+
array.then(&:to_json)
|
269
|
+
else
|
270
|
+
array.to_json
|
271
|
+
end
|
260
272
|
end
|
261
273
|
|
262
274
|
|
@@ -284,6 +296,17 @@ module Volt
|
|
284
296
|
model
|
285
297
|
end
|
286
298
|
|
299
|
+
# Raise a RecordNotFoundException if the promise returns a nil.
|
300
|
+
def fail_not_found_if_nil(promise)
|
301
|
+
promise.then do |val|
|
302
|
+
if val
|
303
|
+
val
|
304
|
+
else
|
305
|
+
raise RecordNotFoundException.new
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
287
310
|
# We need to setup the proxy methods below where they are defined.
|
288
311
|
proxy_with_load :[], :size, :last, :reverse, :all, :to_a
|
289
312
|
|
@@ -122,7 +122,7 @@ module Volt
|
|
122
122
|
|
123
123
|
alias_method :length, :size
|
124
124
|
|
125
|
-
def delete_at(index)
|
125
|
+
def delete_at(index, skip_persistor=false)
|
126
126
|
size = @array.size
|
127
127
|
# Handle a negative index
|
128
128
|
index = size + index if index < 0
|
@@ -143,7 +143,7 @@ module Volt
|
|
143
143
|
|
144
144
|
trigger_size_change!
|
145
145
|
|
146
|
-
@persistor.removed(model) if @persistor
|
146
|
+
@persistor.removed(model) if @persistor && !skip_persistor
|
147
147
|
|
148
148
|
model
|
149
149
|
end
|
@@ -30,12 +30,18 @@ module Volt
|
|
30
30
|
renderer = self.class.renderers[renderer_name]
|
31
31
|
to_render = content.delete(renderer_name)
|
32
32
|
rendered = renderer[:proc].call(to_render)
|
33
|
+
|
34
|
+
# Unwrap a promise if we got one back
|
35
|
+
if rendered.is_a?(Promise)
|
36
|
+
rendered = rendered.sync
|
37
|
+
end
|
38
|
+
|
33
39
|
return [rendered, content.merge(content_type: renderer[:content_type])]
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
37
43
|
# If we couldn't find a renderer - just render an empty string
|
38
|
-
['', content_type: 'text/plain']
|
44
|
+
["Error: render only supports #{self.class.renderers.keys.join(', ')}", content_type: 'text/plain']
|
39
45
|
end
|
40
46
|
end
|
41
47
|
end
|
@@ -16,9 +16,11 @@ class QuietCommonLogger < Rack::CommonLogger
|
|
16
16
|
ext = nil
|
17
17
|
end
|
18
18
|
|
19
|
+
@logged = false
|
20
|
+
|
19
21
|
body = BodyProxy.new(body) do
|
20
22
|
# Don't log on ignored extensions
|
21
|
-
|
23
|
+
if !@@ignore_extensions.include?(ext) && !@logged
|
22
24
|
log(env, status, header, began_at)
|
23
25
|
end
|
24
26
|
end
|
@@ -26,6 +28,7 @@ class QuietCommonLogger < Rack::CommonLogger
|
|
26
28
|
# Because of web sockets, the initial request doesn't finish, so we
|
27
29
|
# can just trigger it now.
|
28
30
|
unless ext || path.start_with?('/channel')
|
31
|
+
@logged = true
|
29
32
|
log(env, status, header, began_at)
|
30
33
|
end
|
31
34
|
|
data/lib/volt/version.rb
CHANGED
@@ -17,9 +17,9 @@ describe Volt::HttpResponseRenderer do
|
|
17
17
|
expect(additional_headers[:content_type]).to eq('text/plain')
|
18
18
|
end
|
19
19
|
|
20
|
-
it 'should
|
20
|
+
it 'should give renderer error if no suitable renderer could be found' do
|
21
21
|
body, additional_headers = renderer.render(some: 'text')
|
22
|
-
expect(body).to eq('')
|
22
|
+
expect(body).to eq('Error: render only supports json, text')
|
23
23
|
expect(additional_headers[:content_type]).to eq('text/plain')
|
24
24
|
end
|
25
25
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: volt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.3
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Stout
|
@@ -828,9 +828,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
828
828
|
version: '2.1'
|
829
829
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
830
830
|
requirements:
|
831
|
-
- - "
|
831
|
+
- - ">="
|
832
832
|
- !ruby/object:Gem::Version
|
833
|
-
version:
|
833
|
+
version: '0'
|
834
834
|
requirements: []
|
835
835
|
rubyforge_project:
|
836
836
|
rubygems_version: 2.4.5
|