restful_resource 2.3.0 → 2.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
2
  SHA256:
3
- metadata.gz: eecf67a6ba417dae5f868966a577a527eaf35560ddf9ec17af5aa7070e9935bb
4
- data.tar.gz: 4ddd23ce149cd8f4f9db30af2cdef923654771608108ed44ff8891199bb1643c
3
+ metadata.gz: 1f5f98400c48167cdb639a07e34ec5556d6d3ee4120686e1c97b1a21f46c1288
4
+ data.tar.gz: bf34cb96327e7420f7efd0c08bac8ffee01efea9ae104eef4bb24c03da0265a9
5
5
  SHA512:
6
- metadata.gz: 6893e6298085c0e14e28f5d08ca7ab9144eafea210d18eabeb865df3dfa9b670af1a9f0052db5a0c2ad84ed6f6b9061cb0e101b7724514385e9b14509ab138e4
7
- data.tar.gz: 0f2c0c895a4ae9a77d17b6816a15cbd0cd17f0bdbb6e46417aebfd471f1c2e33e0f3c8c997016e7bb2213d25058c6b9525106bd870145a5e8efee0da15325d9a
6
+ metadata.gz: '04010962bd8ad44f0ed445641997bf8604fad6b0b694f181040e552856730cbdf26b4e30b3cd62bd90b4e4ec152dd1811d67fad63b8efe4bfb5c6687e27e0b55'
7
+ data.tar.gz: cc0f65d304132e7eb25d601e19e491c12e584ef896681862ca4a3bda1e97e2500efb80afa5e783ab55a09d468ce87baeec1880280dd1ece333a61efc7503df8b
@@ -0,0 +1,20 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ docker:
5
+ - image: circleci/ruby:2.4.4
6
+ steps:
7
+ - checkout
8
+ - run:
9
+ name: Bundle Install
10
+ command: bundle check || bundle install
11
+ - run:
12
+ name: Run rspec in parallel
13
+ command: |
14
+ bundle exec rspec --profile 10 \
15
+ --format RspecJunitFormatter \
16
+ --out test_results/rspec.xml \
17
+ --format progress \
18
+ $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
19
+ - store_test_results:
20
+ path: test_results
data/.codeclimate.yml ADDED
@@ -0,0 +1,3 @@
1
+ plugins:
2
+ fixme:
3
+ enabled: true
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ inherit_gem:
2
+ carwow_rubocop:
3
+ - default.yml
4
+
5
+ inherit_from: .rubocop_todo.yml
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,203 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-09-11 09:24:50 +0000 using RuboCop version 0.59.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 2
10
+ # Cop supports --auto-correct.
11
+ Layout/RescueEnsureAlignment:
12
+ Exclude:
13
+ - 'lib/restful_resource/associations.rb'
14
+
15
+ # Offense count: 10
16
+ Lint/IneffectiveAccessModifier:
17
+ Exclude:
18
+ - 'lib/restful_resource/base.rb'
19
+
20
+ # Offense count: 1
21
+ Lint/Loop:
22
+ Exclude:
23
+ - 'lib/restful_resource/base.rb'
24
+
25
+ # Offense count: 2
26
+ Lint/ParenthesesAsGroupedExpression:
27
+ Exclude:
28
+ - 'spec/restful_resource/base_spec.rb'
29
+
30
+ # Offense count: 2
31
+ # Cop supports --auto-correct.
32
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
33
+ Lint/UnusedMethodArgument:
34
+ Exclude:
35
+ - 'lib/restful_resource/redirections.rb'
36
+
37
+ # Offense count: 3
38
+ # Configuration parameters: ContextCreatingMethods, MethodCreatingMethods.
39
+ Lint/UselessAccessModifier:
40
+ Exclude:
41
+ - 'lib/restful_resource/base.rb'
42
+ - 'lib/restful_resource/redirections.rb'
43
+
44
+ # Offense count: 5
45
+ Lint/UselessAssignment:
46
+ Exclude:
47
+ - 'lib/restful_resource/rails_validations.rb'
48
+ - 'lib/restful_resource/redirections.rb'
49
+ - 'spec/restful_resource/base_spec.rb'
50
+ - 'spec/restful_resource/redirections_spec.rb'
51
+
52
+ # Offense count: 8
53
+ Metrics/AbcSize:
54
+ Max: 101
55
+
56
+ # Offense count: 1
57
+ # Configuration parameters: CountComments, ExcludedMethods.
58
+ # ExcludedMethods: refine
59
+ Metrics/BlockLength:
60
+ Max: 27
61
+
62
+ # Offense count: 2
63
+ # Configuration parameters: CountComments.
64
+ Metrics/ClassLength:
65
+ Max: 162
66
+
67
+ # Offense count: 2
68
+ Metrics/CyclomaticComplexity:
69
+ Max: 13
70
+
71
+ # Offense count: 42
72
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
73
+ # URISchemes: http, https
74
+ Metrics/LineLength:
75
+ Max: 201
76
+
77
+ # Offense count: 10
78
+ # Configuration parameters: CountComments.
79
+ Metrics/MethodLength:
80
+ Max: 56
81
+
82
+ # Offense count: 8
83
+ # Configuration parameters: CountKeywordArgs.
84
+ Metrics/ParameterLists:
85
+ Max: 10
86
+
87
+ # Offense count: 1
88
+ Metrics/PerceivedComplexity:
89
+ Max: 8
90
+
91
+ # Offense count: 2
92
+ # Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
93
+ # NamePrefix: is_, has_, have_
94
+ # NamePrefixBlacklist: is_, has_, have_
95
+ # NameWhitelist: is_a?
96
+ # MethodDefinitionMacros: define_method, define_singleton_method
97
+ Naming/PredicateName:
98
+ Exclude:
99
+ - 'spec/**/*'
100
+ - 'lib/restful_resource/associations.rb'
101
+
102
+ # Offense count: 14
103
+ # Configuration parameters: Prefixes.
104
+ # Prefixes: when, with, without
105
+ RSpec/ContextWording:
106
+ Exclude:
107
+ - 'spec/restful_resource/http_client_configuration_spec.rb'
108
+ - 'spec/restful_resource/rails_validations_spec.rb'
109
+ - 'spec/restful_resource/request_spec.rb'
110
+
111
+ # Offense count: 1
112
+ RSpec/DescribeMethod:
113
+ Exclude:
114
+ - 'spec/restful_resource/base_authorization_spec.rb'
115
+
116
+ # Offense count: 19
117
+ # Configuration parameters: Max.
118
+ RSpec/ExampleLength:
119
+ Exclude:
120
+ - 'spec/restful_resource/base_spec.rb'
121
+ - 'spec/restful_resource/http_client_configuration_spec.rb'
122
+ - 'spec/restful_resource/http_client_spec.rb'
123
+ - 'spec/restful_resource/open_object_spec.rb'
124
+ - 'spec/restful_resource/rails_validations_spec.rb'
125
+ - 'spec/restful_resource/redirections_spec.rb'
126
+
127
+ # Offense count: 53
128
+ # Configuration parameters: AssignmentOnly.
129
+ RSpec/InstanceVariable:
130
+ Exclude:
131
+ - 'spec/restful_resource/associations_spec.rb'
132
+ - 'spec/restful_resource/base_spec.rb'
133
+ - 'spec/restful_resource/http_client_configuration_spec.rb'
134
+ - 'spec/restful_resource/rails_validations_spec.rb'
135
+ - 'spec/restful_resource/redirections_spec.rb'
136
+
137
+ # Offense count: 14
138
+ # Configuration parameters: EnforcedStyle.
139
+ # SupportedStyles: have_received, receive
140
+ RSpec/MessageSpies:
141
+ Exclude:
142
+ - 'spec/restful_resource/base_spec.rb'
143
+ - 'spec/restful_resource/redirections_spec.rb'
144
+ - 'spec/spec_helper.rb'
145
+
146
+ # Offense count: 22
147
+ # Configuration parameters: AggregateFailuresByDefault.
148
+ RSpec/MultipleExpectations:
149
+ Max: 7
150
+
151
+ # Offense count: 6
152
+ RSpec/NamedSubject:
153
+ Exclude:
154
+ - 'spec/restful_resource/redirections_spec.rb'
155
+
156
+ # Offense count: 10
157
+ RSpec/NestedGroups:
158
+ Max: 5
159
+
160
+ # Offense count: 2
161
+ RSpec/RepeatedDescription:
162
+ Exclude:
163
+ - 'spec/restful_resource/base_spec.rb'
164
+
165
+ # Offense count: 3
166
+ # Configuration parameters: IgnoreSymbolicNames.
167
+ RSpec/VerifiedDoubles:
168
+ Exclude:
169
+ - 'spec/restful_resource/base_spec.rb'
170
+ - 'spec/restful_resource/rails_validations_spec.rb'
171
+ - 'spec/restful_resource/redirections_spec.rb'
172
+
173
+ # Offense count: 1
174
+ # Configuration parameters: AllowedChars.
175
+ Style/AsciiComments:
176
+ Exclude:
177
+ - 'lib/restful_resource/instrumentation.rb'
178
+
179
+ # Offense count: 1
180
+ Style/MethodMissingSuper:
181
+ Exclude:
182
+ - 'lib/restful_resource/open_object.rb'
183
+
184
+ # Offense count: 1
185
+ Style/MissingRespondToMissing:
186
+ Exclude:
187
+ - 'lib/restful_resource/open_object.rb'
188
+
189
+ # Offense count: 1
190
+ # Cop supports --auto-correct.
191
+ # Configuration parameters: EnforcedStyle, AllowInnerSlashes.
192
+ # SupportedStyles: slashes, percent_r, mixed
193
+ Style/RegexpLiteral:
194
+ Exclude:
195
+ - 'lib/restful_resource/base.rb'
196
+
197
+ # Offense count: 1
198
+ # Cop supports --auto-correct.
199
+ # Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, IgnoreClassMethods, Whitelist.
200
+ # Whitelist: to_ary, to_a, to_c, to_enum, to_h, to_hash, to_i, to_int, to_io, to_open, to_path, to_proc, to_r, to_regexp, to_str, to_s, to_sym
201
+ Style/TrivialAccessors:
202
+ Exclude:
203
+ - 'lib/restful_resource/base.rb'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ v2.4.0
4
+ ---
5
+
6
+ - Add `faraday_options` to `Base.configure`
7
+
3
8
  v2.1.0
