faraday 0.8.11 → 0.9.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/.document +6 -0
  2. data/CONTRIBUTING.md +36 -0
  3. data/Gemfile +7 -6
  4. data/LICENSE.md +1 -1
  5. data/README.md +38 -51
  6. data/Rakefile +2 -18
  7. data/faraday.gemspec +34 -0
  8. data/lib/faraday.rb +181 -67
  9. data/lib/faraday/adapter.rb +19 -34
  10. data/lib/faraday/adapter/em_http.rb +24 -10
  11. data/lib/faraday/adapter/em_synchrony.rb +1 -15
  12. data/lib/faraday/adapter/excon.rb +6 -12
  13. data/lib/faraday/adapter/httpclient.rb +92 -0
  14. data/lib/faraday/adapter/net_http.rb +2 -3
  15. data/lib/faraday/adapter/net_http_persistent.rb +3 -15
  16. data/lib/faraday/adapter/patron.rb +13 -21
  17. data/lib/faraday/adapter/rack.rb +0 -2
  18. data/lib/faraday/adapter/test.rb +35 -36
  19. data/lib/faraday/adapter/typhoeus.rb +10 -12
  20. data/lib/faraday/autoload.rb +87 -0
  21. data/lib/faraday/connection.rb +196 -99
  22. data/lib/faraday/error.rb +33 -33
  23. data/lib/faraday/options.rb +215 -0
  24. data/lib/faraday/parameters.rb +193 -0
  25. data/lib/faraday/{builder.rb → rack_builder.rb} +78 -21
  26. data/lib/faraday/request.rb +12 -25
  27. data/lib/faraday/request/authorization.rb +3 -3
  28. data/lib/faraday/request/basic_authentication.rb +1 -1
  29. data/lib/faraday/request/instrumentation.rb +38 -0
  30. data/lib/faraday/request/multipart.rb +10 -9
  31. data/lib/faraday/request/retry.rb +70 -6
  32. data/lib/faraday/request/token_authentication.rb +2 -2
  33. data/lib/faraday/request/url_encoded.rb +7 -6
  34. data/lib/faraday/response.rb +17 -22
  35. data/lib/faraday/response/logger.rb +4 -4
  36. data/lib/faraday/response/raise_error.rb +4 -5
  37. data/lib/faraday/utils.rb +54 -67
  38. data/script/console +7 -0
  39. data/script/release +6 -3
  40. data/script/server +3 -1
  41. data/script/test +7 -33
  42. data/test/adapters/em_http_test.rb +6 -1
  43. data/test/adapters/em_synchrony_test.rb +7 -1
  44. data/test/adapters/excon_test.rb +0 -7
  45. data/test/adapters/httpclient_test.rb +16 -0
  46. data/test/adapters/integration.rb +8 -39
  47. data/test/adapters/logger_test.rb +1 -1
  48. data/test/adapters/net_http_test.rb +0 -31
  49. data/test/adapters/patron_test.rb +1 -1
  50. data/test/adapters/rack_test.rb +0 -5
  51. data/test/adapters/test_middleware_test.rb +19 -4
  52. data/test/adapters/typhoeus_test.rb +20 -3
  53. data/test/authentication_middleware_test.rb +7 -7
  54. data/test/connection_test.rb +52 -75
  55. data/test/env_test.rb +33 -24
  56. data/test/helper.rb +15 -13
  57. data/test/live_server.rb +10 -4
  58. data/test/middleware/instrumentation_test.rb +75 -0
  59. data/test/middleware/retry_test.rb +44 -38
  60. data/test/middleware_stack_test.rb +12 -11
  61. data/test/options_test.rb +126 -0
  62. data/test/request_middleware_test.rb +17 -7
  63. data/test/response_middleware_test.rb +2 -4
  64. data/test/strawberry.rb +2 -0
  65. metadata +82 -28
  66. checksums.yaml +0 -7
  67. data/script/proxy-server +0 -41
  68. data/test/multibyte.txt +0 -1
  69. data/test/parameters_test.rb +0 -24
  70. data/test/utils_test.rb +0 -30
