patron 0.4.20 → 0.5.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d00ecf42f426d8d52b56cd005e3c0d1740819f96
4
+ data.tar.gz: b4635d6adc592ac3576495fa04578f1256b8517f
5
+ SHA512:
6
+ metadata.gz: 37193992f549400596a21c553023befd7e5c47b360eaf7a8ac1de2347544e2adce5e462b76543cb98ade09af6b8656426176262d25bc46e12d22db128b1ded3a
7
+ data.tar.gz: 9be5c558dd549b671137e5f62e29a9f3af2a63f35b1e7525d5afe1450a9a689973fd5f221e92de39d9bed7c9319be13bfbfa73b87de8bda4fb31284952d888fd
@@ -6,19 +6,30 @@ PATH
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- diff-lcs (1.1.3)
10
- rake (0.9.2.2)
11
- rake-compiler (0.7.9)
9
+ diff-lcs (1.2.5)
10
+ docile (1.1.5)
11
+ json (1.8.3)
12
+ rake (10.4.2)
13
+ rake-compiler (0.9.5)
12
14
  rake
13
- rcov (0.9.11)
14
- rspec (2.7.0)
15
- rspec-core (~> 2.7.0)
16
- rspec-expectations (~> 2.7.0)
17
- rspec-mocks (~> 2.7.0)
18
- rspec-core (2.7.1)
19
- rspec-expectations (2.7.0)
20
- diff-lcs (~> 1.1.2)
21
- rspec-mocks (2.7.0)
15
+ rspec (3.3.0)
16
+ rspec-core (~> 3.3.0)
17
+ rspec-expectations (~> 3.3.0)
18
+ rspec-mocks (~> 3.3.0)
19
+ rspec-core (3.3.2)
20
+ rspec-support (~> 3.3.0)
21
+ rspec-expectations (3.3.1)
22
+ diff-lcs (>= 1.2.0, < 2.0)
23
+ rspec-support (~> 3.3.0)
24
+ rspec-mocks (3.3.2)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.3.0)
27
+ rspec-support (3.3.0)
28
+ simplecov (0.10.0)
29
+ docile (~> 1.1.0)
30
+ json (~> 1.8)
31
+ simplecov-html (~> 0.10.0)
32
+ simplecov-html (0.10.0)
22
33
 
23
34
  PLATFORMS
24
35
  ruby
@@ -27,5 +38,8 @@ DEPENDENCIES
27
38
  bundler (>= 1.0.0)
28
39
  patron!
29
40
  rake-compiler (>= 0.7.5)
30
- rcov (>= 0.9.9)
31
41
  rspec (>= 2.3.0)
42
+ simplecov (>= 0.10.0)
43
+
44
+ BUNDLED WITH
45
+ 1.10.6
data/README.md CHANGED
@@ -17,6 +17,23 @@ requests:
17
17
  sess.timeout = 10
18
18
  sess.base_url = "http://myserver.com:9900"
19
19
  sess.headers['User-Agent'] = 'myapp/1.0'
20
+
21
+ You can set options with a hash in the constructor:
22
+
23
+ sess = Patron::Session.new({ :timeout => 10,
24
+ :base_url => 'http://myserver.com:9900',
25
+ :headers => {'User-Agent' => 'myapp/1.0'} } )
26
+
27
+ Or the set options in a block:
28
+
29
+ sess = Patron::Session.new do |patron|
30
+ patron.timeout = 10
31
+ patron.base_url = 'http://myserver.com:9900'
32
+ patron.headers = {'User-Agent' => 'myapp/1.0'}
33
+ end
34
+
35
+ Output debug log:
36
+
20
37
  sess.enable_debug "/tmp/patron.debug"
21
38
 
22
39
  The Session is used to make HTTP requests.
data/Rakefile CHANGED
@@ -22,7 +22,7 @@
22
22
  ##
23
23
  ## -------------------------------------------------------------------
24
24
  require 'rake/clean'
25
- require 'rake/rdoctask'
25
+ require 'rdoc/task'
26
26
  require 'rake/extensiontask'
27
27
  require 'rspec/core/rake_task'
28
28
  require 'bundler'
@@ -59,11 +59,4 @@ end
59
59
 
60
60
  task :spec => [:compile]
61
61
 
62
- desc "Run specs with RCov"
63
- RSpec::Core::RakeTask.new('spec:rcov') do |t|
64
- t.pattern = 'spec/**/*_spec.rb'
65
- t.rcov = true
66
- t.rcov_opts = %q(--sort coverage --comments --exclude "spec")
67
- end
68
-
69
62
  task :default => :spec
@@ -44,6 +44,8 @@ if CONFIG['CC'] =~ /gcc/
44
44
  end
45
45
 
46
46
  $defs.push("-DUSE_TBR")
