frenetic 0.0.12 → 0.0.20.alpha.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.
Files changed (43) hide show
  1. data/.gitignore +1 -0
  2. data/.irbrc +3 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +0 -1
  5. data/Gemfile +1 -3
  6. data/README.md +138 -125
  7. data/frenetic.gemspec +5 -6
  8. data/lib/frenetic.rb +31 -43
  9. data/lib/frenetic/concerns/collection_rest_methods.rb +13 -0
  10. data/lib/frenetic/concerns/configurable.rb +59 -0
  11. data/lib/frenetic/concerns/hal_linked.rb +59 -0
  12. data/lib/frenetic/concerns/member_rest_methods.rb +15 -0
  13. data/lib/frenetic/concerns/structured.rb +53 -0
  14. data/lib/frenetic/configuration.rb +40 -76
  15. data/lib/frenetic/middleware/hal_json.rb +23 -0
  16. data/lib/frenetic/resource.rb +77 -62
  17. data/lib/frenetic/resource_collection.rb +46 -0
  18. data/lib/frenetic/version.rb +2 -2
  19. data/spec/concerns/configurable_spec.rb +50 -0
  20. data/spec/concerns/hal_linked_spec.rb +116 -0
  21. data/spec/concerns/member_rest_methods_spec.rb +41 -0
  22. data/spec/concerns/structured_spec.rb +214 -0
  23. data/spec/configuration_spec.rb +99 -0
  24. data/spec/fixtures/test_api_requests.rb +88 -0
  25. data/spec/frenetic_spec.rb +137 -0
  26. data/spec/middleware/hal_json_spec.rb +83 -0
  27. data/spec/resource_collection_spec.rb +80 -0
  28. data/spec/resource_spec.rb +211 -0
  29. data/spec/spec_helper.rb +4 -13
  30. data/spec/support/rspec.rb +5 -0
  31. data/spec/support/webmock.rb +3 -0
  32. metadata +59 -57
  33. data/.rvmrc +0 -1
  34. data/lib/frenetic/hal_json.rb +0 -23
  35. data/lib/frenetic/hal_json/response_wrapper.rb +0 -43
  36. data/lib/recursive_open_struct.rb +0 -79
  37. data/spec/fixtures/vcr_cassettes/description_error_unauthorized.yml +0 -36
  38. data/spec/fixtures/vcr_cassettes/description_success.yml +0 -38
  39. data/spec/lib/frenetic/configuration_spec.rb +0 -189
  40. data/spec/lib/frenetic/hal_json/response_wrapper_spec.rb +0 -70
  41. data/spec/lib/frenetic/hal_json_spec.rb +0 -68
  42. data/spec/lib/frenetic/resource_spec.rb +0 -182
  43. data/spec/lib/frenetic_spec.rb +0 -129