@@ -0,0 +1,6 @@
1
+ CONTRIBUTING.md
2
+ LICENSE.md
3
+ README.md
4
+ bin/*
5
+ lib/**/*.rb
6
+ test/**/*.rb
@@ -0,0 +1,36 @@
1
+ ## Contributing
2
+
3
+ You can run the test suite against a live server by running `script/test`. It
4
+ automatically starts a test server in background. Only tests in
5
+ `test/adapters/*_test.rb` require a server, though.
6
+
7
+ ``` sh
8
+ # run the whole suite
9
+ $ script/test
10
+
11
+ # run only specific files
12
+ $ script/test excon typhoeus
13
+
14
+ # run tests using SSL
15
+ $ SSL=yes script/test
16
+ ```
17
+
18
+ We will accept middleware that:
19
+
20
+ 1. is useful to a broader audience, but can be implemented relatively
21
+ simple; and
22
+ 2. which isn't already present in [faraday_middleware][] project.
23
+
24
+ We will accept adapters that:
25
+
26
+ 1. support SSL & streaming;
27
+ 1. are proven and may have better performance than existing ones; or
28
+ 2. if they have features not present in included adapters.
29
+
30
+ We are pushing towards a 1.0 release, when we will have to follow [Semantic
31
+ Versioning][semver]. If your patch includes changes to break compatiblitity,
32
+ note that so we can add it to the [Changelog][].
33
+
34
+ [semver]: http://semver.org/
35
+ [changelog]: https://github.com/technoweenie/faraday/wiki/Changelog
36
+ [faraday_middleware]: https://github.com/pengwynn/faraday_middleware/wiki
data/Gemfile CHANGED
@@ -1,22 +1,23 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'ffi-ncurses', '~> 0.3', :platforms => :jruby
4
- gem 'jruby-openssl', '~> 0.8.8', :platforms => :jruby
4
+ gem 'jruby-openssl', '~> 0.7', :platforms => :jruby
5
5
  gem 'rake'
6
6
 
7
7
  group :test do
8
- gem 'test-unit'
9
- gem 'em-http-request', '>= 1.1', :require => 'em-http'
8
+ gem 'coveralls', :require => false
9
+ gem 'em-http-request', '>= 1.0', :require => 'em-http'
10
10
  gem 'em-synchrony', '>= 1.0', :require => ['em-synchrony', 'em-synchrony/em-http']
11
- gem 'excon', '>= 0.27.4'
11
+ gem 'excon', '>= 0.16.1'
12
+ gem 'httpclient', '>= 2.2'
12
13
  gem 'leftright', '>= 0.9', :require => false
13
- gem 'mime-types', '~> 1.25', :platforms => [:jruby, :ruby_18]
14
+ gem 'minitest', '>= 4.3'
14
15
  gem 'net-http-persistent', '>= 2.5', :require => false
15
16
  gem 'patron', '>= 0.4.2', :platforms => :ruby
16
17
  gem 'rack-test', '>= 0.6', :require => 'rack/test'
17
18
  gem 'simplecov'
18
19
  gem 'sinatra', '~> 1.3'
19
- gem 'typhoeus', '~> 0.3.3', :platforms => [:ruby_18, :ruby_19, :ruby_20, :ruby_21]
20
+ gem 'typhoeus', '~> 0.3.3', :platforms => :ruby
20
21
  end
21
22
 
22
23
  gemspec
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 rick olson, zack hobson
1
+ Copyright (c) 2009-2013 Rick Olson, Zack Hobson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -24,6 +24,17 @@ conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
24
24
  faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
25
25
  end
26
26
 
27
+ # set proxy with string
28
+ conn.options.proxy = "http://user:password@example.org/"
29
+
30
+ # set proxy with hash
31
+ conn.options.proxy = { :uri => 'http://user:passwordexample.org' }
32
+
33
+ # specify proxy user/pass
34
+ conn.options.proxy = { :uri => 'http://user:pass.org',
35
+ :user => 'user',
36
+ :password => 'pass' }
37
+
27
38
  ## GET ##
