Module: JSONAPIonify::Api::Base::ResourceDefinitions

Included in:
JSONAPIonify::Api::Base
Defined in:
lib/jsonapionify/api/base/resource_definitions.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(klass) ⇒ Object



3
4
5
6
7
8
# File 'lib/jsonapionify/api/base/resource_definitions.rb', line 3

def self.extended(klass)
  klass.class_eval do
    extend JSONAPIonify::InheritedAttributes
    inherited_hash_attribute :resource_definitions
  end
end

Instance Method Details

#define_resource(name, extend: nil, &block) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/jsonapionify/api/base/resource_definitions.rb', line 36

def define_resource(name, extend: nil, &block)
  resource_definitions[name.to_sym] =
    if extend
      sup = superclass
      cur = self
      proc do
        extend_def =
          if name.to_sym == extend.to_sym && sup.respond_to?(:resource)
            sup.resource(extend)
            sup.resource_definitions[extend.to_sym]
          else
            cur.resource(extend)
            cur.resource_definitions[extend.to_sym]
          end
        class_eval &extend_def
        class_eval &block
      end
    else
      block
    end
  const_name = name.to_s.camelcase + 'Resource'
  remove_const(const_name) if const_defined? const_name, false
  name
end

#resource(type) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/jsonapionify/api/base/resource_definitions.rb', line 10

def resource(type)
  raise ArgumentError, 'type required' if type.nil?
  type       = type.to_sym
  const_name = type.to_s.camelcase + 'Resource'
  return const_get(const_name, false) if const_defined?(const_name, false)
  raise Errors::ResourceNotFound, "Resource not defined: #{type}" unless resource_defined?(type)
  klass = Class.new(resource_class, &resource_definitions[type]).set_type(type)
  param(:fields, type)
  const_set const_name, klass
rescue NameError => e
  raise e unless e.instance_of?(NameError)
  raise Errors::ResourceNotFound, "Resource not defined: #{type}"
end

#resource_defined?(name) ⇒ Boolean

Returns:



24
25
26
27
# File 'lib/jsonapionify/api/base/resource_definitions.rb', line 24

def resource_defined?(name)
  load_resources
  !!resource_definitions[name]
end

#resourcesObject



29
30
31
32
33
34
# File 'lib/jsonapionify/api/base/resource_definitions.rb', line 29

def resources
  load_resources
  resource_definitions.map do |name, _|
    resource(name)
  end
end