• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

notEthan / scorpio / 4029574175

pending completion
4029574175

push

github

Ethan
github test workflow: use rake test:each_format instead of one matrix entry per format

895 of 1067 relevant lines covered (83.88%)

100.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

78.89
/lib/scorpio/openapi/document.rb
1
# frozen_string_literal: true
2

3
module Scorpio
5✔
4
  module OpenAPI
5✔
5
    # A document that defines or describes an API.
6
    # An OpenAPI description document uses and conforms to the OpenAPI Specification.
7
    #
8
    # Scorpio::OpenAPI::Document is a module common to V2 and V3 documents.
9
    module Document
5✔
10
      class << self
5✔
11
        # takes a document, generally a Hash, and returns a Scorpio OpenAPI Document
12
        # instantiating it.
13
        #
14
        # @param instance [#to_hash] the document to represent as a Scorpio OpenAPI Document
15
        # @return [Scorpio::OpenAPI::V2::Document, Scorpio::OpenAPI::V3::Document]
16
        def from_instance(instance)
5✔
17
          if instance.is_a?(Scorpio::OpenAPI::Document)
5✔
18
            instance
×
19
          elsif instance.is_a?(JSI::Base)
4✔
20
            raise(TypeError, "instance is unexpected JSI type: #{instance.class.inspect}")
×
21
          elsif instance.respond_to?(:to_hash)
4✔
22
            if instance['swagger'] =~ /\A2(\.|\z)/
5✔
23
              instance = Scorpio::OpenAPI::V2::Document.new_jsi(instance)
×
24
            elsif instance['openapi'] =~ /\A3(\.|\z)/
4✔
25
              instance = Scorpio::OpenAPI::V3::Document.new_jsi(instance)
5✔
26
            else
27
              raise(ArgumentError, "instance does not look like a recognized openapi document")
×
28
            end
29
          else
30
            raise(TypeError, "instance does not look like a hash (json object)")
×
31
          end
32
        end
33
      end
34

35
      module Configurables
5✔
36
        attr_writer :request_headers
5✔
37
        def request_headers
5✔
38
          return @request_headers if instance_variable_defined?(:@request_headers)
1,085✔
39
          {}.freeze
1,085✔
40
        end
41

42
        attr_writer :user_agent
5✔
43
        def user_agent
5✔
44
          return @user_agent if instance_variable_defined?(:@user_agent)
420✔
45
          "Scorpio/#{Scorpio::VERSION} (https://github.com/notEthan/scorpio) Faraday/#{Faraday::VERSION} Ruby/#{RUBY_VERSION}"
420✔
46
        end
47

48
        attr_writer :faraday_builder
5✔
49
        def faraday_builder
5✔
50
          return @faraday_builder if instance_variable_defined?(:@faraday_builder)
×
51
          -> (_) { }
×
52
        end
53

54
        attr_writer :faraday_adapter
5✔
55
        def faraday_adapter
5✔
56
          return @faraday_adapter if instance_variable_defined?(:@faraday_adapter)
210✔
57
          [Faraday.default_adapter].freeze
210✔
58
        end
59

60
        attr_writer :logger
5✔
61
        def logger
5✔
62
          return @logger if instance_variable_defined?(:@logger)
210✔
63
          (Object.const_defined?(:Rails) && ::Rails.respond_to?(:logger) ? ::Rails.logger : nil)
210✔
64
        end
65
      end
66
      include Configurables
5✔
67

68
      def v2?
5✔
69
        is_a?(V2::Document)
10✔
70
      end
71

72
      def v3?
5✔
73
        is_a?(V3::Document)
×
74
      end
75

76
      def operations
5✔
77
        return @operations if instance_variable_defined?(:@operations)
30✔
78
        @operations = OperationsScope.new(self)
5✔
79
      end
80
    end
81

82
    module V3
5✔
83
      raise(Bug, 'const_defined? Scorpio::OpenAPI::V3::Document') unless const_defined?(:Document)
5✔
84

85
      # A document that defines or describes an API conforming to the OpenAPI Specification v3.
86
      #
87
      # https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#oasObject
88
      module Document
5✔
89
        module Configurables
5✔
90
          def scheme
5✔
91
            nil
92
          end
93
          attr_writer :server
5✔
94
          def server
5✔
95
            return @server if instance_variable_defined?(:@server)
420✔
96
            if servers.respond_to?(:to_ary) && servers.size == 1
420✔
97
              servers.first
420✔
98
            else
99
              nil
100
            end
101
          end
102
          attr_writer :server_variables
5✔
103
          def server_variables
5✔
104
            return @server_variables if instance_variable_defined?(:@server_variables)
×
105
            {}.freeze
×
106
          end
107
          attr_writer :base_url
5✔
108
          def base_url(scheme: nil, server: self.server, server_variables: self.server_variables)
5✔
109
            return @base_url if instance_variable_defined?(:@base_url)
420✔
110
            if server
420✔
111
              server.expanded_url(server_variables)
420✔
112
            end
113
          end
114

115
          attr_writer :request_media_type
5✔
116
          def request_media_type
5✔
117
            return @request_media_type if instance_variable_defined?(:@request_media_type)
290✔
118
            nil
58✔
119
          end
120
        end
121
        include Configurables
5✔
122
      end
123
    end
124

125
    module V2
5✔
126
      raise(Bug, 'const_defined? Scorpio::OpenAPI::V2::Document') unless const_defined?(:Document)
5✔
127

128
      # A document that defines or describes an API conforming to the OpenAPI Specification v2 (aka Swagger).
129
      #
130
      # The root document is known as the Swagger Object.
131
      module Document
5✔
132
        module Configurables
5✔
133
          attr_writer :scheme
5✔
134
          def scheme
5✔
135
            return @scheme if instance_variable_defined?(:@scheme)
×
136
            if schemes.nil?
×
137
              'https'
×
138
            elsif schemes.respond_to?(:to_ary)
139
              # prefer https, then http, then anything else since we probably don't support.
140
              schemes.sort_by { |s| ['https', 'http'].index(s) || (1.0 / 0) }.first
×
141
            end
142
          end
143

144
          def server
5✔
145
            nil
146
          end
147
          def server_variables
5✔
148
            nil
149
          end
150

151
          attr_writer :base_url
5✔
152
          # the base url to which paths are appended.
153
          # by default this looks at the openapi document's schemes, picking https or http first.
154
          # it looks at the openapi_document's host and basePath.
155
          def base_url(scheme: self.scheme, server: nil, server_variables: nil)
5✔
156
            return @base_url if instance_variable_defined?(:@base_url)
×
157
            if host && scheme
×
158
              Addressable::URI.new(
159
                scheme: scheme,
160
                host: host,
161
                path: basePath,
162
              ).freeze
163
            end
164
          end
165

166
          attr_writer :request_media_type
5✔
167
          def request_media_type
5✔
168
            return @request_media_type if instance_variable_defined?(:@request_media_type)
×
169
            if consumes.respond_to?(:to_ary)
×
170
              Request.best_media_type(consumes)
×
171
            else
172
              nil
173
            end
174
          end
175
        end
176
        include Configurables
5✔
177
      end
178
    end
179
  end
180
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc