attr_extras 1.6.2 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +28 -1
- data/lib/attr_extras.rb +10 -2
- data/lib/attr_extras/version.rb +1 -1
- data/spec/attr_extras_spec.rb +69 -37
- metadata +14 -19
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bee10ccc02153b1f71b7aed58cba2ec72b82518a
|
4
|
+
data.tar.gz: 5f546c46cbca537eb24cf497b3cfc917cb902f81
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e68b64c856a4e8a08f99f47d67afcdb3630ea8cf3765533bc76744c7629fc16ac0bbfeae13f37047ebe72c1ed528bcb2431f3c3b0ea9fc0b18185718e413ae8c
|
7
|
+
data.tar.gz: 5c0f5a1879bc6e61611f96d130b2c6f0774660ecd664b07952546fdba6602b5a713c162a791f14d0d4d80185d5b61d0f7b65240f30c8eeddf3f5fc2578e515d2
|
data/README.md
CHANGED
@@ -2,7 +2,34 @@
|
|
2
2
|
|
3
3
|
# attr\_extras
|
4
4
|
|
5
|
-
Takes some boilerplate out of Ruby
|
5
|
+
Takes some boilerplate out of Ruby, lowering the barrier to extracting small focused classes, without the downsides of using `Struct`.
|
6
|
+
|
7
|
+
Instead of
|
8
|
+
|
9
|
+
```
|
10
|
+
class InvoiceBuilder
|
11
|
+
def initialize(invoice, employee)
|
12
|
+
@invoice, @employee = invoice, employee
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :invoice, :employee
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
you can just do
|
22
|
+
|
23
|
+
```
|
24
|
+
class InvoiceBuilder
|
25
|
+
pattr_initialize :invoice, :employee
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
This nicely complements Ruby's built-in `attr_accessor`, `attr_reader` and `attr_writer`.
|
30
|
+
|
31
|
+
|
32
|
+
## Usage
|
6
33
|
|
7
34
|
`attr_initialize :foo, :bar`<br>
|
8
35
|
Defines an initializer that takes two arguments and assigns `@foo` and `@bar`.
|
data/lib/attr_extras.rb
CHANGED
@@ -3,13 +3,21 @@ require "attr_extras/version"
|
|
3
3
|
module AttrExtras
|
4
4
|
module ClassMethods
|
5
5
|
def attr_initialize(*names)
|
6
|
+
min_arity = names.count { |n| not n.is_a?(Array) }
|
7
|
+
max_arity = names.length
|
8
|
+
|
6
9
|
define_method(:initialize) do |*values|
|
7
|
-
|
8
|
-
|
10
|
+
provided_arity = values.length
|
11
|
+
|
12
|
+
unless (min_arity..max_arity).include?(provided_arity)
|
13
|
+
arity_range = [min_arity, max_arity].uniq.join("..")
|
14
|
+
raise ArgumentError, "wrong number of arguments (#{provided_arity} for #{arity_range})"
|
9
15
|
end
|
10
16
|
|
11
17
|
names.zip(values).each do |name_or_names, value|
|
12
18
|
if name_or_names.is_a?(Array)
|
19
|
+
value ||= {}
|
20
|
+
|
13
21
|
name_or_names.each do |key|
|
14
22
|
instance_variable_set("@#{key}", value[key])
|
15
23
|
end
|
data/lib/attr_extras/version.rb
CHANGED
data/spec/attr_extras_spec.rb
CHANGED
@@ -2,63 +2,76 @@ require "minitest/autorun"
|
|
2
2
|
require "minitest/pride"
|
3
3
|
require "attr_extras"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
attr_id_query :baz?, :boink?
|
16
|
-
attr_query :flurp?
|
17
|
-
attr_accessor :baz_id, :flurp
|
18
|
-
end
|
19
|
-
|
20
|
-
class MethodObjectExample
|
21
|
-
method_object :fooable?,
|
22
|
-
:foo
|
23
|
-
|
24
|
-
def fooable?
|
25
|
-
foo
|
5
|
+
describe Object, ".method_object" do
|
6
|
+
let(:klass) do
|
7
|
+
Class.new do
|
8
|
+
method_object :fooable?,
|
9
|
+
:foo
|
10
|
+
|
11
|
+
def fooable?
|
12
|
+
foo
|
13
|
+
end
|
14
|
+
end
|
26
15
|
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class ExampleWithHash
|
30
|
-
pattr_initialize :foo, [:bar, :baz]
|
31
|
-
end
|
32
16
|
|
33
|
-
describe Object, ".method_object" do
|
34
17
|
it "creates a class method that instantiates and runs that instance method" do
|
35
|
-
assert
|
36
|
-
refute
|
18
|
+
assert klass.fooable?(true)
|
19
|
+
refute klass.fooable?(false)
|
37
20
|
end
|
38
21
|
end
|
39
22
|
|
40
23
|
describe Object, ".attr_initialize" do
|
24
|
+
let(:klass) do
|
25
|
+
Class.new do
|
26
|
+
attr_initialize :foo, :bar
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
41
30
|
it "creates an initializer setting those instance variables" do
|
42
|
-
example =
|
31
|
+
example = klass.new("Foo", "Bar")
|
43
32
|
example.instance_variable_get("@foo").must_equal "Foo"
|
44
33
|
example.instance_variable_get("@bar").must_equal "Bar"
|
45
34
|
end
|
46
35
|
|
47
36
|
it "requires all arguments" do
|
48
|
-
lambda {
|
37
|
+
lambda { klass.new("Foo") }.must_raise ArgumentError
|
49
38
|
end
|
50
39
|
|
51
40
|
it "can set ivars from a hash" do
|
52
|
-
|
41
|
+
klass = Class.new do
|
42
|
+
pattr_initialize :foo, [:bar, :baz]
|
43
|
+
end
|
44
|
+
|
45
|
+
example = klass.new("Foo", :bar => "Bar", :baz => "Baz")
|
53
46
|
example.instance_variable_get("@foo").must_equal "Foo"
|
54
47
|
example.instance_variable_get("@bar").must_equal "Bar"
|
55
48
|
example.instance_variable_get("@baz").must_equal "Baz"
|
56
49
|
end
|
50
|
+
|
51
|
+
it "treats hash values as optional" do
|
52
|
+
klass = Class.new do
|
53
|
+
pattr_initialize :foo, [:bar, :baz]
|
54
|
+
end
|
55
|
+
|
56
|
+
example = klass.new("Foo", :bar => "Bar")
|
57
|
+
example.instance_variable_get("@baz").must_equal nil
|
58
|
+
|
59
|
+
example = klass.new("Foo")
|
60
|
+
example.instance_variable_get("@bar").must_equal nil
|
61
|
+
end
|
57
62
|
end
|
58
63
|
|
59
64
|
describe Object, ".attr_private" do
|
65
|
+
let(:klass) do
|
66
|
+
Class.new do
|
67
|
+
attr_private :foo, :bar
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
60
71
|
it "creates private readers" do
|
61
|
-
example =
|
72
|
+
example = klass.new
|
73
|
+
example.instance_variable_set("@foo", "Foo")
|
74
|
+
example.instance_variable_set("@bar", "Bar")
|
62
75
|
example.send(:foo).must_equal "Foo"
|
63
76
|
example.send(:bar).must_equal "Bar"
|
64
77
|
lambda { example.foo }.must_raise NoMethodError
|
@@ -67,20 +80,34 @@ end
|
|
67
80
|
|
68
81
|
describe Object, ".pattr_initialize" do
|
69
82
|
it "creates both initializer and private readers" do
|
70
|
-
|
83
|
+
klass = Class.new do
|
84
|
+
pattr_initialize :foo, :bar
|
85
|
+
end
|
86
|
+
|
87
|
+
example = klass.new("Foo", "Bar")
|
71
88
|
example.send(:foo).must_equal "Foo"
|
72
89
|
end
|
73
90
|
|
74
91
|
it "works with hash ivars" do
|
75
|
-
|
92
|
+
klass = Class.new do
|
93
|
+
pattr_initialize :foo, [:bar, :baz]
|
94
|
+
end
|
95
|
+
|
96
|
+
example = klass.new("Foo", :bar => "Bar")
|
76
97
|
example.send(:bar).must_equal "Bar"
|
77
98
|
end
|
78
99
|
end
|
79
100
|
|
80
101
|
describe Object, ".attr_id_query" do
|
81
102
|
it "creates id query methods" do
|
82
|
-
|
103
|
+
klass = Class.new do
|
104
|
+
attr_id_query :baz?, :boink?
|
105
|
+
attr_accessor :baz_id
|
106
|
+
end
|
107
|
+
|
108
|
+
example = klass.new
|
83
109
|
refute example.baz?
|
110
|
+
|
84
111
|
example.baz_id = 123
|
85
112
|
assert example.baz?
|
86
113
|
end
|
@@ -92,7 +119,12 @@ end
|
|
92
119
|
|
93
120
|
describe Object, ".attr_query" do
|
94
121
|
it "creates attribute query methods" do
|
95
|
-
|
122
|
+
klass = Class.new do
|
123
|
+
attr_query :flurp?
|
124
|
+
attr_accessor :flurp
|
125
|
+
end
|
126
|
+
|
127
|
+
example = klass.new
|
96
128
|
refute example.flurp?
|
97
129
|
example.flurp = "!"
|
98
130
|
assert example.flurp?
|
metadata
CHANGED
@@ -1,27 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_extras
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
5
|
-
prerelease:
|
4
|
+
version: 1.6.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Henrik Nyh
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-09 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
description:
|
26
28
|
email:
|
27
29
|
- henrik@nyh.se
|
@@ -42,33 +44,26 @@ files:
|
|
42
44
|
homepage: https://github.com/barsoom/attr_extras
|
43
45
|
licenses:
|
44
46
|
- MIT
|
47
|
+
metadata: {}
|
45
48
|
post_install_message:
|
46
49
|
rdoc_options: []
|
47
50
|
require_paths:
|
48
51
|
- lib
|
49
52
|
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
53
|
requirements:
|
52
|
-
- -
|
54
|
+
- - '>='
|
53
55
|
- !ruby/object:Gem::Version
|
54
56
|
version: '0'
|
55
|
-
segments:
|
56
|
-
- 0
|
57
|
-
hash: 4094106113878864252
|
58
57
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
58
|
requirements:
|
61
|
-
- -
|
59
|
+
- - '>='
|
62
60
|
- !ruby/object:Gem::Version
|
63
61
|
version: '0'
|
64
|
-
segments:
|
65
|
-
- 0
|
66
|
-
hash: 4094106113878864252
|
67
62
|
requirements: []
|
68
63
|
rubyforge_project:
|
69
|
-
rubygems_version:
|
64
|
+
rubygems_version: 2.2.0
|
70
65
|
signing_key:
|
71
|
-
specification_version:
|
66
|
+
specification_version: 4
|
72
67
|
summary: Takes some boilerplate out of Ruby with methods like attr_initialize.
|
73
68
|
test_files:
|
74
69
|
- spec/attr_extras_spec.rb
|