rest-in-peace 1.4.0 → 2.0.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.
@@ -2,13 +2,46 @@ require 'rest_in_peace'
2
2
 
3
3
  describe RESTinPeace do
4
4
 
5
- let(:struct) { Struct.new(:name) }
6
5
  let(:extended_class) do
7
- Class.new(struct) do
6
+ Class.new do
8
7
  include RESTinPeace
8
+
9
+ rest_in_peace do
10
+ attributes do
11
+ read :id, :name, :relation
12
+ write :my_array, :my_hash, :array_with_hash, :overridden_attribute
13
+ end
14
+ end
15
+
16
+ def overridden_attribute
17
+ 'something else'
18
+ end
19
+
20
+ def relation=(v)
21
+ @relation = v
22
+ end
23
+
24
+ def self_defined_method
25
+ puts 'yolo'
26
+ end
9
27
  end
10
28
  end
11
- let(:attributes) { { name: 'test' } }
29
+ let(:my_array) { %w(element) }
30
+ let(:name) { 'test' }
31
+ let(:my_hash) { { element1: 'yolo' } }
32
+ let(:array_with_hash) { [my_hash.dup] }
33
+ let(:overridden_attribute) { 'initial value' }
34
+ let(:attributes) do
35
+ {
36
+ id: 1,
37
+ name: name,
38
+ relation: { id: 1234 },
39
+ my_array: my_array,
40
+ my_hash: my_hash,
41
+ array_with_hash: array_with_hash,
42
+ overridden_attribute: overridden_attribute,
43
+ }
44
+ end
12
45
  let(:instance) { extended_class.new(attributes) }
13
46
 
14
47
  describe '::api' do
@@ -37,19 +70,109 @@ describe RESTinPeace do
37
70
  specify { expect(extended_class.rip_registry).to eq(collection: [], resource: []) }
38
71
  end
39
72
 
73
+ describe '::rip_attributes' do
74
+ subject { extended_class }
75
+ specify { expect(extended_class).to respond_to(:rip_attributes) }
76
+ specify do
77
+ expect(extended_class.rip_attributes).to eq(
78
+ read: [:id, :name, :relation, :my_array, :my_hash, :array_with_hash, :overridden_attribute],
79
+ write: [:my_array, :my_hash, :array_with_hash, :overridden_attribute])
80
+ end
81
+ end
82
+
83
+ describe '::rip_namespace' do
84
+ subject { extended_class }
85
+ specify { expect(subject).to respond_to(:rip_namespace) }
86
+ specify { expect(subject).to respond_to(:rip_namespace=) }
87
+ it 'allows setting the namespace' do
88
+ expect { subject.rip_namespace = :blubb }.
89
+ to change { subject.rip_namespace }.from(nil).to(:blubb)
90
+ end
91
+ end
92
+
40
93
  describe '#api' do
41
94
  subject { instance }
42
95
  specify { expect(subject).to respond_to(:api).with(0).arguments }
43
96
  end
44
97
 
45
98
  describe '#to_h' do
99
+ subject { instance.to_h }
100
+ specify { expect(subject).to eq(attributes.merge(overridden_attribute: 'something else')) }
101
+ end
102
+
103
+ describe '#hash_for_updates' do
46
104
  subject { instance }