47
- $defs.push("-DHAVE_TBR") if have_func('rb_thread_blocking_region')
47
+ $defs.push("-DHAVE_THREAD_H") if have_header('ruby/thread.h')
48
+ $defs.push("-DHAVE_TBR") if have_func('rb_thread_blocking_region', 'ruby.h')
49
+ $defs.push("-DHAVE_TCWOGVL") if have_header('ruby/thread.h') && have_func('rb_thread_call_without_gvl', 'ruby/thread.h')
48
50
 
49
51
  create_makefile 'patron/session_ext'
@@ -23,6 +23,9 @@
23
23
  *
24
24
  \* -------------------------------------------------------------------------- */
25
25
  #include <ruby.h>
26
+ #if defined(USE_TBR) && defined(HAVE_THREAD_H)
27
+ #include <ruby/thread.h>
28
+ #endif
26
29
  #include <curl/curl.h>
27
30
  #include "membuffer.h"
28
31
  #include "sglib.h" /* Simple Generic Library -> http://sglib.sourceforge.net */
@@ -109,7 +112,7 @@ struct curl_state_list {
109
112
  struct curl_state_list *next;
110
113
  };
111
114
 
112
- #define CS_LIST_COMPARATOR(p, _state_) (p->state == _state_)
115
+ #define CS_LIST_COMPARATOR(p, _state_) (p->state - _state_)
113
116
 
114
117
  static struct curl_state_list *cs_list = NULL;
115
118
 
@@ -128,9 +131,9 @@ static void cs_list_remove(struct curl_state *state) {
128
131
  struct curl_state_list *item = NULL;
129
132
 
130
133
  assert(state != NULL);
131
- SGLIB_LIST_FIND_MEMBER(struct curl_state_list, cs_list, state, CS_LIST_COMPARATOR, next, item);
134
+
135
+ SGLIB_LIST_DELETE_IF_MEMBER(struct curl_state_list, cs_list, state, CS_LIST_COMPARATOR, next, item);
132
136
  if (item) {
133
- SGLIB_LIST_DELETE(struct curl_state_list, cs_list, item, next);
134
137
  ruby_xfree(item);
135
138
  }
136
139
  }
@@ -355,7 +358,9 @@ static void set_options_from_request(VALUE self, VALUE request) {
355
358
  }
356
359
 
357
360
  action = SYM2ID(action_name);
358
-
361
+ if(rb_iv_get(request, "@force_ipv4")) {
362
+ curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
363
+ }
359
364
  if (action == rb_intern("get")) {
360
365
  VALUE data = rb_iv_get(request, "@upload_data");
361
366
  VALUE download_file = rb_iv_get(request, "@file_name");
@@ -593,11 +598,18 @@ static VALUE perform_request(VALUE self) {
593
598
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, body_buffer);
594
599
  }
595
600
 
596
- #if defined(HAVE_TBR) && defined(USE_TBR)
601
+ #if (defined(HAVE_TBR) || defined(HAVE_TCWOGVL)) && defined(USE_TBR)
602
+ #if defined(HAVE_TCWOGVL)
603
+ ret = (CURLcode) rb_thread_call_without_gvl(
604
+ (void *(*)(void *)) curl_easy_perform, curl,
605
+ RUBY_UBF_IO, 0
606
+ );
607
+ #else
597
608
  ret = (CURLcode) rb_thread_blocking_region(
598
609
  (rb_blocking_function_t*) curl_easy_perform, curl,
599
610
  RUBY_UBF_IO, 0
600
611
  );
612
+ #endif
601
613
  #else
602
614
  ret = curl_easy_perform(curl);
603
615
  #endif
@@ -46,12 +46,12 @@ module Patron
46
46
  :url, :username, :password, :file_name, :proxy, :proxy_type, :insecure,
47
47
  :ignore_content_length, :multipart, :action, :timeout, :connect_timeout,
48
48
  :max_redirects, :headers, :auth_type, :upload_data, :buffer_size, :cacert,
49
- :ssl_version
49
+ :ssl_version, :force_ipv4
50
50
  ]
51
51
 
52
52
  WRITER_VARS = [
53
53
  :url, :username, :password, :file_name, :proxy, :proxy_type, :insecure,
54
- :ignore_content_length, :multipart, :cacert, :ssl_version
54
+ :ignore_content_length, :multipart, :cacert, :ssl_version, :force_ipv4
55
55
  ]
56
56
 
57
57
  attr_reader *READER_VARS
@@ -110,7 +110,7 @@ module Patron
110
110
 
111
111
  @connect_timeout = new_timeout.to_i
112
112
  end
113
-
113
+
114
114
  def max_redirects=(new_max_redirects)
115
115
  if new_max_redirects.to_i < -1
116
116
  raise ArgumentError, "Max redirects must be a positive integer, 0 or -1"
