Class: Hyperdrive::Resource

Inherits:
Object
  • Object
show all
Includes:
Values
Defined in:
lib/hyperdrive/resource.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Values

default_config, default_cors_options, default_headers, definable_request_methods, http_request_methods, request_methods, supported_request_methods

Constructor Details

#initialize(name, hyperdrive_config = hyperdrive.config) ⇒ Resource

Returns a new instance of Resource.



9
10
11
12
13
14
15
16
17
# File 'lib/hyperdrive/resource.rb', line 9

def initialize(name, hyperdrive_config = hyperdrive.config)
  @namespace = name.to_s.en.plural
  @endpoint = "/#{namespace}"
  @params = default_params
  @filters = default_filters
  @request_handlers = default_request_handlers
  @config = hyperdrive_config
  @id = [@config[:vendor], @namespace].join(':')
end

Instance Attribute Details

#descriptionObject

Returns the value of attribute description.



7
8
9
# File 'lib/hyperdrive/resource.rb', line 7

def description
  @description
end

#endpointObject (readonly)

Returns the value of attribute endpoint.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def endpoint
  @endpoint
end

#filtersObject (readonly)

Returns the value of attribute filters.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def filters
  @filters
end

#idObject (readonly)

Returns the value of attribute id.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def id
  @id
end

#nameObject

Returns the value of attribute name.



7
8
9
# File 'lib/hyperdrive/resource.rb', line 7

def name
  @name
end

#namespaceObject (readonly)

Returns the value of attribute namespace.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def namespace
  @namespace
end

#paramsObject (readonly)

Returns the value of attribute params.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def params
  @params
end

#request_handlersObject (readonly)

Returns the value of attribute request_handlers.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def request_handlers
  @request_handlers
end

#versionObject (readonly)

Returns the value of attribute version.



6
7
8
# File 'lib/hyperdrive/resource.rb', line 6

def version
  @version
end

Instance Method Details

#acceptable_content_types(http_request_method) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/hyperdrive/resource.rb', line 42

def acceptable_content_types(http_request_method)
  content_types = []
  @config[:media_types].each do |media_type|
    available_versions(http_request_method).each do |version|
      content_types << "application/vnd.#{@config[:vendor]}.#{namespace}.#{version}+#{media_type}"
    end
    content_types << "application/vnd.#{@config[:vendor]}.#{namespace}+#{media_type}"
    content_types << "application/vnd.#{@config[:vendor]}+#{media_type}"
  end
  content_types
end

#allowed_methodsObject



67
68
69
# File 'lib/hyperdrive/resource.rb', line 67

def allowed_methods
  request_methods.values_at(*request_handlers.keys)
end

#available_versions(http_request_method) ⇒ Object



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

def available_versions(http_request_method)
  request_method = http_request_methods[http_request_method]
  @request_handlers[request_method].keys.sort.reverse
end

#latest_version(http_request_method) ⇒ Object



59
60
61
# File 'lib/hyperdrive/resource.rb', line 59

def latest_version(http_request_method)
  available_versions(http_request_method).first
end

#register_filter(filter, description, options = {}) ⇒ Object



23
24
25
# File 'lib/hyperdrive/resource.rb', line 23

def register_filter(filter, description, options = {})
  @filters[filter] = Filter.new(filter, description, options)
end

#register_param(param, description, options = {}) ⇒ Object



19
20
21
# File 'lib/hyperdrive/resource.rb', line 19

def register_param(param, description, options = {})
  @params[param] = Param.new(param, description, options)
end

#register_request_handler(request_method, request_handler, version = 'v1') ⇒ Object



27
28
29
30
31
32
33
34
# File 'lib/hyperdrive/resource.rb', line 27

def register_request_handler(request_method, request_handler, version = 'v1')
  @request_handlers[request_method] ||= {}
  @request_handlers[request_method].merge!({ version => request_handler })
  if request_method == :get
    @request_handlers[:head] ||= {}
    @request_handlers[:head].merge!({ version => @request_handlers[:get][version] })
  end
end

#request_handler(http_request_method, version = nil) ⇒ Object



36
37
38
39
40
# File 'lib/hyperdrive/resource.rb', line 36

def request_handler(http_request_method, version = nil)
  version ||= latest_version(http_request_method)
  request_method = http_request_methods[http_request_method]
  request_handlers[request_method][version]
end

#request_method_allowed?(http_request_method) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/hyperdrive/resource.rb', line 63

def request_method_allowed?(http_request_method)
  allowed_methods.include?(http_request_method)
end

#required?(param, http_request_method) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/hyperdrive/resource.rb', line 81

def required?(param, http_request_method)
  required_param?(param, http_request_method) or required_filter?(param, http_request_method)
end

#required_filter?(filter, http_request_method) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
# File 'lib/hyperdrive/resource.rb', line 76

def required_filter?(filter, http_request_method)
  return false unless %w(GET HEAD OPTIONS).include? http_request_method
  filters.key?(filter) and filters[filter].required?(http_request_method)
end

#required_param?(param, http_request_method) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
74
# File 'lib/hyperdrive/resource.rb', line 71

def required_param?(param, http_request_method)
  return false if %w(GET HEAD OPTIONS).include? http_request_method
  params.key?(param) and params[param].required?(http_request_method)
end

#to_hashObject



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/hyperdrive/resource.rb', line 85

def to_hash
  {
    _links: { 'self' => { href: endpoint } },
    id: id,
    name: name,
    description: description,
    methods: allowed_methods,
    params: params.map { |_,param| param.to_hash },
    filters: filters.map { |_,filter| filter.to_hash },
    media_types: allowed_methods.map { |method| acceptable_content_types(method) }.uniq
  }
end