attr_extras 1.8.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17e3dfb363304609f6981fe839b36c318f9726ea
4
- data.tar.gz: d32ee310679a5135dd5433e288b561451418a88f
3
+ metadata.gz: 6d151eb4e76dda68fdeef01c651351ddc24bd55a
4
+ data.tar.gz: 87c5fad6b639817d4c2884ef24c319924b1437dc
5
5
  SHA512:
6
- metadata.gz: c24ba0b62181e236814657c9e06fdff80263696d77f3d824b62eeec038e20b7ff0cd4979783d16aec71c884fd2f7711429c7983e3cdc7321b301c52e8f33e958
7
- data.tar.gz: 7846ad4e0bd1808dccdec81857477a8e7372cf56378e6e1e95659fe4a19339ba2c4759f713fa18577aa4705b4a939fd165bf26cc83f3e122e4fe532b37c8b0c4
6
+ metadata.gz: 1b65f8a8e1b9ed0cd46f4628f76ddde7459c3a2c848263b560af9e3a6b012816d62bf8ba2973f68c1dfa0bbd5e73fcf5a2070b1e7e155946b3c5077509753e8f
7
+ data.tar.gz: c49227cae57dbb9f2178bee8eee1ce9a344ba5a6918093011396e6462051e8d7b3fdc8326d104c188f639144e33eff2d29cd21eb9fedb87c508da091cd20f23d
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # attr\_extras
4
4
 
5
- Takes some boilerplate out of Ruby, lowering the barrier to extracting small focused classes, without the downsides of using `Struct`.
5
+ Takes some boilerplate out of Ruby, lowering the barrier to extracting small focused classes, without [the downsides of using `Struct`](http://thepugautomatic.com/2013/08/struct-inheritance-is-overused/).
6
6
 
7
7
  Instead of
8
8
 
@@ -34,20 +34,26 @@ This nicely complements Ruby's built-in `attr_accessor`, `attr_reader` and `attr
34
34
  `attr_initialize :foo, :bar`<br>
35
35
  Defines an initializer that takes two arguments and assigns `@foo` and `@bar`.
36
36
 
37
- `attr_initialize :foo, [:bar, :baz!]`<br>
37
+ `attr_initialize :foo, [:bar, :baz!]`,
38
38
  Defines an initializer that takes one regular argument, assigning `@foo`, and one hash argument, assigning `@bar` (optional) and `@baz` (required).
39
39
 
40
+ `attr_initialize [:bar, :baz!]`,
41
+ Defines an initializer that takes one hash argument, assigning `@bar` (optional) and `@baz` (required).
42
+
40
43
  `attr_private :foo, :bar`<br>
41
44
  Defines private readers for `@foo` and `@bar`.
42
45
 
43
46
  `pattr_initialize :foo, :bar`<br>
44
- Defines both initializer and private readers.
47
+ Defines both initializer and private readers. The `[]` notation for hash arguments is also supported.
45
48
 
46
49
  `attr_value :foo, :bar`<br>
47
- Defines both initializer and public readers.
50
+ NOTE: experimental. Likely to be renamed, modified or removed soon.<br>
51
+ Defines both initializer and public readers. Does not define writers as value objects are typically immutable. Defines object equality: two value objects of the same class with the same values are equal.
48
52
 
49
53
  `method_object :fooable?, :foo`<br>
50
- Defines a `.fooable?` class method that takes one argument (`:foo`) and delegates to an instance method that can access `foo` as a private reader.
54
+ Defines a `.fooable?` class method that takes one argument (`:foo`) and delegates to an instance method that can access `foo` as a private reader, useful for [method objects](http://refactoring.com/catalog/replaceMethodWithMethodObject.html). The `[]` notation for hash arguments is also supported.
55
+
56
+ You don't have to specify readers if you don't want them: `method_object :fooable?` is also valid.
51
57
 
52
58
  `attr_id_query :foo?, :bar?`<br>
53
59
  Defines query methods like `foo?`, which is true iff `foo_id` is truthy. Goes well with Active Record.
data/lib/attr_extras.rb CHANGED
@@ -49,7 +49,15 @@ module AttrExtras
49
49
 
50
50
  def attr_value(*names)
51
51
  attr_initialize(*names)
52
- attr_reader *attr_flat_names(names)
52
+
53
+ flat_names = attr_flat_names(names)
54
+ attr_reader *flat_names
55
+
56
+ define_method(:==) do |other|
57
+ return false unless other.is_a?(self.class)
58
+
59
+ flat_names.all? { |attr| self.public_send(attr) == other.public_send(attr) }
60
+ end
53
61
  end
54
62
 
55
63
  def method_object(method_name, *names)
@@ -1,3 +1,3 @@
1
1
  module AttrExtras
2
- VERSION = "1.8.1"
2
+ VERSION = "1.9.0"
3
3
  end
@@ -1,10 +1,12 @@
1
+ # encoding: utf-8
2
+
1
3
  require "minitest/autorun"
2
4
  require "minitest/pride"
3
5
  require "attr_extras"
4
6
 
5
7
  describe Object, ".method_object" do
6
- let(:klass) do
7
- Class.new do
8
+ it "creates a class method that instantiates and runs that instance method" do
9
+ klass = Class.new do
8
10
  method_object :fooable?,
9
11
  :foo
10
12
 
@@ -12,12 +14,22 @@ describe Object, ".method_object" do
12
14
  foo
13
15
  end
14
16
  end
15
- end
16
17
 
17
- it "creates a class method that instantiates and runs that instance method" do
18
18
  assert klass.fooable?(true)
19
19
  refute klass.fooable?(false)
20
20
  end
21
+
22
+ it "doesn't require attributes" do
23
+ klass = Class.new do
24
+ method_object :fooable?
25
+
26
+ def fooable?
27
+ true
28
+ end
29
+ end
30
+
31
+ assert klass.fooable?
32
+ end
21
33
  end
22
34
 
23
35
  describe Object, ".attr_initialize" do
@@ -130,6 +142,36 @@ describe Object, ".attr_value" do
130
142
  example.bar.must_equal "Bar"
131
143
  example.baz.must_equal "Baz"
132
144
  end
145
+
146
+ it "defines equality based on the attributes" do
147
+ klass = Class.new do
148
+ attr_value :foo, :bar
149
+ end
150
+
151
+ example1 = klass.new("Foo", "Bar")
152
+ example2 = klass.new("Foo", "Bar")
153
+ example3 = klass.new("Arroz", "Feijão")
154
+
155
+ assert example1 == example2, "Examples should be equal"
156
+ refute example1 != example2, "Examples should be equal"
157
+
158
+ assert example1 != example3, "Examples should not be equal"
159
+ end
160
+
161
+ it "defines equality based on the actual type" do
162
+ klass1 = Class.new do
163
+ attr_value :foo
164
+ end
165
+ klass2 = Class.new do
166
+ attr_value :foo
167
+ end
168
+
169
+ example1 = klass1.new("Foo")
170
+ example2 = klass2.new("Foo")
171
+
172
+ assert example1 != example2, "Examples should not be equal"
173
+ refute example1 == example2, "Examples should not be equal"
174
+ end
133
175
  end
134
176
 
135
177
  describe Object, ".attr_id_query" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attr_extras
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henrik Nyh
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-09 00:00:00.000000000 Z
12
+ date: 2014-03-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake