couchrest-uniqueness-validation 0.0.1 → 0.1.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.
data/README.rdoc CHANGED
@@ -1,16 +1,23 @@
1
- = couchrest-uniqueness-validation
1
+ = Couchrest Uniqueness Validation
2
+
3
+ This is a simple add-on to {couchrest}[http://github.com/couchrest/couchrest] gem
2
4
 
3
5
  Validates that the specified attribute is unique across documents with the same
4
6
  couchrest-type using a view.
5
7
 
6
- @note
7
- You have to define a design doc view.
8
- @see http://rdoc.info/rdoc/couchrest/couchrest/blob/1b34fe4b60694683e98866a51c2109c1885f7e42/CouchRest/Mixins/Views/ClassMethods.html#view_by-instance_method for more details about views.
9
-
10
- @example [Usage]
8
+ == Install
11
9
 
12
- class User
10
+ gem install couchrest-uniqueness-validation
13
11
 
12
+ == Usage
13
+
14
+ require 'rubygems'
15
+ require 'couchrest'
16
+ require 'couchrest-uniqueness-validation'
17
+
18
+ class User < CouchRest::ExtendedDocument
19
+ include CouchRest::Validation
20
+
14
21
  property :nickname
15
22
  property :login
16
23
 
@@ -26,9 +33,16 @@ couchrest-type using a view.
26
33
  # the same couchrest-type, nickname and login
27
34
  end
28
35
 
36
+ Note: at least two views should exist in the User design doc for this example to work -
37
+ :by_nickname and :my_custom_view.
38
+
39
+ See {CouchRest Views docs}[http://rdoc.info/rdoc/couchrest/couchrest/blob/1b34fe4b60694683e98866a51c2109c1885f7e42/CouchRest/Mixins/Views/ClassMethods.html#view_by-instance_method]
40
+ for more info on views.
41
+
42
+
29
43
  == Note on Patches/Pull Requests
30
44
 
31
- * Fork the project.
45
+ * Fork the {project}[http://github.com/crhym3/couchrest-uniqueness-validation].
32
46
  * Make your feature addition or bug fix.
33
47
  * Add tests for it. This is important so I don't break it in a
34
48
  future version unintentionally.
data/Rakefile CHANGED
@@ -23,12 +23,22 @@ require 'spec/rake/spectask'
23
23
  Spec::Rake::SpecTask.new(:spec) do |spec|
24
24
  spec.libs << 'lib' << 'spec'
25
25
  spec.spec_files = FileList['spec/**/*_spec.rb']
26
+ spec.spec_opts = ['--options', "\"spec/spec.opts\""]
27
+ end
28
+
29
+ namespace :spec do
30
+ desc "Print Specdoc for all specs"
31
+ Spec::Rake::SpecTask.new(:doc) do |t|
32
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
33
+ t.spec_files = FileList['spec/**/*_spec.rb']
34
+ end
26
35
  end
27
36
 
28
37
  Spec::Rake::SpecTask.new(:rcov) do |spec|
29
38
  spec.libs << 'lib' << 'spec'
30
39
  spec.pattern = 'spec/**/*_spec.rb'
31
40
  spec.rcov = true
41
+ spec.rcov_opts = ['--exclude "spec/*,gems/*"']
32
42
  end
33
43
 
34
44
  task :spec => :check_dependencies
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -6,7 +6,7 @@ module CouchRest
6
6
  def initialize(field_name, options = {})
7
7
  super
8
8
  @field_name, @options = field_name, options
9
- @options[:view] ||= "by_#{@field_name}".to_sym
9
+ @options[:view] ||= "by_#{@field_name}"
10
10
  end
11
11
 
12
12
  def call(target)
@@ -21,7 +21,7 @@ module CouchRest
21
21
 
22
22
  def unique?(target)
23
23
  value = target.validation_property_value(@field_name)
24
- existing_docs = target.class.view(@options[:view], :key => value, :limit => 1, :include_docs => false)
24
+ existing_docs = target.class.view(@options[:view].to_sym, :key => value, :limit => 1, :include_docs => false)['rows']
25
25
 
26
26
  # normal case when target.new_document? == true and
27
27
  # no other document exists
@@ -40,13 +40,13 @@ module CouchRest
40
40
  # Validates that the specified attribute is unique across documents with the same
41
41
  # couchrest-type using a view.
42
42
  #
43
- # @note
44
- # You have to define a design doc view.
45
- # @see http://rdoc.info/rdoc/couchrest/couchrest/blob/1b34fe4b60694683e98866a51c2109c1885f7e42/CouchRest/Mixins/Views/ClassMethods.html#view_by-instance_method for more details about views.
43
+ # == Example
46
44
  #
47
- # @example [Usage]
48
- #
49
- # class User
45
+ # require 'rubygems'
46
+ # require 'couchrest'
47
+ # require 'couchrest-uniqueness-validation'
48
+ #
49
+ # class User < CouchRest::ExtendedDocument
50
50
  #
51
51
  # property :nickname
52
52
  # property :login
@@ -62,6 +62,12 @@ module CouchRest
62
62
  # # a call to valid? will return false unless no other document exists with
63
63
  # # the same couchrest-type, nickname and login
64
64
  # end
65
+ #
66
+ # Note: at least two views should exist in the User design doc for this example to work -
67
+ # :by_nickname and :my_custom_view.
68
+ #
69
+ # See {CouchRest Views docs}[http://rdoc.info/rdoc/couchrest/couchrest/blob/1b34fe4b60694683e98866a51c2109c1885f7e42/CouchRest/Mixins/Views/ClassMethods.html#view_by-instance_method]
70
+ # for more info on views
65
71
  def validates_uniqueness_of(*fields)
66
72
  opts = opts_from_validator_args(fields)
67
73
  add_validator_to_context(opts, fields, CouchRest::Validation::UniquenessValidator)
@@ -2,12 +2,73 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe CouchRest::Validation::ValidatesUniqueness do
4
4
 
5
- class SomeExtDoc < CouchRest::ExtendedDocument
5
+ class SomeDoc < CouchRest::ExtendedDocument
6
6
  include CouchRest::Validation
7
7
  use_database SPEC_COUCH
8
8
  end
9
9
 
10
10
  it "should provide validates_uniqueness_of method" do
11
- SomeExtDoc.should respond_to :validates_uniqueness_of
11
+ SomeDoc.should respond_to :validates_uniqueness_of
12
12
  end
13
13
  end
14
+
15
+ describe CouchRest::Validation::UniquenessValidator do
16
+
17
+ class SomeUniqueDoc < CouchRest::ExtendedDocument
18
+ include CouchRest::Validation
19
+ use_database SPEC_COUCH
20
+
21
+ property :unique_prop
22
+ validates_uniqueness_of :unique_prop
23
+ end
24
+
25
+ before(:each) do
26
+ @some_doc = SomeUniqueDoc.new :unique_prop => 'some property value'
27
+ SomeUniqueDoc.stub(:view).and_return({'rows' => []})
28
+ end
29
+
30
+ it "should use a corresponding default view for uniqueness test" do
31
+ SomeUniqueDoc.should_receive(:view).
32
+ with(:by_unique_prop, hash_including(:key => @some_doc.unique_prop, :limit => 1, :include_docs => false))
33
+ @some_doc.valid?
34
+ end
35
+
36
+ it "should pass validation if no other document exist with the same property value" do
37
+ @some_doc.should be_valid
38
+ end
39
+
40
+ it "should not pass validation if another document exists already" do
41
+ SomeUniqueDoc.should_receive(:view).and_return({'rows' => [{'id' => 123}]})
42
+ @some_doc.should_not be_valid
43
+ @some_doc.errors.should have_key :unique_prop
44
+ end
45
+
46
+ it "should pass validation for an existing document (should remove itself from the list)" do
47
+ SomeUniqueDoc.should_receive(:view).and_return({'rows' => [{'id' => 123}]})
48
+ @some_doc.stub(:new_document?).and_return(false)
49
+ @some_doc.stub(:id).and_return(123)
50
+ @some_doc.should be_valid
51
+ end
52
+
53
+ describe "using custom view" do
54
+
55
+ class SomeOtherUniqueDoc < CouchRest::ExtendedDocument
56
+ include CouchRest::Validation
57
+ use_database SPEC_COUCH
58
+
59
+ property :another_prop
60
+ validates_uniqueness_of :another_prop, :view => 'my_custom_view'
61
+ end
62
+
63
+ before(:each) do
64
+ @some_doc = SomeOtherUniqueDoc.new :another_prop => 'some property value'
65
+ SomeOtherUniqueDoc.stub(:view).and_return({'rows' => []})
66
+ end
67
+
68
+ it "should work" do
69
+ SomeOtherUniqueDoc.should_receive(:view).
70
+ with(:my_custom_view, hash_including(:key => @some_doc.another_prop, :limit => 1, :include_docs => false))
71
+ @some_doc.valid?
72
+ end
73
+ end
74
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
3
4
  require 'rubygems'
4
5
  require 'couchrest'
5
6
  require 'couchrest/mixins/validation'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: couchrest-uniqueness-validation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - alex