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.



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

def headers
  @headers
end

#referenceObject (readonly)

Returns the value of attribute reference.



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

def reference
  @reference
end

Class Method Details

.connect(endpoint) ⇒ Object



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

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

.for(endpoint, *args) ⇒ Object



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

def self.for(endpoint, *args)
	# 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, *args)
	
	return resource unless block_given?
	
	Async.run do
		begin
			yield resource
		ensure
			resource.close
		end
	end
end

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



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

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

Instance Method Details

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



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

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

#inspectObject



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

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.



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

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



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

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

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



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

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