Class: Async::REST::Resource

Inherits:
Protocol::HTTP::Middleware
  • Object
show all
Defined in:
lib/async/rest/resource.rb

Overview

The key abstraction of information in REST is a resource. Any information that can be named can be a resource: a document or image, a temporal service (e.g. “today’s weather in Los Angeles”), a collection of other resources, a non-virtual object (e.g. a person), and so on. In other words, any concept that might be the target of an author’s hypertext reference must fit within the definition of a resource. A resource is a conceptual mapping to a set of entities, not the entity that corresponds to the mapping at any particular point in time.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(delegate, reference = ::Protocol::HTTP::Reference.parse, headers = ::Protocol::HTTP::Headers.new) ⇒ Resource

Returns a new instance of Resource.

Parameters:

  • delegate (Async::HTTP::Middleware)

    the delegate that will handle requests.

  • reference (::Protocol::HTTP::Reference) (defaults to: ::Protocol::HTTP::Reference.parse)

    the resource identifier (base request path/parameters).

  • headers (::Protocol::HTTP::Headers) (defaults to: ::Protocol::HTTP::Headers.new)

    the default headers that will be supplied with the request.



35
36
37
38
39
40
# File 'lib/async/rest/resource.rb', line 35

def initialize(delegate, reference = ::Protocol::HTTP::Reference.parse, headers = ::Protocol::HTTP::Headers.new)
  super(delegate)
  
  @reference = reference
  @headers = headers
end

Instance Attribute Details

#headersObject (readonly)

Returns the value of attribute headers.



71
72
73
# File 'lib/async/rest/resource.rb', line 71

def headers
  @headers
end

#referenceObject (readonly)

Returns the value of attribute reference.



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

def reference
  @reference
end

Class Method Details

.connect(endpoint) ⇒ Object

Parameters:

  • endpoint (Async::HTTP::Endpoint)

    used to connect to the remote system and specify the base path.



43
44
45
46
47
# File 'lib/async/rest/resource.rb', line 43

def self.connect(endpoint)
  reference = ::Protocol::HTTP::Reference.parse(endpoint.path)
  
  return ::Protocol::HTTP::AcceptEncoding.new(HTTP::Client.new(endpoint)), reference
end

.for(endpoint, *arguments) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/async/rest/resource.rb', line 49

def self.for(endpoint, *arguments)
  # TODO This behaviour is deprecated and will probably be removed.
  if endpoint.is_a? String
    endpoint = HTTP::Endpoint.parse(endpoint)
  end
  
  client, reference = connect(endpoint)
  
  resource = self.new(client, reference, *arguments)
  
  return resource unless block_given?
  
  Async do
    begin
      yield resource
    ensure
      resource.close
    end
  end
end

.with(parent, *arguments, headers: {}, **options) ⇒ Object



73
74
75
76
77
# File 'lib/async/rest/resource.rb', line 73

def self.with(parent, *arguments, headers: {}, **options)
  reference = parent.reference.with(**options)
  
  self.new(*arguments, parent.delegate, reference, parent.headers.merge(headers))
end

Instance Method Details

#get(klass = Representation, **parameters) ⇒ Object



83
84
85
# File 'lib/async/rest/resource.rb', line 83

def get(klass = Representation, **parameters)
  klass.new(self.with(parameters: parameters)).tap(&:value)
end

#inspectObject



101
102
103
# File 'lib/async/rest/resource.rb', line 101

def inspect
  "\#<#{self.class} #{@reference.inspect} #{@headers.inspect}>"
end

#prepare_request(verb, payload) ⇒ Object

Parameters:

  • verb (String)

    the HTTP verb to use.

  • payload (Object)

    the object which will used to generate the body of the request.



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

def prepare_request(verb, payload)
  if payload
    headers = @headers.dup
    body = yield payload, headers
  else
    headers = @headers
    body = nil
  end
  
  return ::Protocol::HTTP::Request[verb, @reference, headers, body]
end

#to_sObject



105
106
107
# File 'lib/async/rest/resource.rb', line 105

def to_s
  "\#<#{self.class} #{@reference.to_s}>"
end

#with(*arguments, **options) ⇒ Object



79
80
81
# File 'lib/async/rest/resource.rb', line 79

def with(*arguments, **options)
  self.class.with(self, *arguments, **options)
end