oas_request 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 593cfa0b1fa48a445b268d45e90e72b2516579b31a02ead2c4708bd1859abf3a
4
+ data.tar.gz: 4593d5538116b316301a812edf816ce440fe6079748317785794923705c57946
5
+ SHA512:
6
+ metadata.gz: c6e176558e2915d09bc02843e0bd5e264b5152bb12d8651c43008dafcf1aabef5b60472acc864d552947c0321eea1e800957752eca005390be8d357d4a925ad8
7
+ data.tar.gz: 50a7f726a3c938b3f004318b7a16f210081861d7412d46cef4cf16b8c603d24c5467e653827a6937b5bc7e7a9dcc306f3cb283d5a3c34af6b550af851062ac94
@@ -0,0 +1,72 @@
1
+ require "rack"
2
+
3
+ class OASRequest
4
+ def self.spec(oas)
5
+ Class.new do
6
+ attr_reader :values
7
+
8
+ define_method :initialize do |server:, headers: {}, params: {}, query: {}|
9
+ @server = server
10
+
11
+ @headers = headers
12
+ @params = params
13
+ @query = query
14
+ end
15
+
16
+ define_method "__request" do |method:, url:, options: {}|
17
+ # merge params with global defaults
18
+ params = @params.merge(options.fetch(:params, {}))
19
+
20
+ # process path template
21
+ url_path = OASRequest::PathTemplate.template url, params
22
+
23
+ # construct final host & url parts
24
+ uri = URI "#{@server}#{url_path}"
25
+
26
+ # convert query back to regular hash
27
+ search_obj = Rack::Utils.parse_query uri.query
28
+
29
+ # Overrides
30
+ headers = @headers.merge(options.fetch(:headers, {}))
31
+ query = search_obj.merge(@query).merge(options.fetch(:query, {}))
32
+
33
+ # final query string
34
+ search = Rack::Utils.build_query query
35
+
36
+ OASRequest::HTTP.http(
37
+ headers: headers,
38
+ host: uri.host,
39
+ method: method,
40
+ port: uri.port,
41
+ body: options.fetch(:body, nil),
42
+ path: uri.path + (search.empty? ? "" : "?#{search}"),
43
+ protocol: uri.scheme
44
+ )
45
+ end
46
+
47
+ oas["paths"].each do |url, methods|
48
+ methods.each do |method, definition|
49
+ # filter to paths that contain an operationId
50
+ next unless definition.is_a?(Hash) && definition["operationId"]
51
+
52
+ # process each method
53
+ define_method definition["operationId"] do |headers: {}, params: {}, query: {}, body: nil|
54
+ __request(
55
+ method: method,
56
+ url: url,
57
+ options: {
58
+ headers: headers,
59
+ params: params,
60
+ query: query,
61
+ body: body
62
+ }
63
+ )
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ require "oas_request/path_template"
72
+ require "oas_request/http"
@@ -0,0 +1,84 @@
1
+ require "net/http"
2
+
3
+ REQUEST_CLASSES = {
4
+ get: Net::HTTP::Get,
5
+ head: Net::HTTP::Head,
6
+ post: Net::HTTP::Post,
7
+ patch: Net::HTTP::Patch,
8
+ put: Net::HTTP::Put,
9
+ options: Net::HTTP::Options,
10
+ delete: Net::HTTP::Delete
11
+ }
12
+
13
+ class OASRequest::HTTP
14
+ def self.config(opts = {})
15
+ # set default options
16
+ opts[:host] ||= "localhost"
17
+ opts[:path] ||= "/"
18
+ opts[:port] ||= 443
19
+ opts[:protocol] ||= "https"
20
+ opts[:headers] ||= {}
21
+
22
+ # set standard header values
23
+ opts[:headers]["accept"] = "application/json"
24
+
25
+ if opts[:body]
26
+ # set content-type header when body is present
27
+ opts[:headers]["content-type"] = "application/json"
28
+
29
+ # ensure body is in JSON format
30
+ opts[:body] = opts[:body].to_json
31
+ end
32
+
33
+ opts
34
+ end
35
+
36
+ def self.get_request(method, opts = {})
37
+ raise "Unknown method #{method}" unless REQUEST_CLASSES.has_key? method.downcase.to_sym
38
+
39
+ uri = URI "#{opts[:protocol]}://#{opts[:host]}:#{opts[:port]}#{opts[:path]}"
40
+
41
+ request_class = REQUEST_CLASSES[method.downcase.to_sym]
42
+
43
+ req = request_class.new uri, opts[:headers]
44
+
45
+ req.body = opts[:body] if opts[:body]
46
+
47
+ req
48
+ end
49
+
50
+ def self.http(headers:, host:, method:, port:, body:, path:, protocol:)
51
+ options = config(
52
+ host: host,
53
+ path: path,
54
+ port: port,
55
+ protocol: protocol,
56
+ headers: headers,
57
+ body: body
58
+ )
59
+
60
+ req = get_request method, options
61
+
62
+ http = Net::HTTP.new options[:host], options[:port]
63
+ http.use_ssl = options[:protocol] == "https"
64
+
65
+ response = http.request req
66
+
67
+ headers = response.to_hash
68
+ body = response.body
69
+ if headers.fetch("content-type", []).join.include? "application/json"
70
+ begin
71
+ body = JSON.parse response.body
72
+ rescue
73
+ body = response.body
74
+ end
75
+ end
76
+
77
+ {
78
+ headers: headers,
79
+ status_code: response.code.to_i,
80
+ status_message: response.message,
81
+ body: body
82
+ }
83
+ end
84
+ end
@@ -0,0 +1,19 @@
1
+ class OASRequest::PathTemplate
2
+ def self.template(url, params)
3
+ params_symbol = params.transform_keys(&:to_s)
4
+
5
+ params_in_url = url.scan(/\{(?<param>[^\/]+)\}/)
6
+
7
+ params_in_url.each do |params_group|
8
+ params_group.each do |param|
9
+ next unless params_symbol.key? param
10
+
11
+ r = Regexp.new "{#{param}}"
12
+
13
+ url = url.gsub(r, params_symbol.fetch(param).to_s)
14
+ end
15
+ end
16
+
17
+ url.gsub('{', '%7B').gsub('}', '%7D')
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oas_request
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - ''
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.2.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.2.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: webmock
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.8'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 3.8.3
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.8'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.8.3
53
+ description: A simple OAS request generator
54
+ email: ''
55
+ executables: []
56
+ extensions: []
57
+ extra_rdoc_files: []
58
+ files:
59
+ - lib/oas_request.rb
60
+ - lib/oas_request/http.rb
61
+ - lib/oas_request/path_template.rb
62
+ homepage: https://rubygems.org/gems/oas_request
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.5.0
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.7.6.2
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: OAS request generator
86
+ test_files: []