Class: HaveAPI::Resource

Inherits:
Common
  • Object
show all
Defined in:
lib/haveapi/resource.rb

Direct Known Subclasses

HaveAPI::Resources::ActionState

Class Method Summary collapse

Methods inherited from Common

check_build, has_attr, inherit_attrs

Class Method Details

.action_defined(klass) ⇒ Object



17
18
19
20
# File 'lib/haveapi/resource.rb', line 17

def self.action_defined(klass)
  @actions ||= []
  @actions << klass
end

.actions(&block) ⇒ Object



31
32
33
# File 'lib/haveapi/resource.rb', line 31

def self.actions(&block)
  (@actions || []).each(&block)
end

.define_action(name, superclass: Action, &block) ⇒ Object



113
114
115
116
117
118
119
120
121
122
# File 'lib/haveapi/resource.rb', line 113

def self.define_action(name, superclass: Action, &block)
  return false if const_defined?(name)

  cls = Class.new(superclass)
  const_set(name, cls)
  cls.resource = self
  cls.action_name = name
  superclass.delayed_inherited(cls)
  cls.class_exec(&block)
end

.define_resource(name, superclass: Resource, &block) ⇒ Object



103
104
105
106
107
108
109
110
111
# File 'lib/haveapi/resource.rb', line 103

def self.define_resource(name, superclass: Resource, &block)
  return false if const_defined?(name) && self != HaveAPI::Resource

  cls = Class.new(superclass)
  const_set(name, cls) if self != HaveAPI::Resource
  cls.resource_name = name
  cls.class_exec(&block) if block
  cls
end

.describe(hash, context) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/haveapi/resource.rb', line 81

def self.describe(hash, context)
  ret = {description: self.desc, actions: {}, resources: {}}

  context.resource = self

  hash[:actions].each do |action, path|
    context.action = action
    context.path = path

    a_name = action.action_name.underscore
    a_desc = action.describe(context)

    ret[:actions][a_name] = a_desc if a_desc
  end

  hash[:resources].each do |resource, children|
    ret[:resources][resource.resource_name.underscore] = resource.describe(children, context)
  end

  ret
end

.inherited(subclass) ⇒ Object



13
14
15
# File 'lib/haveapi/resource.rb', line 13

def self.inherited(subclass)
  subclass.instance_variable_set(:@obj_type, obj_type)
end

.params(name, &block) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/haveapi/resource.rb', line 22

def self.params(name, &block)
  if block
    @params ||= {}
    @params[name] = block
  else
    @params[name]
  end
end

.resource_nameObject



50
51
52
# File 'lib/haveapi/resource.rb', line 50

def self.resource_name
  (@resource_name ? @resource_name.to_s : to_s).demodulize
end

.resource_name=(name) ⇒ Object



54
55
56
# File 'lib/haveapi/resource.rb', line 54

def self.resource_name=(name)
  @resource_name = name
end

.resourcesObject



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

def self.resources
  constants.select do |c|
    obj = const_get(c)

    begin
      if obj.obj_type == :resource
        yield obj
      end

    rescue NoMethodError
      next
    end
  end
end

.rest_nameObject



58
59
60
# File 'lib/haveapi/resource.rb', line 58

def self.rest_name
  singular ? resource_name.singularize.underscore : resource_name.tableize
end

.routes(prefix = '/') ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/haveapi/resource.rb', line 62

def self.routes(prefix='/')
  ret = []
  prefix = "#{prefix}#{@route || rest_name}/"

  actions do |a|
    # Call used_by for selected model adapters. It is safe to do
    # only when all classes are loaded.
    a.initialize

    ret << Route.new(a.build_route(prefix).chomp('/'), a)
  end

  resources do |r|
    ret << {r => r.routes(prefix)}
  end

  ret
end