laziness 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4575bffe5cbe1205a7f1b3057d607983b68f5cf821d7d85b45c4e6ef336dc28a
4
- data.tar.gz: a4e88867662053bbf3cf63741a85b9985107c3574a1328eeb8c594c7210f6aaa
3
+ metadata.gz: a76e439503c65d13c7c8ab8f00bdc5ee3d22dc06d60acf0ae8fe959808e63133
4
+ data.tar.gz: e6297370c3f3f22f01b468844d4ae79a3cd20e691c27d95e7471cc645133c66a
5
5
  SHA512:
6
- metadata.gz: a7d62f72f2c7856fbb300bab0802dc19cc77c531691fca086b5c0cab67c50032003d388aa47658b67ae962fb0f400f2311f96c544ed2b8ef0b497fc2fd391221
7
- data.tar.gz: 67b0f5bc0f81deda62afa7a06239db6fb90b512b5cc6efc991c73ab90dee5afebf83c317b2a6241c98382e8bd8ea6d3c044193abba4da688a62be7b107ce6b55
6
+ metadata.gz: de5a77da3465d2a5a6ce098539c6802d515e6a57c1d88aafde8345f42448c747f0512bd6ead50c101a7ddbf90bc85bca5e65049059cfeb6e0989485eb60ecae1
7
+ data.tar.gz: 6f1b839c1a7d8235376564141a5323b050606870bd6907fa6909d57bbb77f1a1e4037c7937dcd798038296746ca458c22bd84d9509d37d2f84164a05a9f89be3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- laziness (0.2.4)
4
+ laziness (0.2.5)
5
5
  eventmachine
6
6
  faye-websocket (>= 0.8.0)
7
7
  hashie
@@ -10,14 +10,16 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- addressable (2.3.6)
14
- crack (0.4.2)
13
+ addressable (2.6.0)
14
+ public_suffix (>= 2.0.2, < 4.0)
15
+ crack (0.4.3)
15
16
  safe_yaml (~> 1.0.0)
16
- diff-lcs (1.2.5)
17
+ diff-lcs (1.3)
17
18
  eventmachine (1.2.7)
18
19
  faye-websocket (0.10.7)
19
20
  eventmachine (>= 0.12.0)
20
21
  websocket-driver (>= 0.5.1)
22
+ hashdiff (0.3.8)
21
23
  hashie (3.6.0)
22
24
  httparty (0.16.4)
23
25
  mime-types (~> 3.0)
@@ -26,23 +28,26 @@ GEM
26
28
  mime-types-data (~> 3.2015)
27
29
  mime-types-data (3.2018.0812)
28
30
  multi_xml (0.6.0)
31
+ public_suffix (3.0.3)
29
32
  rake (10.3.2)
30
- rspec (3.1.0)
31
- rspec-core (~> 3.1.0)
32
- rspec-expectations (~> 3.1.0)
33
- rspec-mocks (~> 3.1.0)
34
- rspec-core (3.1.7)
35
- rspec-support (~> 3.1.0)
36
- rspec-expectations (3.1.2)
33
+ rspec (3.8.0)
34
+ rspec-core (~> 3.8.0)
35
+ rspec-expectations (~> 3.8.0)
36
+ rspec-mocks (~> 3.8.0)
37
+ rspec-core (3.8.0)
38
+ rspec-support (~> 3.8.0)
39
+ rspec-expectations (3.8.2)
37
40
  diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.1.0)
39
- rspec-mocks (3.1.3)
40
- rspec-support (~> 3.1.0)
41
- rspec-support (3.1.2)
42
- safe_yaml (1.0.3)
43
- webmock (1.18.0)
41
+ rspec-support (~> 3.8.0)
42
+ rspec-mocks (3.8.0)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.8.0)
45
+ rspec-support (3.8.0)
46
+ safe_yaml (1.0.5)
47
+ webmock (3.5.1)
44
48
  addressable (>= 2.3.6)
45
49
  crack (>= 0.3.2)
50
+ hashdiff
46
51
  websocket-driver (0.7.0)
47
52
  websocket-extensions (>= 0.1.0)
48
53
  websocket-extensions (0.1.3)
data/README.md CHANGED
@@ -178,6 +178,20 @@ client.users.find(user_id) # get info about a specific user
178
178
  client.users.set_active # sets the current user (defined by the access_token) as active
179
179
  ```
180
180
 
181
+ ### Pagination
182
+
183
+ In order to support paging, you can provide a `page` parameter to all methods that support paging. If the `page` parameter exists, the method will map until all conversations are retrieved.
184
+
185
+ ```
186
+ conversations = client.conversations.all(page: { limit: 10, sleep_interval: 2, max_retries: 20 })
187
+ ```
188
+
189
+ If you want to limit the number of page retrievals, you can set the `page` parameter to the number of retrievals to retrieve. For example, if you just want to retrieve one page worth of 1000 results, you can do the following:
190
+
191
+ ```
192
+ conversations = client.conversations.all(page: { limit: 1000 })
193
+ ```
194
+
181
195
  ## REAL TIME API USAGE
182
196
 
183
197
  The [Slack Real Time Messaging API](https://api.slack.com/rtm) is made up of Websocket events that allow you to communicate with Slack as a bot (or yourself) with an access token.
@@ -18,6 +18,12 @@ module Slack
18
18
  nil
19
19
  end
20
20
 
21
+ def with_paging(page)
22
+ Cursor.new(page).paginate do |pager|
23
+ yield(pager)
24
+ end
25
+ end
26
+
21
27
  def request(method, path, arguments={})
22
28
  full_path = "#{base_path}#{path}"
23
29
  full_path = "#{full_path}?token=#{access_token}" unless access_token.nil?
@@ -45,6 +51,8 @@ module Slack
45
51
  klass = "#{parsed['error'].gsub(/(^|_)(.)/) { $2.upcase }}Error"
46
52
  if Slack.const_defined? klass
47
53
  raise Slack.const_get(klass)
54
+ elsif response.code == 429
55
+ raise Slack::TooManyRequestsError.new(response)
48
56
  else
49
57
  raise Slack::APIError.new parsed['error']
50
58
  end
@@ -1,9 +1,15 @@
1
1
  module Slack
2
2
  module API
3
3
  class Channels < Base
4
- def all(exclude_archived=false)
5
- response = request :get, 'channels.list', exclude_archived: exclude_archived ? 1 : 0
6
- Slack::Channel.parse response, 'channels'
4
+ def all(exclude_archived=false, page: nil)
5
+ responses = with_paging(page) do |pager|
6
+ request :get,
7
+ 'channels.list',
8
+ exclude_archived: exclude_archived ? 1 : 0,
9
+ **pager.to_h
10
+ end
11
+
12
+ Slack::Channel.parse_all responses, 'channels'
7
13
  end
8
14
 
9
15
  def archive(id)
@@ -1,13 +1,16 @@
1
1
  module Slack
2
2
  module API
3
3
  class Conversations < Base
4
- def all(exclude_archived=false, types='public_channel')
5
- response = request :get,
6
- 'conversations.list',
7
- exclude_archived: exclude_archived ? 1 : 0,
8
- types: types
4
+ def all(exclude_archived=false, types='public_channel', page: nil)
5
+ responses = with_paging(page) do |pager|
6
+ request :get,
7
+ 'conversations.list',
8
+ exclude_archived: exclude_archived ? 1 : 0,
9
+ types: types,
10
+ **pager.to_h
11
+ end
9
12
 
10
- Slack::Conversation.parse response, 'channels'
13
+ Slack::Conversation.parse_all responses, 'channels'
11
14
  end
12
15
 
13
16
  def archive(id)
@@ -58,12 +61,17 @@ module Slack
58
61
  with_nil_response { request :post, 'conversations.leave', channel: id }
59
62
  end
60
63
 
61
- def members(id)
62
- response = request :get,
63
- 'conversations.members',
64
- channel: id
64
+ def members(id, page: nil)
65
+ responses = with_paging(page) do |pager|
66
+ request :get,
67
+ 'conversations.members',
68
+ channel: id,
69
+ **pager.to_h
70
+ end
65
71
 
66
- JSON.parse(response.body)["members"]
72
+ responses.map do |response|
73
+ JSON.parse(response.body)["members"]
74
+ end.flatten
67
75
  end
68
76
 
69
77
  def open(users=[], id=nil, return_im: false)
@@ -1,9 +1,15 @@
1
1
  module Slack
2
2
  module API
3
3
  class Groups < Base
4
- def all(exclude_archived=false)
5
- response = request :get, 'groups.list', exclude_archived: exclude_archived ? 1 : 0
6
- Slack::Group.parse response, 'groups'
4
+ def all(exclude_archived=false, page: nil)
5
+ responses = with_paging(page) do |pager|
6
+ request :get,
7
+ 'groups.list',
8
+ exclude_archived: exclude_archived ? 1 : 0,
9
+ **pager.to_h
10
+ end
11
+
12
+ Slack::Group.parse_all responses, 'groups'
7
13
  end
8
14
 
9
15
  def archive(id)
@@ -1,9 +1,12 @@
1
1
  module Slack
2
2
  module API
3
3
  class IM < Base
4
- def all
5
- response = request :get, 'im.list'
6
- Slack::Channel.parse response, 'ims'
4
+ def all(page: nil)
5
+ responses = with_paging(page) do |pager|
6
+ request :get, 'im.list', **pager.to_h
7
+ end
8
+
9
+ Slack::Channel.parse_all responses, 'ims'
7
10
  end
8
11
 
9
12
  def close(channel)
@@ -1,9 +1,12 @@
1
1
  module Slack
2
2
  module API
3
3
  class Users < Base
4
- def all
5
- response = request :get, 'users.list'
6
- Slack::User.parse response, 'members'
4
+ def all(page: nil)
5
+ responses = with_paging(page) do |pager|
6
+ request :get, 'users.list', **pager.to_h
7
+ end
8
+
9
+ Slack::User.parse_all responses, 'members'
7
10
  end
8
11
 
9
12
  def find(id)
data/lib/laziness/base.rb CHANGED
@@ -3,8 +3,8 @@ require 'hashie'
3
3
  module Slack
4
4
  class Base < Hashie::Mash
5
5
  class << self
6
- def parse(request, key=nil)
7
- parsed = JSON.parse(request.body)
6
+ def parse(response, key=nil)
7
+ parsed = JSON.parse(response.body)
8
8
  parsed = parsed[key] if key && parsed[key]
9
9
  if parsed.is_a? Array
10
10
  models = []
@@ -14,6 +14,12 @@ module Slack
14
14
  new parsed
15
15
  end
16
16
  end
17
+
18
+ def parse_all(responses, key=nil)
19
+ responses.map do |response|
20
+ parse(response, key)
21
+ end.flatten
22
+ end
17
23
  end
18
24
  end
19
25
  end
@@ -0,0 +1,60 @@
1
+ module Slack
2
+ class Cursor
3
+ attr_reader :page
4
+
5
+ def initialize(page)
6
+ @page = page
7
+ @max_retries = (page && page[:max_retries]) || 0
8
+ @sleep_interval = (page && page[:sleep_interval])
9
+ end
10
+
11
+ def paginate(&blk)
12
+ responses = []
13
+
14
+ if block_given?
15
+ pager = Pager.new(page)
16
+ retries = 0
17
+
18
+ loop do
19
+ begin
20
+ response = blk.call(pager)
21
+ rescue Slack::TooManyRequestsError => e
22
+ raise e if retries >= max_retries
23
+
24
+ retries += 1
25
+
26
+ sleep(e.retry_after_in_seconds)
27
+ next
28
+ end
29
+
30
+ responses << response
31
+
32
+ break unless has_cursor?(response)
33
+
34
+ retries = 0
35
+
36
+ pager = pager.next(next_cursor(response))
37
+
38
+ sleep(sleep_interval) if sleep_interval
39
+ end
40
+ end
41
+
42
+ responses
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :max_retries, :sleep_interval
48
+
49
+ def next_cursor(response)
50
+ response["response_metadata"]["next_cursor"] unless !has_cursor?(response)
51
+ end
52
+
53
+ def has_cursor?(response)
54
+ response.respond_to?(:[]) &&
55
+ !response["response_metadata"].nil? &&
56
+ !response["response_metadata"]["next_cursor"].nil? &&
57
+ !response["response_metadata"]["next_cursor"].empty?
58
+ end
59
+ end
60
+ end
@@ -94,4 +94,23 @@ module Slack
94
94
  super "You cannot archive the last channel for a restricted account."
95
95
  end
96
96
  end
97
+
98
+ class TooManyRequestsError < APIError
99
+ def initialize(response)
100
+ @response = response
101
+ end
102
+
103
+ def message
104
+ "Retry after #{retry_after_in_seconds} seconds"
105
+ end
106
+
107
+ def retry_after_in_seconds
108
+ retry_after = response.headers["retry-after"]
109
+ (retry_after || 0).to_i
110
+ end
111
+
112
+ private
113
+
114
+ attr_reader :response
115
+ end
97
116
  end
@@ -0,0 +1,32 @@
1
+ require "ostruct"
2
+
3
+ module Slack
4
+ class Pager
5
+ attr_reader :cursor, :limit, :page
6
+
7
+ def initialize(page)
8
+ @page = page.dup
9
+ @limit = @page[:limit] unless empty?
10
+ end
11
+
12
+ def empty?
13
+ page.nil? || page.empty?
14
+ end
15
+
16
+ def to_h
17
+ { cursor: cursor, limit: limit }
18
+ end
19
+
20
+ def next(cursor)
21
+ self.class.new(page).tap do |pager|
22
+ pager.cursor = cursor
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def cursor=(cursor)
29
+ @cursor = cursor
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module Laziness
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
data/lib/laziness.rb CHANGED
@@ -6,11 +6,13 @@ require 'laziness/channel'
6
6
  require 'laziness/chat'
7
7
  require 'laziness/client'
8
8
  require 'laziness/conversation'
9
+ require 'laziness/cursor'
9
10
  require 'laziness/errors'
10
11
  require 'laziness/group'
11
12
  require 'laziness/message'
12
13
  require 'laziness/oauth'
13
14
  require 'laziness/observer'
15
+ require 'laziness/pager'
14
16
  require 'laziness/real_time_client'
15
17
  require 'laziness/registry'
16
18
  require 'laziness/session'
@@ -13,6 +13,20 @@ describe Slack::API::Conversations do
13
13
  expect(conversations.length).to eq 1
14
14
  expect(conversations[0].id).to eq "C02BLAH"
15
15
  end
16
+
17
+ context 'with paging' do
18
+ it 'pages through until there are no more pages left' do
19
+ stub_slack_request :get,
20
+ "conversations.list?token=#{access_token}&exclude_archived=0&"\
21
+ "limit=1000&"\
22
+ "types=public_channel",
23
+ "conversations_list.json"
24
+
25
+ conversations = subject.all(page: { limit: 1000 })
26
+ expect(conversations.length).to eq 1
27
+ expect(conversations[0].id).to eq "C02BLAH"
28
+ end
29
+ end
16
30
  end
17
31
 
18
32
  describe '.archive' do
@@ -0,0 +1,20 @@
1
+ describe Slack::Base do
2
+ describe "#parse_all" do
3
+ let(:responses) do
4
+ [
5
+ double(:response,
6
+ body: '{ "ok": true, "messages": [{ "id": "1234", "type": "blah" }] }'),
7
+ double(:response,
8
+ body: '{ "ok": true, "messages": [{ "id": "4567", "type": "bleh" }] }')
9
+ ]
10
+ end
11
+
12
+ it "parses all of the messages in an array" do
13
+ result = described_class.parse_all responses, 'messages'
14
+
15
+ expect(result.count).to eq 2
16
+ expect(result.first.id).to eq "1234"
17
+ expect(result.last.id).to eq "4567"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,129 @@
1
+ describe Slack::Cursor do
2
+ describe '#initialize' do
3
+ let(:page) { { limit: 10 } }
4
+
5
+ it 'initializes with page attributes' do
6
+ expect(described_class.new(page).page).to eq page
7
+ end
8
+ end
9
+
10
+ describe '#paginate' do
11
+ let(:first_response) do
12
+ {
13
+ "ok" => true,
14
+ "channels" => [{
15
+ "id" => "C01"
16
+ }],
17
+ "response_metadata" => {
18
+ "next_cursor" => "onto-second-request"
19
+ }
20
+ }
21
+ end
22
+ let(:last_response) do
23
+ {
24
+ "ok" => true,
25
+ "channels" => [{
26
+ "id" => "C03"
27
+ }],
28
+ "response_metadata" => {
29
+ "next_cursor" => ""
30
+ }
31
+ }
32
+ end
33
+ let(:page) { { limit: 10 } }
34
+ let(:second_response) do
35
+ {
36
+ "ok" => true,
37
+ "channels" => [{
38
+ "id" => "C02"
39
+ }],
40
+ "response_metadata" => {
41
+ "next_cursor" => "onto-last-request"
42
+ }
43
+ }
44
+ end
45
+
46
+ subject { described_class.new(page) }
47
+
48
+ it 'does not require a block' do
49
+ expect { subject.paginate }.to_not raise_error
50
+ end
51
+
52
+ it 'yields a pager' do
53
+ expect { |b| subject.paginate(&b) }.to yield_with_args(Slack::Pager)
54
+ end
55
+
56
+ it 'returns the results of each yield' do
57
+ expected = [first_response, second_response, last_response]
58
+ index = 0
59
+ responses = subject.paginate do |pager|
60
+ response = expected[index]
61
+ index += 1
62
+ response
63
+ end
64
+
65
+ expect(responses).to eq(expected)
66
+ end
67
+
68
+ it 'updates the cursor on the pager' do
69
+ expect_any_instance_of(Slack::Pager).to \
70
+ receive(:next).with("onto-last-request").and_call_original
71
+
72
+ responses = [second_response, last_response]
73
+ subject.paginate do |pager|
74
+ responses.shift
75
+ end
76
+ end
77
+
78
+ context 'with a too many requests error' do
79
+ let(:page) { { limit: 10, max_retries: 2 } }
80
+ let(:response) { OpenStruct.new(headers: { 'retry-after' => '0' }) }
81
+
82
+ it 'tries again when there is a max retries setting' do
83
+ number_of_tries = 0
84
+
85
+ expect {
86
+ subject.paginate do |pager|
87
+ number_of_tries += 1
88
+ raise Slack::TooManyRequestsError, response
89
+ end
90
+ }.to raise_error(Slack::TooManyRequestsError)
91
+
92
+ expect(number_of_tries).to eq 3
93
+ end
94
+
95
+ context 'without a max retries' do
96
+ it 'bubbles up the error' do
97
+ expect do
98
+ subject.paginate do |pager|
99
+ raise Slack::TooManyRequestsError, response
100
+ end
101
+ end.to raise_error Slack::TooManyRequestsError
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'with a sleep interval' do
107
+ let(:page) { { limit: 10, sleep_interval: 2 } }
108
+
109
+ it 'sleeps in between requests' do
110
+ expect(subject).to receive(:sleep).with(2)
111
+
112
+ responses = [second_response, last_response]
113
+ subject.paginate do |pager|
114
+ responses.shift
115
+ end
116
+ end
117
+ end
118
+
119
+ context 'with a nil page' do
120
+ subject { described_class.new(nil) }
121
+
122
+ it 'yields with an empty pager' do
123
+ subject.paginate do |pager|
124
+ expect(pager).to be_empty
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -154,6 +154,19 @@ describe 'API errors' do
154
154
  expect { subject.channels.all }.to raise_error Slack::NoChannelError
155
155
  end
156
156
 
157
+ it 'raises a too many requests error if the status is 429' do
158
+ response = {
159
+ ok: false,
160
+ error: "ratelimited"
161
+ }
162
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
163
+ to_return(status: 429,
164
+ body: response.to_json,
165
+ headers: { "Retry-After" => "30" })
166
+ expect { subject.users.all }.to \
167
+ raise_error Slack::TooManyRequestsError, "Retry after 30 seconds"
168
+ end
169
+
157
170
  it 'raises an http error if the error is not known' do
158
171
  response = {
159
172
  ok: false,
@@ -1,7 +1,8 @@
1
1
  describe Slack::Message do
2
2
  describe "#parse" do
3
3
  it "initializes a new message with a JSON string" do
4
- message = Slack::Message.parse '{ "id": "1234", "type": "blah" }'
4
+ message = described_class.parse '{ "id": "1234", "type": "blah" }'
5
+
5
6
  expect(message).to be_a Slack::Message
6
7
  expect(message.id).to eq "1234"
7
8
  expect(message.type).to eq :blah
@@ -10,15 +11,18 @@ describe Slack::Message do
10
11
 
11
12
  describe "#generate" do
12
13
  it "generates a new message with a random id and type" do
13
- message = Slack::Message.generate text: "This is a test"
14
+ message = described_class.generate text: "This is a test"
15
+
14
16
  expect(message.id).to_not be_empty
15
17
  expect(message.type).to eq :message
16
18
  expect(message.text).to eq "This is a test"
17
19
  end
18
20
 
19
21
  it "can have an id specified" do
20
- expect(Slack::Message).to_not receive(:generate_id)
21
- message = Slack::Message.generate id: 12345
22
+ expect(described_class).to_not receive(:generate_id)
23
+
24
+ message = described_class.generate id: 12345
25
+
22
26
  expect(message.id).to eq 12345
23
27
  end
24
28
  end
@@ -0,0 +1,60 @@
1
+ describe Slack::Pager do
2
+ describe "#initialize" do
3
+ let(:page) { { limit: 20 } }
4
+
5
+ it "initializes with a page" do
6
+ expect(described_class.new(page).page).to eq page
7
+ end
8
+
9
+ it "saves the limit" do
10
+ expect(described_class.new(page).limit).to eq 20
11
+ end
12
+
13
+ it "initializes a nil cursor" do
14
+ expect(described_class.new(page).cursor).to be_nil
15
+ end
16
+ end
17
+
18
+ describe "#empty?" do
19
+ context "with a non-empty page" do
20
+ it "is not empty" do
21
+ expect(described_class.new({ limit: 200 })).to_not be_empty
22
+ end
23
+ end
24
+
25
+ context "with an empty page" do
26
+ it "is empty" do
27
+ expect(described_class.new({})).to be_empty
28
+ end
29
+ end
30
+
31
+ context "with a nil page" do
32
+ it "is empty" do
33
+ expect(described_class.new(nil)).to be_empty
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#to_h" do
39
+ subject { described_class.new({ limit: 200 }) }
40
+
41
+ it "returns a hash with the limit and the cursor" do
42
+ expect(subject.to_h).to eq({ limit: 200, cursor: nil })
43
+ end
44
+ end
45
+
46
+ describe "#next" do
47
+ subject { described_class.new({ limit: 200 }) }
48
+
49
+ it "returns a new instance of the pager" do
50
+ pager = subject.next("next")
51
+
52
+ expect(pager).to be_instance_of(described_class)
53
+ expect(pager).to_not equal subject
54
+ end
55
+
56
+ it "sets the cursor" do
57
+ expect(subject.next("next").cursor).to eq "next"
58
+ end
59
+ end
60
+ end
@@ -26,5 +26,8 @@
26
26
  },
27
27
  "num_members": 2
28
28
  }
29
- ]
29
+ ],
30
+ "response_metadata": {
31
+ "next_cursor": "next"
32
+ }
30
33
  }
@@ -1,7 +1,16 @@
1
1
  module SlackStubFactory
2
- def stub_slack_request(method, path, fixture)
2
+ def stub_slack_request(method, path, fixtures)
3
+ fixtures = [fixtures].flatten
4
+
3
5
  full_path = "https://slack.com/api/#{path}"
4
- stub_request(method, full_path).to_return(status: 200, body: slack_json_fixture(fixture))
6
+
7
+ stub = stub_request(method, full_path)
8
+ begin
9
+ fixture = fixtures.shift
10
+ stub.to_return(status: 200, body: slack_json_fixture(fixture))
11
+ end while !fixtures.empty?
12
+
13
+ stub
5
14
  end
6
15
 
7
16
  def slack_json_fixture(fixture)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: laziness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Wright
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-11 00:00:00.000000000 Z
11
+ date: 2019-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -100,11 +100,13 @@ files:
100
100
  - lib/laziness/chat.rb
101
101
  - lib/laziness/client.rb
102
102
  - lib/laziness/conversation.rb
103
+ - lib/laziness/cursor.rb
103
104
  - lib/laziness/errors.rb
104
105
  - lib/laziness/group.rb
105
106
  - lib/laziness/message.rb
106
107
  - lib/laziness/oauth.rb
107
108
  - lib/laziness/observer.rb
109
+ - lib/laziness/pager.rb
108
110
  - lib/laziness/real_time_client.rb
109
111
  - lib/laziness/registry.rb
110
112
  - lib/laziness/session.rb
@@ -119,10 +121,13 @@ files:
119
121
  - spec/laziness/api/oauth_spec.rb
120
122
  - spec/laziness/api/rtm_spec.rb
121
123
  - spec/laziness/api/users_spec.rb
124
+ - spec/laziness/base_spec.rb
122
125
  - spec/laziness/client_spec.rb
126
+ - spec/laziness/cursor_spec.rb
123
127
  - spec/laziness/errors_spec.rb
124
128
  - spec/laziness/message_spec.rb
125
129
  - spec/laziness/observer_spec.rb
130
+ - spec/laziness/pager_spec.rb
126
131
  - spec/laziness/real_time_client_spec.rb
127
132
  - spec/laziness/registry_spec.rb
128
133
  - spec/spec_helper.rb
@@ -181,10 +186,13 @@ test_files:
181
186
  - spec/laziness/api/oauth_spec.rb
182
187
  - spec/laziness/api/rtm_spec.rb
183
188
  - spec/laziness/api/users_spec.rb
189
+ - spec/laziness/base_spec.rb
184
190
  - spec/laziness/client_spec.rb
191
+ - spec/laziness/cursor_spec.rb
185
192
  - spec/laziness/errors_spec.rb
186
193
  - spec/laziness/message_spec.rb
187
194
  - spec/laziness/observer_spec.rb
195
+ - spec/laziness/pager_spec.rb
188
196
  - spec/laziness/real_time_client_spec.rb
189
197
  - spec/laziness/registry_spec.rb
190
198
  - spec/spec_helper.rb