@@ -85,20 +85,22 @@ module Patron
85
85
  def parse_headers(header_data)
86
86
  @headers = {}
87
87
 
88
- header_data.split(/\r\n/).each do |header|
89
- if header =~ %r|^HTTP/1.[01]|
90
- @status_line = header.strip
88
+ lines = header_data.split("\r\n")
89
+
90
+ @status_line = lines.shift
91
+
92
+ lines.each do |line|
93
+ break if line.empty?
94
+
95
+ hdr, val = line.split(":", 2)
96
+
97
+ val.strip! unless val.nil?
98
+
99
+ if @headers.key?(hdr)
100
+ @headers[hdr] = [@headers[hdr]] unless @headers[hdr].kind_of? Array
101
+ @headers[hdr] << val
91
102
  else
92
- parts = header.split(':', 2)
93
- unless parts.empty?
94
- parts[1].strip! unless parts[1].nil?
95
- if @headers.has_key?(parts[0])
96
- @headers[parts[0]] = [@headers[parts[0]]] unless @headers[parts[0]].kind_of? Array
97
- @headers[parts[0]] << parts[1]
98
- else
99
- @headers[parts[0]] = parts[1]
100
- end
101
- end
103
+ @headers[hdr] = val
102
104
  end
103
105
  end
104
106
  end
@@ -83,16 +83,31 @@ module Patron
83
83
 
84
84
  # Default encoding of responses. Used if no charset is provided by the host.
85
85
  attr_accessor :default_response_charset
86
+
87
+ # Force curl to use IPv4
88
+ attr_accessor :force_ipv4
86
89
 
87
90
  private :handle_request, :enable_cookie_session, :set_debug_file
88
91
 
89
92
  # Create a new Session object.
90
- def initialize
91
- @headers = {}
92
- @timeout = 5
93
- @connect_timeout = 1
94
- @max_redirects = 5
95
- @auth_type = :basic
93
+ def initialize(args = {}, &block)
94
+
95
+ # Allows accessors to be set via constructor hash. Ex: {:base_url => 'www.home.com'}
96
+ args.each do |attribute, value|
97
+ send("#{attribute}=", value)
98
+ end
99
+
100
+ # Allows accessors to be set via block.
101
+ if block_given?
102
+ yield self
103
+ end
104
+
105
+ @headers ||= {}
106
+ @timeout ||= 5
107
+ @connect_timeout ||= 1
108
+ @max_redirects ||= 5
109
+ @auth_type ||= :basic
110
+ @force_ipv4 ||= false
96
111
  end
97
112
 
98
113
  # Turn on cookie handling for this session, storing them in memory by
@@ -211,6 +226,7 @@ module Patron
211
226
  req.headers = self.headers.merge headers
212
227
  req.timeout = options.fetch :timeout, self.timeout
213
228
  req.connect_timeout = options.fetch :connect_timeout, self.connect_timeout
229
+ req.force_ipv4 = options.fetch :force_ipv4, self.force_ipv4
214
230
  req.max_redirects = options.fetch :max_redirects, self.max_redirects
215
231
  req.username = options.fetch :username, self.username
216
232
  req.password = options.fetch :password, self.password
@@ -229,7 +245,7 @@ module Patron
229
245
  base_url = self.base_url.to_s
230
246
  url = url.to_s
231
247
  raise ArgumentError, "Empty URL" if base_url.empty? && url.empty?
232
- uri = URI.join(base_url, url)
248
+ uri = URI.parse(base_url.empty? ? url : File.join(base_url, url))
233
249
  query = uri.query.to_s.split('&')
234
250
  query += options[:query].is_a?(Hash) ? Util.build_query_pairs_from_hash(options[:query]) : options[:query].to_s.split('&')
235
251
  uri.query = query.join('&')
@@ -1,3 +1,3 @@
1
1
  module Patron
2
- VERSION = "0.4.20"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.add_development_dependency "bundler", ">= 1.0.0"
18
18
  s.add_development_dependency "rake-compiler", ">= 0.7.5"
19
19
  s.add_development_dependency "rspec", ">= 2.3.0"
20
- s.add_development_dependency "rcov", ">= 0.9.9"
20
+ s.add_development_dependency "simplecov", ">= 0.10.0"
21
21
 
22
22
  s.files = `git ls-files`.split("\n")
23
23
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
@@ -27,12 +27,12 @@ describe Patron do
27
27
 
28
28
  it "should return the version number of the Patron library" do
29
29
  version = Patron.version
30
- version.should match(%r|^\d+.\d+.\d+$|)
30
+ expect(version).to match(%r|^\d+.\d+.\d+$|)
31
31
  end
32
32
 
33
33
  it "should return the version number of the libcurl library" do
34
34
  version = Patron.libcurl_version