4
9
  ---
5
10
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RestfulResource ![build status](https://circleci.com/gh/carwow/restful_resource.svg?style=shield&circle-token=0558310359000e8786d1fe42774b0e30b2b0e12c)
1
+ # RestfulResource ![build status](https://circleci.com/gh/carwow/restful_resource.svg?style=shield&circle-token=0558310359000e8786d1fe42774b0e30b2b0e12c) [![Maintainability](https://api.codeclimate.com/v1/badges/61c85db718d559aa97c5/maintainability)](https://codeclimate.com/github/carwow/restful_resource/maintainability)
2
2
 
3
3
  Provides an ActiveResource like interface to JSON API's
4
4
 
data/Rakefile CHANGED
@@ -9,12 +9,12 @@ desc "Upload to rubygems"
9
9
  task :upload => :build do
10
10
  # Check if tag with v#{ResearchSiteApiClient::VERSION} version exists, if so, return with error
11
11
 
12
- # if tag_exists?(current_tag_name)
13
- # puts "Tag exists, did you run rake increase_revision_number after merging with master?"
14
- # exit 1
15
- # end
12
+ if tag_exists?(current_tag_name)
13
+ puts "Tag exists, did you run rake increase_revision_number after merging with master?"
14
+ exit 1
15
+ end
16
16
 
17
- # create_tag(current_tag_name)
17
+ create_tag(current_tag_name)
18
18
  Rake::Task[:release].invoke
19
19
  end
20
20
 
@@ -1,37 +1,39 @@
1
1
  module RestfulResource
2
2
  module Associations
3
3
  def has_many(nested_resource_type)
4
- namespace = self.to_s.deconstantize
5
- klass_name = "#{nested_resource_type.to_s.singularize.camelize.to_s}"
4
+ namespace = to_s.deconstantize
5
+ klass_name = nested_resource_type.to_s.singularize.camelize.to_s
6
6
  klass_name = "#{namespace}::#{klass_name}" if namespace.present?
7
7
 
8
- self.send(:define_method, nested_resource_type) do
8
+ send(:define_method, nested_resource_type) do
9
9
  klass = begin
10
10
  klass_name.safe_constantize
11
11
  rescue NameError
12
12
  nil
13
13
  end
14
- klass = RestfulResource::OpenObject if (klass.nil? || !(klass < RestfulResource::OpenObject))
14
+ klass = RestfulResource::OpenObject if klass.nil? || !(klass < RestfulResource::OpenObject)
15
15
  nested_resource = @inner_object.send(nested_resource_type)
16
16
  return nil if nested_resource.nil?
17
+
17
18
  nested_resource.map { |obj| klass.new(obj) }
18
19
  end
19
20
  end
20
21
 
21
22
  def has_one(nested_resource_type)
22
- namespace = self.to_s.deconstantize
23
- klass_name = "#{nested_resource_type.to_s.camelize.to_s}"
23
+ namespace = to_s.deconstantize
24
+ klass_name = nested_resource_type.to_s.camelize.to_s
24
25
  klass_name = "#{namespace}::#{klass_name}" if namespace.present?
25
26
 
26
- self.send(:define_method, nested_resource_type) do
27
+ send(:define_method, nested_resource_type) do
27
28
  klass = begin
28
29
  klass_name.safe_constantize
29
30
  rescue NameError
30
31
  nil
31
32
  end
32
- klass = RestfulResource::OpenObject if (klass.nil? || !(klass < RestfulResource::OpenObject))
33
+ klass = RestfulResource::OpenObject if klass.nil? || !(klass < RestfulResource::OpenObject)
33
34
  nested_resource = @inner_object.send(nested_resource_type)
34
35
  return nil if nested_resource.nil?
36
+
35
37
  klass.new(@inner_object.send(nested_resource_type))
36
38
  end
37
39
  end
@@ -3,13 +3,14 @@ module RestfulResource
3
3
  extend RestfulResource::Associations
4
4
 
5
5
  def self.configure(base_url: nil,
6
- username: nil,
7
- password: nil,
8
- auth_token: nil,
9
- logger: nil,
10
- cache_store: nil,
11
- instrumentation: {},
12
- faraday_config: nil)
6
+ username: nil,
7
+ password: nil,
8
+ auth_token: nil,
9
+ logger: nil,
10
+ cache_store: nil,
11
+ instrumentation: {},
12
+ faraday_config: nil,
13
+ faraday_options: nil)
13
14
 
