Class: Sawyer::Agent

Inherits:
Object
  • Object
show all
Defined in:
lib/sawyer/agent.rb

Constant Summary collapse

NO_BODY =
Set.new([:get, :head])

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(endpoint, options = nil) {|@conn| ... } ⇒ Agent

Agents handle making the requests, and passing responses to Sawyer::Response.

endpoint - String URI of the API entry point. options - Hash of options.

:faraday    - Optional Faraday::Connection to use.
:serializer - Optional serializer Class.  Defaults to
              self.serializer_class.

Yields the Faraday::Connection if a block is given.

Yields:

  • (@conn)


37
38
39
40
41
42
43
44
45
# File 'lib/sawyer/agent.rb', line 37

def initialize(endpoint, options = nil)
  @endpoint = endpoint
  @conn = (options && options[:faraday]) || Faraday.new
  @serializer = (options && options[:serializer]) || self.class.serializer
  @links_parser = (options && options[:links_parser]) || HalLinksParser.new
  @allow_undefined_methods = (options && options[:allow_undefined_methods])
  @conn.url_prefix = @endpoint
  yield @conn if block_given?
end

Class Attribute Details

.serializerObject



15
16
17
# File 'lib/sawyer/agent.rb', line 15

def self.serializer
  @serializer ||= Serializer.any_json
end

Instance Attribute Details

#allow_undefined_methodsObject

Returns the value of attribute allow_undefined_methods.



9
10
11
# File 'lib/sawyer/agent.rb', line 9

def allow_undefined_methods
  @allow_undefined_methods
end

Returns the value of attribute links_parser.



8
9
10
# File 'lib/sawyer/agent.rb', line 8

def links_parser
  @links_parser
end

Class Method Details

.decode(data) ⇒ Object



23
24
25
# File 'lib/sawyer/agent.rb', line 23

def self.decode(data)
  serializer.decode(data)
end

.encode(data) ⇒ Object



19
20
21
# File 'lib/sawyer/agent.rb', line 19

def self.encode(data)
  serializer.encode(data)
end

Instance Method Details

#allow_undefined_methods?Boolean

Returns:

  • (Boolean)


134
135
136
# File 'lib/sawyer/agent.rb', line 134

def allow_undefined_methods?
  !!@allow_undefined_methods
end

#call(method, url, data = nil, options = nil) ⇒ Object

Makes a request through Faraday.

method - The Symbol name of an HTTP method. url - The String URL to access. This can be relative to the Agent’s

endpoint.

data - The Optional Hash or Resource body to be sent. :get or :head

requests can have no body, so this can be the options Hash
instead.

options - Hash of option to configure the API request.

:headers - Hash of API headers to set.
:query   - Hash of URL query params to set.

Returns a Sawyer::Response.



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

def call(method, url, data = nil, options = nil)
  if NO_BODY.include?(method)
    options ||= data
    data      = nil
  end

  options ||= {}
  url = expand_url(url, options[:uri])
  started = nil
  res = @conn.send method, url do |req|
    req.body = encode_body(data) if data
    if params = options[:query]
      req.params.update params
    end
    if headers = options[:headers]
      req.headers.update headers
    end
    started = Time.now
  end
  res.env[:sawyer_started] = started
  res.env[:sawyer_ended] = Time.now

  Response.new self, res
end

#decode_body(str) ⇒ Object

Decodes a String response body to a resource.

str - The String body from the response.

Returns an Object resource (Hash by default).



120
121
122
# File 'lib/sawyer/agent.rb', line 120

def decode_body(str)
  @serializer.decode(str)
end

#encode_body(data) ⇒ Object

Encodes an object to a string for the API request.

data - The Hash or Resource that is being sent.

Returns a String.



111
112
113
# File 'lib/sawyer/agent.rb', line 111

def encode_body(data)
  @serializer.encode(data)
end

#expand_url(url, options = nil) ⇒ Object



128
129
130
131
132
# File 'lib/sawyer/agent.rb', line 128

def expand_url(url, options = nil)
  tpl = url.respond_to?(:expand) ? url : URITemplate.new(url.to_s)
  expand = tpl.method(:expand)
  options ? expand.call(options) : expand.call
end

#inspectObject



138
139
140
# File 'lib/sawyer/agent.rb', line 138

def inspect
  %(<#{self.class} #{@endpoint}>)
end


124
125
126
# File 'lib/sawyer/agent.rb', line 124

def parse_links(data)
  @links_parser.parse(data)
end

#relsObject

Public: Retains a reference to the root relations of the API.

Returns a Sawyer::Relation::Map.



50
51
52
# File 'lib/sawyer/agent.rb', line 50

def rels
  @rels ||= root.data._rels
end

#rootObject

Public: Retains a reference to the root response of the API.

Returns a Sawyer::Response.



57
58
59
# File 'lib/sawyer/agent.rb', line 57

def root
  @root ||= start
end

#startObject

Public: Hits the root of the API to get the initial actions.

Returns a Sawyer::Response.



64
65
66
# File 'lib/sawyer/agent.rb', line 64

def start
  call :get, @endpoint
end