easy_compliance 1.0.1 → 1.1.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: 39abb724e84c93d1aeff203630ae258fdde016cb1516e0d9218ce00054f9a94c
4
- data.tar.gz: 00be601f07d2af4c1f4a20eed23601fac9acc646239400f262dab5ce10572fc3
3
+ metadata.gz: a18dc5645db8718da9f22831fcf6f458d74763536dfe8edaccf3f4439ae91b95
4
+ data.tar.gz: 9db9644054a7c647e2e0801bb958b6208943088d9012bf6e3f9be8600da7ef46
5
5
  SHA512:
6
- metadata.gz: 46940c8d37bd3702507e56302ffe109018844206c27be0d50c80ed65b2758f44ca546da9a3de608a62a551999d8c3a6b60b99b4ee999a0779083e3a6d8fbc31f
7
- data.tar.gz: f4eff1516bbfbcfc906d7b306e2d49ed7563d3ca3ceb525966029267a8638f65f90b26707b1fc1224340b2a4f9b06c549bc4efba58acde0a811b3684fd2a32a8
6
+ metadata.gz: 795a143c9b365c3f38d1794fb41f200ce0c6b9f5e5722061d31a6b27b7e9b577fb2bb747e9c8c03f26b21f68cde42ebc94ba4a3151c7c443734701c1c0a56286
7
+ data.tar.gz: c687ec1583a5ba413e09072adb60f206326921ce6ade5bb32a3e361aa7e5ba4fcb24bb96f786a57544b7419923ffb332526ac45dbe02e17555fc0c482fcf3cf0
data/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.0.2] - 2021-11-01
10
+ ### Fixed
11
+ - Fixed leaking `OpenSSL::OpenSSLErrors`, they are now wrapped
12
+
9
13
  ## [1.0.1] - 2021-10-25
10
14
  ### Fixed
11
15
  - Removed `bin/console` and `bin/setup` from gem executables [#1]
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- easy_compliance (1.0.0)
4
+ easy_compliance (1.0.2)
5
5
  excon
6
6
 
7
7
  GEM
@@ -9,7 +9,7 @@ GEM
9
9
  specs:
10
10
  byebug (11.1.3)
11
11
  diff-lcs (1.4.4)
12
- excon (0.79.0)
12
+ excon (0.93.1)
13
13
  rake (13.0.3)
14
14
  rspec (3.10.0)
15
15
  rspec-core (~> 3.10.0)
@@ -27,6 +27,7 @@ GEM
27
27
 
28
28
  PLATFORMS
29
29
  x86_64-darwin-19
30
+ x86_64-darwin-20
30
31
 
31
32
  DEPENDENCIES
32
33
  bundler
@@ -36,4 +37,4 @@ DEPENDENCIES
36
37
  rspec
37
38
 
38
39
  BUNDLED WITH
39
- 2.2.8
40
+ 2.2.25
data/README.md CHANGED
@@ -9,13 +9,20 @@ Ruby toolkit for https://www.easycompliance.de
9
9
  Use `EasyCompliance::Ref` to build refs for the records.
10
10
 
11
11
  ### Keeping data in sync
12
+ When a request fails EasyCompliance will consider the request idempotent and by default retries 3 times with a delay of 5 seconds in between.
13
+ You can adjust this to fit your needs.
12
14
 
13
15
  ```ruby
14
16
  # config/initializers/easy_compliance.rb
17
+ # required
15
18
  EasyCompliance.api_key = 'my_key'
16
19
  EasyCompliance.api_url = 'https://example.com'
17
20
  EasyCompliance.app_name = 'my_app'
18
21
 
22
+ # optional
23
+ EasyCompliance.retry_limit = 3 # Max number of retries (this is the default)
24
+ EasyCompliance.retry_interval = 5 # Delay between retries in seconds (this is the default)
25
+
19
26
  # app/models/my_record.rb
20
27
  class MyRecord < ActiveRecord::Base
21
28
  after_save do
@@ -26,8 +33,18 @@ end
26
33
  # app/jobs/compliance_job.rb
27
34
  class ComplianceJob
28
35
  def perform(record, value)
29
- production_env? &&
30
- EasyCompliance::Client.submit(record: record, value: value)
36
+ return unless production_env?
37
+
38
+ check = EasyCompliance::Client.submit(record: record, value: value)
39
+ check.hit? # true/false
40
+
41
+ check.status # http response status e.g. 200
42
+ check.body # http response body
31
43
  end
32
44
  end
33
45
  ```
46
+
47
+ ## License
48
+
49
+ `EasyCompliance` is licensed under the [Apache 2.0 license](LICENSE.txt) and
50
+ Copyright 2021,2022 [betterplace / gut.org gAG](https://gut.org).
@@ -1,4 +1,5 @@
1
1
  require 'excon'
2
+ require 'openssl'
2
3
 
3
4
  module EasyCompliance
4
5
  # client for https://easycompliance.de/schnittstellen/api/
@@ -28,20 +29,37 @@ module EasyCompliance
28
29
  end
29
30
 
30
31
  HEADERS = {
31
- 'Content-Type': 'application/x-www-form-urlencoded',
32
+ 'Content-Type': 'application/x-www-form-urlencoded'
32
33
  }
33
34
 
34
35
  # @return [ EasyCompliance::Result ]
35
36
  def post(**body)
36
- url = EasyCompliance.api_url or raise Error, "must set api_url"
37
- body[:api_key] = EasyCompliance.api_key or raise Error, "must set api_key"
38
-
39
- res = Excon.post(url, body: URI.encode_www_form(body), headers: HEADERS)
37
+ body[:api_key] = EasyCompliance.api_key or raise Error, 'must set api_key'
38
+ res = Excon.post(
39
+ api_url,
40
+ body: URI.encode_www_form(body),
41
+ headers: HEADERS,
42
+ idempotent: true,
43
+ retry_limit: retry_limit,
44
+ retry_interval: retry_interval
45
+ )
40
46
  res.status < 300 or raise Error, "#{res.status}: #{res.body}"
41
47
 
42
48
  EasyCompliance::Result.new(status: res.status, body: res.body)
43
- rescue Excon::Error => e
49
+ rescue Excon::Error, OpenSSL::OpenSSLError => e
44
50
  raise Error, "Network error: #{e.class.name} - #{e.message}"
45
51
  end
52
+
53
+ def retry_limit
54
+ EasyCompliance.retry_limit || 3
55
+ end
56
+
57
+ def retry_interval
58
+ EasyCompliance.retry_interval || 5
59
+ end
60
+
61
+ def api_url
62
+ EasyCompliance.api_url || raise(Error, 'must set api_url')
63
+ end
46
64
  end
47
65
  end
@@ -9,6 +9,7 @@ module EasyCompliance
9
9
  end
10
10
 
11
11
  # For methods 1-3. 204 means no hit.
12
+ # returns true if record was found on a sanctions lists, details in body.
12
13
  def hit?
13
14
  status == 200
14
15
  end
@@ -1,3 +1,3 @@
1
1
  module EasyCompliance
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -4,7 +4,7 @@ module EasyCompliance
4
4
  class Error < StandardError; end
5
5
 
6
6
  class << self
7
- attr_accessor :api_key, :api_url, :app_name
7
+ attr_accessor :api_key, :api_url, :app_name, :retry_limit, :retry_interval
8
8
  end
9
9
  end
10
10
 
@@ -5,12 +5,21 @@ describe EasyCompliance::Client do
5
5
  before do
6
6
  EasyCompliance.api_key = 'key'
7
7
  EasyCompliance.api_url = 'url'
8
+ EasyCompliance.retry_limit = nil
9
+ EasyCompliance.retry_interval = nil
8
10
  end
9
11
 
10
12
  describe '#post' do
11
13
  it 'posts to the API URL and returns an EasyCompliance::Result' do
12
14
  expect(Excon).to receive(:post)
13
- .with('url', body: 'method=2&api_key=key', headers: anything)
15
+ .with(
16
+ 'url',
17
+ body: 'method=2&api_key=key',
18
+ headers: anything,
19
+ idempotent: true,
20
+ retry_limit: 3,
21
+ retry_interval: 5
22
+ )
14
23
  .and_return(double(body: '{}', status: 200))
15
24
  result = client.post(method: 2)
16
25
  expect(result).to be_an EasyCompliance::Result
@@ -19,18 +28,46 @@ describe EasyCompliance::Client do
19
28
 
20
29
  it 'raises if the API returned a bad status code' do
21
30
  expect(Excon).to receive(:post)
22
- .with('url', body: 'method=2&api_key=key', headers: anything)
31
+ .with(
32
+ 'url',
33
+ body: 'method=2&api_key=key',
34
+ headers: anything,
35
+ idempotent: true,
36
+ retry_limit: 3,
37
+ retry_interval: 5
38
+ )
23
39
  .and_return(double(body: '{}', status: 500))
24
40
  expect { client.post(method: 2) }.to raise_error(client::Error, /500/)
25
41
  end
26
42
 
27
43
  it 'raises if the connection failed' do
28
44
  expect(Excon).to receive(:post)
29
- .with('url', body: 'method=2&api_key=key', headers: anything)
45
+ .with(
46
+ 'url',
47
+ body: 'method=2&api_key=key',
48
+ headers: anything,
49
+ idempotent: true,
50
+ retry_limit: 3,
51
+ retry_interval: 5
52
+ )
30
53
  .and_raise(Excon::Errors::SocketError.new)
31
54
  expect { client.post(method: 2) }.to raise_error(client::Error, /Socket/)
32
55
  end
33
56
 
57
+ it 'raises if there is any OpenSSL::OpenSSLError' do
58
+ expect(Excon).to receive(:post)
59
+ .with(
60
+ 'url',
61
+ body: 'method=2&api_key=key',
62
+ headers: anything,
63
+ idempotent: true,
64
+ retry_limit: 3,
65
+ retry_interval: 5
66
+ )
67
+ .and_raise(OpenSSL::SSL::SSLErrorWaitReadable.new)
68
+ expect { client.post(method: 2) }.to raise_error(client::Error, /SSLError/)
69
+ end
70
+
34
71
  it 'raises if api_key is not set' do
35
72
  EasyCompliance.api_key = nil
36
73
  expect { client.post(method: 2) }.to raise_error(client::Error, /api_key/)
@@ -40,5 +77,52 @@ describe EasyCompliance::Client do
40
77
  EasyCompliance.api_url = nil
41
78
  expect { client.post(method: 2) }.to raise_error(client::Error, /api_url/)
42
79
  end
80
+
81
+ it 'uses a default value of 3 for retry_limit unless it is set' do
82
+ expect(Excon).to receive(:post).with(
83
+ 'url',
84
+ body: 'method=2&api_key=key',
85
+ headers: anything,
86
+ idempotent: true,
87
+ retry_limit: 3,
88
+ retry_interval: 5
89
+ ).and_return(double(body: '{}', status: 200))
90
+ client.post(method: 2)
91
+
92
+ EasyCompliance.retry_limit = 0
93
+ expect(Excon).to receive(:post).with(
94
+ 'url',
95
+ body: 'method=2&api_key=key',
96
+ headers: anything,
97
+ idempotent: true,
98
+ retry_limit: 0,
99
+ retry_interval: 5
100
+ ).and_return(double(body: '{}', status: 200))
101
+ client.post(method: 2)
102
+ end
103
+
104
+ it 'uses a default value of 5 for retry_interval unless it is set' do
105
+ EasyCompliance.retry_interval = nil
106
+ expect(Excon).to receive(:post).with(
107
+ 'url',
108
+ body: 'method=2&api_key=key',
109
+ headers: anything,
110
+ idempotent: true,
111
+ retry_limit: 3,
112
+ retry_interval: 5
113
+ ).and_return(double(body: '{}', status: 200))
114
+ client.post(method: 2)
115
+
116
+ EasyCompliance.retry_interval = 0
117
+ expect(Excon).to receive(:post).with(
118
+ 'url',
119
+ body: 'method=2&api_key=key',
120
+ headers: anything,
121
+ idempotent: true,
122
+ retry_limit: 3,
123
+ retry_interval: 0
124
+ ).and_return(double(body: '{}', status: 200))
125
+ client.post(method: 2)
126
+ end
43
127
  end
44
128
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_compliance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - betterplace development team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-25 00:00:00.000000000 Z
11
+ date: 2022-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  requirements: []
130
- rubygems_version: 3.2.3
130
+ rubygems_version: 3.2.25
131
131
  signing_key:
132
132
  specification_version: 4
133
133
  summary: Ruby toolkit for https://www.easycompliance.de