fast_attributes 0.8.0 → 0.9.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: 9c90efa52db1c0c48916b37d6229a101e99e32fb
4
- data.tar.gz: dfd651948c3f0700ccfb4d421fb1ad47009da8df
3
+ metadata.gz: 9e1112d8c8ba22bbf3f7f044f1ddf9982058c55a
4
+ data.tar.gz: 94833e4f76a0d946ccb026f1efea6b23f6d2361f
5
5
  SHA512:
6
- metadata.gz: b2eec805647af281fa932263b04cbbdcb3aff1f6d7e564e9a48ec5480f064e59258e493d4be24685e3f104ffa1e8ac19dc6bf972386c838b7b86bbad4105cdb8
7
- data.tar.gz: 60c51d7ccba9ca05ca50852bc3943d90b0081131a7756446d91de9b454bfa7f0c1bf438cef4c7a0eac1b49cb11eddb53c0995e5dff4c4091578fcdcee56f9e74
6
+ metadata.gz: b8bfec4938e8e042dfb76413b4b90abf81815066f4348eac9539c02aed03af821436e9c841401baf6bcafe62212d9d0ca31288d92099b24e19193f9d29ad4ad9
7
+ data.tar.gz: e41f6cf82b500978d3c467c49aa213381138481fc02da1e479a992ed4b53361f1fd585148dceb38b3c77f8fd2d6f47b36446e91a0a5b924927257f12104129f9
@@ -1,3 +1,23 @@
1
+ **0.9.0 (September 15, 2016)**
2
+ * Attributes via accessors [Phil Schalm](https://github.com/pnomolos)
3
+ ```ruby
4
+ class Book
5
+ extend FastAttributes
6
+
7
+ define_attributes attributes: :accessors do
8
+ attribute :author, String
9
+ end
10
+
11
+ def author
12
+ @author || "No author set"
13
+ end
14
+ end
15
+
16
+ book = Book.new
17
+ book.attributes
18
+ {"author" => "No author set"}
19
+ ```
20
+
1
21
  **0.8.0 (September 15, 2016)**
2
22
  * Support of default values [Phil Schalm](https://github.com/pnomolos)
3
23
  ```ruby
data/README.md CHANGED
@@ -126,6 +126,30 @@ book.attributes
126
126
  {"author" => "Some String"}
127
127
  ```
128
128
 
129
+ ## Attributes via accessors
130
+
131
+ Sometimes you want `attributes` to return the value of your accessors, rather than the instance variables.
132
+ This is slower than using ivars directly, so use `attributes: :accessors`:
133
+
134
+ ```ruby
135
+ class Book
136
+ extend FastAttributes
137
+
138
+ define_attributes attributes: :accessors do
139
+ attribute :author, String
140
+ end
141
+
142
+ def author
143
+ @author || "No author set"
144
+ end
145
+ end
146
+
147
+ book = Book.new
148
+ book.attributes
149
+ {"author" => "No author set"}
150
+ ```
151
+
152
+
129
153
  ## Custom Type
130
154
  It's easy to add a custom attribute type.
131
155
  ```ruby
@@ -34,7 +34,7 @@ module FastAttributes
34
34
  end
35
35
 
36
36
  if @options[:attributes]
37
- compile_attributes
37
+ compile_attributes(@options[:attributes])
38
38
  end
39
39
 
40
40
  include_methods
@@ -81,10 +81,15 @@ module FastAttributes
81
81
  EOS
82
82
  end
83
83
 
84
- def compile_attributes
84
+ def compile_attributes(mode)
85
85
  attributes = @attributes.flat_map(&:first)
86
+ prefix = case mode
87
+ when :accessors then ''
88
+ else '@'
89
+ end
90
+
86
91
  attributes = attributes.map do |attribute|
87
- "'#{attribute}' => @#{attribute}"
92
+ "'#{attribute}' => #{prefix}#{attribute}"
88
93
  end
89
94
 
90
95
  @methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
@@ -1,3 +1,3 @@
1
1
  module FastAttributes
2
- VERSION = '0.8.0'
2
+ VERSION = '0.9.0'
3
3
  end
@@ -363,6 +363,29 @@ describe FastAttributes do
363
363
  expect(reader.attributes).to eq({'name' => '102', 'age' => 25})
364
364
  end
365
365
  end
366
+
367
+ describe 'option attributes: :accessors' do
368
+ it 'doesn\'t interfere when you don\'t use the option' do
369
+ klass = AttributesWithoutAccessors.new
370
+ expect(klass.attributes).to eq({'title' => nil, 'pages' => nil, 'color' => 'white'})
371
+ end
372
+
373
+ it "is returns the values of accessors, not the ivars" do
374
+ klass = AttributesWithAccessors.new(pages: 10, title: 'Something')
375
+ expect(klass.attributes['pages']).to be(20)
376
+ expect(klass.attributes['title']).to eq('A Longer Title: Something')
377
+ end
378
+
379
+ it 'is possible to override attributes method' do
380
+ klass = AttributesWithAccessors.new(pages: 10, title: 'Something')
381
+ expect(klass.attributes).to eq({'pages' => 20, 'title' => 'A Longer Title: Something', 'color' => 'white'})
382
+ end
383
+
384
+ it 'works with default attributes' do
385
+ klass = AttributesWithAccessorsAndDefaults.new
386
+ expect(klass.attributes).to eq({'pages' => 20, 'title' => 'a title'})
387
+ end
388
+ end
366
389
  end
367
390
 
368
391
  describe "default attributes" do
@@ -114,6 +114,57 @@ class DefaultLenientAttributes
114
114
  attribute :active, :boolean
115
115
  end
116
116
 
117
+ class AttributesWithoutAccessors
118
+ extend FastAttributes
119
+
120
+ define_attributes initialize: true, attributes: true do
121
+ attribute :title, :string
122
+ attribute :pages, :integer
123
+ end
124
+
125
+ def title
126
+ "Some title"
127
+ end
128
+
129
+ def attributes
130
+ super.merge('color' => 'white')
131
+ end
132
+ end
133
+
134
+ class AttributesWithAccessors
135
+ extend FastAttributes
136
+
137
+ define_attributes initialize: true, attributes: :accessors do
138
+ attribute :title, :string
139
+ attribute :pages, :integer
140
+ end
141
+
142
+ def attributes
143
+ super.merge('color' => 'white')
144
+ end
145
+
146
+ def pages
147
+ @pages + 10
148
+ end
149
+
150
+ def title
151
+ "A Longer Title: #{@title}"
152
+ end
153
+ end
154
+
155
+ class AttributesWithAccessorsAndDefaults
156
+ extend FastAttributes
157
+
158
+ define_attributes initialize: true, attributes: :accessors do
159
+ attribute :title, String, default: "a title"
160
+ attribute :pages, Integer, default: 10
161
+ end
162
+
163
+ def pages
164
+ @pages + 10
165
+ end
166
+ end
167
+
117
168
  class ClassWithDefaults
118
169
  extend FastAttributes
119
170
 
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.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kostiantyn Stepaniuk