47
- specify { expect(subject).to respond_to(:to_h).with(0).arguments }
105
+ specify { expect(subject).to respond_to(:hash_for_updates).with(0).arguments }
106
+
107
+ context 'without a namspace defined' do
108
+ it 'adds id by default' do
109
+ expect(subject.hash_for_updates).to include(id: 1)
110
+ end
111
+
112
+ context 'overridden getter' do
113
+ specify { expect(subject.hash_for_updates).to include(overridden_attribute: 'something else') }
114
+ end
115
+
116
+ context 'self defined methods' do
117
+ specify { expect(subject).to respond_to(:self_defined_method) }
118
+ specify { expect(subject.hash_for_updates).to_not include(:self_defined_method) }
119
+ end
120
+
121
+ context 'hash' do
122
+ specify { expect(subject.hash_for_updates[:my_hash]).to eq(element1: 'yolo') }
123
+ end
124
+
125
+ context 'with objects assigned' do
126
+ let(:my_hash) { double('OtherClass') }
127
+ it 'deeply calls hash_for_updates' do
128
+ expect(my_hash).to receive(:hash_for_updates).and_return({})
129
+ subject.hash_for_updates
130
+ end
131
+ end
132
+ end
133
+
134
+ context 'with a namspace defined' do
135
+ let(:extended_class) do
136
+ Class.new do
137
+ include RESTinPeace
138
+
139
+ rest_in_peace do
140
+ attributes do
141
+ read :id
142
+ write :name
143
+ end
144
+
145
+ namespace_attributes_with :blubb
146
+ end
147
+ end
148
+ end
149
+
150
+ specify { expect(subject.hash_for_updates).to eq(id: 1, blubb: { id: 1, name: 'test' }) }
151
+ end
48
152
  end
49
153
 
50
154
  describe '#initialize' do
51
155
  subject { instance }
52
- specify { expect(subject.name).to eq('test') }
156
+
157
+ context 'read only attribute' do
158
+ specify { expect { subject }.to_not raise_error }
159
+ specify { expect(subject.name).to eq('test') }
160
+ end
161
+
162
+ context 'write attribute' do
163
+ context 'via rip defined attribute' do
164
+ it 'uses the setter' do
165
+ expect_any_instance_of(extended_class).to receive(:my_array=)
166
+ subject
167
+ end
168
+ end
169
+ context 'self defined attribute' do
170
+ it 'uses the setter' do
171
+ expect_any_instance_of(extended_class).to receive(:relation=)
172
+ subject
173
+ end
174
+ end
175
+ end
53
176
 
54
177
  context 'unknown params' do
55
178
  let(:attributes) { { name: 'test42', email: 'yolo@example.org' } }
@@ -61,14 +184,24 @@ describe RESTinPeace do
61
184
  let(:attributes) { {} }
62
185
  specify { expect(subject.name).to eq(nil) }
63
186
  end
187
+
188
+ context 'read only param' do
189
+ let(:attributes) { { id: 123 } }
190
+ specify { expect(subject.id).to eq(123) }
191
+ end
64
192
  end
65
193
 
66
194
  describe '#update_attributes' do
67
- let(:new_attributes) { { name: 'yoloswag' } }
195
+ let(:new_attributes) { { name: 'yoloswag', my_array: ['yoloswag'] } }
68
196
  subject { instance }
69
197
  specify do
70
198
  expect { subject.update_attributes(new_attributes) }.
71
- to change(instance, :name).from(attributes[:name]).to(new_attributes[:name])
199
+ to change(instance, :my_array).from(attributes[:my_array]).to(new_attributes[:my_array])
200
+ end
201
+
202
+ specify do
203
+ expect { subject.update_attributes(new_attributes) }.
204
+ to_not change(instance, :name).from(attributes[:name])
72
205
  end
73
206
  end
74
207
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'simplecov'
2
2
  SimpleCov.start
3
3
 
4
+ require 'i18n'
5
+ I18n.enforce_available_locales = true
6
+
4
7
  RSpec.configure do |config|
5
8
  # These two settings work together to allow you to limit a spec run
6
9
  # to individual examples or groups you care about by tagging them with
@@ -22,7 +25,7 @@ RSpec.configure do |config|
22
25
  # Print the 10 slowest examples and example groups at the
23
26
  # end of the spec run, to help surface which specs are running
24
27
  # particularly slow.
25
- config.profile_examples = 10
28
+ # config.profile_examples = 10
26
29
 
27
30
  # Run specs in random order to surface order dependencies. If you find an
28
31
  # order dependency and want to debug it, you can fix the order by providing
