rspectacular 0.0.1
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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/lib/rspectacular.rb +3 -0
- data/lib/rspectacular/active_record/date_range_matcher.rb +41 -0
- data/lib/rspectacular/active_record/dateliness_matcher.rb +33 -0
- data/lib/rspectacular/active_record/matchers.rb +5 -0
- data/lib/rspectacular/active_record/persistence_matcher.rb +29 -0
- data/lib/rspectacular/active_record/positivity_matcher.rb +33 -0
- data/lib/rspectacular/active_record/truthfulness_matcher.rb +29 -0
- data/lib/rspectacular/matchers.rb +1 -0
- data/lib/rspectacular/version.rb +3 -0
- data/rails/init.rb +5 -0
- data/rspectacular.gemspec +21 -0
- metadata +79 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/lib/rspectacular.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
class DateRangeMatcher
|
2
|
+
include Shoulda::ActiveRecord::Helpers
|
3
|
+
|
4
|
+
def initialize(dates)
|
5
|
+
@begin_field = dates[:from].to_s
|
6
|
+
@end_field = dates[:to].to_s
|
7
|
+
|
8
|
+
@begin_method = "#{dates[:from].to_s}=".to_sym
|
9
|
+
@end_method = "#{dates[:to].to_s}=".to_sym
|
10
|
+
end
|
11
|
+
|
12
|
+
def matches?(rangeable)
|
13
|
+
@rangeable = rangeable
|
14
|
+
beginning_date = Date.today
|
15
|
+
ending_date = Date.today - 1
|
16
|
+
|
17
|
+
rangeable.send(@begin_method, beginning_date)
|
18
|
+
rangeable.send(@end_method, ending_date)
|
19
|
+
|
20
|
+
rangeable.valid?
|
21
|
+
|
22
|
+
rangeable.errors[@begin_field].include?("must be on or before #{ending_date.to_s}") &&
|
23
|
+
rangeable.errors[@end_field].include?("must be on or after #{beginning_date.to_s}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def failure_message
|
27
|
+
"#{@rangeable_class} should only accept a valid date range from #{@begin_field} to #{@end_field}, got: #{pretty_error_messages(@rangeable)}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def negative_failure_message
|
31
|
+
"#{@rangeable_class} shouldn't accept a valid date range from #{@begin_field} to #{@end_field}, got: #{pretty_error_messages(@rangeable)}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def description
|
35
|
+
"should be contain a valid range for #{@rangeable_class}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate_date_range(dates)
|
40
|
+
DateRangeMatcher.new(dates)
|
41
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class DatelinessMatcher
|
2
|
+
include Shoulda::ActiveRecord::Helpers
|
3
|
+
|
4
|
+
def initialize(date_field)
|
5
|
+
@date_field = date_field.to_s
|
6
|
+
@date_method = "#{date_field.to_s}=".to_sym
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(dateable)
|
10
|
+
@dateable = dateable
|
11
|
+
dateable.send(@date_method, Date.today)
|
12
|
+
|
13
|
+
dateable.valid?
|
14
|
+
|
15
|
+
!dateable.errors[@date_field].include?("is not a valid date")
|
16
|
+
end
|
17
|
+
|
18
|
+
def failure_message
|
19
|
+
"Expected #{@date_field} to contain a valid date, got: #{pretty_error_messages(@dateable)}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def negative_failure_message
|
23
|
+
"Expected #{@date_field} to contain an invalid date, got: #{pretty_error_messages(@dateable)}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def description
|
27
|
+
"should be contain a valid date"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_dateliness_of(date)
|
32
|
+
DatelinessMatcher.new(date)
|
33
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
require 'rspectacular/active_record/date_range_matcher'
|
2
|
+
require 'rspectacular/active_record/dateliness_matcher'
|
3
|
+
require 'rspectacular/active_record/persistence_matcher'
|
4
|
+
require 'rspectacular/active_record/positivity_matcher'
|
5
|
+
require 'rspectacular/active_record/truthfulness_matcher'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class PersistenceMatcher
|
2
|
+
def initialize(persistable_object)
|
3
|
+
@persistable_class = persistable_object.class
|
4
|
+
@desired_attributes = persistable_object.is_a?(Hash) ? persistable_object : persistable_object.attributes
|
5
|
+
@desired_attributes = @desired_attributes.reject {|k,v| ['id', 'created_at', 'updated_at'].include? k}
|
6
|
+
end
|
7
|
+
|
8
|
+
def matches?(subject)
|
9
|
+
@persistable_class.where(@desired_attributes).first
|
10
|
+
end
|
11
|
+
|
12
|
+
def failure_message
|
13
|
+
"Expected to find an object saved with #{@desired_attributes}, didn't find one."
|
14
|
+
end
|
15
|
+
|
16
|
+
def negative_failure_message
|
17
|
+
"Didn't expect to find an object saved with #{@desired_attributes}, but got one anyway"
|
18
|
+
end
|
19
|
+
|
20
|
+
def description
|
21
|
+
"should be an instance of #{@expected_class_name}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def persist(desired_object)
|
26
|
+
PersistenceMatcher.new(desired_object)
|
27
|
+
end
|
28
|
+
|
29
|
+
alias :persist_the :persist
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class PositivityMatcher < Shoulda::ActiveRecord::Matchers::ValidateNumericalityOfMatcher
|
2
|
+
def matches?(positivitable)
|
3
|
+
super(positivitable)
|
4
|
+
|
5
|
+
disallows_zero_values &&
|
6
|
+
disallows_negative_values
|
7
|
+
end
|
8
|
+
|
9
|
+
def failure_message
|
10
|
+
"Expected #{@attribute.to_s} to be a positive number, got: #{pretty_error_messages(@attribute)}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def negative_failure_message
|
14
|
+
"Expected #{@attribute.to_s} to be a negative number, got: #{pretty_error_messages(@attribute)}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def disallows_negative_values
|
18
|
+
disallows_value_of(-1) &&
|
19
|
+
disallows_value_of(-100)
|
20
|
+
end
|
21
|
+
|
22
|
+
def disallows_zero_values
|
23
|
+
disallows_value_of(0)
|
24
|
+
end
|
25
|
+
|
26
|
+
def description
|
27
|
+
"should be contain a positive number"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_positivity_of(date)
|
32
|
+
PositivityMatcher.new(date)
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class TruthfulnessMatcher < Shoulda::ActiveRecord::Matchers::ValidationMatcher
|
2
|
+
def matches?(truthable)
|
3
|
+
super(truthable)
|
4
|
+
|
5
|
+
allows_true &&
|
6
|
+
allows_false &&
|
7
|
+
disallows_nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def allows_true
|
11
|
+
allows_value_of(true)
|
12
|
+
end
|
13
|
+
|
14
|
+
def allows_false
|
15
|
+
allows_value_of(false)
|
16
|
+
end
|
17
|
+
|
18
|
+
def disallows_nil
|
19
|
+
disallows_value_of(nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
def description
|
23
|
+
"should accept only boolean true or false values"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_truthfulness_of(truthteller)
|
28
|
+
TruthfulnessMatcher.new(truthteller)
|
29
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'rspectacular/active_record/matchers'
|
data/rails/init.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "rspectacular/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "rspectacular"
|
7
|
+
s.version = Rspectacular::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["jfelchner", "thekompanee"]
|
10
|
+
s.email = ["support@thekompanee.com"]
|
11
|
+
s.homepage = "https://github.com/jfelchner/rspectacular"
|
12
|
+
s.summary = %q{Custom RSpec matchers}
|
13
|
+
s.description = %q{We rock some custom RSpec matchers like it ain't nobody's bidnezz.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "rspectacular"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspectacular
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- jfelchner
|
13
|
+
- thekompanee
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-30 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: We rock some custom RSpec matchers like it ain't nobody's bidnezz.
|
23
|
+
email:
|
24
|
+
- support@thekompanee.com
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- lib/rspectacular.rb
|
36
|
+
- lib/rspectacular/active_record/date_range_matcher.rb
|
37
|
+
- lib/rspectacular/active_record/dateliness_matcher.rb
|
38
|
+
- lib/rspectacular/active_record/matchers.rb
|
39
|
+
- lib/rspectacular/active_record/persistence_matcher.rb
|
40
|
+
- lib/rspectacular/active_record/positivity_matcher.rb
|
41
|
+
- lib/rspectacular/active_record/truthfulness_matcher.rb
|
42
|
+
- lib/rspectacular/matchers.rb
|
43
|
+
- lib/rspectacular/version.rb
|
44
|
+
- rails/init.rb
|
45
|
+
- rspectacular.gemspec
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: https://github.com/jfelchner/rspectacular
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
segments:
|
69
|
+
- 0
|
70
|
+
version: "0"
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project: rspectacular
|
74
|
+
rubygems_version: 1.3.7
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: Custom RSpec matchers
|
78
|
+
test_files: []
|
79
|
+
|