@@ -0,0 +1,211 @@
1
+ require 'spec_helper'
2
+
3
+ describe Frenetic::Resource do
4
+ let(:test_cfg) { { url:'http://example.com/api' } }
5
+
6
+ let(:my_temp_resource) do
7
+ cfg = test_cfg
8
+
9
+ Class.new(described_class) do
10
+ api_client { Frenetic.new(cfg) }
11
+ end
12
+ end
13
+
14
+ before do
15
+ stub_const 'MyNamespace::MyTempResource', my_temp_resource
16
+ end
17
+
18
+ describe '.api_client' do
19
+ context 'calling with' do
20
+ def configure_with_block!
21
+ cfg_copy = test_cfg
22
+
23
+ MyNamespace::MyTempResource.class_eval do
24
+ api_client { Frenetic.new(cfg_copy) }
25
+ end
26
+ end
27
+
28
+ def configure_with_instance!
29
+ cfg_copy = test_cfg
30
+
31
+ MyNamespace::MyTempResource.class_eval do
32
+ api_client Frenetic.new(cfg_copy)
33
+ end
34
+ end
35
+
36
+ context 'a block argument' do
37
+ before do
38
+ configure_with_block!
39
+ end
40
+
41
+ subject { MyNamespace::MyTempResource.instance_variable_get '@api_client' }
42
+
43
+ it 'should save a reference to the argument' do
44
+ subject.should be_a Proc
45
+ end
46
+ end
47
+
48
+ context 'a Frenetic instance' do
49
+ before do
50
+ configure_with_instance!
51
+ end
52
+
53
+ subject { MyNamespace::MyTempResource.instance_variable_get '@api_client' }
54
+
55
+ it 'should save a reference to the argument' do
56
+ subject.should be_an_instance_of Frenetic
57
+ end
58
+ end
59
+
60
+ context 'no argument' do
61
+ subject { MyNamespace::MyTempResource.api_client }
62
+
63
+ context 'and a previously stored @api_client' do
64
+ context 'Proc' do
65
+ before do
66
+ configure_with_block!
67
+ end
68
+
69
+ it 'should call the Proc' do
70
+ MyNamespace::MyTempResource.instance_variable_get('@api_client')
71
+ .should_receive 'call'
72
+
73
+ subject
74
+ end
75
+ end
76
+
77
+ context 'Frenetic instance' do
78
+ before do
79
+ configure_with_instance!
80
+ end
81
+
82
+ it 'should return the instance' do
83
+ subject.should be_an_instance_of Frenetic
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ describe '.namespace' do
92
+ before do
93
+ stub_const 'MyNamespace::MyTempResource', my_temp_resource
94
+ end
95
+
96
+ subject { MyNamespace::MyTempResource.namespace }
97
+
98
+ context 'with an argument' do
99
+ before do
100
+ MyNamespace::MyTempResource.class_eval do
101
+ namespace :test_spec
102
+ end
103
+ end
104
+
105
+ it 'should return that value' do
106
+ subject.should == 'test_spec'
107
+ end
108
+
109
+ it 'should internally save the value' do
110
+ subject
111
+
112
+ ns = MyNamespace::MyTempResource.instance_variable_get '@namespace'
113
+
114
+ ns.should == 'test_spec'
115
+ end
116
+ end
117
+
118
+ context 'with no argument' do
119
+ it 'should infer the value' do
120
+ subject.should == 'my_temp_resource'
121
+ end
122
+
123
+ it 'should cache the inferrence' do
124
+ subject
125
+
126
+ ns = MyNamespace::MyTempResource.instance_variable_get '@namespace'
127
+
128
+ ns.should == 'my_temp_resource'
129
+ end
130
+ end
131
+ end
132
+
133
+ describe '.properties' do
134
+ before { @stubs.api_description }
135
+
136
+ subject { MyNamespace::MyTempResource.properties }
137
+
138
+ context 'for a known resource' do
139
+ it 'should return a list of properties defined by the API' do
140
+ subject.should_not be_empty
141
+ end
142
+ end
143
+
144
+ context 'for an unknown resource' do
145
+ before do
146
+ MyNamespace::MyTempResource.stub(:namespace).and_return Time.now.to_i.to_s
147
+ end
148
+
149
+ it 'should raise an error' do
150
+ expect{ subject }.to raise_error Frenetic::HypermediaError
151
+ end
152
+ end
153
+ end
154
+
155
+ describe '#initialize' do
156
+ before { @stubs.api_description }
157
+
158
+ subject { MyNamespace::MyTempResource.new args }
159
+
160
+ context 'with no arguments' do
161
+ let(:args) {}
162
+
163
+ it 'should have default attributes' do
164
+ subject.name.should be_nil
165
+ end
166
+ end
167
+
168
+ context 'with known attributes' do
169
+ let(:args) { { name:'foo' } }
170
+
171
+ it 'should set the appropriate values' do
172
+ subject.name.should == 'foo'
173
+ end
174
+ end
175
+
176
+ context 'with unknown attributes' do
177
+ let(:args) { { gender:'male' } }
178
+
179
+ it 'should not create accessors' do
180
+ expect{ subject.gender }.to raise_error NoMethodError
181
+ end
182
+
183
+ it 'should be accessible in @params' do
184
+ params = subject.instance_variable_get( '@params' )
185
+
186
+ params.should include 'gender' => 'male'
187
+ end
188
+ end
189
+
190
+ context 'for a schemaless resource' do
191
+ let(:args) {}
192
+
193
+ before do
194
+ MyNamespace::MyTempResource.stub(:namespace).and_return Time.now.to_i.to_s
195
+ end
196
+
197
+ it 'should raise an error' do
198
+ expect{ subject }.to raise_error Frenetic::HypermediaError
199
+ end
200
+ end
201
+ end
202
+
203
+ describe '#attributes' do
204
+ before { @stubs.api_description }
205
+
206
+ subject { MyNamespace::MyTempResource.new(name:'me').attributes }
207
+
208
+ it { should == { 'name' => 'me' } }
209
+ end
210
+
211
+ end
@@ -1,18 +1,9 @@
1
1
  ENV['RAILS_ENV'] ||= 'test'
2
2
 
3
- require 'rspec'
4
3
  require 'awesome_print'