28
39
 
29
40
  response = conn.get '/nigiri/sake.json' # GET http://sushi.com/nigiri/sake.json
@@ -51,8 +62,19 @@ end
51
62
 
52
63
  conn.get do |req|
53
64
  req.url '/search'
54
- req.options[:timeout] = 5 # open/read timeout in seconds
55
- req.options[:open_timeout] = 2 # connection open timeout in seconds
65
+ req.options.timeout = 5 # open/read timeout in seconds
66
+ req.options.open_timeout = 2 # connection open timeout in seconds
67
+
68
+ # set proxy with string
69
+ req.options.proxy = "http://user:password@example.org/"
70
+
71
+ # set proxy with hash
72
+ req.options.proxy = { :uri => 'http://user:passwordexample.org' }
73
+
74
+ # specify proxy user/pass
75
+ req.options.proxy = { :uri => 'http://user:pass.org',
76
+ :user => 'user',
77
+ :password => 'pass' }
56
78
  end
57
79
  ```
58
80
 
@@ -175,36 +197,6 @@ stubs.verify_stubbed_calls
175
197
  * support streaming requests/responses
176
198
  * better stubbing API
177
199
 
178
- ## Contributing
179
-
180
- You can run the test suite against a live server by running `script/test`. It
181
- automatically starts a test server in background. Only tests in
182
- `test/adapters/*_test.rb` require a server, though.
183
-
184
- ``` sh
185
- # run the whole suite
186
- $ script/test
187
-
188
- # run only specific files
189
- $ script/test excon typhoeus
190
- ```
191
-
192
- We will accept middleware that:
193
-
194
- 1. is useful to a broader audience, but can be implemented relatively
195
- simple; and
196
- 2. which isn't already present in [faraday_middleware][] project.
197
-
198
- We will accept adapters that:
199
-
200
- 1. support SSL & streaming;
201
- 1. are proven and may have better performance than existing ones; or
202
- 2. if they have features not present in included adapters.
203
-
204
- We are pushing towards a 1.0 release, when we will have to follow [Semantic
205
- Versioning][semver]. If your patch includes changes to break compatiblitity,
206
- note that so we can add it to the [Changelog][].
207
-
208
200
  ## Supported Ruby versions
209
201
 
210
202
  This library aims to support and is [tested against][travis] the following Ruby
@@ -213,11 +205,11 @@ implementations:
213
205
  * MRI 1.8.7
214
206
  * MRI 1.9.2
215
207
  * MRI 1.9.3
208
+ * MRI 2.0.0
216
209
  * [JRuby][]
217
210
  * [Rubinius][]
218
211
 
219
- If something doesn't work on one of these interpreters, it should be considered
220
- a bug.
212
+ If something doesn't work on one of these Ruby versions, it's a bug.
221
213
 
222
214
  This library may inadvertently work (or seem to work) on other Ruby
223
215
  implementations, however support will only be provided for the versions listed
@@ -226,25 +218,20 @@ above.
226
218
  If you would like this library to support another Ruby version, you may
227
219
  volunteer to be a maintainer. Being a maintainer entails making sure all tests
228
220
  run and pass on that implementation. When something breaks on your
229
- implementation, you will be personally responsible for providing patches in a
230
- timely fashion. If critical issues for a particular implementation exist at the
231
- time of a major release, support for that Ruby version may be dropped.
221
+ implementation, you will be responsible for providing patches in a timely
222
+ fashion. If critical issues for a particular implementation exist at the time
223
+ of a major release, support for that Ruby version may be dropped.
232
224
 
233
225
  ## Copyright
234
226
 
235
- Copyright (c) 2009-2012 [Rick Olson](mailto:technoweenie@gmail.com), zack hobson.
227
+ Copyright (c) 2009-2013 [Rick Olson](mailto:technoweenie@gmail.com), Zack Hobson.
236
228
  See [LICENSE][] for details.
237
229
 
238
-
239
- [license]: https://github.com/technoweenie/faraday/blob/master/LICENSE.md
240
- [travis]: http://travis-ci.org/technoweenie/faraday
241
- [jruby]: http://jruby.org/
242
- [rubinius]: http://rubini.us/
243
- [semver]: http://semver.org/
244
- [changelog]: https://github.com/technoweenie/faraday/wiki/Changelog
245
- [excon]: https://github.com/geemus/excon#readme
246
- [typhoeus]: https://github.com/typhoeus/typhoeus#readme
247
- [patron]: http://toland.github.com/patron/
248
-
249
- [eventmachine]: https://github.com/igrigorik/em-http-request#readme
250
- [faraday_middleware]: https://github.com/pengwynn/faraday_middleware/wiki
230
+ [travis]: http://travis-ci.org/lostisland/faraday
231
+ [excon]: https://github.com/geemus/excon#readme
232
+ [typhoeus]: https://github.com/typhoeus/typhoeus#readme
233
+ [patron]: http://toland.github.com/patron/
234
+ [eventmachine]: https://github.com/igrigorik/em-http-request#readme
235
+ [jruby]: http://jruby.org/
236
+ [rubinius]: http://rubini.us/
237
+ [license]: LICENSE.md
data/Rakefile CHANGED
@@ -2,6 +2,8 @@ require 'date'
2
2
  require 'fileutils'
3
3
  require 'openssl'
4
4
  require 'rake/testtask'
5
+ require 'bundler'
6
+ Bundler::GemHelper.install_tasks
5
7
 
6
8
  task :default => :test
7
9
 
@@ -67,21 +69,3 @@ desc "Open an irb session preloaded with this library"
67
69
  task :console do
68
70
  sh "irb -rubygems -r ./lib/#{name}.rb"
69
71
  end
70
-
71
- ## release management tasks
72
-
73
- desc "Commit, create tag v#{version} and build and push #{gem_file} to Rubygems"
74
- task :release => :build do
75
- sh "git commit --allow-empty -a -m 'Release #{version}'"
76
- sh "git tag v#{version}"
77
- sh "git push origin"
78
- sh "git push origin v#{version}"
79
- sh "gem push pkg/#{gem_file}"
80
- end
81
-
82
- desc "Build #{gem_file} into the pkg directory"
83
- task :build do
84
- FileUtils.mkdir_p 'pkg'
85
- sh "gem build #{gemspec_file}"
86
- sh "mv #{gem_file} pkg"
87
- end
@@ -0,0 +1,34 @@
1
+ lib = "faraday"
2
+ lib_file = File.expand_path("../lib/#{lib}.rb", __FILE__)
3
+ File.read(lib_file) =~ /\bVERSION\s*=\s*["'](.+?)["']/
4
+ version = $1
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.specification_version = 2 if spec.respond_to? :specification_version=
8
+ spec.required_rubygems_version = '>= 1.3.5'
9
+
10
+ spec.name = lib
11
+ spec.version = version
12
+
13
+ spec.summary = "HTTP/REST API client library."
14
+
15
+ spec.authors = ["Rick Olson"]
16
+ spec.email = 'technoweenie@gmail.com'
17
+ spec.homepage = 'https://github.com/lostisland/faraday'
18
+ spec.licenses = ['MIT']
19
+
20
+ spec.add_dependency 'multipart-post', '~> 1.1'
21
+ spec.add_development_dependency 'bundler', '~> 1.0'
22
+
23
+ spec.files = %w(.document CONTRIBUTING.md Gemfile LICENSE.md README.md Rakefile)
24
+ spec.files << "#{lib}.gemspec"
25
+ spec.files += Dir.glob("lib/**/*.rb")
26
+ spec.files += Dir.glob("test/**/*.rb")
27
+ spec.files += Dir.glob("script/*")
28
+
29
+ dev_null = File.exist?('/dev/null') ? '/dev/null' : 'NUL'
30
+ git_files = `git ls-files -z 2>#{dev_null}`
31
+ spec.files &= git_files.split("\0") if $?.success?
32
+
33
+ spec.test_files = Dir.glob("test/**/*.rb")
34
+ end
@@ -1,25 +1,100 @@
1
+ require 'thread'
2
+ require 'cgi'
3
+ require 'set'
4
+ require 'forwardable'
5
+
6
+ # Public: This is the main namespace for Faraday. You can either use it to
7
+ # create Faraday::Connection objects, or access it directly.
8
+ #
9
+ # Examples
10
+ #
11
+ # Faraday.get "http://faraday.com"
12
+ #
13
+ # conn = Faraday.new "http://faraday.com"
14
+ # conn.get '/'
15
+ #
1
16
  module Faraday