35
- version.should match(%r|^libcurl/\d+.\d+.\d+|)
35
+ expect(version).to match(%r|^libcurl/\d+.\d+.\d+|)
36
36
  end
37
37
 
38
38
  end
@@ -34,12 +34,12 @@ describe Patron::Request do
34
34
 
35
35
  it "should accept :get, :put, :post, :delete and :head" do
36
36
  [:get, :put, :post, :delete, :head, :copy].each do |action|
37
- lambda {@request.action = action}.should_not raise_error
37
+ expect {@request.action = action}.not_to raise_error
38
38
  end
39
39
  end
40
40
 
41
41
  it "should raise an exception when assigned a bad value" do
42
- lambda {@request.action = :foo}.should raise_error(ArgumentError)
42
+ expect {@request.action = :foo}.to raise_error(ArgumentError)
43
43
  end
44
44
 
45
45
  end
@@ -47,11 +47,11 @@ describe Patron::Request do
47
47
  describe :timeout do
48
48
 
49
49
  it "should raise an exception when assigned a negative number" do
50
- lambda {@request.timeout = -1}.should raise_error(ArgumentError)
50
+ expect {@request.timeout = -1}.to raise_error(ArgumentError)
51
51
  end
52
52
 
53
53
  it "should raise an exception when assigned 0" do
54
- lambda {@request.timeout = 0}.should raise_error(ArgumentError)
54
+ expect {@request.timeout = 0}.to raise_error(ArgumentError)
55
55
  end
56
56
 
57
57
  end
@@ -59,7 +59,7 @@ describe Patron::Request do
59
59
  describe :max_redirects do
60
60
 
61
61
  it "should raise an error when assigned an integer smaller than -1" do
62
- lambda {@request.max_redirects = -2}.should raise_error(ArgumentError)
62
+ expect {@request.max_redirects = -2}.to raise_error(ArgumentError)
63
63
  end
64
64
 
65
65
  end
@@ -67,7 +67,7 @@ describe Patron::Request do
67
67
  describe :headers do
68
68
 
69
69
  it "should raise an error when assigned something other than a hash" do
70
- lambda {@request.headers = :foo}.should raise_error(ArgumentError)
70
+ expect {@request.headers = :foo}.to raise_error(ArgumentError)
71
71
  end
72
72
 
73
73
  end
@@ -75,11 +75,11 @@ describe Patron::Request do
75
75
  describe :buffer_size do
76
76
 
77
77
  it "should raise an exception when assigned a negative number" do
78
- lambda {@request.buffer_size = -1}.should raise_error(ArgumentError)
78
+ expect {@request.buffer_size = -1}.to raise_error(ArgumentError)
79
79
  end
80
80
 
81
81
  it "should raise an exception when assigned 0" do
82
- lambda {@request.buffer_size = 0}.should raise_error(ArgumentError)
82
+ expect {@request.buffer_size = 0}.to raise_error(ArgumentError)
83
83
  end
84
84
 
85
85
  end
@@ -87,18 +87,18 @@ describe Patron::Request do
87
87
  describe :eql? do
88
88
 
89
89
  it "should return true when two requests are equal" do
90
- @request.should eql(Patron::Request.new)
90
+ expect(@request).to eql(Patron::Request.new)
91
91
  end
92
92
 
93
93
  it "should return false when two requests are not equal" do
94
94
  req = Patron::Request.new
95
95
  req.action = :post
96
- @request.should_not eql(req)
96
+ expect(@request).not_to eql(req)
97
97
  end
98
98
 
99
99
  end
100
100
 
101
101
  it "should be able to serialize and deserialize itself" do
102
- Marshal.load(Marshal.dump(@request)).should eql(@request)
102
+ expect(Marshal.load(Marshal.dump(@request))).to eql(@request)
103
103
  end
104
104
  end
@@ -35,28 +35,28 @@ describe Patron::Response do
35
35
  it "should strip extra spaces from header values" do
36
36
  response = @session.get("/test")
37
37
  # All digits, no spaces
38
- response.headers['Content-Length'].should match(/^\d+$/)
38
+ expect(response.headers['Content-Length']).to match(/^\d+$/)
39
39
  end
40
40
 
41
41
  it "should return an array of values when multiple header fields have same name" do
42
42
  response = @session.get("/repetitiveheader")
43
- response.headers['Set-Cookie'].should == ["a=1","b=2"]
43
+ expect(response.headers['Set-Cookie']).to be == ["a=1","b=2"]
44
44
  end
45
45
 
46
46
  it "should works with non-text files" do
47
47
  response = @session.get("/picture")
48
- response.headers['Content-Type'].should == 'image/png'
49
- response.body.encoding.should == Encoding::ASCII_8BIT
48
+ expect(response.headers['Content-Type']).to be == 'image/png'
49
+ expect(response.body.encoding).to be == Encoding::ASCII_8BIT
50
50
  end
