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(resource, options = {}) ⇒ Resource

Returns a new instance of Resource.



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

def initialize(resource, options = {})
  @resource = resource.to_s.split('_')
  @resource[-1] = @resource[-1].en.plural
  @namespace = @resource.join(':')
  @endpoint = options.fetch(:endpoint) { "/#{@resource.join('/')}" }
  @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



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

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

#allowed_methodsObject



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

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

#available_versions(http_request_method) ⇒ Object



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

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



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

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

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



25
26
27
# File 'lib/hyperdrive/resource.rb', line 25

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

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



21
22
23
# File 'lib/hyperdrive/resource.rb', line 21

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

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



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

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



38
39
40
41
42
# File 'lib/hyperdrive/resource.rb', line 38

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)


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

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

#required?(param, http_request_method) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/hyperdrive/resource.rb', line 84

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)


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

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)


74
75
76
77
# File 'lib/hyperdrive/resource.rb', line 74

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



88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/hyperdrive/resource.rb', line 88

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