evil-client 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +7 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +98 -0
  6. data/.travis.yml +17 -0
  7. data/Gemfile +9 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +144 -0
  10. data/Rakefile +6 -0
  11. data/docs/base_url.md +38 -0
  12. data/docs/documentation.md +9 -0
  13. data/docs/headers.md +59 -0
  14. data/docs/http_method.md +31 -0
  15. data/docs/index.md +127 -0
  16. data/docs/license.md +19 -0
  17. data/docs/model.md +173 -0
  18. data/docs/operation.md +0 -0
  19. data/docs/overview.md +0 -0
  20. data/docs/path.md +48 -0
  21. data/docs/query.md +99 -0
  22. data/docs/responses.md +66 -0
  23. data/docs/security.md +102 -0
  24. data/docs/settings.md +32 -0
  25. data/evil-client.gemspec +25 -0
  26. data/lib/evil/client.rb +97 -0
  27. data/lib/evil/client/connection.rb +35 -0
  28. data/lib/evil/client/connection/net_http.rb +57 -0
  29. data/lib/evil/client/dsl.rb +110 -0
  30. data/lib/evil/client/dsl/files.rb +37 -0
  31. data/lib/evil/client/dsl/operation.rb +102 -0
  32. data/lib/evil/client/dsl/operations.rb +41 -0
  33. data/lib/evil/client/dsl/scope.rb +34 -0
  34. data/lib/evil/client/dsl/security.rb +57 -0
  35. data/lib/evil/client/middleware.rb +81 -0
  36. data/lib/evil/client/middleware/base.rb +15 -0
  37. data/lib/evil/client/middleware/merge_security.rb +16 -0
  38. data/lib/evil/client/middleware/normalize_headers.rb +13 -0
  39. data/lib/evil/client/middleware/stringify_form.rb +36 -0
  40. data/lib/evil/client/middleware/stringify_json.rb +15 -0
  41. data/lib/evil/client/middleware/stringify_multipart.rb +32 -0
  42. data/lib/evil/client/middleware/stringify_multipart/part.rb +36 -0
  43. data/lib/evil/client/middleware/stringify_query.rb +31 -0
  44. data/lib/evil/client/model.rb +65 -0
  45. data/lib/evil/client/operation.rb +34 -0
  46. data/lib/evil/client/operation/request.rb +42 -0
  47. data/lib/evil/client/operation/response.rb +40 -0
  48. data/lib/evil/client/operation/response_error.rb +12 -0
  49. data/lib/evil/client/operation/unexpected_response_error.rb +16 -0
  50. data/mkdocs.yml +21 -0
  51. data/spec/features/instantiation_spec.rb +68 -0
  52. data/spec/features/middleware_spec.rb +75 -0
  53. data/spec/features/operation_with_documentation_spec.rb +41 -0
  54. data/spec/features/operation_with_files_spec.rb +40 -0
  55. data/spec/features/operation_with_form_body_spec.rb +158 -0
  56. data/spec/features/operation_with_headers_spec.rb +99 -0
  57. data/spec/features/operation_with_http_method_spec.rb +45 -0
  58. data/spec/features/operation_with_json_body_spec.rb +156 -0
  59. data/spec/features/operation_with_path_spec.rb +47 -0
  60. data/spec/features/operation_with_query_spec.rb +84 -0
  61. data/spec/features/operation_with_response_spec.rb +109 -0
  62. data/spec/features/operation_with_security_spec.rb +228 -0
  63. data/spec/features/scoping_spec.rb +48 -0
  64. data/spec/spec_helper.rb +23 -0
  65. data/spec/support/test_client.rb +15 -0
  66. data/spec/unit/evil/client/connection/net_http_spec.rb +38 -0
  67. data/spec/unit/evil/client/dsl/files_spec.rb +37 -0
  68. data/spec/unit/evil/client/dsl/operation_spec.rb +233 -0
  69. data/spec/unit/evil/client/dsl/operations_spec.rb +27 -0
  70. data/spec/unit/evil/client/dsl/scope_spec.rb +30 -0
  71. data/spec/unit/evil/client/dsl/security_spec.rb +135 -0
  72. data/spec/unit/evil/client/dsl_spec.rb +57 -0
  73. data/spec/unit/evil/client/middleware/merge_security_spec.rb +32 -0
  74. data/spec/unit/evil/client/middleware/normalize_headers_spec.rb +17 -0
  75. data/spec/unit/evil/client/middleware/stringify_form_spec.rb +63 -0
  76. data/spec/unit/evil/client/middleware/stringify_json_spec.rb +61 -0
  77. data/spec/unit/evil/client/middleware/stringify_multipart/part_spec.rb +59 -0
  78. data/spec/unit/evil/client/middleware/stringify_multipart_spec.rb +62 -0
  79. data/spec/unit/evil/client/middleware/stringify_query_spec.rb +40 -0
  80. data/spec/unit/evil/client/middleware_spec.rb +46 -0
  81. data/spec/unit/evil/client/model_spec.rb +100 -0
  82. data/spec/unit/evil/client/operation/request_spec.rb +49 -0
  83. data/spec/unit/evil/client/operation/response_spec.rb +61 -0
  84. metadata +271 -0