51
51
 
52
52
  it "should not allow a default charset to be nil" do
53
- Encoding.stub(:default_internal).and_return("UTF-8")
53
+ allow(Encoding).to receive(:default_internal).and_return("UTF-8")
54
54
  expect {
55
55
  Patron::Response.new("url", "status", 0, "", "", nil)
56
56
  }.to_not raise_error
57
57
  end
58
58
 
59
59
  it "should be able to serialize and deserialize itself" do
60
- Marshal.load(Marshal.dump(@request)).should eql(@request)
60
+ expect(Marshal.load(Marshal.dump(@request))).to eql(@request)
61
61
  end
62
62
  end
@@ -34,207 +34,218 @@ describe Patron::Session do
34
34
  @session.base_url = "http://localhost:9001"
35
35
  end
36
36
 
37
+ it "should work when forcing ipv4" do
38
+ @session.force_ipv4 = true
39
+ expect { @session.get("/test") }.to_not raise_error
40
+ end
41
+
37
42
  it "should escape and unescape strings symetrically" do
38
43
  string = "foo~bar baz/"
39
44
  escaped = @session.escape(string)
40
45
  unescaped = @session.unescape(escaped)
41
- unescaped.should == string
46
+ expect(unescaped).to be == string
42
47
  end
43
48
 
44
49
  it "should raise an error when passed an invalid action" do
45
- lambda { @session.request(:bogus, "/test", {}) }.should raise_error(ArgumentError)
50
+ expect { @session.request(:bogus, "/test", {}) }.to raise_error(ArgumentError)
46
51
  end
47
52
 
48
53
  it "should raise an error when no URL is provided" do
49
54
  @session.base_url = nil
50
- lambda {@session.get(nil)}.should raise_error(ArgumentError)
55
+ expect {@session.get(nil)}.to raise_error(ArgumentError)
51
56
  end
52
57
 
53
58
  it "should retrieve a url with :get" do
54
59
  response = @session.get("/test")
55
60
  body = YAML::load(response.body)
56
- body.request_method.should == "GET"
61
+ expect(body.request_method).to be == "GET"
62
+ end
63
+
64
+ it "should use full base url" do
65
+ @session.base_url = "http://localhost:9001/api/v1"
66
+ response = @session.get("/test")
67
+ expect(response.url).to be == "http://localhost:9001/api/v1/test"
57
68
  end
58
69
 
59
70
  it 'should ignore #base_url when a full URL is provided' do
60
71
  @session.base_url = "http://example.com:123"
61
- lambda { @session.get("http://localhost:9001/test") }.should_not raise_error(URI::InvalidURIError)
72
+ expect { @session.get("http://localhost:9001/test") }.to_not raise_error(URI::InvalidURIError)
62
73
  end
63
74
 
64
75
  it "should download content with :get and a file path" do
65
76
  tmpfile = "/tmp/patron_test.yaml"
66
77
  response = @session.get_file "/test", tmpfile
67
- response.body.should be_nil
78
+ expect(response.body).to be_nil
68
79
  body = YAML::load_file(tmpfile)
69
- body.request_method.should == "GET"
80
+ expect(body.request_method).to be == "GET"
70
81
  FileUtils.rm tmpfile
71
82
  end
72
83
 
73
84
  it "should download correctly(md5 ok) with get_file" do
74
85
  tmpfile = "/tmp/picture"
75
86
  response = @session.get_file "/picture", tmpfile
76
- response.body.should be_nil
77
- File.size(File.join(File.dirname(__FILE__),"../pic.png")).should == File.size(tmpfile)
87
+ expect(response.body).to be_nil
88
+ expect(File.size(File.join(File.dirname(__FILE__),"../pic.png"))).to be == File.size(tmpfile)
78
89
  FileUtils.rm tmpfile
79
90
  end
80
91
 
81
92
  it "should include custom headers in a request" do
82
93
  response = @session.get("/test", {"User-Agent" => "PatronTest"})
83
94
  body = YAML::load(response.body)
84
- body.header["user-agent"].should == ["PatronTest"]
95
+ expect(body.header["user-agent"]).to be == ["PatronTest"]
85
96
  end
86
97
 
87
98
  it "should include default headers in a request, if they were defined" do
88
99
  @session.headers = {"User-Agent" => "PatronTest"}
89
100
  response = @session.get("/test")
90
101
  body = YAML::load(response.body)
91
- body.header["user-agent"].should == ["PatronTest"]
102
+ expect(body.header["user-agent"]).to be == ["PatronTest"]
92
103
  end
93
104
 
94
105
  it "should merge custom headers with session headers" do
95
106
  @session.headers["X-Test"] = "Testing"
96
107
  response = @session.get("/test", {"User-Agent" => "PatronTest"})