5
- require 'vcr'
6
- require 'patron'
4
+ require 'rspec'
7
5
  require 'frenetic'
8
6
 
9
- RSpec.configure do |config|
10
- config.filter_run focus:true
11
- config.run_all_when_everything_filtered = true
12
- config.treat_symbols_as_metadata_keys_with_true_values = true
13
- end
14
-
15
- VCR.configure do |c|
16
- c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
17
- c.hook_into :webmock
18
- end
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir['./spec/support/**/*.rb'].each {|f| require f}
@@ -0,0 +1,5 @@
1
+ RSpec.configure do |config|
2
+ config.filter_run focus:true
3
+ config.run_all_when_everything_filtered = true
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ end
@@ -0,0 +1,3 @@
1
+ require 'webmock/rspec'
2
+
3
+ Dir[File.expand_path('../../fixtures/*.rb', __FILE__)].each { |f| require f }
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frenetic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
5
- prerelease:
4
+ version: 0.0.20.alpha.0
5
+ prerelease: 7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Derek Lindahl
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-22 00:00:00.000000000 Z
12
+ date: 2013-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 0.8.1
21
+ version: 0.8.7
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 0.8.1
29
+ version: 0.8.7
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: faraday_middleware
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: '2'
53
+ version: '3'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,23 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: '2'
62
- - !ruby/object:Gem::Dependency
63
- name: rack-cache
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: '1.1'
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: '1.1'
61
+ version: '3'
78
62
  - !ruby/object:Gem::Dependency
79
63
  name: addressable
80
64
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +66,7 @@ dependencies:
82
66
  requirements:
83
67
  - - ~>
84
68
  - !ruby/object:Gem::Version
85
- version: '2.2'
69
+ version: 2.3.4
86
70
  type: :runtime
87
71
  prerelease: false
88
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,23 +74,23 @@ dependencies:
90
74
  requirements:
91
75
  - - ~>
92
76
  - !ruby/object:Gem::Version
93
- version: '2.2'
77
+ version: 2.3.4
94
78
  - !ruby/object:Gem::Dependency
95
- name: patron
79
+ name: awesome_print
96
80
  requirement: !ruby/object:Gem::Requirement
97
81
  none: false
98
82
  requirements:
99
- - - ~>
83
+ - - ! '>='
100
84
  - !ruby/object:Gem::Version
101
- version: 0.4.18
85
+ version: '0'
102
86
  type: :development
103
87
  prerelease: false
104
88
  version_requirements: !ruby/object:Gem::Requirement
105
89
  none: false
106
90
  requirements:
107
- - - ~>
91
+ - - ! '>='
108
92
  - !ruby/object:Gem::Version
109
- version: 0.4.18
93
+ version: '0'
110
94
  - !ruby/object:Gem::Dependency
111
95
  name: rspec
112
96
  requirement: !ruby/object:Gem::Requirement
@@ -124,13 +108,13 @@ dependencies:
124
108
  - !ruby/object:Gem::Version
125
109
  version: 2.13.0
126
110
  - !ruby/object:Gem::Dependency
127
- name: webmock
111
+ name: rack-cache
128
112
  requirement: !ruby/object:Gem::Requirement
129
113
  none: false
130
114
  requirements:
131
115
  - - ~>
132
116
  - !ruby/object:Gem::Version
133
- version: 1.11.0
117
+ version: '1.2'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
@@ -138,15 +122,15 @@ dependencies:
138
122
  requirements:
139
123
  - - ~>
140
124
  - !ruby/object:Gem::Version
141
- version: 1.11.0
125
+ version: '1.2'
142
126
  - !ruby/object:Gem::Dependency
143
- name: vcr
127
+ name: webmock
144
128
  requirement: !ruby/object:Gem::Requirement
145
129
  none: false
146
130
  requirements:
147
131
  - - ~>
148
132
  - !ruby/object:Gem::Version
149
- version: 2.4.0
133
+ version: 1.11.0
150
134
  type: :development
151
135
  prerelease: false
152
136
  version_requirements: !ruby/object:Gem::Requirement
@@ -154,7 +138,7 @@ dependencies:
154
138
  requirements:
155
139
  - - ~>
156
140
  - !ruby/object:Gem::Version
157
- version: 2.4.0
141
+ version: 1.11.0
158
142
  description: An opinionated Ruby-based Hypermedia API client.
159
143
  email:
160
144
  - dlindahl@customink.com
@@ -163,7 +147,8 @@ extensions: []
163
147
  extra_rdoc_files: []
