attr_required 0.0.1 → 0.0.2
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/Gemfile.lock +1 -1
- data/README.rdoc +45 -3
- data/VERSION +1 -1
- data/attr_required.gemspec +2 -2
- data/lib/attr_optional.rb +45 -0
- data/lib/attr_required.rb +45 -36
- data/spec/attr_optional_spec.rb +59 -0
- data/spec/attr_required_spec.rb +38 -46
- data/spec/spec_helper.rb +13 -1
- metadata +8 -5
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
= attr_required
|
2
2
|
|
3
|
-
Provide attr_required
|
3
|
+
Provide attr_required and attr_optional
|
4
4
|
|
5
5
|
== Installation
|
6
6
|
|
7
7
|
gem install attr_required
|
8
8
|
|
9
|
-
== Resources
|
10
|
-
|
11
9
|
== Usage
|
12
10
|
|
11
|
+
Include <code>AttrRequired</code>, and use <code>attr_required</code> like <code>attr_accessor</code>
|
12
|
+
|
13
|
+
# Attributes Definitions
|
14
|
+
|
15
|
+
class A
|
16
|
+
include AttrRequired, AttrOptional
|
17
|
+
attr_required :required_a
|
18
|
+
attr_optional :optional_a
|
19
|
+
end
|
20
|
+
|
21
|
+
class B < A
|
22
|
+
attr_required :required_b
|
23
|
+
attr_optional :optional_b
|
24
|
+
end
|
25
|
+
|
26
|
+
# Class Methods
|
27
|
+
|
28
|
+
A.required_attributes #=> [:required_a]
|
29
|
+
B.required_attributes #=> [:required_a, :required_b]
|
30
|
+
A.required_attributes #=> [:optional_a]
|
31
|
+
B.required_attributes #=> [:optional_a, :optional_b]
|
32
|
+
|
33
|
+
# Instance Methods
|
34
|
+
|
35
|
+
@a = A.new
|
36
|
+
@b = B.new
|
37
|
+
|
38
|
+
@a.required_attributes #=> [:required_a]
|
39
|
+
@b.required_attributes #=> [:required_a, :required_b]
|
40
|
+
@a.optional_attributes #=> [:optional_a]
|
41
|
+
@b.optional_attributes #=> [:optional_a, :optional_b]
|
42
|
+
|
43
|
+
@a.attr_required?(:required_a) #=> true
|
44
|
+
@a.attr_optional?(:optiona_a) #=> true
|
45
|
+
@a.attr_missing? #=> true
|
46
|
+
@a.attr_missing #=> [:required_a]
|
47
|
+
@a.attr_missing! #=> raise AttrRequired::AttrMissing
|
48
|
+
@a.required_a = "foo"
|
49
|
+
@a.attr_missing? #=> false
|
50
|
+
@a.attr_missing #=> []
|
51
|
+
@a.attr_missing! #=> do nothing
|
52
|
+
|
53
|
+
Check spec/attr_(required|optional).rb for more details.
|
54
|
+
|
13
55
|
== Note on Patches/Pull Requests
|
14
56
|
|
15
57
|
* Fork the project.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/attr_required.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.version = File.read("VERSION")
|
4
4
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
|
5
5
|
s.authors = ["nov matake"]
|
6
|
-
s.description = %q{
|
7
|
-
s.summary = %q{
|
6
|
+
s.description = %q{attr_required and attr_optional}
|
7
|
+
s.summary = %q{attr_required and attr_optional}
|
8
8
|
s.email = "nov@matake.jp"
|
9
9
|
s.extra_rdoc_files = ["LICENSE", "README.rdoc"]
|
10
10
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module AttrOptional
|
2
|
+
|
3
|
+
def self.included(klass)
|
4
|
+
klass.send :include, Includable
|
5
|
+
klass.send :extend, Extendable
|
6
|
+
end
|
7
|
+
|
8
|
+
module Extendable
|
9
|
+
|
10
|
+
def inherited(klass)
|
11
|
+
super
|
12
|
+
unless optional_attributes.empty?
|
13
|
+
klass.attr_optional *optional_attributes
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def attr_optional(*keys)
|
18
|
+
@optional_attributes ||= []
|
19
|
+
@optional_attributes += Array(keys)
|
20
|
+
attr_accessor *keys
|
21
|
+
end
|
22
|
+
|
23
|
+
def attr_optional?(key)
|
24
|
+
optional_attributes.include?(key)
|
25
|
+
end
|
26
|
+
|
27
|
+
def optional_attributes
|
28
|
+
Array(@optional_attributes)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
module Includable
|
34
|
+
|
35
|
+
def optional_attributes
|
36
|
+
self.class.optional_attributes
|
37
|
+
end
|
38
|
+
|
39
|
+
def attr_optional?(key)
|
40
|
+
self.class.attr_optional? key
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/lib/attr_required.rb
CHANGED
@@ -1,59 +1,68 @@
|
|
1
1
|
module AttrRequired
|
2
|
+
|
2
3
|
class AttrMissing < StandardError; end
|
3
4
|
|
4
5
|
def self.included(klass)
|
5
|
-
|
6
|
+
klass.send :include, Includable
|
7
|
+
klass.send :extend, Extendable
|
8
|
+
end
|
6
9
|
|
7
|
-
|
8
|
-
@required_attributes ||= []
|
9
|
-
@required_attributes += Array(keys)
|
10
|
-
attr_accessor *keys
|
11
|
-
end
|
10
|
+
module Extendable
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
def inherited(klass)
|
13
|
+
super
|
14
|
+
unless required_attributes.empty?
|
15
|
+
klass.attr_required *required_attributes
|
15
16
|
end
|
17
|
+
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
def attr_required(*keys)
|
20
|
+
@required_attributes ||= []
|
21
|
+
@required_attributes += Array(keys)
|
22
|
+
attr_accessor *keys
|
23
|
+
end
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
25
|
+
def attr_required?(key)
|
26
|
+
required_attributes.include?(key)
|
27
|
+
end
|
26
28
|
|
29
|
+
def required_attributes
|
30
|
+
Array(@required_attributes)
|
27
31
|
end
|
28
|
-
end
|
29
32
|
|
30
|
-
def required_attributes
|
31
|
-
self.class.required_attributes
|
32
33
|
end
|
33
34
|
|
34
|
-
|
35
|
-
self.class.attr_required? key
|
36
|
-
end
|
35
|
+
module Includable
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
def required_attributes
|
38
|
+
self.class.required_attributes
|
39
|
+
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
def attr_required?(key)
|
42
|
+
self.class.attr_required? key
|
43
|
+
end
|
44
|
+
|
45
|
+
def attr_missing?
|
46
|
+
!attr_missing.empty?
|
45
47
|
end
|
46
|
-
end
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
if value.respond_to?(:empty?)
|
52
|
-
value.empty?
|
53
|
-
else
|
54
|
-
value.nil?
|
49
|
+
def attr_missing!
|
50
|
+
if attr_missing?
|
51
|
+
raise AttrMissing.new("'#{attr_missing.join('\', \'')}' required.")
|
55
52
|
end
|
56
53
|
end
|
54
|
+
|
55
|
+
def attr_missing
|
56
|
+
required_attributes.select do |key|
|
57
|
+
value = send(key)
|
58
|
+
if value.respond_to?(:empty?)
|
59
|
+
value.empty?
|
60
|
+
else
|
61
|
+
value.nil?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
57
66
|
end
|
58
67
|
|
59
68
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe AttrOptional, '.attr_optional' do
|
4
|
+
before do
|
5
|
+
@a, @b = A.new, B.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should define accessible attributes' do
|
9
|
+
@a.should respond_to(:attr_optional_a)
|
10
|
+
@a.should respond_to(:attr_optional_a=)
|
11
|
+
@b.should respond_to(:attr_optional_b)
|
12
|
+
@b.should respond_to(:attr_optional_b=)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should be inherited' do
|
16
|
+
@b.should respond_to(:attr_optional_a)
|
17
|
+
@b.should respond_to(:attr_optional_a=)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe AttrOptional, '.attr_optional?' do
|
22
|
+
it 'should answer whether the attributes is optional or not' do
|
23
|
+
A.attr_optional?(:attr_optional_a).should be_true
|
24
|
+
B.attr_optional?(:attr_optional_a).should be_true
|
25
|
+
B.attr_optional?(:attr_optional_b).should be_true
|
26
|
+
B.attr_optional?(:to_s).should be_false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe AttrOptional, '#attr_optional?' do
|
31
|
+
before do
|
32
|
+
@a, @b = A.new, B.new
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should answer whether the attributes is optional or not' do
|
36
|
+
@a.attr_optional?(:attr_optional_a).should be_true
|
37
|
+
@b.attr_optional?(:attr_optional_a).should be_true
|
38
|
+
@b.attr_optional?(:attr_optional_b).should be_true
|
39
|
+
@b.attr_optional?(:to_s).should be_false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe AttrOptional, '.optional_attributes' do
|
44
|
+
it 'should return all optional attributes keys' do
|
45
|
+
A.optional_attributes.should == [:attr_optional_a]
|
46
|
+
B.optional_attributes.should == [:attr_optional_a, :attr_optional_b]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe AttrOptional, '#optional_attributes' do
|
51
|
+
before do
|
52
|
+
@a, @b = A.new, B.new
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should return optional attributes keys' do
|
56
|
+
@a.optional_attributes.should == [:attr_optional_a]
|
57
|
+
@b.optional_attributes.should == [:attr_optional_a, :attr_optional_b]
|
58
|
+
end
|
59
|
+
end
|
data/spec/attr_required_spec.rb
CHANGED
@@ -1,37 +1,28 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
|
-
class A
|
4
|
-
include AttrRequired
|
5
|
-
attr_required :attr_a
|
6
|
-
end
|
7
|
-
|
8
|
-
class B < A
|
9
|
-
attr_required :attr_b
|
10
|
-
end
|
11
|
-
|
12
3
|
describe AttrRequired, '.attr_required' do
|
13
4
|
before do
|
14
5
|
@a, @b = A.new, B.new
|
15
6
|
end
|
16
7
|
|
17
8
|
it 'should define accessible attributes' do
|
18
|
-
@a.should respond_to(:
|
19
|
-
@a.should respond_to(:
|
20
|
-
@b.should respond_to(:
|
21
|
-
@b.should respond_to(:
|
9
|
+
@a.should respond_to(:attr_required_a)
|
10
|
+
@a.should respond_to(:attr_required_a=)
|
11
|
+
@b.should respond_to(:attr_required_b)
|
12
|
+
@b.should respond_to(:attr_required_b=)
|
22
13
|
end
|
23
14
|
|
24
15
|
it 'should be inherited' do
|
25
|
-
@b.should respond_to(:
|
26
|
-
@b.should respond_to(:
|
16
|
+
@b.should respond_to(:attr_required_a)
|
17
|
+
@b.should respond_to(:attr_required_a=)
|
27
18
|
end
|
28
19
|
end
|
29
20
|
|
30
21
|
describe AttrRequired, '.attr_required?' do
|
31
22
|
it 'should answer whether the attributes is required or not' do
|
32
|
-
A.attr_required?(:
|
33
|
-
B.attr_required?(:
|
34
|
-
B.attr_required?(:
|
23
|
+
A.attr_required?(:attr_required_a).should be_true
|
24
|
+
B.attr_required?(:attr_required_a).should be_true
|
25
|
+
B.attr_required?(:attr_required_b).should be_true
|
35
26
|
B.attr_required?(:to_s).should be_false
|
36
27
|
end
|
37
28
|
end
|
@@ -42,9 +33,10 @@ describe AttrRequired, '#attr_required?' do
|
|
42
33
|
end
|
43
34
|
|
44
35
|
it 'should answer whether the attributes is required or not' do
|
45
|
-
@a.attr_required?(:
|
46
|
-
@b.attr_required?(:
|
47
|
-
@b.attr_required?(:
|
36
|
+
@a.attr_required?(:attr_required_a).should be_true
|
37
|
+
@b.attr_required?(:attr_required_a).should be_true
|
38
|
+
@b.attr_required?(:attr_required_b).should be_true
|
39
|
+
@a.attr_required?(:attr_required_b).should be_false
|
48
40
|
@b.attr_required?(:to_s).should be_false
|
49
41
|
end
|
50
42
|
end
|
@@ -57,11 +49,11 @@ describe AttrRequired, '#attr_missing?' do
|
|
57
49
|
it 'should answer whether any attributes are missing' do
|
58
50
|
@a.attr_missing?.should be_true
|
59
51
|
@b.attr_missing?.should be_true
|
60
|
-
@a.
|
61
|
-
@b.
|
52
|
+
@a.attr_required_a = 'attr_required_a'
|
53
|
+
@b.attr_required_a = 'attr_required_a'
|
62
54
|
@a.attr_missing?.should be_false
|
63
55
|
@b.attr_missing?.should be_true
|
64
|
-
@b.
|
56
|
+
@b.attr_required_b = 'attr_required_b'
|
65
57
|
@b.attr_missing?.should be_false
|
66
58
|
end
|
67
59
|
end
|
@@ -74,44 +66,44 @@ describe AttrRequired, '#attr_missing!' do
|
|
74
66
|
it 'should raise AttrMissing error when any attributes are missing' do
|
75
67
|
lambda { @a.attr_missing! }.should raise_error(AttrRequired::AttrMissing)
|
76
68
|
lambda { @b.attr_missing! }.should raise_error(AttrRequired::AttrMissing)
|
77
|
-
@a.
|
78
|
-
@b.
|
69
|
+
@a.attr_required_a = 'attr_required_a'
|
70
|
+
@b.attr_required_a = 'attr_required_a'
|
79
71
|
lambda { @a.attr_missing! }.should_not raise_error(AttrRequired::AttrMissing)
|
80
72
|
lambda { @b.attr_missing! }.should raise_error(AttrRequired::AttrMissing)
|
81
|
-
@b.
|
73
|
+
@b.attr_required_b = 'attr_required_b'
|
82
74
|
lambda { @b.attr_missing! }.should_not raise_error(AttrRequired::AttrMissing)
|
83
75
|
end
|
84
76
|
end
|
85
77
|
|
86
|
-
describe AttrRequired, '
|
87
|
-
it 'should return all required attributes keys' do
|
88
|
-
A.required_attributes.should == [:attr_a]
|
89
|
-
B.required_attributes.should == [:attr_a, :attr_b]
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe AttrRequired, '#required_attributes' do
|
78
|
+
describe AttrRequired, '#attr_missing' do
|
94
79
|
before do
|
95
80
|
@a, @b = A.new, B.new
|
96
81
|
end
|
97
82
|
|
98
|
-
it 'should return
|
99
|
-
@a.
|
100
|
-
@b.
|
83
|
+
it 'should return missing attributes keys' do
|
84
|
+
@a.attr_missing.should == [:attr_required_a]
|
85
|
+
@b.attr_missing.should == [:attr_required_a, :attr_required_b]
|
86
|
+
@a.attr_required_a = 'attr_required_a'
|
87
|
+
@b.attr_required_a = 'attr_required_a'
|
88
|
+
@a.attr_missing.should == []
|
89
|
+
@b.attr_missing.should == [:attr_required_b]
|
101
90
|
end
|
102
91
|
end
|
103
92
|
|
104
|
-
describe AttrRequired, '
|
93
|
+
describe AttrRequired, '.required_attributes' do
|
94
|
+
it 'should return all required attributes keys' do
|
95
|
+
A.required_attributes.should == [:attr_required_a]
|
96
|
+
B.required_attributes.should == [:attr_required_a, :attr_required_b]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe AttrRequired, '#required_attributes' do
|
105
101
|
before do
|
106
102
|
@a, @b = A.new, B.new
|
107
103
|
end
|
108
104
|
|
109
|
-
it 'should return
|
110
|
-
@a.
|
111
|
-
@b.
|
112
|
-
@a.attr_a = 'attr_a'
|
113
|
-
@b.attr_a = 'attr_a'
|
114
|
-
@a.attr_missing.should == []
|
115
|
-
@b.attr_missing.should == [:attr_b]
|
105
|
+
it 'should return required attributes keys' do
|
106
|
+
@a.required_attributes.should == [:attr_required_a]
|
107
|
+
@b.required_attributes.should == [:attr_required_a, :attr_required_b]
|
116
108
|
end
|
117
109
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,4 +2,16 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
|
4
4
|
require 'attr_required'
|
5
|
-
require '
|
5
|
+
require 'attr_optional'
|
6
|
+
require 'rspec'
|
7
|
+
|
8
|
+
class A
|
9
|
+
include AttrRequired, AttrOptional
|
10
|
+
attr_required :attr_required_a
|
11
|
+
attr_optional :attr_optional_a
|
12
|
+
end
|
13
|
+
|
14
|
+
class B < A
|
15
|
+
attr_required :attr_required_b
|
16
|
+
attr_optional :attr_optional_b
|
17
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_required
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- nov matake
|
@@ -62,7 +62,7 @@ dependencies:
|
|
62
62
|
version: "2"
|
63
63
|
type: :development
|
64
64
|
version_requirements: *id003
|
65
|
-
description:
|
65
|
+
description: attr_required and attr_optional
|
66
66
|
email: nov@matake.jp
|
67
67
|
executables: []
|
68
68
|
|
@@ -81,7 +81,9 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- VERSION
|
83
83
|
- attr_required.gemspec
|
84
|
+
- lib/attr_optional.rb
|
84
85
|
- lib/attr_required.rb
|
86
|
+
- spec/attr_optional_spec.rb
|
85
87
|
- spec/attr_required_spec.rb
|
86
88
|
- spec/spec_helper.rb
|
87
89
|
has_rdoc: true
|
@@ -119,7 +121,8 @@ rubyforge_project:
|
|
119
121
|
rubygems_version: 1.3.7
|
120
122
|
signing_key:
|
121
123
|
specification_version: 3
|
122
|
-
summary:
|
124
|
+
summary: attr_required and attr_optional
|
123
125
|
test_files:
|
126
|
+
- spec/attr_optional_spec.rb
|
124
127
|
- spec/attr_required_spec.rb
|
125
128
|
- spec/spec_helper.rb
|