97
108
  body = YAML::load(response.body)
98
- body.header["user-agent"].should == ["PatronTest"]
99
- body.header["x-test"].should == ["Testing"]
109
+ expect(body.header["user-agent"]).to be == ["PatronTest"]
110
+ expect(body.header["x-test"]).to be == ["Testing"]
100
111
  end
101
112
 
102
113
  it "should raise an exception on timeout" do
103
114
  @session.timeout = 1
104
- lambda {@session.get("/timeout")}.should raise_error(Patron::TimeoutError)
115
+ expect {@session.get("/timeout")}.to raise_error(Patron::TimeoutError)
105
116
  end
106
117
 
107
118
  it "should follow redirects by default" do
108
119
  @session.max_redirects = 1
109
120
  response = @session.get("/redirect")
110
121
  body = YAML::load(response.body)
111
- response.status.should == 200
112
- body.path.should == "/test"
122
+ expect(response.status).to be == 200
123
+ expect(body.path).to be == "/test"
113
124
  end
114
125
 
115
126
  it "should include redirect count in response" do
116
127
  @session.max_redirects = 1
117
128
  response = @session.get("/redirect")
118
- response.redirect_count.should == 1
129
+ expect(response.redirect_count).to be == 1
119
130
  end
120
131
 
121
132
  it "should not follow redirects when configured to do so" do
122
133
  @session.max_redirects = 0
123
134
  response = @session.get("/redirect")
124
- response.status.should == 301
125
- response.body.should be_empty
135
+ expect(response.status).to be == 301
136
+ expect(response.body).to be_empty
126
137
  end
127
138
 
128
139
  it "should retrieve URL metadata with :head" do
129
140
  response = @session.head("/test")
130
- response.status.should == 200
131
- response.body.should be_empty
132
- response.headers.should_not be_empty
141
+ expect(response.status).to be == 200
142
+ expect(response.body).to be_empty
143
+ expect(response.headers).to_not be_empty
133
144
  end
134
145
 
135
146
  it "should send a delete request with :delete" do
136
147
  response = @session.delete("/test")
137
148
  body = YAML::load(response.body)
138
- body.request_method.should == "DELETE"
149
+ expect(body.request_method).to be == "DELETE"
139
150
  end
140
151
 
141
152
  it "should send a COPY request with :copy" do
142
153
  response = @session.copy("/test", "/test2")
143
154
  body = YAML::load(response.body)
144
- body.request_method.should == "COPY"
155
+ expect(body.request_method).to be == "COPY"
145
156
  end
146
157
 
147
158
  it "should include a Destination header in COPY requests" do
148
159
  response = @session.copy("/test", "/test2")
149
160
  body = YAML::load(response.body)
150
- body.header['destination'].first.should == "/test2"
161
+ expect(body.header['destination'].first).to be == "/test2"
151
162
  end
152
163
 
153
164
  it "should upload data with :get" do
154
165
  data = "upload data"
155
166
  response = @session.request(:get, "/test", {}, :data => data)
156
167
  body = YAML::load(response.body)
157
- body.request_method.should == "GET"
158
- body.header['content-length'].should == [data.size.to_s]
168
+ expect(body.request_method).to be == "GET"
169
+ expect(body.header['content-length']).to be == [data.size.to_s]
159
170
  end
160
171
 
161
172
  it "should upload data with :put" do
162
173
  data = "upload data"
163
174
  response = @session.put("/test", data)
164
175
  body = YAML::load(response.body)
165
- body.request_method.should == "PUT"
166
- body.header['content-length'].should == [data.size.to_s]
176
+ expect(body.request_method).to be == "PUT"
177
+ expect(body.header['content-length']).to be == [data.size.to_s]
167
178
  end
168
179
 
169
180
  it "should upload data with :delete" do
170
181
  data = "upload data"
171
182
  response = @session.request(:delete, "/test", {}, :data => data)
172
183
  body = YAML::load(response.body)
173
- body.request_method.should == "DELETE"
174
- body.header['content-length'].should == [data.size.to_s]
184
+ expect(body.request_method).to be == "DELETE"
185
+ expect(body.header['content-length']).to be == [data.size.to_s]
175
186
  end
176
187
 
177
188
  it "should raise when no data is provided to :put" do
178
- lambda { @session.put("/test", nil) }.should raise_error(ArgumentError)
189
+ expect { @session.put("/test", nil) }.to raise_error(ArgumentError)
179
190
  end
180
191
 
181
192
  it "should upload a file with :put" do
182
193
  response = @session.put_file("/test", "LICENSE")
183
194
  body = YAML::load(response.body)
184
- body.request_method.should == "PUT"
195
+ expect(body.request_method).to be == "PUT"
185
196
  end
186
197
 
