spot-gps 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +15 -6
- data/lib/spot-gps/paginator.rb +39 -0
- data/lib/spot-gps/services/messages.rb +12 -1
- data/lib/spot-gps/version.rb +1 -1
- data/lib/spot.rb +1 -0
- data/spec/fixtures/message.json +9 -9
- data/spec/services/messages_spec.rb +59 -11
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae8f932cea97f131527f1b2f24b693b21c78bfaa
|
4
|
+
data.tar.gz: 506fa0a9ce404eb350cd8e7847d15b8b0099a49a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c81515b2b992f025958fbbd3de61d9fb06b6cab5d8b48c2e10bfde32d072beb2cb9808c6a6761cd4d2fb5e8f501689715f771d24d98e006872256d8113fac7f9
|
7
|
+
data.tar.gz: daad07e097b8decddb8c78adfd9c95b1804dabb0839108a9e5d0a3c5ca524d3768221b4c1975cc67deb963773f1cb3c196924a5b86f55b382c0b392889eabce4
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -41,18 +41,27 @@ Currently, the SPOT API only supports a single `messages` resource.
|
|
41
41
|
Messages are communications sent from a SPOT device.
|
42
42
|
|
43
43
|
```ruby
|
44
|
-
api.messages.all # => Returns a
|
44
|
+
api.messages.all # => Returns a lazily paginated list of messages for a feed
|
45
|
+
api.messages.list # => Returns a list of messages for a given page of a feed
|
45
46
|
api.messages.latest # => Returns the most recent message for a feed
|
46
47
|
```
|
47
48
|
|
48
49
|
### Pagination
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
If you want to get all of the records for a given resource type, you can use the
|
52
|
+
`#all` method to get a lazily paginated list. `#all` will deal with making extra
|
53
|
+
API requests to paginate through all the data for you:
|
53
54
|
|
54
55
|
```ruby
|
55
|
-
api.messages.all
|
56
|
+
api.messages.all.each { |message| puts message.created_at }
|
57
|
+
```
|
58
|
+
|
59
|
+
Alternatively, you can use the `#list` method to get a specific page of entries.
|
60
|
+
By default, the first page of 50 records are fetched. To fetch subsequent pages
|
61
|
+
(each of 50 records), specify a `page`.
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
api.messages.list(page: 2)
|
56
65
|
```
|
57
66
|
|
58
67
|
### Filtering
|
@@ -60,7 +69,7 @@ api.messages.all(page: 2)
|
|
60
69
|
The SPOT API supports filtering by date.
|
61
70
|
|
62
71
|
```ruby
|
63
|
-
api.messages.
|
72
|
+
api.messages.list(start_at: '2014-06-01T00:00:00', end_at: '2015-06-01T00:00:00')
|
64
73
|
```
|
65
74
|
|
66
75
|
### Error Handling
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SPOT
|
2
|
+
# A class that can take an API LIST query and auto paginate through results
|
3
|
+
class Paginator
|
4
|
+
def initialize(service:, params: {})
|
5
|
+
@service = service
|
6
|
+
@params = (params || {}).dup
|
7
|
+
end
|
8
|
+
|
9
|
+
# Get a lazy enumerable for listing data from the API
|
10
|
+
def enumerator
|
11
|
+
Enumerator.new do |yielder|
|
12
|
+
response = get_initial_response
|
13
|
+
|
14
|
+
loop do
|
15
|
+
items = response.records
|
16
|
+
|
17
|
+
# If there are no records, we're done
|
18
|
+
break if items.empty?
|
19
|
+
|
20
|
+
# Otherwise, iterate through the records...
|
21
|
+
items.each { |item| yielder << item }
|
22
|
+
|
23
|
+
# ...and fetch the next page
|
24
|
+
@params ||= {}
|
25
|
+
@params[:page] ||= 1
|
26
|
+
@params[:page] += 1
|
27
|
+
|
28
|
+
response = @service.list(**@params)
|
29
|
+
end
|
30
|
+
end.lazy
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def get_initial_response
|
36
|
+
@initial_response ||= @service.list(**@params)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,7 +1,18 @@
|
|
1
1
|
module SPOT
|
2
2
|
module Services
|
3
3
|
class Messages < Base
|
4
|
-
def all(
|
4
|
+
def all(start_at: nil, end_at: nil)
|
5
|
+
query_params = {}
|
6
|
+
query_params[:startDate] = spot_formatted_time(start_at) if start_at
|
7
|
+
query_params[:endDate] = spot_formatted_time(end_at) if end_at
|
8
|
+
|
9
|
+
SPOT::Paginator.new(
|
10
|
+
service: self,
|
11
|
+
params: query_params
|
12
|
+
).enumerator
|
13
|
+
end
|
14
|
+
|
15
|
+
def list(page: nil, start_at: nil, end_at: nil)
|
5
16
|
query_params = {}
|
6
17
|
query_params[:start] = start(page) if page
|
7
18
|
query_params[:startDate] = spot_formatted_time(start_at) if start_at
|
data/lib/spot-gps/version.rb
CHANGED
data/lib/spot.rb
CHANGED
@@ -7,6 +7,7 @@ require 'spot-gps/client'
|
|
7
7
|
require 'spot-gps/api_response'
|
8
8
|
require 'spot-gps/api_service'
|
9
9
|
require 'spot-gps/list_response'
|
10
|
+
require 'spot-gps/paginator'
|
10
11
|
require 'spot-gps/resources/message'
|
11
12
|
require 'spot-gps/services/base'
|
12
13
|
require 'spot-gps/services/messages'
|
data/spec/fixtures/message.json
CHANGED
@@ -18,12 +18,12 @@
|
|
18
18
|
{
|
19
19
|
"@clientUnixTime": "0",
|
20
20
|
"id": 585079373,
|
21
|
-
"messengerId": "0-
|
22
|
-
"messengerName": "
|
21
|
+
"messengerId": "0-1234567",
|
22
|
+
"messengerName": "My SPOT",
|
23
23
|
"unixTime": 1468164566,
|
24
24
|
"messageType": "OK",
|
25
|
-
"latitude":
|
26
|
-
"longitude": -
|
25
|
+
"latitude": 61.54875,
|
26
|
+
"longitude": -3.0697,
|
27
27
|
"modelId": "SPOT3",
|
28
28
|
"showCustomMsg": "Y",
|
29
29
|
"dateTime": "2016-07-10T15:29:26+0000",
|
@@ -33,13 +33,13 @@
|
|
33
33
|
},
|
34
34
|
{
|
35
35
|
"@clientUnixTime": "0",
|
36
|
-
"id":
|
37
|
-
"messengerId": "0-
|
38
|
-
"messengerName": "
|
36
|
+
"id": 585079373,
|
37
|
+
"messengerId": "0-1234567",
|
38
|
+
"messengerName": "My SPOT",
|
39
39
|
"unixTime": 1468149143,
|
40
40
|
"messageType": "OK",
|
41
|
-
"latitude":
|
42
|
-
"longitude": -
|
41
|
+
"latitude": 61.54875,
|
42
|
+
"longitude": -3.0697,
|
43
43
|
"modelId": "SPOT3",
|
44
44
|
"showCustomMsg": "Y",
|
45
45
|
"dateTime": "2016-07-10T11:12:23+0000",
|
@@ -5,6 +5,55 @@ describe SPOT::Services::Messages do
|
|
5
5
|
|
6
6
|
describe "#all" do
|
7
7
|
subject(:all) { messages.all(args) }
|
8
|
+
let(:args) { {} }
|
9
|
+
|
10
|
+
it { is_expected.to be_a(Enumerator) }
|
11
|
+
|
12
|
+
context "with records" do
|
13
|
+
before do
|
14
|
+
stub_url = SPOT.endpoint + 'EXAMPLE_ID/message.json'
|
15
|
+
stub_request(:get, stub_url).to_return(
|
16
|
+
body: load_fixture('message.json'),
|
17
|
+
headers: { 'Content-Type' => 'application/json' }
|
18
|
+
)
|
19
|
+
|
20
|
+
stub_request(:get, stub_url + "?start=50").to_return(
|
21
|
+
body: load_fixture('message.json'),
|
22
|
+
headers: { 'Content-Type' => 'application/json' }
|
23
|
+
)
|
24
|
+
|
25
|
+
stub_request(:get, stub_url + "?start=100").to_return(
|
26
|
+
body: load_fixture('no_messages.json'),
|
27
|
+
headers: { 'Content-Type' => 'application/json' }
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
its(:first) { is_expected.to be_a(SPOT::Resources::Message) }
|
32
|
+
its("to_a.length") { is_expected.to eq(4) }
|
33
|
+
|
34
|
+
it "makes the correct number of requests" do
|
35
|
+
all.map(&:created_at).to_a
|
36
|
+
expect(a_request(:get, /#{Regexp.quote(SPOT.endpoint)}/)).
|
37
|
+
to have_been_made.times(3)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with no records" do
|
42
|
+
before do
|
43
|
+
stub_url = SPOT.endpoint + 'EXAMPLE_ID/message.json'
|
44
|
+
stub_request(:get, stub_url).to_return(
|
45
|
+
body: load_fixture('no_messages.json'),
|
46
|
+
headers: { 'Content-Type' => 'application/json' }
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
its(:first) { is_expected.to eq(nil) }
|
51
|
+
its("to_a.length") { is_expected.to eq(0) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#list" do
|
56
|
+
subject(:list) { messages.list(args) }
|
8
57
|
|
9
58
|
before do
|
10
59
|
stub_url = SPOT.endpoint + 'EXAMPLE_ID/message.json'
|
@@ -14,7 +63,6 @@ describe SPOT::Services::Messages do
|
|
14
63
|
)
|
15
64
|
end
|
16
65
|
|
17
|
-
|
18
66
|
context "without any arguments" do
|
19
67
|
let(:args) { {} }
|
20
68
|
|
@@ -24,7 +72,7 @@ describe SPOT::Services::Messages do
|
|
24
72
|
with(path: 'message.json', params: {}).
|
25
73
|
and_call_original
|
26
74
|
|
27
|
-
messages.
|
75
|
+
messages.list
|
28
76
|
end
|
29
77
|
|
30
78
|
it { is_expected.to be_a(SPOT::ListResponse) }
|
@@ -47,12 +95,12 @@ describe SPOT::Services::Messages do
|
|
47
95
|
context "with a page parameter" do
|
48
96
|
context "that is invalid" do
|
49
97
|
let(:args) { { page: "invalid" } }
|
50
|
-
specify { expect {
|
98
|
+
specify { expect { list }.to raise_error(ArgumentError) }
|
51
99
|
end
|
52
100
|
|
53
101
|
context "that is zero" do
|
54
102
|
let(:args) { { page: 0 } }
|
55
|
-
specify { expect {
|
103
|
+
specify { expect { list }.to raise_error(ArgumentError) }
|
56
104
|
end
|
57
105
|
|
58
106
|
context "that is greater than zero" do
|
@@ -64,7 +112,7 @@ describe SPOT::Services::Messages do
|
|
64
112
|
with(path: 'message.json', params: { start: 0 }).
|
65
113
|
and_call_original
|
66
114
|
|
67
|
-
|
115
|
+
list
|
68
116
|
end
|
69
117
|
|
70
118
|
context "and greater than 1" do
|
@@ -76,7 +124,7 @@ describe SPOT::Services::Messages do
|
|
76
124
|
with(path: 'message.json', params: { start: 50 }).
|
77
125
|
and_call_original
|
78
126
|
|
79
|
-
|
127
|
+
list
|
80
128
|
end
|
81
129
|
end
|
82
130
|
end
|
@@ -85,7 +133,7 @@ describe SPOT::Services::Messages do
|
|
85
133
|
context "with a start_at or end_at parameter" do
|
86
134
|
context "that is invalid" do
|
87
135
|
let(:args) { { start_at: "invalid" } }
|
88
|
-
specify { expect {
|
136
|
+
specify { expect { list }.to raise_error(ArgumentError) }
|
89
137
|
end
|
90
138
|
|
91
139
|
context "that is a valid string" do
|
@@ -99,7 +147,7 @@ describe SPOT::Services::Messages do
|
|
99
147
|
endDate: '2016-02-01T00:00:00-0000' }).
|
100
148
|
and_call_original
|
101
149
|
|
102
|
-
|
150
|
+
list
|
103
151
|
end
|
104
152
|
end
|
105
153
|
|
@@ -113,7 +161,7 @@ describe SPOT::Services::Messages do
|
|
113
161
|
params: { startDate: '2016-01-01T00:00:00-0000' }).
|
114
162
|
and_call_original
|
115
163
|
|
116
|
-
|
164
|
+
list
|
117
165
|
end
|
118
166
|
end
|
119
167
|
|
@@ -127,7 +175,7 @@ describe SPOT::Services::Messages do
|
|
127
175
|
params: { startDate: '2016-01-01T00:00:00-0000' }).
|
128
176
|
and_call_original
|
129
177
|
|
130
|
-
|
178
|
+
list
|
131
179
|
end
|
132
180
|
end
|
133
181
|
|
@@ -141,7 +189,7 @@ describe SPOT::Services::Messages do
|
|
141
189
|
params: { startDate: '2016-01-01T00:00:00-0000' }).
|
142
190
|
and_call_original
|
143
191
|
|
144
|
-
|
192
|
+
list
|
145
193
|
end
|
146
194
|
end
|
147
195
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spot-gps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grey Baker
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/spot-gps/client.rb
|
90
90
|
- lib/spot-gps/configuration.rb
|
91
91
|
- lib/spot-gps/list_response.rb
|
92
|
+
- lib/spot-gps/paginator.rb
|
92
93
|
- lib/spot-gps/resources/message.rb
|
93
94
|
- lib/spot-gps/services/base.rb
|
94
95
|
- lib/spot-gps/services/messages.rb
|