Class: RspecApiDocumentation::OpenApi::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec_api_documentation/open_api/node.rb

Constant Summary collapse

CHILD_CLASS =

this is used to define class of incoming option attribute If false then do not create new setting If true then create new setting with raw passed value If RspecApiDocumentation::OpenApi::Node then create new setting and wrap it in this class

false

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Node

Returns a new instance of Node.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rspec_api_documentation/open_api/node.rb', line 33

def initialize(opts = {})
  return unless opts

  opts.each do |name, value|
    if name.to_s == 'hide'
      self.hide = value
    elsif self.class::CHILD_CLASS
      add_setting name, :value => self.class::CHILD_CLASS === true ? value : self.class::CHILD_CLASS.new(value)
    elsif setting_exist?(name.to_sym)
      schema = setting_schema(name)
      converted =
        case
        when schema.is_a?(Array) && schema[0] <= Node then value.map { |v| v.is_a?(schema[0]) ? v : schema[0].new(v) }
        when schema <= Node then value.is_a?(schema) ? value : schema.new(value)
        else
          value
        end
      assign_setting(name, converted)
    else
      public_send("#{name}=", value) if respond_to?("#{name}=")
    end
  end
end

Instance Attribute Details

#hideObject

This attribute allow us to hide some of children through configuration file



11
12
13
# File 'lib/rspec_api_documentation/open_api/node.rb', line 11

def hide
  @hide
end

Class Method Details

.add_setting(name, opts = {}) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rspec_api_documentation/open_api/node.rb', line 13

def self.add_setting(name, opts = {})
  class_settings << name

  define_method("#{name}_schema") { opts[:schema] || NilClass }
  define_method("#{name}=") { |value| settings[name] = value }
  define_method("#{name}") do
    if settings.has_key?(name)
      settings[name]
    elsif !opts[:default].nil?
      if opts[:default].respond_to?(:call)
        opts[:default].call(self)
      else
        opts[:default]
      end
    elsif opts[:required]
      raise "setting: #{name} required in #{self}"
    end
  end
end

Instance Method Details

#add_setting(name, opts = {}) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/rspec_api_documentation/open_api/node.rb', line 64

def add_setting(name, opts = {})
  return false if setting_exist?(name)

  instance_settings << name

  settings[name] = opts[:value] if opts[:value]

  define_singleton_method("#{name}_schema") { opts[:schema] || NilClass }
  define_singleton_method("#{name}=") { |value| settings[name] = value }
  define_singleton_method("#{name}") do
    if settings.has_key?(name)
      settings[name]
    elsif !opts[:default].nil?
      if opts[:default].respond_to?(:call)
        opts[:default].call(self)
      else
        opts[:default]
      end
    elsif opts[:required]
      raise "setting: #{name} required in #{self}"
    end
  end
end

#as_jsonObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/rspec_api_documentation/open_api/node.rb', line 88

def as_json
  existing_settings.inject({}) do |hash, name|
    value = setting(name)
    case
    when value.is_a?(Node)
      hash[name] = value.as_json unless value.hide
    when value.is_a?(Array) && value[0].is_a?(Node)
      tmp = value.select { |v| !v.hide }.map { |v| v.as_json }
      hash[name] = tmp unless tmp.empty?
    else
      hash[name] = value
    end unless value.nil?

    hash
  end
end

#assign_setting(name, value) ⇒ Object



57
# File 'lib/rspec_api_documentation/open_api/node.rb', line 57

def assign_setting(name, value); public_send("#{name}=", value) unless value.nil? end

#existing_settingsObject



62
# File 'lib/rspec_api_documentation/open_api/node.rb', line 62

def existing_settings; self.class.class_settings + instance_settings end

#safe_assign_setting(name, value) ⇒ Object



58
# File 'lib/rspec_api_documentation/open_api/node.rb', line 58

def safe_assign_setting(name, value); assign_setting(name, value) unless settings.has_key?(name) end

#setting(name) ⇒ Object



59
# File 'lib/rspec_api_documentation/open_api/node.rb', line 59

def setting(name); public_send(name) end

#setting_exist?(name) ⇒ Boolean

Returns:

  • (Boolean)


61
# File 'lib/rspec_api_documentation/open_api/node.rb', line 61

def setting_exist?(name); existing_settings.include?(name) end

#setting_schema(name) ⇒ Object



60
# File 'lib/rspec_api_documentation/open_api/node.rb', line 60

def setting_schema(name); public_send("#{name}_schema") end