ecoportal-api 0.9.7 → 0.9.8

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
  SHA256:
3
- metadata.gz: 5696bb0c226299139a1c081ec5de3c041fdd252d76ca56ff45479c78e53c84c5
4
- data.tar.gz: 987ec0d24a1ee340b2b9cb8b68dd575eb1a5f0110d4a18c653d61c9145d320b9
3
+ metadata.gz: d89b2ca34f7a85f9cbeaf61331b155fb83b4f80ee8ff9d57133837d4f87bf03f
4
+ data.tar.gz: 93e71b77a46c283f01708f94099580774cf5d72b49df2041e15688f9622dfe08
5
5
  SHA512:
6
- metadata.gz: 85151476e47a2bfd61e0396e31d48dea0fb36053506c29dac394012d81986cd800476c06891eff5512166b26ca6a98513679a84d77227813807c65d80ab4ad2f
7
- data.tar.gz: d36fb967335bed2db35afec997bc842cd6b660e251e0a9fa34f7b35adb4649a2410c2d1a73572c32c388878baa84c62d3ada9237702e9ffab70cd7719cd964b6
6
+ metadata.gz: c2f5a46fb757bebae8ac0727ce9ea89d801e5fb3b91aac3146b2117c43f852682ed7bbd3ca7020b43ddde5b1ccdd4c4297bf52afa0fa5a859def1701844caedc
7
+ data.tar.gz: 4b1fc568bae19759bac6d62badf06a9a949988b7667e87e8b2ec0ab90b5604d67e33ea695117d43bfa329d1706c81bf8fa7244323264052205b49b01bd38c233
data/.rubocop.yml CHANGED
@@ -1,39 +1,71 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.5.1
2
+ TargetRubyVersion: 2.7.8
3
3
  Exclude:
4
4
  - 'config/routes.rb'
5
+ NewCops: enable
5
6
 
6
- Metrics/LineLength:
7
- Enabled: false
8
- Metrics/BlockLength:
9
- ExcludedMethods: [context, describe]
10
- Max: 50
7
+ Metrics/ClassLength:
8
+ Max: 500
9
+ Metrics/ModuleLength:
10
+ Max: 300
11
11
  Metrics/MethodLength:
12
12
  Max: 50
13
- Metrics/ClassLength:
14
- Max: 200
15
13
  Metrics/AbcSize:
16
14
  Max: 30
17
-
18
- ParameterLists:
15
+ Metrics/ParameterLists:
19
16
  Max: 5
20
17
  CountKeywordArgs: false
18
+ Metrics/BlockLength:
19
+ CountAsOne: ['array', 'heredoc', 'method_call']
20
+ Max: 50
21
+ Metrics/CyclomaticComplexity:
22
+ Max: 30
23
+ Metrics/PerceivedComplexity:
24
+ Max: 30
21
25
 
22
- Style/StringLiterals:
26
+ Style/AccessorGrouping:
27
+ Enabled: false
28
+ Style/ConditionalAssignment:
29
+ Enabled: false
30
+ Style/BlockDelimiters:
31
+ BracesRequiredMethods: ['log']
32
+ AllowedPatterns: ['proc', 'new']
33
+ Style/ClassAndModuleChildren:
23
34
  Enabled: false
24
35
  Style/FrozenStringLiteralComment:
25
36
  Enabled: false
26
- Style/CommentedKeyword:
37
+ Style/StringLiterals:
27
38
  Enabled: false
28
- Style/MultilineBlockChain:
39
+ Style/StringLiteralsInInterpolation:
29
40
  Enabled: false
30
41
  Style/Documentation:
31
42
  Enabled: false
32
- Style/StringLiteralsInInterpolation:
43
+ Style/CommentedKeyword:
44
+ Enabled: false
45
+ Style/MultilineBlockChain:
33
46
  Enabled: false
34
47
  Style/AndOr:
35
48
  Enabled: false
49
+ Style/Alias:
50
+ EnforcedStyle: prefer_alias_method
51
+ Style/FetchEnvVar:
52
+ Enabled: false
53
+ Style/RegexpLiteral:
54
+ EnforcedStyle: mixed
55
+ AllowInnerSlashes: true
36
56
 
