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

notEthan / scorpio / 22246677779

03 Feb 2026 02:16AM UTC coverage: 86.948% (+1.6%) from 85.331%
22246677779

push

github

notEthan
Merge branches 'dev642' and 'jsi09' into HEAD

4 of 4 new or added lines in 4 files covered. (100.0%)

109 existing lines in 11 files now uncovered.

1259 of 1448 relevant lines covered (86.95%)

385.58 hits per line

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

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

3
module Scorpio
14✔
4
  module OpenAPI
14✔
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
14✔
10
      class << self
14✔
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 [JSI::Base + Scorpio::OpenAPI::Document]
16
        def from_instance(instance, **new_param)
14✔
17
          if instance.is_a?(Scorpio::OpenAPI::Document)
126✔
18
            instance
×
19
          elsif instance.is_a?(JSI::Base)
124✔
20
            raise(TypeError, "instance is unexpected JSI type: #{instance.class.inspect}")
×
21
          elsif instance.respond_to?(:to_hash)
124✔
22
            if (instance['swagger'].is_a?(String) && instance['swagger'] =~ /\A2(\.|\z)/) || instance['swagger'] == 2
126✔
23
              Scorpio::OpenAPI::V2::Document.new_jsi(instance, **new_param)
×
24
            elsif (instance['openapi'].is_a?(String) && instance['openapi'] =~ /\A3\.0(\.|\z)/) || instance['openapi'] == 3.0
126✔
25
              Scorpio::OpenAPI::V3_0::Document.new_jsi(instance, **new_param)
126✔
26
            elsif instance['kind'] == 'discovery#restDescription'
27
              Scorpio::Google::RestDescription.new_jsi(instance, register: true, **new_param)
×
28
            else
29
              raise(ArgumentError, "instance does not look like a recognized openapi document")
×
30
            end
31
          else
32
            raise(TypeError, "instance does not look like a hash (json object)")
×
33
          end
34
        end
35
      end
36

37
      module Descendent
14✔
38
        # @return [Scorpio::OpenAPI::Document]
39
        def openapi_document
14✔
40
          jsi_ancestor_nodes.detect { |n| n.is_a?(OpenAPI::Document) } || raise(Error, "not inside an OpenAPI document (#{inspect})")
88,186✔
41
        end
42
      end
43

44
      module Configurables
14✔
45
        attr_writer :request_headers
14✔
46
        def request_headers
14✔
47
          return @request_headers if instance_variable_defined?(:@request_headers)
6,258✔
48
          {}.freeze
6,258✔
49
        end
50

51
        attr_writer :user_agent
14✔
52
        def user_agent
14✔
53
          return @user_agent if instance_variable_defined?(:@user_agent)
2,100✔
54
          "Scorpio/#{Scorpio::VERSION} (https://github.com/notEthan/scorpio) Faraday/#{Faraday::VERSION} Ruby/#{RUBY_VERSION}"
2,100✔
55
        end
56

57
        attr_writer :faraday_builder
14✔
58
        def faraday_builder
14✔
59
          return @faraday_builder if instance_variable_defined?(:@faraday_builder)
252✔
60
          nil
144✔
61
        end
62

63
        attr_writer :faraday_adapter
14✔
64
        def faraday_adapter
14✔
65
          return @faraday_adapter if instance_variable_defined?(:@faraday_adapter)
868✔
66
          [Faraday.default_adapter].freeze
868✔
67
        end
68

69
        attr_writer :logger
14✔
70
        def logger
14✔
71
          return @logger if instance_variable_defined?(:@logger)
1,050✔
72
          (Object.const_defined?(:Rails) && ::Rails.respond_to?(:logger) ? ::Rails.logger : nil)
1,050✔
73
        end
74
      end
75
      include Configurables
14✔
76

77
      def v2?
14✔
78
        is_a?(OpenAPI::V2::Document)
14✔
79
      end
80

81
      def v3?
14✔
UNCOV
82
        is_a?(OpenAPI::V3_0::Document)
×
83
      end
84

85
      def operations
14✔
86
        return @operations if instance_variable_defined?(:@operations)
490✔
87
        @operations = OperationsScope.new(each_operation)
140✔
88
      end
89

90
      def each_operation(&block)
14✔
91
        return(to_enum(__method__)) unless block
616✔
92

93
        paths.each do |path, path_item|
476✔
94
          path_item.each do |http_method, operation|
966✔
95
            if operation.is_a?(Scorpio::OpenAPI::Operation)
1,176✔
96
              yield(operation)
1,176✔
97
            end
98
          end
99
        end
100
      end
101

102
      def title
14✔
103
        info && info.title
210✔
104
      end
105
    end
106

107
    module Document
14✔
108
      module V3Methods
14✔
109
        module Configurables
14✔
110
          def scheme
14✔
111
            nil
112
          end
113
          attr_writer :server
14✔
114
          def server
14✔
115
            return @server if instance_variable_defined?(:@server)
1,680✔
116
            if servers.respond_to?(:to_ary) && servers.size == 1
1,680✔
117
              servers.first
1,680✔
118
            else
119
              nil
120
            end
121
          end
122
          attr_writer :server_variables
14✔
123
          def server_variables
14✔
124
            return @server_variables if instance_variable_defined?(:@server_variables)
1,680✔
UNCOV
125
            {}.freeze
×
126
          end
127
          attr_writer :base_url
14✔
128
          def base_url(scheme: nil, server: self.server, server_variables: self.server_variables)
14✔
129
            return @base_url if instance_variable_defined?(:@base_url)
1,680✔
130
            if server
1,680✔
131
              server.expanded_url(server_variables)
1,680✔
132
            end
133
          end
134

135
          attr_writer :request_media_type
14✔
136
          def request_media_type
14✔
137
            return @request_media_type if instance_variable_defined?(:@request_media_type)
1,414✔
138
            nil
808✔
139
          end
140
        end
141
        include Configurables
14✔
142
        include(OpenAPI::Document)
14✔
143
      end
144
    end
145

146
    module Document
14✔
147
      module V2Methods
14✔
148
        module Configurables
14✔
149
          attr_writer :scheme
14✔
150
          def scheme
14✔
UNCOV
151
            return @scheme if instance_variable_defined?(:@scheme)
×
UNCOV
152
            if schemes.nil?
×
UNCOV
153
              'https'
×
154
            elsif schemes.respond_to?(:to_ary)
155
              # prefer https, then http, then anything else since we probably don't support.
UNCOV
156
              schemes.sort_by { |s| ['https', 'http'].index(s) || (1.0 / 0) }.first
×
157
            end
158
          end
159

160
          def server
14✔
161
            nil
162
          end
163
          def server_variables
14✔
164
            nil
165
          end
166

167
          attr_writer :base_url
14✔
168
          # the base url to which paths are appended.
169
          # by default this looks at the openapi document's schemes, picking https or http first.
170
          # it looks at the openapi_document's host and basePath.
171
          def base_url(scheme: self.scheme, server: nil, server_variables: nil)
14✔
UNCOV
172
            return @base_url if instance_variable_defined?(:@base_url)
×
UNCOV
173
            if host && scheme
×
174
              Addressable::URI.new(
175
                scheme: scheme,
176
                host: host,
177
                path: basePath,
178
              ).freeze
179
            end
180
          end
181

182
          attr_writer :request_media_type
14✔
183
          def request_media_type
14✔
UNCOV
184
            return @request_media_type if instance_variable_defined?(:@request_media_type)
×
UNCOV
185
            if consumes.respond_to?(:to_ary)
×
UNCOV
186
              Request.best_media_type(consumes)
×
187
            else
188
              nil
189
            end
190
          end
191
        end
192
        include Configurables
14✔
193
        include(OpenAPI::Document)
14✔
194
      end
195
    end
196
  end
197
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