webspicy 0.9.1 → 0.10.0
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/examples/restful/Gemfile.lock +2 -2
- data/examples/restful/app.rb +17 -2
- data/examples/restful/webspicy/todo/postFile.yml +37 -0
- data/examples/restful/webspicy/todo/todos.csv +4 -0
- data/lib/webspicy.rb +4 -1
- data/lib/webspicy/client/http_client.rb +13 -6
- data/lib/webspicy/client/rack_test_client.rb +12 -7
- data/lib/webspicy/file_upload.rb +35 -0
- data/lib/webspicy/formaldoc.fio +9 -1
- data/lib/webspicy/resource.rb +12 -1
- data/lib/webspicy/resource/service/test_case.rb +9 -1
- data/lib/webspicy/version.rb +2 -2
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 297f6b02ba888bdb7d04063e70ab34a53d572c64
|
4
|
+
data.tar.gz: 551b6a4a2e66adfc8274f949943ede49e8d926a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 910823668c7fda4b201c4508ac7c4ac4b43f026970e40c43569fff53756ca4bd2f6d6241e4ad07285aafce3a89628f414ba7f5997b6c6411745200b2791ad0b9
|
7
|
+
data.tar.gz: 2a8769e405659e083e37cdcd0b28125ea3eccfd1783653822e5ce2dc477f737cb72e2ca22d1bc4fcaa960e4e03606773d334997e2941bfcaafab55adae29a22c
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../..
|
3
3
|
specs:
|
4
|
-
webspicy (0.
|
4
|
+
webspicy (0.10.0)
|
5
5
|
finitio (>= 0.5.2)
|
6
6
|
http (~> 2)
|
7
7
|
path (~> 1.3)
|
@@ -16,7 +16,7 @@ GEM
|
|
16
16
|
public_suffix (>= 2.0.2, < 4.0)
|
17
17
|
citrus (3.0.2)
|
18
18
|
diff-lcs (1.3)
|
19
|
-
domain_name (0.5.
|
19
|
+
domain_name (0.5.20180417)
|
20
20
|
unf (>= 0.0.5, < 1.0.0)
|
21
21
|
finitio (0.5.2)
|
22
22
|
citrus (>= 2.4, < 4.0)
|
data/examples/restful/app.rb
CHANGED
@@ -119,7 +119,22 @@ def loaded_body
|
|
119
119
|
when /csv/
|
120
120
|
csv = ::CSV.new(request.body.read, :headers => true, :header_converters => :symbol)
|
121
121
|
csv.map {|row| row.to_hash }
|
122
|
+
when /multipart\/form-data/
|
123
|
+
file_body params[:file]
|
122
124
|
else
|
123
|
-
halt [415,{},["Unsupported content type"]]
|
125
|
+
halt [415,{},["Unsupported content type: `#{ctype}`"]]
|
124
126
|
end
|
125
|
-
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def file_body(file)
|
130
|
+
ctype = Path(file[:filename] || file["filename"]).extname
|
131
|
+
ctype = (file[:type] || file["type"]) if ctype.nil? or ctype.empty?
|
132
|
+
case ctype
|
133
|
+
when /csv/
|
134
|
+
str = file[:tempfile].read
|
135
|
+
csv = ::CSV.new(str, :headers => true, :header_converters => :symbol)
|
136
|
+
csv.map {|row| row.to_hash }
|
137
|
+
else
|
138
|
+
halt [415,{},["Unsupported content type: `#{ctype}`\n#{file.inspect}"]]
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
name: |-
|
3
|
+
Todo
|
4
|
+
|
5
|
+
url: |-
|
6
|
+
/todo/
|
7
|
+
|
8
|
+
services:
|
9
|
+
- method: |-
|
10
|
+
POST
|
11
|
+
|
12
|
+
description: |-
|
13
|
+
Creates new todo items through a CSV file upload
|
14
|
+
|
15
|
+
preconditions: |-
|
16
|
+
|
17
|
+
input_schema: |-
|
18
|
+
.
|
19
|
+
|
20
|
+
output_schema: |-
|
21
|
+
{ count: Integer }
|
22
|
+
|
23
|
+
error_schema: |-
|
24
|
+
ErrorSchema
|
25
|
+
|
26
|
+
examples:
|
27
|
+
|
28
|
+
- description: |-
|
29
|
+
when requested with a valid CSV file
|
30
|
+
file_upload:
|
31
|
+
path: ./todos.csv
|
32
|
+
content_type: "text/csv"
|
33
|
+
expected:
|
34
|
+
content_type: application/json
|
35
|
+
status: 201
|
36
|
+
assert:
|
37
|
+
- "pathFD('', count: 3)"
|
data/lib/webspicy.rb
CHANGED
@@ -14,6 +14,7 @@ module Webspicy
|
|
14
14
|
###
|
15
15
|
|
16
16
|
require 'webspicy/configuration'
|
17
|
+
require 'webspicy/file_upload'
|
17
18
|
require 'webspicy/scope'
|
18
19
|
require 'webspicy/client'
|
19
20
|
require 'webspicy/client/http_client'
|
@@ -46,7 +47,9 @@ module Webspicy
|
|
46
47
|
|
47
48
|
def resource(raw, file = nil, scope = default_scope)
|
48
49
|
with_scope(scope) do
|
49
|
-
FORMALDOC["Resource"].dress(raw)
|
50
|
+
r = FORMALDOC["Resource"].dress(raw)
|
51
|
+
r.located_at!(file) if file
|
52
|
+
r
|
50
53
|
end
|
51
54
|
end
|
52
55
|
module_function :resource
|
@@ -23,7 +23,8 @@ module Webspicy
|
|
23
23
|
|
24
24
|
# Instantiate the parameters
|
25
25
|
headers = test_case.headers
|
26
|
-
params
|
26
|
+
params = test_case.dress_params? ? service.dress_params(test_case.params) : test_case.params
|
27
|
+
body = test_case.body || test_case.located_file_upload
|
27
28
|
|
28
29
|
# Instantiate the url and strip parameters
|
29
30
|
url, params = resource.instantiate_url(params)
|
@@ -32,7 +33,7 @@ module Webspicy
|
|
32
33
|
url = scope.to_real_url(url, test_case)
|
33
34
|
|
34
35
|
# Invoke the service now
|
35
|
-
api.public_send(service.method.to_s.downcase.to_sym, url, params, headers,
|
36
|
+
api.public_send(service.method.to_s.downcase.to_sym, url, params, headers, body)
|
36
37
|
|
37
38
|
# Return the result
|
38
39
|
Resource::Service::Invocation.new(service, test_case, api.last_response, self)
|
@@ -70,12 +71,18 @@ module Webspicy
|
|
70
71
|
url = url + "?" + Rack::Utils.build_query(params) if body && !params.empty?
|
71
72
|
|
72
73
|
headers ||= {}
|
73
|
-
headers['Content-Type'] ||= 'application/json'
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
75
|
+
case body
|
76
|
+
when NilClass
|
77
|
+
headers['Content-Type'] ||= 'application/json'
|
78
78
|
@last_response = HTTP[headers].post(url, body: params.to_json)
|
79
|
+
when FileUpload
|
80
|
+
@last_response = HTTP[headers].post(url, form: {
|
81
|
+
body.param_name.to_sym => HTTP::FormData::File.new(body.path, content_type: body.content_type)
|
82
|
+
})
|
83
|
+
else
|
84
|
+
headers['Content-Type'] ||= 'application/json'
|
85
|
+
@last_response = HTTP[headers].post(url, body: body)
|
79
86
|
end
|
80
87
|
|
81
88
|
Webspicy.debug("Headers: #{@last_response.headers.to_hash}")
|
@@ -16,8 +16,8 @@ module Webspicy
|
|
16
16
|
|
17
17
|
# Instantiate the parameters
|
18
18
|
headers = test_case.headers.dup
|
19
|
-
params
|
20
|
-
body
|
19
|
+
params = test_case.dress_params? ? service.dress_params(test_case.params) : test_case.params
|
20
|
+
body = test_case.body || test_case.located_file_upload
|
21
21
|
|
22
22
|
# Instantiate the url and strip parameters
|
23
23
|
url, params = resource.instantiate_url(params)
|
@@ -94,12 +94,17 @@ module Webspicy
|
|
94
94
|
|
95
95
|
url = url + "?" + Rack::Utils.build_query(params) if body && !params.empty?
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
handler.post(url, body)
|
101
|
-
else
|
97
|
+
case body
|
98
|
+
when NilClass
|
99
|
+
Webspicy.info("POST #{url} -- #{params.inspect} -- #{headers.inspect}")
|
102
100
|
handler.post(url, params.to_json, {"CONTENT_TYPE" => "application/json"})
|
101
|
+
when FileUpload
|
102
|
+
file = Rack::Test::UploadedFile.new(body.path, body.content_type)
|
103
|
+
Webspicy.info("POST #{url} -- #{params.inspect} -- #{body}")
|
104
|
+
handler.post(url, body.param_name.to_sym => file)
|
105
|
+
else
|
106
|
+
Webspicy.info("POST #{url} -- #{params.inspect} -- #{body.inspect[0..25]}")
|
107
|
+
handler.post(url, body)
|
103
108
|
end
|
104
109
|
@last_response = handler.last_response
|
105
110
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Webspicy
|
2
|
+
class FileUpload
|
3
|
+
|
4
|
+
def initialize(raw)
|
5
|
+
@path = raw[:path]
|
6
|
+
@content_type = raw[:content_type]
|
7
|
+
@param_name = raw[:param_name] || "file"
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :path, :content_type, :param_name
|
11
|
+
|
12
|
+
def self.info(raw)
|
13
|
+
new(raw)
|
14
|
+
end
|
15
|
+
|
16
|
+
def locate(resource)
|
17
|
+
FileUpload.new({
|
18
|
+
path: resource.locate(path),
|
19
|
+
content_type: content_type
|
20
|
+
})
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_info
|
24
|
+
{ path: path.to_s,
|
25
|
+
content_type: content_type,
|
26
|
+
param_name: param_name }
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
"FileUpload(#{to_info})"
|
31
|
+
end
|
32
|
+
alias :inspect :to_s
|
33
|
+
|
34
|
+
end # class FileUpload
|
35
|
+
end # module Webspicy
|
data/lib/webspicy/formaldoc.fio
CHANGED
@@ -6,6 +6,13 @@ Schema =
|
|
6
6
|
\( s | ::Webspicy.schema(s) )
|
7
7
|
\( s | raise "Unsupported" )
|
8
8
|
|
9
|
+
FileUpload =
|
10
|
+
.Webspicy::FileUpload <info> {
|
11
|
+
path : String
|
12
|
+
content_type : String
|
13
|
+
param_name :? String
|
14
|
+
}
|
15
|
+
|
9
16
|
Resource =
|
10
17
|
.Webspicy::Resource <info> {
|
11
18
|
name: String
|
@@ -31,9 +38,10 @@ TestCase =
|
|
31
38
|
.Webspicy::Resource::Service::TestCase <info> {
|
32
39
|
description : String
|
33
40
|
dress_params :? Boolean
|
34
|
-
params
|
41
|
+
params :? Params
|
35
42
|
headers :? .Hash
|
36
43
|
body :? String
|
44
|
+
file_upload :? FileUpload
|
37
45
|
seeds :? String
|
38
46
|
requester :? String
|
39
47
|
expected: {
|
data/lib/webspicy/resource.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Webspicy
|
2
2
|
class Resource
|
3
3
|
|
4
|
-
def initialize(raw)
|
4
|
+
def initialize(raw, location = nil)
|
5
5
|
@raw = raw
|
6
|
+
@location = location
|
6
7
|
bind_services
|
7
8
|
end
|
8
9
|
|
@@ -10,6 +11,16 @@ module Webspicy
|
|
10
11
|
new(raw)
|
11
12
|
end
|
12
13
|
|
14
|
+
def located_at!(location)
|
15
|
+
@location = Path(location)
|
16
|
+
end
|
17
|
+
|
18
|
+
def locate(relative_path)
|
19
|
+
file = @location.parent/relative_path
|
20
|
+
raise "File not found: #{file}" unless file.exists?
|
21
|
+
file
|
22
|
+
end
|
23
|
+
|
13
24
|
def url
|
14
25
|
@raw[:url]
|
15
26
|
end
|
@@ -34,13 +34,21 @@ module Webspicy
|
|
34
34
|
alias :dress_params? :dress_params
|
35
35
|
|
36
36
|
def params
|
37
|
-
@raw[:params]
|
37
|
+
@raw[:params] || {}
|
38
38
|
end
|
39
39
|
|
40
40
|
def body
|
41
41
|
@raw[:body]
|
42
42
|
end
|
43
43
|
|
44
|
+
def file_upload
|
45
|
+
@raw[:file_upload]
|
46
|
+
end
|
47
|
+
|
48
|
+
def located_file_upload
|
49
|
+
file_upload ? file_upload.locate(resource) : nil
|
50
|
+
end
|
51
|
+
|
44
52
|
def expected_content_type
|
45
53
|
@raw[:expected].fetch(:content_type){ 'application/json' }
|
46
54
|
end
|
data/lib/webspicy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webspicy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
@@ -146,13 +146,16 @@ files:
|
|
146
146
|
- examples/restful/webspicy/todo/options.yml
|
147
147
|
- examples/restful/webspicy/todo/patchTodo.yml
|
148
148
|
- examples/restful/webspicy/todo/postCsv.yml
|
149
|
+
- examples/restful/webspicy/todo/postFile.yml
|
149
150
|
- examples/restful/webspicy/todo/postTodos.yml
|
151
|
+
- examples/restful/webspicy/todo/todos.csv
|
150
152
|
- lib/webspicy.rb
|
151
153
|
- lib/webspicy/checker.rb
|
152
154
|
- lib/webspicy/client.rb
|
153
155
|
- lib/webspicy/client/http_client.rb
|
154
156
|
- lib/webspicy/client/rack_test_client.rb
|
155
157
|
- lib/webspicy/configuration.rb
|
158
|
+
- lib/webspicy/file_upload.rb
|
156
159
|
- lib/webspicy/formaldoc.fio
|
157
160
|
- lib/webspicy/resource.rb
|
158
161
|
- lib/webspicy/resource/service.rb
|