Module: JSONAPIonify::Api::Resource::Documentation

Included in:
JSONAPIonify::Api::Resource
Defined in:
lib/jsonapionify/api/resource/documentation.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(mod) ⇒ Object



4
5
6
# File 'lib/jsonapionify/api/resource/documentation.rb', line 4

def self.extended(mod)
  mod.example_id_generator { |val| val }
end

Instance Method Details

#documentation_object(base_url) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/jsonapionify/api/resource/documentation.rb', line 17

def documentation_object(base_url)
  OpenStruct.new(
    name:             type,
    description:      JSONAPIonify::Documentation.render_markdown(@description || ''),
    relationships:    relationships.map { |r| r.documentation_object },
    request_headers:  request_header_definitions.values.map { |h| OpenStruct.new name: h.name, required: h.required, actions: h.actions },
    params:           param_definitions.values.map { |p| OpenStruct.new name: p.string, required: p.required, default: p.default_value }.reject { |p| p.name.start_with? 'fields[' },
    attributes:       attributes.sort_by(&:name).map(&:documentation_object),
    actions:          documented_actions_in_order.map do |action, base, args|
      action.documentation_object File.join(base_url, base), *args
    end
  )
end

#documented_actions_in_orderObject



8
9
10
11
12
13
14
15
# File 'lib/jsonapionify/api/resource/documentation.rb', line 8

def documented_actions_in_order
  indexes = %i{list create read update delete add replace remove}
  documented_actions.reject do |a, *|
    ['HEAD', 'OPTIONS'].include? a.request_method
  end.sort_by do |action, *|
    indexes.index(action.name) || indexes.length
  end
end

#example_id_generator(&block) ⇒ Object



31
32
33
34
35
36
37
38
39
# File 'lib/jsonapionify/api/resource/documentation.rb', line 31

def example_id_generator(&block)
  index = 0
  define_singleton_method(:generate_id) do
    instance_exec index += 1, &block
  end
  context :example_id do
    self.class.generate_id
  end
end

#example_instance_for_action(action, context, write = false) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/jsonapionify/api/resource/documentation.rb', line 41

def example_instance_for_action(action, context, write = false)
  id = generate_id
  OpenStruct.new.tap do |instance|
    instance.send "#{id_attribute}=", id.to_s
    actionable_attributes = attributes.select do |attr|
      if write
        attr.supports_write_for_action?(action, context)
      else
        attr.supports_read_for_action?(action, context)
      end
    end
    actionable_attributes.each do |attribute|
      instance.send "#{attribute.name}=", attribute.example(id)
    end

    instance.define_singleton_method :method_missing do |*args|
      self
    end
  end
end