fast_attributes 0.3.0 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e11ae0723fe233d262a2072024c6a0c8a28eb85
4
- data.tar.gz: 13ab026b7a65d4ca20222a76eea7efacdd74e096
3
+ metadata.gz: 9ba4ff16c6d56690494729bcb81f3af0b2ba1791
4
+ data.tar.gz: 04f39c4dd270fd4b89d5401ab09bd136d2a1829f
5
5
  SHA512:
6
- metadata.gz: 425b0d00dbeb0f30d5de690f8a2caedd0940b8752b4028a3b88528591a807e683eee65620f6514ecefda59c468d01c6cbc57b80cdc5dac5d12a4779eae45220b
7
- data.tar.gz: 20c0977d3c65e843a45749df83c9b197a9788519ec3eb0e703aa37a44c5c9bed22ee8ad43e3fe19ae6bc3da87a2e16d2a0fa2ce66c2a3aaac6b7b7fc433408e5
6
+ metadata.gz: 145edbabbec7ff5205bd2ffc554cd03764bcd869a87a4b201b55fd5788ff0b893faf5b0fd279657b65f57ff9d3b2acc9137226652c16ef2fe390fb479343671c
7
+ data.tar.gz: 6ad2af448a020de451358208ec55d9916e3d964837ac0db97afaceb5bc61029d717faba04dd33fc5e2aa3aaca0e7c40892e21224cb6286946ad12fd4c3cc7643
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ **0.4.0 (July 5, 2014)**
2
+ * Allow to override generated methods
3
+
1
4
  **0.3.0 (July 4, 2014)**
2
5
  * Support `Float` data type
3
6
 
data/benchmarks/Gemfile CHANGED
@@ -2,7 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  ruby '2.1.2'
4
4
 
5
- gem 'fast_attributes', '0.2.2'
5
+ gem 'fast_attributes', path: '..'
6
6
  gem 'virtus', '1.0.2'
7
7
  gem 'attrio', '0.7.3'
8
8
  gem 'benchmark-ips', '2.0.0'
@@ -5,28 +5,26 @@ require 'attrio'
5
5
 
6
6
  ATTR_NAMES = [:attr0, :attr1, :attr2, :attr3, :attr4, :attr5, :attr6, :attr7, :attr8, :attr9]
7
7
 
8
- module Initializer
9
- def initialize(attributes = {})
10
- attributes.each do |attribute, value|
11
- public_send("#{attribute}=", value)
12
- end
13
- end
14
- end
15
-
16
8
  class FastIntegers
17
9
  extend FastAttributes
18
- include Initializer
19
- attribute *ATTR_NAMES, Integer
10
+ define_attributes initialize: true do
11
+ attribute *ATTR_NAMES, Integer
12
+ end
20
13
  end
21
14
 
22
15
  class AttrioIntegers
23
16
  include Attrio
24
- include Initializer
25
17
  define_attributes do
26
18
  ATTR_NAMES.each do |name|
27
19
  attr name, Integer
28
20
  end
29
21
  end
22
+
23
+ def initialize(attributes = {})
24
+ attributes.each do |attribute, value|
25
+ public_send("#{attribute}=", value)
26
+ end
27
+ end
30
28
  end
31
29
 
32
30
  class VirtusIntegers
@@ -7,6 +7,7 @@ module FastAttributes
7
7
  @klass = klass
8
8
  @options = options
9
9
  @attributes = []
10
+ @methods = Module.new
10
11
  end
11
12
 
12
13
  def attribute(*attributes, type)
@@ -18,23 +19,25 @@ module FastAttributes
18
19
  end
19
20
 
20
21
  def compile!
21
- compile_getter!
22
- compile_setter!
22
+ compile_getter
23
+ compile_setter
23
24
 
24
25
  if @options[:initialize]
25
- compile_initialize!
26
+ compile_initialize
26
27
  end
27
28
 
28
29
  if @options[:attributes]
29
- compile_attributes!
30
+ compile_attributes
30
31
  end
32
+
33
+ include_methods
31
34
  end
32
35
 
33
36
  private
34
37
 
35
- def compile_getter!
38
+ def compile_getter
36
39
  each_attribute do |attribute, _|
37
- @klass.class_eval <<-EOS, __FILE__, __LINE__ + 1
40
+ @methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
38
41
  def #{attribute} # def name
39
42
  @#{attribute} # @name
40
43
  end # end
@@ -42,12 +45,12 @@ module FastAttributes
42
45
  end
43
46
  end
44
47
 
45
- def compile_setter!
48
+ def compile_setter
46
49
  each_attribute do |attribute, type|
47
50
  type_matching = "when #{type.name} then value"
48
51
  type_casting = FastAttributes.get_type_casting(type) % 'value'
49
52
 
50
- @klass.class_eval <<-EOS, __FILE__, __LINE__ + 1
53
+ @methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
51
54
  def #{attribute}=(value) # def name=(value)
52
55
  @#{attribute} = case value # @name = case value
53
56
  when nil then nil # when nil then nil
@@ -60,8 +63,8 @@ module FastAttributes
60
63
  end
61
64
  end
62
65
 
63
- def compile_initialize!
64
- @klass.class_eval <<-EOS, __FILE__, __LINE__ + 1
66
+ def compile_initialize
67
+ @methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
65
68
  def initialize(attributes = {})
66
69
  attributes.each do |name, value|
67
70
  public_send("\#{name}=", value)