14
15
  @base_url = URI.parse(base_url)
15
16
 
@@ -19,33 +20,35 @@ module RestfulResource
19
20
  logger: logger,
20
21
  cache_store: cache_store,
21
22
  instrumentation: instrumentation,
22
- faraday_config: faraday_config)
23
+ faraday_config: faraday_config,
24
+ faraday_options: faraday_options
25
+ )
23
26
  end
24
27
 
25
28
  def self.resource_path(url)
26
29
  @resource_path = url
27
30
  end
28
31
 
29
- def self.find(id, params={})
32
+ def self.find(id, params = {})
30
33
  params_without_options, options = format_params(params)
31
34
 
32
35
  response = http.get(member_url(id, params_without_options), **options)
33
- self.new(parse_json(response.body))
36
+ new(parse_json(response.body))
34
37
  end
35
38
 
36
- def self.where(params={})
39
+ def self.where(params = {})
37
40
  params_without_options, options = format_params(params)
38
41
 
39
42
  url = collection_url(params_without_options)
40
43
  response = http.get(url, **options)
41
- self.paginate_response(response)
44
+ paginate_response(response)
42
45
  end
43
46
 
44
47
  def self.get(params = {})
45
48
  params_without_options, options = format_params(params)
46
49
 
47
50
  response = http.get(collection_url(params_without_options), **options)
