зеркало из
https://github.com/glebtv/yookassa.git
synced 2026-09-08 11:55:50 +03:00
Replace ffi-backed HTTP client
Этот коммит содержится в:
7
.github/workflows/main.yml
поставляемый
7
.github/workflows/main.yml
поставляемый
@@ -14,12 +14,11 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ruby:
|
ruby:
|
||||||
- 2.6
|
- "3.3"
|
||||||
- 2.7
|
- "3.4"
|
||||||
- 3.0
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
26
.rubocop.yml
26
.rubocop.yml
@@ -1,6 +1,7 @@
|
|||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: 2.6
|
TargetRubyVersion: 3.3
|
||||||
NewCops: enable
|
NewCops: enable
|
||||||
|
SuggestExtensions: false
|
||||||
|
|
||||||
Style/StringLiterals:
|
Style/StringLiterals:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
@@ -17,4 +18,25 @@ Layout/LineLength:
|
|||||||
Max: 150
|
Max: 150
|
||||||
|
|
||||||
Metrics/BlockLength:
|
Metrics/BlockLength:
|
||||||
IgnoredMethods: ['describe', 'context', 'shared_examples']
|
AllowedMethods: ["describe", "context", "shared_examples"]
|
||||||
|
|
||||||
|
Metrics/MethodLength:
|
||||||
|
Max: 15
|
||||||
|
|
||||||
|
Naming/PredicateMethod:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/KeywordArgumentsMerging:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/RedundantCurrentDirectoryInPath:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Gemspec/AddRuntimeDependency:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Gemspec/DeprecatedAttributeAssignment:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Gemspec/RequireMFA:
|
||||||
|
Enabled: false
|
||||||
|
|||||||
24
Gemfile
24
Gemfile
@@ -5,22 +5,24 @@ source "https://rubygems.org"
|
|||||||
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
||||||
|
|
||||||
# Specify your gem's dependencies in yookassa.gemspec
|
# Specify your gem's dependencies in yookassa.gemspec
|
||||||
|
gem "httpclient", github: "glebtv/httpclient", branch: "master"
|
||||||
|
|
||||||
gemspec
|
gemspec
|
||||||
|
|
||||||
group :documentation do
|
group :documentation do
|
||||||
gem "rack"
|
gem "rack", "~> 3.2"
|
||||||
gem "webrick"
|
gem "webrick", "~> 1.9"
|
||||||
gem "yard"
|
gem "yard", "~> 0.9"
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem "pry"
|
gem "pry", "~> 0.16"
|
||||||
gem "pry-byebug", "~> 3.8.0"
|
gem "pry-byebug", "~> 3.8"
|
||||||
gem "rake", "~> 13.0"
|
gem "rake", "~> 13.4"
|
||||||
gem "rspec", "~> 3.5"
|
gem "rspec", "~> 3.13"
|
||||||
gem "rubocop", "~> 1.22"
|
gem "rubocop", "~> 1.88"
|
||||||
gem "rubocop-rake", "~> 0.6.0"
|
gem "rubocop-rake", "~> 0.6.0"
|
||||||
gem "rubocop-rspec", "~> 2.5"
|
gem "rubocop-rspec", "~> 2.31"
|
||||||
gem "simplecov", "~> 0.16"
|
gem "simplecov", "~> 0.22"
|
||||||
gem "webmock", "~> 3.14"
|
gem "webmock", "~> 3.26"
|
||||||
end
|
end
|
||||||
|
|||||||
255
Gemfile.lock
255
Gemfile.lock
@@ -1,158 +1,183 @@
|
|||||||
|
GIT
|
||||||
|
remote: https://github.com/glebtv/httpclient
|
||||||
|
revision: 28d3d1d4fb428e98cc52f04294fe21717db9b28f
|
||||||
|
branch: master
|
||||||
|
specs:
|
||||||
|
httpclient (2.9.0)
|
||||||
|
mutex_m
|
||||||
|
|
||||||
PATH
|
PATH
|
||||||
remote: .
|
remote: .
|
||||||
specs:
|
specs:
|
||||||
yookassa (0.2.0)
|
yookassa (0.2.0)
|
||||||
dry-struct
|
dry-struct
|
||||||
dry-validation
|
dry-validation
|
||||||
http (~> 5.0.1)
|
httpclient (>= 2.9)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
addressable (2.8.0)
|
addressable (2.9.0)
|
||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 8.0)
|
||||||
ast (2.4.2)
|
ast (2.4.3)
|
||||||
byebug (11.1.3)
|
bigdecimal (4.1.2)
|
||||||
|
byebug (13.0.0)
|
||||||
|
reline (>= 0.6.0)
|
||||||
coderay (1.1.3)
|
coderay (1.1.3)
|
||||||
concurrent-ruby (1.1.9)
|
concurrent-ruby (1.3.7)
|
||||||
crack (0.4.5)
|
crack (1.0.1)
|
||||||
|
bigdecimal
|
||||||
rexml
|
rexml
|
||||||
diff-lcs (1.4.4)
|
diff-lcs (1.6.2)
|
||||||
docile (1.4.0)
|
docile (1.4.1)
|
||||||
domain_name (0.5.20190701)
|
dry-configurable (1.4.0)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
dry-core (~> 1.0)
|
||||||
dry-configurable (0.13.0)
|
zeitwerk (~> 2.6)
|
||||||
|
dry-core (1.2.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
dry-core (~> 0.6)
|
logger
|
||||||
dry-container (0.9.0)
|
zeitwerk (~> 2.6)
|
||||||
|
dry-inflector (1.3.1)
|
||||||
|
dry-initializer (3.2.0)
|
||||||
|
dry-logic (1.6.0)
|
||||||
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
dry-configurable (~> 0.13, >= 0.13.0)
|
dry-core (~> 1.1)
|
||||||
dry-core (0.7.1)
|
zeitwerk (~> 2.6)
|
||||||
|
dry-schema (1.16.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
dry-inflector (0.2.1)
|
dry-configurable (~> 1.0, >= 1.0.1)
|
||||||
dry-initializer (3.0.4)
|
dry-core (~> 1.1)
|
||||||
dry-logic (1.2.0)
|
dry-initializer (~> 3.2)
|
||||||
concurrent-ruby (~> 1.0)
|
dry-logic (~> 1.6)
|
||||||
dry-core (~> 0.5, >= 0.5)
|
dry-types (~> 1.9, >= 1.9.1)
|
||||||
dry-schema (1.8.0)
|
zeitwerk (~> 2.6)
|
||||||
concurrent-ruby (~> 1.0)
|
dry-struct (1.8.1)
|
||||||
dry-configurable (~> 0.13, >= 0.13.0)
|
dry-core (~> 1.1)
|
||||||
dry-core (~> 0.5, >= 0.5)
|
dry-types (~> 1.8, >= 1.8.2)
|
||||||
dry-initializer (~> 3.0)
|
|
||||||
dry-logic (~> 1.0)
|
|
||||||
dry-types (~> 1.5)
|
|
||||||
dry-struct (1.4.0)
|
|
||||||
dry-core (~> 0.5, >= 0.5)
|
|
||||||
dry-types (~> 1.5)
|
|
||||||
ice_nine (~> 0.11)
|
ice_nine (~> 0.11)
|
||||||
dry-types (1.5.1)
|
zeitwerk (~> 2.6)
|
||||||
|
dry-types (1.9.1)
|
||||||
|
bigdecimal (>= 3.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
dry-container (~> 0.3)
|
dry-core (~> 1.0)
|
||||||
dry-core (~> 0.5, >= 0.5)
|
dry-inflector (~> 1.0)
|
||||||
dry-inflector (~> 0.1, >= 0.1.2)
|
dry-logic (~> 1.4)
|
||||||
dry-logic (~> 1.0, >= 1.0.2)
|
zeitwerk (~> 2.6)
|
||||||
dry-validation (1.7.0)
|
dry-validation (1.11.1)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
dry-container (~> 0.7, >= 0.7.1)
|
dry-core (~> 1.1)
|
||||||
dry-core (~> 0.5, >= 0.5)
|
dry-initializer (~> 3.2)
|
||||||
dry-initializer (~> 3.0)
|
dry-schema (~> 1.14)
|
||||||
dry-schema (~> 1.8, >= 1.8.0)
|
zeitwerk (~> 2.6)
|
||||||
ffi (1.15.4)
|
hashdiff (1.2.1)
|
||||||
ffi-compiler (1.0.1)
|
|
||||||
ffi (>= 1.0.0)
|
|
||||||
rake
|
|
||||||
hashdiff (1.0.1)
|
|
||||||
http (5.0.4)
|
|
||||||
addressable (~> 2.8)
|
|
||||||
http-cookie (~> 1.0)
|
|
||||||
http-form_data (~> 2.2)
|
|
||||||
llhttp-ffi (~> 0.4.0)
|
|
||||||
http-cookie (1.0.4)
|
|
||||||
domain_name (~> 0.5)
|
|
||||||
http-form_data (2.3.0)
|
|
||||||
ice_nine (0.11.2)
|
ice_nine (0.11.2)
|
||||||
llhttp-ffi (0.4.0)
|
io-console (0.8.2)
|
||||||
ffi-compiler (~> 1.0)
|
json (2.20.0)
|
||||||
rake (~> 13.0)
|
language_server-protocol (3.17.0.5)
|
||||||
method_source (1.0.0)
|
lint_roller (1.1.0)
|
||||||
parallel (1.21.0)
|
logger (1.7.0)
|
||||||
parser (3.0.2.0)
|
method_source (1.1.0)
|
||||||
|
mutex_m (0.3.0)
|
||||||
|
parallel (2.1.0)
|
||||||
|
parser (3.3.11.1)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
pry (0.14.1)
|
racc
|
||||||
|
prism (1.9.0)
|
||||||
|
pry (0.16.0)
|
||||||
coderay (~> 1.1)
|
coderay (~> 1.1)
|
||||||
method_source (~> 1.0)
|
method_source (~> 1.0)
|
||||||
pry-byebug (3.8.0)
|
reline (>= 0.6.0)
|
||||||
byebug (~> 11.0)
|
pry-byebug (3.12.0)
|
||||||
pry (~> 0.10)
|
byebug (~> 13.0)
|
||||||
public_suffix (4.0.6)
|
pry (>= 0.13, < 0.17)
|
||||||
rack (2.2.3)
|
public_suffix (7.0.5)
|
||||||
rainbow (3.0.0)
|
racc (1.8.1)
|
||||||
rake (13.0.6)
|
rack (3.2.6)
|
||||||
regexp_parser (2.1.1)
|
rainbow (3.1.1)
|
||||||
rexml (3.2.5)
|
rake (13.4.2)
|
||||||
rspec (3.10.0)
|
regexp_parser (2.12.0)
|
||||||
rspec-core (~> 3.10.0)
|
reline (0.6.3)
|
||||||
rspec-expectations (~> 3.10.0)
|
io-console (~> 0.5)
|
||||||
rspec-mocks (~> 3.10.0)
|
rexml (3.4.4)
|
||||||
rspec-core (3.10.1)
|
rspec (3.13.2)
|
||||||
rspec-support (~> 3.10.0)
|
rspec-core (~> 3.13.0)
|
||||||
rspec-expectations (3.10.1)
|
rspec-expectations (~> 3.13.0)
|
||||||
|
rspec-mocks (~> 3.13.0)
|
||||||
|
rspec-core (3.13.6)
|
||||||
|
rspec-support (~> 3.13.0)
|
||||||
|
rspec-expectations (3.13.5)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.10.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-mocks (3.10.2)
|
rspec-mocks (3.13.8)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.10.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-support (3.10.2)
|
rspec-support (3.13.7)
|
||||||
rubocop (1.22.3)
|
rubocop (1.88.1)
|
||||||
parallel (~> 1.10)
|
json (~> 2.3)
|
||||||
parser (>= 3.0.0.0)
|
language_server-protocol (~> 3.17.0.2)
|
||||||
|
lint_roller (~> 1.1.0)
|
||||||
|
parallel (>= 1.10)
|
||||||
|
parser (>= 3.3.0.2)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 2.9.3, < 3.0)
|
||||||
rexml
|
rubocop-ast (>= 1.49.0, < 2.0)
|
||||||
rubocop-ast (>= 1.12.0, < 2.0)
|
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 4.0)
|
||||||
rubocop-ast (1.12.0)
|
rubocop-ast (1.49.1)
|
||||||
parser (>= 3.0.1.1)
|
parser (>= 3.3.7.2)
|
||||||
|
prism (~> 1.7)
|
||||||
|
rubocop-capybara (2.23.0)
|
||||||
|
lint_roller (~> 1.1)
|
||||||
|
rubocop (~> 1.81)
|
||||||
|
rubocop-factory_bot (2.28.0)
|
||||||
|
lint_roller (~> 1.1)
|
||||||
|
rubocop (~> 1.72, >= 1.72.1)
|
||||||
rubocop-rake (0.6.0)
|
rubocop-rake (0.6.0)
|
||||||
rubocop (~> 1.0)
|
rubocop (~> 1.0)
|
||||||
rubocop-rspec (2.5.0)
|
rubocop-rspec (2.31.0)
|
||||||
rubocop (~> 1.19)
|
rubocop (~> 1.40)
|
||||||
ruby-progressbar (1.11.0)
|
rubocop-capybara (~> 2.17)
|
||||||
simplecov (0.21.2)
|
rubocop-factory_bot (~> 2.22)
|
||||||
|
rubocop-rspec_rails (~> 2.28)
|
||||||
|
rubocop-rspec_rails (2.29.1)
|
||||||
|
rubocop (~> 1.61)
|
||||||
|
ruby-progressbar (1.13.0)
|
||||||
|
simplecov (0.22.0)
|
||||||
docile (~> 1.1)
|
docile (~> 1.1)
|
||||||
simplecov-html (~> 0.11)
|
simplecov-html (~> 0.11)
|
||||||
simplecov_json_formatter (~> 0.1)
|
simplecov_json_formatter (~> 0.1)
|
||||||
simplecov-html (0.12.3)
|
simplecov-html (0.13.2)
|
||||||
simplecov_json_formatter (0.1.3)
|
simplecov_json_formatter (0.1.4)
|
||||||
unf (0.1.4)
|
unicode-display_width (3.2.0)
|
||||||
unf_ext
|
unicode-emoji (~> 4.1)
|
||||||
unf_ext (0.0.8)
|
unicode-emoji (4.2.0)
|
||||||
unicode-display_width (2.1.0)
|
webmock (3.26.2)
|
||||||
webmock (3.14.0)
|
|
||||||
addressable (>= 2.8.0)
|
addressable (>= 2.8.0)
|
||||||
crack (>= 0.3.2)
|
crack (>= 0.3.2)
|
||||||
hashdiff (>= 0.4.0, < 2.0.0)
|
hashdiff (>= 0.4.0, < 2.0.0)
|
||||||
webrick (1.7.0)
|
webrick (1.9.2)
|
||||||
yard (0.9.26)
|
yard (0.9.44)
|
||||||
|
zeitwerk (2.8.2)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
pry
|
httpclient!
|
||||||
pry-byebug (~> 3.8.0)
|
pry (~> 0.16)
|
||||||
rack
|
pry-byebug (~> 3.8)
|
||||||
rake (~> 13.0)
|
rack (~> 3.2)
|
||||||
rspec (~> 3.5)
|
rake (~> 13.4)
|
||||||
rubocop (~> 1.22)
|
rspec (~> 3.13)
|
||||||
|
rubocop (~> 1.88)
|
||||||
rubocop-rake (~> 0.6.0)
|
rubocop-rake (~> 0.6.0)
|
||||||
rubocop-rspec (~> 2.5)
|
rubocop-rspec (~> 2.31)
|
||||||
simplecov (~> 0.16)
|
simplecov (~> 0.22)
|
||||||
webmock (~> 3.14)
|
webmock (~> 3.26)
|
||||||
webrick
|
webrick (~> 1.9)
|
||||||
yard
|
yard (~> 0.9)
|
||||||
yookassa!
|
yookassa!
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.2.22
|
4.0.11
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -125,6 +125,16 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
|
|||||||
- Write, clarify, or fix documentation
|
- Write, clarify, or fix documentation
|
||||||
- Suggest or add new features
|
- Suggest or add new features
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
This gem uses the `glebtv/httpclient` fork for local development to avoid the `http` gem's `llhttp-ffi` dependency chain.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bin/setup
|
||||||
|
bundle exec rspec
|
||||||
|
bundle exec rubocop
|
||||||
|
```
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "http"
|
require "httpclient"
|
||||||
|
require "json"
|
||||||
require_relative "./entity/error"
|
require_relative "./entity/error"
|
||||||
|
|
||||||
module Yookassa
|
module Yookassa
|
||||||
@@ -10,12 +11,15 @@ module Yookassa
|
|||||||
attr_reader :http
|
attr_reader :http
|
||||||
|
|
||||||
def initialize(shop_id: Yookassa.config.shop_id, api_key: Yookassa.config.api_key, oauth_token: nil)
|
def initialize(shop_id: Yookassa.config.shop_id, api_key: Yookassa.config.api_key, oauth_token: nil)
|
||||||
@http = HTTP.headers(accept: "application/json")
|
@http = HTTPClient.new(
|
||||||
|
default_header: { "Accept" => "application/json" },
|
||||||
|
force_basic_auth: true
|
||||||
|
)
|
||||||
|
|
||||||
if shop_id && api_key
|
if shop_id && api_key
|
||||||
@http.basic_auth(user: shop_id, pass: api_key)
|
@http.set_auth(API_URL, shop_id, api_key)
|
||||||
elsif oauth_token
|
elsif oauth_token
|
||||||
@http.headers("Authorization" => "Bearer #{oauth_token}")
|
@http.default_header["Authorization"] = "Bearer #{oauth_token}"
|
||||||
else
|
else
|
||||||
message = "Specify `shop_id` and `api_key` settings in a `.configure` block " \
|
message = "Specify `shop_id` and `api_key` settings in a `.configure` block " \
|
||||||
"or pass `oauth_token` to a client"
|
"or pass `oauth_token` to a client"
|
||||||
@@ -26,23 +30,28 @@ module Yookassa
|
|||||||
private
|
private
|
||||||
|
|
||||||
def get(endpoint, query: {})
|
def get(endpoint, query: {})
|
||||||
api_call { http.get("#{API_URL}#{endpoint}", params: query) }
|
api_call { http.get("#{API_URL}#{endpoint}", query: query) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def post(endpoint, idempotency_key:, payload: {})
|
def post(endpoint, idempotency_key:, payload: {})
|
||||||
api_call { http.headers("Idempotence-Key" => idempotency_key).post("#{API_URL}#{endpoint}", json: payload) }
|
headers = json_headers.merge("Idempotence-Key" => idempotency_key)
|
||||||
|
api_call { http.post("#{API_URL}#{endpoint}", body: JSON.generate(payload), header: headers) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete(endpoint, idempotency_key:)
|
def delete(endpoint, idempotency_key:)
|
||||||
api_call { http.headers("Idempotence-Key" => idempotency_key).delete("#{API_URL}#{endpoint}") }
|
api_call { http.delete("#{API_URL}#{endpoint}", header: { "Idempotence-Key" => idempotency_key }) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def api_call
|
def api_call
|
||||||
response = yield if block_given?
|
response = yield if block_given?
|
||||||
body = JSON.parse(response.body.to_s, symbolize_names: true)
|
body = JSON.parse(response.body.to_s, symbolize_names: true)
|
||||||
return body if response.status.success?
|
return body if response.status.between?(200, 299)
|
||||||
|
|
||||||
Entity::Error.new(**body)
|
Entity::Error.new(**body)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def json_headers
|
||||||
|
{ "Content-Type" => "application/json" }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ Gem::Specification.new do |spec|
|
|||||||
|
|
||||||
spec.require_paths = ["lib"]
|
spec.require_paths = ["lib"]
|
||||||
|
|
||||||
spec.required_ruby_version = ">= 2.6"
|
spec.required_ruby_version = ">= 3.3"
|
||||||
|
|
||||||
spec.add_runtime_dependency "dry-struct"
|
spec.add_runtime_dependency "dry-struct"
|
||||||
spec.add_runtime_dependency "dry-validation"
|
spec.add_runtime_dependency "dry-validation"
|
||||||
spec.add_runtime_dependency "http", "~> 5.0"
|
spec.add_runtime_dependency "httpclient", ">= 2.9"
|
||||||
end
|
end
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user