koine-attributes 0.1.1 → 0.1.2

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: 84fd9c66ed60fd758c16146613035919a09520ea
4
- data.tar.gz: 6ea3a4d2842457224c9d38f62611b93e8a227df3
3
+ metadata.gz: ecad2772d64e09329e15fc0045e95bddc8a1f662
4
+ data.tar.gz: b5350607c2f3871947146bbc8c2a2e5e489018b7
5
5
  SHA512:
6
- metadata.gz: 3dec0398fc288f205625ae0aa634de9a74494f29f25ecb0f718d56d6ce053f17d2b43935dfedc10364bf5fc47076c513a9cb0f4fdd7bab7dca91d5bc9ada3f7b
7
- data.tar.gz: 296f2461691b32d0e31f6c68134ec3905c3853edcf60418708842b3a36fa8039fe05f4c6a0d6f5058c23b4a4b811c4ae1e603a8ee9481dc157773494a3ba24b3
6
+ metadata.gz: 2dc9cae66c11704eb19b45c2e36de18e58960da5c678c71b4bd8a6870d7053cf17ba68907e35ef841ca21c39c23ee9d1c98c8a771ce9c71dad0c67414bf9efe0
7
+ data.tar.gz: 760b696eceabd3bdd3592b7ba59e4f990e9cccbf5240caa591eb73f06b2fee49dddd1ce7e1891fedf4f1bf3e2d84f213e779343a2a7fb5e22de1d5e159ab6df1
data/README.md CHANGED
@@ -10,7 +10,7 @@ Yes, there are [so many alternative solutions already](#alternative-solutions)!
10
10
  [![Code Climate](https://codeclimate.com/github/mjacobus/koine-attributes/badges/gpa.svg)](https://codeclimate.com/github/mjacobus/koine-attributes)
11
11
  [![Issue Count](https://codeclimate.com/github/mjacobus/koine-attributes/badges/issue_count.svg)](https://codeclimate.com/github/mjacobus/koine-attributes)
12
12
 
13
- [![Gem Version](https://badge.fury.io/rb/koine-attributes.svg)](https://badge.fury.io/rb/koine-command_bus)
13
+ [![Gem Version](https://badge.fury.io/rb/koine-attributes.svg)](https://badge.fury.io/rb/koine-attributes)
14
14
  [![Dependency Status](https://gemnasium.com/badges/github.com/mjacobus/koine-attributes.svg)](https://gemnasium.com/github.com/mjacobus/koine-attributes)
15
15
 
16
16
  ## Installation
@@ -33,6 +33,8 @@ Or install it yourself as:
33
33
 
34
34
  ```ruby
35
35
  class Person
36
+ include Koine::Attributes
37
+
36
38
  attributes do
37
39
  attribute :name, :string
38
40
  attribute :birthday, :date
@@ -65,6 +67,8 @@ Options:
65
67
 
66
68
  ```ruby
67
69
  class Person
70
+ include Koine::Attributes
71
+
68
72
  attributes initializer: true do
69
73
  attribute :name, :string
70
74
  attribute :birthday, :date
@@ -81,6 +85,8 @@ Options:
81
85
 
82
86
  ```ruby
83
87
  class Person
88
+ include Koine::Attributes
89
+
84
90
  attributes initializer: { strict: false } do
85
91
  attribute :name, :string
86
92
  attribute :birthday, :date
@@ -137,6 +143,22 @@ product.price = { currency: 'USD', value: 100 }
137
143
  product.price = "100 USD"
138
144
  ```
139
145
 
146
+ ### Value objects
147
+
148
+ ```ruby
149
+ class Location
150
+ include Koine::Attributes
151
+
152
+ attributes initializer: { freeze: true } do
153
+ attribute :lat, :float
154
+ attribute :lon, :float
155
+ end
156
+ end
157
+
158
+ location = Location.new(lat: 1, lon: 2)
159
+ new_location = location.with_lon(3)
160
+ ```
161
+
140
162
  ### Standard types
141
163
 
142
164
  ```ruby
@@ -35,7 +35,7 @@ module Koine
35
35
  end
36
36
  end
37
37
 
38
- def build_constructor(strict: true)
38
+ def build_constructor(strict: true, freeze: false)
39
39
  valid_attributes = attributes
40
40
 
41
41
  target.class_eval do
@@ -49,10 +49,10 @@ module Koine
49
49
  invalid_attributes = []
50
50
  constructor_args = HashHelper.new.symbolize_keys(constructor_args)
51
51
 
52
- constructor_args.each do |name, _value|
52
+ constructor_args.each do |name, value|
53
53
  if valid_attributes.include?(name)
54
54
  setter = "#{name}=".to_sym
55
- send(setter, constructor_args[name])
55
+ send(setter, value)
56
56
  next
57
57
  end
58
58
 
@@ -64,6 +64,55 @@ module Koine
64
64
  attributes = invalid_attributes.join(', ')
65
65
  raise ArgumentError, "Invalid attributes (#{attributes})"
66
66
  end
67
+
68
+ self.freeze if freeze
69
+ end
70
+ end
71
+
72
+ if strict
73
+ make_setters_private
74
+ create_with_methods
75
+ create_comparator
76
+ end
77
+ end
78
+
79
+ protected
80
+
81
+ def make_setters_private
82
+ attrs = attributes
83
+
84
+ target.instance_eval do
85
+ attrs.each do |attr|
86
+ private "#{attr}="
87
+ end
88
+ end
89
+ end
90
+
91
+ def create_with_methods
92
+ attributes.each do |attr|
93
+ create_with_method(attr)
94
+ end
95
+ end
96
+
97
+ def create_with_method(attr)
98
+ target.class_eval do
99
+ define_method "with_#{attr}" do |*args|
100
+ dup.tap do |new_object|
101
+ new_object.send("#{attr}=", *args)
102
+ new_object.freeze
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ def create_comparator
109
+ attrs = attributes
110
+
111
+ target.class_eval do
112
+ define_method :== do |that|
113
+ a = attrs.map { |attr| send(attr) }
114
+ b = attrs.map { |attr| that.send(attr) }
115
+ a == b
67
116
  end
68
117
  end
69
118
  end
@@ -1,5 +1,5 @@
1
1
  module Koine
2
2
  module Attributes
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
@@ -6,6 +6,8 @@ require 'koine/attributes/adapter/base'
6
6
  #
7
7
  # @example using attributes
8
8
  # class Person
9
+ # include Koine::Attributes
10
+ #
9
11
  # attributes do
10
12
  # attribute :name, :string
11
13
  # attribute :birthday, :date
@@ -34,6 +36,8 @@ require 'koine/attributes/adapter/base'
34
36
  # @example Constructor for attributes
35
37
  #
36
38
  # class Person
39
+ # include Koine::Attributes
40
+ #
37
41
  # attributes initializer: true do
38
42
  # attribute :name, :string
39
43
  # attribute :birthday, :date
@@ -48,6 +52,8 @@ require 'koine/attributes/adapter/base'
48
52
  # @example Constructor for attributes withouth strict mode
49
53
  #
50
54
  # class Person
55
+ # include Koine::Attributes
56
+ #
51
57
  # attributes initializer: { strict: false } do
52
58
  # attribute :name, :string
53
59
  # attribute :birthday, :date
@@ -60,6 +66,8 @@ require 'koine/attributes/adapter/base'
60
66
  # @example Override constructor
61
67
  #
62
68
  # class Person
69
+ # include Koine::Attributes
70
+ #
63
71
  # attr_reader :foo
64
72
  #
65
73
  # attributes initializer: true do
@@ -77,6 +85,19 @@ require 'koine/attributes/adapter/base'
77
85
  # person = Person.new(name: 'John Doe', birthday: '2001-01-31', foo: :bar)
78
86
  # person.foo # => :bar
79
87
  #
88
+ # @example
89
+ # class Location
90
+ # include Koine::Attributes
91
+ #
92
+ # attributes initializer: { freeze: true } do
93
+ # attribute :lat, :float
94
+ # attribute :lon, :float
95
+ # end
96
+ # end
97
+ #
98
+ # location = Location.new(lat: 1, lon: 2)
99
+ # new_location = location.with_lon(3)
100
+ #
80
101
  module Koine
81
102
  module Attributes
82
103
  module Adapter
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: koine-attributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcelo Jacobus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-03 00:00:00.000000000 Z
11
+ date: 2017-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  version: '0'
131
131
  requirements: []
132
132
  rubyforge_project:
133
- rubygems_version: 2.6.8
133
+ rubygems_version: 2.6.11
134
134
  signing_key:
135
135
  specification_version: 4
136
136
  summary: Stronger setters and getters