kapellmeister 0.9.8.rc1 → 0.9.8
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 +4 -4
- data/Gemfile +3 -3
- data/README.md +42 -174
- data/kapellmeister.gemspec +9 -7
- data/lib/kapellmeister/base.rb +1 -1
- data/lib/kapellmeister/dispatcher.rb +6 -6
- data/lib/kapellmeister/requests_extension.rb +5 -5
- data/lib/kapellmeister/version.rb +1 -1
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00d0f29f4135cca35f1b74b9eb59e04686a30ce257e7448620fd7131faf73c6f
|
4
|
+
data.tar.gz: feeb5460b5771b5a1974c4a452d0b83f9046dcbc5b1b3e931b3d4c77febf862a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 321dd035242112e8ec715b68a7c2df4f10d0a14f8e47839d49b78e4bd81785c104aeac1a0c1a550b24f3badfd95950b79d0386db500c2e50b89d3177b16cda48
|
7
|
+
data.tar.gz: aff7e0ee44980ed3a92d5530ec57d97c7cba429f9d6cf8f876f59a06c7349fccfd4e7dc36f73e725a3dd71c8ffd4258b6ccd20e2f794f027adaa3409fb96032d
|
data/Gemfile
CHANGED
@@ -6,9 +6,9 @@ gemspec
|
|
6
6
|
|
7
7
|
gem 'dry-schema'
|
8
8
|
gem 'faraday'
|
9
|
-
gem '
|
9
|
+
gem 'faraday_middleware'
|
10
10
|
gem 'faraday-cookie_jar'
|
11
|
-
gem '
|
11
|
+
gem 'typhoeus'
|
12
12
|
|
13
13
|
# debug
|
14
14
|
group :development do
|
@@ -23,6 +23,6 @@ group :development, :test do
|
|
23
23
|
gem 'rubocop', require: false
|
24
24
|
gem 'rubocop-performance'
|
25
25
|
gem 'rubocop-rspec'
|
26
|
-
gem 'rubycritic',
|
26
|
+
gem 'rubycritic', require: false
|
27
27
|
gem 'ruby_gntp'
|
28
28
|
end
|
data/README.md
CHANGED
@@ -1,132 +1,3 @@
|
|
1
|
-
# Диспетчер HTTP-запросов
|
2
|
-
|
3
|
-
Этот шаблонизатор позволяет вам определять http-запросы к любым сторонним API с помощью упрощенного набора инструкций, включая анализатор маршрутов в формате yaml
|
4
|
-
## Использование
|
5
|
-
|
6
|
-
Добавьте kapellmeister в свой Gemfile:
|
7
|
-
На данный момент послденяя версия 0.9.8 (Проект находится в стадии тестирования работоспособности, beta-test)
|
8
|
-
```ruby
|
9
|
-
gem 'kapellmeister', '~> 0.9.8'
|
10
|
-
```
|
11
|
-
|
12
|
-
### Добавьте новую конфигурацию для стороннего API:
|
13
|
-
|
14
|
-
$ bin/rails g kapellmeister:add_service %<ThirdPartyName> %<options> --%<flags>
|
15
|
-
|
16
|
-
`ThirdPartyName` — Имя сервиса, может быть указан как КэмелКейсом (CamelCase) так и с нижним_подчёркиванием (under_scored)
|
17
|
-
|
18
|
-
`options` — Укажите ключи конфигурации, обычно это хост, ключ и версия
|
19
|
-
|
20
|
-
`flags` — Этот шаблонзатор пока что имеет один флаг.
|
21
|
-
Флаг `responder`, `false` — значение по-умолчанию.
|
22
|
-
Если вы установите для него значение `true`, то будет сгенерирован файл responder.rb используемый для анализа и парсинга ответа.
|
23
|
-
|
24
|
-
Все инструкции — это легковесные файлы в каталоге /lib вашего приложения.
|
25
|
-
Вот пример структуры:
|
26
|
-
|
27
|
-
``` Capfile
|
28
|
-
└── app
|
29
|
-
└── lib
|
30
|
-
└── third_party_service
|
31
|
-
├── client.rb
|
32
|
-
├── configuration.rb
|
33
|
-
├── responder.rb (опционально)
|
34
|
-
└── routes.yml
|
35
|
-
└── third_party_service.rb
|
36
|
-
└── initializers
|
37
|
-
└── third_party_service.rb
|
38
|
-
```
|
39
|
-
|
40
|
-
Если вы используете Rails, в вашем приложении есть папка `initializers`. Добавьте секретные ключи в файле-инициализаторе
|
41
|
-
|
42
|
-
initializers/third_party_service.rb
|
43
|
-
|
44
|
-
Основной файл вашей интеграции, миксин, включающий Kapellmeister::Base
|
45
|
-
|
46
|
-
app/lib/third_party_service.rb
|
47
|
-
|
48
|
-
Каталог, содержащий `routes scheme`, `client`, `configuration` и опциональный `responder`.
|
49
|
-
|
50
|
-
app/lib/third_party_service
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
`routes.yml` — Маршруты к стороннему API во вложенном формате.
|
55
|
-
|
56
|
-
``` yaml
|
57
|
-
foo: => Обёртка для метода
|
58
|
-
bar: => Наименование метода
|
59
|
-
scheme: => Описание схемы
|
60
|
-
method: POST => Тип запроса (* обязательный параметр!)
|
61
|
-
use_wrapper: true => Обёрнуть ли метод для обеспечения уникальности. По умолчанию true
|
62
|
-
path: buz => Настоящий путь (роут). Если параметра нет, то путь будет взят из наименования метода.
|
63
|
-
body: => Dry-scheme (из набора гемов DRY) для проверки параметров. Если параметра нет, то проверки не будет.
|
64
|
-
query_params: => Описание query-параметров. Если параметра нет, то подстановки параметров не будет.
|
65
|
-
mock: => Структура или путь к файлу mock для тестов. Если параметра нет, в среде разработки будет возвращён реальный ответ на запрос.
|
66
|
-
|
67
|
-
# Результат из примера выше:
|
68
|
-
# client = ThirdParty::Client.new
|
69
|
-
# client.foo_bar { a: 'b' }
|
70
|
-
# => POST https://third_party.com/foo/buz DATA: { a: 'b' }
|
71
|
-
```
|
72
|
-
#### Пояснение к параметрам:
|
73
|
-
|
74
|
-
`body` — Вы можете использовать dry-scheme (из набора гемов DRY) для проверки параметров запроса.
|
75
|
-
Если этот ключ не существует, проверка будет пропущена.
|
76
|
-
Пример:
|
77
|
-
|
78
|
-
```yaml
|
79
|
-
body: DrySchema
|
80
|
-
```
|
81
|
-
|
82
|
-
`query_params` — Если для запроса требуется query-параметры.
|
83
|
-
Работают как массивы, так и руби-хэши.
|
84
|
-
Если этот ключ не существует, то подстановки параметров и их проверки не будет.
|
85
|
-
For example:
|
86
|
-
|
87
|
-
```yaml
|
88
|
-
query_params:
|
89
|
-
dbAct: getCities => Пример использования известных и неизменяемых параметров
|
90
|
-
optional: => Пример использования опциональных параметров. Они будут подставлены при передачи их при запросе
|
91
|
-
- city
|
92
|
-
- state
|
93
|
-
|
94
|
-
# Результат из примера выше:
|
95
|
-
# /api?dbAct=getCities&city=Tokio
|
96
|
-
```
|
97
|
-
```yaml
|
98
|
-
query_params:
|
99
|
-
- dbAct: getTarif
|
100
|
-
- org => Пример использования обязательных параметров.
|
101
|
-
- dest
|
102
|
-
- weight
|
103
|
-
|
104
|
-
# Результат из примера выше:
|
105
|
-
# /api?dbAct=getTarif&org=Tokio&dest=Beijing&weight=100
|
106
|
-
```
|
107
|
-
|
108
|
-
`mock` — Если вам нужно, чтобы реальные запросы не проходили во время тестирования,
|
109
|
-
вы можете заменить их на mocks.
|
110
|
-
Можно использовать как структуру yaml, так и путь к файлу yaml.
|
111
|
-
Например:
|
112
|
-
|
113
|
-
```yaml
|
114
|
-
mock: spec/mocks/http_clients/public/cities.yml
|
115
|
-
```
|
116
|
-
|
117
|
-
#### Объяснение сгенерированных файлов
|
118
|
-
|
119
|
-
`client.rb` — Унаследованный файл от главного диспетчера, и вы можете добавить некоторые методы настройки, пользовательские заголовки, параметры запросов, query-параметры.
|
120
|
-
|
121
|
-
`configuration.rb` — Добавляем путь к стороннему API, URL-адрес конфигурации и логгер.
|
122
|
-
|
123
|
-
`responder.rb` — По умолчанию используется стандартный обработчик ответов, обработанный в формате json. Но вы можете написать свой собственный.
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
---
|
128
|
-
### english
|
129
|
-
|
130
1
|
# HTTP requests dispatcher
|
131
2
|
|
132
3
|
This template-service allows you to define http requests to a third party through a lightweight set of instructions, including a route parser in yaml format
|
@@ -134,25 +5,25 @@ This template-service allows you to define http requests to a third party throug
|
|
134
5
|
## Usage
|
135
6
|
|
136
7
|
Add kapellmeister to your Gemfile:
|
137
|
-
|
8
|
+
|
138
9
|
```ruby
|
139
10
|
gem 'kapellmeister', '~> 0.9.6'
|
140
11
|
```
|
141
12
|
|
142
|
-
### Add
|
13
|
+
### Add new third party configuration:
|
143
14
|
|
144
15
|
$ bin/rails g kapellmeister:add_service %<ThirdPartyName> %<options> --%<flags>
|
145
16
|
|
146
|
-
`ThirdPartyName` —
|
17
|
+
`ThirdPartyName` — Pass the lib name, either CamelCased or under_scored
|
147
18
|
|
148
|
-
`options` —
|
19
|
+
`options` — Pass the configuration keys, usually host, key and version
|
149
20
|
|
150
|
-
`flags` — This generator
|
151
|
-
|
152
|
-
If you set it to `true
|
21
|
+
`flags` — This generator have one flag.
|
22
|
+
This flag is `responder`, default is `false`.
|
23
|
+
If you set it to `true` will be generated responder.rb used for parsing response.
|
153
24
|
|
154
|
-
All instructions are lightweight files in
|
155
|
-
Here
|
25
|
+
All the instructions are lightweight files in your /lib folder.
|
26
|
+
Here's the example of structure:
|
156
27
|
|
157
28
|
``` Capfile
|
158
29
|
└── app
|
@@ -169,86 +40,83 @@ Here is an example of the structure:
|
|
169
40
|
|
170
41
|
initializers/third_party_service.rb
|
171
42
|
|
172
|
-
If you
|
43
|
+
If you use the Rails gem you have the `initializers` folder in your application. Add the secret keys to config.
|
173
44
|
|
174
45
|
app/lib/third_party_service.rb
|
175
46
|
|
176
|
-
|
47
|
+
Main file of your integration. Make it module and include the Kapellmeister::Base
|
177
48
|
|
178
49
|
app/lib/third_party_service
|
179
50
|
|
180
|
-
|
51
|
+
Folder contains `routes scheme`, `client`, `configuration` and optional `responder`.
|
181
52
|
|
182
|
-
`routes.yml` — Routes to
|
53
|
+
`routes.yml` — Routes to third party in nested format.
|
183
54
|
|
184
55
|
``` yaml
|
185
|
-
foo: => Wrapper
|
186
|
-
bar: =>
|
187
|
-
scheme: =>
|
56
|
+
foo: => Wrapper for method
|
57
|
+
bar: => Method name
|
58
|
+
scheme: => Scheme description
|
188
59
|
method: POST => Request type (* required)
|
189
|
-
use_wrapper: true =>
|
190
|
-
path: buz =>
|
191
|
-
body: => Dry
|
192
|
-
query_params: =>
|
193
|
-
mock: =>
|
60
|
+
use_wrapper: true => Wrap method for uniqueness. Default true
|
61
|
+
path: buz => Real path
|
62
|
+
body: => Dry schema for checking parameters. If key doesn't exist nothing happens
|
63
|
+
query_params: => Query params. If key doesn't exist nothing happens
|
64
|
+
mock: => Structure or Path to mock file for tests. If key doesn't exist nothing happens
|
194
65
|
|
195
|
-
# The result from the example above:
|
196
66
|
# client = ThirdParty::Client.new
|
197
67
|
# client.foo_bar { a: 'b' }
|
198
68
|
# => POST https://third_party.com/foo/buz DATA: { a: 'b' }
|
199
69
|
```
|
200
|
-
####
|
70
|
+
#### Parameters explanation:
|
201
71
|
|
202
|
-
`body` — You can use
|
203
|
-
If this key doesn't exist
|
204
|
-
|
72
|
+
`body` — You can use dry-schema for validate request parameters.
|
73
|
+
If this key doesn't exist validation will be skipped.
|
74
|
+
For example:
|
205
75
|
|
206
76
|
```yaml
|
207
|
-
body:
|
77
|
+
body: CreateSchema
|
208
78
|
```
|
209
79
|
|
210
|
-
`query_params` — If
|
211
|
-
Both arrays and
|
212
|
-
If this key doesn't exist
|
213
|
-
|
80
|
+
`query_params` — If request needs a query string.
|
81
|
+
Both arrays and hashes work.
|
82
|
+
If this key doesn't exist validation will be skipped.
|
83
|
+
For example:
|
214
84
|
|
215
85
|
```yaml
|
216
86
|
query_params:
|
217
|
-
dbAct: getCities =>
|
218
|
-
optional: =>
|
87
|
+
dbAct: getCities => For known and unchangeable parameters
|
88
|
+
optional: => For optional parameters
|
219
89
|
- city
|
220
90
|
- state
|
221
91
|
|
222
|
-
# The result from the example above:
|
223
92
|
# /api?dbAct=getCities&city=Tokio
|
224
93
|
```
|
225
94
|
```yaml
|
226
95
|
query_params:
|
227
96
|
- dbAct: getTarif
|
228
|
-
- org =>
|
97
|
+
- org => For required parameters
|
229
98
|
- dest
|
230
99
|
- weight
|
231
|
-
|
232
|
-
# The result from the example above:
|
100
|
+
|
233
101
|
# /api?dbAct=getTarif&org=Tokio&dest=Beijing&weight=100
|
234
102
|
```
|
235
103
|
|
236
|
-
`mock` —
|
237
|
-
you can replace them with mocks.
|
238
|
-
|
239
|
-
|
104
|
+
`mock` — If you need real requests don't pass during the testing,
|
105
|
+
then you can replace them with mocks.
|
106
|
+
Both yaml structure or path to yaml file can be used.
|
107
|
+
For example:
|
240
108
|
|
241
109
|
```yaml
|
242
110
|
mock: spec/mocks/http_clients/public/cities.yml
|
243
111
|
```
|
244
112
|
|
245
|
-
####
|
113
|
+
#### Generated files explanation
|
246
114
|
|
247
|
-
`client.rb` —
|
115
|
+
`client.rb` — Nested from main dispatcher and you can add some configuration methods, custom headers, requests options, query parameters.
|
248
116
|
|
249
|
-
`configuration.rb` — Add
|
117
|
+
`configuration.rb` — Add path to third party, config url and logger
|
250
118
|
|
251
|
-
`responder.rb` —
|
119
|
+
`responder.rb` — By default uses standard responders parsed response in json. But you can write your own.
|
252
120
|
|
253
121
|
## Contributing
|
254
122
|
|
data/kapellmeister.gemspec
CHANGED
@@ -14,9 +14,11 @@ Gem::Specification.new do |gem|
|
|
14
14
|
|
15
15
|
gem.license = 'MIT'
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
if gem.respond_to?(:metadata)
|
18
|
+
gem.metadata['allowed_push_host'] = 'https://rubygems.org'
|
19
|
+
else
|
20
|
+
fail 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
21
|
+
end
|
20
22
|
|
21
23
|
gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(/^(test|spec|features)/) }
|
22
24
|
gem.bindir = 'exe'
|
@@ -25,16 +27,16 @@ Gem::Specification.new do |gem|
|
|
25
27
|
|
26
28
|
gem.required_ruby_version = '>= 2.4.2'
|
27
29
|
|
28
|
-
gem.add_dependency 'dry-schema', '~> 1.
|
30
|
+
gem.add_dependency 'dry-schema', '~> 1.13'
|
29
31
|
gem.add_dependency 'faraday', '~> 2.10'
|
30
32
|
gem.add_dependency 'faraday-cookie_jar', '~> 0.0.7'
|
31
|
-
gem.add_dependency '
|
32
|
-
gem.add_dependency '
|
33
|
+
gem.add_dependency 'faraday_middleware', '~> 1.2'
|
34
|
+
gem.add_dependency 'typhoeus', '~> 1.4.0'
|
33
35
|
|
34
36
|
gem.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.2'
|
35
37
|
gem.add_development_dependency 'rake', '~> 13.0'
|
36
38
|
gem.add_development_dependency 'redcarpet', '~> 1.17', '>= 1.17.0'
|
37
|
-
gem.add_development_dependency 'rubocop', '~> 1.
|
39
|
+
gem.add_development_dependency 'rubocop', '~> 1.21'
|
38
40
|
gem.add_development_dependency 'yard', '~> 0.7', '>= 0.7.5'
|
39
41
|
gem.metadata['rubygems_mfa_required'] = 'true'
|
40
42
|
end
|
data/lib/kapellmeister/base.rb
CHANGED
@@ -37,7 +37,7 @@ end
|
|
37
37
|
def generate_routes(json_scheme)
|
38
38
|
json_scheme.dup.each_with_object({}) do |(key, value), scheme|
|
39
39
|
scheme[key] = value.delete(:scheme) if (value.is_a?(Hash) && value.key?(:scheme)) || value.is_a?(String)
|
40
|
-
next if value.nil? || value.
|
40
|
+
next if value.nil? || value.length.zero?
|
41
41
|
|
42
42
|
generate_routes(value).map { |deep_key, deep_value| mapping(deep_key, deep_value, key, scheme) }
|
43
43
|
end
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require_relative 'requests_extension'
|
1
|
+
require 'faraday_middleware'
|
2
|
+
require_relative './requests_extension'
|
3
3
|
|
4
4
|
class Kapellmeister::Dispatcher
|
5
5
|
def self.new(**args)
|
6
|
-
main_klass = module_parent.name
|
6
|
+
main_klass = self.module_parent.name.delete('::')
|
7
7
|
|
8
|
-
module_parent.requests.each do |request|
|
9
|
-
include Kapellmeister::RequestsExtension.request_processing(main_klass, request)
|
8
|
+
self.module_parent.requests.each do |request|
|
9
|
+
self.include Kapellmeister::RequestsExtension.request_processing(main_klass, request)
|
10
10
|
end
|
11
11
|
super(**args)
|
12
12
|
end
|
@@ -60,7 +60,7 @@ class Kapellmeister::Dispatcher
|
|
60
60
|
faraday.request :multipart
|
61
61
|
faraday.response :logger, logger
|
62
62
|
faraday.response :json, content_type: 'application/json; charset=utf-8'
|
63
|
-
faraday.
|
63
|
+
faraday.use FaradayMiddleware::FollowRedirects, limit: 5
|
64
64
|
faraday.adapter :typhoeus do |http|
|
65
65
|
http.timeout = 20
|
66
66
|
end
|
@@ -3,7 +3,7 @@ module Kapellmeister::RequestsExtension
|
|
3
3
|
mod = if Object.const_defined?("#{self}::#{klass}InstanceMethods")
|
4
4
|
const_get("#{self}::#{klass}InstanceMethods")
|
5
5
|
else
|
6
|
-
const_set(
|
6
|
+
const_set("#{klass}InstanceMethods", Module.new)
|
7
7
|
end
|
8
8
|
|
9
9
|
mod.module_eval do
|
@@ -37,7 +37,7 @@ def parsed_query(params, data)
|
|
37
37
|
|
38
38
|
hash_data, filtered_query = *split_hashes(params)
|
39
39
|
required_empty_query, default_data = *hash_data.partition { |elem| elem.values.compact_blank.blank? }
|
40
|
-
data = filtered_query.zip
|
40
|
+
data = Hash[filtered_query.zip].compact_blank.merge(data) if data.is_a?(Hash)
|
41
41
|
_optional_data, default_data = *split_optional(default_data)
|
42
42
|
data = data.merge(default_data) if !data.blank? || !default_data.blank?
|
43
43
|
|
@@ -79,7 +79,7 @@ def generate_path(original_path, data)
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def valid_body?(data, body)
|
82
|
-
return
|
82
|
+
return if body.blank? || body.is_a?(Hash)
|
83
83
|
|
84
84
|
schema = Object.const_get(body).schema
|
85
85
|
result = schema.call(data)
|
@@ -89,7 +89,7 @@ def valid_body?(data, body)
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def valid_query?(data, query)
|
92
|
-
return
|
92
|
+
return if query.blank?
|
93
93
|
|
94
94
|
required_keys = query.map(&:to_sym)
|
95
95
|
|
@@ -99,7 +99,7 @@ def valid_query?(data, query)
|
|
99
99
|
data[:query_params] = data[:query_params].to_h.merge!(from_data)
|
100
100
|
|
101
101
|
different_keys = data[:query_params].transform_keys(&:to_sym)
|
102
|
-
return
|
102
|
+
return if required_keys.all? { |key| different_keys.key? key.to_sym }
|
103
103
|
|
104
104
|
raise ArgumentError, "Query params needs keys #{required_keys}"
|
105
105
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kapellmeister
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.8
|
4
|
+
version: 0.9.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarkWater
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: '1.13'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: '1.13'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: faraday
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,33 +53,33 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.0.7
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: faraday_middleware
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: '1.2'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: '1.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: typhoeus
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.4.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.4.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,14 +140,14 @@ dependencies:
|
|
140
140
|
requirements:
|
141
141
|
- - "~>"
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version: '1.
|
143
|
+
version: '1.21'
|
144
144
|
type: :development
|
145
145
|
prerelease: false
|
146
146
|
version_requirements: !ruby/object:Gem::Requirement
|
147
147
|
requirements:
|
148
148
|
- - "~>"
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version: '1.
|
150
|
+
version: '1.21'
|
151
151
|
- !ruby/object:Gem::Dependency
|
152
152
|
name: yard
|
153
153
|
requirement: !ruby/object:Gem::Requirement
|
@@ -217,9 +217,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
217
217
|
version: 2.4.2
|
218
218
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
|
-
- - "
|
220
|
+
- - ">="
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version:
|
222
|
+
version: '0'
|
223
223
|
requirements: []
|
224
224
|
rubygems_version: 3.3.7
|
225
225
|
signing_key:
|