@@ -0,0 +1,40 @@
1
+ RSpec.describe Evil::Client::Middleware::StringifyQuery do
2
+ let(:stack) { described_class.new(app) }
3
+ let(:app) { double :app }
4
+
5
+ def update!(env)
6
+ @result = env
7
+ end
8
+
9
+ before { allow(app).to receive(:call) { |env| update! env } }
10
+ subject { stack.call env }
11
+
12
+ context "with a non-empty query:" do
13
+ let(:env) do
14
+ { query: { foo: :FOO, bar: [:BAR], baz: { qux: :QUX }, qux: nil } }
15
+ end
16
+
17
+ it "stringifies the query" do
18
+ subject
19
+ expect(@result[:query_string]).to eq "foo=FOO&bar[]=BAR&baz[qux]=QUX&qux="
20
+ end
21
+ end
22
+
23
+ context "with empty query:" do
24
+ let(:env) { { query: {} } }
25
+
26
+ it "does nothing" do
27
+ subject
28
+ expect(@result).to eq env
29
+ end
30
+ end
31
+
32
+ context "without a query:" do
33
+ let(:env) { {} }
34
+
35
+ it "does nothing" do
36
+ subject
37
+ expect(@result).to eq env
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ RSpec.describe Evil::Client::Middleware do
2
+ before do
3
+ class Test::Bar
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ @app.call(env) << " bar"
10
+ end
11
+ end
12
+
13
+ class Test::Baz
14
+ def initialize(app)
15
+ @app = app
16
+ end
17
+
18
+ def call(env)
19
+ @app.call(env) << " baz"
20
+ end
21
+ end
22
+ end
23
+
24
+ let(:connection) do
25
+ double(:connection).tap do |conn|
26
+ allow(conn).to receive(:call) { |value| value << " foo" }
27
+ end
28
+ end
29
+
30
+ let(:middleware) do
31
+ described_class.new do |settings|
32
+ run Test::Baz if settings.baz
33
+ run Test::Bar
34
+ end
35
+ end
36
+
37
+ it "builds full stack parameterized by settings" do
38
+ settings = double baz: false
39
+ response = middleware.finalize(settings).call(connection).call("qux")
40
+ expect(response).to eq "qux foo bar"
41
+
42
+ settings = double baz: true
43
+ response = middleware.finalize(settings).call(connection).call("qux")
44
+ expect(response).to eq "qux foo bar baz"
45
+ end
46
+ end
@@ -0,0 +1,100 @@
1
+ RSpec.describe Evil::Client::Model do
2
+ before do
3
+ class Test::User < Evil::Client::Model
4
+ option :name, type: Dry::Types["strict.string"]
5
+ option :email, type: Dry::Types["strict.string"], default: proc { nil }
6
+ option :phone, type: Dry::Types["strict.string"], optional: true
7
+ end
8
+
9
+ class Test::Order < Evil::Client::Model
10
+ param :user, type: Test::User
11
+ attribute :sum, type: Dry::Types["strict.int"]
12
+ option :items, type: Dry::Types["array"].member(Dry::Types["strict.int"])
13
+ option :qt, default: proc { nil }
14
+ end
15
+ end
16
+
17
+ describe ".new" do
18
+ it "is tolerant to unknown options" do
19
+ user = Test::User.new(name: "Andrew", foo: "bar")
20
+ expect(user.to_h).to eq name: "Andrew", email: nil
21
+ end
22
+
23
+ it "checks types" do
24
+ expect { Test::User.new(name: "Andrew", email: nil) }
25
+ .to raise_error TypeError
26
+ end
27
+
28
+ it "accepts string keys" do
29
+ user = Test::User.new("name" => "Andrew")
30
+ expect(user).to eq Test::User.new(name: "Andrew")
31
+ end
32
+ end
33
+
34
+ describe ".call" do
35
+ it "is shortcuts filtering" do
36
+ user = Test::User.call(name: "Andrew")
37
+ expect(user).to eq name: "Andrew", email: nil
38
+ end
39
+ end
40
+
41
+ describe ".[]" do
42
+ it "is an alias for .call" do
43
+ user = Test::User[name: "Andrew"]
44
+ expect(user).to eq Test::User.call(name: "Andrew")
45
+ end
46
+ end
47
+
48
+ describe "#to_h" do
49
+ it "provides a hash with assigned values only" do
50
+ user = Test::User[name: "Andrew"]
51
+ expect(user.to_h).to eq name: "Andrew", email: nil
52
+
53
+ user = Test::User[name: "Alan", email: "alan@example.com"]
54
+ expect(user.to_h).to eq name: "Alan", email: "alan@example.com"
55
+
56
+ user = Test::User[name: "Alice", phone: "12345"]
57
+ expect(user.to_h).to eq name: "Alice", email: nil, phone: "12345"
58
+
59
+ user = Test::User[name: "Avdi", phone: "12345"]
60
+ expect(user.to_h).to eq name: "Avdi", email: nil, phone: "12345"
61
+ end
62
+
63
+ it "hashifies models it depth" do
64
+ order = Test::Order[user: { name: "Bob" }, sum: 100, items: [1, 2]]
65
+ expect(order.to_h).to eq user: { name: "Bob", email: nil },
66
+ sum: 100,
67
+ items: [1, 2],
68
+ qt: nil
69
+ end
70
+ end
71
+
72
+ describe "#[]" do
73
+ it "is an alias for #send" do
74
+ user = Test::User.new(name: "Andrew")
75
+ expect(user[:name]).to eq user.name
76
+ expect(user["name"]).to eq user.name
77
+ end
78
+ end
79
+
80
+ describe "#==" do
81
+ it "compares model to model with the same attributes" do
82
+ user = Test::User[name: "Andrew"]
83
+ expect(user).to eq Test::User[name: "Andrew"]
84
+ expect(user).not_to eq Test::User[name: "Andrew", phone: "71112234455"]
85
+ end
86
+
87
+ it "compares model to some hash" do
88
+ user = Test::User[name: "Andrew"]
89
+ expect(user).to eq name: "Andrew", email: nil
90
+ end
91
+
92
+ it "makes comparison in depth" do
93
+ order = Test::Order[user: { name: "Bob" }, sum: 100, items: [1, 2]]
94
+ expect(order).to eq user: { name: "Bob", email: nil },
95
+ sum: 100,
96
+ items: [1, 2],
97
+ qt: nil
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,49 @@
1
+ RSpec.describe Evil::Client::Operation::Request do
2
+ before do
3
+ class Test::Body < Evil::Client::Model
4
+ attribute :foo
5
+ end
6
+
7
+ class Test::Query < Evil::Client::Model
8
+ attribute :bar
9
+ end
10
+
11
+ class Test::Headers < Evil::Client::Model
12
+ attribute :baz
13
+ end
14
+ end
15
+
16
+ let(:request) { described_class.new(schema) }
17
+ let(:file) { StringIO.new "Hi!" }
18
+ let(:schema) do
19
+ {
20
+ format: "multipart",
21
+ method: "patch",
22
+ path: proc { |id:, **| "users/#{id}" },
23
+ files: Evil::Client::DSL::Files.new { |file:, **| add file },
24
+ security: Evil::Client::DSL::Security.new { basic_auth "qux", "abc" },
25
+ query: Test::Query,
26
+ body: Test::Body,
27
+ headers: Test::Headers
28
+ }
29
+ end
30
+
31
+ subject { request.build file: file, foo: :FOO, bar: :BAR, baz: :BAZ, id: 1 }
32
+
33
+ it "builds final request env" do
34
+ expect(subject).to eq \
35
+ format: "multipart",
36
+ http_method: "patch",
37
+ path: "users/1",
38
+ security: { headers: { "authorization" => "Basic cXV4OmFiYw==" } },
39
+ files: [{
40
+ file: file,
41
+ type: MIME::Types["text/plain"].first,
42
+ charset: "utf-8",
43
+ filename: nil
44
+ }],
45
+ query: { bar: :BAR },
46
+ body: { foo: :FOO },
47
+ headers: { baz: :BAZ }
48
+ end
49
+ end
@@ -0,0 +1,61 @@
1
+ RSpec.describe Evil::Client::Operation::Response do
2
+ let(:response) { [status, {}, ["foo"]] }
3
+ let(:schema) do
4
+ {
5
+ key: :find_user,
6
+ doc: "http://example.com/users",
7
+ responses: {
8
+ 200 => {
9
+ coercer: proc { |body:, **| body.first.upcase.to_sym },
10
+ raise: false
11
+ },
12
+ 400 => {
13
+ coercer: proc { |body:, **| body.first.upcase.to_sym },
14
+ raise: true
15
+ }
16
+ }
17
+ }
18
+ end
19
+
20
+ subject { described_class.new(schema).handle(response) }
21
+
22
+ context "when response status should not cause an exception:" do
23
+ let(:status) { 200 }
24
+
25
+ it "returns coerced body" do
26
+ expect(subject).to eq :FOO
27
+ end
28
+ end
29
+
30
+ context "when response status should cause an exception:" do
31
+ let(:status) { 400 }
32
+
33
+ it "raises ResponseError with coerced response" do
34
+ begin
35
+ subject
36
+ rescue Evil::Client::Operation::ResponseError => error
37
+ expect(error.message).to include "find_user"
38
+ expect(error.response).to eq :FOO
39
+ else
40
+ fail
41
+ end
42
+ end
43
+ end
44
+
45
+ context "when response status is unknown:" do
46
+ let(:status) { 404 }
47
+
48
+ it "raises UnexpectedResponseError with raw response" do
49
+ begin
50
+ subject
51
+ rescue Evil::Client::Operation::UnexpectedResponseError => error
52
+ expect(error.message).to include "find_user"
53
+ expect(error.message).to include "http://example.com/users"
54
+ expect(error.response).to be_a Rack::Response
55
+ expect(error.response.status).to eq 404
56
+ else
57
+ fail
58
+ end
59
+ end
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,271 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evil-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Kozin (nepalez)
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-initializer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: mime-types
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dry-types
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '11'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '11'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.44'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.44'
125
+ description:
126
+ email: andrew.kozin@gmail.com
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files:
130
+ - README.md
131
+ files:
132
+ - ".codeclimate.yml"
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".rubocop.yml"
136
+ - ".travis.yml"
137
+ - Gemfile
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Rakefile
141
+ - docs/base_url.md
142
+ - docs/documentation.md
143
+ - docs/headers.md
144
+ - docs/http_method.md
145
+ - docs/index.md
146
+ - docs/license.md
147
+ - docs/model.md
148
+ - docs/operation.md
149
+ - docs/overview.md
150
+ - docs/path.md
151
+ - docs/query.md
152
+ - docs/responses.md
153
+ - docs/security.md
154
+ - docs/settings.md
155
+ - evil-client.gemspec
156
+ - lib/evil/client.rb
157
+ - lib/evil/client/connection.rb
158
+ - lib/evil/client/connection/net_http.rb
159
+ - lib/evil/client/dsl.rb
160
+ - lib/evil/client/dsl/files.rb
161
+ - lib/evil/client/dsl/operation.rb
162
+ - lib/evil/client/dsl/operations.rb
163
+ - lib/evil/client/dsl/scope.rb
164
+ - lib/evil/client/dsl/security.rb
165
+ - lib/evil/client/middleware.rb
166
+ - lib/evil/client/middleware/base.rb
167
+ - lib/evil/client/middleware/merge_security.rb
168
+ - lib/evil/client/middleware/normalize_headers.rb
169
+ - lib/evil/client/middleware/stringify_form.rb
170
+ - lib/evil/client/middleware/stringify_json.rb
171
+ - lib/evil/client/middleware/stringify_multipart.rb
172
+ - lib/evil/client/middleware/stringify_multipart/part.rb
173
+ - lib/evil/client/middleware/stringify_query.rb
174
+ - lib/evil/client/model.rb
175
+ - lib/evil/client/operation.rb
176
+ - lib/evil/client/operation/request.rb
177
+ - lib/evil/client/operation/response.rb
178
+ - lib/evil/client/operation/response_error.rb
179
+ - lib/evil/client/operation/unexpected_response_error.rb
180
+ - mkdocs.yml
181
+ - spec/features/instantiation_spec.rb
182
+ - spec/features/middleware_spec.rb
183
+ - spec/features/operation_with_documentation_spec.rb
184
+ - spec/features/operation_with_files_spec.rb
185
+ - spec/features/operation_with_form_body_spec.rb
186
+ - spec/features/operation_with_headers_spec.rb
187
+ - spec/features/operation_with_http_method_spec.rb
188
+ - spec/features/operation_with_json_body_spec.rb
189
+ - spec/features/operation_with_path_spec.rb
190
+ - spec/features/operation_with_query_spec.rb
191
+ - spec/features/operation_with_response_spec.rb
192
+ - spec/features/operation_with_security_spec.rb
193
+ - spec/features/scoping_spec.rb
194
+ - spec/spec_helper.rb
195
+ - spec/support/test_client.rb
196
+ - spec/unit/evil/client/connection/net_http_spec.rb
197
+ - spec/unit/evil/client/dsl/files_spec.rb
198
+ - spec/unit/evil/client/dsl/operation_spec.rb
199
+ - spec/unit/evil/client/dsl/operations_spec.rb
200
+ - spec/unit/evil/client/dsl/scope_spec.rb
201
+ - spec/unit/evil/client/dsl/security_spec.rb
202
+ - spec/unit/evil/client/dsl_spec.rb
203
+ - spec/unit/evil/client/middleware/merge_security_spec.rb
204
+ - spec/unit/evil/client/middleware/normalize_headers_spec.rb
205
+ - spec/unit/evil/client/middleware/stringify_form_spec.rb
206
+ - spec/unit/evil/client/middleware/stringify_json_spec.rb
207
+ - spec/unit/evil/client/middleware/stringify_multipart/part_spec.rb
208
+ - spec/unit/evil/client/middleware/stringify_multipart_spec.rb
209
+ - spec/unit/evil/client/middleware/stringify_query_spec.rb
210
+ - spec/unit/evil/client/middleware_spec.rb
211
+ - spec/unit/evil/client/model_spec.rb
212
+ - spec/unit/evil/client/operation/request_spec.rb
213
+ - spec/unit/evil/client/operation/response_spec.rb
214
+ homepage: https://github.com/evilmartians/evil-client
215
+ licenses:
216
+ - MIT
217
+ metadata: {}
218
+ post_install_message:
219
+ rdoc_options: []
220
+ require_paths:
221
+ - lib
222
+ required_ruby_version: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ version: '2.3'
227
+ required_rubygems_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ requirements: []
233
+ rubyforge_project:
234
+ rubygems_version: 2.6.4
235
+ signing_key:
236
+ specification_version: 4
237
+ summary: Human-friendly DSL for building HTTP(s) clients in Ruby
238
+ test_files:
239
+ - spec/features/instantiation_spec.rb
240
+ - spec/features/middleware_spec.rb
241
+ - spec/features/operation_with_documentation_spec.rb
242
+ - spec/features/operation_with_files_spec.rb
243
+ - spec/features/operation_with_form_body_spec.rb
244
+ - spec/features/operation_with_headers_spec.rb
245
+ - spec/features/operation_with_http_method_spec.rb
246
+ - spec/features/operation_with_json_body_spec.rb
247
+ - spec/features/operation_with_path_spec.rb
248
+ - spec/features/operation_with_query_spec.rb
249
+ - spec/features/operation_with_response_spec.rb
250
+ - spec/features/operation_with_security_spec.rb
251
+ - spec/features/scoping_spec.rb
252
+ - spec/spec_helper.rb
253
+ - spec/support/test_client.rb
254
+ - spec/unit/evil/client/connection/net_http_spec.rb
255
+ - spec/unit/evil/client/dsl/files_spec.rb
256
+ - spec/unit/evil/client/dsl/operation_spec.rb
257
+ - spec/unit/evil/client/dsl/operations_spec.rb
258
+ - spec/unit/evil/client/dsl/scope_spec.rb
259
+ - spec/unit/evil/client/dsl/security_spec.rb
260
+ - spec/unit/evil/client/dsl_spec.rb
261
+ - spec/unit/evil/client/middleware/merge_security_spec.rb
262
+ - spec/unit/evil/client/middleware/normalize_headers_spec.rb
263
+ - spec/unit/evil/client/middleware/stringify_form_spec.rb
264
+ - spec/unit/evil/client/middleware/stringify_json_spec.rb
265
+ - spec/unit/evil/client/middleware/stringify_multipart/part_spec.rb
266
+ - spec/unit/evil/client/middleware/stringify_multipart_spec.rb
267
+ - spec/unit/evil/client/middleware/stringify_query_spec.rb
268
+ - spec/unit/evil/client/middleware_spec.rb
269
+ - spec/unit/evil/client/model_spec.rb
270
+ - spec/unit/evil/client/operation/request_spec.rb
271
+ - spec/unit/evil/client/operation/response_spec.rb