2
- VERSION = "0.8.11"
17
+ VERSION = "0.9.0.rc1"
3
18
 
4
19
  class << self
5
- attr_accessor :root_path, :lib_path
20
+ # Public: Gets or sets the root path that Faraday is being loaded from.
21
+ # This is the root from where the libraries are auto-loaded from.
22
+ attr_accessor :root_path
23
+
24
+ # Public: Gets or sets the path that the Faraday libs are loaded from.
25
+ attr_accessor :lib_path
26
+
27
+ # Public: Gets or sets the Symbol key identifying a default Adapter to use
28
+ # for the default Faraday::Connection.
6
29
  attr_accessor :default_adapter
7
- attr_writer :default_connection
8
30
 
9
- def new(url = nil, options = {})
31
+ # Public: Sets the default Faraday::Connection for simple scripts that
32
+ # access the Faraday constant directly.
33
+ #
34
+ # Faraday.get "https://faraday.com"
35
+ attr_writer :default_connection
36
+
37
+ # Public: Sets the default options used when calling Faraday#new.
38
+ attr_writer :default_connection_options
39
+
40
+ # Public: Initializes a new Faraday::Connection.
41
+ #
42
+ # url - The optional String base URL to use as a prefix for all
43
+ # requests. Can also be the options Hash.
44
+ # options - The optional Hash used to configure this Faraday::Connection.
45
+ # Any of these values will be set on every request made, unless
46
+ # overridden for a specific request.
47
+ # :url - String base URL.
48
+ # :params - Hash of URI query unencoded key/value pairs.
49
+ # :headers - Hash of unencoded HTTP header key/value pairs.
50
+ # :request - Hash of request options.
51
+ # :ssl - Hash of SSL options.
52
+ # :proxy - Hash of Proxy options.
53
+ #
54
+ # Examples
55
+ #
56
+ # Faraday.new 'http://faraday.com'
57
+ #
58
+ # # http://faraday.com?page=1
59
+ # Faraday.new 'http://faraday.com', :params => {:page => 1}
60
+ #
61
+ # # same
62
+ #
63
+ # Faraday.new :url => 'http://faraday.com',
64
+ # :params => {:page => 1}
65
+ #
66
+ # Returns a Faraday::Connection.
67
+ def new(url = nil, options = nil)
10
68
  block = block_given? ? Proc.new : nil
