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
# 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 },
    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



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

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) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/jsonapionify/api/resource/documentation.rb', line 39

def example_instance_for_action(action, context)
  id = generate_id
  OpenStruct.new.tap do |instance|
    instance.send "#{id_attribute}=", id.to_s
    actionable_attributes = attributes.select do |attr|
      attr.supports_read_for_action?(action, context)
    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