164
148
  files:
165
149
  - .gitignore
166
- - .rvmrc
150
+ - .irbrc
151
+ - .ruby-version
167
152
  - .travis.yml
168
153
  - Gemfile
169
154
  - LICENSE
@@ -171,20 +156,29 @@ files:
171
156
  - Rakefile
172
157
  - frenetic.gemspec
173
158
  - lib/frenetic.rb
159
+ - lib/frenetic/concerns/collection_rest_methods.rb
160
+ - lib/frenetic/concerns/configurable.rb
161
+ - lib/frenetic/concerns/hal_linked.rb
162
+ - lib/frenetic/concerns/member_rest_methods.rb
163
+ - lib/frenetic/concerns/structured.rb
174
164
  - lib/frenetic/configuration.rb
175
- - lib/frenetic/hal_json.rb
176
- - lib/frenetic/hal_json/response_wrapper.rb
165
+ - lib/frenetic/middleware/hal_json.rb
177
166
  - lib/frenetic/resource.rb
167
+ - lib/frenetic/resource_collection.rb
178
168
  - lib/frenetic/version.rb
179
- - lib/recursive_open_struct.rb
180
- - spec/fixtures/vcr_cassettes/description_error_unauthorized.yml
181
- - spec/fixtures/vcr_cassettes/description_success.yml
182
- - spec/lib/frenetic/configuration_spec.rb
183
- - spec/lib/frenetic/hal_json/response_wrapper_spec.rb
184
- - spec/lib/frenetic/hal_json_spec.rb
185
- - spec/lib/frenetic/resource_spec.rb
186
- - spec/lib/frenetic_spec.rb
169
+ - spec/concerns/configurable_spec.rb
170
+ - spec/concerns/hal_linked_spec.rb
171
+ - spec/concerns/member_rest_methods_spec.rb
172
+ - spec/concerns/structured_spec.rb
173
+ - spec/configuration_spec.rb
174
+ - spec/fixtures/test_api_requests.rb
175
+ - spec/frenetic_spec.rb
176
+ - spec/middleware/hal_json_spec.rb
177
+ - spec/resource_collection_spec.rb
178
+ - spec/resource_spec.rb
187
179
  - spec/spec_helper.rb
180
+ - spec/support/rspec.rb
181
+ - spec/support/webmock.rb
188
182
  homepage: http://dlindahl.github.com/frenetic/
189
183
  licenses: []
190
184
  post_install_message:
@@ -197,25 +191,33 @@ required_ruby_version: !ruby/object:Gem::Requirement
197
191
  - - ! '>='
198
192
  - !ruby/object:Gem::Version
199
193
  version: '0'
194
+ segments:
195
+ - 0
196
+ hash: 1697722815283438357
200
197
  required_rubygems_version: !ruby/object:Gem::Requirement
201
198
  none: false
202
199
  requirements:
203
- - - ! '>='
200
+ - - ! '>'
204
201
  - !ruby/object:Gem::Version
205
- version: '0'
202
+ version: 1.3.1
206
203
  requirements: []
207
204
  rubyforge_project:
208
- rubygems_version: 1.8.24
205
+ rubygems_version: 1.8.23
209
206
  signing_key:
210
207
  specification_version: 3
211
208
  summary: Here lies a Ruby-based Hypermedia API client that expects HAL+JSON and makes
212
209
  a lot of assumptions about your API.
213
210
  test_files:
214
- - spec/fixtures/vcr_cassettes/description_error_unauthorized.yml
215
- - spec/fixtures/vcr_cassettes/description_success.yml
216
- - spec/lib/frenetic/configuration_spec.rb
217
- - spec/lib/frenetic/hal_json/response_wrapper_spec.rb
218
- - spec/lib/frenetic/hal_json_spec.rb
219
- - spec/lib/frenetic/resource_spec.rb
220
- - spec/lib/frenetic_spec.rb
211
+ - spec/concerns/configurable_spec.rb
212
+ - spec/concerns/hal_linked_spec.rb
213
+ - spec/concerns/member_rest_methods_spec.rb
214
+ - spec/concerns/structured_spec.rb
215
+ - spec/configuration_spec.rb
216
+ - spec/fixtures/test_api_requests.rb
217
+ - spec/frenetic_spec.rb
218
+ - spec/middleware/hal_json_spec.rb
219
+ - spec/resource_collection_spec.rb
220
+ - spec/resource_spec.rb
221
221
  - spec/spec_helper.rb
222
+ - spec/support/rspec.rb
223
+ - spec/support/webmock.rb