57
+ Layout/HashAlignment:
58
+ EnforcedColonStyle: table
59
+ EnforcedHashRocketStyle: table
60
+ Layout/LeadingCommentSpace:
61
+ Enabled: false
62
+ AllowGemfileRubyComment: true
63
+ Layout/ParameterAlignment:
64
+ Enabled: false
65
+ Layout/MultilineMethodDefinitionBraceLayout:
66
+ EnforcedStyle: symmetrical
67
+ Layout/LineLength:
68
+ Enabled: true
37
69
  Layout/SpaceInsideHashLiteralBraces:
38
70
  Enabled: false
39
71
  Layout/SpaceInsideBlockBraces:
@@ -42,14 +74,22 @@ Layout/SpaceAroundOperators:
42
74
  Enabled: false
43
75
  Layout/ExtraSpacing:
44
76
  AllowForAlignment: true
77
+ AllowBeforeTrailingComments: true
45
78
  Layout/AccessModifierIndentation:
46
79
  EnforcedStyle: indent
47
80
  Layout/DotPosition:
48
81
  EnforcedStyle: trailing
49
82
  Layout/MultilineMethodCallIndentation:
50
83
  EnforcedStyle: indented
51
- Layout/IndentHash:
84
+ Layout/FirstHashElementIndentation:
85
+ Enabled: false
86
+ Layout/EmptyLineAfterGuardClause:
52
87
  Enabled: false
53
88
 
54
89
  Naming/VariableNumber:
55
90
  EnforcedStyle: snake_case
91
+ CheckSymbols: false
92
+ Naming/MethodParameterName:
93
+ AllowedNames: ['x', 'y', 'i', 'j', 'id', 'io', 'to']
94
+ Naming/RescuedExceptionsVariableName:
95
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [0.9.8] - 2024-05-15
5
+
6
+ ### Added
7
+ - `rubocop`
8
+
9
+ ### Changed
10
+ - `Ecoportal::API::Common::Client#with_retry`
11
+ - Make resilient (**re-try**) to recent silent server errors where the body doesn't parse as JSON.
12
+
13
+ ### Fixed
14
+
4
15
  ## [0.9.7] - 2024-02-03
5
16
 
6
17
  ### Added
@@ -8,8 +19,6 @@ All notable changes to this project will be documented in this file.
8
19
  - `Ecoportal::API::V1::Person`
9
20
  - **removed** property `subordinates`
10
21
 
11
- ### Fixed
12
-
13
22
  ## [0.9.6] - 2024-02-03
14
23
 
15
24
  ### Changed
data/Rakefile CHANGED
@@ -1,7 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
- require "yard"
4
- require "redcarpet"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+ require 'yard'
5
+ require 'redcarpet'
5
6
 
6
7
  desc "run the specs"
7
8
  RSpec::Core::RakeTask.new(:spec)
@@ -10,11 +11,18 @@ desc "run rspec showing backtrace"
10
11
  RSpec::Core::RakeTask.new(:spec_trace) do |task|
11
12
  task.rspec_opts = ['--backtrace']
12
13
  end
14
+ task(rspec_trace: :spec_trace)
13
15
 
14
16
  desc "run rspec stopping on first fail, and show backtrace"
15
17
  RSpec::Core::RakeTask.new(:spec_fast) do |task|
16
18
  task.rspec_opts = ['--fail-fast', '--backtrace']
17
19
  end
20
+ task(rspec_fast: :spec_fast)
21
+
22
+ desc "run rubocop diaplying cop names"
23
+ RuboCop::RakeTask.new(:rubocop) do |t|
24
+ t.options = ['--display-cop-names']
25
+ end
18
26
 
19
27
  # default task name is yard
20
28
  desc "Yard: generate all the documentation"
@@ -22,6 +30,9 @@ YARD::Rake::YardocTask.new(:doc) do |t|
22
30
  #t.files = ['lib/**/*.rb']
23
31
  end
24
32
 
