attributable 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +15 -0
- data/.travis.yml +3 -0
- data/Gemfile +2 -2
- data/README.md +29 -1
- data/Rakefile +10 -1
- data/attributable.gemspec +1 -0
- data/lib/attributable/version.rb +1 -1
- data/lib/attributable.rb +16 -11
- data/spec/attributable/accessors_spec.rb +9 -6
- data/spec/attributable/construction_spec.rb +38 -13
- data/spec/attributable/equality_spec.rb +24 -17
- data/spec/attributable/hash_spec.rb +24 -17
- data/spec/attributable/inspect_spec.rb +6 -3
- data/spec/attributable/specialisation_spec.rb +34 -28
- data/spec/spec_helper.rb +4 -4
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ae2deaa3e88ed46bd80f2f96e721c71093f06ca
|
4
|
+
data.tar.gz: b0253f219bc607ccb07ac8b9bdedc76a7af16b97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 133f45dda1e6cf016f88811a8d67813743c58e4b4b2873c2aac7c2fedc562576f47be47faeab67860088081847135e709750559d377c65cae9468154fa663ecd
|
7
|
+
data.tar.gz: 3b954192277be8bb214c55a953d6fac6475f395295b4eb0bea3b152727cd36773d002cb3af36e5d649d9d49f8e6fe7ca9dd209b14f2a81c2e0aed90a5e964285
|
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Attributable [](https://travis-ci.org/mutiny/attributable) [](https://codeclimate.com/github/mutiny/attributable) [](https://gemnasium.com/mutiny/attributable) [](https://coveralls.io/r/mutiny/attributable?branch=master)
|
2
2
|
|
3
3
|
A tiny library that makes it easy to create value objects.
|
4
4
|
|
@@ -72,6 +72,34 @@ Attributable adds an `inspect` method to your class which display attribute valu
|
|
72
72
|
|
73
73
|
john.inspect # => <User forename="John", surname="Doe">
|
74
74
|
|
75
|
+
## Using with custom initialisation logic
|
76
|
+
|
77
|
+
Attributable provides the `initialize_attributes` method which can be used if you need to specify your own `initialize` method. For example:
|
78
|
+
|
79
|
+
require "attributable"
|
80
|
+
|
81
|
+
class UserWithDerivedAttribute
|
82
|
+
extend Attributable
|
83
|
+
attributes :forename, :surname
|
84
|
+
|
85
|
+
attr_accessor :fullname
|
86
|
+
|
87
|
+
def initialize(attributes = {})
|
88
|
+
initialize_attributes(attributes)
|
89
|
+
@fullname = "#{forename} #{surname}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
john = UserWithDerivedAttribute.new(forename: "John", surname: "Doe")
|
94
|
+
john.forename # => "John"
|
95
|
+
john.fullname # => "John Doe"
|
96
|
+
|
97
|
+
Note that, by default, Attributable adds the following `initialize` method:
|
98
|
+
|
99
|
+
def initialize(attributes = {})
|
100
|
+
initialize_attributes(attributes)
|
101
|
+
end
|
102
|
+
|
75
103
|
## Specialisation
|
76
104
|
|
77
105
|
To allow reuse of attribute declarations, Attributable provides the `specialises` class method.
|
data/Rakefile
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rspec/core/rake_task"
|
3
3
|
|
4
|
-
task default: "test:unit"
|
4
|
+
task default: ["test:unit", "style:check"]
|
5
5
|
|
6
6
|
namespace :test do
|
7
7
|
RSpec::Core::RakeTask.new(:unit)
|
8
8
|
end
|
9
|
+
|
10
|
+
namespace :style do
|
11
|
+
require "rubocop/rake_task"
|
12
|
+
|
13
|
+
desc "Run RuboCop on the lib directory"
|
14
|
+
Rubocop::RakeTask.new(:check) do |task|
|
15
|
+
task.options = ["--auto-correct"]
|
16
|
+
end
|
17
|
+
end
|
data/attributable.gemspec
CHANGED
data/lib/attributable/version.rb
CHANGED
data/lib/attributable.rb
CHANGED
@@ -6,19 +6,20 @@ module Attributable
|
|
6
6
|
@predefined_attributes = @predefined_attributes.merge(from(without_defaults, with_defaults))
|
7
7
|
add_instance_methods(@predefined_attributes)
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def specialises(clazz)
|
11
11
|
unless clazz.kind_of? Attributable
|
12
|
-
|
12
|
+
fail ArgumentError, "specialisation requires a class that extends Attributable"
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
super_attributes = clazz.new.instance_variable_get(:@attributes)
|
16
16
|
@predefined_attributes ||= {}
|
17
17
|
@predefined_attributes = super_attributes.merge(@predefined_attributes)
|
18
18
|
add_instance_methods(@predefined_attributes)
|
19
19
|
end
|
20
20
|
|
21
|
-
private
|
21
|
+
private
|
22
|
+
|
22
23
|
# Converts a list of attribute names and a hash of attribute names to default values
|
23
24
|
# to a hash of attribute names to default values
|
24
25
|
def from(without_defaults, with_defaults)
|
@@ -27,7 +28,7 @@ private
|
|
27
28
|
with_defaults.each_pair { |name, default| attributes[name] = default }
|
28
29
|
end
|
29
30
|
end
|
30
|
-
|
31
|
+
|
31
32
|
def add_instance_methods(predefined_attributes)
|
32
33
|
add_constructor(predefined_attributes)
|
33
34
|
add_accessors(predefined_attributes.keys)
|
@@ -37,6 +38,10 @@ private
|
|
37
38
|
|
38
39
|
def add_constructor(predefined_attributes)
|
39
40
|
define_method "initialize" do |attributes = {}|
|
41
|
+
initialize_attributes(attributes)
|
42
|
+
end
|
43
|
+
|
44
|
+
define_method "initialize_attributes" do |attributes = {}|
|
40
45
|
@attributes = predefined_attributes.merge(attributes)
|
41
46
|
end
|
42
47
|
end
|
@@ -52,22 +57,22 @@ private
|
|
52
57
|
def add_equality_methods(names)
|
53
58
|
define_method "eql?" do |other|
|
54
59
|
other.is_a?(self.class) &&
|
55
|
-
names.all? { |name| other.send(name.to_sym) ==
|
60
|
+
names.all? { |name| other.send(name.to_sym) == send(name.to_sym) }
|
56
61
|
end
|
57
|
-
|
62
|
+
|
58
63
|
alias_method "==", "eql?"
|
59
|
-
|
64
|
+
|
60
65
|
define_method "hash" do
|
61
66
|
self.class.hash + @attributes.hash
|
62
67
|
end
|
63
68
|
end
|
64
|
-
|
69
|
+
|
65
70
|
def add_inspect_method(names)
|
66
71
|
define_method "inspect" do
|
67
72
|
values = @attributes.keys
|
68
|
-
.map { |name| "#{name
|
73
|
+
.map { |name| "#{name}=#{@attributes[name].inspect}" }
|
69
74
|
.join(", ")
|
70
|
-
|
75
|
+
|
71
76
|
"<#{self.class.name} #{values}>"
|
72
77
|
end
|
73
78
|
end
|
@@ -1,17 +1,20 @@
|
|
1
1
|
require "attributable"
|
2
2
|
|
3
|
-
class User
|
3
|
+
class User
|
4
|
+
extend Attributable
|
5
|
+
attributes :id, :forename, surname: "Bloggs"
|
6
|
+
end
|
4
7
|
|
5
8
|
describe Attributable do
|
6
9
|
describe "accessors" do
|
7
10
|
it "should raise for an unknown attribute" do
|
8
|
-
i = User.new(id: 1, forename:
|
11
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
9
12
|
expect(i.respond_to?(:address)).to be_false
|
10
|
-
end
|
11
|
-
|
13
|
+
end
|
14
|
+
|
12
15
|
it "should not have setters" do
|
13
|
-
i = User.new(forename:
|
14
|
-
|
16
|
+
i = User.new(forename: "John")
|
17
|
+
|
15
18
|
expect(i.respond_to?(:id=)).to be_false
|
16
19
|
end
|
17
20
|
end
|
@@ -1,31 +1,56 @@
|
|
1
1
|
require "attributable"
|
2
2
|
|
3
|
-
class User
|
3
|
+
class User
|
4
|
+
extend Attributable
|
5
|
+
attributes :id, :forename, surname: "Bloggs"
|
6
|
+
end
|
7
|
+
|
8
|
+
class UserWithDerivedAttribute
|
9
|
+
extend Attributable
|
10
|
+
attributes :id, :forename, surname: "Bloggs"
|
11
|
+
attr_reader :fullname
|
12
|
+
|
13
|
+
def initialize(attributes = {})
|
14
|
+
initialize_attributes(attributes)
|
15
|
+
@fullname = "#{forename} #{surname}"
|
16
|
+
end
|
17
|
+
end
|
4
18
|
|
5
19
|
describe Attributable do
|
6
20
|
describe "construction" do
|
7
21
|
it "should accept a hash" do
|
8
|
-
i = User.new(id: 1, forename:
|
9
|
-
|
22
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
23
|
+
|
10
24
|
expect(i.id).to eq(1)
|
11
|
-
expect(i.forename).to eq(
|
12
|
-
expect(i.surname).to eq(
|
25
|
+
expect(i.forename).to eq("John")
|
26
|
+
expect(i.surname).to eq("Doe")
|
13
27
|
end
|
14
28
|
|
15
29
|
it "should set missing attributes to default" do
|
16
|
-
i = User.new(forename:
|
17
|
-
|
30
|
+
i = User.new(forename: "John")
|
31
|
+
|
18
32
|
expect(i.id).to be_nil
|
19
|
-
expect(i.forename).to eq(
|
20
|
-
expect(i.surname).to eq(
|
33
|
+
expect(i.forename).to eq("John")
|
34
|
+
expect(i.surname).to eq("Bloggs")
|
21
35
|
end
|
22
|
-
|
36
|
+
|
23
37
|
it "should set missing attributes without defaults to nil" do
|
24
|
-
i = User.new(surname:
|
25
|
-
|
38
|
+
i = User.new(surname: "Doe")
|
39
|
+
|
26
40
|
expect(i.id).to be_nil
|
27
41
|
expect(i.forename).to be_nil
|
28
|
-
expect(i.surname).to eq(
|
42
|
+
expect(i.surname).to eq("Doe")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "constructor" do
|
47
|
+
it "should be overridable" do
|
48
|
+
i = UserWithDerivedAttribute.new(id: 1, forename: "John", surname: "Doe")
|
49
|
+
|
50
|
+
expect(i.id).to eq(1)
|
51
|
+
expect(i.forename).to eq("John")
|
52
|
+
expect(i.surname).to eq("Doe")
|
53
|
+
expect(i.fullname).to eq("John Doe")
|
29
54
|
end
|
30
55
|
end
|
31
56
|
end
|
@@ -1,36 +1,43 @@
|
|
1
1
|
require "attributable"
|
2
2
|
|
3
|
-
class User
|
4
|
-
|
3
|
+
class User
|
4
|
+
extend Attributable
|
5
|
+
attributes :id, :forename, surname: "Bloggs"
|
6
|
+
end
|
7
|
+
|
8
|
+
class Patient
|
9
|
+
extend Attributable
|
10
|
+
attributes :id, :forename, surname: "Bloggs"
|
11
|
+
end
|
5
12
|
|
6
13
|
describe Attributable do
|
7
14
|
describe "equality" do
|
8
15
|
it "should provide a working eql? method" do
|
9
|
-
i = User.new(id: 1, forename:
|
10
|
-
j = User.new(id: 1, forename:
|
11
|
-
|
16
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
17
|
+
j = User.new(id: 1, forename: "John", surname: "Doe")
|
18
|
+
|
12
19
|
expect(i).to eql(j)
|
13
20
|
end
|
14
|
-
|
21
|
+
|
15
22
|
it "should provide a working == method" do
|
16
|
-
i = User.new(id: 1, forename:
|
17
|
-
j = User.new(id: 1, forename:
|
18
|
-
|
23
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
24
|
+
j = User.new(id: 1, forename: "John", surname: "Doe")
|
25
|
+
|
19
26
|
expect(i).to be == j
|
20
27
|
end
|
21
|
-
|
28
|
+
|
22
29
|
it "should distinguish between objects with different attribute values" do
|
23
|
-
i = User.new(id: 1, forename:
|
24
|
-
j = User.new(id: 1, forename:
|
25
|
-
|
30
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
31
|
+
j = User.new(id: 1, forename: "Jane", surname: "Doe")
|
32
|
+
|
26
33
|
expect(i).not_to eql(j)
|
27
34
|
expect(i).not_to be == j
|
28
35
|
end
|
29
|
-
|
36
|
+
|
30
37
|
it "should distinguish between objects with different types and same attribute values" do
|
31
|
-
i = User.new(id: 1, forename:
|
32
|
-
j = Patient.new(id: 1, forename:
|
33
|
-
|
38
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
39
|
+
j = Patient.new(id: 1, forename: "John", surname: "Doe")
|
40
|
+
|
34
41
|
expect(i).not_to eql(j)
|
35
42
|
expect(i).not_to be == j
|
36
43
|
end
|
@@ -1,32 +1,39 @@
|
|
1
1
|
require "attributable"
|
2
2
|
|
3
|
-
class User
|
4
|
-
|
3
|
+
class User
|
4
|
+
extend Attributable
|
5
|
+
attributes :id, :forename, surname: "Bloggs"
|
6
|
+
end
|
7
|
+
|
8
|
+
class Patient
|
9
|
+
extend Attributable
|
10
|
+
attributes :id, :forename, surname: "Bloggs"
|
11
|
+
end
|
5
12
|
|
6
13
|
describe Attributable do
|
7
14
|
describe "hash" do
|
8
15
|
it "should ensure that objects with the same attribute values have the same hash" do
|
9
|
-
i = User.new(id: 1, forename:
|
10
|
-
j = User.new(id: 1, forename:
|
11
|
-
|
16
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
17
|
+
j = User.new(id: 1, forename: "John", surname: "Doe")
|
18
|
+
|
12
19
|
expect(i.hash).to eq(j.hash)
|
13
20
|
end
|
14
|
-
|
21
|
+
|
15
22
|
it "should ensure that objects with different attribute values have different hashes" do
|
16
|
-
a = User.new(id: 1, forename:
|
17
|
-
b = User.new(id: nil, forename:
|
18
|
-
c = User.new(id: 1, forename: nil, surname:
|
19
|
-
d = User.new(id: 1, forename:
|
20
|
-
|
21
|
-
hashes = [a,b,c,d].map { |user| user.hash }
|
22
|
-
|
23
|
+
a = User.new(id: 1, forename: "John", surname: "Doe")
|
24
|
+
b = User.new(id: nil, forename: "John", surname: "Doe")
|
25
|
+
c = User.new(id: 1, forename: nil, surname: "Doe")
|
26
|
+
d = User.new(id: 1, forename: "John", surname: nil)
|
27
|
+
|
28
|
+
hashes = [a, b, c, d].map { |user| user.hash }
|
29
|
+
|
23
30
|
expect(hashes.uniq).to eq(hashes)
|
24
31
|
end
|
25
|
-
|
32
|
+
|
26
33
|
it "should ensure that objects of different types different hashes" do
|
27
|
-
u = User.new(id: 1, forename:
|
28
|
-
p = Patient.new(id: 1, forename:
|
29
|
-
|
34
|
+
u = User.new(id: 1, forename: "John", surname: "Doe")
|
35
|
+
p = Patient.new(id: 1, forename: "John", surname: "Doe")
|
36
|
+
|
30
37
|
expect(u.hash).not_to eq(p.hash)
|
31
38
|
end
|
32
39
|
end
|
@@ -1,12 +1,15 @@
|
|
1
1
|
require "attributable"
|
2
2
|
|
3
|
-
class User
|
3
|
+
class User
|
4
|
+
extend Attributable
|
5
|
+
attributes :id, :forename, surname: "Bloggs"
|
6
|
+
end
|
4
7
|
|
5
8
|
describe Attributable do
|
6
9
|
describe "inspect" do
|
7
10
|
it "should emit type and attribute values" do
|
8
|
-
i = User.new(id: 1, forename:
|
9
|
-
|
11
|
+
i = User.new(id: 1, forename: "John", surname: "Doe")
|
12
|
+
|
10
13
|
expect(i.inspect).to eq("<User id=1, forename=\"John\", surname=\"Doe\">")
|
11
14
|
end
|
12
15
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require "attributable"
|
2
2
|
|
3
|
-
class User
|
3
|
+
class User
|
4
|
+
extend Attributable
|
5
|
+
attributes :id, :forename, surname: "Bloggs"
|
6
|
+
end
|
4
7
|
|
5
8
|
describe Attributable do
|
6
9
|
describe "specialisation" do
|
@@ -11,16 +14,16 @@ describe Attributable do
|
|
11
14
|
attributes :password, active: true
|
12
15
|
specialises User
|
13
16
|
end
|
14
|
-
|
15
|
-
s = SuperUser.new(id: 1, forename:
|
16
|
-
|
17
|
+
|
18
|
+
s = SuperUser.new(id: 1, forename: "Bob", password: "secret", active: false)
|
19
|
+
|
17
20
|
expect(s.id).to eq(1)
|
18
|
-
expect(s.forename).to eq(
|
19
|
-
expect(s.surname).to eq(
|
20
|
-
expect(s.password).to eq(
|
21
|
+
expect(s.forename).to eq("Bob")
|
22
|
+
expect(s.surname).to eq("Bloggs")
|
23
|
+
expect(s.password).to eq("secret")
|
21
24
|
expect(s.active).to be_false
|
22
25
|
end
|
23
|
-
|
26
|
+
|
24
27
|
it "should be possible to declare specialisation before attributes" do
|
25
28
|
class SuperUser2
|
26
29
|
extend Attributable
|
@@ -28,49 +31,52 @@ describe Attributable do
|
|
28
31
|
specialises User
|
29
32
|
attributes :password, active: true
|
30
33
|
end
|
31
|
-
|
32
|
-
s = SuperUser2.new(id: 1, forename:
|
33
|
-
|
34
|
+
|
35
|
+
s = SuperUser2.new(id: 1, forename: "Bob", password: "secret", active: false)
|
36
|
+
|
34
37
|
expect(s.id).to eq(1)
|
35
|
-
expect(s.forename).to eq(
|
36
|
-
expect(s.surname).to eq(
|
37
|
-
expect(s.password).to eq(
|
38
|
+
expect(s.forename).to eq("Bob")
|
39
|
+
expect(s.surname).to eq("Bloggs")
|
40
|
+
expect(s.password).to eq("secret")
|
38
41
|
expect(s.active).to be_false
|
39
42
|
end
|
40
|
-
|
41
|
-
it "should ensure that local attributes
|
43
|
+
|
44
|
+
it "should ensure that local attributes precede specialised attributes" do
|
42
45
|
class SuperUser3
|
43
46
|
extend Attributable
|
44
47
|
|
45
48
|
specialises User
|
46
|
-
attributes surname:
|
49
|
+
attributes surname: "Smith"
|
47
50
|
end
|
48
|
-
|
51
|
+
|
49
52
|
s = SuperUser3.new
|
50
|
-
|
51
|
-
expect(s.surname).to eq(
|
53
|
+
|
54
|
+
expect(s.surname).to eq("Smith")
|
52
55
|
end
|
53
|
-
|
54
|
-
it "should ensure that
|
56
|
+
|
57
|
+
it "should ensure that position of specialises does not affect precedence" do
|
55
58
|
class SuperUser4
|
56
59
|
extend Attributable
|
57
60
|
|
58
|
-
attributes surname:
|
61
|
+
attributes surname: "Smith"
|
59
62
|
specialises User
|
60
63
|
end
|
61
|
-
|
64
|
+
|
62
65
|
s = SuperUser4.new
|
63
|
-
|
64
|
-
expect(s.surname).to eq(
|
66
|
+
|
67
|
+
expect(s.surname).to eq("Smith")
|
65
68
|
end
|
66
|
-
|
69
|
+
|
67
70
|
it "should raise if specialising class is not an instance of Attributable" do
|
68
71
|
expect do
|
69
72
|
class SuperUser5
|
70
73
|
extend Attributable
|
71
74
|
specialises String
|
72
75
|
end
|
73
|
-
end.to raise_error(
|
76
|
+
end.to raise_error(
|
77
|
+
ArgumentError,
|
78
|
+
"specialisation requires a class that extends Attributable"
|
79
|
+
)
|
74
80
|
end
|
75
81
|
end
|
76
82
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "coveralls"
|
2
2
|
Coveralls.wear!
|
3
3
|
|
4
4
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
@@ -16,12 +16,12 @@ RSpec.configure do |config|
|
|
16
16
|
# order dependency and want to debug it, you can fix the order by providing
|
17
17
|
# the seed, which is printed after each run.
|
18
18
|
# --seed 1234
|
19
|
-
config.order =
|
20
|
-
|
19
|
+
config.order = "random"
|
20
|
+
|
21
21
|
config.expect_with :rspec do |c|
|
22
22
|
# Disable old "should" syntax for expressions
|
23
23
|
c.syntax = :expect
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
config.treat_symbols_as_metadata_keys_with_true_values = true # Prepare for RSpec 3
|
27
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attributable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Louis Rose
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.7.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.19.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.19.1
|
69
83
|
description: Provides a Ruby module that can be extended by a class in order to provide
|
70
84
|
class methods for defining attributes. Attributable automatically generates accessor,
|
71
85
|
equality, hash and inspect methods.
|
@@ -77,6 +91,8 @@ extra_rdoc_files: []
|
|
77
91
|
files:
|
78
92
|
- .gitignore
|
79
93
|
- .rspec
|
94
|
+
- .rubocop.yml
|
95
|
+
- .travis.yml
|
80
96
|
- Gemfile
|
81
97
|
- LICENSE.txt
|
82
98
|
- README.md
|
@@ -111,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
127
|
version: '0'
|
112
128
|
requirements: []
|
113
129
|
rubyforge_project:
|
114
|
-
rubygems_version: 2.
|
130
|
+
rubygems_version: 2.0.3
|
115
131
|
signing_key:
|
116
132
|
specification_version: 4
|
117
133
|
summary: A tiny library that makes it easy to create value objects
|