ac 0.2.1 → 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: 170cf1e02401172b4227c6962753133678a1abe747e4a1dea5e2bd7ab0ba9a68
4
- data.tar.gz: f87fabaf5c3a60282271f448fd206e62aeb1f5b2a34d7dcbe0fbceacf61f0e5e
3
+ metadata.gz: d91a0bc77820fc802d1e7d4228c334f76dafd306b8d827acb0efb31d5fb22c56
4
+ data.tar.gz: 3ffde7cc5ca9c2fb1041a95c0e3d4a4b7aae953d23713bb446a2e2b3ddabcbe4
5
5
  SHA512:
6
- metadata.gz: 7bedbce4e164703ad7f5fd73c285858d8f9da4f2ce08963cd694ef224fb6b3ea4fdb4ec88b9fc18e1ffb5675a80adc6cbfa10776e3cf4010dbbc0b7ce0dd69fe
7
- data.tar.gz: 52368ebfdf4291c7d07abac7fe04eae2d15fff5a4789c3cb585c0fa50ac36b33aa9bfe844bfac72f4809d626944045b5f5bedb1bce903707a9ef3ac2d1c3dabd
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,47 +3,77 @@ 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
- File.join(self.class::BASE_URL, path)
17
+ if path.start_with?("http://") || path.start_with?("https://")
18
+ path
19
+ else
20
+ File.join(self.class::BASE_URL, path)
21
+ end
13
22
  end
14
23
 
24
+ def authenticate! options
25
+ if access_token
26
+ options[:headers] ||= {}
27
+ options[:headers]["Authorization"] = "Bearer #{access_token}"
28
+ end
29
+ end
30
+
15
31
  %i[get post put patch delete].each do |http_verb|
16
32
  define_method :"#{http_verb}_request" do |path, options = {}|
17
33
  options[:method] = http_verb
18
- if access_token
19
- options[:headers] ||= {}
20
- options[:headers]["Authorization"] = "Bearer #{access_token}"
21
- end
34
+ authenticate!(options) unless options.delete(:skip_authentication)
22
35
  Typhoeus::Request.new url(path), options
23
36
  end
24
37
 
25
38
  define_method http_verb do |path, options = {}, &block|
26
39
  retries_count ||= 0
27
- raise "Too many retries" if retries_count > self.class::MAX_RETRIES
28
- # puts "Requesting #{path}, retry number #{retries_count}"
40
+
29
41
  response = send(:"#{http_verb}_request", path, options).run
42
+ Database.save_request response, class_name: self.class.name if self.class::SAVE_RESPONSES
30
43
 
31
44
  if block
32
- begin
33
- raise unless block.call(response)
34
- Database.save_request response, class_name: self.class.name if self.class::SAVE_RESPONSES
35
- rescue
36
- Database.save_request(response, class_name: self.class.name + "_errors") if self.class::SAVE_RESPONSES
37
- retries_count += 1 # standard:disable Lint/UselessAssignment
38
- sleep(2**retries_count) # Exponential backoff
39
- 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
40
63
  end
41
- elsif self.class::SAVE_RESPONSES
42
- Database.save_request response, class_name: self.class.name
43
64
  end
44
-
45
- response
65
+ return AcObject.from_response(response)
46
66
  end
47
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
48
78
  end
49
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.1"
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,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - felipedmesquita
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-12-13 00:00:00.000000000 Z
10
+ date: 2025-03-11 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: typhoeus
@@ -24,7 +23,20 @@ dependencies:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
25
  version: '0'
27
- description:
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'
28
40
  email:
29
41
  - 16197684+felipedmesquita@users.noreply.github.com
30
42
  executables: []
@@ -36,6 +48,7 @@ files:
36
48
  - README.md
37
49
  - Rakefile
38
50
  - lib/ac.rb
51
+ - lib/ac/ac_object.rb
39
52
  - lib/ac/base.rb
40
53
  - lib/ac/database.rb
41
54
  - lib/ac/json_patch.rb
@@ -46,7 +59,6 @@ licenses:
46
59
  metadata:
47
60
  homepage_uri: https://github.com/felipedmesquita/ac
48
61
  source_code_uri: https://github.com/felipedmesquita/ac
49
- post_install_message:
50
62
  rdoc_options: []
51
63
  require_paths:
52
64
  - lib
@@ -61,8 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
73
  - !ruby/object:Gem::Version
62
74
  version: '0'
63
75
  requirements: []
64
- rubygems_version: 3.4.10
65
- signing_key:
76
+ rubygems_version: 3.6.5
66
77
  specification_version: 4
67
78
  summary: Api Client for Typhoeus
68
79
  test_files: []