smart_properties 1.10.1 → 1.11.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: 51973702fc038f8cc5e9ebd3f324096da3cd7a1f
4
- data.tar.gz: 503b028e51034731838313d04197abbae91eecb2
3
+ metadata.gz: bc7370198b5c366256110bdf6dc2589491047c26
4
+ data.tar.gz: 149815152075ee2e125c4f55bb9b8916a1be631d
5
5
  SHA512:
6
- metadata.gz: 4107bbacae8c70445914acbacfa7b294fab58e81aecdf83fc3084aa57f5448bfcd0be73d5ad1a13e29da0a99498d188c8499bb740e05a7f501cb66bc21d37cfc
7
- data.tar.gz: 1cb798b2e0c8a984f5a4779d16e2c0f20fb35228b5de80c4e0926bb9cb5700d5b08944447b77cd7ed47d77fdfd2d5317f630d42226743d18dfe3550ed6caf277
6
+ metadata.gz: aa4d68dfabfd0b6cedbb2f2caa6a2105bd3ddd101bde45d3d2fef0fd52527b2ec2a3556c7b58bdf95dcf8075fc6917197e8cfda4d31795c630b6ed6a4a17f6f8
7
+ data.tar.gz: 895e03d0ad7aa8d96a76ce9c92e2cf72cd1ad558aeb99aaa644dc7c32fcff87f0f7db10631addf71b2193996a63b5ecf8d41a9ee66401cc6c56819fedebc042c
data/README.md CHANGED
@@ -212,6 +212,21 @@ class Person
212
212
  end
213
213
  ```
214
214
 
215
+ #### Custom readers
216
+
217
+ In Ruby, predicate methods by convention end with a `?`.
218
+ This convention is violated in the example above, but can easily be fixed by supplying a custom `reader` name:
219
+
220
+ ```ruby
221
+ class Person
222
+ property :name, required: lambda { not anonymous }
223
+ property :anonymous, required: true, default: true, accepts: [true, false], reader: :anonymous?
224
+ end
225
+ ```
226
+
227
+ To ensure backwards compatibility, boolean properties do not automatically change their reader name.
228
+ It is thus your responsibility to configure the property properly.
229
+
215
230
  ### Constructor argument forwarding
216
231
 
217
232
  The `SmartProperties` initializer forwards anything to the super constructor
@@ -43,7 +43,7 @@ module SmartProperties
43
43
  sender.class.name,
44
44
  value.inspect,
45
45
  property.name,
46
- acceptor_message(sender, property)
46
+ accepter_message(sender, property)
47
47
  ]
48
48
  )
49
49
  end
@@ -54,12 +54,12 @@ module SmartProperties
54
54
 
55
55
  private
56
56
 
57
- def acceptor_message(sender, property)
58
- acceptor = sender.class.properties[property.name].accepter
59
- if acceptor.is_a?(Proc)
60
- return "Values passing lambda defined in #{acceptor.source_location.join(' at line ')}"
57
+ def accepter_message(sender, property)
58
+ accepter = property.accepter
59
+ if accepter.is_a?(Proc)
60
+ return "Values passing lambda defined in #{accepter.source_location.join(' at line ')}"
61
61
  end
62
- acceptor
62
+ accepter
63
63
  end
64
64
  end
65
65
 
@@ -7,8 +7,9 @@ module SmartProperties
7
7
  module IndexMethods
8
8
  def [](name)
9
9
  return if name.nil?
10
- name &&= name.to_sym
11
- public_send(name) if self.class.properties.key?(name)
10
+ name = name.to_sym
11
+ reader = self.class.properties[name].reader
12
+ public_send(reader) if self.class.properties.key?(name)
12
13
  end
13
14
 
14
15
  def []=(name, value)
@@ -20,6 +21,7 @@ module SmartProperties
20
21
  attr_reader :name
21
22
  attr_reader :converter
22
23
  attr_reader :accepter
24
+ attr_reader :reader
23
25
  attr_reader :instance_variable_name
24
26
 
25
27
  def self.define(scope, name, options = {})
@@ -34,6 +36,8 @@ module SmartProperties
34
36
  @converter = attrs.delete(:converts)
35
37
  @accepter = attrs.delete(:accepts)
36
38
  @required = attrs.delete(:required)
39
+ @reader = attrs.delete(:reader)
40
+ @reader ||= @name
37
41
 
38
42
  @instance_variable_name = :"@#{name}"
39
43
 
@@ -101,7 +105,9 @@ module SmartProperties
101
105
  m
102
106
  end
103
107
 
104
- scope.send(:attr_reader, name)
108
+ scope.send(:define_method, reader) do
109
+ property.get(self)
110
+ end
105
111
  scope.send(:define_method, :"#{name}=") do |value|
106
112
  property.set(self, value)
107
113
  end
@@ -1,3 +1,3 @@
1
1
  module SmartProperties
2
- VERSION = "1.10.1"
2
+ VERSION = "1.11.0"
3
3
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties, 'reader' do
4
+ context "when defining a class with a property with a custom reader" do
5
+ subject(:klass) do
6
+ DummyClass.new do
7
+ property :new, default: false, accepts: [true, false], reader: :new?
8
+ end
9
+ end
10
+
11
+ context "an instance of this class" do
12
+ subject(:instance) { klass.new }
13
+
14
+ it "should read the property using a custom reader" do
15
+ instance = klass.new new: true
16
+ expect(instance.new?).to eq(true)
17
+
18
+ instance.new = false
19
+ expect(instance.new?).to eq(false)
20
+ end
21
+
22
+ it "should still read the property with the property name when using the #[] syntax" do
23
+ instance = klass.new new: true
24
+ expect(instance[:new]).to eq(true)
25
+
26
+ instance = klass.new new: false
27
+ expect(instance[:new]).to eq(false)
28
+ end
29
+ end
30
+ end
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_properties
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.1
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Tennhard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-28 00:00:00.000000000 Z
11
+ date: 2016-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -81,6 +81,7 @@ files:
81
81
  - spec/default_values_spec.rb
82
82
  - spec/inheritance_spec.rb
83
83
  - spec/property_collection_caching_spec.rb
84
+ - spec/reader_spec.rb
84
85
  - spec/required_values_spec.rb
85
86
  - spec/spec_helper.rb
86
87
  - spec/support/dummy_class.rb
@@ -116,8 +117,8 @@ test_files:
116
117
  - spec/default_values_spec.rb
117
118
  - spec/inheritance_spec.rb
118
119
  - spec/property_collection_caching_spec.rb
120
+ - spec/reader_spec.rb
119
121
  - spec/required_values_spec.rb
120
122
  - spec/spec_helper.rb
121
123
  - spec/support/dummy_class.rb
122
124
  - spec/support/smart_property_matcher.rb
123
- has_rdoc: