ably 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/lib/ably.rb +2 -2
- data/lib/ably/auth.rb +39 -7
- data/lib/ably/modules/conversions.rb +58 -0
- data/lib/ably/{support.rb → modules/http_helpers.rb} +3 -3
- data/lib/ably/realtime.rb +5 -23
- data/lib/ably/realtime/channel.rb +62 -18
- data/lib/ably/realtime/client.rb +76 -22
- data/lib/ably/realtime/connection.rb +41 -14
- data/lib/ably/realtime/models/error_info.rb +38 -0
- data/lib/ably/realtime/models/message.rb +85 -0
- data/lib/ably/realtime/models/protocol_message.rb +149 -0
- data/lib/ably/realtime/models/shared.rb +17 -0
- data/lib/ably/rest.rb +16 -3
- data/lib/ably/rest/channel.rb +2 -2
- data/lib/ably/rest/client.rb +17 -20
- data/lib/ably/rest/models/message.rb +62 -0
- data/lib/ably/rest/models/paged_resource.rb +117 -0
- data/lib/ably/rest/presence.rb +4 -4
- data/lib/ably/token.rb +1 -1
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/channel_spec.rb +86 -0
- data/spec/acceptance/rest/auth_spec.rb +14 -5
- data/spec/acceptance/rest/channel_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/support/event_machine_helper.rb +22 -0
- data/spec/support/model_helper.rb +67 -0
- data/spec/unit/realtime/error_info_spec.rb +10 -0
- data/spec/unit/realtime/message_spec.rb +115 -0
- data/spec/unit/realtime/protocol_message_spec.rb +102 -0
- data/spec/unit/realtime/realtime_spec.rb +20 -0
- data/spec/unit/rest/message_spec.rb +74 -0
- data/spec/unit/{rest_spec.rb → rest/rest_spec.rb} +14 -0
- metadata +28 -13
- data/lib/ably/message.rb +0 -70
- data/lib/ably/rest/paged_resource.rb +0 -117
- data/spec/acceptance/realtime_client_spec.rb +0 -12
- data/spec/unit/message_spec.rb +0 -73
- data/spec/unit/realtime_spec.rb +0 -9
@@ -1,117 +0,0 @@
|
|
1
|
-
module Ably
|
2
|
-
module Rest
|
3
|
-
# Wraps any Ably HTTP response that supports paging and automatically provides methdos to iterated through
|
4
|
-
# the array of resources using {#first}, {#next}, {#last?} and {#first?}
|
5
|
-
#
|
6
|
-
# Paging information is provided by Ably in the LINK HTTP headers
|
7
|
-
class PagedResource
|
8
|
-
include Enumerable
|
9
|
-
|
10
|
-
# @param [Faraday::Response] http_response Initial HTTP response from an Ably request to a paged resource
|
11
|
-
# @param [String] base_url Base URL for request that generated the http_response so that subsequent paged requests can be made
|
12
|
-
# @param [Ably::Rest::Client] client {Ably::Client} used to make the request to Ably
|
13
|
-
# @param [Hash] options Options for this paged resource
|
14
|
-
# @option options [Symbol] :coerce_into symbol representing class that should be used to represent each item in the PagedResource
|
15
|
-
#
|
16
|
-
# @return [Ably::Rest::PagedResource]
|
17
|
-
def initialize(http_response, base_url, client, coerce_into: nil)
|
18
|
-
@http_response = http_response
|
19
|
-
@client = client
|
20
|
-
@base_url = "#{base_url.gsub(%r{/[^/]*$}, '')}/"
|
21
|
-
@coerce_into = coerce_into
|
22
|
-
|
23
|
-
@body = if coerce_into
|
24
|
-
http_response.body.map do |item|
|
25
|
-
Kernel.const_get(coerce_into).new(item)
|
26
|
-
end
|
27
|
-
else
|
28
|
-
http_response.body
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# Retrieve the first page of results
|
33
|
-
#
|
34
|
-
# @return [Ably::Rest::PagedResource]
|
35
|
-
def first
|
36
|
-
PagedResource.new(@client.get(pagination_url('first')), @base_url, @client, coerce_into: @coerce_into)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Retrieve the next page of results
|
40
|
-
#
|
41
|
-
# @return [Ably::Rest::PagedResource]
|
42
|
-
def next
|
43
|
-
PagedResource.new(@client.get(pagination_url('next')), @base_url, @client, coerce_into: @coerce_into)
|
44
|
-
end
|
45
|
-
|
46
|
-
# True if this is the last page in the paged resource set
|
47
|
-
#
|
48
|
-
# @return [Boolean]
|
49
|
-
def last?
|
50
|
-
!supports_pagination? ||
|
51
|
-
pagination_header('next').nil?
|
52
|
-
end
|
53
|
-
|
54
|
-
# True if this is the first page in the paged resource set
|
55
|
-
#
|
56
|
-
# @return [Boolean]
|
57
|
-
def first?
|
58
|
-
!supports_pagination? ||
|
59
|
-
pagination_header('first') == pagination_header('current')
|
60
|
-
end
|
61
|
-
|
62
|
-
# True if the HTTP response supports paging with the expected LINK HTTP headers
|
63
|
-
#
|
64
|
-
# @return [Boolean]
|
65
|
-
def supports_pagination?
|
66
|
-
!pagination_headers.empty?
|
67
|
-
end
|
68
|
-
|
69
|
-
# Standard Array accessor method
|
70
|
-
def [](index)
|
71
|
-
@body[index]
|
72
|
-
end
|
73
|
-
|
74
|
-
# Returns number of items within this page, not the total number of items in the entire paged resource set
|
75
|
-
def length
|
76
|
-
@body.length
|
77
|
-
end
|
78
|
-
alias_method :count, :length
|
79
|
-
alias_method :size, :length
|
80
|
-
|
81
|
-
# Method ensuring this {Ably::Rest::PagedResource} is {http://ruby-doc.org/core-2.1.3/Enumerable.html Enumerable}
|
82
|
-
def each(&block)
|
83
|
-
@body.each do |item|
|
84
|
-
if block_given?
|
85
|
-
block.call item
|
86
|
-
else
|
87
|
-
yield item
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
def pagination_headers
|
94
|
-
link_regex = %r{<(?<url>[^>]+)>; rel="(?<rel>[^"]+)"}
|
95
|
-
@pagination_headers ||= @http_response.headers['link'].scan(link_regex).inject({}) do |hash, val_array|
|
96
|
-
url, rel = val_array
|
97
|
-
hash[rel] = url
|
98
|
-
hash
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def pagination_header(id)
|
103
|
-
pagination_headers[id]
|
104
|
-
end
|
105
|
-
|
106
|
-
def pagination_url(id)
|
107
|
-
raise Ably::Exceptions::InvalidPageError, "Paging heading link #{id} does not exist" unless pagination_header(id)
|
108
|
-
|
109
|
-
if pagination_header(id).match(%r{^\./})
|
110
|
-
"#{@base_url}#{pagination_header(id)[2..-1]}"
|
111
|
-
else
|
112
|
-
pagination_header[id]
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Using the Realtime client" do
|
4
|
-
describe "initializing the client" do
|
5
|
-
it "should disallow an invalid key" do
|
6
|
-
expect { Ably::Realtime::Client.new({}) }.to raise_error(ArgumentError, /api_key is missing/)
|
7
|
-
expect { Ably::Realtime::Client.new(api_key: 'invalid') }.to raise_error(ArgumentError, /api_key is invalid/)
|
8
|
-
expect { Ably::Realtime::Client.new(api_key: 'invalid:asdad') }.to raise_error(ArgumentError, /api_key is invalid/)
|
9
|
-
expect { Ably::Realtime::Client.new(api_key: 'appid.keyuid:keysecret') }.to_not raise_error
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
data/spec/unit/message_spec.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Ably::Message do
|
4
|
-
context 'attributes' do
|
5
|
-
let(:unique_value) { 'unique_value' }
|
6
|
-
|
7
|
-
%w(name data client_id timestamp channel_serial).each do |attribute|
|
8
|
-
context "##{attribute}" do
|
9
|
-
subject { Ably::Message.new({ attribute.to_sym => unique_value }) }
|
10
|
-
|
11
|
-
it "retrieves attribute :#{attribute}" do
|
12
|
-
expect(subject.public_send(attribute)).to eql(unique_value)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context '#timestamp_at' do
|
18
|
-
subject { Ably::Message.new(timestamp: Time.now.to_i * 1000) }
|
19
|
-
it 'retrieves attribute :key' do
|
20
|
-
expect(subject.timestamp_at.to_i).to be_within(1).of(Time.now.to_i)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context '#raw_message' do
|
25
|
-
let(:attributes) { { timestamp: Time.now.to_i * 1000 } }
|
26
|
-
subject { Ably::Message.new(attributes) }
|
27
|
-
|
28
|
-
it 'provides access to #raw_message' do
|
29
|
-
expect(subject.raw_message).to eql(attributes)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context '#[]' do
|
34
|
-
subject { Ably::Message.new(unusual: 'attribute') }
|
35
|
-
|
36
|
-
it 'provides accessor method to #raw_message' do
|
37
|
-
expect(subject[:unusual]).to eql('attribute')
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context '==' do
|
43
|
-
let(:attributes) { { client_id: 'unique' } }
|
44
|
-
|
45
|
-
it 'is true when attributes are the same' do
|
46
|
-
new_message = -> { Ably::Message.new(attributes) }
|
47
|
-
expect(new_message[]).to eq(new_message[])
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'is false when attributes are not the same' do
|
51
|
-
expect(Ably::Message.new(client_id: 1)).to_not eq(Ably::Message.new(client_id: 2))
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'is false when class type differs' do
|
55
|
-
expect(Ably::Message.new(client_id: 1)).to_not eq(nil)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'is immutable' do
|
60
|
-
let(:options) { { client_id: 'John' } }
|
61
|
-
subject { Ably::Message.new(options) }
|
62
|
-
|
63
|
-
it 'prevents changes' do
|
64
|
-
expect { subject.raw_message[:client_id] = 'Joe' }.to raise_error RuntimeError, /can't modify frozen Hash/
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'dups options' do
|
68
|
-
expect(subject.raw_message[:client_id]).to eql('John')
|
69
|
-
options[:client_id] = 'Joe'
|
70
|
-
expect(subject.raw_message[:client_id]).to eql('John')
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/spec/unit/realtime_spec.rb
DELETED