@@ -70,19 +73,28 @@ module FastAttributes
70
73
  EOS
71
74
  end
72
75
 
73
- def compile_attributes!
76
+ def compile_attributes
74
77
  attributes = @attributes.flat_map(&:first)
75
78
  attributes = attributes.map do |attribute|
76
79
  "'#{attribute}' => @#{attribute}"
77
80
  end
78
81
 
79
- @klass.class_eval <<-EOS, __FILE__, __LINE__ + 1
82
+ @methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
80
83
  def attributes # def attributes
81
84
  {#{attributes.join(', ')}} # {'name' => @name, ...}
82
85
  end # end
83
86
  EOS
84
87
  end
85
88
 
89
+ def include_methods
90
+ @methods.instance_eval <<-EOS, __FILE__, __LINE__ + 1
91
+ def inspect
92
+ 'FastAttributes(#{@attributes.flat_map(&:first).join(', ')})'
93
+ end
94
+ EOS
95
+ @klass.send(:include, @methods)
96
+ end
97
+
86
98
  def each_attribute
87
99
  @attributes.each do |attributes, type|
88
100
  attributes.each do |attribute|
@@ -1,3 +1,3 @@
1
1
  module FastAttributes
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -72,6 +72,13 @@ describe FastAttributes do
72
72
  expect(book.respond_to?(:finished)).to be(true)
73
73
  end
74
74
 
75
+ it 'is possible to override getter method' do
76
+ toy = Toy.new
77
+ expect(toy.name).to eq(' toy!')
78
+ toy.name = 'bear'
79
+ expect(toy.name).to eq('bear toy!')
80
+ end
81
+
75
82
  it 'generates setter methods' do
76
83
  book = Book.new
77
84
  expect(book.respond_to?(:title=)).to be(true)
@@ -84,6 +91,13 @@ describe FastAttributes do
84
91
  expect(book.respond_to?(:finished=)).to be(true)
85
92
  end
86
93
 
94
+ it 'is possible to override setter method' do
95
+ toy = Toy.new
96
+ expect(toy.price).to be(nil)
97
+ toy.price = 2
98
+ expect(toy.price).to eq(4)
99
+ end
100
+
87
101
  it 'setter methods convert values to correct datatype' do
88
102
  book = Book.new
89
103
  book.title = 123
@@ -98,7 +112,7 @@ describe FastAttributes do
98
112
  expect(book.title).to eq('123')
99
113
  expect(book.name).to eq('456')
100
114
  expect(book.pages).to be(250)
101
- expect(book.price).to be(2.55)
115
+ expect(book.price).to eq(2.55)
102
116
  expect(book.authors).to eq(%w[Jobs])
103
117
  expect(book.published).to eq(Date.new(2014, 6, 21))
104
118
  expect(book.sold).to eq(Time.new(2014, 6, 21, 20, 45, 15))
@@ -119,7 +133,7 @@ describe FastAttributes do
119
133
  expect(book.title).to be(title)
120
134
  expect(book.name).to be(name)
121
135
  expect(book.pages).to be(pages)
122
- expect(book.price).to be(price)
136
+ expect(book.price).to eq(price)
123
137
  expect(book.authors).to be(authors)
124
138
  expect(book.published).to be(published)
125
139
  expect(book.sold).to be(sold)
@@ -176,6 +190,16 @@ describe FastAttributes do
176
190
  expect(reader.name).to eq('104')
177
191
  expect(reader.age).to be(23)
178
192
  end
193
+
194
+ it 'is possible to override initialize method' do
195
+ window = Window.new
196
+ expect(window.height).to be(200)
197
+ expect(window.width).to be(80)
198
+
199
+ window = Window.new(height: 210, width: 100)
200
+ expect(window.height).to be(210)
201
+ expect(window.width).to be(100)
202
+ end
179
203
  end
180
204
 
181
205
  describe 'option attributes: true' do
@@ -187,6 +211,11 @@ describe FastAttributes do
187
211
  expect(reader.attributes).to eq({'name' => nil, 'age' => nil})
188
212
  end
189
213
 
214
+ it 'is possible to override attributes method' do
215
+ window = Window.new(height: 220, width: 100)
216
+ expect(window.attributes).to eq({'height' => 220, 'width' => 100, 'color' => 'white'})
217
+ end
218
+
190
219
  it 'attributes method return all attributes with their values' do
191
220
  publisher = Publisher.new
192
221
  publisher.name = 101
@@ -36,3 +36,38 @@ class Reader
36
36
  attribute :age, Integer
37
37
  end
38
38
  end
39
+
40
+ class Toy
41
+ extend FastAttributes
42
+
43
+ attribute :name, String
44
+ attribute :price, Float
45
+
46
+ def name
47
+ "#{super} toy!"
48
+ end
49
+
50
+ def price=(value)
51
+ super((value.to_f + 2).to_s)
52
+ end
53
+ end
54
+
55
+ class Window
56
+ extend FastAttributes
57
+
58
+ define_attributes initialize: true, attributes: true do
59
+ attribute :height, Integer
60
+ attribute :width, Integer
61
+ end
62
+
63
+ def initialize(attributes = {})
64
+ self.height = 200
65
+ self.width = 80
66
+
67
+ super(attributes)
68
+ end
69
+
70
+ def attributes
71
+ super.merge('color' => 'white')
72
+ end
73
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_attributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kostiantyn Stepaniuk