backchat-client 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +101 -0
- data/Rakefile +11 -0
- data/backchat-client.gemspec +27 -0
- data/examples/add_channel_to_stream.rb +23 -0
- data/examples/create_channel.rb +20 -0
- data/examples/create_stream.rb +18 -0
- data/examples/delete_channel.rb +18 -0
- data/examples/delete_stream.rb +18 -0
- data/examples/delete_user.rb +19 -0
- data/examples/get_channels.rb +22 -0
- data/examples/stream.rb +29 -0
- data/examples/user.rb +16 -0
- data/lib/backchat-client.rb +212 -0
- data/lib/backchat_client/backchat_logger.rb +75 -0
- data/lib/backchat_client/channel.rb +61 -0
- data/lib/backchat_client/http_client.rb +76 -0
- data/lib/backchat_client/stream.rb +75 -0
- data/lib/backchat_client/user.rb +57 -0
- data/lib/backchat_client/version.rb +3 -0
- data/spec/backchat-client_spec.rb +50 -0
- data/spec/channel_spec.rb +67 -0
- data/spec/streams_spec.rb +38 -0
- data/spec/user_spec.rb +38 -0
- metadata +140 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2011 Juan de Bravo
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
This is a light library to access the Backchat provisioning API
|
2
|
+
|
3
|
+
# Installation
|
4
|
+
|
5
|
+
gem install backchat-client
|
6
|
+
|
7
|
+
# Current version
|
8
|
+
|
9
|
+
0.1
|
10
|
+
|
11
|
+
# Getting started
|
12
|
+
|
13
|
+
You need a valid api-key to access Backchat API
|
14
|
+
|
15
|
+
require 'backchat-client'
|
16
|
+
bc = Backchat::Client.new("api-key")
|
17
|
+
|
18
|
+
# User Management
|
19
|
+
|
20
|
+
## Get user profile
|
21
|
+
|
22
|
+
require 'backchat-client'
|
23
|
+
bc = Backchat::Client.new("api-key")
|
24
|
+
bc.get_profile
|
25
|
+
|
26
|
+
## Delete user
|
27
|
+
|
28
|
+
require 'backchat-client'
|
29
|
+
bc = Backchat::Client.new("api-key")
|
30
|
+
bc.delete_user
|
31
|
+
|
32
|
+
# Streams
|
33
|
+
|
34
|
+
## Create a new stream
|
35
|
+
|
36
|
+
require 'backchat-client'
|
37
|
+
bc = Backchat::Client.new("api-key")
|
38
|
+
bc.create_stream("stream-name")
|
39
|
+
|
40
|
+
## Retrieve application streams
|
41
|
+
|
42
|
+
require 'backchat-client'
|
43
|
+
bc = Backchat::Client.new("api-key")
|
44
|
+
|
45
|
+
# get all streams
|
46
|
+
streams = bc.find_stream
|
47
|
+
|
48
|
+
# get a specific stream
|
49
|
+
stream = bc.find_stream("stream-name")
|
50
|
+
|
51
|
+
## Delete a stream
|
52
|
+
|
53
|
+
require 'backchat-client'
|
54
|
+
bc = Backchat::Client.new("api-key")
|
55
|
+
bc.destroy_stream("stream-name")
|
56
|
+
|
57
|
+
# Channels
|
58
|
+
|
59
|
+
## Create a new channel
|
60
|
+
|
61
|
+
require 'backchat-client'
|
62
|
+
bc = Backchat::Client.new("api-key")
|
63
|
+
bc.create_channel("twitter", "juandebravo")
|
64
|
+
|
65
|
+
## Retrieve application channels
|
66
|
+
|
67
|
+
require 'backchat-client'
|
68
|
+
bc = Backchat::Client.new("api-key")
|
69
|
+
|
70
|
+
# get all channels
|
71
|
+
streams = bc.find_channel
|
72
|
+
|
73
|
+
## Delete a channel
|
74
|
+
|
75
|
+
require 'backchat-client'
|
76
|
+
bc = Backchat::Client.new("api-key")
|
77
|
+
bc.destroy_channel("twitter://juandebravo")
|
78
|
+
|
79
|
+
# License
|
80
|
+
|
81
|
+
The MIT License
|
82
|
+
|
83
|
+
Copyright (c) 2011 Juan de Bravo, Alberto Pastor, Rafael de Oleza.
|
84
|
+
|
85
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
86
|
+
of this software and associated documentation files (the "Software"), to deal
|
87
|
+
in the Software without restriction, including without limitation the rights
|
88
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
89
|
+
copies of the Software, and to permit persons to whom the Software is
|
90
|
+
furnished to do so, subject to the following conditions:
|
91
|
+
|
92
|
+
The above copyright notice and this permission notice shall be included in
|
93
|
+
all copies or substantial portions of the Software.
|
94
|
+
|
95
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
96
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
97
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
98
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
99
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
100
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
101
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
task :default => [:test]
|
5
|
+
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
RSpec::Core::RakeTask.new(:test) do |spec|
|
8
|
+
spec.skip_bundler = true
|
9
|
+
spec.pattern = 'spec/*_spec.rb'
|
10
|
+
spec.rspec_opts = '--color --format doc'
|
11
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "backchat_client/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "backchat-client"
|
7
|
+
s.version = BackchatClient::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["This gem provides an easy way to access Backchat provisioning API"]
|
10
|
+
s.email = ["juandebravo@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Gem to access Backchat provisioning API}
|
13
|
+
s.description = %q{Gem to access Backchat provisioning API using rest_client as http client}
|
14
|
+
|
15
|
+
s.rubyforge_project = "backchat-client"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency("rest-client")
|
23
|
+
s.add_dependency("activesupport")
|
24
|
+
s.add_dependency("addressable")
|
25
|
+
s.add_development_dependency('rspec')
|
26
|
+
s.add_development_dependency('webmock')
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 3 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key, the origin stream slug and the new channel to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
stream_slug = ARGV.shift
|
13
|
+
channel = ARGV.shift
|
14
|
+
|
15
|
+
bc = Backchat::Client.new(api_key)
|
16
|
+
bc.logger.level = Logger::DEBUG
|
17
|
+
|
18
|
+
begin
|
19
|
+
puts bc.set_channels(stream_slug, [{:channel => channel}])
|
20
|
+
rescue Exception => ex
|
21
|
+
puts ex
|
22
|
+
puts ex.inspect
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 2 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key, channel_type and channel_name to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
type = ARGV.shift
|
14
|
+
|
15
|
+
name = ARGV.shift
|
16
|
+
|
17
|
+
bc = Backchat::Client.new(api_key)
|
18
|
+
bc.logger.level = Logger::DEBUG
|
19
|
+
|
20
|
+
puts bc.create_channel(type, name)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 2 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key and stream_name to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
stream = ARGV.shift
|
14
|
+
|
15
|
+
bc = Backchat::Client.new(api_key)
|
16
|
+
bc.logger.level = Logger::DEBUG
|
17
|
+
|
18
|
+
puts bc.create_stream(stream)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 2 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key, channel_name to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
channel = ARGV.shift
|
14
|
+
|
15
|
+
bc = Backchat::Client.new(api_key)
|
16
|
+
bc.logger.level = Logger::DEBUG
|
17
|
+
|
18
|
+
puts bc.destroy_channel(channel, true)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 2 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key, stream_name to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
stream = ARGV.shift
|
14
|
+
|
15
|
+
bc = Backchat::Client.new(api_key)
|
16
|
+
bc.logger.level = Logger::DEBUG
|
17
|
+
|
18
|
+
puts bc.destroy_stream(stream)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 1 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
bc = Backchat::Client.new(api_key)
|
14
|
+
|
15
|
+
bc.logger.level = Logger::DEBUG
|
16
|
+
|
17
|
+
puts bc.delete_user
|
18
|
+
|
19
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 1 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
bc = Backchat::Client.new(api_key)
|
14
|
+
bc.logger.level=Logger::DEBUG
|
15
|
+
|
16
|
+
begin
|
17
|
+
puts bc.find_channel
|
18
|
+
rescue Exception => ex
|
19
|
+
puts ex.message
|
20
|
+
puts ex
|
21
|
+
end
|
22
|
+
|
data/examples/stream.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 1 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
stream = if ARGV.length < 1
|
14
|
+
""
|
15
|
+
else
|
16
|
+
ARGV.shift
|
17
|
+
end
|
18
|
+
|
19
|
+
Backchat::Client.log_level=Logger::DEBUG
|
20
|
+
bc = Backchat::Client.new(api_key)
|
21
|
+
|
22
|
+
begin
|
23
|
+
puts bc.find_stream(stream)
|
24
|
+
rescue Exception => ex
|
25
|
+
puts ex.message
|
26
|
+
puts ex
|
27
|
+
end
|
28
|
+
|
29
|
+
|
data/examples/user.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'backchat-client'
|
4
|
+
|
5
|
+
ARGV.length < 1 and
|
6
|
+
(
|
7
|
+
puts "Please include as argument the api_key to be used"
|
8
|
+
exit
|
9
|
+
)
|
10
|
+
|
11
|
+
api_key = ARGV.shift
|
12
|
+
|
13
|
+
|
14
|
+
bc = Backchat::Client.new(api_key)
|
15
|
+
puts bc.get_profile
|
16
|
+
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'backchat_client/channel'
|
2
|
+
require 'backchat_client/stream'
|
3
|
+
require 'backchat_client/user'
|
4
|
+
require 'backchat_client/backchat_logger'
|
5
|
+
require 'addressable/uri'
|
6
|
+
|
7
|
+
module Backchat
|
8
|
+
|
9
|
+
include BackchatClient::BackchatLogger
|
10
|
+
|
11
|
+
#
|
12
|
+
# This class is the main entry point to use the backchat-client gem.
|
13
|
+
# It creates a client with a specific api_key that connects to Backchat
|
14
|
+
# and processes any request.
|
15
|
+
#
|
16
|
+
class Client
|
17
|
+
include BackchatClient::BackchatLogger
|
18
|
+
|
19
|
+
# default endpoint where Backchat is deployed
|
20
|
+
DEFAULT_ENDPOINT = "https://api.backchat.io/1"
|
21
|
+
|
22
|
+
attr_accessor :api_key
|
23
|
+
attr_reader :endpoint
|
24
|
+
|
25
|
+
#
|
26
|
+
# @param *api_key* application identifier
|
27
|
+
# @param *endpoint* Backchat endpoint
|
28
|
+
#
|
29
|
+
def initialize(api_key, endpoint = nil)
|
30
|
+
@api_key = api_key
|
31
|
+
@endpoint = endpoint.nil? ? DEFAULT_ENDPOINT : endpoint
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Checks if a Token is valid
|
36
|
+
# @return true|false
|
37
|
+
#
|
38
|
+
def valid?
|
39
|
+
!get_profile.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# *User management*
|
44
|
+
|
45
|
+
#
|
46
|
+
# get user profile.
|
47
|
+
# The api_key used should be associated to a user
|
48
|
+
# @return user profile or nil if invalid api_key
|
49
|
+
#
|
50
|
+
def get_profile
|
51
|
+
user.find
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Delete user account
|
56
|
+
#
|
57
|
+
def delete_user
|
58
|
+
user.destroy
|
59
|
+
end
|
60
|
+
|
61
|
+
# *Channels management*
|
62
|
+
|
63
|
+
#
|
64
|
+
# Retrieves a specific channel or all the channels associated to the api_key
|
65
|
+
# @return one or more channel data
|
66
|
+
#
|
67
|
+
def find_channel
|
68
|
+
channels = channel.find
|
69
|
+
|
70
|
+
# check that the data has the expected format
|
71
|
+
if channels.respond_to?("has_key?") and channels.has_key?("data")
|
72
|
+
channels["data"]
|
73
|
+
else
|
74
|
+
logger.info("Unable to find channels")
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Creates a specific channel
|
81
|
+
# @param channel_type kind of channel: check Backchat documentation about supported channel types
|
82
|
+
# @param id channel unique identifier (in user scope)
|
83
|
+
#
|
84
|
+
def create_channel(channel_type, id, bql=nil)
|
85
|
+
_channel = channel.create(generate_channel_url(channel_type, id, bql))
|
86
|
+
|
87
|
+
if _channel.respond_to?("has_key?") and _channel.has_key?("data")
|
88
|
+
_channel["data"]
|
89
|
+
else
|
90
|
+
logger.error("Invalid data received while creating channel #{_channel}")
|
91
|
+
raise "No data received from Backchat while creating channel"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# Delete a channel
|
97
|
+
# @param *name*
|
98
|
+
# @param *force* true|false if channel should be deleted even if being used in a stream
|
99
|
+
#
|
100
|
+
def destroy_channel(name, force = false)
|
101
|
+
channel.destroy(name, force)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Streams management
|
105
|
+
|
106
|
+
|
107
|
+
#
|
108
|
+
# Retrieves a specific stream
|
109
|
+
# @param *name* (optional) stream name. If undefined, all the user streams are retrieved
|
110
|
+
# @return stream data hash
|
111
|
+
#
|
112
|
+
def find_stream(name = nil)
|
113
|
+
streams = stream.find(name)
|
114
|
+
|
115
|
+
if !streams.nil? and streams.respond_to?("has_key?") and streams.has_key?("data")
|
116
|
+
streams["data"]
|
117
|
+
else
|
118
|
+
logger.debug "Stream with name #{name} not found in backchat"
|
119
|
+
nil
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# Create a specific stream
|
125
|
+
# @param *name* unique stream identifier
|
126
|
+
# @param *description* (optional)
|
127
|
+
# @param *filters* (optional) array of filters
|
128
|
+
#
|
129
|
+
def create_stream(name, description = nil, filters = [])
|
130
|
+
description.nil? and description = "Stream created using backchat-client gem"
|
131
|
+
_stream = stream.create(name, description, filters)
|
132
|
+
|
133
|
+
if _stream.respond_to?("has_key?") and _stream.has_key?("data")
|
134
|
+
_stream["data"]
|
135
|
+
else
|
136
|
+
logger.error("Invalid data received while creating stream: #{_stream}")
|
137
|
+
raise "No data received from Backchat while creating stream"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
#
|
142
|
+
# This method updates the stream, assigning the new channels array to it.
|
143
|
+
# In order to simplify, all the channels received will be automatically enabled.
|
144
|
+
# @param stream_slug stream name
|
145
|
+
# @param channels array of channels to be included in the stream
|
146
|
+
# @param reset the channels are added (false) to the current channels or remove (true) the previous ones
|
147
|
+
# @param filter valid Lucene syntax to filter the channels
|
148
|
+
# @return true if the stream was successfully updated
|
149
|
+
# @raise exception if stream is not found
|
150
|
+
#
|
151
|
+
def set_channels(stream_slug, channels = [], reset = false, filter = nil)
|
152
|
+
st = stream.find(stream_slug) or raise "stream does not exist"
|
153
|
+
|
154
|
+
st = st["data"]
|
155
|
+
# format the channels array
|
156
|
+
channels.map { |channel|
|
157
|
+
channel[:enabled] = true
|
158
|
+
channel[:channel]+="?q=#{filter}" unless filter.nil?
|
159
|
+
channel[:channel] = Addressable::URI.parse(channel[:channel]).normalize.to_s
|
160
|
+
}
|
161
|
+
|
162
|
+
if reset
|
163
|
+
# reset the stream channels
|
164
|
+
st["channel_filters"] = channels
|
165
|
+
else
|
166
|
+
# add the new channels to the existing ones
|
167
|
+
st["channel_filters"] |= channels
|
168
|
+
end
|
169
|
+
|
170
|
+
stream.update(stream_slug, st)
|
171
|
+
true
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# Delete a stream
|
176
|
+
#
|
177
|
+
def destroy_stream(name)
|
178
|
+
stream.destroy(name)
|
179
|
+
end
|
180
|
+
|
181
|
+
#
|
182
|
+
# Helper that generates the channel url using Addressable help
|
183
|
+
#
|
184
|
+
def generate_channel_url(type, id, filter = nil)
|
185
|
+
channel_uri = "#{type}://#{id}"
|
186
|
+
if filter
|
187
|
+
channel_uri += "?q=#{filter}"
|
188
|
+
end
|
189
|
+
Addressable::URI.parse(channel_uri).normalize.to_s
|
190
|
+
end
|
191
|
+
|
192
|
+
private
|
193
|
+
|
194
|
+
# Composition pattern
|
195
|
+
|
196
|
+
# user management object
|
197
|
+
def user
|
198
|
+
@user ||= BackchatClient::User.new(api_key, endpoint.dup)
|
199
|
+
end
|
200
|
+
|
201
|
+
# channel management object
|
202
|
+
def channel
|
203
|
+
@channel ||= BackchatClient::Channel.new(api_key, endpoint.dup)
|
204
|
+
end
|
205
|
+
|
206
|
+
# stream management object
|
207
|
+
def stream
|
208
|
+
@stream ||= BackchatClient::Stream.new(api_key, endpoint.dup)
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module BackchatClient
|
4
|
+
|
5
|
+
#
|
6
|
+
# This module injects methods to handle log mechanism
|
7
|
+
#
|
8
|
+
module BackchatLogger
|
9
|
+
#
|
10
|
+
# Nice way to include the Module methods when including it in a class/module
|
11
|
+
#
|
12
|
+
def self.included(base)
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# This module acts as a wrapper to include the class/module level methods
|
18
|
+
#
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
# logger setter
|
22
|
+
# @param value should be a valid IO object (STDOUT, string representing a valid filename, File object)
|
23
|
+
# @return new Logger object created
|
24
|
+
def logger=(value)
|
25
|
+
# _logger must be static var and not class var to be shared between objects/classes
|
26
|
+
if value.is_a?(String)
|
27
|
+
@@_logger = Logger.new(value)
|
28
|
+
else
|
29
|
+
@@_logger = value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# logger getter
|
34
|
+
# @return Logger object
|
35
|
+
def logger
|
36
|
+
@@_logger ||= create_logger
|
37
|
+
end
|
38
|
+
|
39
|
+
#change logger level
|
40
|
+
# @param level valid Logger level constant (Logger::DEBUG, etc)
|
41
|
+
def log_level=(level)
|
42
|
+
logger.level = level
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Creates a new Logger object and defines the level and format
|
47
|
+
#
|
48
|
+
def create_logger(output = nil)
|
49
|
+
output.nil? and output = STDOUT
|
50
|
+
logger = Logger.new(output)
|
51
|
+
logger.level = Logger::ERROR
|
52
|
+
#logger.formatter = proc { |severity, datetime, progname, msg|
|
53
|
+
# "#{severity} on #{datetime} at #{progname}: #{msg}\n"
|
54
|
+
#}
|
55
|
+
logger.datetime_format = "%Y-%m-%d %H:%M:%S"
|
56
|
+
logger
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def logger
|
61
|
+
self.class.logger
|
62
|
+
end
|
63
|
+
|
64
|
+
# debug message with the class name a the beginning of the log
|
65
|
+
def debug(message)
|
66
|
+
logger.debug "#{self.class} #{message}"
|
67
|
+
end
|
68
|
+
|
69
|
+
# error message with the class name a the beginning of the log
|
70
|
+
def error(message)
|
71
|
+
logger.error "#{self.class} #{message}"
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'backchat_client/http_client'
|
2
|
+
require 'active_support'
|
3
|
+
require 'backchat_client/backchat_logger'
|
4
|
+
|
5
|
+
module BackchatClient
|
6
|
+
|
7
|
+
#
|
8
|
+
# A Backchat Channel allows to define an external resource to fetch events using Backchat infrastructure
|
9
|
+
#
|
10
|
+
class Channel
|
11
|
+
include BackchatClient::HttpClient
|
12
|
+
include BackchatClient::BackchatLogger
|
13
|
+
|
14
|
+
# http uri to handle channels
|
15
|
+
URI_PATH = "channels"
|
16
|
+
|
17
|
+
#
|
18
|
+
# @param *api_key* application identifier
|
19
|
+
# @param *endpoint* Backchat endpoint
|
20
|
+
#
|
21
|
+
def initialize(api_key, endpoint)
|
22
|
+
@api_key = api_key
|
23
|
+
@endpoint = endpoint
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# This method POST a request to create a new channel on behalf of the
|
28
|
+
# authenticated application
|
29
|
+
# @param uri valid Backchat URI, i.e. twitter://username
|
30
|
+
# @return response body
|
31
|
+
#
|
32
|
+
def create(uri)
|
33
|
+
ActiveSupport::JSON.decode(post("index.json", {:channel => uri}))
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# This method sends a GET request to retrieve all the user channels
|
38
|
+
# There is no way to retrieve a specific channel
|
39
|
+
# @return response body
|
40
|
+
#
|
41
|
+
def find
|
42
|
+
ActiveSupport::JSON.decode(get("index.json"))
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Delete an application channel
|
47
|
+
# @param *name* valid channel URI
|
48
|
+
# @param *force* delete even if it is being used by a stream
|
49
|
+
# @return true|false
|
50
|
+
#
|
51
|
+
def destroy(name, force = false)
|
52
|
+
begin
|
53
|
+
ActiveSupport::JSON.decode(delete("", {:channel => name, :force => force}))
|
54
|
+
return true
|
55
|
+
rescue RestClient::ResourceNotFound
|
56
|
+
return false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'backchat_client/backchat_logger'
|
3
|
+
|
4
|
+
module BackchatClient
|
5
|
+
#
|
6
|
+
# This module sends HTTP requests to Backchat including the specific
|
7
|
+
# header authenticating the sender
|
8
|
+
# It's just a mixin, some features must be pre-loaded in the entity that uses
|
9
|
+
# the mixin
|
10
|
+
# @endpoint: Backchat API URI: https://api.backchat.io
|
11
|
+
# @api_key: application api key: kljdfjrwerwlkdfjsldkf
|
12
|
+
# URI_PATH: entity/model specific: streams, channels, etc.
|
13
|
+
#
|
14
|
+
module HttpClient
|
15
|
+
|
16
|
+
include BackchatClient::BackchatLogger
|
17
|
+
|
18
|
+
# HTTP GET
|
19
|
+
def get(path, params = {}, headers = {})
|
20
|
+
headers.merge!({:Authorization => "Backchat #{@api_key}", :Accept => "application/json"})
|
21
|
+
|
22
|
+
uri = set_path(path)
|
23
|
+
uri = "#{uri}?".concat(params.collect { |k, v| "#{k}=#{v.to_s}" }.join("&"))
|
24
|
+
debug("get request to uri #{uri}")
|
25
|
+
RestClient.get(uri, headers)
|
26
|
+
end
|
27
|
+
|
28
|
+
# HTTP POST
|
29
|
+
def post(path, body = {}, headers = {})
|
30
|
+
headers.merge!({:Authorization => "Backchat #{@api_key}", :content_type => :json, :accept => :json})
|
31
|
+
body = ActiveSupport::JSON.encode(body)
|
32
|
+
uri = set_path(path)
|
33
|
+
debug("post request to uri #{uri}")
|
34
|
+
debug("post body: <#{body}>")
|
35
|
+
RestClient.post("#{uri}", body, headers)
|
36
|
+
end
|
37
|
+
|
38
|
+
# HTTP PUT
|
39
|
+
def put(path, body = {}, headers = {})
|
40
|
+
headers.merge!({:Authorization => "Backchat #{@api_key}", :content_type => :json, :accept => :json})
|
41
|
+
body = ActiveSupport::JSON.encode(body)
|
42
|
+
uri = set_path(path)
|
43
|
+
debug("put request to uri #{uri}")
|
44
|
+
debug("put body: <#{body}>")
|
45
|
+
RestClient.put("#{uri}", body, headers)
|
46
|
+
end
|
47
|
+
|
48
|
+
# HTTP DELETE
|
49
|
+
def delete(path, params = {}, headers = {})
|
50
|
+
headers.merge!({:Authorization => "Backchat #{@api_key}", :accept => :json})
|
51
|
+
uri = set_path(path)
|
52
|
+
uri = "#{uri}?".concat(params.collect { |k, v| "#{k}=#{v.to_s}" }.join("&"))
|
53
|
+
debug("delete request to uri #{uri}")
|
54
|
+
RestClient.delete(uri, headers)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def set_path(path)
|
60
|
+
if uri_path.nil?
|
61
|
+
"#{@endpoint}/#{path}"
|
62
|
+
else
|
63
|
+
"#{@endpoint}/#{uri_path}/#{path}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns the entity URI_PATH constant (loaded from the entity class)
|
68
|
+
def uri_path
|
69
|
+
unless defined? self.class::URI_PATH
|
70
|
+
raise RuntimeError.new "URI_PATH constant should be defined"
|
71
|
+
end
|
72
|
+
self.class::URI_PATH
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'backchat_client/http_client'
|
2
|
+
require 'backchat_client/backchat_logger'
|
3
|
+
require 'active_support'
|
4
|
+
|
5
|
+
module BackchatClient
|
6
|
+
|
7
|
+
#
|
8
|
+
# A Backchat Stream allows to define a set of channels with filters
|
9
|
+
#
|
10
|
+
class Stream
|
11
|
+
include BackchatClient::HttpClient
|
12
|
+
include BackchatClient::BackchatLogger
|
13
|
+
|
14
|
+
# http uri to handle streams
|
15
|
+
URI_PATH = "streams"
|
16
|
+
|
17
|
+
#
|
18
|
+
# @param *api_key* application identifier
|
19
|
+
# @param *endpoint* Backchat endpoint
|
20
|
+
#
|
21
|
+
def initialize(api_key, endpoint)
|
22
|
+
@api_key = api_key
|
23
|
+
@endpoint = endpoint
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# This method POST a request to create a new stream on behalf of the
|
28
|
+
# authenticated application
|
29
|
+
# @param name
|
30
|
+
# @param description
|
31
|
+
# @param filters one or more valid channel URIs
|
32
|
+
# @param filter_enabled one or more boolean values enabling|disabling the filters
|
33
|
+
# @return response body
|
34
|
+
#
|
35
|
+
def create(name, description, filters = [])
|
36
|
+
ActiveSupport::JSON.decode(post("", {:name => name, :description => description, :channel_filters => filters}))
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Retrieves a stream
|
41
|
+
# @param *name* get a stream
|
42
|
+
# @return stream data or nil if not found
|
43
|
+
#
|
44
|
+
def find(name)
|
45
|
+
if name
|
46
|
+
begin
|
47
|
+
ActiveSupport::JSON.decode(get(name))
|
48
|
+
rescue RestClient::ResourceNotFound
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
else
|
52
|
+
ActiveSupport::JSON.decode(get("index.json"))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def update(slug, params)
|
57
|
+
ActiveSupport::JSON.decode(put(slug, params))
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Delete a defined stream
|
62
|
+
# @param *name* valid stream name
|
63
|
+
# @param true|false if deleted or not
|
64
|
+
#
|
65
|
+
def destroy(name)
|
66
|
+
begin
|
67
|
+
ActiveSupport::JSON.decode(delete(name))
|
68
|
+
return true
|
69
|
+
rescue RestClient::ResourceNotFound
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'backchat_client/http_client'
|
3
|
+
require 'backchat_client/backchat_logger'
|
4
|
+
|
5
|
+
module BackchatClient
|
6
|
+
|
7
|
+
#
|
8
|
+
# A Backchat User is a developer that has an api_key and can create applications using Backchat API
|
9
|
+
#
|
10
|
+
class User
|
11
|
+
include BackchatClient::HttpClient
|
12
|
+
include BackchatClient::BackchatLogger
|
13
|
+
|
14
|
+
URI_PATH = nil # no suffix for user path
|
15
|
+
|
16
|
+
#
|
17
|
+
# @param *api_key* application identifier
|
18
|
+
# @param *endpoint* Backchat endpoint
|
19
|
+
#
|
20
|
+
def initialize(api_key, endpoint)
|
21
|
+
@api_key = api_key
|
22
|
+
@endpoint = endpoint
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# Delete user account
|
27
|
+
#
|
28
|
+
def destroy
|
29
|
+
delete("")
|
30
|
+
end
|
31
|
+
|
32
|
+
# this method return the user profile in case that the token provided is valid
|
33
|
+
# @return user profile with information about channels, streams and plan
|
34
|
+
# @return nil if token is invalid or an unexpected error takes place
|
35
|
+
def find
|
36
|
+
begin
|
37
|
+
debug("Fetching user profile")
|
38
|
+
data = get("index.json")
|
39
|
+
if data.is_a?(String)
|
40
|
+
data = ActiveSupport::JSON.decode(data)
|
41
|
+
if data.has_key?("data")
|
42
|
+
data["data"]
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
rescue RestClient::Unauthorized => ex
|
48
|
+
error "Invalid api_key #{@api_key}"
|
49
|
+
nil # Invalid token
|
50
|
+
rescue Exception => ex
|
51
|
+
logger.error " Unexpected error"
|
52
|
+
logger.error ex.inspect
|
53
|
+
nil # Unexpected error
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'backchat-client'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
|
4
|
+
describe Backchat::Client do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
Backchat::Client.log_level = Logger::DEBUG
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "it initializes correctly the client" do
|
11
|
+
|
12
|
+
it "gets the api key and the endpoint" do
|
13
|
+
bc = Backchat::Client.new("api-key", "endpoint")
|
14
|
+
bc.endpoint.should eq("endpoint")
|
15
|
+
bc.api_key.should eq("api-key")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "gets the api key and the default endpoint" do
|
19
|
+
bc = Backchat::Client.new("api-key")
|
20
|
+
bc.endpoint.should eq(Backchat::Client::DEFAULT_ENDPOINT)
|
21
|
+
bc.api_key.should eq("api-key")
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "valid? method" do
|
25
|
+
it "returns true with a valid token" do
|
26
|
+
api_key = "valid-api-key"
|
27
|
+
stub_request(:get, "https://api.backchat.io/1/index.json?").
|
28
|
+
with(:headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{api_key}"}).
|
29
|
+
to_return(:status => 200, :body => "{'data':{'channels':[],'email':'user@backchat.com','_id':'user_id','api_key':'#{api_key}','last_name':'lastname','first_name':'name','plan':'https://api.backchat.io/1/plans/free','streams':[],'login':'user'},'errors':[]}", :headers => {})
|
30
|
+
|
31
|
+
bc = Backchat::Client.new(api_key)
|
32
|
+
bc.valid?.should eql(true)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns false with a valid token" do
|
36
|
+
api_key = "invalid-api-key"
|
37
|
+
stub_request(:get, "https://api.backchat.io/1/index.json?").
|
38
|
+
with(:headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{api_key}"}).
|
39
|
+
to_return(:status => 401, :body => "{'data':null,'errors':[['','Unauthorized']]}", :headers => {})
|
40
|
+
|
41
|
+
bc = Backchat::Client.new(api_key)
|
42
|
+
bc.valid?.should eql(false)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'backchat-client'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
|
4
|
+
describe BackchatClient::Channel do
|
5
|
+
API_KEY = "valid-api-key"
|
6
|
+
|
7
|
+
describe "when working with find method" do
|
8
|
+
|
9
|
+
it "gets all the user defined channels" do
|
10
|
+
stub_request(:get, "https://api.backchat.io/1/channels/index.json?").
|
11
|
+
with(:headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{API_KEY}"}).
|
12
|
+
to_return(:body => '{"data":[{"uri":"twitter://pastoret/#timeline"},{"uri":"twitter://juandebravo/#timeline"}],"errors":[]}')
|
13
|
+
|
14
|
+
bc = Backchat::Client.new(API_KEY)
|
15
|
+
channels = bc.find_channel
|
16
|
+
channels.should be_a(Array)
|
17
|
+
channels.length.should eql(2)
|
18
|
+
channels.each { |channel|
|
19
|
+
channel.should be_a(Hash)
|
20
|
+
channel.should have_key("uri")
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "when creating a channel" do
|
27
|
+
it "returns the channel identifier" do
|
28
|
+
stub_request(:post, "https://api.backchat.io/1/channels/index.json").
|
29
|
+
with(:body => '{"channel":"twitter://juandebravo"}', :headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{API_KEY}"}).
|
30
|
+
to_return(:body => '{"data":{"uri":"twitter://juandebravo/#timeline"}, "errors":[]}')
|
31
|
+
|
32
|
+
bc = Backchat::Client.new(API_KEY)
|
33
|
+
|
34
|
+
channel = bc.create_channel("twitter", "juandebravo")
|
35
|
+
channel.should be_a(Hash)
|
36
|
+
channel.should have_key("uri")
|
37
|
+
channel["uri"].should eql("twitter://juandebravo/#timeline")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "when deleting a channel" do
|
42
|
+
it "returns ok when the channel exists and force is set to false" do
|
43
|
+
pending("need to fix web mock")
|
44
|
+
stub_request(:delete, "https://api.backchat.io/1/channels/").
|
45
|
+
with(:query => {"channel" => "twitter://juandebravo/#timeline"}, :headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{API_KEY}"}).
|
46
|
+
to_return(:body => '{"data":{"uri":"twitter://juandebravo/#timeline"}, "errors":[]}')
|
47
|
+
|
48
|
+
bc = Backchat::Client.new(API_KEY)
|
49
|
+
result = bc.destroy_channel("twitter://juandebravo/#timeline")
|
50
|
+
result.should eql(true)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns ok when the channel exists and force is set to true" do
|
54
|
+
pending("need to fix web mock")
|
55
|
+
stub_request(:delete, "https://api.backchat.io/1/channels/").
|
56
|
+
with(:query => {"channel" => "twitter://juandebravo/#timeline", "force" => "true"}, :headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{API_KEY}"}).
|
57
|
+
to_return(:body => '{"data":{"uri":"twitter://juandebravo/#timeline"}, "errors":[]}')
|
58
|
+
|
59
|
+
bc = Backchat::Client.new(API_KEY)
|
60
|
+
result = bc.destroy_channel("twitter://juandebravo/#timeline", true)
|
61
|
+
result.should eql(true)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'backchat-client'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
|
4
|
+
describe BackchatClient::Stream do
|
5
|
+
API_KEY = "valid_api_key"
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
Backchat::Client.log_level = Logger::DEBUG
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "when working with find method" do
|
12
|
+
|
13
|
+
it "gets all the user defined streams when no name is provided" do
|
14
|
+
pending
|
15
|
+
end
|
16
|
+
|
17
|
+
it "gets a specific stream when name is provided" do
|
18
|
+
pending
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "when creating a stream" do
|
24
|
+
it "returns the stream identifier" do
|
25
|
+
pending
|
26
|
+
bc = Backchat::Client.new(API_KEY)
|
27
|
+
puts bc.create_stream("stream-name", nil, [{:channel => "twitter://juandebravo/#timeline", :enabled => true}])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "when deleting a stream" do
|
32
|
+
it "returns ok when the stream exists" do
|
33
|
+
pending
|
34
|
+
bc = Backchat::Client.new(API_KEY)
|
35
|
+
puts bc.destroy_stream("stream-name")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/spec/user_spec.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'backchat-client'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
|
4
|
+
describe BackchatClient::User do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
Backchat::Client.log_level = Logger::DEBUG
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "when working with find method" do
|
11
|
+
|
12
|
+
it "gets all the user defined streams when no name is provided" do
|
13
|
+
API_KEY = "valid_api_key"
|
14
|
+
bc = Backchat::Client.new(API_KEY)
|
15
|
+
stub_request(:get, "https://api.backchat.io/1/index.json?").
|
16
|
+
with(:headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{API_KEY}"}).
|
17
|
+
to_return(:status => 200, :body => "{'data':{'channels':[{'uri':'smtp://user.channel/'}, {'uri':'twitter://username'}],'email':'user@backchat.com','_id':'user_id','api_key':'#{API_KEY}','last_name':'lastname','first_name':'name','plan':'https://api.backchat.io/1/plans/free','streams':['https://api.backchat.io/1/streams/user-stream'],'login':'user'},'errors':[]}", :headers => {})
|
18
|
+
|
19
|
+
profile = bc.get_profile
|
20
|
+
["channels", "email", "api_key"].each{|key|
|
21
|
+
profile.should have_key(key)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "deletes a user when valid api_key provided" do
|
26
|
+
API_KEY = "valid_api_key"
|
27
|
+
bc = Backchat::Client.new(API_KEY)
|
28
|
+
stub_request(:delete, "https://api.backchat.io/1/?").
|
29
|
+
with(:headers => {'Accept'=>'application/json', 'Authorization' => "Backchat #{API_KEY}"}).
|
30
|
+
to_return(:status => 200, :body => "", :headers => {})
|
31
|
+
|
32
|
+
result = bc.delete_user
|
33
|
+
result.should eql("")
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: backchat-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: "0.1"
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- This gem provides an easy way to access Backchat provisioning API
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-07-26 00:00:00 +02:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rest-client
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "0"
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: addressable
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rspec
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: webmock
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id005
|
71
|
+
description: Gem to access Backchat provisioning API using rest_client as http client
|
72
|
+
email:
|
73
|
+
- juandebravo@gmail.com
|
74
|
+
executables: []
|
75
|
+
|
76
|
+
extensions: []
|
77
|
+
|
78
|
+
extra_rdoc_files: []
|
79
|
+
|
80
|
+
files:
|
81
|
+
- .gitignore
|
82
|
+
- .rspec
|
83
|
+
- Gemfile
|
84
|
+
- LICENSE
|
85
|
+
- README.md
|
86
|
+
- Rakefile
|
87
|
+
- backchat-client.gemspec
|
88
|
+
- examples/add_channel_to_stream.rb
|
89
|
+
- examples/create_channel.rb
|
90
|
+
- examples/create_stream.rb
|
91
|
+
- examples/delete_channel.rb
|
92
|
+
- examples/delete_stream.rb
|
93
|
+
- examples/delete_user.rb
|
94
|
+
- examples/get_channels.rb
|
95
|
+
- examples/stream.rb
|
96
|
+
- examples/user.rb
|
97
|
+
- lib/backchat-client.rb
|
98
|
+
- lib/backchat_client/backchat_logger.rb
|
99
|
+
- lib/backchat_client/channel.rb
|
100
|
+
- lib/backchat_client/http_client.rb
|
101
|
+
- lib/backchat_client/stream.rb
|
102
|
+
- lib/backchat_client/user.rb
|
103
|
+
- lib/backchat_client/version.rb
|
104
|
+
- spec/backchat-client_spec.rb
|
105
|
+
- spec/channel_spec.rb
|
106
|
+
- spec/streams_spec.rb
|
107
|
+
- spec/user_spec.rb
|
108
|
+
has_rdoc: true
|
109
|
+
homepage: ""
|
110
|
+
licenses: []
|
111
|
+
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: "0"
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: "0"
|
129
|
+
requirements: []
|
130
|
+
|
131
|
+
rubyforge_project: backchat-client
|
132
|
+
rubygems_version: 1.6.2
|
133
|
+
signing_key:
|
134
|
+
specification_version: 3
|
135
|
+
summary: Gem to access Backchat provisioning API
|
136
|
+
test_files:
|
137
|
+
- spec/backchat-client_spec.rb
|
138
|
+
- spec/channel_spec.rb
|
139
|
+
- spec/streams_spec.rb
|
140
|
+
- spec/user_spec.rb
|