187
198
  it "should raise when no file is provided to :put" do
188
- lambda { @session.put_file("/test", nil) }.should raise_error(ArgumentError)
199
+ expect { @session.put_file("/test", nil) }.to raise_error(ArgumentError)
189
200
  end
190
201
 
191
202
  it "should use chunked encoding when uploading a file with :put" do
192
203
  response = @session.put_file("/test", "LICENSE")
193
204
  body = YAML::load(response.body)
194
- body.header['transfer-encoding'].first.should == "chunked"
205
+ expect(body.header['transfer-encoding'].first).to be == "chunked"
195
206
  end
196
207
 
197
208
  it "should upload data with :post" do
198
209
  data = "upload data"
199
210
  response = @session.post("/test", data)
200
211
  body = YAML::load(response.body)
201
- body.request_method.should == "POST"
202
- body.header['content-length'].should == [data.size.to_s]
212
+ expect(body.request_method).to be == "POST"
213
+ expect(body.header['content-length']).to be == [data.size.to_s]
203
214
  end
204
215
 
205
216
  it "should post a hash of arguments as a urlencoded form" do
206
217
  data = {:foo => 123, 'baz' => '++hello world++'}
207
218
  response = @session.post("/testpost", data)
208
219
  body = YAML::load(response.body)
209
- body['content_type'].should == "application/x-www-form-urlencoded"
210
- body['body'].should match(/baz=%2B%2Bhello%20world%2B%2B/)
211
- body['body'].should match(/foo=123/)
220
+ expect(body['content_type']).to be == "application/x-www-form-urlencoded"
221
+ expect(body['body']).to match(/baz=%2B%2Bhello%20world%2B%2B/)
222
+ expect(body['body']).to match(/foo=123/)
212
223
  end
213
224
 
214
225
  it "should raise when no data is provided to :post" do
215
- lambda { @session.post("/test", nil) }.should raise_error(ArgumentError)
226
+ expect { @session.post("/test", nil) }.to raise_error(ArgumentError)
216
227
  end
217
228
 
218
229
  it "should upload a file with :post" do
219
230
  response = @session.post_file("/test", "LICENSE")
220
231
  body = YAML::load(response.body)
221
- body.request_method.should == "POST"
232
+ expect(body.request_method).to be == "POST"
222
233
  end
223
234
 
224
235
  it "should upload a multipart with :post" do
225
236
  response = @session.post_multipart("/test", { :test_data => "123" }, { :test_file => "LICENSE" } )
226
237
  body = YAML::load(response.body)
227
- body.request_method.should == "POST"
238
+ expect(body.request_method).to be == "POST"
228
239
  end
229
240
 
230
241
  it "should raise when no file is provided to :post" do
231
- lambda { @session.post_file("/test", nil) }.should raise_error(ArgumentError)
242
+ expect { @session.post_file("/test", nil) }.to raise_error(ArgumentError)
232
243
  end
233
244
 
234
245
  it "should use chunked encoding when uploading a file with :post" do
235
246
  response = @session.post_file("/test", "LICENSE")
236
247
  body = YAML::load(response.body)
237
- body.header['transfer-encoding'].first.should == "chunked"
248
+ expect(body.header['transfer-encoding'].first).to be == "chunked"
238
249
  end
239
250
 
240
251
  it "should pass credentials as http basic auth" do
@@ -242,36 +253,36 @@ describe Patron::Session do
242
253
  @session.password = "bar"
243
254
  response = @session.get("/test")
244
255
  body = YAML::load(response.body)
245
- body.header['authorization'].should == [encode_authz("foo", "bar")]
256
+ expect(body.header['authorization']).to be == [encode_authz("foo", "bar")]
246
257
  end
247
258
 
248
259
  it "should handle cookies if set" do
249
260
  @session.handle_cookies
250
261
  response = @session.get("/setcookie").body
251
- YAML::load(response).header['cookie'].first.should == "session_id=foo123"
262
+ expect(YAML::load(response).header['cookie'].first).to be == "session_id=foo123"
252
263
  end
253
264
 
254
265
  it "should not handle cookies by default" do
255
266
  response = @session.get("/setcookie").body
256
- YAML::load(response).header.should_not include('cookie')
267
+ expect(YAML::load(response).header).to_not include('cookie')
257
268
  end
258
269
 
259
270
  it "should ignore a wrong Content-Length when asked to" do
260
- lambda {
271
+ expect {
261
272
  @session.ignore_content_length = true
262
273
  @session.get("/wrongcontentlength")
263
- }.should_not raise_error
274
+ }.to_not raise_error
264
275
  end
265
276
 
266
277
  it "should fail by default with a Content-Length too high" do
267
- lambda {
278
+ expect {
268
279
  @session.ignore_content_length = nil
269
280
  @session.get("/wrongcontentlength")
270
- }.should raise_error(Patron::PartialFileError)
281
+ }.to raise_error(Patron::PartialFileError)
271
282
  end