metadata CHANGED
@@ -1,20 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest-in-peace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Raffael Schmid
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-07-25 00:00:00.000000000 Z
11
+ date: 2014-08-06 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>'
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ - - <=
21
+ - !ruby/object:Gem::Version
22
+ version: '4.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ! '>'
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
30
+ - - <=
31
+ - !ruby/object:Gem::Version
32
+ version: '4.1'
14
33
  - !ruby/object:Gem::Dependency
15
34
  name: rake
16
35
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
36
  requirements:
19
37
  - - ~>
20
38
  - !ruby/object:Gem::Version
@@ -22,7 +40,6 @@ dependencies:
22
40
  type: :development
23
41
  prerelease: false
24
42
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
43
  requirements:
27
44
  - - ~>
28
45
  - !ruby/object:Gem::Version
@@ -30,7 +47,6 @@ dependencies:
30
47
  - !ruby/object:Gem::Dependency
31
48
  name: rspec
32
49
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
50
  requirements:
35
51
  - - ~>
36
52
  - !ruby/object:Gem::Version
@@ -38,7 +54,6 @@ dependencies:
38
54
  type: :development
39
55
  prerelease: false
40
56
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
57
  requirements:
43
58
  - - ~>
44
59
  - !ruby/object:Gem::Version
@@ -46,49 +61,61 @@ dependencies:
46
61
  - !ruby/object:Gem::Dependency
47
62
  name: guard
48
63
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
64
  requirements:
51
65
  - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: '2.6'
68
+ - - ! '>='
52
69
  - !ruby/object:Gem::Version
53
70
  version: 2.6.1
54
71
  type: :development
55
72
  prerelease: false
56
73
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
74
  requirements:
59
75
  - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.6'
78
+ - - ! '>='
60
79
  - !ruby/object:Gem::Version
61
80
  version: 2.6.1
62
81
  - !ruby/object:Gem::Dependency
63
82
  name: guard-rspec
64
83
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
84
  requirements:
67
85
  - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '4.2'
88
+ - - ! '>='
68
89
  - !ruby/object:Gem::Version
69
90
  version: 4.2.0
70
91
  type: :development
71
92
  prerelease: false
72
93
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
94
  requirements:
75
95
  - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: '4.2'
98
+ - - ! '>='
76
99
  - !ruby/object:Gem::Version
77
100
  version: 4.2.0
78
101
  - !ruby/object:Gem::Dependency
79
102
  name: simplecov
80
103
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
104
  requirements:
83
105
  - - ~>
106
+ - !ruby/object:Gem::Version
107
+ version: '0.8'
108
+ - - ! '>='
84
109
  - !ruby/object:Gem::Version
85
110
  version: 0.8.2
86
111
  type: :development
87
112
  prerelease: false
88
113
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
114
  requirements:
91
115
  - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '0.8'
118
+ - - ! '>='
92
119
  - !ruby/object:Gem::Version
93
120
  version: 0.8.2
94
121
  description: Let your api REST in peace.
@@ -113,16 +140,21 @@ files:
113
140
  - images/rest_in_peace.gif
114
141
  - lib/rest-in-peace.rb
115
142
  - lib/rest_in_peace.rb
143
+ - lib/rest_in_peace/active_model_api.rb
116
144
  - lib/rest_in_peace/api_call.rb
117
145
  - lib/rest_in_peace/definition_proxy.rb
146
+ - lib/rest_in_peace/definition_proxy/attributes_definitions.rb
118
147
  - lib/rest_in_peace/definition_proxy/collection_method_definitions.rb
119
148
  - lib/rest_in_peace/definition_proxy/resource_method_definitions.rb
120
149
  - lib/rest_in_peace/errors.rb
150
+ - lib/rest_in_peace/faraday/raise_errors_middleware.rb
151
+ - lib/rest_in_peace/faraday/ssl_config_creator.rb
121
152
  - lib/rest_in_peace/response_converter.rb
