History

Make Docs:Requester#request accept an array of URLs

Thibaut committed 12 years ago

Commit c6be9b61 parent 562a4c72 files · +70 −35Browse files

Unified · Split

2 files
  1. lib/docs/core/requester.rb +14 −7
  2. test/lib/docs/core/requester_test.rb +56 −28
lib/docs/core/requester.rb+14−7
@@ -4,10 +4,10 @@ module Docs · 3 unmodified lines
4 class Requester < Typhoeus::Hydra4 class Requester < Typhoeus::Hydra
5 attr_reader :request_options5 attr_reader :request_options
6 6
7 def self.run(url, options = {}, &block)7 def self.run(urls, options = {}, &block)
8 requester = new(options)8 requester = new(options)
9 requester.on_response(&block) if block9 requester.on_response(&block) if block
10 requester.request(url)10 requester.request(urls)
11 requester.run11 requester.run
12 requester12 requester
13 end13 end
@@ -18,11 +18,11 @@ module Docs · 4 unmodified lines
18 super18 super
19 end19 end
20 20
21 def request(url, options = {}, &block)21 def request(urls, options = {}, &block)
22 request = Request.new(url, request_options.merge(options))22 requests = [urls].flatten.map do |url|
23 request.on_complete(&block) if block23 build_and_queue_request(url, options, &block)
24 queue(request)24 end
25 request25 requests.length == 1 ? requests.first : requests
26 end26 end
27 27
28 def queue(request)28 def queue(request)
@@ -38,6 +38,13 @@ module Docs · 9 unmodified lines
38 38
39 private39 private
40 40
41 def build_and_queue_request(url, options, &block)
42 request = Request.new(url, request_options.merge(options))
43 request.on_complete(&block) if block
44 queue(request)
45 request
46 end
47
41 def handle_response(response)48 def handle_response(response)
42 on_response.each do |callback|49 on_response.each do |callback|
43 result = callback.call(response)50 result = callback.call(response)
test/lib/docs/core/requester_test.rb+56−28
@@ -10,12 +10,16 @@ class DocsRequesterTest < MiniTest::Spec · 9 unmodified lines
10 Docs::Requester.new(options)10 Docs::Requester.new(options)
11 end11 end
12 12
13 let :url do
14 'http://example.com'
15 end
16
13 let :options do17 let :options do
14 Hash.new18 Hash.new
15 end19 end
16 20
17 let :url do21 let :block do
18 'http://example.com'22 Proc.new {}
19 end23 end
20 24
21 after do25 after do
@@ -36,37 +40,62 @@ class DocsRequesterTest < MiniTest::Spec · 14 unmodified lines
36 end40 end
37 41
38 describe "#request" do42 describe "#request" do
39 it "returns a request" do43 context "with a url" do
40 assert_instance_of Docs::Request, requester.request(url)44 it "returns a request" do
41 end45 assert_instance_of Docs::Request, requester.request(url)
42
43 describe "the request" do
44 it "is queued" do
45 request = requester.request(url)
46 assert_includes requester.queued_requests, request
47 end46 end
48 47
49 it "has the given url" do48 describe "the request" do
50 request = requester.request(url)49 it "is queued" do
51 assert_equal url, request.base_url50 request = requester.request(url)
51 assert_includes requester.queued_requests, request
52 end
53
54 it "has the given url" do
55 request = requester.request(url)
56 assert_equal url, request.base_url
57 end
58
59 it "has the default :request_options" do
60 options[:request_options] = { params: 'test' }
61 request = requester.request(url)
62 assert_equal 'test', request.options[:params]
63 end
64
65 it "has the given options" do
66 options[:request_options] = { params: '' }
67 request = requester.request(url, params: 'test')
68 assert_equal 'test', request.options[:params]
69 end
70
71 it "has the given block as an on_complete callback" do
72 request = requester.request(url, &block)
73 assert_includes request.on_complete, block
74 end
52 end75 end
76 end
53 77
54 it "has the default :request_options" do78 context "with an array of urls" do
55 options[:request_options] = { params: 'test' }79 let :urls do
56 request = requester.request(url)80 ['one', 'two']
57 assert_equal 'test', request.options[:params]
58 end81 end
59 82
60 it "has the given options" do83 it "returns an array of requests" do
61 options[:request_options] = { params: '' }84 result = requester.request(urls, { params: 'test' }, &block)
62 request = requester.request(url, params: 'test')85 assert_instance_of Array, result
63 assert_equal 'test', request.options[:params]86 assert_equal urls.length, result.length
87 assert result.all? { |obj| obj.instance_of? Docs::Request }
88 urls.each_with_index do |url, i|
89 assert_equal url, result[i].base_url
90 assert_equal 'test', result[i].options[:params]
91 assert_includes result[i].on_complete, block
92 end
64 end93 end
65 94
66 it "has the given block as an on_complete callback" do95 it "queues the requests in the given order" do
67 block = Proc.new {}96 queue = []
68 request = requester.request(url, &block)97 stub(requester).queue { |request| queue << request }
69 assert_includes request.on_complete, block98 assert_equal urls, requester.request(urls).map(&:base_url)
70 end99 end
71 end100 end
72 end101 end
@@ -77,9 +106,8 @@ class DocsRequesterTest < MiniTest::Spec · 4 unmodified lines
77 end106 end
78 107
79 it "stores a callback" do108 it "stores a callback" do
80 proc = Proc.new {}109 requester.on_response(&block)
81 requester.on_response(&proc)110 assert_includes requester.on_response, block
82 assert_includes requester.on_response, proc
83 end111 end
84 end112 end
85 113