smart_properties 1.8.0 → 1.8.1

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: 863983d7a1707f254f044997c1e35b193bfb2c36
4
- data.tar.gz: 4853b0a0f314cc9c8f1062d293a5f550fce92f1c
3
+ metadata.gz: 01dcc093f88456b5adc03fda8756ce4c82fadf2d
4
+ data.tar.gz: 02e619aa94f6b2a1106e787f5f4ccfe4745f5b4d
5
5
  SHA512:
6
- metadata.gz: 6cb253427617818e2969273311ffaa622289c8420920b7cb98cf981857693a7c0a2a06c8b789b33c1a258e978b4b3372e60d86c58a0e783a2369069637eb8432
7
- data.tar.gz: d55fbab7960a235c68fcb28765366926de5fccad1daee313b437e135100ef5bb09fd755bbd9b6cffebaebd6bfd7ae5e9178b300ae400ad585ec88d3d67cefcd1
6
+ metadata.gz: ba7245f78b5720fe02adbf55f89a87f4a92c6525813fde45160c647f6506a76de3127606c0835c58584562a74ed05e2e106a69590372049983f89168a75014bd
7
+ data.tar.gz: 7b2ec9c3656e8d361e370118c9ef7f964770541a5ad84b725136796516179d25ddb225ea1fccb643fbe8fbe1408b0a429fdc97fb9227bb1bf15071e77c605c95
@@ -21,7 +21,7 @@
21
21
  # :required => true
22
22
  #
23
23
  module SmartProperties
24
- VERSION = "1.8.0"
24
+ VERSION = "1.8.1"
25
25
 
26
26
  class Error < ::ArgumentError; end
27
27
  class ConfigurationError < Error; end
@@ -156,6 +156,7 @@ module SmartProperties
156
156
  def prepare(value, scope)
157
157
  raise MissingValueError.new(scope, self) if required?(scope) && value.nil?
158
158
  value = convert(value, scope) unless value.nil?
159
+ raise MissingValueError.new(scope, self) if required?(scope) && value.nil?
159
160
  raise InvalidValueError.new(scope, self, value) unless accepts?(value, scope)
160
161
  value
161
162
  end
