hashblue 0.0.2 → 0.0.3
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.
- data/README.md +4 -4
- data/hashblue.gemspec +1 -0
- data/lib/hashblue/account.rb +16 -0
- data/lib/hashblue/client.rb +25 -25
- data/lib/hashblue/contact.rb +4 -0
- data/lib/hashblue/version.rb +1 -1
- data/lib/hashblue.rb +0 -2
- data/spec/models/account_spec.rb +20 -1
- data/spec/models/client_spec.rb +23 -57
- data/spec/models/contact_spec.rb +8 -1
- metadata +25 -10
data/README.md
CHANGED
@@ -4,20 +4,20 @@ This gem provides an easy way to access the hashblue API (https://api.hashblue.c
|
|
4
4
|
|
5
5
|
Using this gem is very straightforward. First, you need to obtain an OAuth2 access token (see https://api.hashblue.com/doc/Authentication). Then, create a new client:
|
6
6
|
|
7
|
-
|
7
|
+
account = Hashblue::Account.authenticate('oauth2-access-token')
|
8
8
|
|
9
9
|
Finally, use that client to start to navigate the API:
|
10
10
|
|
11
|
-
contacts =
|
11
|
+
contacts = account.contacts
|
12
12
|
first_contact_messages = contacts.first.messages
|
13
13
|
|
14
14
|
You can also pass in query parameters to restrict the results:
|
15
15
|
|
16
|
-
messages_abouts_pubs =
|
16
|
+
messages_abouts_pubs = account.messages(:q => 'pub')
|
17
17
|
|
18
18
|
And if there are additional pages of results, access them too:
|
19
19
|
|
20
|
-
second_page =
|
20
|
+
second_page = account.messages(:q => 'pub').next_page
|
21
21
|
|
22
22
|
It's possible to delete messages, and mark them as favourites:
|
23
23
|
|
data/hashblue.gemspec
CHANGED
data/lib/hashblue/account.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
module Hashblue
|
2
2
|
class Account < Model
|
3
|
+
class << self
|
4
|
+
def authenticate(access_token)
|
5
|
+
client = Hashblue::Client.new(access_token)
|
6
|
+
response = client.get("/account")
|
7
|
+
Account.new(client, response["account"])
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
3
11
|
attribute_methods :msisdn, :phone_number, :email
|
4
12
|
|
5
13
|
def messages(query = {})
|
@@ -10,6 +18,10 @@ module Hashblue
|
|
10
18
|
client.load_contacts(contacts_uri, query)
|
11
19
|
end
|
12
20
|
|
21
|
+
def favourite_messages(query = {})
|
22
|
+
client.load_messages(favourite_messages_uri, query)
|
23
|
+
end
|
24
|
+
|
13
25
|
def messages_uri
|
14
26
|
@attributes["messages"]
|
15
27
|
end
|
@@ -17,5 +29,9 @@ module Hashblue
|
|
17
29
|
def contacts_uri
|
18
30
|
@attributes["contacts"]
|
19
31
|
end
|
32
|
+
|
33
|
+
def favourite_messages_uri
|
34
|
+
@attributes["favourite_messages"]
|
35
|
+
end
|
20
36
|
end
|
21
37
|
end
|
data/lib/hashblue/client.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'httparty'
|
2
|
+
require 'active_support/ordered_hash'
|
3
|
+
require 'active_support/json'
|
2
4
|
|
3
5
|
module Hashblue
|
4
6
|
class Client
|
@@ -7,28 +9,14 @@ module Hashblue
|
|
7
9
|
include HTTParty
|
8
10
|
|
9
11
|
base_uri "https://api.hashblue.com"
|
12
|
+
headers 'Accept' => 'application/json',
|
13
|
+
'User-Agent' => "Hashblue Client Gem v#{Hashblue::VERSION} (https://github.com/freerange/hashblue-gem)"
|
10
14
|
|
11
|
-
attr_reader :access_token, :refresh_token
|
12
15
|
|
13
|
-
|
14
|
-
@access_token = access_token
|
15
|
-
@refresh_token = refresh_token
|
16
|
-
end
|
17
|
-
|
18
|
-
def account
|
19
|
-
@account ||= Account.new(self, get("/account")["account"])
|
20
|
-
end
|
16
|
+
attr_reader :access_token
|
21
17
|
|
22
|
-
def
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def favourites(query = {})
|
27
|
-
load_messages("/messages/favourites", query)
|
28
|
-
end
|
29
|
-
|
30
|
-
def contacts(query = {})
|
31
|
-
load_contacts("/contacts", query)
|
18
|
+
def initialize(access_token)
|
19
|
+
@access_token = access_token
|
32
20
|
end
|
33
21
|
|
34
22
|
def load_messages(uri, query = {})
|
@@ -51,18 +39,30 @@ module Hashblue
|
|
51
39
|
request :put, path, query, body
|
52
40
|
end
|
53
41
|
|
42
|
+
def post(path, query, body)
|
43
|
+
request :post, path, query, body
|
44
|
+
end
|
45
|
+
|
54
46
|
private
|
55
47
|
|
56
48
|
def request(method, path, query, body = nil)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
49
|
+
options = {:query => query, :headers => self.class.headers.merge(authorization_header)}
|
50
|
+
if body
|
51
|
+
options[:headers]["Content-type"] = "application/json"
|
52
|
+
options[:body] = ActiveSupport::JSON.encode(body)
|
53
|
+
end
|
54
|
+
|
55
|
+
response = self.class.send method, path, options
|
56
|
+
case response.code
|
57
|
+
when 200, 201 then response.to_hash
|
58
|
+
else raise RequestError, "request unsuccessful: #{response.inspect}"
|
61
59
|
end
|
62
60
|
end
|
63
61
|
|
64
|
-
def
|
65
|
-
{
|
62
|
+
def authorization_header
|
63
|
+
{
|
64
|
+
"Authorization" => "OAuth #{access_token}",
|
65
|
+
}
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
data/lib/hashblue/contact.rb
CHANGED
data/lib/hashblue/version.rb
CHANGED
data/lib/hashblue.rb
CHANGED
data/spec/models/account_spec.rb
CHANGED
@@ -8,10 +8,22 @@ describe Hashblue::Account do
|
|
8
8
|
subject do
|
9
9
|
Hashblue::Account.new(client, {
|
10
10
|
'messages' => 'https://api.example.com/messages',
|
11
|
-
'contacts' => 'https://api.example.com/contacts'
|
11
|
+
'contacts' => 'https://api.example.com/contacts',
|
12
|
+
'favourite_messages' => 'https://api.example.com/messages/favourites'
|
12
13
|
})
|
13
14
|
end
|
14
15
|
|
16
|
+
describe '.authenticate' do
|
17
|
+
it "returns Account model built with response from GET /account" do
|
18
|
+
client.class.stubs(:new).with('access-token').returns(client)
|
19
|
+
attributes = {
|
20
|
+
"msisdn" => "4479001234567"
|
21
|
+
}
|
22
|
+
client.stubs(:get).with('/account').returns("account" => attributes)
|
23
|
+
Hashblue::Account.authenticate('access-token').should eql(Hashblue::Account.new(client, attributes))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
15
27
|
describe '#messages' do
|
16
28
|
it "loads messages from its messages uri" do
|
17
29
|
client.expects(:load_messages).with('https://api.example.com/messages', {}).returns([:some_messages])
|
@@ -25,4 +37,11 @@ describe Hashblue::Account do
|
|
25
37
|
subject.contacts.should eql([:some_contacts])
|
26
38
|
end
|
27
39
|
end
|
40
|
+
|
41
|
+
describe '#favourite_messages' do
|
42
|
+
it "loads messages from its favourite messages uri" do
|
43
|
+
client.expects(:load_messages).with('https://api.example.com/messages/favourites', {}).returns([:some_messages])
|
44
|
+
subject.favourite_messages.should eql([:some_messages])
|
45
|
+
end
|
46
|
+
end
|
28
47
|
end
|
data/spec/models/client_spec.rb
CHANGED
@@ -5,78 +5,44 @@ describe Hashblue::Client do
|
|
5
5
|
Hashblue::Client.new('hashblue-access-token')
|
6
6
|
end
|
7
7
|
|
8
|
+
describe 'all requests' do
|
9
|
+
it 'point to api.hashblue.com' do
|
10
|
+
Hashblue::Client.base_uri.should == 'https://api.hashblue.com'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'request json responses' do
|
14
|
+
Hashblue::Client.headers['Accept'].should == 'application/json'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'include a user-agent' do
|
18
|
+
Hashblue::Client.headers['User-Agent'].should_not be_nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
8
22
|
describe '#get' do
|
9
23
|
it "makes requests with Authorization and Accept headers and passed query" do
|
10
24
|
Hashblue::Client.expects(:get).with("/messages",
|
11
|
-
:headers => {
|
12
|
-
"Authorization" => "OAuth hashblue-access-token"
|
13
|
-
|
14
|
-
},
|
25
|
+
:headers => Hashblue::Client.headers.merge({
|
26
|
+
"Authorization" => "OAuth hashblue-access-token"
|
27
|
+
}),
|
15
28
|
:query => {
|
16
29
|
:since => '2011-01-14T14:30Z'
|
17
30
|
}
|
18
|
-
).returns(mock(:
|
31
|
+
).returns(mock(:code => 200, :to_hash => {}))
|
19
32
|
subject.get "/messages", :since => '2011-01-14T14:30Z'
|
20
33
|
end
|
21
34
|
|
22
|
-
it "raises RequestError if response
|
35
|
+
it "raises RequestError if response code isn't 200" do
|
23
36
|
Hashblue::Client.expects(:get).with("/messages",
|
24
|
-
:headers => {
|
25
|
-
"Authorization" => "OAuth hashblue-access-token"
|
26
|
-
|
27
|
-
},
|
37
|
+
:headers => Hashblue::Client.headers.merge({
|
38
|
+
"Authorization" => "OAuth hashblue-access-token"
|
39
|
+
}),
|
28
40
|
:query => {}
|
29
|
-
).returns(mock(:
|
41
|
+
).returns(mock(:code => 500, :inspect => ""))
|
30
42
|
lambda {subject.get "/messages"}.should raise_error(Hashblue::Client::RequestError)
|
31
43
|
end
|
32
44
|
end
|
33
45
|
|
34
|
-
describe '#account' do
|
35
|
-
it "returns Account model built with response from GET /account" do
|
36
|
-
attributes = {
|
37
|
-
"msisdn" => "4479001234567"
|
38
|
-
}
|
39
|
-
subject.stubs(:get).returns("account" => attributes)
|
40
|
-
subject.account.should eql(Hashblue::Account.new(subject, attributes))
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#messages(query = {})' do
|
45
|
-
it "loads messages from '/messages'" do
|
46
|
-
subject.expects(:load_messages).with('/messages', {}).returns([:some_messages])
|
47
|
-
subject.messages.should eql([:some_messages])
|
48
|
-
end
|
49
|
-
|
50
|
-
it "passes query through to load_messages" do
|
51
|
-
subject.expects(:load_messages).with('/messages', {:anything => :here})
|
52
|
-
subject.messages(:anything => :here)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe '#contacts(query = {})' do
|
57
|
-
it "loads contacts from '/contacts'" do
|
58
|
-
subject.expects(:load_contacts).with('/contacts', {}).returns([:some_contacts])
|
59
|
-
subject.contacts.should eql([:some_contacts])
|
60
|
-
end
|
61
|
-
|
62
|
-
it "passes query through to load_contacts" do
|
63
|
-
subject.expects(:load_contacts).with('/contacts', {:anything => :here})
|
64
|
-
subject.contacts(:anything => :here)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe '#favourites(query = {})' do
|
69
|
-
it "loads messages from '/messages/favourites'" do
|
70
|
-
subject.expects(:load_messages).with('/messages/favourites', {}).returns([:favourite_messages])
|
71
|
-
subject.favourites.should eql([:favourite_messages])
|
72
|
-
end
|
73
|
-
|
74
|
-
it "passes query through to load_messages" do
|
75
|
-
subject.expects(:load_messages).with('/messages/favourites', {:anything => :here})
|
76
|
-
subject.favourites(:anything => :here)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
46
|
describe '#load_messages(uri, query)' do
|
81
47
|
it "builds a Collection of messages with the response from the uri" do
|
82
48
|
response = {"messages" => [{"content" => "hello"}]}
|
data/spec/models/contact_spec.rb
CHANGED
@@ -14,8 +14,15 @@ describe Hashblue::Contact do
|
|
14
14
|
|
15
15
|
describe '#messages' do
|
16
16
|
it "loads messages from its messages uri" do
|
17
|
-
client.expects(:load_messages).with(
|
17
|
+
client.expects(:load_messages).with(subject.messages_uri, {}).returns([:some_messages])
|
18
18
|
subject.messages.should eql([:some_messages])
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
describe '#send_message(content)' do
|
23
|
+
it "posts message to messages_uri" do
|
24
|
+
client.expects(:post).with(subject.messages_uri, {}, {"message" => {"content" => "Hello!"}})
|
25
|
+
subject.send_message "Hello!"
|
26
|
+
end
|
27
|
+
end
|
21
28
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashblue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tom Ward
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-06-
|
18
|
+
date: 2011-06-24 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -34,8 +34,23 @@ dependencies:
|
|
34
34
|
name: httparty
|
35
35
|
prerelease: false
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
type: :
|
37
|
+
type: :runtime
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 7
|
44
|
+
segments:
|
45
|
+
- 3
|
46
|
+
- 0
|
47
|
+
version: "3.0"
|
48
|
+
version_requirements: *id002
|
49
|
+
name: activesupport
|
50
|
+
prerelease: false
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
type: :development
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
54
|
none: false
|
40
55
|
requirements:
|
41
56
|
- - ~>
|
@@ -46,12 +61,12 @@ dependencies:
|
|
46
61
|
- 9
|
47
62
|
- 2
|
48
63
|
version: 0.9.2
|
49
|
-
version_requirements: *
|
64
|
+
version_requirements: *id003
|
50
65
|
name: rake
|
51
66
|
prerelease: false
|
52
67
|
- !ruby/object:Gem::Dependency
|
53
68
|
type: :development
|
54
|
-
requirement: &
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
55
70
|
none: false
|
56
71
|
requirements:
|
57
72
|
- - ~>
|
@@ -62,12 +77,12 @@ dependencies:
|
|
62
77
|
- 6
|
63
78
|
- 0
|
64
79
|
version: 2.6.0
|
65
|
-
version_requirements: *
|
80
|
+
version_requirements: *id004
|
66
81
|
name: rspec
|
67
82
|
prerelease: false
|
68
83
|
- !ruby/object:Gem::Dependency
|
69
84
|
type: :development
|
70
|
-
requirement: &
|
85
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
71
86
|
none: false
|
72
87
|
requirements:
|
73
88
|
- - ">="
|
@@ -76,7 +91,7 @@ dependencies:
|
|
76
91
|
segments:
|
77
92
|
- 0
|
78
93
|
version: "0"
|
79
|
-
version_requirements: *
|
94
|
+
version_requirements: *id005
|
80
95
|
name: mocha
|
81
96
|
prerelease: false
|
82
97
|
description: A simple client for the hashblue api
|