Class: ThreeScaleToolbox::OpenAPI::Swagger

Inherits:
Object
  • Object
show all
Defined in:
lib/3scale_toolbox/openapi/swagger.rb

Overview

Swagger object

  • Swagger.title -> string

  • Swagger.description -> string

  • Swagger.version -> string

  • Swagger.basePath -> string

  • Swagger.host -> string

  • Swagger.scheme -> string

  • Swagger.operation -> array of operation hash

    • operation hash properties

      • :verb

      • :path

      • :description

      • :operation_id

  • Swagger.security -> security hash

    • security hash properties

      • :id -> string

      • :type -> string

      • :name -> string

      • :in_f -> string

      • :flow -> symbol (:implicit_flow_enabled, :direct_access_grants_enabled, :service_accounts_enabled, :standard_flow_enabled)

      • :scopes -> array of string

  • Swagger.service_backend_version -> string (‘1’,‘2’,‘oidc’)

  • Swagger.set_server_url -> def(spec, url)

  • Swagger.set_oauth2_urls-> def(spec, scheme_id, authorization_url, token_url)

Constant Summary collapse

META_SCHEMA_PATH =
File.expand_path('../../../resources/swagger_meta_schema.json', __dir__)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#rawObject (readonly)

Returns the value of attribute raw.



43
44
45
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 43

def raw
  @raw
end

Class Method Details

.build(raw, validate: true) ⇒ Object



37
38
39
40
41
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 37

def self.build(raw, validate: true)
  self.validate(raw) if validate

  new(raw)
end

.validate(raw) ⇒ Object



32
33
34
35
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 32

def self.validate(raw)
  meta_schema = JSON.parse(File.read(META_SCHEMA_PATH))
  JSON::Validator.validate!(meta_schema, raw)
end

Instance Method Details

#base_pathObject



57
58
59
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 57

def base_path
  raw['basePath']
end

#descriptionObject



49
50
51
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 49

def description
  raw.dig('info', 'description')
end

#hostObject



61
62
63
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 61

def host
  raw['host']
end

#operationsObject



69
70
71
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 69

def operations
  @operations ||= parse_operations
end

#schemeObject



65
66
67
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 65

def scheme
  Array(raw['schemes']).first
end

#securityObject



73
74
75
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 73

def security
  @security ||= parse_security
end

#service_backend_versionObject



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 77

def service_backend_version
  # default authentication mode if no security requirement
  return '1' if security.nil?

  case security[:type]
  when 'oauth2'
    'oidc'
  when 'apiKey'
    '1'
  else
    raise ThreeScaleToolbox::Error, "Unexpected security scheme type #{security[:type]}"
  end
end

#set_oauth2_urls(spec, sec_scheme_id, authorization_url, token_url) ⇒ Object

Update given spec with urls It is expected identified security scheme to be oauth2 type



102
103
104
105
106
107
108
109
110
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 102

def set_oauth2_urls(spec, sec_scheme_id, authorization_url, token_url)
  sec_scheme_obj = spec.dig('securityDefinitions', sec_scheme_id)
  if sec_scheme_obj.nil? || sec_scheme_obj['type'] != 'oauth2'
    raise ThreeScaleToolbox::Error, "Expected security scheme {#{sec_scheme_id}} not found or not oauth2"
  end

  sec_scheme_obj['authorizationUrl'] = authorization_url if %w[implicit accessCode].include?(sec_scheme_obj['flow'])
  sec_scheme_obj['tokenUrl'] = token_url if %w[password application accessCode].include?(sec_scheme_obj['flow'])
end

#set_server_url(spec, url) ⇒ Object



91
92
93
94
95
96
97
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 91

def set_server_url(spec, url)
  URI(url).tap do |uri|
    spec['host'] = "#{uri.host}:#{uri.port}"
    spec['schemes'] = [uri.scheme]
    spec['basePath'] = uri.path
  end
end

#titleObject



45
46
47
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 45

def title
  raw.dig('info', 'title')
end

#versionObject



53
54
55
# File 'lib/3scale_toolbox/openapi/swagger.rb', line 53

def version
  raw.dig('info', 'version')
end