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

notEthan / scorpio / 21617503721

03 Feb 2026 04:51AM UTC coverage: 87.782% (+0.8%) from 86.948%
21617503721

push

github

notEthan
jsi ~> 0.9

1401 of 1596 relevant lines covered (87.78%)

3735.89 hits per line

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

83.81
/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)
154✔
18
            instance
×
19
          elsif instance.is_a?(JSI::Base)
152✔
20
            raise(TypeError, "instance is unexpected JSI type: #{instance.class.inspect}")
×
21
          elsif instance.respond_to?(:to_hash)
152✔
22
            if (instance['swagger'].is_a?(String) && instance['swagger'] =~ /\A2(\.|\z)/) || instance['swagger'] == 2
154✔
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
154✔
25
              Scorpio::OpenAPI::V3_0::Document.new_jsi(instance, **new_param)
140✔
26
            elsif (instance['openapi'].is_a?(String) && instance['openapi'] =~ /\A3\.1(\.|\z)/) || instance['openapi'] == 3.1
14✔
27
              Scorpio::OpenAPI::V3_1.new_document(instance, **new_param)
14✔
28
            elsif instance['kind'] == 'discovery#restDescription'
29
              Scorpio::Google::RestDescription.new_jsi(instance, register: true, **new_param)
×
30
            else
31
              raise(ArgumentError, "instance does not look like a recognized openapi document")
×
32
            end
33
          else
34
            raise(TypeError, "instance does not look like a hash (json object)")
×
35
          end
36
        end
37
      end
38

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

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

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

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

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

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

79
      def v2?
14✔
80
        is_a?(OpenAPI::V2::Document)
14✔
81
      end
82

83
      def v3?
14✔
84
        is_a?(OpenAPI::V3_0::Document)
×
85
      end
86

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

92
      def each_operation(&block)
14✔
93
        return(to_enum(__method__)) unless block
616✔
94

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

104
      def title
14✔
105
        info && info.title
210✔
106
      end
107
    end
108

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

137
          attr_writer :request_media_type
14✔
138
          def request_media_type
14✔
139
            return @request_media_type if instance_variable_defined?(:@request_media_type)
1,442✔
140
            nil
824✔
141
          end
142
        end
143
        include Configurables
14✔
144
        include(OpenAPI::Document)
14✔
145
      end
146
    end
147

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

162
          def server
14✔
163
            nil
164
          end
165
          def server_variables
14✔
166
            nil
167
          end
168

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

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