fictium 0.2.0 → 0.3.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/.travis.yml +9 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/lib/fictium/configurations/configuration.rb +2 -1
- data/lib/fictium/configurations/postman.rb +29 -0
- data/lib/fictium/evaluators/postman_evaluator.rb +59 -0
- data/lib/fictium/exporters/postman/schemas/2.1.0.json +1174 -0
- data/lib/fictium/exporters/postman/v2_exporter/action_formatter.rb +40 -0
- data/lib/fictium/exporters/postman/v2_exporter/body_formatter.rb +15 -0
- data/lib/fictium/exporters/postman/v2_exporter/folder_formatter.rb +27 -0
- data/lib/fictium/exporters/postman/v2_exporter/header_formatter.rb +15 -0
- data/lib/fictium/exporters/postman/v2_exporter/info_formatter.rb +26 -0
- data/lib/fictium/exporters/postman/v2_exporter/item_formatter.rb +29 -0
- data/lib/fictium/exporters/postman/v2_exporter/metadata_formatter.rb +17 -0
- data/lib/fictium/exporters/postman/v2_exporter/request_formatter.rb +89 -0
- data/lib/fictium/exporters/postman/v2_exporter/response_formatter.rb +50 -0
- data/lib/fictium/exporters/postman/v2_exporter.rb +61 -0
- data/lib/fictium/loader.rb +5 -0
- data/lib/fictium/poros/model.rb +3 -0
- data/lib/fictium/poros/postman_metadata.rb +5 -0
- data/lib/fictium/rspec/autocomplete/example.rb +12 -6
- data/lib/fictium/rspec/resources.rb +5 -0
- data/lib/fictium/version.rb +1 -1
- metadata +15 -1
@@ -0,0 +1,40 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class ActionFormatter
|
5
|
+
def format(action)
|
6
|
+
metadata_formatter.format(action, build_base(action))
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def build_base(action)
|
12
|
+
{
|
13
|
+
id: "#{action.method} - #{action.full_path}",
|
14
|
+
name: action.summary,
|
15
|
+
description: action.description,
|
16
|
+
request: request_formatter.format(action.default_example),
|
17
|
+
response: format_responses(action)
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def format_responses(action)
|
22
|
+
result = action.examples.map { |example| response_formatter.format(example) }
|
23
|
+
result.reject(&:blank?)
|
24
|
+
end
|
25
|
+
|
26
|
+
def request_formatter
|
27
|
+
@request_formatter ||= RequestFormatter.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def response_formatter
|
31
|
+
@response_formatter ||= ResponseFormatter.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def metadata_formatter
|
35
|
+
@metadata_formatter ||= MetadataFormatter.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class BodyFormatter
|
5
|
+
def format(http_subject, response: false)
|
6
|
+
body = http_subject[:body]
|
7
|
+
return if body.blank?
|
8
|
+
return body if response
|
9
|
+
|
10
|
+
{ mode: 'raw', raw: body }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class FolderFormatter
|
5
|
+
def format(item_formatter, resource)
|
6
|
+
{ name: resource.name }.tap do |result|
|
7
|
+
result[:description] = format_description(resource)
|
8
|
+
result[:item] = item_formatter.from_resource(resource)
|
9
|
+
metadata_formatter.format(resource, result)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def format_description(resource)
|
16
|
+
return resource.description if resource.description.present?
|
17
|
+
|
18
|
+
resource.summary
|
19
|
+
end
|
20
|
+
|
21
|
+
def metadata_formatter
|
22
|
+
@metadata_formatter ||= MetadataFormatter.new
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class HeaderFormatter
|
5
|
+
def format(http_subject)
|
6
|
+
[].tap do |header|
|
7
|
+
content = http_subject[:content_type]
|
8
|
+
header << { key: 'Content-Type', value: content } if content.present?
|
9
|
+
# TODO: Add the rest of the headers
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class InfoFormatter
|
5
|
+
POSTMAN_SCHEMA_URL = 'https://schema.getpostman.com/json/collection/v2.1.0/collection.json'.freeze
|
6
|
+
|
7
|
+
delegate :configuration, to: :Fictium
|
8
|
+
delegate :info, :postman, to: :configuration
|
9
|
+
|
10
|
+
def format(_document)
|
11
|
+
base_info.tap do |result|
|
12
|
+
result[:_postman_id] = postman.id if postman.id.present?
|
13
|
+
result[:description] = info.description if info.description.present?
|
14
|
+
result[:schema] = POSTMAN_SCHEMA_URL
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def base_info
|
21
|
+
{ name: info.title, version: info.version }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class ItemFormatter
|
5
|
+
def format(document)
|
6
|
+
document.resources.map do |resource|
|
7
|
+
folder_formatter.format(self, resource)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_resource(resource)
|
12
|
+
resource.actions.map do |action|
|
13
|
+
action_formatter.format(action)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def folder_formatter
|
20
|
+
@folder_formatter ||= FolderFormatter.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def action_formatter
|
24
|
+
@action_formatter ||= ActionFormatter.new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class MetadataFormatter
|
5
|
+
FIELDS = %i[event variable auth].freeze
|
6
|
+
|
7
|
+
def format(subject, result)
|
8
|
+
FIELDS.each do |field|
|
9
|
+
value = subject.postman.public_send(field)
|
10
|
+
result[field] = value if value.present?
|
11
|
+
end
|
12
|
+
result
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class RequestFormatter
|
5
|
+
PATH_VARIABLE = /{(?<var>[A-Z_\-][A-Z0-9_\-]*)}/i.freeze
|
6
|
+
|
7
|
+
def format(example)
|
8
|
+
{}.tap do |result|
|
9
|
+
result.merge!(
|
10
|
+
url: format_url(example),
|
11
|
+
method: example.action.method.to_s.downcase,
|
12
|
+
description: example.action.description,
|
13
|
+
header: header_formatter.format(example.request)
|
14
|
+
)
|
15
|
+
add_optional_values(example, result)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def format_url(example)
|
22
|
+
{
|
23
|
+
raw: full_path(example),
|
24
|
+
host: [api_url],
|
25
|
+
path: format_path(example),
|
26
|
+
query: format_query(example),
|
27
|
+
variable: format_variable(example)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def full_path(example)
|
32
|
+
"#{api_url}#{convert_path(example.action)}#{query_params_for(example)}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def convert_path(action)
|
36
|
+
action.full_path.gsub(PATH_VARIABLE, ':\k<var>')
|
37
|
+
end
|
38
|
+
|
39
|
+
def format_path(example)
|
40
|
+
path = convert_path(example.action).split('/')
|
41
|
+
path.shift
|
42
|
+
path
|
43
|
+
end
|
44
|
+
|
45
|
+
def query_params_for(example)
|
46
|
+
params = example.request[:query_parameters]
|
47
|
+
params.present? ? "?#{params.to_query}" : ''
|
48
|
+
end
|
49
|
+
|
50
|
+
def api_url
|
51
|
+
Fictium.configuration.postman.api_url
|
52
|
+
end
|
53
|
+
|
54
|
+
def format_query(example)
|
55
|
+
example.request[:query_parameters].map do |key, value|
|
56
|
+
result = { key: key, value: value }
|
57
|
+
description = example.action[:query][key] && example.action[:query][key][:description]
|
58
|
+
result[:description] = description if description.present?
|
59
|
+
result
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def format_variable(example)
|
64
|
+
[].tap do |result|
|
65
|
+
example.action[:path].each do |name, _|
|
66
|
+
data = { id: name, key: name }
|
67
|
+
value = example.request[:path_parameters][name.to_sym]
|
68
|
+
data[:value] = value if value.present?
|
69
|
+
result << data
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_optional_values(example, result)
|
75
|
+
body = body_formatter.format(example.request)
|
76
|
+
result[:body] = body if body.present?
|
77
|
+
end
|
78
|
+
|
79
|
+
def body_formatter
|
80
|
+
@body_formatter ||= BodyFormatter.new
|
81
|
+
end
|
82
|
+
|
83
|
+
def header_formatter
|
84
|
+
@header_formatter ||= HeaderFormatter.new
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Fictium
|
2
|
+
module Postman
|
3
|
+
class V2Exporter
|
4
|
+
class ResponseFormatter
|
5
|
+
def format(example)
|
6
|
+
base_info_for(example).tap do |result|
|
7
|
+
body = body_formatter.format(example.response, response: true)
|
8
|
+
header = header_formatter.format(example.response)
|
9
|
+
result[:body] = body if body.present?
|
10
|
+
result[:header] = header if header.present?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def base_info_for(example)
|
17
|
+
status = example.response[:status]
|
18
|
+
formatted_status = format_status(status, example)
|
19
|
+
{
|
20
|
+
originalRequest: request_formatter.format(example),
|
21
|
+
responseTime: nil,
|
22
|
+
status: format_status(status, example),
|
23
|
+
name: formatted_status,
|
24
|
+
code: status
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def request_formatter
|
29
|
+
@request_formatter ||= RequestFormatter.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def body_formatter
|
33
|
+
@body_formatter ||= BodyFormatter.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def header_formatter
|
37
|
+
@header_formatter ||= HeaderFormatter.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def format_status(status, example)
|
41
|
+
postman.example_formatter.call(status, example)
|
42
|
+
end
|
43
|
+
|
44
|
+
def postman
|
45
|
+
Fictium.configuration.postman
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'v2_exporter/action_formatter'
|
2
|
+
|
3
|
+
require_relative 'v2_exporter/info_formatter'
|
4
|
+
require_relative 'v2_exporter/item_formatter'
|
5
|
+
require_relative 'v2_exporter/metadata_formatter'
|
6
|
+
|
7
|
+
require_relative 'v2_exporter/folder_formatter'
|
8
|
+
|
9
|
+
require_relative 'v2_exporter/request_formatter'
|
10
|
+
require_relative 'v2_exporter/response_formatter'
|
11
|
+
require_relative 'v2_exporter/header_formatter'
|
12
|
+
require_relative 'v2_exporter/body_formatter'
|
13
|
+
|
14
|
+
module Fictium
|
15
|
+
module Postman
|
16
|
+
class V2Exporter
|
17
|
+
def export(document)
|
18
|
+
result = format_document(document)
|
19
|
+
validate!(result)
|
20
|
+
FileUtils.mkdir_p(File.dirname(export_file))
|
21
|
+
File.write(export_file, pretty_print? ? JSON.pretty_generate(result) : result.to_json)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def export_file
|
27
|
+
@export_file ||=
|
28
|
+
File.join(Fictium.configuration.export_path, 'postman', '2.1.0', 'collection.json')
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate!(result)
|
32
|
+
JSON::Validator.validate!(schema, result)
|
33
|
+
end
|
34
|
+
|
35
|
+
def schema
|
36
|
+
@schema ||= JSON.parse(File.read(File.join(__dir__, 'schemas', '2.1.0.json')))
|
37
|
+
end
|
38
|
+
|
39
|
+
def pretty_print?
|
40
|
+
Fictium.configuration.pretty_print
|
41
|
+
end
|
42
|
+
|
43
|
+
def format_document(document)
|
44
|
+
data = { info: info_formatter.format(document), item: item_formatter.format(document) }
|
45
|
+
metadata_formatter.format(document, data)
|
46
|
+
end
|
47
|
+
|
48
|
+
def metadata_formatter
|
49
|
+
@metadata_formatter ||= MetadataFormatter.new
|
50
|
+
end
|
51
|
+
|
52
|
+
def info_formatter
|
53
|
+
@info_formatter ||= InfoFormatter.new
|
54
|
+
end
|
55
|
+
|
56
|
+
def item_formatter
|
57
|
+
@item_formatter ||= ItemFormatter.new
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/fictium/loader.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require_relative 'configurations/configuration'
|
2
2
|
require_relative 'configurations/info'
|
3
3
|
require_relative 'configurations/api_blueprint'
|
4
|
+
require_relative 'configurations/postman'
|
4
5
|
|
5
6
|
require_relative 'evaluators/parameter_evaluator'
|
6
7
|
require_relative 'evaluators/schema_evaluator'
|
8
|
+
require_relative 'evaluators/postman_evaluator'
|
7
9
|
|
8
10
|
require_relative 'poros/model'
|
9
11
|
|
@@ -12,8 +14,11 @@ require_relative 'poros/document'
|
|
12
14
|
require_relative 'poros/example'
|
13
15
|
require_relative 'poros/resource'
|
14
16
|
|
17
|
+
require_relative 'poros/postman_metadata'
|
18
|
+
|
15
19
|
# Require default (OpenApi v3) exporter
|
16
20
|
require_relative 'exporters/open_api/v3_exporter'
|
17
21
|
|
18
22
|
# Other exporters created by this gem
|
19
23
|
require_relative 'exporters/api_blueprint_exporter'
|
24
|
+
require_relative 'exporters/postman/v2_exporter'
|
data/lib/fictium/poros/model.rb
CHANGED
@@ -8,7 +8,7 @@ module Fictium
|
|
8
8
|
example.response.merge!(
|
9
9
|
status: response.status,
|
10
10
|
body: response.body,
|
11
|
-
content_type: response.
|
11
|
+
content_type: response.media_type,
|
12
12
|
header: filter_header(response.header.to_h)
|
13
13
|
)
|
14
14
|
process_http_request(example, response.request)
|
@@ -25,17 +25,23 @@ module Fictium
|
|
25
25
|
|
26
26
|
def process_http_request(example, request)
|
27
27
|
example.request ||= {}
|
28
|
-
example.request.merge!(
|
29
|
-
content_type: request.content_type,
|
30
|
-
body: request.body.string,
|
31
|
-
header: filter_header(request.headers.to_h)
|
32
|
-
)
|
28
|
+
example.request.merge!(process_base_request(request))
|
33
29
|
extract_method(example, request)
|
34
30
|
return unless example.default?
|
35
31
|
|
36
32
|
autocomplete_params.extract_from_request(example.action, request)
|
37
33
|
end
|
38
34
|
|
35
|
+
def process_base_request(request)
|
36
|
+
{
|
37
|
+
content_type: request.content_type,
|
38
|
+
body: request.body.string,
|
39
|
+
header: filter_header(request.headers.to_h),
|
40
|
+
path_parameters: request.path_parameters.except(:controller, :action),
|
41
|
+
query_parameters: request.query_parameters
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
39
45
|
def extract_method(example, request)
|
40
46
|
action = example.action
|
41
47
|
action.method = request.method.downcase.to_sym if action.method.blank?
|
@@ -35,6 +35,11 @@ module Fictium
|
|
35
35
|
def resource_tags(*tags)
|
36
36
|
metadata[:fictium_resource].tags += tags
|
37
37
|
end
|
38
|
+
|
39
|
+
def postman_for(object, &block)
|
40
|
+
resource = metadata[:"fictium_#{object}"]
|
41
|
+
Fictium::PostmanEvaluator.new(resource).evaluate(&block)
|
42
|
+
end
|
38
43
|
end
|
39
44
|
end
|
40
45
|
end
|
data/lib/fictium/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fictium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ramiro Rojo
|
@@ -261,8 +261,10 @@ files:
|
|
261
261
|
- lib/fictium/configurations/api_blueprint.rb
|
262
262
|
- lib/fictium/configurations/configuration.rb
|
263
263
|
- lib/fictium/configurations/info.rb
|
264
|
+
- lib/fictium/configurations/postman.rb
|
264
265
|
- lib/fictium/engine.rb
|
265
266
|
- lib/fictium/evaluators/parameter_evaluator.rb
|
267
|
+
- lib/fictium/evaluators/postman_evaluator.rb
|
266
268
|
- lib/fictium/evaluators/schema_evaluator.rb
|
267
269
|
- lib/fictium/exporters/api_blueprint_exporter.rb
|
268
270
|
- lib/fictium/exporters/api_blueprint_exporter/action_formatter.rb
|
@@ -278,11 +280,23 @@ files:
|
|
278
280
|
- lib/fictium/exporters/open_api/v3_exporter/param_formatter.rb
|
279
281
|
- lib/fictium/exporters/open_api/v3_exporter/path_formatter.rb
|
280
282
|
- lib/fictium/exporters/open_api/v3_exporter/path_generator.rb
|
283
|
+
- lib/fictium/exporters/postman/schemas/2.1.0.json
|
284
|
+
- lib/fictium/exporters/postman/v2_exporter.rb
|
285
|
+
- lib/fictium/exporters/postman/v2_exporter/action_formatter.rb
|
286
|
+
- lib/fictium/exporters/postman/v2_exporter/body_formatter.rb
|
287
|
+
- lib/fictium/exporters/postman/v2_exporter/folder_formatter.rb
|
288
|
+
- lib/fictium/exporters/postman/v2_exporter/header_formatter.rb
|
289
|
+
- lib/fictium/exporters/postman/v2_exporter/info_formatter.rb
|
290
|
+
- lib/fictium/exporters/postman/v2_exporter/item_formatter.rb
|
291
|
+
- lib/fictium/exporters/postman/v2_exporter/metadata_formatter.rb
|
292
|
+
- lib/fictium/exporters/postman/v2_exporter/request_formatter.rb
|
293
|
+
- lib/fictium/exporters/postman/v2_exporter/response_formatter.rb
|
281
294
|
- lib/fictium/loader.rb
|
282
295
|
- lib/fictium/poros/action.rb
|
283
296
|
- lib/fictium/poros/document.rb
|
284
297
|
- lib/fictium/poros/example.rb
|
285
298
|
- lib/fictium/poros/model.rb
|
299
|
+
- lib/fictium/poros/postman_metadata.rb
|
286
300
|
- lib/fictium/poros/resource.rb
|
287
301
|
- lib/fictium/railtie.rb
|
288
302
|
- lib/fictium/rspec.rb
|