apia-insomnia 2.0.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 +7 -0
- data/VERSION +1 -0
- data/lib/apia-insomnia.rb +7 -0
- data/lib/apia/insomnia/rack.rb +51 -0
- data/lib/apia/insomnia/schema.rb +160 -0
- data/lib/apia/insomnia/version.rb +14 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7a1544a5b227ca74b2e3d239178e62f7aae387eb663fae30d2aafdf4058b5919
|
4
|
+
data.tar.gz: ca641e4c63a055b3e6c57fa3e17cd2381ce17601fc077d9188ba63366d2df1c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 817d441b2dbddea0627a5127fe7feda72ec5b10e50278dabd819c8dde215c48039aa61096c7301f3113e7511841c548766a9b9f045d682644b9e0decc483d0b1
|
7
|
+
data.tar.gz: 2fb2c1c496f453435d85c514cf1256a88e881caaf9d513c2b326391026b90c638e48cc50327431847884c76181cbb6dc614d65a19cb674280c98be17d90088e4
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/insomnia/schema'
|
4
|
+
|
5
|
+
module Apia
|
6
|
+
module Insomnia
|
7
|
+
class Rack
|
8
|
+
|
9
|
+
def initialize(app, api, path, **options)
|
10
|
+
@app = app
|
11
|
+
@api = api
|
12
|
+
@path = "/#{path.sub(/\A\/+/, '').sub(/\/+\z/, '')}"
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
def development?
|
17
|
+
env_is_dev = ENV['RACK_ENV'] == 'development'
|
18
|
+
return true if env_is_dev && @options[:development].nil?
|
19
|
+
|
20
|
+
@options[:development] == true
|
21
|
+
end
|
22
|
+
|
23
|
+
def api
|
24
|
+
return Object.const_get(@api) if @api.is_a?(String) && development?
|
25
|
+
return @cached_api ||= Object.const_get(@api) if @api.is_a?(String)
|
26
|
+
|
27
|
+
@api
|
28
|
+
end
|
29
|
+
|
30
|
+
def base_url
|
31
|
+
@options[:base_url] || 'https://api.example.com/api/v1'
|
32
|
+
end
|
33
|
+
|
34
|
+
def call(env)
|
35
|
+
if @options[:hosts]&.none? { |host| host == env['HTTP_HOST'] }
|
36
|
+
return @app.call(env)
|
37
|
+
end
|
38
|
+
|
39
|
+
unless env['PATH_INFO'] == @path
|
40
|
+
return @app.call(env)
|
41
|
+
end
|
42
|
+
|
43
|
+
schema = Schema.new(api, base_url)
|
44
|
+
body = schema.json
|
45
|
+
|
46
|
+
[200, { 'Content-Type' => 'application/json', 'Content-Length' => body.bytesize.to_s }, [body]]
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Apia
|
4
|
+
module Insomnia
|
5
|
+
class Schema
|
6
|
+
|
7
|
+
def initialize(api, base_url)
|
8
|
+
@api = api
|
9
|
+
@base_url = base_url
|
10
|
+
@spec = {
|
11
|
+
'_type' => 'export',
|
12
|
+
'__export_format' => 3,
|
13
|
+
'__export__date' => Time.now.to_s,
|
14
|
+
'resources' => []
|
15
|
+
}
|
16
|
+
setup
|
17
|
+
end
|
18
|
+
|
19
|
+
def json
|
20
|
+
@spec.to_json
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def setup
|
26
|
+
add_resource('workspace', '__WORKSPACE_ID__',
|
27
|
+
name: @api.definition.name,
|
28
|
+
description: @api.definition.description)
|
29
|
+
|
30
|
+
add_resource('environment', get_id('environment', @api),
|
31
|
+
name: 'Default Environment',
|
32
|
+
data: {
|
33
|
+
base_url: @base_url,
|
34
|
+
bearer_token: 'Add token here...'
|
35
|
+
})
|
36
|
+
|
37
|
+
add_groups(@api.definition.route_set.groups)
|
38
|
+
add_requests(@api.definition.route_set.routes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_groups(groups)
|
42
|
+
groups.sort_by(&:name).each_with_index do |group, index|
|
43
|
+
add_resource('request_group', get_id('folder', group), {
|
44
|
+
name: group.name,
|
45
|
+
parentId: get_id('folder', group.parent),
|
46
|
+
metaSortKey: index,
|
47
|
+
enivronment: {}
|
48
|
+
})
|
49
|
+
add_groups(group.groups) if group.groups
|
50
|
+
end
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_requests(routes)
|
55
|
+
routes.each do |route|
|
56
|
+
next unless route.endpoint.definition.schema?
|
57
|
+
|
58
|
+
hash = {
|
59
|
+
name: route.endpoint.definition.name,
|
60
|
+
description: route.endpoint.definition.description,
|
61
|
+
url: "{{ base_url }}/#{route.path}",
|
62
|
+
parentId: get_id('folder', route.group),
|
63
|
+
method: route.request_method.to_s.upcase
|
64
|
+
}
|
65
|
+
|
66
|
+
authenticator = route.endpoint.definition.authenticator ||
|
67
|
+
route.controller&.definition&.authenticator ||
|
68
|
+
@api.definition.authenticator
|
69
|
+
|
70
|
+
case authenticator&.definition&.type
|
71
|
+
when :bearer
|
72
|
+
hash[:authentication] = { type: 'bearer', token: '{{ bearer_token }}' }
|
73
|
+
end
|
74
|
+
|
75
|
+
if route.request_method == :get
|
76
|
+
hash[:parameters] = []
|
77
|
+
add_parameters_to_array(hash[:parameters], route.endpoint.definition.argument_set)
|
78
|
+
|
79
|
+
else
|
80
|
+
hash[:body] = { mimeType: 'application/json' }
|
81
|
+
hash[:headers] = [{ name: 'Content-Type', value: 'application/json' }]
|
82
|
+
|
83
|
+
body_arguments = {}
|
84
|
+
add_arguments_to_hash(body_arguments, route.endpoint.definition.argument_set)
|
85
|
+
hash[:body][:text] = JSON.pretty_generate(body_arguments)
|
86
|
+
end
|
87
|
+
|
88
|
+
add_resource('request', get_id('request', route), hash)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def add_parameters_to_array(array, set, prefix = '')
|
93
|
+
set.definition.arguments.each_value do |arg|
|
94
|
+
if arg.type.argument_set?
|
95
|
+
sub_array = []
|
96
|
+
add_parameters_to_array(sub_array, arg.type.klass, arg.name.to_s)
|
97
|
+
sub_array.each { |a| array << a }
|
98
|
+
else
|
99
|
+
|
100
|
+
if prefix.empty?
|
101
|
+
name_for_param = arg.name.to_s
|
102
|
+
else
|
103
|
+
name_for_param = prefix + "[#{arg.name}]"
|
104
|
+
end
|
105
|
+
|
106
|
+
param = {
|
107
|
+
name: name_for_param,
|
108
|
+
value: nil,
|
109
|
+
disabled: !arg.required?
|
110
|
+
}
|
111
|
+
array << param
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def add_arguments_to_hash(hash, set)
|
117
|
+
set.definition.arguments.each_value do |arg|
|
118
|
+
name_for_hash = arg.name.to_s
|
119
|
+
hash[name_for_hash] = get_default_value_for_argument(arg)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def get_default_value_for_argument(argument)
|
124
|
+
if argument.type.argument_set? && argument.type.klass.definition.is_a?(Apia::Definitions::LookupArgumentSet)
|
125
|
+
{
|
126
|
+
argument.type.klass.definition.arguments.values.map(&:name).join('|') => ''
|
127
|
+
}
|
128
|
+
elsif argument.type.argument_set?
|
129
|
+
hash = {}
|
130
|
+
add_arguments_to_hash(hash, argument.type.klass)
|
131
|
+
hash
|
132
|
+
elsif argument.type.enum?
|
133
|
+
argument.type.klass.definition.values.keys.join(' | ')
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def add_resource(type, id, options)
|
138
|
+
@spec['resources'] << {
|
139
|
+
'_type' => type,
|
140
|
+
'_id' => id
|
141
|
+
}.merge(options)
|
142
|
+
end
|
143
|
+
|
144
|
+
def get_id(prefix, object)
|
145
|
+
return nil if object.nil?
|
146
|
+
|
147
|
+
prefix = prefix.upcase
|
148
|
+
|
149
|
+
@ids ||= {}
|
150
|
+
@ids[prefix] ||= []
|
151
|
+
unless @ids[prefix].include?(object)
|
152
|
+
@ids[prefix] << object
|
153
|
+
end
|
154
|
+
id = @ids[prefix].index(object) + 1
|
155
|
+
"__#{prefix}_#{id}__"
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Apia
|
4
|
+
module Insomnia
|
5
|
+
|
6
|
+
VERSION_FILE_ROOT = File.expand_path('../../../VERSION', __dir__)
|
7
|
+
if File.file?(VERSION_FILE_ROOT)
|
8
|
+
VERSION = File.read(VERSION_FILE_ROOT).strip.sub(/\Av/, '')
|
9
|
+
else
|
10
|
+
VERSION = '0.0.0.dev'
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: apia-insomnia
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Cooke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-08-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A Raid schema generator for Insomnia.
|
42
|
+
email:
|
43
|
+
- adam@k.io
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- VERSION
|
49
|
+
- lib/apia-insomnia.rb
|
50
|
+
- lib/apia/insomnia/rack.rb
|
51
|
+
- lib/apia/insomnia/schema.rb
|
52
|
+
- lib/apia/insomnia/version.rb
|
53
|
+
homepage: https://github.com/krystal/apia-insomnia
|
54
|
+
licenses: []
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '2.6'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubygems_version: 3.1.6
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: This gem provides a tool for generating an Insomnia compatible schema for
|
75
|
+
a Apia API.
|
76
|
+
test_files: []
|