122
- - lib/rest_in_peace/ssl_config_creator.rb
123
153
  - lib/rest_in_peace/template_sanitizer.rb
124
154
  - rest-in-peace.gemspec
155
+ - spec/rest_in_peace/active_model_api_spec.rb
125
156
  - spec/rest_in_peace/api_call_spec.rb
157
+ - spec/rest_in_peace/definition_proxy/attributes_definitions_spec.rb
126
158
  - spec/rest_in_peace/definition_proxy/collection_method_definitions_spec.rb
127
159
  - spec/rest_in_peace/definition_proxy/resource_method_definitions_spec.rb
128
160
  - spec/rest_in_peace/definition_proxy_spec.rb
@@ -133,30 +165,31 @@ files:
133
165
  homepage: http://github.com/ninech/
134
166
  licenses:
135
167
  - MIT
168
+ metadata: {}
136
169
  post_install_message:
137
170
  rdoc_options: []
138
171
  require_paths:
139
172
  - lib
140
173
  required_ruby_version: !ruby/object:Gem::Requirement
141
- none: false
142
174
  requirements:
143
175
  - - ! '>='
144
176
  - !ruby/object:Gem::Version
145
177
  version: '0'
146
178
  required_rubygems_version: !ruby/object:Gem::Requirement
147
- none: false
148
179
  requirements:
149
180
  - - ! '>='
150
181
  - !ruby/object:Gem::Version
151
182
  version: '0'
152
183
  requirements: []
153
184
  rubyforge_project:
154
- rubygems_version: 1.8.23.2
185
+ rubygems_version: 2.4.1
155
186
  signing_key:
156
- specification_version: 3
187
+ specification_version: 4
157
188
  summary: REST in peace
158
189
  test_files:
190
+ - spec/rest_in_peace/active_model_api_spec.rb
159
191
  - spec/rest_in_peace/api_call_spec.rb
192
+ - spec/rest_in_peace/definition_proxy/attributes_definitions_spec.rb
160
193
  - spec/rest_in_peace/definition_proxy/collection_method_definitions_spec.rb
161
194
  - spec/rest_in_peace/definition_proxy/resource_method_definitions_spec.rb
162
195
  - spec/rest_in_peace/definition_proxy_spec.rb
@@ -1,59 +0,0 @@
1
- require 'openssl'
2
-
3
- module RESTinPeace
4
- class SSLConfigCreator
5
- class MissingParam < Exception; end
6
-
7
- def initialize(config, verify = :peer)
8
- @config = config
9
- @verify = verify
10
-
11
- raise MissingParam, 'Specify :ca_cert in ssl options' unless @config[:ca_cert]
12
- raise MissingParam, 'Specify :client_key in ssl options' unless @config[:client_key]
13
- raise MissingParam, 'Specify :client_cert in ssl options' unless @config[:client_cert]
14
- end
15
-
16
- def faraday_options
17
- {client_cert: client_cert, client_key: client_key, ca_file: ca_cert_path, verify_mode: verify_mode}
18
- end
19
-
20
- def client_cert
21
- OpenSSL::X509::Certificate.new(open_file(client_cert_path))
22
- end
23
-
24
- def client_cert_path
25
- path(@config[:client_cert])
26
- end
27
-
28
- def client_key
29
- OpenSSL::PKey::RSA.new(open_file(client_key_path))
30
- end
31
-
32
- def client_key_path
33
- path(@config[:client_key])
34
- end
35
-
36
- def ca_cert_path
37
- path(@config[:ca_cert])
38
- end
39
-
40
- def verify_mode
41
- case @verify
42
- when :peer
43
- OpenSSL::SSL::VERIFY_PEER
44
- else
45
- raise "Unknown verify variant '#{@verify}'"
46
- end
47
- end
48
-
49
- private
50
-
51
- def open_file(file)
52
- File.open(file)
53
- end
54
-
55
- def path(file)
56
- File.join(file)
57
- end
58
- end
59
- end