48
- self.new(parse_json(response.body))
51
+ new(parse_json(response.body))
49
52
  end
50
53
 
51
54
  def self.delete(id, **params)
@@ -61,7 +64,7 @@ module RestfulResource
61
64
  url = member_url(id, params_without_options)
62
65
 
63
66
  response = http.put(url, data: data, headers: headers, **options)
64
- self.new(parse_json(response.body))
67
+ new(parse_json(response.body))
65
68
  end
66
69
 
67
70
  def self.post(data: {}, headers: {}, **params)
@@ -72,11 +75,11 @@ module RestfulResource
72
75
 
73
76
  response = http.post(url, data: data, headers: headers, **options)
74
77
 
75
- self.new(parse_json(response.body))
78
+ new(parse_json(response.body))
76
79
  end
77
80
 
78
81
  def self.all(params = {})
79
- self.where(params)
82
+ where(params)
80
83
  end
81
84
 
82
85
  def self.action(action_name)
@@ -89,30 +92,30 @@ module RestfulResource
89
92
  @action_prefix = action_prefix.to_s
90
93
  end
91
94
 
92
- def self.fetch_all!(conditions={})
95
+ def self.fetch_all!(conditions = {})
93
96
  Enumerator.new do |y|
94
97
  next_page = 1
95
98
  begin
