gemfather-stable 2.2.5 → 2.4.1

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: 0b083e80e457b2993012a45df31d48e659a899ed56699919d47b3460a0c13212
4
- data.tar.gz: e0fa6ba27a533da3a5ecbb2bb0ea5c885ba1c09d36e5cba2d023bec6f76ed902
3
+ metadata.gz: d18a71b66ba4a336f532fa372a6a5b529827de01dd121a2cfa6a96e4b1aab044
4
+ data.tar.gz: a44cdc356a8dcc8fcbe5a45ad66c3ad048a2c0c7e1955b2b34e09dad3afea930
5
5
  SHA512:
6
- metadata.gz: d23c99be0d5c7d758be93ef4e9cf340ff12f325106ef3577d8e90aa326dceee0251f5742571c88312ca87ee19049eee59763244b12ee4310ae0904a07840292d
7
- data.tar.gz: e03bf0e8b32a16d25414443e3f529aff7e62dd31b9c176ee942d566caf24978aa48bbb912e2563e2d1f02c72aefbae59acf8e641c60a9c8613395b4c6a8f9cce
6
+ metadata.gz: 680945767d4b70caa22f18c68295407ff70d54893eea0ac3ad8f92dd3bf98be8f3bfe12821e5f06504c9dfc3d3dc05c03c28c1f6035e687dfaf8a52992e509d7
7
+ data.tar.gz: e42cae60fe2c2f5952d9ceaa89fb75f8d06327a1baa686a6305623185503ef3c1d955e8e46efc588af21df48391be89c031f5185b7d9b3f6702008fe0ed6d998
data/README.md CHANGED
@@ -143,3 +143,7 @@ client.find_offers(company_id: 1).page(2).total
143
143
  # Получение общего количество элементов на всех страницах в сумме (сначала загрузит все страницы)
144
144
  client.find_offers(company_id: 1).page(2).total!
145
145
  ```
146
+
147
+ ## Улучшения.
148
+
149
+ В файле [TODO.md](/TODO.md) вы можете найти известные проблемы, которые можно исправить и идеи для улучшений.
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_dependency 'addressable', '~> 2.3'
26
26
  spec.add_dependency 'dry-configurable', '~> 0.11'
27
- spec.add_dependency 'gemfather-stable', '~> <%= version %>'
27
+ spec.add_dependency 'gemfather', '~> <%= version %>'
28
28
  spec.add_dependency 'faraday', '>= 0.17', '< 2'
29
29
  spec.add_dependency 'faraday_middleware', '>= 0.13', '< 2'
30
30
  spec.add_dependency 'hashie', '>= 3.0', '< 5'
@@ -26,13 +26,14 @@ gem '<%= app_name %>'
26
26
 
27
27
  ```ruby
28
28
  <%= app_name_class %>::Client.configure do |config|
29
- config.api_endpoint = 'https://<%= app_name %>.dev/'
30
- config.api_user = 'user'
31
- config.api_password = 'password'
32
- config.open_timeout = 5
33
- config.read_timeout = 5
34
- config.user_agent = 'info for debugging' # default is `Ruby <%= app_name_class %> API Client`
35
- config.logger = Logger.new(STDERR) # по дефолту `Rails.logger` в development окружении, в других - nil
29
+ config.api_endpoint = 'https://<%= app_name %>.dev/'
30
+ config.api_user = 'user'
31
+ config.api_password = 'password'
32
+ config.open_timeout = 5
33
+ config.read_timeout = 5
34
+ config.user_agent = 'info for debugging' # default is `Ruby <%= app_name_class %> API Client`
35
+ config.logger = Logger.new(STDERR) # по дефолту `Rails.logger` в development окружении, в других - nil
36
+ config.enable_instrumentation = true # под дефолту выключен, включает отправку метрик гему domclick_bigbrother через ActiveSupport::Notifications
36
37
  end