@@ -0,0 +1,99 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties, 'acceptance checking' do
4
+ context "when used to build a class that has a property called :visible which uses an array of valid values for acceptance checking" do
5
+ subject(:klass) { DummyClass.new { property :visible, accepts: [true, false] } }
6
+
7
+ context "an instance of this class" do
8
+ subject(:instance) { klass.new }
9
+
10
+ it "should allow to set true as value for visible" do
11
+ expect { instance.visible = true }.to_not raise_error
12
+ expect { instance[:visible] = true }.to_not raise_error
13
+ end
14
+
15
+ it "should allow to set false as value for visible" do
16
+ expect { instance.visible = false }.to_not raise_error
17
+ expect { instance[:visible] = false }.to_not raise_error
18
+ end
19
+
20
+ it "should not allow to set :maybe as value for visible" do
21
+ exception = SmartProperties::InvalidValueError
22
+ message = "Dummy does not accept :maybe as value for the property visible"
23
+ further_expectations = lambda { |error| expect(error.to_hash[:visible]).to eq('does not accept :maybe as value') }
24
+
25
+ expect { klass.new visible: :maybe }.to raise_error(exception, message, &further_expectations)
26
+ expect { klass.new { |i| i.visible = :maybe } }.to raise_error(exception, message, &further_expectations)
27
+
28
+ expect { instance.visible = :maybe }.to raise_error(exception, message, &further_expectations)
29
+ expect { instance[:visible] = :maybe }.to raise_error(exception, message, &further_expectations)
30
+ end
31
+ end
32
+ end
33
+
34
+ context "when used to build a class that has a property called :title that accepts either a String or a Symbol" do
35
+ subject(:klass) { DummyClass.new { property :title, accepts: [String, Symbol] } }
36
+
37
+ context "an instance of this class" do
38
+ subject(:instance) { klass.new }
39
+
40
+ it "should accept a String as title" do
41
+ expect { subject.title = "Test" }.to_not raise_error
42
+ expect { subject[:title] = "Test" }.to_not raise_error
43
+ end
44
+
45
+ it "should accept a Symbol as title" do
46
+ expect { subject.title = :test }.to_not raise_error
47
+ expect { subject[:title] = :test }.to_not raise_error
48
+ end
49
+
50
+ it 'should not an instance of any other type' do
51
+ exception = SmartProperties::InvalidValueError
52
+ message = 'Dummy does not accept 13 as value for the property title'
53
+ further_expectations = lambda { |error| expect(error.to_hash[:title]).to eq('does not accept 13 as value') }
54
+
55
+ expect { klass.new title: 13 }.to raise_error(exception, message, &further_expectations)
56
+ expect { klass.new { |i| i.title = 13 } }.to raise_error(exception, message, &further_expectations)
57
+
58
+ expect { instance.title = 13 }.to raise_error(exception, message, &further_expectations)
59
+ expect { instance[:title] = 13 }.to raise_error(exception, message, &further_expectations)
60
+ end
61
+ end
62
+ end
63
+
64
+ context 'when used to build a class that has a property called :license_plate which uses a lambda statement for accpetance checking' do
65
+ subject(:klass) do
66
+ DummyClass.new do
67
+ property :license_plate, accepts: lambda { |v| license_plate_pattern.match(v) }
68
+
69
+ def license_plate_pattern
70
+ /\w{1,2} \w{1,2} \d{1,4}/
71
+ end
72
+ end
73
+ end
74
+
75
+ context 'an instance of this class' do
76
+ subject(:instance) { klass.new }
77
+
78
+ it 'should not a accept "invalid" as value for license_plate' do
79
+ exception = SmartProperties::InvalidValueError
80
+ message = 'Dummy does not accept "invalid" as value for the property license_plate'
81
+ further_expectations = lambda { |error| expect(error.to_hash[:license_plate]).to eq('does not accept "invalid" as value') }
82
+
83
+ expect { klass.new license_plate: "invalid" }.to raise_error(exception, message, &further_expectations)
84
+ expect { klass.new { |i| i.license_plate = "invalid" } }.to raise_error(exception, message, &further_expectations)
85
+
86
+ expect { instance.license_plate = "invalid" }.to raise_error(exception, message, &further_expectations)
87
+ expect { instance[:license_plate] = "invalid" }.to raise_error(exception, message, &further_expectations)
88
+ end
89
+
90
+ it 'should accept "NE RD 1337" as license plate' do
91
+ expect { klass.new.license_plate = "NE RD 1337" }.to_not raise_error
92
+ expect { klass.new { |i| i.license_plate = "NE RD 1337" } }.to_not raise_error
93
+
94
+ expect { instance.license_plate = "NE RD 1337" }.to_not raise_error
95
+ expect { instance[:license_plate] = "NE RD 1337" }.to_not raise_error
96
+ end
97
+ end
98
+ end
99
+ end
data/spec/base_spec.rb ADDED
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties do
4
+ it 'should add a protected class method called .property when included' do
5
+ klass = Class.new { include SmartProperties }
6
+ expect(klass.respond_to?(:property, true)).to eq(true)
7
+ expect { klass.property }.to raise_error(NoMethodError)
8
+ end
9
+
10
+ context "when used to build a class that has a property called title that utilizes the full feature set of SmartProperties" do
11
+ subject(:klass) do
12
+ default_title = double(to_title: 'chunky')
13
+
14
+ DummyClass.new do
15
+ property :title, converts: :to_title, accepts: String, required: true, default: default_title
16
+ end
17
+ end
18
+
19
+ it { is_expected.to have_smart_property(:title) }
20
+
21
+ context "an instance of this class when initialized with no arguments" do
22
+ subject(:instance) { klass.new }
23
+
24
+ it "should have the default title" do
25
+ expect(instance.title).to eq('chunky')
26
+ expect(instance[:title]).to eq('chunky')
27
+ end
28
+
29
+ it "should convert all values that are assigned to title into strings when using the #title= method" do
30
+ instance.title = double(to_title: 'bacon')
31
+ expect(instance.title).to eq('bacon')
32
+
33
+ instance[:title] = double(to_title: 'yummy')
34
+ expect(instance.title).to eq('yummy')
35
+ end
36
+
37
+ it "should not allow to assign an object as title that do not respond to #to_title" do
38
+ exception = NoMethodError
39
+ message = /undefined method `to_title'/
40
+
41
+ expect { instance.title = Object.new }.to raise_error(exception, message)
42
+ expect { instance[:title] = Object.new }.to raise_error(exception, message)
43
+ end
44
+
45
+ it "should not allow to assign nil as the title" do
46
+ exception = SmartProperties::MissingValueError
47
+ message = "Dummy requires the property title to be set"
48
+ further_expectations = lambda do |error|
49
+ expect(error.to_hash[:title]).to eq('must be set')
50
+ end
51
+
52
+ expect { instance.title = nil }.to raise_error(exception, message, &further_expectations)
53
+ expect { instance[:title] = nil }.to raise_error(exception, message, &further_expectations)
54
+
55
+ expect { instance.title = double(to_title: nil) }.to raise_error(exception, message, &further_expectations)
56
+ expect { instance[:title] = double(to_title: nil) }.to raise_error(exception, message, &further_expectations)
57
+ end
58
+
59
+ it "should not influence other instances that have been initialized with different attributes" do
60
+ other_instance = klass.new title: double(to_title: 'Lorem ipsum')
61
+
62
+ expect(instance.title).to eq('chunky')
63
+ expect(other_instance.title).to eq('Lorem ipsum')
64
+ end
65
+ end
66
+
67
+ context 'an instance of this class when initialized with a title argument' do
68
+ it "should have the title specified by the corresponding keyword argument" do
69
+ instance = klass.new(title: double(to_title: 'bacon'))
70
+ expect(instance.title).to eq('bacon')
71
+ expect(instance[:title]).to eq('bacon')
72
+ end
73
+ end
74
+
75
+ context "an instance of this class when initialized with a block" do
76
+ it "should have the title specified in the block" do
77
+ instance = klass.new do |c|
78
+ c.title = double(to_title: 'bacon')
79
+ end
80
+ expect(instance.title).to eq('bacon')
81
+ expect(instance[:title]).to eq('bacon')
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties, 'configuration error' do
4
+ subject(:klass) { DummyClass.new }
5
+
6
+ context "when defining a property with invalid configuration options" do
7
+ it "should report all invalid options" do
8
+ invalid_property_definition = lambda do
9
+ klass.class_eval do
10
+ property :title, invalid_option_1: 'boom', invalid_option_2: 'boom', invalid_option_3: 'boom'
11
+ end
12
+ end
13
+
14
+ expect(&invalid_property_definition).to raise_error(SmartProperties::ConfigurationError, "SmartProperties do not support the following configuration options: invalid_option_1, invalid_option_2, invalid_option_3.")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties, 'conversion' do
4
+ context "when defining a class with a property whose converter is an object that responds to #to_proc" do
5
+ subject(:klass) do
6
+ converter = double(to_proc: lambda { |t| content_tag(:p, t.to_s) })
7
+ DummyClass.new do
8
+ property :title, converts: converter
9
+
10
+ def content_tag(name, content)
11
+ "<%s>%s</%s>" % [name, content, name]
12
+ end
13
+ end
14
+ end
15
+
16
+ context "an instance of this class" do
17
+ subject(:instance) { klass.new }
18
+
19
+ it "should convert the property using the proc" do
20
+ instance = klass.new title: 'Chunky Bacon'
21
+ expect(instance.title).to eq("<p>Chunky Bacon</p>")
22
+ expect(instance[:title]).to eq("<p>Chunky Bacon</p>")
23
+
24
+ instance.title = "Lorem Ipsum"
25
+ expect(instance.title).to eq("<p>Lorem Ipsum</p>")
26
+ expect(instance[:title]).to eq("<p>Lorem Ipsum</p>")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties, 'default values' do
4
+ context 'when used to build a class that has a property called :id whose default value is a lambda statement for retrieving the object_id' do
5
+ subject(:klass) { DummyClass.new { property :id, default: lambda { object_id } } }
6
+
7
+ context "an instance of this class" do
8
+ it "should evaluate the lambda in its own scope and thus differ from every other instance" do
9
+ first_instance, second_instance = klass.new, klass.new
10
+ expect(klass.new.id).to_not eq(klass.new.id)
11
+ end
12
+ end
13
+ end
14
+
15
+ context 'when used to build a class that has a property called :boom whose default value is a lambda statement that raises an exception' do
16
+ subject(:klass) { DummyClass.new { property :boom, default: lambda { raise 'Boom!' } } }
17
+
18
+ context "an instance of this class" do
19
+ it "should raise during initialization if no other value for :boom has been provided" do
20
+ expect { klass.new }.to raise_error(RuntimeError, 'Boom!')
21
+ end
22
+
23
+ it "should not evaluate the lambda expression and thus not raise during initialization if a different value for :boom has been provided as a a parameter or in the initalization block" do
24
+ expect { klass.new(boom: 'Everything is just fine!') }.not_to raise_error
25
+ expect { klass.new { |inst| inst.boom = 'Everything is just fine!' } }.not_to raise_error
26
+ end
27
+ end
28
+ end
29
+
30
+ context "when building a class that has a property with a default value" do
31
+ subject(:klass) { DummyClass.new { property :title, default: 'Lorem Ipsum' } }
32
+
33
+ context 'an instance of that class' do
34
+ it 'should return nil for the title when the title was explicitly set to this value during initialization' do
35
+ instance = klass.new(title: nil)
36
+ expect(instance.title).to be_nil
37
+ expect(instance[:title]).to be_nil
38
+ end
39
+
40
+ it 'should return the default value if no other value has been provided during initialization' do
41
+ instance = klass.new
42
+ expect(instance.title).to eq('Lorem Ipsum')
43
+ expect(instance[:title]).to eq('Lorem Ipsum')
44
+
45
+ instance = klass.new {}
46
+ expect(instance.title).to eq('Lorem Ipsum')
47
+ expect(instance[:title]).to eq('Lorem Ipsum')
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties, 'intheritance' do
4
+ context 'when used to build a class that has a required property with no default called :text whose getter is overriden' do
5
+ subject(:klass) do
6
+ DummyClass.new do
7
+ property :text, required: true
8
+ def text; "<em>#{super}</em>"; end
9
+ end
10
+ end
11
+
12
+ specify "an instance of this class should raise an error during initilization if no value for :text has been specified" do
13
+ expect { klass.new }.to raise_error(SmartProperties::InitializationError)
14
+ end
15
+ end
16
+
17
+ context 'when modeling the following class hiearchy: Base > Section > SectionWithSubtitle' do
18
+ let!(:base) do
19
+ Class.new do
20
+ attr_reader :content
21
+ def initialize(content = nil)
22
+ @content = content
23
+ end
24
+ end
25
+ end
26
+ let!(:section) { DummyClass.new(base) { property :title } }
27
+ let!(:subsection) { DummyClass.new(section) { property :subtitle } }
28
+
29
+ context 'the base class' do
30
+ it('should not respond to #properties') { expect(base).to_not respond_to(:properties) }
31
+ end
32
+
33
+ context 'the section class' do
34
+ it('should respond to #properties') { expect(section).to respond_to(:properties) }
35
+
36
+ context 'an instance of this class' do
37
+ subject { section.new }
38
+ it { is_expected.to have_smart_property(:title) }
39
+ it { is_expected.to_not have_smart_property(:subtitle) }
40
+ end
41
+
42
+ context 'an instance of this class when initialized with content' do
43
+ subject(:instance) { section.new('some content') }
44
+ it('should have content') { expect(instance.content).to eq('some content') }
45
+ end
46
+ end
47
+
48
+ context 'the subsectionclass' do
49
+ it('should respond to #properties') { expect(subsection).to respond_to(:properties) }
50
+
51
+ context 'an instance of this class' do
52
+ subject(:instance) { subsection.new }
53
+ it { is_expected.to have_smart_property(:title) }
54
+ it { is_expected.to have_smart_property(:subtitle) }
55
+
56
+ it 'should have content, a title, and a subtile when initialized with these parameters' do
57
+ instance = subsection.new('some content', title: 'some title', subtitle: 'some subtitle')
58
+ expect(instance.content).to eq('some content')
59
+ expect(instance.title).to eq('some title')
60
+ expect(instance.subtitle).to eq('some subtitle')
61
+
62
+ instance = subsection.new('some content') do |s|
63
+ s.title, s.subtitle = 'some title', 'some subtitle'
64
+ end
65
+ expect(instance.content).to eq('some content')
66
+ expect(instance.title).to eq('some title')
67
+ expect(instance.subtitle).to eq('some subtitle')
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'when the section class is extended with a property at runtime' do
73
+ before { section.send(:property, :type) }
74
+
75
+ context 'the section class' do
76
+ subject { section }
77
+ it { is_expected.to have_smart_property(:type) }
78
+
79
+ it 'should have content, a title, and a type when initialized with these parameters' do
80
+ instance = subsection.new('some content', title: 'some title', type: 'important')
81
+ expect(instance.content).to eq('some content')
82
+ expect(instance.title).to eq('some title')
83
+ expect(instance.type).to eq('important')
84
+
85
+ instance = subsection.new('some content') do |s|
86
+ s.title, s.type = 'some title', 'important'
87
+ end
88
+ expect(instance.content).to eq('some content')
89
+ expect(instance.title).to eq('some title')
90
+ expect(instance.type).to eq('important')
91
+ end
92
+ end
93
+
94
+ context 'the subsection class' do
95
+ subject { subsection }
96
+ it { is_expected.to have_smart_property(:type) }
97
+
98
+ it 'should have content, a title, a subtitle, and a type when initialized with these parameters' do
99
+ instance = subsection.new('some content', title: 'some title', subtitle: 'some subtitle', type: 'important')
100
+ expect(instance.content).to eq('some content')
101
+ expect(instance.title).to eq('some title')
102
+ expect(instance.subtitle).to eq('some subtitle')
103
+ expect(instance.type).to eq('important')
104
+
105
+ instance = subsection.new('some content') do |s|
106
+ s.title, s.subtitle, s.type = 'some title', 'some subtitle', 'important'
107
+ end
108
+ expect(instance.content).to eq('some content')
109
+ expect(instance.title).to eq('some title')
110
+ expect(instance.subtitle).to eq('some subtitle')
111
+ expect(instance.type).to eq('important')
112
+ end
113
+ end
114
+ end
115
+
116
+ context 'when the section class overrides the getter of the title property and uses super to retrieve the property\'s original value' do
117
+ before do
118
+ section.class_eval do
119
+ def title; super.to_s.upcase; end
120
+ end
121
+ end
122
+
123
+ specify 'an instance of the section class should transform the value as defined in the overridden getter' do
124
+ instance = section.new(title: 'some title')
125
+ expect(instance.title).to eq('SOME TITLE')
126
+ expect(instance[:title]).to eq('SOME TITLE')
127
+ end
128
+
129
+ specify 'an instance of the subsection class should transform the value as defined in the overridden getter in the superclass' do
130
+ instance = subsection.new(title: 'some title')
131
+ expect(instance.title).to eq('SOME TITLE')
132
+ expect(instance[:title]).to eq('SOME TITLE')
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SmartProperties do
4
+ context "when building a class that has a property which is required and has no default" do
5
+ subject(:klass) { DummyClass.new { property :title, required: true } }
6
+
7
+ context 'an instance of this class' do
8
+ it 'should have the correct title when provided with a title during initialization' do
9
+ instance = klass.new title: 'Lorem Ipsum'
10
+ expect(instance.title).to eq('Lorem Ipsum')
11
+ expect(instance[:title]).to eq('Lorem Ipsum')
12
+
13
+ instance = klass.new { |i| i.title = 'Lorem Ipsum' }
14
+ expect(instance.title).to eq('Lorem Ipsum')
15
+ expect(instance[:title]).to eq('Lorem Ipsum')
16
+ end
17
+
18
+ it "should raise an error stating that required properties are missing when initialized without a title" do
19
+ exception = SmartProperties::InitializationError
20
+ message = "Dummy requires the following properties to be set: title"
21
+ further_expectations = lambda { |error| expect(error.to_hash[:title]).to eq('must be set') }
22
+
23
+ expect { klass.new }.to raise_error(exception, message, &further_expectations)
24
+ expect { klass.new {} }.to raise_error(exception, message, &further_expectations)
25
+ end
26
+
27
+ it "should not allow to set nil as the property's value" do
28
+ instance = klass.new title: 'Lorem Ipsum'
29
+
30
+ exception = SmartProperties::MissingValueError
31
+ message = "Dummy requires the property title to be set"
32
+ further_expectations = lambda do |error|
33
+ expect(error.to_hash[:title]).to eq('must be set')
34
+ end
35
+
36
+ expect { instance.title = nil }.to raise_error(exception, message, &further_expectations)
37
+ expect { instance[:title] = nil }.to raise_error(exception, message, &further_expectations)
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when building a class that has a property name which is only required if the property anonymous is set to false" do
43
+ subject(:klass) do
44
+ DummyClass.new do
45
+ property :name, required: lambda { not anonymous }
46
+ property :anonymous, accepts: [true, false], default: true
47
+ end
48
+ end
49
+
50
+ it "should not raise an error when created with no arguments" do
51
+ expect { klass.new }.to_not raise_error
52
+ end
53
+
54
+ it "should raise an error indicating that a required property was not specified when created with no name and anonymous being set to false" do
55
+ exception = SmartProperties::InitializationError
56
+ message = "Dummy requires the following properties to be set: name"
57
+ further_expectations = lambda { |error| expect(error.to_hash[:name]).to eq("must be set") }
58
+
59
+ expect { klass.new anonymous: false }.to raise_error(exception, message, &further_expectations)
60
+ expect { klass.new { |i| i.anonymous = false } }.to raise_error(exception, message, &further_expectations)
61
+ end
62
+
63
+ it "should not raise an error when created with a name and anonymous being set to false" do
64
+ expect { klass.new name: "John Doe", anonymous: false }.to_not raise_error
65
+ end
66
+ end
67
+
68
+ context "when building a class that has a property which is required and has false as default" do
69
+ subject(:klass) { DummyClass.new { property :flag, required: true, default: false } }
70
+
71
+ context 'an instance of this class' do
72
+ it 'should return true as value for this property if provided with this value for the property during initialization' do
73
+ instance = klass.new flag: true
74
+ expect(instance.flag).to eq(true)
75
+ expect(instance[:flag]).to eq(true)
76
+
77
+ instance = klass.new { |i| i.flag = true }
78
+ expect(instance.flag).to eq(true)
79
+ expect(instance[:flag]).to eq(true)
80
+ end
81
+
82
+ it 'should return false as value for this property when initialized with no arguments' do
83
+ instance = klass.new
84
+ expect(instance.flag).to eq(false)
85
+ expect(instance[:flag]).to eq(false)
86
+ end
87
+ end
88
+ end
89
+
90
+ context "when building a class that has a required property with a default value and a malicious converter that always returns nil" do
91
+ subject(:klass) { DummyClass.new { property :title, required: true, converts: ->(_) { nil }, default: "Lorem Ipsum" } }
92
+
93
+ context 'an instance of this class' do
94
+ it "should raise an error when initialized" do
95
+ exception = SmartProperties::MissingValueError
96
+ message = "Dummy requires the property title to be set"
97
+ further_expectations = lambda { |error| expect(error.to_hash[:title]).to eq("must be set") }
98
+
99
+ expect { klass.new }.to raise_error(exception, message)
100
+ expect { klass.new(title: 'Lorem Ipsum') }.to raise_error(exception, message, &further_expectations)
101
+ end
102
+ end
103
+ end
104
+ end
data/spec/spec_helper.rb CHANGED
@@ -6,5 +6,4 @@ require 'smart_properties'
6
6
  Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each { |f| require f }
7
7
 
8
8
  RSpec.configure do |config|
9
-
10
9
  end
@@ -0,0 +1,9 @@
1
+ class << (DummyClass = BasicObject.new)
2
+ def new(superclass = ::Object, class_name = 'Dummy', &block)
3
+ c = ::Class.new(superclass) { include ::SmartProperties }
4
+ c.define_singleton_method(:name) { class_name }
5
+ c.class_eval(&block) if block
6
+ c
7
+ end
8
+ end
9
+
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.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Tennhard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2015-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -57,8 +57,15 @@ files:
57
57
  - Rakefile
58
58
  - lib/smart_properties.rb
59
59
  - smart_properties.gemspec
60
- - spec/smart_properties_spec.rb
60
+ - spec/acceptance_checking_spec.rb
61
+ - spec/base_spec.rb
62
+ - spec/configuration_error_spec.rb
63
+ - spec/conversion_spec.rb
64
+ - spec/default_values_spec.rb
65
+ - spec/inheritance_spec.rb
66
+ - spec/required_values_spec.rb
61
67
  - spec/spec_helper.rb
68
+ - spec/support/dummy_class.rb
62
69
  - spec/support/smart_property_matcher.rb
63
70
  homepage: ''
64
71
  licenses: []
@@ -84,7 +91,14 @@ signing_key:
84
91
  specification_version: 4
85
92
  summary: SmartProperties – Ruby accessors on steroids
86
93
  test_files:
87
- - spec/smart_properties_spec.rb
94
+ - spec/acceptance_checking_spec.rb
95
+ - spec/base_spec.rb
96
+ - spec/configuration_error_spec.rb
97
+ - spec/conversion_spec.rb
98
+ - spec/default_values_spec.rb
99
+ - spec/inheritance_spec.rb
100
+ - spec/required_values_spec.rb
88
101
  - spec/spec_helper.rb
102
+ - spec/support/dummy_class.rb
89
103
  - spec/support/smart_property_matcher.rb
90
104
  has_rdoc: