ac 0.2.2 → 1.0.2

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: 93ef1a831829470267227d302c604be300a45566557fdeca5dfc90666fe66b37
4
+ data.tar.gz: 90e08375261aaf5a34067944c38a553d45778afafbaf2528ff4507f05f792dcf
5
5
  SHA512:
6
- metadata.gz: bda3634f53042d6d31d4cae8191b0f31f87fbd00553cb67b60e0fd806e02487b8ff26ff85d5860050c0af66b6738d55864acfa1dd0c94881eb56b2fc8f106255
7
- data.tar.gz: 956b86c314638bc2d577716622c25c1dbebc8741603c6e3c029e21d989f93a0439ae68cba1d307997a46f89337276f9f691254d84d2dfd8c54e96b2aac1f9253
6
+ metadata.gz: 533a28626dc522e2202767c59ab9a3d9ab605f8b8fb9c7598f1f0719780f91761639acb9f644cc4d8814a4117424cc4dce5269e371924875f4d8481971c2ec97
7
+ data.tar.gz: 012ff28a3e8d92e680106d93acdeabf5b04d167163999b55e251fa64a044ebf876700b1ab43be384b4b60ebfeada194f180a7d3ca168e6ab0c4c61cd00dedeef
@@ -0,0 +1,71 @@
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
+ ac_object = new(parsed_json)
8
+ ac_object.instance_variable_set("@response", response)
9
+ ac_object
10
+ end
11
+
12
+ def self.new value
13
+ case value
14
+ when Hash
15
+ super(value)
16
+ when Array
17
+ value.map { new(_1) }
18
+ else
19
+ value
20
+ end
21
+ end
22
+
23
+ def initialize(parsed_json)
24
+ @values = parsed_json.transform_keys(&:to_s)
25
+ @values.keys.each do |key|
26
+ define_singleton_method(key) { self.[](key) } unless respond_to? key
27
+ end
28
+ end
29
+
30
+ def [](key)
31
+ wrap(@values[key.to_s])
32
+ end
33
+
34
+ def to_s(*_args)
35
+ JSON.pretty_generate(@values)
36
+ end
37
+
38
+ def inspect
39
+ id_string = respond_to?(:id) && !id.nil? ? " id=#{id}" : ''
40
+ "#<#{self.class}:0x#{object_id.to_s(16)}#{id_string}> JSON: " +
41
+ JSON.pretty_generate(@values)
42
+ end
43
+
44
+ def ==(other)
45
+ other.is_a? AcObject
46
+ @values == other.instance_variable_get('@values')
47
+ end
48
+
49
+ def eql?(other)
50
+ self == other
51
+ end
52
+
53
+ def keys
54
+ @values.keys
55
+ end
56
+
57
+ def values
58
+ @values.values
59
+ end
60
+
61
+ def json
62
+ @values
63
+ end
64
+
65
+ private
66
+
67
+ def wrap(value)
68
+ AcObject.new value
69
+ end
70
+ end
71
+ end
data/lib/ac/base.rb CHANGED
@@ -3,11 +3,21 @@ 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 should_refresh?
13
+ @access_token
14
+ end
15
+
16
+ def should_refresh?
17
+ return false unless respond_to?(:refresh_token)
18
+ @access_token.blank? || @token_expires_at&.past?
19
+ end
20
+
11
21
  def url path
12
22
  if path.start_with?("http://") || path.start_with?("https://")
13
23
  path
@@ -32,26 +42,43 @@ module Ac
32
42
 
33
43
  define_method http_verb do |path, options = {}, &block|
34
44
  retries_count ||= 0
35
- raise "Too many retries" if retries_count > self.class::MAX_RETRIES
36
- # puts "Requesting #{path}, retry number #{retries_count}"
45
+
37
46
  response = send(:"#{http_verb}_request", path, options).run
47
+ Database.save_request response, class_name: self.class.name if self.class::SAVE_RESPONSES
38
48
 
39
49
  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
50
+ unless run_block_validation(AcObject.from_response(response), block)
51
+ if retries_count < self.class::MAX_RETRIES
52
+ sleep(2**retries_count)
53
+ retries_count += 1
54
+ redo
55
+ else
56
+ raise BlockValidationError.new(AcObject.from_response(response))
57
+ end
58
+ end
59
+ else
60
+ unless response.success?
61
+ if can_retry?(response) && retries_count < self.class::MAX_RETRIES
62
+ sleep(2**retries_count)
63
+ retries_count += 1
64
+ redo
65
+ else
66
+ raise AcError.from_response(AcObject.from_response(response))
67
+ end
48
68
  end
49
- elsif self.class::SAVE_RESPONSES
50
- Database.save_request response, class_name: self.class.name
51
69
  end
52
-
53
- response
70
+ return AcObject.from_response(response)
54
71
  end
55
72
  end
73
+
74
+ def run_block_validation response, block
75
+ block.call response
76
+ rescue StandardError => e
77
+ false
78
+ end
79
+
80
+ def can_retry? response
81
+ response.timed_out? || response.code == 0 || response.code == 429 || response.code >= 500
82
+ end
56
83
  end
57
84
  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.2"
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.2
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-13 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: []