hydra-validations 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/README.md +30 -7
- data/lib/hydra/validations/single_cardinality_validator.rb +5 -2
- data/lib/hydra/validations/uniqueness_validator.rb +9 -9
- data/lib/hydra/validations/version.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/support/shared_examples_for_validators.rb +33 -0
- data/spec/validators/single_cardinality_validator_spec.rb +10 -25
- data/spec/validators/uniqueness_validator_spec.rb +48 -20
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9dfa48b0a0b2e0a48f98c2e74997eb01561f0e9
|
4
|
+
data.tar.gz: e079173cde687fd5330d95899159f3770ecbe033
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3bf062ad4331cbbf804944742f837b4e6c8bb1fdf79281e9f2d5438b51f29a10bedad490df5e7ce3fb321cd63a92eca683ddb74310b1c7f1aaf0b86b10b4612
|
7
|
+
data.tar.gz: c436515ce8b56ac20c3c50331b800a8fef0d891a31398f3d02f5f833c02523f72f8e154af0e352504860cc71549efeccf390a20ad64cf800c4d20dc1ea79effa
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
hydra-validations
|
2
2
|
=======================
|
3
3
|
|
4
|
-
Custom validators for Hydra applications based on ActiveModel::Validations.
|
4
|
+
Custom validators for Hydra applications, based on ActiveModel::Validations.
|
5
5
|
|
6
|
-
|
6
|
+
[![Build Status](https://travis-ci.org/projecthydra-labs/hydra-validations.svg?branch=master)](https://travis-ci.org/projecthydra-labs/hydra-validations)
|
7
|
+
[![Gem Version](https://badge.fury.io/rb/hydra-validations.svg)](http://badge.fury.io/rb/hydra-validations)
|
8
|
+
|
9
|
+
## Dependencies
|
7
10
|
|
8
11
|
* Ruby >= 1.9.3
|
9
12
|
* ActiveModel 4.x
|
10
13
|
* ActiveFedora 7.x
|
11
14
|
|
12
|
-
|
15
|
+
## Installation
|
13
16
|
|
14
17
|
Include in your Gemfile:
|
15
18
|
|
@@ -23,14 +26,34 @@ and
|
|
23
26
|
bundle install
|
24
27
|
```
|
25
28
|
|
26
|
-
|
29
|
+
## Validators
|
30
|
+
|
31
|
+
See also the source code andn spec tests.
|
32
|
+
|
33
|
+
### UniquenessValidator (ActiveFedora)
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
class Validatable < ActiveFedora::Base
|
37
|
+
include Hydra::Validations
|
38
|
+
has_metadata name: 'descMetadata', type: ActiveFedora::QualifiedDublinCoreDatastream
|
39
|
+
has_attributes :title, datastream: 'descMetadata', multiple: false
|
40
|
+
# Can use with multi-value attributes, but single cardinality is required.
|
41
|
+
# See SingleCardinalityValidator below.
|
42
|
+
has_attributes :source, datastream: 'descMetadata', multiple: true
|
43
|
+
|
44
|
+
# validates_uniqueness_of helper method
|
45
|
+
validates_uniqueness_of :title, solr_name: "title_ssi"
|
46
|
+
|
47
|
+
# Using `validates' with options
|
48
|
+
validates :source, uniqueness: { solr_name: "subject_ssim" }
|
49
|
+
end
|
50
|
+
```
|
27
51
|
|
28
|
-
|
29
|
-
ActiveRecord::Base and ActiveFedora::Base already include ActiveModel::Validations.
|
52
|
+
### SingleCardinalityValidatory (Can be used with POROs)
|
30
53
|
|
31
54
|
```ruby
|
32
55
|
class Validatable
|
33
|
-
include ActiveModel::Validations
|
56
|
+
include ActiveModel::Validations # required if not already included in class
|
34
57
|
include Hydra::Validations
|
35
58
|
attr_accessor :field
|
36
59
|
validates :field, single_cardinality: true
|
@@ -1,8 +1,11 @@
|
|
1
1
|
#
|
2
2
|
# SingleCardinalityValidator - validates that an enumerator value has size 0 or 1
|
3
3
|
#
|
4
|
-
# validates :
|
5
|
-
# validates_single_cardinality_of :
|
4
|
+
# validates :myattr, single_cardinality: true
|
5
|
+
# validates_single_cardinality_of :myattr
|
6
|
+
#
|
7
|
+
# Blank and nil values are considered valid (even without :allow_blank or :allow_nil
|
8
|
+
# validator options).
|
6
9
|
#
|
7
10
|
module Hydra
|
8
11
|
module Validations
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'hydra/validations'
|
2
|
+
|
1
3
|
module Hydra
|
2
4
|
module Validations
|
3
5
|
#
|
@@ -11,28 +13,26 @@ module Hydra
|
|
11
13
|
# Restrictions:
|
12
14
|
#
|
13
15
|
# - Accepts only one attribute (can have more than one UniquenessValidator on a model, however)
|
14
|
-
# - Attribute cannot be multi-valued (:multiple=>true option of `has_attributes')
|
15
16
|
# - :solr_name option must be present
|
17
|
+
# - Can be used on enumerable values (attribute defined with :multiple=>true option), but
|
18
|
+
# validator subclasses SingleCardinalityValidator, so will not pass validation if enumerable
|
19
|
+
# has more than one member.
|
16
20
|
#
|
17
21
|
# CAVEAT: The determination of uniqueness depends on a Solr query.
|
18
22
|
# False negatives (record invalid) may result if, for example,
|
19
23
|
# querying a Solr field of type "text".
|
20
24
|
#
|
21
|
-
class UniquenessValidator <
|
22
|
-
|
23
|
-
def initialize(options = {})
|
24
|
-
super
|
25
|
-
attributes.each do |attr|
|
26
|
-
raise ArgumentError, "Cannot validate uniqueness on a multi-valued attribute: #{attribute}." if options[:class].multiple?(attr)
|
27
|
-
end
|
28
|
-
end
|
25
|
+
class UniquenessValidator < SingleCardinalityValidator
|
29
26
|
|
30
27
|
def check_validity!
|
28
|
+
super
|
31
29
|
raise ArgumentError, "UniquenessValidator accepts only a single attribute: #{attribues}" if attributes.length > 1
|
32
30
|
raise ArgumentError, "UniquenessValidator requires the :solr_name option be present." unless options[:solr_name].present?
|
33
31
|
end
|
34
32
|
|
35
33
|
def validate_each(record, attribute, value)
|
34
|
+
super
|
35
|
+
value = value.first if record.class.multiple?(attribute)
|
36
36
|
conditions = {options[:solr_name] => value}
|
37
37
|
conditions.merge!("-id" => record.id) if record.persisted?
|
38
38
|
if record.class.exists? conditions
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
shared_examples "it validates the single cardinality of an enumerable attribute" do
|
2
|
+
it "should be valid when the attribute value is nil" do
|
3
|
+
subject.send("#{attribute}=", nil)
|
4
|
+
expect(subject).to be_valid
|
5
|
+
end
|
6
|
+
it "should be valid if the value is empty" do
|
7
|
+
subject.send("#{attribute}=", [])
|
8
|
+
expect(subject).to be_valid
|
9
|
+
end
|
10
|
+
it "should be valid if the value has one element" do
|
11
|
+
subject.send("#{attribute}=", ["foo"])
|
12
|
+
expect(subject).to be_valid
|
13
|
+
end
|
14
|
+
it "should be invalid if the value has more than one element" do
|
15
|
+
subject.send("#{attribute}=", ["foo", "bar"])
|
16
|
+
expect(subject).not_to be_valid
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_examples "it validates the single cardinality of a scalar attribute" do
|
21
|
+
it "should be valid when the attribute value is nil" do
|
22
|
+
subject.send("#{attribute}=", nil)
|
23
|
+
expect(subject).to be_valid
|
24
|
+
end
|
25
|
+
it "should be valid when the value is blank" do
|
26
|
+
subject.send("#{attribute}=", "")
|
27
|
+
expect(subject).to be_valid
|
28
|
+
end
|
29
|
+
it "should be valid when the value is present" do
|
30
|
+
subject.send("#{attribute}=", "foo")
|
31
|
+
expect(subject).to be_valid
|
32
|
+
end
|
33
|
+
end
|
@@ -1,28 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'support/shared_examples_for_validators'
|
2
3
|
|
3
|
-
shared_examples "it validates the single cardinality of the
|
4
|
-
|
5
|
-
|
6
|
-
expect(subject).to be_valid
|
7
|
-
end
|
8
|
-
it "should be valid when the field value is a scalar" do
|
9
|
-
subject.field = "foo"
|
10
|
-
expect(subject).to be_valid
|
11
|
-
end
|
12
|
-
context "when the field value is an enumerable" do
|
13
|
-
it "should be valid if the value is empty" do
|
14
|
-
subject.field = []
|
15
|
-
expect(subject).to be_valid
|
16
|
-
end
|
17
|
-
it "should be valid if the value has one element" do
|
18
|
-
subject.field = ["foo"]
|
19
|
-
expect(subject).to be_valid
|
20
|
-
end
|
21
|
-
it "should be invalid if the value has more than one element" do
|
22
|
-
subject.field = ["foo", "bar"]
|
23
|
-
expect(subject).not_to be_valid
|
24
|
-
end
|
25
|
-
end
|
4
|
+
shared_examples "it validates the single cardinality of the attribute" do
|
5
|
+
it_behaves_like "it validates the single cardinality of a scalar attribute"
|
6
|
+
it_behaves_like "it validates the single cardinality of an enumerable attribute"
|
26
7
|
end
|
27
8
|
|
28
9
|
describe Hydra::Validations::SingleCardinalityValidator do
|
@@ -38,11 +19,15 @@ describe Hydra::Validations::SingleCardinalityValidator do
|
|
38
19
|
subject { Validatable.new }
|
39
20
|
describe ".validates" do
|
40
21
|
before { Validatable.validates :field, single_cardinality: true }
|
41
|
-
it_behaves_like "it validates the single cardinality of the
|
22
|
+
it_behaves_like "it validates the single cardinality of the attribute" do
|
23
|
+
let(:attribute) { :field }
|
24
|
+
end
|
42
25
|
end
|
43
26
|
describe ".validates_single_cardinality_of" do
|
44
27
|
before { Validatable.validates_single_cardinality_of :field }
|
45
|
-
it_behaves_like "it validates the single cardinality of the
|
28
|
+
it_behaves_like "it validates the single cardinality of the attribute" do
|
29
|
+
let(:attribute) { :field }
|
30
|
+
end
|
46
31
|
end
|
47
32
|
end
|
48
33
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'active_fedora'
|
3
|
+
require 'support/shared_examples_for_validators'
|
3
4
|
|
4
5
|
shared_examples "it validates the uniqueness of the attribute value" do
|
5
6
|
context "when the value is not taken" do
|
@@ -23,8 +24,7 @@ describe Hydra::Validations::UniquenessValidator do
|
|
23
24
|
include Hydra::Validations
|
24
25
|
has_metadata name: 'descMetadata', type: ActiveFedora::QualifiedDublinCoreDatastream
|
25
26
|
has_attributes :title, datastream: 'descMetadata', multiple: false
|
26
|
-
has_attributes :
|
27
|
-
has_attributes :subject, datastream: 'descMetadata', multiple: true
|
27
|
+
has_attributes :source, datastream: 'descMetadata', multiple: true
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -32,11 +32,8 @@ describe Hydra::Validations::UniquenessValidator do
|
|
32
32
|
|
33
33
|
describe "exceptions" do
|
34
34
|
before { Validatable.clear_validators! }
|
35
|
-
it "cannot be used on a multi-valued attribute" do
|
36
|
-
expect { Validatable.validates :subject, uniqueness: { solr_name: "subject_ssim" } }.to raise_error
|
37
|
-
end
|
38
35
|
it "cannot be used on more than one attribute at a time" do
|
39
|
-
expect { Validatable.validates :title, :
|
36
|
+
expect { Validatable.validates :title, :source, uniqueness: { solr_name: "snafu_ssim" } }.to raise_error
|
40
37
|
end
|
41
38
|
it "cannot be used without the :solr_name option" do
|
42
39
|
expect { Validatable.validates :title, uniqueness: true }.to raise_error
|
@@ -44,23 +41,54 @@ describe Hydra::Validations::UniquenessValidator do
|
|
44
41
|
end
|
45
42
|
|
46
43
|
describe "validation" do
|
47
|
-
subject { Validatable.new(pid: "foobar:1", title: "I am Unique!") }
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
44
|
+
subject { Validatable.new(pid: "foobar:1", title: "I am Unique!", source: ["Outer Space"]) }
|
45
|
+
context "with a scalar attribute (:multiple=>false)" do
|
46
|
+
before(:all) do
|
47
|
+
Validatable.clear_validators!
|
48
|
+
Validatable.validates_uniqueness_of :title, solr_name: "title_ssi"
|
49
|
+
end
|
50
|
+
context "cardinality validation" do
|
51
|
+
before { allow(Validatable).to receive(:exists?) { false } }
|
52
|
+
it_behaves_like "it validates the single cardinality of a scalar attribute" do
|
53
|
+
let(:attribute) { :title }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
context "when the record is new" do
|
57
|
+
before { allow(subject).to receive(:persisted?) { false } }
|
58
|
+
it_behaves_like "it validates the uniqueness of the attribute value" do
|
59
|
+
let(:conditions) { {"title_ssi" => subject.title} }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
context "when the record is persisted" do
|
63
|
+
before { allow(subject).to receive(:persisted?) { true } }
|
64
|
+
it_behaves_like "it validates the uniqueness of the attribute value" do
|
65
|
+
let(:conditions) { {"title_ssi" => subject.title, "-id" => subject.pid} }
|
66
|
+
end
|
57
67
|
end
|
58
68
|
end
|
59
|
-
context "
|
60
|
-
before
|
61
|
-
|
62
|
-
|
69
|
+
context "with an enumerable attribute (:multiple=>true)" do
|
70
|
+
before(:all) do
|
71
|
+
Validatable.clear_validators!
|
72
|
+
Validatable.validates_uniqueness_of :source, solr_name: "source_ssim"
|
73
|
+
end
|
74
|
+
context "cardinality validation" do
|
75
|
+
before { allow(Validatable).to receive(:exists?) { false } }
|
76
|
+
it_behaves_like "it validates the single cardinality of an enumerable attribute" do
|
77
|
+
let(:attribute) { :source }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
context "when the record is new" do
|
81
|
+
before { allow(subject).to receive(:persisted?) { false } }
|
82
|
+
it_behaves_like "it validates the uniqueness of the attribute value" do
|
83
|
+
let(:conditions) { {"source_ssim" => subject.source.first} }
|
84
|
+
end
|
63
85
|
end
|
86
|
+
context "when the record is persisted" do
|
87
|
+
before { allow(subject).to receive(:persisted?) { true } }
|
88
|
+
it_behaves_like "it validates the uniqueness of the attribute value" do
|
89
|
+
let(:conditions) { {"source_ssim" => subject.source.first, "-id" => subject.pid} }
|
90
|
+
end
|
91
|
+
end
|
64
92
|
end
|
65
93
|
end
|
66
94
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra-validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dchandekstark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- lib/hydra/validations/uniqueness_validator.rb
|
103
103
|
- lib/hydra/validations/version.rb
|
104
104
|
- spec/spec_helper.rb
|
105
|
+
- spec/support/shared_examples_for_validators.rb
|
105
106
|
- spec/validators/single_cardinality_validator_spec.rb
|
106
107
|
- spec/validators/uniqueness_validator_spec.rb
|
107
108
|
homepage: https://github.com/duke-libraries/hydra-validations
|
@@ -131,5 +132,6 @@ specification_version: 4
|
|
131
132
|
summary: Validations for Hydra applications, based on ActiveModel::Validations
|
132
133
|
test_files:
|
133
134
|
- spec/spec_helper.rb
|
135
|
+
- spec/support/shared_examples_for_validators.rb
|
134
136
|
- spec/validators/single_cardinality_validator_spec.rb
|
135
137
|
- spec/validators/uniqueness_validator_spec.rb
|