spyke 5.3.0 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 00c19525c5f1a175a8bb69815c18493d61a0ae9c
4
- data.tar.gz: f3b903bd7a4ae21e974fe3a1a77e75adff7c104a
2
+ SHA256:
3
+ metadata.gz: 7de3203151c0bbf40af24c4ebb7926f60b497e61cd4a7edd3d5b0dcc12f302e5
4
+ data.tar.gz: 9cea6becd607f2f4a74258a5984055e619206f0df881c56fb444716e6e91b8af
5
5
  SHA512:
6
- metadata.gz: 23693dddb0c0b1f7f5afc44b7015de2eb4e1fbd28ae847685690ddf0f5c957a1f0cee01e63566827f987ee95d84aab6ea1b9019145f98ba3aaa397a53fbe899b
7
- data.tar.gz: 10d722d8f55f915520a2c95a42e9545afe712599a6a8c8859674ded1f7548582f759eee2f285a18882aaa691aeda55b2eb7f0d9ee4cacbae4f9a4c667442a92f
6
+ metadata.gz: db5b33e37fe25bc7f2f56215ca904a37c40541804acaa8338c9b63d23ac10e9e7724f65b6abf4ac98501b354fd1d802cd0bff0483b3a2b64673797d299043750
7
+ data.tar.gz: 34252e5c0e56a6b7a3fc83343ed955d39f6dc46250da3c8e90817df01609adcb9e09105cc9bb6b96bfd4b8c66bf06d3dbcbc20fbf4ccc7cd11ef016800019c5a
@@ -1,5 +1,5 @@
1
1
  notifications:
2
2
  email: false
3
3
  rvm:
4
- - 2.3.1
4
+ - 2.6.6
5
5
  sudo: false
data/README.md CHANGED
@@ -1,12 +1,11 @@
1
1
  # Spyke
2
2
 
3
3
  <p align="center">
4
- <img src="http://upload.wikimedia.org/wikipedia/en/thumb/2/21/Spyke.jpg/392px-Spyke.jpg" width="20%" />
4
+ <img src="http://upload.wikimedia.org/wikipedia/en/thumb/2/21/Spyke.jpg/392px-Spyke.jpg" width="15%" />
5
5
  <br/>
6
6
  Interact with remote <strong>REST services</strong> in an <strong>ActiveRecord-like</strong> manner.
7
7
  <br /><br />
8
8
  <a href="https://rubygems.org/gems/spyke"><img src="https://badge.fury.io/rb/spyke.svg?style=flat" alt="Gem Version"></a>
9
- <a href='https://gemnasium.com/balvig/spyke'><img src="https://gemnasium.com/balvig/spyke.svg" /></a>
10
9
  <a href="https://codeclimate.com/github/balvig/spyke"><img src="https://codeclimate.com/github/balvig/spyke/badges/gpa.svg" /></a>
11
10
  <a href='https://coveralls.io/r/balvig/spyke?branch=master'><img src='https://img.shields.io/coveralls/balvig/spyke.svg?style=flat' /></a>
12
11
  <a href="https://travis-ci.org/balvig/spyke"><img src="https://travis-ci.org/balvig/spyke.svg?branch=master" /></a>
@@ -31,6 +30,7 @@ Add this line to your application's Gemfile:
31
30
 
32
31
  ```ruby
33
32
  gem 'spyke'
33
+ gem 'multi_json' # or whatever is needed to parse responses
34
34
  ```
35
35
 
36
36
  Spyke uses Faraday to handle requests and expects it to parse the response body into a hash in the following format:
@@ -153,6 +153,19 @@ Post.request(:post, 'posts/3/log', time: '12:00')
153
153
  # => POST http://api.com/posts/3/log - { time: '12:00' }
154
154
  ```
155
155
 
156
+ ### Custom primary keys
157
+
158
+ Custom primary keys can be defined with `self.primary_key = :custom_key`:
159
+
160
+ ```ruby
161
+ class User < Spyke::Base
162
+ self.primary_key = :user_id
163
+
164
+ # When using custom URIs the :id parameter also has to be adjusted
165
+ uri 'people(/:user_id)'
166
+ end
167
+ ```
168
+
156
169
  ### API-side validations
157
170
 
158
171
  Spyke expects errors to be formatted in the same way as the
@@ -6,7 +6,6 @@ module Spyke
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- attr_reader :attributes
10
9
  delegate :[], :[]=, to: :attributes
11
10
  end
12
11
 
@@ -40,11 +39,19 @@ module Spyke
40
39
  yield self if block_given?
41
40
  end
42
41
 
42
+ def attributes
43
+ @spyke_attributes
44
+ end
45
+
43
46
  def attributes=(new_attributes)
44
- @attributes ||= Attributes.new(scope.params)
47
+ @spyke_attributes ||= Attributes.new(scope.params)
45
48
  use_setters(new_attributes) if new_attributes
46
49
  end
47
50
 
51
+ def id?
52
+ id.present?
53
+ end
54
+
48
55
  def id
49
56
  attributes[primary_key]
50
57
  end
@@ -41,20 +41,20 @@ module Spyke
41
41
  @uri ||= uri_template || default_uri
42
42
  end
43
43
 
44
- private
45
-
46
- def send_request(method, path, params)
47
- connection.send(method) do |request|
48
- if method == :get
49
- request.url path.to_s, params
50
- else
51
- request.url path.to_s
52
- request.body = params
53
- end
44
+ def send_request(method, path, params)
45
+ connection.send(method) do |request|
46
+ if method == :get
47
+ request.url path.to_s, params
48
+ else
49
+ request.url path.to_s
50
+ request.body = params
54
51
  end
55
- rescue Faraday::ConnectionFailed, Faraday::TimeoutError
56
- raise ConnectionError
57
52
  end
53
+ rescue Faraday::ConnectionFailed, Faraday::TimeoutError
54
+ raise ConnectionError
55
+ end
56
+
57
+ private
58
58
 
59
59
  def scoped_request(method)
60
60
  uri = new.uri
@@ -79,7 +79,7 @@ module Spyke
79
79
  end
80
80
 
81
81
  def default_uri
82
- "#{model_name.element.pluralize}/(:#{primary_key})"
82
+ "#{model_name.element.pluralize}(/:#{primary_key})"
83
83
  end
84
84
  end
85
85
 
@@ -1,3 +1,3 @@
1
1
  module Spyke
2
- VERSION = '5.3.0'
2
+ VERSION = '5.4.0'
3
3
  end
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency 'activesupport', '>= 4.0.0', '< 6.0'
22
- spec.add_dependency 'activemodel', '>= 4.0.0', '< 6.0'
21
+ spec.add_dependency 'activesupport', '>= 4.0.0'
22
+ spec.add_dependency 'activemodel', '>= 4.0.0'
23
23
  spec.add_dependency 'faraday', '>= 0.9.0', '< 2.0'
24
24
  spec.add_dependency 'faraday_middleware', '>= 0.9.1', '< 2.0'
25
25
  spec.add_dependency 'addressable', '>= 2.5.2'
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ module Spyke
4
+ class ActiveModelDirtyTest < MiniTest::Test
5
+ def test_attributes_instance_var_compatibility
6
+ recipe = RecipeWithDirty.new(title: 'Cheeseburger')
7
+
8
+ # If @attributes is set on recipe ActiveModel::Dirty will crash
9
+ assert_equal false, recipe.attribute_changed_in_place?(:title)
10
+ end
11
+ end
12
+ end
@@ -135,9 +135,9 @@ module Spyke
135
135
 
136
136
  def test_inspect
137
137
  recipe = Recipe.new(id: 2, title: 'Pizza', description: 'Delicious')
138
- assert_equal '#<Recipe(recipes/(:id)) id: 2 title: "Pizza" description: "Delicious">', recipe.inspect
138
+ assert_equal '#<Recipe(recipes(/:id)) id: 2 title: "Pizza" description: "Delicious">', recipe.inspect
139
139
  recipe = Recipe.new
140
- assert_equal '#<Recipe(recipes/(:id)) id: nil >', recipe.inspect
140
+ assert_equal '#<Recipe(recipes(/:id)) id: nil >', recipe.inspect
141
141
  user = Recipe.new.build_user
142
142
  assert_equal '#<User(users/:uuid) id: nil >', user.inspect
143
143
  group = Recipe.new.groups.build
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ module Spyke
4
+ class ConfigConnectionWarnTest < MiniTest::Test
5
+ def test_config_connection_warn
6
+ assert_output '', "[DEPRECATION] `Spyke::Config.connection=` is deprecated. Please use `Spyke::Base.connection=` instead.\n" do
7
+ Spyke::Config.connection = Spyke::Base.connection
8
+ end
9
+ end
10
+ end
11
+ end
@@ -63,9 +63,16 @@ module Spyke
63
63
  end
64
64
 
65
65
  def test_multiple_apis
66
- endpoint = stub_request(:get, 'http://sashimi.com/other_recipes')
66
+ endpoint = stub_request(:get, 'http://sashimi.com/recipes')
67
67
  OtherRecipe.all.to_a
68
68
  assert_requested endpoint
69
69
  end
70
+
71
+ def test_multiple_apis_with_custom_fallback
72
+ fallback_endpoint = stub_request(:get, 'http://sushi.com/recipes')
73
+ primary_endpoint = stub_request(:get, 'http://sashimi.com/recipes').to_timeout
74
+ OtherRecipe.all.to_a
75
+ assert_requested fallback_endpoint
76
+ end
70
77
  end
71
78
  end
@@ -206,5 +206,13 @@ module Spyke
206
206
  assert_equal 1, user[:uuid]
207
207
  assert_equal 42, user[:id]
208
208
  end
209
+
210
+ def test_custom_primary_key_used_for_persistence_check
211
+ user = User.new
212
+ refute user.persisted?
213
+
214
+ user.uuid = 1
215
+ assert user.persisted?
216
+ end
209
217
  end
210
218
  end
@@ -116,7 +116,15 @@ class OtherApi < Spyke::Base
116
116
  end
117
117
  end
118
118
 
119
- class OtherRecipe < OtherApi; end
119
+ class OtherRecipe < OtherApi
120
+ uri 'recipes/(:id)'
121
+
122
+ def self.send_request(method, path, params)
123
+ super
124
+ rescue Spyke::ConnectionError
125
+ Recipe.send_request(method, path, params)
126
+ end
127
+ end
120
128
 
121
129
  class Search
122
130
  def initialize(query)
@@ -152,3 +160,10 @@ module Cookbook
152
160
  include_root_in_json :foto
153
161
  end
154
162
  end
163
+
164
+ class RecipeWithDirty < Recipe
165
+ # NOTE: Simply including ActiveModel::Dirty doesn't provide all the dirty
166
+ # functionality. This is left intentionally incomplete as it's all we need
167
+ # for testing compatibility.
168
+ include ActiveModel::Dirty
169
+ end
@@ -9,7 +9,7 @@ end
9
9
  require 'spyke'
10
10
  require 'minitest/autorun'
11
11
  require 'minitest/reporters'
12
- require 'mocha/mini_test'
12
+ require 'mocha/minitest'
13
13
  require 'multi_json'
14
14
  require 'pry'
15
15
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spyke
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.0
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Balvig
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-02 00:00:00.000000000 Z
11
+ date: 2020-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 4.0.0
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '6.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 4.0.0
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '6.0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: activemodel
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -37,9 +31,6 @@ dependencies:
37
31
  - - ">="
38
32
  - !ruby/object:Gem::Version
39
33
  version: 4.0.0
40
- - - "<"
41
- - !ruby/object:Gem::Version
42
- version: '6.0'
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -47,9 +38,6 @@ dependencies:
47
38
  - - ">="
48
39
  - !ruby/object:Gem::Version
49
40
  version: 4.0.0
50
- - - "<"
51
- - !ruby/object:Gem::Version
52
- version: '6.0'
53
41
  - !ruby/object:Gem::Dependency
54
42
  name: faraday
55
43
  requirement: !ruby/object:Gem::Requirement
@@ -257,7 +245,6 @@ files:
257
245
  - LICENSE.txt
258
246
  - README.md
259
247
  - Rakefile
260
- - circle.yml
261
248
  - lib/spyke.rb
262
249
  - lib/spyke/associations.rb
263
250
  - lib/spyke/associations/association.rb
@@ -285,9 +272,11 @@ files:
285
272
  - lib/spyke/scoping.rb
286
273
  - lib/spyke/version.rb
287
274
  - spyke.gemspec
275
+ - test/activemodel_dirty_test.rb
288
276
  - test/associations_test.rb
289
277
  - test/attributes_test.rb
290
278
  - test/callbacks_test.rb
279
+ - test/config_test.rb
291
280
  - test/custom_request_test.rb
292
281
  - test/fallbacks_test.rb
293
282
  - test/orm_test.rb
@@ -300,7 +289,7 @@ homepage: https://github.com/balvig/spyke
300
289
  licenses:
301
290
  - MIT
302
291
  metadata: {}
303
- post_install_message:
292
+ post_install_message:
304
293
  rdoc_options: []
305
294
  require_paths:
306
295
  - lib
@@ -315,15 +304,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
315
304
  - !ruby/object:Gem::Version
316
305
  version: '0'
317
306
  requirements: []
318
- rubyforge_project:
319
- rubygems_version: 2.6.13
320
- signing_key:
307
+ rubygems_version: 3.0.3
308
+ signing_key:
321
309
  specification_version: 4
322
310
  summary: Interact with REST services in an ActiveRecord-like manner
323
311
  test_files:
312
+ - test/activemodel_dirty_test.rb
324
313
  - test/associations_test.rb
325
314
  - test/attributes_test.rb
326
315
  - test/callbacks_test.rb
316
+ - test/config_test.rb
327
317
  - test/custom_request_test.rb
328
318
  - test/fallbacks_test.rb
329
319
  - test/orm_test.rb
data/circle.yml DELETED
@@ -1,3 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.2.2