evil-client 0.3.1 → 0.3.2
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/.rubocop.yml +4 -18
- data/CHANGELOG.md +16 -1
- data/README.md +17 -15
- data/evil-client.gemspec +1 -1
- data/lib/evil/client/connection.rb +1 -5
- data/lib/evil/client/connection/net_http.rb +1 -1
- data/lib/evil/client/dsl.rb +11 -0
- data/lib/evil/client/dsl/base.rb +26 -0
- data/lib/evil/client/dsl/headers.rb +16 -0
- data/lib/evil/client/dsl/http_method.rb +24 -0
- data/lib/evil/client/dsl/operation.rb +8 -20
- data/lib/evil/client/dsl/operations.rb +3 -3
- data/lib/evil/client/dsl/path.rb +25 -0
- data/lib/evil/client/dsl/query.rb +16 -0
- data/lib/evil/client/dsl/verifier.rb +35 -0
- data/lib/evil/client/middleware/base.rb +2 -6
- data/lib/evil/client/middleware/merge_security.rb +4 -0
- data/lib/evil/client/middleware/normalize_headers.rb +4 -0
- data/lib/evil/client/middleware/stringify_form.rb +4 -0
- data/lib/evil/client/middleware/stringify_json.rb +4 -0
- data/lib/evil/client/middleware/stringify_multipart.rb +4 -0
- data/lib/evil/client/middleware/stringify_query.rb +4 -0
- data/lib/evil/client/operation.rb +2 -2
- data/lib/evil/client/operation/request.rb +8 -19
- data/spec/features/middleware_spec.rb +15 -9
- data/spec/features/operation_with_path_spec.rb +3 -3
- data/spec/unit/evil/client/dsl/operation_spec.rb +1 -1
- data/spec/unit/evil/client/dsl/operations_spec.rb +1 -1
- data/spec/unit/evil/client/middleware/merge_security_spec.rb +2 -2
- data/spec/unit/evil/client/middleware/normalize_headers_spec.rb +2 -2
- data/spec/unit/evil/client/middleware/stringify_form_spec.rb +2 -2
- data/spec/unit/evil/client/middleware/stringify_json_spec.rb +2 -2
- data/spec/unit/evil/client/middleware/stringify_multipart_spec.rb +2 -2
- data/spec/unit/evil/client/middleware/stringify_query_spec.rb +1 -1
- data/spec/unit/evil/client/operation/request_spec.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 792691363738b2a89d8579cfcdd33e95fcf496bd
|
|
4
|
+
data.tar.gz: 5477063a34c23b048748d2a47d9f256f17a9a025
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 586b7861e76d8e6f56bdd8f1668cad0e25ba75fd4247dd4e5e810ece64999e882b555b039a194c5c97d80280c46cd49d71ae78d23c83ba87758f59574a762008
|
|
7
|
+
data.tar.gz: 5eaada81c8761c9c4bbe40a9be0fc4bb1006b6fea7501a8cd3162ccab6229f03f20c4b7dde6aaff4dc073406be7582ff33c3f6d75219dd110d02d5746fa66038
|
data/.rubocop.yml
CHANGED
|
@@ -5,16 +5,16 @@ AllCops:
|
|
|
5
5
|
StyleGuideCopsOnly: true
|
|
6
6
|
TargetRubyVersion: 2.3
|
|
7
7
|
|
|
8
|
-
Style/
|
|
8
|
+
Style/CaseEquality:
|
|
9
|
+
Enabled: false
|
|
10
|
+
|
|
11
|
+
Style/Documentation:
|
|
9
12
|
Enabled: false
|
|
10
13
|
|
|
11
14
|
Style/FileName:
|
|
12
15
|
Exclude:
|
|
13
16
|
- lib/evil-client.rb
|
|
14
17
|
|
|
15
|
-
Style/Documentation:
|
|
16
|
-
Enabled: false
|
|
17
|
-
|
|
18
18
|
Style/LambdaCall:
|
|
19
19
|
Enabled: false
|
|
20
20
|
|
|
@@ -34,19 +34,5 @@ Style/RaiseArgs:
|
|
|
34
34
|
Style/RescueModifier:
|
|
35
35
|
Enabled: false
|
|
36
36
|
|
|
37
|
-
Style/SingleLineBlockParams:
|
|
38
|
-
Enabled: false
|
|
39
|
-
|
|
40
|
-
Style/SingleLineMethods:
|
|
41
|
-
Exclude:
|
|
42
|
-
- spec/**.rb
|
|
43
|
-
|
|
44
37
|
Style/StringLiterals:
|
|
45
38
|
EnforcedStyle: double_quotes
|
|
46
|
-
|
|
47
|
-
Style/StringLiteralsInInterpolation:
|
|
48
|
-
EnforcedStyle: double_quotes
|
|
49
|
-
|
|
50
|
-
Style/SymbolProc:
|
|
51
|
-
Exclude:
|
|
52
|
-
- spec/**.rb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
|
-
# v0.3.
|
|
1
|
+
# v0.3.2 2016-11-29
|
|
2
|
+
|
|
3
|
+
On the road to v0.4.0
|
|
4
|
+
|
|
5
|
+
## Fixed
|
|
6
|
+
- Query and body encoding (nepalez)
|
|
7
|
+
|
|
8
|
+
## Internal
|
|
9
|
+
- Refactoring of some DSL classes (nepalez)
|
|
10
|
+
|
|
11
|
+
[Compare v0.3.1...v0.3.2](https://github.com/dry-rb/dry-initializer/compare/v0.3.1...v0.3.2)
|
|
12
|
+
|
|
13
|
+
# v0.3.1 2016-11-22
|
|
14
|
+
|
|
15
|
+
## Fixed
|
|
16
|
+
- Loading of 'json' from stdlib (nepalez)
|
|
2
17
|
|
|
3
18
|
## Internal
|
|
4
19
|
- Class `Evil::Client::Model` is extracted to `evil-struct` gem (nepalez)
|
data/README.md
CHANGED
|
@@ -20,8 +20,8 @@ The gem stands away from mutable states and monkey patching when possible. To su
|
|
|
20
20
|
For now the DSL supports clients to **json** and **form data** APIs out of the box. Because of high variance of XML-based APIs, building corresponding clients require more efforts on a middleware level.
|
|
21
21
|
|
|
22
22
|
[swagger]: http://swagger.io
|
|
23
|
-
[dry-initializer]: http://dry-rb.org/gems
|
|
24
|
-
[dry-types]: http://dry-rb.org/gems
|
|
23
|
+
[dry-initializer]: http://dry-rb.org/gems/dry-initializer
|
|
24
|
+
[dry-types]: http://dry-rb.org/gems/dry-types
|
|
25
25
|
|
|
26
26
|
## Installation
|
|
27
27
|
|
|
@@ -52,20 +52,20 @@ require "evil-client"
|
|
|
52
52
|
require "dry-types"
|
|
53
53
|
|
|
54
54
|
class CatsClient < Evil::Client
|
|
55
|
-
#
|
|
55
|
+
# Prepare client-specific model of cat (the furry pinnacle of evolution)
|
|
56
56
|
class Cat < Evil::Struct
|
|
57
|
-
attribute :name,
|
|
58
|
-
attribute :color,
|
|
59
|
-
attribute :age,
|
|
57
|
+
attribute :name, Dry::Types["strict.string"], optional: true
|
|
58
|
+
attribute :color, Dry::Types["strict.string"]
|
|
59
|
+
attribute :age, Dry::Types["coercible.int"], default: proc { 0 }
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
# Define settings the client initialized with
|
|
63
63
|
# The settings parameterizes operations when necessary
|
|
64
64
|
settings do
|
|
65
|
-
param :domain,
|
|
66
|
-
option :version,
|
|
67
|
-
option :user,
|
|
68
|
-
option :password,
|
|
65
|
+
param :domain, Dry::Types["strict.string"] # required!
|
|
66
|
+
option :version, Dry::Types["coercible.int"], default: proc { 0 }
|
|
67
|
+
option :user, Dry::Types["strict.string"] # required!
|
|
68
|
+
option :password, Dry::Types["strict.string"] # required!
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
# Define a base url using
|
|
@@ -85,15 +85,17 @@ class CatsClient < Evil::Client
|
|
|
85
85
|
path { |id:, **| "cats/#{id}" } # id will be taken from request parameters
|
|
86
86
|
|
|
87
87
|
body format: "json" do
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
attributes optional: true do
|
|
89
|
+
attribute :name
|
|
90
|
+
attribute :color
|
|
91
|
+
attribute :age
|
|
92
|
+
end
|
|
91
93
|
end
|
|
92
94
|
|
|
93
95
|
# Parses json response and wraps it into Cat instance with additional
|
|
94
96
|
# parameter
|
|
95
|
-
response 200, format: :json,
|
|
96
|
-
attribute :success
|
|
97
|
+
response 200, format: :json, model: Cat do
|
|
98
|
+
attribute :success # add response-specific attribute to the cat
|
|
97
99
|
end
|
|
98
100
|
|
|
99
101
|
# Parses json response, wraps it into model with [#error] and raises
|
data/evil-client.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |gem|
|
|
2
2
|
gem.name = "evil-client"
|
|
3
|
-
gem.version = "0.3.
|
|
3
|
+
gem.version = "0.3.2"
|
|
4
4
|
gem.author = ["Andrew Kozin (nepalez)", "Ravil Bairamgalin (brainopia)"]
|
|
5
5
|
gem.email = "andrew.kozin@gmail.com"
|
|
6
6
|
gem.homepage = "https://github.com/evilmartians/evil-client"
|
|
@@ -12,7 +12,7 @@ class Evil::Client
|
|
|
12
12
|
# :http_method, :path, :query_string, :body_string, :headers
|
|
13
13
|
# @return [Array] Rack-compatible response [status, body, headers]
|
|
14
14
|
#
|
|
15
|
-
def call(env)
|
|
15
|
+
def call(env, *)
|
|
16
16
|
request = build_request(env)
|
|
17
17
|
Net::HTTP.start base_uri.host, base_uri.port, opts do |http|
|
|
18
18
|
handle http.request(request)
|
data/lib/evil/client/dsl.rb
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
class Evil::Client
|
|
2
2
|
# Defines a DSL to customize class-level settings of the specific client
|
|
3
3
|
module DSL
|
|
4
|
+
require_relative "dsl/base"
|
|
5
|
+
require_relative "dsl/files"
|
|
6
|
+
require_relative "dsl/headers"
|
|
7
|
+
require_relative "dsl/http_method"
|
|
8
|
+
require_relative "dsl/path"
|
|
9
|
+
require_relative "dsl/query"
|
|
10
|
+
require_relative "dsl/response"
|
|
11
|
+
require_relative "dsl/responses"
|
|
12
|
+
require_relative "dsl/security"
|
|
13
|
+
require_relative "dsl/verifier"
|
|
14
|
+
require_relative "dsl/operation"
|
|
4
15
|
require_relative "dsl/operations"
|
|
5
16
|
require_relative "dsl/scope"
|
|
6
17
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Evil::Client::DSL
|
|
2
|
+
class Base
|
|
3
|
+
def self.[](schema, *args, &block)
|
|
4
|
+
new(*args, &block).call(schema)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def call(schema)
|
|
8
|
+
schema
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def merge(source, target)
|
|
14
|
+
target.inject(source) do |obj, (key, val)|
|
|
15
|
+
obj.merge key => (Hash === val ? merge(obj.fetch(key, {}), val) : val)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def coercer
|
|
20
|
+
@coercer ||= if @model && @block then Class.new(@model, &@block)
|
|
21
|
+
elsif @block then Class.new(Evil::Struct, &@block)
|
|
22
|
+
elsif @model then @model
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Evil::Client::DSL
|
|
2
|
+
class Headers < Base
|
|
3
|
+
def call(schema)
|
|
4
|
+
merge schema, headers: coercer
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
attr_reader :model, :block
|
|
10
|
+
|
|
11
|
+
def initialize(model: Evil::Struct, &block)
|
|
12
|
+
@model = model
|
|
13
|
+
@block = block
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Evil::Client::DSL
|
|
2
|
+
class HttpMethod < Base
|
|
3
|
+
def call(schema)
|
|
4
|
+
merge schema, method: http_method
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
attr_reader :block, :string
|
|
10
|
+
|
|
11
|
+
def initialize(string = nil, &block)
|
|
12
|
+
@string = string.to_s.downcase
|
|
13
|
+
@block = block
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def http_method
|
|
17
|
+
if block
|
|
18
|
+
->(opts) { block.call(opts).to_s.downcase }
|
|
19
|
+
else
|
|
20
|
+
proc { string }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
module Evil::Client::DSL
|
|
2
|
-
require_relative "security"
|
|
3
|
-
require_relative "files"
|
|
4
|
-
require_relative "response"
|
|
5
|
-
require_relative "responses"
|
|
6
|
-
|
|
7
|
-
# Builds a schema for single operation
|
|
8
2
|
class Operation
|
|
9
3
|
attr_reader :schema
|
|
10
4
|
|
|
11
|
-
# Builds a schema for a single operation
|
|
12
|
-
#
|
|
13
|
-
# @param [Object] settings
|
|
14
|
-
# @param [Proc] block A block of definitions (should accept settings)
|
|
15
|
-
# @return [Hash<Symbol, Object>]
|
|
16
|
-
#
|
|
17
5
|
def finalize(settings)
|
|
18
6
|
@mutex.synchronize do
|
|
19
7
|
@schema = @default.dup
|
|
@@ -39,12 +27,12 @@ module Evil::Client::DSL
|
|
|
39
27
|
@schema[:doc] = value
|
|
40
28
|
end
|
|
41
29
|
|
|
42
|
-
def http_method(value)
|
|
43
|
-
@schema
|
|
30
|
+
def http_method(value = nil, &block)
|
|
31
|
+
@schema = HttpMethod[schema, value, &block]
|
|
44
32
|
end
|
|
45
33
|
|
|
46
|
-
def path
|
|
47
|
-
@schema
|
|
34
|
+
def path(value = nil, &block)
|
|
35
|
+
@schema = Path[schema, value, &block]
|
|
48
36
|
end
|
|
49
37
|
|
|
50
38
|
def security(&block)
|
|
@@ -63,12 +51,12 @@ module Evil::Client::DSL
|
|
|
63
51
|
@schema.delete :files
|
|
64
52
|
end
|
|
65
53
|
|
|
66
|
-
def headers(
|
|
67
|
-
@schema
|
|
54
|
+
def headers(model: Evil::Struct, &block)
|
|
55
|
+
@schema = Headers[schema, model: model, &block]
|
|
68
56
|
end
|
|
69
57
|
|
|
70
|
-
def query(
|
|
71
|
-
@schema
|
|
58
|
+
def query(model: Evil::Struct, &block)
|
|
59
|
+
@schema = Query[schema, model: model, &block]
|
|
72
60
|
end
|
|
73
61
|
|
|
74
62
|
def responses(options = {}, &block)
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
module Evil::Client::DSL
|
|
2
|
-
require_relative "operation"
|
|
3
|
-
|
|
4
2
|
# Container for operations definitions
|
|
5
3
|
# Applies settings to definitions and returns a final schema
|
|
6
4
|
class Operations
|
|
@@ -24,12 +22,14 @@ module Evil::Client::DSL
|
|
|
24
22
|
default = @schema[nil].finalize(settings)
|
|
25
23
|
custom = @schema.select { |key| key }
|
|
26
24
|
|
|
27
|
-
custom.each_with_object({}) do |(key, operation), hash|
|
|
25
|
+
schema = custom.each_with_object({}) do |(key, operation), hash|
|
|
28
26
|
custom = operation.finalize(settings)
|
|
29
27
|
hash[key] = default.merge(custom)
|
|
30
28
|
hash[key][:format] ||= "json"
|
|
31
29
|
hash[key][:responses] = default[:responses].merge(custom[:responses])
|
|
32
30
|
end
|
|
31
|
+
|
|
32
|
+
Verifier.call(schema)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
private
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Evil::Client::DSL
|
|
2
|
+
# Adds path settings to the operation's schema
|
|
3
|
+
class Path < Base
|
|
4
|
+
def call(schema)
|
|
5
|
+
merge schema, path: path
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
SLASHES = %r{\A/+|/+\z}
|
|
11
|
+
|
|
12
|
+
attr_reader :block, :value
|
|
13
|
+
|
|
14
|
+
def initialize(value = nil, &block)
|
|
15
|
+
@value = value.to_s.gsub(SLASHES, "")
|
|
16
|
+
@block = block
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def path
|
|
20
|
+
if block then ->(opts) { block.call(opts).to_s.gsub(SLASHES, "") }
|
|
21
|
+
else ->(_) { value }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Evil::Client::DSL
|
|
2
|
+
SchemaError = Class.new(StandardError)
|
|
3
|
+
|
|
4
|
+
# Verifies a final schema
|
|
5
|
+
class Verifier
|
|
6
|
+
def self.call(schema)
|
|
7
|
+
new(schema).call
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call
|
|
11
|
+
@schema.each do |key, schema|
|
|
12
|
+
check_path(key, schema)
|
|
13
|
+
check_method(key, schema)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def initialize(schema)
|
|
20
|
+
@schema = schema
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def check_path(key, schema)
|
|
24
|
+
return if schema[:path]
|
|
25
|
+
raise SchemaError,
|
|
26
|
+
"Path definition is missed for operation :#{key}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def check_method(key, schema)
|
|
30
|
+
return if schema[:method]
|
|
31
|
+
raise SchemaError,
|
|
32
|
+
"HTTP method definition is missed for operation :#{key}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
class Evil::Client::Middleware::Base
|
|
2
|
-
def call(env)
|
|
3
|
-
@app.call
|
|
2
|
+
def call(env, schema, options)
|
|
3
|
+
@app.call(env, schema, options)
|
|
4
4
|
end
|
|
5
5
|
|
|
6
6
|
private
|
|
@@ -8,8 +8,4 @@ class Evil::Client::Middleware::Base
|
|
|
8
8
|
def initialize(app)
|
|
9
9
|
@app = app
|
|
10
10
|
end
|
|
11
|
-
|
|
12
|
-
def build(env)
|
|
13
|
-
env
|
|
14
|
-
end
|
|
15
11
|
end
|
|
@@ -12,26 +12,15 @@ class Evil::Client::Operation
|
|
|
12
12
|
#
|
|
13
13
|
def build(options)
|
|
14
14
|
{
|
|
15
|
-
format:
|
|
16
|
-
http_method:
|
|
17
|
-
path:
|
|
18
|
-
security:
|
|
19
|
-
files:
|
|
20
|
-
query:
|
|
21
|
-
body:
|
|
22
|
-
headers:
|
|
15
|
+
format: schema[:format],
|
|
16
|
+
http_method: schema[:method].call(options),
|
|
17
|
+
path: schema[:path].call(options),
|
|
18
|
+
security: schema[:security]&.call(options),
|
|
19
|
+
files: schema[:files]&.call(options),
|
|
20
|
+
query: schema[:query]&.new(options).to_h,
|
|
21
|
+
body: schema[:body]&.new(options).to_h,
|
|
22
|
+
headers: schema[:headers]&.new(options).to_h
|
|
23
23
|
}
|
|
24
24
|
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def key
|
|
29
|
-
@key ||= schema[:key]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def extract(property)
|
|
33
|
-
return schema[property] if schema[property]
|
|
34
|
-
raise NotImplementedError, "No #{property} defined for operation '#{key}'"
|
|
35
|
-
end
|
|
36
25
|
end
|
|
37
26
|
end
|
|
@@ -5,13 +5,17 @@ RSpec.describe "middleware" do
|
|
|
5
5
|
@app = app
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
def call(_env)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
def call(_env, schema, options)
|
|
9
|
+
env = {
|
|
10
|
+
path: "data/1",
|
|
11
|
+
http_method: "get",
|
|
12
|
+
format: "form",
|
|
13
|
+
headers: { "baz" => "BAZ" },
|
|
14
|
+
query: { "bar" => "baz" },
|
|
15
|
+
body: { "qux" => 2 }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@app.call env, schema, options
|
|
15
19
|
end
|
|
16
20
|
end
|
|
17
21
|
|
|
@@ -20,8 +24,10 @@ RSpec.describe "middleware" do
|
|
|
20
24
|
@app = app
|
|
21
25
|
end
|
|
22
26
|
|
|
23
|
-
def call(env)
|
|
24
|
-
@app.call(env)
|
|
27
|
+
def call(env, *params)
|
|
28
|
+
response = @app.call(env, *params)
|
|
29
|
+
response[2] = ["Hi!"]
|
|
30
|
+
response
|
|
25
31
|
end
|
|
26
32
|
end
|
|
27
33
|
|
|
@@ -4,8 +4,8 @@ RSpec.describe "operation with path" do
|
|
|
4
4
|
class Test::Client < Evil::Client
|
|
5
5
|
operation do
|
|
6
6
|
http_method :get
|
|
7
|
-
path
|
|
8
|
-
response
|
|
7
|
+
path "users"
|
|
8
|
+
response :success, 200
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
operation :find_users
|
|
@@ -15,7 +15,7 @@ RSpec.describe "operation with path" do
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
operation :login do |settings|
|
|
18
|
-
path
|
|
18
|
+
path "login/#{settings.token}"
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
@@ -21,7 +21,7 @@ describe Evil::Client::DSL::Operations do
|
|
|
21
21
|
it "builds a proper schema" do
|
|
22
22
|
find_user = subject[:find_user]
|
|
23
23
|
|
|
24
|
-
expect(find_user[:method]).to eq "get"
|
|
24
|
+
expect(find_user[:method].call).to eq "get"
|
|
25
25
|
expect(find_user[:path].call(id: 7)).to eq "users/7"
|
|
26
26
|
expect(find_user[:security].call)
|
|
27
27
|
.to eq headers: { "authorization" => "Basic Zm9vOmJhcg==" }
|
|
@@ -6,8 +6,8 @@ RSpec.describe Evil::Client::Middleware::MergeSecurity do
|
|
|
6
6
|
@result = env
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
before { allow(app).to receive(:call) { |env
|
|
10
|
-
subject { stack.call env }
|
|
9
|
+
before { allow(app).to receive(:call) { |env, *| update! env } }
|
|
10
|
+
subject { stack.call env, {}, {} }
|
|
11
11
|
|
|
12
12
|
let(:env) do
|
|
13
13
|
{
|
|
@@ -7,8 +7,8 @@ RSpec.describe Evil::Client::Middleware::NormalizeHeaders do
|
|
|
7
7
|
@result = env
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
before { allow(app).to receive(:call) { |env
|
|
11
|
-
subject { stack.call env }
|
|
10
|
+
before { allow(app).to receive(:call) { |env, *| update! env } }
|
|
11
|
+
subject { stack.call env, {}, {} }
|
|
12
12
|
|
|
13
13
|
it "normalizes headers" do
|
|
14
14
|
subject
|
|
@@ -6,8 +6,8 @@ RSpec.describe Evil::Client::Middleware::StringifyForm do
|
|
|
6
6
|
@result = env
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
before { allow(app).to receive(:call) { |env
|
|
10
|
-
subject { stack.call env }
|
|
9
|
+
before { allow(app).to receive(:call) { |env, *| update! env } }
|
|
10
|
+
subject { stack.call env, {}, {} }
|
|
11
11
|
|
|
12
12
|
context "with a non-empty body:" do
|
|
13
13
|
let(:env) do
|
|
@@ -5,8 +5,8 @@ RSpec.describe Evil::Client::Middleware::StringifyJson do
|
|
|
5
5
|
|
|
6
6
|
let(:app) { double :app }
|
|
7
7
|
|
|
8
|
-
before { allow(app).to receive(:call) { |env
|
|
9
|
-
subject { described_class.new(app).call(env) }
|
|
8
|
+
before { allow(app).to receive(:call) { |env, *| update!(env) } }
|
|
9
|
+
subject { described_class.new(app).call(env, {}, {}) }
|
|
10
10
|
|
|
11
11
|
context "with a body:" do
|
|
12
12
|
let(:env) { { format: "json", body: { foo: :bar } } }
|
|
@@ -20,8 +20,8 @@ RSpec.describe Evil::Client::Middleware::StringifyMultipart do
|
|
|
20
20
|
@result = result
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
before { allow(app).to receive(:call) { |env
|
|
24
|
-
subject { described_class.new(app).call(env) }
|
|
23
|
+
before { allow(app).to receive(:call) { |env, *| update!(env) } }
|
|
24
|
+
subject { described_class.new(app).call(env, {}, {}) }
|
|
25
25
|
|
|
26
26
|
context "with a multipart format:" do
|
|
27
27
|
let(:body_string) { @result[:body_string] }
|
|
@@ -18,7 +18,7 @@ RSpec.describe Evil::Client::Operation::Request do
|
|
|
18
18
|
let(:schema) do
|
|
19
19
|
{
|
|
20
20
|
format: "multipart",
|
|
21
|
-
method: "patch",
|
|
21
|
+
method: proc { "patch" },
|
|
22
22
|
path: proc { |id:, **| "users/#{id}" },
|
|
23
23
|
files: Evil::Client::DSL::Files.new { |file:, **| add file },
|
|
24
24
|
security: Evil::Client::DSL::Security.new { basic_auth "qux", "abc" },
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: evil-client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrew Kozin (nepalez)
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2016-11-
|
|
12
|
+
date: 2016-11-29 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: evil-struct
|
|
@@ -167,13 +167,19 @@ files:
|
|
|
167
167
|
- lib/evil/client/connection.rb
|
|
168
168
|
- lib/evil/client/connection/net_http.rb
|
|
169
169
|
- lib/evil/client/dsl.rb
|
|
170
|
+
- lib/evil/client/dsl/base.rb
|
|
170
171
|
- lib/evil/client/dsl/files.rb
|
|
172
|
+
- lib/evil/client/dsl/headers.rb
|
|
173
|
+
- lib/evil/client/dsl/http_method.rb
|
|
171
174
|
- lib/evil/client/dsl/operation.rb
|
|
172
175
|
- lib/evil/client/dsl/operations.rb
|
|
176
|
+
- lib/evil/client/dsl/path.rb
|
|
177
|
+
- lib/evil/client/dsl/query.rb
|
|
173
178
|
- lib/evil/client/dsl/response.rb
|
|
174
179
|
- lib/evil/client/dsl/responses.rb
|
|
175
180
|
- lib/evil/client/dsl/scope.rb
|
|
176
181
|
- lib/evil/client/dsl/security.rb
|
|
182
|
+
- lib/evil/client/dsl/verifier.rb
|
|
177
183
|
- lib/evil/client/middleware.rb
|
|
178
184
|
- lib/evil/client/middleware/base.rb
|
|
179
185
|
- lib/evil/client/middleware/merge_security.rb
|