has_two_or_three 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.
- checksums.yaml +7 -0
- data/lib/has_two_or_three.rb +55 -0
- data/lib/has_two_or_three/version.rb +3 -0
- metadata +130 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3a730e38693ee4fa657da57fabc8ad7e0b63231b
|
4
|
+
data.tar.gz: 82ebe5f9c4dcec87711dcaa6350d61aa16b3ed6a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3f65f5370495cbffb796ee4ba4bf6c22bc54ebe645754ccc0d248ee8e15bff110bb36f67a77ee5226f9f402efdf3b559d4d50d222fc87d4741bdda55c7f4beb8
|
7
|
+
data.tar.gz: 308263e6d8762ea6a73bd5a3ea3da3b15d5bd2e273a2015c577da0616e59687edec7bfdfecc1cebbd17611541f392f759c04dc30d9f004be2b75a61015f03adf
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'has_two_or_three/version'
|
2
|
+
require 'active_support/concern'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
module HasTwoOrThree
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def self.list
|
9
|
+
@list ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
class_methods do
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def has_two_or_three(association_name, *options)
|
17
|
+
HasTwoOrThree.list << [self, association_name]
|
18
|
+
|
19
|
+
has_many association_name, *options
|
20
|
+
|
21
|
+
validate :"validate_#{association_name}_actually_has_two_or_three_members"
|
22
|
+
|
23
|
+
define_method :"validate_#{association_name}_actually_has_two_or_three_members" do
|
24
|
+
errors.add(:"#{association_name}", 'can only have two or three members.') unless [2,3].include?(send(association_name).length)
|
25
|
+
end
|
26
|
+
|
27
|
+
private :"validate_#{association_name}_actually_has_two_or_three_members"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
included do
|
32
|
+
validate :verify_record_is_one_of_two_or_three_on_listed_associations
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def verify_record_is_one_of_two_or_three_on_listed_associations
|
38
|
+
HasTwoOrThree.list.each do |klass, inverse_association_name|
|
39
|
+
self.class.reflect_on_all_associations.each do |association|
|
40
|
+
target_inverse_association_name = association.inverse_of || association.automatic_inverse_of
|
41
|
+
|
42
|
+
if association.klass == klass && target_inverse_association_name == inverse_association_name
|
43
|
+
|
44
|
+
parent = send(association.name)
|
45
|
+
siblings = parent.send(inverse_association_name)
|
46
|
+
|
47
|
+
errors.add(:"#{association.name}", "can only have two or three #{inverse_association_name}.") unless [2,3].include?(siblings.length)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
ActiveRecord::Base.include HasTwoOrThree if defined?(ActiveRecord::Base)
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: has_two_or_three
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jen Homann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.14'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activerecord
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 4.2.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.2.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activesupport
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 4.2.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 4.2.1
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- mpjeno@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- lib/has_two_or_three.rb
|
105
|
+
- lib/has_two_or_three/version.rb
|
106
|
+
homepage: https://github.com/JenHomann/has_two_or_three
|
107
|
+
licenses:
|
108
|
+
- MIT
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 2.6.8
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: For those pesky times when has_many just isn't specific enough.
|
130
|
+
test_files: []
|