Module: OpenApi

Defined in:
lib/open_api.rb,
lib/open_api/dsl.rb,
lib/open_api/config.rb,
lib/open_api/router.rb,
lib/oas_objs/helpers.rb,
lib/oas_objs/ref_obj.rb,
lib/open_api/dsl/api.rb,
lib/open_api/version.rb,
lib/oas_objs/param_obj.rb,
lib/oas_objs/header_obj.rb,
lib/oas_objs/schema_obj.rb,
lib/open_api/config_dsl.rb,
lib/oas_objs/example_obj.rb,
lib/open_api/dsl/helpers.rb,
lib/open_api/support/tip.rb,
lib/oas_objs/callback_obj.rb,
lib/oas_objs/response_obj.rb,
lib/oas_objs/media_type_obj.rb,
lib/open_api/dsl/components.rb,
lib/oas_objs/combined_schema.rb,
lib/oas_objs/request_body_obj.rb,
lib/oas_objs/schema_obj_helpers.rb

Defined Under Namespace

Modules: Config, ConfigDSL, DSL, Helpers, Router, Tip

Constant Summary collapse

VERSION =
"2.2.0"

Class Method Summary collapse

Class Method Details

.generate_doc(doc_name) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/open_api.rb', line 34

def generate_doc(doc_name)
  settings, doc = init_hash(doc_name)
  [*(bdc = settings[:base_doc_classes]), *bdc.flat_map(&:descendants)].each do |kls|
    next if kls.oas[:doc].blank?
    doc[:paths].merge!(kls.oas[:apis])
    doc[:tags] << kls.oas[:doc][:tag]
    doc[:components].deep_merge!(kls.oas[:doc][:components] || { })
    OpenApi.routes_index[kls.oas[:route_base]] = doc_name
  end

  doc[:components].delete_if { |_, v| v.blank? }
  doc[:tags]  = doc[:tags].sort { |a, b| a[:name] <=> b[:name] }
  doc[:paths] = doc[:paths].sort.to_h
  OpenApi.docs[doc_name] = doc#.delete_if { |_, v| v.blank? }
end

.generate_docs(read_on_controller) ⇒ Object



27
28
29
30
31
32
# File 'lib/open_api.rb', line 27

def generate_docs(read_on_controller)
  return Tip.no_config if Config.docs.keys.blank?
  traverse_controllers if read_on_controller
  Dir[*Array(Config.doc_location)].each { |file| require file }
  Config.docs.keys.map { |name| [ name, generate_doc(name) ] }.to_h
end

.init_hash(doc_name) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/open_api.rb', line 50

def init_hash(doc_name)
  settings = Config.docs[doc_name]
  doc = { openapi: '3.0.0', **settings.slice(:info, :servers) }.merge!(
      security: settings[:global_security] || [], tags: [ ], paths: { },
      components: {
          securitySchemes: settings[:securitySchemes] || { },
          schemas: { }, parameters: { }, requestBodies: { }
      }
  )
  [ settings, doc ]
end

.traverse_controllersObject



62
63
64
65
66
# File 'lib/open_api.rb', line 62

def traverse_controllers
  Dir['./app/controllers/**/*_controller.rb'].each do |file|
    file.sub('./app/controllers/', '').sub('.rb', '').camelize.constantize
  end
end

.write_docs(if: true, read_on_controller: true) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/open_api.rb', line 16

def write_docs(if: true, read_on_controller: true)
  (docs = generate_docs(read_on_controller)) and Tip.loaded
  return unless binding.local_variable_get :if

  FileUtils.mkdir_p Config.file_output_path
  docs.each do |name, doc|
    File.write "#{Config.file_output_path}/#{name}.json", JSON.pretty_generate(doc)
    Tip.generated(name.to_s.rjust(docs.keys.map(&:size).max))
  end
end