validated_object 0.1.1 → 1.0.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.
- checksums.yaml +4 -4
- data/README.md +46 -6
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/lib/validated_object/version.rb +1 -1
- data/lib/validated_object.rb +16 -14
- data/validated_object.gemspec +14 -14
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 917e06893558682ef44f4ae1570d73bb265dc980
|
4
|
+
data.tar.gz: b622a865760b6b3626ed1f270313ef26686371f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95affa10a6d3ee9efc02ced04778a8df4adab2e03a914086afbe79717c679454766be1aae77d2aaa7f7da670b82ed5baf9dc20bf0a0b6c6b0c0527123ab2c732
|
7
|
+
data.tar.gz: 079acd77f94c7c4664534a489fe5525ad47ab38883e666ea8575065138ce158c6d4b73a42d14b9ed175400e8e8251db2a44ff3b11811fb45229444fe6712d64d
|
data/README.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
[](https://badge.fury.io/rb/validated_object) [](https://travis-ci.org/dogweather/validated_object) [](https://codeclimate.com/github/dogweather/validated_object)
|
2
|
+
|
1
3
|
# ValidatedObject
|
2
4
|
|
3
|
-
|
5
|
+
Uses
|
6
|
+
[ActiveModel::Validations](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates)
|
7
|
+
to create self-validating Plain Old Ruby objects. I wrote it for helping with CSV data imports into my Rails apps.
|
8
|
+
Very readable error messages are also important in that context, to track down parsing errors. This gem provides those too.
|
4
9
|
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
10
|
|
7
11
|
## Installation
|
8
12
|
|
@@ -22,20 +26,56 @@ Or install it yourself as:
|
|
22
26
|
|
23
27
|
## Usage
|
24
28
|
|
25
|
-
|
29
|
+
|
30
|
+
### Writing a self-validating object
|
31
|
+
|
32
|
+
All of the [ActiveModel::Validations](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates) are available, plus a new one, `TypeValidator`.
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
class Dog < ValidatedObject::Base
|
36
|
+
attr_accessor :name, :birthday
|
37
|
+
|
38
|
+
validates :name, presence: true
|
39
|
+
validates :birthday, type: Date, allow_nil: true
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
### Instantiating and automatically validating
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
# The dog1 instance validates itself at the end of instantiation.
|
47
|
+
# Here, it succeeds and so doesn't raise an exception.
|
48
|
+
dog1 = Dog.new do |d|
|
49
|
+
d.name = 'Spot'
|
50
|
+
end
|
51
|
+
|
52
|
+
# We can also explicitly test for validity
|
53
|
+
dog1.valid? # => true
|
54
|
+
|
55
|
+
dog1.birthday = Date.new(2015, 1, 23)
|
56
|
+
dog1.valid? # => true
|
57
|
+
```
|
58
|
+
|
59
|
+
### Making an instance _invalid_
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
dog1.birthday = '2015-01-23'
|
63
|
+
dog1.valid? # => false
|
64
|
+
dog1.check_validations! # => ArgumentError: Birthday is class String, not Date
|
65
|
+
```
|
66
|
+
|
26
67
|
|
27
68
|
## Development
|
28
69
|
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
70
|
+
(TODO: Verify these instructions.) After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
71
|
|
31
72
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
73
|
|
33
74
|
## Contributing
|
34
75
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
76
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/dogweather/validated_object.
|
36
77
|
|
37
78
|
|
38
79
|
## License
|
39
80
|
|
40
81
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
-
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'validated_object'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "validated_object"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/validated_object.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'active_model'
|
2
|
-
require
|
2
|
+
require 'validated_object/version'
|
3
3
|
|
4
4
|
module ValidatedObject
|
5
5
|
# @abstract Subclass and add `attr_accessor` and validations
|
@@ -11,7 +11,7 @@ module ValidatedObject
|
|
11
11
|
# creates very readable error messages.
|
12
12
|
#
|
13
13
|
# @example Writing a self-validating object
|
14
|
-
# class Dog <
|
14
|
+
# class Dog < ValidatedObject::Base
|
15
15
|
# attr_accessor :name, :birthday
|
16
16
|
#
|
17
17
|
# validates :name, presence: true
|
@@ -36,7 +36,7 @@ module ValidatedObject
|
|
36
36
|
# dog1.valid? # => false
|
37
37
|
# dog1.check_validations! # => ArgumentError: Birthday is class String, not Date
|
38
38
|
#
|
39
|
-
# @see
|
39
|
+
# @see ValidatedObject::Base::TypeValidator
|
40
40
|
# @see http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ ActiveModel: Make Any Ruby Object Feel Like ActiveRecord, Yehuda Katz
|
41
41
|
# @see http://www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html Rails 3.0′s ActiveModel: How To Give Ruby Classes Some ActiveRecord Magic, Peter Cooper
|
42
42
|
class Base
|
@@ -49,34 +49,36 @@ module ValidatedObject
|
|
49
49
|
#
|
50
50
|
# @raise [ArgumentError] if the object is not valid at the
|
51
51
|
# end of initialization.
|
52
|
-
def initialize
|
53
|
-
|
52
|
+
def initialize
|
53
|
+
yield(self)
|
54
54
|
check_validations!
|
55
|
+
self
|
55
56
|
end
|
56
57
|
|
57
58
|
# Run any validations and raise an error if invalid.
|
58
59
|
# @raise [ArgumentError] if any validations fail.
|
59
60
|
def check_validations!
|
60
|
-
|
61
|
+
raise ArgumentError, errors.full_messages.join('; ') if invalid?
|
62
|
+
self
|
61
63
|
end
|
62
64
|
|
63
|
-
# A custom validator which ensures an object is a
|
65
|
+
# A custom validator which ensures an object is an instance of a class
|
66
|
+
# or a subclass.
|
64
67
|
# It's here as a nested class in {ValidatedObject} for easy
|
65
|
-
# access by subclasses.
|
68
|
+
# access by subclasses of {ValidatedObject::Base}.
|
66
69
|
#
|
67
|
-
# @example Ensure that weight is a
|
68
|
-
# class Dog < ValidatedObject
|
70
|
+
# @example Ensure that weight is a number
|
71
|
+
# class Dog < ValidatedObject::Base
|
69
72
|
# attr_accessor :weight
|
70
|
-
# validates :weight, type:
|
73
|
+
# validates :weight, type: Numeric
|
71
74
|
# end
|
72
75
|
class TypeValidator < ActiveModel::EachValidator
|
73
76
|
# @return [nil]
|
74
77
|
def validate_each(record, attribute, value)
|
75
78
|
expected = options[:with]
|
76
|
-
|
77
|
-
return if actual == expected
|
79
|
+
return if value.kind_of?(expected)
|
78
80
|
|
79
|
-
msg = options[:message] || "is class #{
|
81
|
+
msg = options[:message] || "is class #{value.class}, not #{expected}"
|
80
82
|
record.errors.add attribute, msg
|
81
83
|
end
|
82
84
|
end
|
data/validated_object.gemspec
CHANGED
@@ -4,32 +4,32 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'validated_object/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'validated_object'
|
8
8
|
spec.version = ValidatedObject::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Robb Shecter']
|
10
|
+
spec.email = ['robb@weblaws.org']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'Self-validating plain Ruby objects.'
|
13
|
+
spec.description = 'A small wrapper around ActiveModel Validations.'
|
14
|
+
spec.homepage = 'https://github.com/dogweather/validated_object'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
18
|
# delete this section to allow pushing this gem to any host.
|
19
19
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
21
|
else
|
22
|
-
raise
|
22
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
23
23
|
end
|
24
24
|
|
25
25
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
-
spec.bindir =
|
26
|
+
spec.bindir = 'exe'
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = [
|
28
|
+
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'rspec'
|
33
33
|
|
34
34
|
spec.add_runtime_dependency 'activemodel', '>= 3.2.21'
|
35
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validated_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robb Shecter
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,8 +106,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
109
|
+
rubygems_version: 2.5.0
|
110
110
|
signing_key:
|
111
111
|
specification_version: 4
|
112
112
|
summary: Self-validating plain Ruby objects.
|
113
113
|
test_files: []
|
114
|
+
has_rdoc:
|