37
38
  ```
38
39
 
@@ -11,7 +11,7 @@ module ApiGenerator
11
11
  RETRY_BACKOFF_FACTOR = 1
12
12
  CONNECTION_ERROR = ApiGenerator::Middleware::HttpErrors::ConnectionError
13
13
 
14
- # rubocop:disable Metrics/MethodLength
14
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
15
15
  def self.extended(klass)
16
16
  klass.extend Dry::Configurable
17
17
 
@@ -34,11 +34,12 @@ module ApiGenerator
34
34
  setting :retry_interval, default: RETRY_INTERVAL, reader: true
35
35
  setting :retry_backoff_factor, default: RETRY_BACKOFF_FACTOR, reader: true
36
36
  setting :logger, reader: true
37
+ setting :enable_instrumentation, reader: true
37
38
 
38
39
  setting :retriable_errors, default: [CONNECTION_ERROR], reader: true
39
40
  end
40
41
  end
41
- # rubocop:enable Metrics/MethodLength
42
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
42
43
 
43
44
  def check_config
44
45
  raise ConfigurationError, 'API endpoint is not configured.' if config.api_endpoint.nil?
@@ -52,8 +52,10 @@ module ApiGenerator
52
52
 
53
53
  private
54
54
 
55
- # rubocop:disable Metrics/MethodLength
55
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
56
56
  def connection
57
+ set_instrumentation_context
58
+
57
59
  @connection ||= Faraday.new(url: self.class.api_endpoint) do |connection|
58
60
  setup_auth!(connection)
59
61
 
@@ -65,6 +67,7 @@ module ApiGenerator
65
67
  setup_error_handling!(connection)
66
68
  setup_error_code_middleware!(connection)
67
69
  setup_ssl(connection)
70
+ setup_instrumentation!(connection)
68
71
 
69
72
  customize_connection!(connection)
70
73
 
@@ -74,7 +77,7 @@ module ApiGenerator
74
77
  connection.adapter(Faraday.default_adapter)
75
78
  end
76
79
  end
77
- # rubocop:enable Metrics/MethodLength
80
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
78
81
 
79
82
  # rubocop:disable Metrics/AbcSize
80
83
  def setup_auth!(connection)
@@ -109,6 +112,24 @@ module ApiGenerator
109
112
  connection.response(:logger, self.class.logger) if self.class.logger
110
113
  end
111
114
 
115
+ def setup_instrumentation!(connection)
116
+ return unless self.class.enable_instrumentation
117
+
118
+ connection.use ApiGenerator::Middleware::Instrumentation,
119
+ name: 'gemfather_api_client.requests'
120
+ end
121
+
122
+ def set_instrumentation_context
123
+ return unless self.class.enable_instrumentation
124
+
125
+ action = caller_locations(4, 1)&.first&.label || 'unparsed_method'
126
+
127
+ Thread.current[:gemfather_api_client] = {
128
+ name: self.class.to_s,
129
+ action: action,
130
+ }
131
+ end
132
+
112
133
  def setup_ssl(connection)
113
134
  connection.ssl.verify = self.class.ssl_verify
114
135
  connection.ssl.ca_file = self.class.ca_file
@@ -1,6 +1,12 @@
1
1
  module ApiGenerator
2
2
  module Middleware
3
3
  class ErrorHandlerMiddleware < Faraday::Middleware
4
+ FARADAY_CONNECTION_ERRORS = [
5
+ Faraday::TimeoutError,
6
+ Faraday::ConnectionFailed,
7
+ Faraday::SSLError,
8
+ ].freeze
9
+
4
10
  def self.inherited(subclass)
5
11
  class << subclass
6
12
  attr_accessor :error_namespace
@@ -10,12 +16,6 @@ module ApiGenerator
10
16
  super
11
17
  end
12
18
 
13
- FARADAY_CONNECTION_ERRORS = [
14
- Faraday::TimeoutError,
15
- Faraday::ConnectionFailed,
16
- Faraday::SSLError,
17
- ].freeze
18
-
19
19
  def call(env)
20
20
  @app.call(env)
21
21
  rescue *FARADAY_CONNECTION_ERRORS => e
@@ -0,0 +1,10 @@
1
+ module ApiGenerator
2
+ module Middleware
3
+ class Instrumentation < Faraday::Request::Instrumentation
4
+ def call(env)
5
+ env[:gemfather_api_client] = Thread.current[:gemfather_api_client]
6
+ super(env)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ class ApiGenerator::Pagination::CursorRelation < ApiGenerator::Pagination::Relation
2
+ def size(size)
3
+ expand(size: size)
4
+ end
5
+
6
+ def next_cursor(cursor)
7
+ expand(next_cursor: cursor)
8
+ end
9
+
10
+ private
11
+
12
+ def next_relation
13
+ expand(next_cursor: response['cursor'])
14
+ end
15
+
16
+ def last_page?
17
+ response['cursor'].nil?
18
+ end
19
+ end
@@ -3,6 +3,7 @@ module ApiGenerator::Pagination
3
3
  STRATEGIES = {
4
4
  limit_offset: LimitOffsetRelation,
5
5
  page: PageRelation,
6
+ cursor: CursorRelation,
6
7
  }.freeze
7
8
 
8
9
  # rubocop:disable Metrics/MethodLength
@@ -33,7 +33,7 @@ module ApiGenerator
33
33
  end
34
34
 
35
35
  def source_root
36
- gemfather_lib_path = $LOAD_PATH.grep(/gems\/gemfather/).first
36
+ gemfather_lib_path = $LOAD_PATH.grep(%r{gems/gemfather}).first
37
37
 
38
38
  return File.expand_path('../', gemfather_lib_path) if gemfather_lib_path
39
39
 
@@ -10,6 +10,10 @@ module ApiGenerator
10
10
  attr_accessor :app_name, :app_name_class, :app_short_name,
11
11
  :app_short_name_class, :author, :email, :version
12
12
 
13
+ def self.source_root
14
+ File.expand_path('./../../../', __dir__)
15
+ end
16
+
13
17
  # rubocop:disable Metrics/MethodLength
14
18
  desc 'generates API gem', 'generates basic API gem with the provided name'
15
19
  def generate_client(app_name)
@@ -32,13 +36,13 @@ module ApiGenerator
32
36
 
33
37
  private
34
38
 
35
- private_class_method :source_root
36
-
39
+ # rubocop:disable Layout/LineLength
37
40
  def check_app_name(app_name)
38
41
  raise(Thor::Error, 'APP_NAME is not provided') unless app_name
39
42
  raise(Thor::Error, "Folder #{app_name} name already exists") if Dir.exist?("./#{app_name}")
40
- raise(Thor::Error, "Api name can start only with letter or _") if app_name.chr.match(/[a-zA-Z_]/).nil?
43
+ raise(Thor::Error, 'Api name can start only with letter or _') if app_name.chr.match(/[a-zA-Z_]/).nil?
41
44
  end
45
+ # rubocop:enable Layout/LineLength
42
46
 
43
47
  def setup_template_variables(app_name)
44
48
  self.app_name = app_name
@@ -73,10 +77,6 @@ module ApiGenerator
73
77
  chmod(file, EXEC_MODE)
74
78
  end
75
79
  end
76
-
77
- def self.source_root
78
- File.expand_path('./../../../', __dir__)
79
- end
80
80
  end
81
81
  end
82
82
  end
@@ -1,3 +1,3 @@
1
1
  module ApiGenerator
2
- VERSION = '2.2.5'.freeze
2
+ VERSION = '2.4.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemfather-stable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.5
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domclick Ruby Team and Daniil Kachur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-09 00:00:00.000000000 Z
11
+ date: 2024-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -170,11 +170,13 @@ files:
170
170
  - lib/api_generator/middleware/error_handler_middleware.rb
171
171
  - lib/api_generator/middleware/handle_unsuccessful_request_middleware.rb
172
172
  - lib/api_generator/middleware/http_errors.rb
173
+ - lib/api_generator/middleware/instrumentation.rb
173
174
  - lib/api_generator/middleware/raise_error_base.rb
174
175
  - lib/api_generator/middleware/raise_error_dsl.rb
175
176
  - lib/api_generator/models/base.rb
176
177
  - lib/api_generator/models/data.rb
177
178
  - lib/api_generator/pagination.rb
179
+ - lib/api_generator/pagination/cursor_relation.rb
178
180
  - lib/api_generator/pagination/dsl.rb
179
181
  - lib/api_generator/pagination/limit_offset_relation.rb
180
182
  - lib/api_generator/pagination/page_relation.rb
@@ -197,15 +199,15 @@ files:
197
199
  - templates/specs/api_spec.erb
198
200
  - templates/specs/request_spec.erb
199
201
  - templates/specs/response_spec.erb
200
- homepage: https://github.com/DDKatch/gemfather/tree/stable
202
+ homepage: https://github.com/domclick/gemfather
201
203
  licenses:
202
204
  - MIT
203
205
  metadata:
204
- bug_tracker_uri: https://github.com/DDKatch/gemfather/tree/stable/issues
205
- changelog_uri: https://github.com/DDKatch/gemfather/tree/stable/blob/main/CHANGELOG.md
206
- documentation_uri: https://github.com/DDKatch/gemfather/tree/stable/blob/main/README.md
207
- homepage_uri: https://github.com/DDKatch/gemfather/tree/stable
208
- source_code_uri: https://github.com/DDKatch/gemfather/tree/stable
206
+ bug_tracker_uri: https://github.com/domclick/gemfather/issues
207
+ changelog_uri: https://github.com/domclick/gemfather/blob/main/CHANGELOG.md
208
+ documentation_uri: https://github.com/domclick/gemfather/blob/main/README.md
209
+ homepage_uri: https://github.com/domclick/gemfather
210
+ source_code_uri: https://github.com/domclick/gemfather
209
211
  rubygems_mfa_required: 'true'
210
212
  post_install_message:
211
213
  rdoc_options: []