tomograph 2.1.0 → 2.2.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/.gitignore +1 -0
- data/CHANGELOG.md +11 -0
- data/README.md +22 -0
- data/exe/tomograph +53 -0
- data/lib/tomograph/api_blueprint/json_schema.rb +36 -0
- data/lib/tomograph/api_blueprint/yaml.rb +1 -1
- data/lib/tomograph/tomogram.rb +19 -7
- data/lib/tomograph/tomogram/action.rb +4 -3
- data/lib/tomograph/version.rb +1 -1
- data/script/update_json_fixtures +11 -0
- data/tomograph.gemspec +3 -1
- metadata +29 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9b621ab5616dfc37ca938313d8b47e53ef40ca37
|
|
4
|
+
data.tar.gz: 848d61604096bddf13e6248d4adbe5eeeab9f205
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d01849bf00acd6939d1a2681083d22d846eed46cf2fca03948cc30de8bf6c83f7eec7eba0f4abba331df4c6abf37772bba6c1a0658243a5661b5edcab07b658a
|
|
7
|
+
data.tar.gz: e9c176086865d22445808b337111dd80a831418dfdb555a6535cd5191bf46898586cb51bd5187e089fff896af9da34411b4045be799b8d6f450dabe7557f3d47
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Change log
|
|
2
2
|
|
|
3
|
+
### 2.2.0 - 2018-07-05
|
|
4
|
+
|
|
5
|
+
* API changes
|
|
6
|
+
* Tomogram: add to_a method
|
|
7
|
+
* deprecations
|
|
8
|
+
* Tomogram: to_hash method
|
|
9
|
+
* features
|
|
10
|
+
* add command-line tool
|
|
11
|
+
* include Action's "resource" in serialization to JSON
|
|
12
|
+
* add support for loading Tomogram JSON
|
|
13
|
+
|
|
3
14
|
### 2.1.0 - 2018-03-16
|
|
4
15
|
|
|
5
16
|
* features
|
data/README.md
CHANGED
|
@@ -35,6 +35,18 @@ require 'tomograph'
|
|
|
35
35
|
tomogram = Tomograph::Tomogram.new(apib_path: '/path/to/doc.apib')
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
### Command line tool
|
|
39
|
+
|
|
40
|
+
The command line tool allows you to convert files from API Blueprint or API Elements to JSON Schema.
|
|
41
|
+
```
|
|
42
|
+
tomograph doc.apib doc.json
|
|
43
|
+
```
|
|
44
|
+
See
|
|
45
|
+
```
|
|
46
|
+
tomograph -h
|
|
47
|
+
```
|
|
48
|
+
for details on usage.
|
|
49
|
+
|
|
38
50
|
## Convert
|
|
39
51
|
|
|
40
52
|
```ruby
|
|
@@ -205,6 +217,12 @@ or
|
|
|
205
217
|
Tomograph::Tomogram.new(prefix: '/api/v2', drafter_yaml_path: '/path/to/doc.yaml')
|
|
206
218
|
```
|
|
207
219
|
|
|
220
|
+
or
|
|
221
|
+
|
|
222
|
+
```ruby
|
|
223
|
+
Tomograph::Tomogram.new(prefix: '/api/v2', tomogram_json_path: '/path/to/doc.json')
|
|
224
|
+
```
|
|
225
|
+
|
|
208
226
|
### apib_path
|
|
209
227
|
|
|
210
228
|
Path to API Blueprint documentation. There must be an installed [drafter](https://github.com/apiaryio/drafter) to parse it.
|
|
@@ -213,6 +231,10 @@ Path to API Blueprint documentation. There must be an installed [drafter](https:
|
|
|
213
231
|
|
|
214
232
|
Path to API Blueprint documentation pre-parsed with `drafter` and saved to a YAML file.
|
|
215
233
|
|
|
234
|
+
### tomogram_json_path
|
|
235
|
+
|
|
236
|
+
Path to API Blueprint documentation converted with `tomograph` to a JSON file.
|
|
237
|
+
|
|
216
238
|
### prefix
|
|
217
239
|
|
|
218
240
|
Default empty String. Prefix of API requests. Example: `'/api'`.
|
data/exe/tomograph
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'methadone'
|
|
4
|
+
|
|
5
|
+
require 'tomograph'
|
|
6
|
+
require 'tomograph/version'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
include Methadone::Main
|
|
10
|
+
include Methadone::CLILogging
|
|
11
|
+
|
|
12
|
+
version Tomograph::VERSION
|
|
13
|
+
description 'Converts API Blueprint to JSON Schema'
|
|
14
|
+
on('-f INPUT_FORMAT', '--format', 'Force input format: "apib" or "yaml". Default: detect by file extension.')
|
|
15
|
+
arg :input, 'path/to/doc.apib (API Blueprint) or path/to/doc.yaml (API Elements)'
|
|
16
|
+
arg :output, 'path/to/doc.json'
|
|
17
|
+
|
|
18
|
+
main do |input, output|
|
|
19
|
+
opt_format = options['format']
|
|
20
|
+
format = case opt_format && opt_format.downcase
|
|
21
|
+
when 'apib'
|
|
22
|
+
:apib
|
|
23
|
+
when 'yaml'
|
|
24
|
+
:yaml
|
|
25
|
+
when nil
|
|
26
|
+
case File.extname(input).downcase
|
|
27
|
+
when '.apib'
|
|
28
|
+
:apib
|
|
29
|
+
when '.yaml'
|
|
30
|
+
:yaml
|
|
31
|
+
else
|
|
32
|
+
fail 'Unsupported input file extension!'
|
|
33
|
+
end
|
|
34
|
+
else
|
|
35
|
+
fail 'Unsupported input format!'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
format_key = case format
|
|
39
|
+
when :apib
|
|
40
|
+
:apib_path
|
|
41
|
+
when :yaml
|
|
42
|
+
:drafter_yaml_path
|
|
43
|
+
else
|
|
44
|
+
fail 'Unimplemented!'
|
|
45
|
+
end
|
|
46
|
+
tomogram = Tomograph::Tomogram.new({format_key => input})
|
|
47
|
+
File.open(output, 'w') do |f|
|
|
48
|
+
f.write(tomogram.to_json)
|
|
49
|
+
end
|
|
50
|
+
0
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
go!
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'tomograph/tomogram/action'
|
|
2
|
+
|
|
3
|
+
module Tomograph
|
|
4
|
+
module ApiBlueprint
|
|
5
|
+
class JsonSchema
|
|
6
|
+
def initialize(prefix, json_schema_path)
|
|
7
|
+
@prefix = prefix
|
|
8
|
+
@documentation = MultiJson.load(File.read(json_schema_path))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def to_tomogram
|
|
12
|
+
@tomogram ||= @documentation.inject([]) do |result, action|
|
|
13
|
+
result.push(Tomograph::Tomogram::Action.new(
|
|
14
|
+
path: "#{@prefix}#{action['path']}",
|
|
15
|
+
method: action['method'],
|
|
16
|
+
content_type: action['content-type'],
|
|
17
|
+
request: action['request'],
|
|
18
|
+
responses: action['responses'],
|
|
19
|
+
resource: action['resource']))
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_resources
|
|
24
|
+
return @to_resources if @to_resources
|
|
25
|
+
|
|
26
|
+
@to_resources = @documentation.group_by { |action| action['resource'] }
|
|
27
|
+
@to_resources = @to_resources.each_with_object({}) do |(resource, actions), resource_map|
|
|
28
|
+
requests = actions.map do |action|
|
|
29
|
+
"#{action['method']} #{action['path']}"
|
|
30
|
+
end
|
|
31
|
+
resource_map[resource] = requests
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/tomograph/tomogram.rb
CHANGED
|
@@ -1,26 +1,38 @@
|
|
|
1
1
|
require 'multi_json'
|
|
2
2
|
require 'tomograph/path'
|
|
3
|
+
require 'tomograph/api_blueprint/json_schema'
|
|
3
4
|
require 'tomograph/api_blueprint/yaml'
|
|
4
5
|
|
|
5
6
|
module Tomograph
|
|
6
7
|
class Tomogram
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
extend Gem::Deprecate
|
|
9
|
+
|
|
10
|
+
def initialize(prefix: '', apib_path: nil, drafter_yaml_path: nil, tomogram_json_path: nil)
|
|
11
|
+
@documentation = if tomogram_json_path
|
|
12
|
+
Tomograph::ApiBlueprint::JsonSchema.new(prefix, tomogram_json_path)
|
|
13
|
+
else
|
|
14
|
+
Tomograph::ApiBlueprint::Yaml.new(prefix, apib_path, drafter_yaml_path)
|
|
15
|
+
end
|
|
9
16
|
@prefix = prefix
|
|
10
17
|
end
|
|
11
18
|
|
|
19
|
+
def to_a
|
|
20
|
+
@actions ||= @documentation.to_tomogram
|
|
21
|
+
end
|
|
22
|
+
|
|
12
23
|
def to_hash
|
|
13
|
-
|
|
24
|
+
to_a.map(&:to_hash)
|
|
14
25
|
end
|
|
26
|
+
deprecate :to_hash, 'to_a with method access', 2018, 8
|
|
15
27
|
|
|
16
28
|
def to_json
|
|
17
|
-
MultiJson.dump(to_hash)
|
|
29
|
+
MultiJson.dump(to_a.map(&:to_hash), pretty: true)
|
|
18
30
|
end
|
|
19
31
|
|
|
20
32
|
def find_request(method:, path:)
|
|
21
33
|
path = Tomograph::Path.new(path).to_s
|
|
22
34
|
|
|
23
|
-
|
|
35
|
+
to_a.find do |action|
|
|
24
36
|
action.method == method && action.path.match(path)
|
|
25
37
|
end
|
|
26
38
|
end
|
|
@@ -28,13 +40,13 @@ module Tomograph
|
|
|
28
40
|
def find_request_with_content_type(method:, path:, content_type:)
|
|
29
41
|
path = Tomograph::Path.new(path).to_s
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
to_a.find do |action|
|
|
32
44
|
action.method == method && action.path.match(path) && action.content_type == content_type
|
|
33
45
|
end
|
|
34
46
|
end
|
|
35
47
|
|
|
36
48
|
def to_resources
|
|
37
|
-
@documentation.to_resources
|
|
49
|
+
@resources ||= @documentation.to_resources
|
|
38
50
|
end
|
|
39
51
|
|
|
40
52
|
def prefix_match?(raw_path)
|
|
@@ -3,7 +3,7 @@ require 'tomograph/path'
|
|
|
3
3
|
module Tomograph
|
|
4
4
|
class Tomogram
|
|
5
5
|
class Action
|
|
6
|
-
attr_reader :path, :method, :content_type, :request, :responses
|
|
6
|
+
attr_reader :path, :method, :content_type, :request, :responses, :resource
|
|
7
7
|
|
|
8
8
|
def initialize(path:, method:, content_type:, request:, responses:, resource:)
|
|
9
9
|
@path ||= Tomograph::Path.new(path)
|
|
@@ -24,9 +24,10 @@ module Tomograph
|
|
|
24
24
|
@action ||= {
|
|
25
25
|
'path' => path,
|
|
26
26
|
'method' => method,
|
|
27
|
-
'content-type'
|
|
27
|
+
'content-type' => content_type,
|
|
28
28
|
'request' => request,
|
|
29
|
-
'responses' => responses
|
|
29
|
+
'responses' => responses,
|
|
30
|
+
'resource' => resource
|
|
30
31
|
}
|
|
31
32
|
end
|
|
32
33
|
end
|
data/lib/tomograph/version.rb
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
def system!(*args)
|
|
4
|
+
puts "+ #{args.join(' ')}"
|
|
5
|
+
system(*args) || abort("\n== Command #{args} failed ==")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
Dir.glob('spec/fixtures/*.yaml').each do |path|
|
|
9
|
+
path.delete_suffix!('.yaml')
|
|
10
|
+
system! "tomograph \"#{path}.yaml\" \"#{path}.json\""
|
|
11
|
+
end
|
data/tomograph.gemspec
CHANGED
|
@@ -8,7 +8,8 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.authors = ['d.efimov']
|
|
9
9
|
spec.email = ['d.efimov@fun-box.ru']
|
|
10
10
|
|
|
11
|
-
spec.summary = 'Convert API Blueprint to
|
|
11
|
+
spec.summary = 'Convert API Blueprint to Tomogram'
|
|
12
|
+
spec.description = 'Convert API Blueprint to routes and JSON-Schemas'
|
|
12
13
|
spec.homepage = 'https://github.com/funbox/tomograph'
|
|
13
14
|
spec.license = 'MIT'
|
|
14
15
|
|
|
@@ -17,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
|
17
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
18
19
|
spec.require_paths = ['lib']
|
|
19
20
|
|
|
21
|
+
spec.add_runtime_dependency 'methadone', '~> 1.9', '>= 1.9.5'
|
|
20
22
|
spec.add_runtime_dependency 'multi_json', '~> 1.11', '>= 1.11.1'
|
|
21
23
|
spec.add_development_dependency 'bundler', '~> 1.12'
|
|
22
24
|
spec.add_development_dependency 'byebug', '~> 8.2', '>= 8.2.1'
|
metadata
CHANGED
|
@@ -1,15 +1,35 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tomograph
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- d.efimov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-07-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: methadone
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.9'
|
|
20
|
+
- - ">="
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: 1.9.5
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - "~>"
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '1.9'
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 1.9.5
|
|
13
33
|
- !ruby/object:Gem::Dependency
|
|
14
34
|
name: multi_json
|
|
15
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -138,10 +158,11 @@ dependencies:
|
|
|
138
158
|
- - ">="
|
|
139
159
|
- !ruby/object:Gem::Version
|
|
140
160
|
version: 0.11.2
|
|
141
|
-
description:
|
|
161
|
+
description: Convert API Blueprint to routes and JSON-Schemas
|
|
142
162
|
email:
|
|
143
163
|
- d.efimov@fun-box.ru
|
|
144
|
-
executables:
|
|
164
|
+
executables:
|
|
165
|
+
- tomograph
|
|
145
166
|
extensions: []
|
|
146
167
|
extra_rdoc_files: []
|
|
147
168
|
files:
|
|
@@ -156,13 +177,16 @@ files:
|
|
|
156
177
|
- Rakefile
|
|
157
178
|
- bin/console
|
|
158
179
|
- bin/setup
|
|
180
|
+
- exe/tomograph
|
|
159
181
|
- lib/tomograph.rb
|
|
182
|
+
- lib/tomograph/api_blueprint/json_schema.rb
|
|
160
183
|
- lib/tomograph/api_blueprint/yaml.rb
|
|
161
184
|
- lib/tomograph/api_blueprint/yaml/action.rb
|
|
162
185
|
- lib/tomograph/path.rb
|
|
163
186
|
- lib/tomograph/tomogram.rb
|
|
164
187
|
- lib/tomograph/tomogram/action.rb
|
|
165
188
|
- lib/tomograph/version.rb
|
|
189
|
+
- script/update_json_fixtures
|
|
166
190
|
- tomograph.gemspec
|
|
167
191
|
homepage: https://github.com/funbox/tomograph
|
|
168
192
|
licenses:
|
|
@@ -187,5 +211,5 @@ rubyforge_project:
|
|
|
187
211
|
rubygems_version: 2.4.5
|
|
188
212
|
signing_key:
|
|
189
213
|
specification_version: 4
|
|
190
|
-
summary: Convert API Blueprint to
|
|
214
|
+
summary: Convert API Blueprint to Tomogram
|
|
191
215
|
test_files: []
|