69
+ options = options ? default_connection_options.merge(options) : default_connection_options.dup
11
70
  Faraday::Connection.new(url, options, &block)
12
71
  end
13
72
 
73
+ # Internal: Requires internal Faraday libraries.
74
+ #
75
+ # *libs - One or more relative String names to Faraday classes.
76
+ #
77
+ # Returns nothing.
14
78
  def require_libs(*libs)
15
79
  libs.each do |lib|
16
80
  require "#{lib_path}/#{lib}"
17
81
  end
18
82
  end
19
83
 
84
+ # Public: Updates default adapter while resetting
85
+ # #default_connection.
86
+ #
87
+ # Returns the new default_adapter.
88
+ def default_adapter=(adapter)
89
+ @default_connection = nil
90
+ @default_adapter = adapter
91
+ end
92
+
20
93
  alias require_lib require_libs
21
94
 
22
95
  private
96
+ # Internal: Proxies method calls on the Faraday constant to
97
+ # #default_connection.
23
98
  def method_missing(name, *args, &block)
24
99
  default_connection.send(name, *args, &block)
25
100
  end
@@ -29,10 +104,20 @@ module Faraday
29
104
  self.lib_path = File.expand_path "../faraday", __FILE__
30
105
  self.default_adapter = :net_http
31
106
 
107
+ # Gets the default connection used for simple scripts.
108
+ #
109
+ # Returns a Faraday::Connection, configured with the #default_adapter.
32
110
  def self.default_connection
33
111
  @default_connection ||= Connection.new
34
112
  end
35
113
 
114
+ # Gets the default connection options used when calling Faraday#new.
115
+ #
116
+ # Returns a Faraday::ConnectionOptions.
117
+ def self.default_connection_options
118
+ @default_connection_options ||= ConnectionOptions.new
119
+ end
120
+
36
121
  if (!defined?(RUBY_ENGINE) || "ruby" == RUBY_ENGINE) && RUBY_VERSION < '1.9'
37
122
  begin
38
123
  require 'system_timer'
@@ -47,101 +132,130 @@ module Faraday
47
132
  Timer = Timeout
48
133
  end
49
134
 
135
+ # Public: Adds the ability for other modules to register and lookup
136
+ # middleware classes.
50
137
  module MiddlewareRegistry
51
- # Internal: Register middleware class(es) on the current module.
138
+ # Public: Register middleware class(es) on the current module.
139
+ #
140
+ # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
141
+ # as fully qualified constant, or a Proc that will be lazily
142
+ # called to return the former.
143
+ #
144
+ # Examples
145
+ #
146
+ # module Faraday
147
+ # class Whatever
148
+ # # Middleware looked up by :foo returns Faraday::Whatever::Foo.
149
+ # register_middleware :foo => Foo
150
+ #
151
+ # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar)
152
+ # register_middleware :bar => :Bar
52
153
  #
53
- # mapping - A Hash mapping Symbol keys to classes. See
54
- # Faraday.register_middleware for more details.
55
- def register_middleware(mapping)
56
- (@registered_middleware ||= {}).update(mapping)
154
+ # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz)
155
+ # register_middleware :baz => [:Baz, 'baz']
156
+ # end
157
+ # end
158
+ #
159
+ # Returns nothing.
160
+ def register_middleware(autoload_path = nil, mapping = nil)
161
+ if mapping.nil?
162
+ mapping = autoload_path
163
+ autoload_path = nil
164
+ end
165
+ middleware_mutex do
166
+ @middleware_autoload_path = autoload_path if autoload_path
167
+ (@registered_middleware ||= {}).update(mapping)
168
+ end
57
169
  end
58
170
 
59
- # Internal: Lookup middleware class with a registered Symbol shortcut.
171
+ # Public: Lookup middleware class with a registered Symbol shortcut.
172
+ #
173
+ # key - The Symbol key for the registered middleware.
174
+ #
175
+ # Examples
176
+ #
177
+ # module Faraday
178
+ # class Whatever
179
+ # register_middleware :foo => Foo
180
+ # end
181
+ # end
182
+ #
183
+ # Faraday::Whatever.lookup_middleware(:foo)
184
+ # # => Faraday::Whatever::Foo
60
185
  #
61
186
  # Returns a middleware Class.
62
187
  def lookup_middleware(key)
63
- unless defined? @registered_middleware and found = @registered_middleware[key]
64
- raise "#{key.inspect} is not registered on #{self}"
65
- end
66
- found = @registered_middleware[key] = found.call if found.is_a? Proc
67
- found.is_a?(Module) ? found : const_get(found)
188
+ load_middleware(key) ||
189
+ raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}"))
68
190
  end
69
- end
70
191
 
71
- module AutoloadHelper
72
- def autoload_all(prefix, options)
73
- if prefix =~ /^faraday(\/|$)/i
74
- prefix = File.join(Faraday.root_path, prefix)
75
- end
76
- options.each do |const_name, path|
77
- autoload const_name, File.join(prefix, path)
192
+ def middleware_mutex(&block)
193
+ @middleware_mutex ||= begin
194
+ require 'monitor'
195
+ Monitor.new
78
196
  end
197
+ @middleware_mutex.synchronize(&block)
79
198
  end
80
199
 
81
- # Loads each autoloaded constant. If thread safety is a concern, wrap
82
- # this in a Mutex.
83
- def load_autoloaded_constants
84
- constants.each do |const|
85
- const_get(const) if autoload?(const)
86
- end
200
+ def fetch_middleware(key)
201
+ defined?(@registered_middleware) && @registered_middleware[key]
87
202
  end
88
203
 
89
- def all_loaded_constants
90
- constants.map { |c| const_get(c) }.
91
- select { |a| a.respond_to?(:loaded?) && a.loaded? }
204
+ def load_middleware(key)
205
+ value = fetch_middleware(key)
206
+ case value
207
+ when Module then value
208
+ when Symbol, String
209
+ middleware_mutex do
210
+ @registered_middleware[key] = const_get(value)
211
+ end
212
+ when Proc
213
+ middleware_mutex do
214
+ @registered_middleware[key] = value.call
215
+ end
216
+ when Array
217
+ middleware_mutex do
218
+ const, path = value
219
+ if root = @middleware_autoload_path
220
+ path = "#{root}/#{path}"
221
+ end
222
+ require(path)
223
+ @registered_middleware[key] = const
224
+ end
225
+ load_middleware(key)
226
+ end
92
227
  end
93
228
  end
94
229
 
95
- extend AutoloadHelper
96
-
97
- # Public: register middleware classes under a short name.
98
- #
99
- # type - A Symbol specifying the kind of middleware (default: :middleware)
100
- # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
101
- # as fully qualified constant, or a Proc that will be lazily called
102
- # to return the former.
103
- #
104
- # Examples
105
- #
106
- # Faraday.register_middleware :aloha => MyModule::Aloha
107
- # Faraday.register_middleware :response, :boom => MyModule::Boom
108
- #
109
- # # shortcuts are now available in Builder:
110
- # builder.use :aloha
111
- # builder.response :boom
112
- #
113
- # Returns nothing.
114
- def self.register_middleware type, mapping = nil
115
- type, mapping = :middleware, type if mapping.nil?
116
- component = self.const_get(type.to_s.capitalize)
117
- component.register_middleware(mapping)
230
+ def self.const_missing(name)
231
+ if name.to_sym == :Builder
232
+ warn "Faraday::Builder is now Faraday::RackBuilder."
233
+ const_set name, RackBuilder
234
+ else
235
+ super
236
+ end
118
237
  end
119
238
 
120
- autoload_all "faraday",
121
- :Middleware => 'middleware',
122
- :Builder => 'builder',
123
- :Request => 'request',
124
- :Response => 'response',
125
- :CompositeReadIO => 'upload_io',
126
- :UploadIO => 'upload_io',
127
- :Parts => 'upload_io'
128
-
129
- require_libs "utils", "connection", "adapter", "error"
239
+ require_libs "utils", "options", "connection", "rack_builder", "parameters",
240
+ "middleware", "adapter", "request", "response", "upload_io", "error"
130
241
  end
131
242
 
132
-
133
243
  # not pulling in active-support JUST for this method. And I love this method.
134
244
  class Object
135
- # Yields <code>x</code> to the block, and then returns <code>x</code>.
136
245
  # The primary purpose of this method is to "tap into" a method chain,
137
246
  # in order to perform operations on intermediate results within the chain.
138
247
  #
248
+ # Examples
249
+ #
139
250
  # (1..10).tap { |x| puts "original: #{x.inspect}" }.to_a.
140
251
  # tap { |x| puts "array: #{x.inspect}" }.
141
252
  # select { |x| x%2 == 0 }.
142
253
  # tap { |x| puts "evens: #{x.inspect}" }.
143
254
  # map { |x| x*x }.
144
255
  # tap { |x| puts "squares: #{x.inspect}" }
256
+ #
257
+ # Yields self.
258
+ # Returns self.
145
259
  def tap
146
260
  yield self
147
261
  self