ac 0.2.2 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 643c497232d37751e8f24f1e429e4da6de134fe5fb8c9ee7a553a72e96afc511
4
- data.tar.gz: 887dab256a947fb6ec90be7e63814832d4b868f6873ff13d64944969391d4d51
3
+ metadata.gz: d91a0bc77820fc802d1e7d4228c334f76dafd306b8d827acb0efb31d5fb22c56
4
+ data.tar.gz: 3ffde7cc5ca9c2fb1041a95c0e3d4a4b7aae953d23713bb446a2e2b3ddabcbe4
5
5
  SHA512:
6
- metadata.gz: bda3634f53042d6d31d4cae8191b0f31f87fbd00553cb67b60e0fd806e02487b8ff26ff85d5860050c0af66b6738d55864acfa1dd0c94881eb56b2fc8f106255
7
- data.tar.gz: 956b86c314638bc2d577716622c25c1dbebc8741603c6e3c029e21d989f93a0439ae68cba1d307997a46f89337276f9f691254d84d2dfd8c54e96b2aac1f9253
6
+ metadata.gz: fe75a02d340f7c3e785eebf6fc4a190910b9fb36b8ebf5a90e4d13fbbde36f33e383b49b9d63d6ea6cd7078d1965fe268aab609b6512cda5c731e67a27332a28
7
+ data.tar.gz: b5472513e94d0b463ada98ba4639471baf125e9a34dd234eb7bf045738b5367b5f83ddb7656531d338b097ea557974a5dee0cecbc70af6d19a9f0a26ecfd64ee
@@ -0,0 +1,66 @@
1
+ module Ac
2
+ class AcObject
3
+ attr_reader :response
4
+
5
+ def self.from_response(response)
6
+ parsed_json = JSON.parse(response.body) rescue {}
7
+ new(parsed_json, response: response)
8
+ end
9
+
10
+ def initialize(parsed_json, response: nil)
11
+ @response = response
12
+ @values = parsed_json.transform_keys(&:to_s)
13
+ @values.keys.each do |key|
14
+ define_singleton_method(key) { self.[](key) } unless respond_to? key
15
+ end
16
+ end
17
+
18
+ def [](key)
19
+ wrap(@values[key.to_s])
20
+ end
21
+
22
+ def to_s(*_args)
23
+ JSON.pretty_generate(@values)
24
+ end
25
+
26
+ def inspect
27
+ id_string = respond_to?(:id) && !id.nil? ? " id=#{id}" : ''
28
+ "#<#{self.class}:0x#{object_id.to_s(16)}#{id_string}> JSON: " +
29
+ JSON.pretty_generate(@values)
30
+ end
31
+
32
+ def ==(other)
33
+ other.is_a? AcObject
34
+ @values == other.instance_variable_get('@values')
35
+ end
36
+
37
+ def eql?(other)
38
+ self == other
39
+ end
40
+
41
+ def keys
42
+ @values.keys
43
+ end
44
+
45
+ def values
46
+ @values.values
47
+ end
48
+
49
+ def json
50
+ @values
51
+ end
52
+
53
+ private
54
+
55
+ def wrap(value)
56
+ case value
57
+ when Hash
58
+ AcObject.new(value)
59
+ when Array
60
+ value.map { wrap(_1) }
61
+ else
62
+ value
63
+ end
64
+ end
65
+ end
66
+ end
data/lib/ac/base.rb CHANGED
@@ -3,11 +3,16 @@ module Ac
3
3
  MAX_RETRIES = 3
4
4
  SAVE_RESPONSES = false
5
5
 
6
- attr_reader :access_token
6
+ attr_reader :token_expires_at
7
7
  def initialize access_token = nil
8
8
  @access_token = access_token
9
9
  end
10
10
 
11
+ def access_token
12
+ refresh_token if respond_to?(:refresh_token) && (@access_token.blank? || @token_expires_at&.past?)
13
+ @access_token
14
+ end
15
+
11
16
  def url path
12
17
  if path.start_with?("http://") || path.start_with?("https://")
13
18
  path
@@ -32,26 +37,43 @@ module Ac
32
37
 
33
38
  define_method http_verb do |path, options = {}, &block|
34
39
  retries_count ||= 0
35
- raise "Too many retries" if retries_count > self.class::MAX_RETRIES
36
- # puts "Requesting #{path}, retry number #{retries_count}"
40
+
37
41
  response = send(:"#{http_verb}_request", path, options).run
42
+ Database.save_request response, class_name: self.class.name if self.class::SAVE_RESPONSES
38
43
 
39
44
  if block
40
- begin
41
- raise unless block.call(response)
42
- Database.save_request response, class_name: self.class.name if self.class::SAVE_RESPONSES
43
- rescue
44
- Database.save_request(response, class_name: self.class.name + "_errors") if self.class::SAVE_RESPONSES
45
- retries_count += 1 # standard:disable Lint/UselessAssignment
46
- sleep(2**retries_count) # Exponential backoff
47
- redo
45
+ unless run_block_validation(AcObject.from_response(response), block)
46
+ if retries_count < self.class::MAX_RETRIES
47
+ sleep(2**retries_count)
48
+ retries_count += 1
49
+ redo
50
+ else
51
+ raise BlockValidationError.new(AcObject.from_response(response))
52
+ end
53
+ end
54
+ else
55
+ unless response.success?
56
+ if can_retry?(response) && retries_count < self.class::MAX_RETRIES
57
+ sleep(2**retries_count)
58
+ retries_count += 1
59
+ redo
60
+ else
61
+ raise AcError.from_response(AcObject.from_response(response))
62
+ end
48
63
  end
49
- elsif self.class::SAVE_RESPONSES
50
- Database.save_request response, class_name: self.class.name
51
64
  end
52
-
53
- response
65
+ return AcObject.from_response(response)
54
66
  end
55
67
  end
68
+
69
+ def run_block_validation response, block
70
+ block.call response
71
+ rescue StandardError => e
72
+ false
73
+ end
74
+
75
+ def can_retry? response
76
+ response.timed_out? || response.code == 0 || response.code == 429 || response.code >= 500
77
+ end
56
78
  end
57
79
  end
data/lib/ac/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ac
4
- VERSION = "0.2.2"
4
+ VERSION = "1.0.0"
5
5
  end
data/lib/ac.rb CHANGED
@@ -2,11 +2,60 @@
2
2
 
3
3
  require "typhoeus"
4
4
  require "json"
5
+ require "active_support/all"
5
6
  require_relative "ac/version"
7
+ require_relative "ac/ac_object"
6
8
  require_relative "ac/base"
7
9
  require_relative "ac/json_patch"
8
10
  require_relative "ac/database"
9
11
 
10
12
  module Ac
11
13
  Typhoeus::Response.prepend JsonPatch
14
+
15
+ class AcError < StandardError
16
+
17
+ def self.from_response response
18
+ case response.response.code
19
+ when 401
20
+ UnauthorizedError.new(response)
21
+ when 404
22
+ NotFoundError.new(response)
23
+ when 422
24
+ UnprocessableEntityError.new(response)
25
+ when 429
26
+ TooManyRequestsError.new(response)
27
+ when 500..599
28
+ ServerError.new(response)
29
+ else
30
+ AcError.new(response)
31
+ end
32
+ end
33
+
34
+ attr_reader :response
35
+ def initialize response
36
+ @response = response
37
+ end
38
+
39
+ def to_s
40
+ "#{self.class}: #{response.response.code} - #{response.values.present? ? response.inspect : response.response.body}"
41
+ end
42
+ end
43
+
44
+ class BlockValidationError < AcError
45
+ end
46
+
47
+ class NotFoundError < AcError
48
+ end
49
+
50
+ class UnauthorizedError < AcError
51
+ end
52
+
53
+ class UnprocessableEntityError < AcError
54
+ end
55
+
56
+ class TooManyRequestsError < AcError
57
+ end
58
+
59
+ class ServerError < AcError
60
+ end
12
61
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - felipedmesquita
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-06 00:00:00.000000000 Z
10
+ date: 2025-03-11 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: typhoeus
@@ -23,6 +23,20 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
26
40
  email:
27
41
  - 16197684+felipedmesquita@users.noreply.github.com
28
42
  executables: []
@@ -34,6 +48,7 @@ files:
34
48
  - README.md
35
49
  - Rakefile
36
50
  - lib/ac.rb
51
+ - lib/ac/ac_object.rb
37
52
  - lib/ac/base.rb
38
53
  - lib/ac/database.rb
39
54
  - lib/ac/json_patch.rb
@@ -58,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
73
  - !ruby/object:Gem::Version
59
74
  version: '0'
60
75
  requirements: []
61
- rubygems_version: 3.6.2
76
+ rubygems_version: 3.6.5
62
77
  specification_version: 4
63
78
  summary: Api Client for Typhoeus
64
79
  test_files: []