272
283
 
273
284
  it "should raise exception if cookie store is not writable or readable" do
274
- lambda { @session.handle_cookies("/trash/clash/foo") }.should raise_error(ArgumentError)
285
+ expect { @session.handle_cookies("/trash/clash/foo") }.to raise_error(ArgumentError)
275
286
  end
276
287
 
277
288
  it "should work with multiple threads" do
@@ -296,42 +307,109 @@ describe Patron::Session do
296
307
 
297
308
  body = nil
298
309
 
299
- lambda {
310
+ expect {
300
311
  response = @session.get("/test")
301
312
  body = YAML::load(response.body)
302
- }.should_not raise_error
313
+ }.to_not raise_error
303
314
 
304
- body.request_method.should == "GET"
315
+ expect(body.request_method).to be == "GET"
305
316
  end
306
317
 
307
318
  it "should serialize query params and append them to the url" do
308
319
  response = @session.request(:get, "/test", {}, :query => {:foo => "bar"})
309
320
  request = YAML::load(response.body)
310
321
  request.parse
311
- (request.path + '?' + request.query_string).should == "/test?foo=bar"
322
+ expect(request.path + '?' + request.query_string).to be == "/test?foo=bar"
312
323
  end
313
324
 
314
325
  it "should merge parameters in the :query option with pre-existing query parameters" do
315
326
  response = @session.request(:get, "/test?foo=bar", {}, :query => {:baz => "quux"})
316
327
  request = YAML::load(response.body)
317
328
  request.parse
318
- (request.path + '?' + request.query_string).should == "/test?foo=bar&baz=quux"
329
+ expect(request.path + '?' + request.query_string).to be == "/test?foo=bar&baz=quux"
319
330
  end
320
331
 
321
332
  def encode_authz(user, passwd)
322
333
  "Basic " + Base64.encode64("#{user}:#{passwd}").strip
323
334
  end
324
335
 
336
+ describe 'when instantiating with hash arguments' do
337
+
338
+ let(:args) { {
339
+ :timeout => 10,
340
+ :base_url => 'http://localhost:9001',
341
+ :headers => {'User-Agent' => 'myapp/1.0'}
342
+ } }
343
+
344
+ let(:session) { Patron::Session.new(args) }
345
+
346
+ it 'sets the base_url' do
347
+ expect(session.base_url).to be == args[:base_url]
348
+ end
349
+
350
+ it 'sets timeout' do
351
+ expect(session.timeout).to be == args[:timeout]
352
+ end
353
+
354
+ it 'sets headers' do
355
+ expect(session.headers).to be == args[:headers]
356
+ end
357
+
358
+ context 'when given an incorrect accessor name' do
359
+ let(:args) { { :not_a_real_accessor => 'http://localhost:9001' }}
360
+ it 'raises no method error' do
361
+ expect { session }.to raise_error NoMethodError
362
+ end
363
+ end
364
+
365
+ end
366
+
367
+ describe 'when instantiating with a block' do
368
+ args = {
369
+ :timeout => 10,
370
+ :base_url => 'http://localhost:9001',
371
+ :headers => {'User-Agent' => 'myapp/1.0'}
372
+ }
373
+
374
+ session = Patron::Session.new do |patron|
375
+ patron.timeout = args[:timeout]
376
+ patron.base_url = args[:base_url]
377
+ patron.headers = args[:headers]
378
+ end
379
+
380
+ it 'sets the base_url' do
381
+ expect(session.base_url).to be == args[:base_url]
382
+ end
383
+
384
+ it 'sets timeout' do
385
+ expect(session.timeout).to be == args[:timeout]
386
+ end
387
+
388
+ it 'sets headers' do
389
+ expect(session.headers).to be == args[:headers]
390
+ end
391
+
392
+ context 'when given an incorrect accessor name' do
393
+ it 'raises no method error' do
394
+ expect {
395
+ Patron::Session.new do |patron|
396
+ patron.timeoutttt = args[:timeout]
397
+ end
398
+ }.to raise_error NoMethodError
399
+ end
400
+ end
401
+ end
402
+
325
403
  # ------------------------------------------------------------------------
326
404
  describe 'when debug is enabled' do
327
405
  it 'it should not clobber stderr' do
328
406
  rdev = STDERR.stat.rdev
329
407
 
330
408
  @session.enable_debug
331
- STDERR.stat.rdev.should be == rdev
409
+ expect(STDERR.stat.rdev).to be == rdev
332
410
 
333
411
  @session.enable_debug
334
- STDERR.stat.rdev.should be == rdev
412
+ expect(STDERR.stat.rdev).to be == rdev
335
413
  end
336
414
  end
337
415