25
- task :default => [:spec]
26
- task :rspec_trace => :spec_trace
27
- task :rspec_fast => :spec_fast
33
+ desc "default task: runs rubocop and rspec"
34
+ task :default do
35
+ Rake::Task[:rubocop].invoke
36
+ ensure
37
+ Rake::Task[:spec].invoke
38
+ end
@@ -13,6 +13,7 @@ module Ecoportal
13
13
  class Client
14
14
  include Common::ElasticApmIntegration
15
15
  DELAY_REQUEST_RETRY = 5
16
+ RETRY_ATTEMPTS = 5
16
17
 
17
18
  attr_accessor :logger
18
19
  attr_reader :host
@@ -167,22 +168,27 @@ module Ecoportal
167
168
  end
168
169
 
169
170
  # Helper to ensure unexpected server errors do not bring client scripts immediately down
170
- def with_retry(attempts = 3, delay = DELAY_REQUEST_RETRY, error_safe: true, &block)
171
+ def with_retry(attempts = RETRY_ATTEMPTS, delay = DELAY_REQUEST_RETRY, error_safe: true, &block)
171
172
  response = nil
172
173
  attempts.times do |i|
173
174
  remaining = attempts - i - 1
175
+
174
176
  begin
175
177
  response = block.call
176
178
  rescue HTTP::ConnectionError => e
177
- raise unless error_safe && remaining > 0
179
+ raise unless error_safe && remaining.positive?
178
180
  log(:error) { "Got connection error: #{e.message}" }
179
181
  response = with_retry(remaining, error_safe: error_safe, &block)
180
182
  rescue IOError => e
181
- raise unless error_safe && remaining > 0
183
+ raise unless error_safe && remaining.positive?
182
184
  log(:error) { "Got IO error: #{e.message}" }
183
185
  response = with_retry(remaining, error_safe: error_safe, &block)
184
186
  end
185
- return response unless unexpected_server_error?(response.status)
187
+
188
+ return response unless some_unexpected_error?(response)
189
+
190
+ puts "re-attempting (remaining: #{remaining} attempts out of #{attempts})"
191
+
186
192
  log_unexpected_server_error(response)
187
193
  msg = "Got server error (#{response.status}): #{response.body}\n"
188
194
  msg += "Going to retry (#{i} out of #{attempts})"
@@ -192,6 +198,22 @@ module Ecoportal
192
198
  response
193
199
  end
194
200
 
201
+ # Sometimes response body is wrong but status code
202
+ # doesn't reflect. Let it retry
203
+ def some_unexpected_error?(response)
204
+ unexpected_server_error?(response.status) ||
205
+ unexpected_body?(response)
206
+ end
207
+
208
+ def unexpected_body?(response)
209
+ response.body.nil?.tap do |wrong|
210
+ next unless wrong
211
+
212
+ msg = "Received non json body in response "
213
+ msg << "(#{response.src_body.class}):\n #{response.src_body}"
214
+ puts
215
+ end
216
+ end
195
217
  end
196
218
  end
197
219
  end
@@ -2,18 +2,18 @@ module Ecoportal
2
2
  module API
3
3
  module Common
4
4
  class Response
5
-
6
5
  attr_reader :status, :body
6
+ attr_reader :src_body
7
7
 
8
8
  def initialize(response)
9
- @status = response.status
10
- @body = [].tap do |body_data|
9
+ @status = response.status
10
+ @src_body = [].tap do |body_data|
11
11
  response.body.each do |chunk|
12
12
  body_data << chunk
13
13
  end
14
- end.join("")
15
- @body = JSON.parse(@body.to_s) rescue nil
16
- response
14
+ end.join.to_s
15
+
16
+ @body = JSON.parse(@src_body) rescue nil
17
17
  end
18
18
 
19
19
  def success?
@@ -1,5 +1,5 @@
1
1
  module Ecoportal
2
2
  module API
3
- VERSION = "0.9.7"
3
+ VERSION = "0.9.8".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecoportal-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 0.9.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tapio Saarinen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-06 00:00:00.000000000 Z
11
+ date: 2024-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler