volt 0.9.3 → 0.9.4.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 73635c7ae6b384dcaecd996e5c28bd99773c508d
4
- data.tar.gz: 73703d5c1aff47c1ac8d7cd2fa514da542b1ee28
3
+ metadata.gz: 390291d6628b74ad144ac393109c5beab7ed1184
4
+ data.tar.gz: c4cf1d8701aeddbcda38c2e87f03db1b3a4c9db9
5
5
  SHA512:
6
- metadata.gz: 6faeee73ca44c142b8c88264dd89599d0351a6638b962d5b127aa54656bec4549caa22ba753a3b506a634bb212e3d1ef46175ec68b63c0e21f1bd58b6ebf009d
7
- data.tar.gz: 83ef2428fe1b75ae3e7140f0acbb3008a31c22c0643adacabe27844ab3921457eca5bbf7e6370cf5328cd9b113cd3c205266424b82cb9cf267d4cfcb2813f8b0
6
+ metadata.gz: d31cb4efd187cb590793c53fb23bae2a9a3f53d4ab86090b22c4c611a97bdfb06444b43c630c19ecb266cd59e41a0e8655542de52f5377ea7b981412b914235a
7
+ data.tar.gz: 8b5eca835a00949d4107b6257e8d18ffd34cf41514e94087e0a3e6aa2a0c04533861b318d2fed09ce7b20b2fe7930a8d5037bc59ad5da124c9ed16a6a885a02c
data/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.9.4.pre1
4
+ ### Added
5
+
6
+ ### Changed
7
+ - fixed bug with ReactiveHash#to_json
8
+ - fixed bug with field Numeric coersion
9
+
3
10
  ## 0.9.3
11
+ [0.9.3 Update Blog Post](http://blog.voltframework.com/post/121128931859/0-9-3-stuff-you-asked-for)
12
+ [Upgrade Guide](https://github.com/voltrb/volt/blob/master/docs/UPGRADE_GUIDE.md)
4
13
 
5
14
  ### Added
6
15
  - Added validations block for conditional validation runs
data/README.md CHANGED
@@ -33,6 +33,18 @@ Read the [full docs on Volt here](http://voltframework.com/docs)
33
33
 
34
34
  There is also a [work in progress tutorial](https://github.com/rhgraysonii/volt_tutorial) by @rhgraysonii
35
35
 
36
+ # More Videos
37
+
38
+ Rick Carlino has been putting together some great volt tutorial videos also.
39
+
40
+ - [Volt Tasks](http://datamelon.io/blog/2015/creating-volt-task-objects.html)
41
+ - [Build a Realtime Chat App with Volt](http://datamelon.io/blog/2015/building-a-chat-app-in-volt.html)
42
+ - [Understanding Volt Views](http://datamelon.io/blog/2015/understanding-views-in-volt-with-a-card-game.html)
43
+
44
+ # Getting Help
45
+
46
+ Have a question and need help? The volt team watches [stackoverflow](http://stackoverflow.com/search?q=voltrb) for questions and will get back to you quickly. Be sure to post the question with the #voltrb tag. If you have something you need to discuss, drop into our [gitter room](gitter.im/voltrb/volt).
47
+
36
48
  # Contributing
37
49
 
38
50
  You want to contribute? Great! Thanks for being awesome! At the moment, we have a big internal todo list, hop on https://gitter.im/voltrb/volt so we don't duplicate work. Pull requests are always welcome, but asking about helping on Gitter should save some duplication.
@@ -1,5 +1,9 @@
1
1
  # 0.9.2 to 0.9.3
2
2
 
3
+ Upgrading from 0.9.2 should be fairly simple, just implement the following:
4
+
5
+ ## Gemfile
6
+
3
7
  Add the following to your gemfile:
4
8
 
5
9
  ```ruby
@@ -13,4 +17,12 @@ gem 'csso-rails', '~> 0.3.4', require: false
13
17
  gem 'uglifier', '>= 2.4.0', require: false
14
18
 
15
19
  gem 'volt-mongo'
16
- ```
20
+ ```
21
+
22
+ ## Store Promises
23
+
24
+ The api for accessing the store collection has changed, to better understand the changes, watch [this explainer video](https://www.youtube.com/watch?v=1RX9i8ivtWI).
25
+
26
+ ## id vs _id
27
+
28
+ Everywhere you were using ```_id```, you should now just use ```id```. Volt's mongo adaptor will map ```id``` to ```_id``` when saving or querying. This change will make moving between databases easier.
data/lib/volt/cli.rb CHANGED
@@ -36,6 +36,16 @@ module Volt
36
36
  method_option :bind, type: :string, aliases: '-b', banner: 'the ip the server should bind to'
37
37
 
38
38
  def server
39
+ if ENV['PROFILE_BOOT']
40
+ begin
41
+ require 'ruby-prof'
42
+
43
+ RubyProf.start
44
+ rescue LoadError => e
45
+ puts "To run volt in a profile mode, you must add ruby-prof gem to the app's Gemfile"
46
+ end
47
+ end
48
+
39
49
  require 'fileutils'
40
50
  require 'volt/server'
41
51
 
data/lib/volt/config.rb CHANGED
@@ -48,7 +48,7 @@ else
48
48
  class << self
49
49
  def defaults
50
50
  app_name = File.basename(Dir.pwd)
51
- {
51
+ opts = {
52
52
  app_name: app_name,
53
53
  db_name: (ENV['DB_NAME'] || (app_name + '_' + Volt.env.to_s)).gsub('.', '_'),
54
54
  db_host: ENV['DB_HOST'] || 'localhost',
@@ -66,6 +66,10 @@ else
66
66
  max_worker_threads: 10,
67
67
  worker_timeout: 60
68
68
  }
69
+
70
+ opts[:db_uri] = ENV['DB_URI'] if ENV['DB_URI']
71
+
72
+ opts
69
73
  end
70
74
 
71
75
  # Resets the configuration to the default (empty hash)
@@ -1,7 +1,7 @@
1
1
  # The Actions module adds helpers for setting up and using
2
2
  # actions on a class. You can setup helpers for an action with
3
3
  #
4
- # setup_action_helpers_in_class(:before, :after)
4
+ # setup_action_helpers_in_class(:before_action, :after_action)
5
5
  #
6
6
  # The above will setup before_action and after_action methods on
7
7
  # the class. Typically setup_action_helpers_in_class will be run
@@ -21,11 +21,11 @@ module Volt
21
21
  def setup_action_helpers_in_class(*groups)
22
22
  groups.each do |group|
23
23
  # Setup a class attribute to track the
24
- callbacks_var_name = :"#{group}_action_callbacks"
24
+ callbacks_var_name = :"#{group}_callbacks"
25
25
  class_attribute(callbacks_var_name)
26
26
 
27
27
  # Create the method on the class
28
- define_singleton_method(:"#{group}_action") do |*args, &block|
28
+ define_singleton_method(group) do |*args, &block|
29
29
  # Add the block in place of the symbol
30
30
  args.unshift(block) if block
31
31
 
@@ -56,7 +56,7 @@ module Volt
56
56
  # and the action being called on. If the callback chain was stopped with
57
57
  # #stop_chain, it will return true, otherwise false.
58
58
  def run_actions(group, action)
59
- callbacks = self.class.send(:"#{group}_action_callbacks")
59
+ callbacks = self.class.send(:"#{group}_callbacks")
60
60
 
61
61
  filtered_callbacks = filter_actions_by_only_exclude(callbacks || [], action)
62
62
 
@@ -11,7 +11,7 @@ module Volt
11
11
  attr_accessor :params
12
12
 
13
13
  # Setup before_action and after_action
14
- setup_action_helpers_in_class(:before, :after)
14
+ setup_action_helpers_in_class(:before_action, :after_action)
15
15
 
16
16
  # Initialzed with the params parsed from the route and the HttpRequest
17
17
  def initialize(volt_app, params, request)
@@ -23,9 +23,9 @@ module Volt
23
23
  end
24
24
 
25
25
  def perform(action='index')
26
- filtered = run_actions(:before, action)
26
+ filtered = run_actions(:before_action, action)
27
27
  send(action.to_sym) unless filtered
28
- run_actions(:after, action) unless filtered
28
+ run_actions(:after_action, action) unless filtered
29
29
  respond
30
30
  end
31
31
 
@@ -23,7 +23,7 @@ module Volt
23
23
  attr_accessor :section
24
24
 
25
25
  # Setup before_action and after_action
26
- setup_action_helpers_in_class(:before, :after)
26
+ setup_action_helpers_in_class(:before_action, :after_action)
27
27
 
28
28
  # Container returns the node that is parent to all nodes in the section.
29
29
  def container
@@ -10,6 +10,11 @@ module FieldHelpers
10
10
  fail FieldHelpers::InvalidFieldClass, 'valid field types is currently limited to String or Numeric'
11
11
  end
12
12
 
13
+ if klass
14
+ # Add type validation
15
+ validate name, type: klass
16
+ end
17
+
13
18
  define_method(name) do
14
19
  get(name)
15
20
  end
@@ -21,7 +26,20 @@ module FieldHelpers
21
26
  if klass == String
22
27
  val = val.to_s
23
28
  elsif klass == Numeric
24
- val = val.to_f
29
+ begin
30
+ orig = val
31
+ unless val.is_a?(Numeric)
32
+ val = Float(val)
33
+ end
34
+
35
+ if RUBY_PLATFORM == 'opal'
36
+ # Opal has a bug in 0.7.2 that gives us back NaN without an
37
+ # error sometimes.
38
+ val = orig if val.nan?
39
+ end
40
+ rescue TypeError, ArgumentError => e
41
+ # ignore, unmatched types will be caught below.
42
+ end
25
43
  end
26
44
  end
27
45
 
@@ -334,7 +334,7 @@ module Volt
334
334
  result = parent.delete(self)
335
335
 
336
336
  # Wrap result in a promise if it isn't one
337
- return Promise.new.then { result }
337
+ return result.then
338
338
  else
339
339
  fail 'Model does not have a parent and cannot be deleted.'
340
340
  end
@@ -19,7 +19,12 @@ end
19
19
 
20
20
  module Volt
21
21
  class RootModels
22
+ class_attribute :model_classes
23
+ self.model_classes = []
24
+
22
25
  def self.add_model_class(klass)
26
+ self.model_classes << klass
27
+
23
28
  method_name = klass.to_s.underscore.pluralize
24
29
 
25
30
  # Create a getter for each model class off of root.
@@ -20,7 +20,6 @@ module Volt
20
20
 
21
21
  def get(attr_name, expand = false)
22
22
  res = if attr_name.singular? && attr_name.to_sym != :id
23
- puts "GET: #{attr_name}"
24
23
  model_for_root.get(attr_name, expand)
25
24
  else
26
25
  super
@@ -32,7 +31,6 @@ module Volt
32
31
 
33
32
  def set(attr_name, value, &block)
34
33
  if attr_name.singular? && attr_name.to_sym != :id
35
- puts "SET ATTR NAME: #{attr_name.inspect}: #{value.inspect}"
36
34
  Volt::Computation.run_without_tracking do
37
35
  model_for_root.then do |model|
38
36
  model.set(attr_name, value, &block)
@@ -6,6 +6,7 @@ require 'volt/models/validators/numericality_validator'
6
6
  require 'volt/models/validators/phone_number_validator'
7
7
  require 'volt/models/validators/presence_validator'
8
8
  require 'volt/models/validators/unique_validator'
9
+ require 'volt/models/validators/type_validator'
9
10
 
10
11
  module Volt
11
12
  # Include in any class to get validation logic
@@ -0,0 +1,23 @@
1
+ # Enforces a type on a field. Typically setup from ```field :name, Type```
2
+ module Volt
3
+ class TypeValidator
4
+ def self.validate(model, field_name, args)
5
+ errors = {}
6
+ value = model.get(field_name)
7
+
8
+ type_restriction = args.is_a?(Hash) ? args[:type] : args
9
+
10
+ unless value.is_a?(type_restriction)
11
+ if args.is_a?(Hash) && args[:message]
12
+ message = args[:message]
13
+ else
14
+ message = "must be of type #{type_restriction.to_s}"
15
+ end
16
+
17
+ errors[field_name] = [message]
18
+ end
19
+
20
+ errors
21
+ end
22
+ end
23
+ end
@@ -25,7 +25,7 @@ module Volt
25
25
  # If no stage, then we are calling the main action method,
26
26
  # so we should call the before/after actions
27
27
  unless has_stage
28
- if @controller.run_actions(:before, @action)
28
+ if @controller.run_actions(:before_action, @action)
29
29
  # stop_chain was called
30
30
  return true
31
31
  end
@@ -33,7 +33,7 @@ module Volt
33
33
 
34
34
  @controller.send(method_name) if @controller.respond_to?(method_name)
35
35
 
36
- @controller.run_actions(:after, @action) unless has_stage
36
+ @controller.run_actions(:after_action, @action) unless has_stage
37
37
 
38
38
  # before_action chain was not stopped
39
39
  false
@@ -65,6 +65,10 @@ module Volt
65
65
  @hash
66
66
  end
67
67
 
68
+ def to_json
69
+ @hash.to_json
70
+ end
71
+
68
72
  def inspect
69
73
  @all_deps.depend
70
74
  "#<#{self.class.name} #{@hash.inspect}>"
@@ -91,7 +91,7 @@ module Volt
91
91
  begin
92
92
  @message_encoder.send_message(@socket, message)
93
93
  # 'Error: closed stream' comes in sometimes
94
- rescue Errno::ECONNREFUSED, Errno::EPIPE, IOError => e # was also rescuing Error
94
+ rescue Errno::ECONNREFUSED, Errno::ENETUNREACH, Errno::EPIPE, IOError => e # was also rescuing Error
95
95
  if reconnect!
96
96
  retry
97
97
  else
@@ -113,7 +113,7 @@ module Volt
113
113
  end
114
114
 
115
115
  # Got nil from socket
116
- rescue Errno::ECONNRESET, Errno::EPIPE, IOError => e
116
+ rescue Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EPIPE, IOError => e
117
117
  # handle below
118
118
  end
119
119
 
@@ -138,7 +138,7 @@ module Volt
138
138
  begin
139
139
  socket = SocketWithTimeout.new(ip, port, CONNECT_TIMEOUT)
140
140
  return PeerConnection.new(socket, ip, port, message_bus)
141
- rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT => e
141
+ rescue Errno::ECONNREFUSED, Errno::ENETUNREACH, Errno::ETIMEDOUT => e
142
142
  # Unable to connect, next
143
143
  next
144
144
  end
@@ -9,14 +9,8 @@ module Volt
9
9
  def initialize
10
10
  # Setup the next app
11
11
  @middlewares = []
12
- @maps = []
13
12
  end
14
13
 
15
- # Set the app that gets called after the middleware runs
16
- # def set_app(app)
17
- # @app = app
18
- # end
19
-
20
14
  def use(*args, &block)
21
15
  @middlewares << [args, block]
22
16
 
@@ -25,7 +19,10 @@ module Volt
25
19
  end
26
20
 
27
21
  def map(path, &block)
28
- @maps << [path, block]
22
+ @middlewares << [:map, path, block]
23
+
24
+ # invalidate builder
25
+ @builder = nil
29
26
  end
30
27
 
31
28
  def run(app)
@@ -36,12 +33,12 @@ module Volt
36
33
  def build
37
34
  @builder = Rack::Builder.new
38
35
 
39
- @maps.each do |path, block|
40
- @builder.map(path, &block)
41
- end
42
-
43
36
  @middlewares.each do |middleware|
44
- @builder.use(*middleware[0], &middleware[1])
37
+ if middleware[0] == :map
38
+ @builder.map(middleware[1], &middleware[2])
39
+ else
40
+ @builder.use(*middleware[0], &middleware[1])
41
+ end
45
42
  end
46
43
 
47
44
  @builder.run(@app)
@@ -1,6 +1,14 @@
1
1
  require 'faye/websocket'
2
2
  require 'volt/server/socket_connection_handler'
3
3
 
4
+ # Load websocket options once at boot
5
+ # The ENV['DYNO'] option lets it kick in automatically if we're on heroku.
6
+ WEBSOCKET_OPTIONS = if !ENV['NO_WEBSOCKET_PING'] &&
7
+ (ENV['WEBSOCKET_PING_TIME'] || ENV['DYNO'])
8
+ {ping: (ENV['WEBSOCKET_PING_TIME'] || 30).to_i}
9
+ else
10
+ {}
11
+ end
4
12
 
5
13
  module Volt
6
14
  class WebsocketHandler
@@ -10,7 +18,7 @@ module Volt
10
18
 
11
19
  def call(env)
12
20
  if Faye::WebSocket.websocket?(env)
13
- ws = Faye::WebSocket.new(env)
21
+ ws = Faye::WebSocket.new(env, nil, WEBSOCKET_OPTIONS)
14
22
 
15
23
  socket_connection_handler = SocketConnectionHandler.new(ws)
16
24
 
data/lib/volt/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Volt
2
2
  module Version
3
- STRING = '0.9.3'
3
+ STRING = '0.9.4.pre1'
4
4
  end
5
5
  end
@@ -15,6 +15,10 @@ module Volt
15
15
  nil
16
16
  else
17
17
  index = user_id_signature.index(':')
18
+
19
+ # If no index, the cookie is invalid
20
+ return nil unless index
21
+
18
22
  user_id = user_id_signature[0...index]
19
23
 
20
24
  if RUBY_PLATFORM != 'opal'
@@ -4,7 +4,7 @@ require 'volt/controllers/model_controller'
4
4
  class BaseTestActions
5
5
  include Volt::Actions
6
6
 
7
- setup_action_helpers_in_class(:before, :after)
7
+ setup_action_helpers_in_class(:before_action, :after_action)
8
8
  end
9
9
 
10
10
  class TestActionsBlocks < BaseTestActions
@@ -77,7 +77,7 @@ describe Volt::Actions do
77
77
  expect(test_class.ran_before1).to eq(nil)
78
78
  expect(test_class.ran_before2).to eq(nil)
79
79
 
80
- test_class.run_actions(:before, :index)
80
+ test_class.run_actions(:before_action, :index)
81
81
 
82
82
  expect(test_class.ran_before1).to eq(true)
83
83
  expect(test_class.ran_before2).to eq(true)
@@ -89,7 +89,7 @@ describe Volt::Actions do
89
89
  expect(test_class.ran_one).to eq(nil)
90
90
  expect(test_class.ran_two).to eq(nil)
91
91
 
92
- test_class.run_actions(:before, :index)
92
+ test_class.run_actions(:before_action, :index)
93
93
 
94
94
  expect(test_class.ran_one).to eq(true)
95
95
  expect(test_class.ran_two).to eq(true)
@@ -107,7 +107,7 @@ describe Volt::Actions do
107
107
  expect(test_class.ran_one).to eq(nil)
108
108
  expect(test_class.ran_two).to eq(nil)
109
109
 
110
- result = test_class.run_actions(:before, :index)
110
+ result = test_class.run_actions(:before_action, :index)
111
111
  expect(result).to eq(false)
112
112
 
113
113
  expect(test_class.ran_one).to eq(true)
@@ -117,7 +117,7 @@ describe Volt::Actions do
117
117
  it 'should stop the chain when #stop_chain is called and return false from #run_actions' do
118
118
  test_class = TestStopCallbacks.new
119
119
 
120
- result = test_class.run_actions(:before, :index)
120
+ result = test_class.run_actions(:before_action, :index)
121
121
  expect(result).to eq(true)
122
122
 
123
123
  expect(test_class.ran_one).to eq(true)
@@ -129,18 +129,18 @@ describe Volt::Actions do
129
129
  it 'should call without any callbacks' do
130
130
  test_class = TestNoCallbacks.new
131
131
 
132
- result = test_class.run_actions(:before, :index)
132
+ result = test_class.run_actions(:before_action, :index)
133
133
  expect(result).to eq(false)
134
134
  end
135
135
 
136
136
  it 'should follow only limitations' do
137
137
  test_only = TestOnlyCallbacks.new
138
138
 
139
- test_only.run_actions(:before, :index)
139
+ test_only.run_actions(:before_action, :index)
140
140
  expect(test_only.ran_one).to eq(nil)
141
141
  expect(test_only.ran_two).to eq(nil)
142
142
 
143
- test_only.run_actions(:before, :new)
143
+ test_only.run_actions(:before_action, :new)
144
144
  expect(test_only.ran_one).to eq(true)
145
145
  expect(test_only.ran_two).to eq(true)
146
146
  end
@@ -7,8 +7,8 @@ class ExampleModelWithField < Volt::Model
7
7
  end
8
8
 
9
9
  describe 'field helpers' do
10
+ let(:model) { ExampleModelWithField.new }
10
11
  it 'should allow a user to setup a field that can be written to and read' do
11
- model = ExampleModelWithField.new
12
12
 
13
13
  expect(model.name).to eq(nil)
14
14
  model.name = 'jimmy'
@@ -26,4 +26,20 @@ describe 'field helpers' do
26
26
  ExampleModelWithField.field :awesome, Array
27
27
  end.to raise_error(FieldHelpers::InvalidFieldClass)
28
28
  end
29
+
30
+ it 'should convert numeric strings to Fixnum when Fixnum is specified as a type restriction' do
31
+ model.value = '22'
32
+ expect(model.value).to eq(22)
33
+ end
34
+
35
+ it 'should not convert non-numeric strings (and have a validation error)' do
36
+ # use a buffer, so we can put the model into an invalid state
37
+ buf = model.buffer
38
+ buf.value = 'cats'
39
+ expect(buf.value).to eq('cats')
40
+
41
+ buf.validate!.fail do |error|
42
+ expect(error).to eq({})
43
+ end
44
+ end
29
45
  end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Volt::TypeValidator do
4
+ subject { Volt::TypeValidator.validate(*use_params) }
5
+ let(:use_params) { [model, field_name, options] }
6
+
7
+ let(:model) { Volt::Model.new count: count }
8
+ let(:field_name) { :count }
9
+ let(:name) { 'John Doe' }
10
+
11
+ describe '.validate' do
12
+ describe 'when options is a Numeric' do
13
+ let(:options) { Numeric }
14
+
15
+ describe 'when count is a Numeric' do
16
+ let(:count) { 5 }
17
+ it { expect(subject).to eq({}) }
18
+ end
19
+
20
+ describe 'when count is a string' do
21
+ let(:count) { 'Cats' }
22
+ it do
23
+ expect(subject).to eq({count: ['must be of type Numeric']})
24
+ end
25
+ end
26
+ end
27
+
28
+ describe 'when options is a Hash' do
29
+ let(:options) do
30
+ { type: Numeric, message: 'must be a number' }
31
+ end
32
+
33
+ describe 'when count is a Numeric' do
34
+ let(:count) { 5 }
35
+ it { expect(subject).to eq({}) }
36
+ end
37
+
38
+ describe 'when count is a string' do
39
+ let(:count) { 'Cats' }
40
+ it do
41
+ expect(subject).to eq(count: ['must be a number'])
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -9,4 +9,9 @@ describe Volt::ReactiveHash do
9
9
  a.clear
10
10
  expect(a[:name]).to eq(nil)
11
11
  end
12
+
13
+ it 'should return to_json' do
14
+ a = Volt::ReactiveHash.new({name: 'bob'})
15
+ expect(a.to_json).to eq("{\"name\":\"bob\"}")
16
+ end
12
17
  end
@@ -42,11 +42,11 @@ group :test do
42
42
  end
43
43
 
44
44
  # Server for MRI
45
- platform :mri do
45
+ platform :mri, :mingw do
46
46
  # The implementation of ReadWriteLock in Volt uses concurrent ruby and ext helps performance.
47
47
  gem 'concurrent-ruby-ext', '~> 0.8.0'
48
48
 
49
- # Thin is the default volt server, you Puma is also supported
49
+ # Thin is the default volt server, Puma is also supported
50
50
  gem 'thin', '~> 1.6.0'
51
51
  gem 'bson_ext', '~> 1.9.0'
52
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
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.4.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Stout
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-09 00:00:00.000000000 Z
11
+ date: 2015-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -475,6 +475,7 @@ files:
475
475
  - lib/volt/models/validators/numericality_validator.rb
476
476
  - lib/volt/models/validators/phone_number_validator.rb
477
477
  - lib/volt/models/validators/presence_validator.rb
478
+ - lib/volt/models/validators/type_validator.rb
478
479
  - lib/volt/models/validators/unique_validator.rb
479
480
  - lib/volt/models/validators/user_validation.rb
480
481
  - lib/volt/page/bindings/attribute_binding.rb
@@ -679,6 +680,7 @@ files:
679
680
  - spec/models/validators/length_validator_spec.rb
680
681
  - spec/models/validators/phone_number_validator_spec.rb
681
682
  - spec/models/validators/shared_examples_for_validators.rb
683
+ - spec/models/validators/type_validator_spec.rb
682
684
  - spec/models/validators/unique_validator_spec.rb
683
685
  - spec/page/bindings/content_binding_spec.rb
684
686
  - spec/page/bindings/each_binding_spec.rb
@@ -828,9 +830,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
828
830
  version: '2.1'
829
831
  required_rubygems_version: !ruby/object:Gem::Requirement
830
832
  requirements:
831
- - - ">="
833
+ - - ">"
832
834
  - !ruby/object:Gem::Version
833
- version: '0'
835
+ version: 1.3.1
834
836
  requirements: []
835
837
  rubyforge_project:
836
838
  rubygems_version: 2.4.5
@@ -924,6 +926,7 @@ test_files:
924
926
  - spec/models/validators/length_validator_spec.rb
925
927
  - spec/models/validators/phone_number_validator_spec.rb
926
928
  - spec/models/validators/shared_examples_for_validators.rb
929
+ - spec/models/validators/type_validator_spec.rb
927
930
  - spec/models/validators/unique_validator_spec.rb
928
931
  - spec/page/bindings/content_binding_spec.rb
929
932
  - spec/page/bindings/each_binding_spec.rb