96
- resources = self.where(conditions.merge(page: next_page))
99
+ resources = where(conditions.merge(page: next_page))
97
100
  resources.each do |resource|
98
101
  y << resource
99
102
  end
100
103
  next_page = resources.next_page
101
- end while(!next_page.nil?)
104
+ end while !next_page.nil?
102
105
  end
103
106
  end
104
107
 
105
108
  protected
109
+
106
110
  def self.http
107
111
  @http || superclass.http
108
112
  end
109
113
 
110
114
  def self.base_url
111
115
  result = @base_url
112
- if result.nil? && superclass.respond_to?(:base_url)
113
- result = superclass.base_url
114
- end
115
- raise "Base url missing" if result.nil?
116
+ result = superclass.base_url if result.nil? && superclass.respond_to?(:base_url)
117
+ raise 'Base url missing' if result.nil?
118
+
116
119
  result
117
120
  end
118
121
 
@@ -126,7 +129,7 @@ module RestfulResource
126
129
  def self.format_params(params = {})
127
130
  headers = params.delete(:headers) || {}
128
131
 
129
- headers.merge!(cache_control: 'no-cache') if params.delete(:no_cache)
132
+ headers[:cache_control] = 'no-cache' if params.delete(:no_cache)
130
133
  open_timeout = params.delete(:open_timeout)
131
134
  timeout = params.delete(:timeout)
132
135
 
@@ -139,18 +142,20 @@ module RestfulResource
139
142
 
140
143
  def self.member_url(id, params)
141
144
  raise ResourceIdMissingError if id.blank?
145
+
142
146
  url = merge_url_paths(base_url, @resource_path, CGI.escape(id.to_s), @action_prefix)
143
147
  replace_parameters(url, params)
144
148
  end
145
149
 
146
150
  def self.new_collection(json)
147
151
  json.map do |element|
148
- self.new(element)
152
+ new(element)
149
153
  end
150
154
  end
151
155
 
152
156
  def self.parse_json(json)
153
157
  return nil if json.strip.empty?
158
+
154
159
  ActiveSupport::JSON.decode(json)
155
160
  end
156
161
 
@@ -164,15 +169,13 @@ module RestfulResource
164
169
  if value.nil?
165
170
  missing_params << key
166
171
  else
167
- url = url.gsub(':'+key, CGI.escape(value.to_s))
172
+ url = url.gsub(':' + key, CGI.escape(value.to_s))
168
173
  end
169
174
  end
170
175
 
171
- if missing_params.any?
172
- raise ParameterMissingError.new(missing_params)
173
- end
176
+ raise ParameterMissingError, missing_params if missing_params.any?
174
177
 
175
- url = url + "?#{params.to_query}" unless params.empty?
178
+ url += "?#{params.to_query}" unless params.empty?
176
179
  url
177
180
  end
178
181
 
@@ -180,10 +183,10 @@ module RestfulResource
180
183
  links_header = response.headers[:links]
181
184
  links = LinkHeader.parse(links_header)
182
185
 
183
- prev_url = links.find_link(['rel', 'prev']).try(:href)
184
- next_url = links.find_link(['rel', 'next']).try(:href)
186
+ prev_url = links.find_link(%w[rel prev]).try(:href)
187
+ next_url = links.find_link(%w[rel next]).try(:href)
185
188
 
186
- array = parse_json(response.body).map { |attributes| self.new(attributes) }
189
+ array = parse_json(response.body).map { |attributes| new(attributes) }
187
190
  PaginatedArray.new(array, previous_page_url: prev_url, next_page_url: next_url, total_count: response.headers[:x_total_count])
188
191
  end
189
192
  end