tomograph 2.5.1 → 3.0.1
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 +5 -5
- data/.github/workflows/ruby.yml +33 -0
- data/.rubocop.yml +1 -1
- data/.ruby-version +1 -1
- data/.tool-versions +2 -1
- data/.travis.yml +4 -3
- data/CHANGELOG.md +33 -0
- data/README.md +172 -164
- data/exe/tomograph +9 -48
- data/lib/tomograph/api_blueprint/crafter/yaml.rb +6 -10
- data/lib/tomograph/api_blueprint/crafter/yaml/action.rb +3 -3
- data/lib/tomograph/api_blueprint/drafter_4/yaml.rb +5 -9
- data/lib/tomograph/api_blueprint/drafter_4/yaml/action.rb +3 -3
- data/lib/tomograph/api_blueprint/json_schema.rb +2 -2
- data/lib/tomograph/tomogram.rb +6 -9
- data/lib/tomograph/tomogram/action.rb +4 -4
- data/lib/tomograph/version.rb +1 -1
- data/tomograph.gemspec +7 -8
- metadata +29 -65
- data/lib/tomograph/api_blueprint/drafter_3/yaml.rb +0 -128
- data/lib/tomograph/api_blueprint/drafter_3/yaml/action.rb +0 -65
@@ -1,128 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'tomograph/api_blueprint/drafter_3/yaml/action'
|
3
|
-
require 'tomograph/tomogram/action'
|
4
|
-
|
5
|
-
module Tomograph
|
6
|
-
module ApiBlueprint
|
7
|
-
class Drafter3
|
8
|
-
class Yaml
|
9
|
-
def initialize(prefix, apib_path, drafter_yaml_path)
|
10
|
-
@prefix = prefix
|
11
|
-
@documentation = if apib_path
|
12
|
-
YAML.safe_load(`drafter #{apib_path}`)
|
13
|
-
elsif drafter_yaml_path
|
14
|
-
YAML.safe_load(File.read(drafter_yaml_path))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def groups
|
19
|
-
@groups ||= @documentation['content'][0]['content'].inject([]) do |result_groups, group|
|
20
|
-
next result_groups unless group?(group)
|
21
|
-
result_groups.push(group)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def group?(group)
|
26
|
-
group['element'] != 'copy' && # Element is a human readable text
|
27
|
-
group['meta']['classes'][0] == 'resourceGroup' # skip Data Structures
|
28
|
-
end
|
29
|
-
|
30
|
-
def resources
|
31
|
-
@resources ||= groups.inject([]) do |result_groups, group|
|
32
|
-
result_groups.push(group['content'].inject([]) do |result_resources, resource|
|
33
|
-
next result_resources unless resource?(resource)
|
34
|
-
result_resources.push('resource' => resource, 'resource_path' => resource_path(resource))
|
35
|
-
end)
|
36
|
-
end.flatten
|
37
|
-
end
|
38
|
-
|
39
|
-
def resource?(resource)
|
40
|
-
resource['element'] != 'copy' # Element is a human readable text
|
41
|
-
end
|
42
|
-
|
43
|
-
def resource_path(resource)
|
44
|
-
resource['attributes'] && resource['attributes']['href']
|
45
|
-
end
|
46
|
-
|
47
|
-
def transitions
|
48
|
-
@transitions ||= resources.inject([]) do |result_resources, resource|
|
49
|
-
result_resources.push(resource['resource']['content'].inject([]) do |result_transitions, transition|
|
50
|
-
next result_transitions unless transition?(transition)
|
51
|
-
result_transitions.push(transition_hash(transition, resource))
|
52
|
-
end)
|
53
|
-
end.flatten
|
54
|
-
end
|
55
|
-
|
56
|
-
def transition?(transition)
|
57
|
-
transition['element'] == 'transition'
|
58
|
-
end
|
59
|
-
|
60
|
-
def transition_hash(transition, resource)
|
61
|
-
{
|
62
|
-
'transition' => transition,
|
63
|
-
'transition_path' => transition_path(transition, resource['resource_path']),
|
64
|
-
'resource' => resource['resource_path']
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
def transition_path(transition, resource_path)
|
69
|
-
transition['attributes'] && transition['attributes']['href'] || resource_path
|
70
|
-
end
|
71
|
-
|
72
|
-
def without_group_actions
|
73
|
-
transitions.inject([]) do |result_transition, transition|
|
74
|
-
result_transition.push(transition['transition']['content'].inject([]) do |result_contents, content|
|
75
|
-
next result_contents unless action?(content)
|
76
|
-
result_contents.push(Tomograph::ApiBlueprint::Drafter3::Yaml::Action.new(
|
77
|
-
content['content'],
|
78
|
-
transition['transition_path'],
|
79
|
-
transition['resource']
|
80
|
-
))
|
81
|
-
end)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def action?(content)
|
86
|
-
content['element'] == 'httpTransaction'
|
87
|
-
end
|
88
|
-
|
89
|
-
def actions
|
90
|
-
@actions ||= without_group_actions
|
91
|
-
.flatten
|
92
|
-
.group_by { |action| "#{action.method} #{action.path}" }.map do |_key, related_actions|
|
93
|
-
action_hash(related_actions)
|
94
|
-
end.flatten
|
95
|
-
end
|
96
|
-
|
97
|
-
def action_hash(related_actions)
|
98
|
-
{
|
99
|
-
path: "#{@prefix}#{related_actions.first.path}",
|
100
|
-
method: related_actions.first.method,
|
101
|
-
content_type: related_actions.first.content_type,
|
102
|
-
request: related_actions.first.request,
|
103
|
-
responses: related_actions.map(&:responses).flatten,
|
104
|
-
resource: related_actions.first.resource
|
105
|
-
}
|
106
|
-
end
|
107
|
-
|
108
|
-
def to_tomogram
|
109
|
-
@tomogram ||= actions.inject([]) do |result, action|
|
110
|
-
result.push(Tomograph::Tomogram::Action.new(action))
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def to_resources
|
115
|
-
return @to_resources if @to_resources
|
116
|
-
|
117
|
-
@to_resources = actions.group_by { |action| action[:resource] }
|
118
|
-
@to_resources = @to_resources.inject({}) do |res, related_actions|
|
119
|
-
requests = related_actions[1].map do |action|
|
120
|
-
"#{action[:method]} #{action[:path]}"
|
121
|
-
end
|
122
|
-
res.merge(related_actions[1].first[:resource] => requests)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'tomograph/tomogram/action'
|
2
|
-
|
3
|
-
module Tomograph
|
4
|
-
module ApiBlueprint
|
5
|
-
class Drafter3
|
6
|
-
class Yaml
|
7
|
-
class Action
|
8
|
-
def initialize(content, path, resource)
|
9
|
-
@content = content
|
10
|
-
@path = path
|
11
|
-
@resource = resource
|
12
|
-
end
|
13
|
-
|
14
|
-
attr_reader :path, :resource
|
15
|
-
|
16
|
-
def method
|
17
|
-
@method ||= @content.first['attributes']['method']
|
18
|
-
end
|
19
|
-
|
20
|
-
def content_type
|
21
|
-
if @content.first['attributes'].has_key?('headers')
|
22
|
-
@content.first['attributes']['headers']['content'][0]['content']['key']['content'] == 'Content-Type' ?
|
23
|
-
@content.first['attributes']['headers']['content'][0]['content']['value']['content'] : nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def request
|
28
|
-
return @request if @request
|
29
|
-
|
30
|
-
request_action = @content.find { |el| el['element'] == 'httpRequest' }
|
31
|
-
@request = json_schema(request_action['content'])
|
32
|
-
end
|
33
|
-
|
34
|
-
def json_schema(actions)
|
35
|
-
schema_node = actions.find do |action|
|
36
|
-
action && action['element'] == 'asset' && action['attributes']['contentType'] == 'application/schema+json'
|
37
|
-
end
|
38
|
-
return {} unless schema_node
|
39
|
-
|
40
|
-
MultiJson.load(schema_node['content'])
|
41
|
-
rescue MultiJson::ParseError => e
|
42
|
-
puts "[Tomograph] Error while parsing #{e}. skipping..."
|
43
|
-
{}
|
44
|
-
end
|
45
|
-
|
46
|
-
def responses
|
47
|
-
return @responses if @responses
|
48
|
-
|
49
|
-
@responses = @content.select do |response|
|
50
|
-
response['element'] == 'httpResponse' && response['attributes']
|
51
|
-
end
|
52
|
-
@responses = @responses.map do |response|
|
53
|
-
{
|
54
|
-
'status' => response['attributes']['statusCode'],
|
55
|
-
'body' => json_schema(response['content']),
|
56
|
-
'content-type' => response['attributes'].has_key?('headers') ?
|
57
|
-
response['attributes']['headers']['content'][0]['content']['value']['content'] : nil
|
58
|
-
}
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|