ue-ruby-sdk 1.0.0
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 +7 -0
- data/.document +5 -0
- data/.versions.conf +4 -0
- data/Gemfile +25 -0
- data/Gemfile.lock +118 -0
- data/LICENSE.txt +20 -0
- data/README.md +86 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/example/example1.rb +30 -0
- data/lib/config/Constants.rb +5 -0
- data/lib/models/UEApp.rb +59 -0
- data/lib/models/UEConnection.rb +174 -0
- data/lib/models/UEUser.rb +130 -0
- data/lib/ue-ruby-sdk.rb +8 -0
- data/lib/utilities/UELogger.rb +26 -0
- data/lib/utilities/UERequest.rb +23 -0
- data/lib/utilities/extensions.rb +21 -0
- data/test/helper.rb +34 -0
- data/test/test_ruby-unificationengine.rb +7 -0
- metadata +176 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 3b52662de41b96ef88b027da7174ae3806f0e9f5
|
|
4
|
+
data.tar.gz: 8e3c77c92b15c04621a4d39a5ef584482aabc5e3
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: d3165ceaf5d067d472c66e5abea2e36d2c2645121616424241314bedd1a80e0828e4cd10c07719e4cca1e8afe5efe73af381619b5defbfb5ae66c62c333b63b2
|
|
7
|
+
data.tar.gz: 9e14f8970f7e4f9c4a71d1d674a723fbe7e1fcf676faead02f82dc1d26b7fb699f52e78d0df477601e4dd6b552ef5e9ab54a495c74f06b36400a6bdad1e4ec42
|
data/.document
ADDED
data/.versions.conf
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
source "http://rubygems.org"
|
|
2
|
+
# Add dependencies required to use your gem here.
|
|
3
|
+
# Example:
|
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
|
5
|
+
|
|
6
|
+
# Add dependencies to develop your gem here.
|
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
|
8
|
+
group :development do
|
|
9
|
+
gem "shoulda", ">= 0"
|
|
10
|
+
gem "rdoc", "~> 3.12"
|
|
11
|
+
gem "bundler", "~> 1.0"
|
|
12
|
+
gem "jeweler", "~> 2.0.1"
|
|
13
|
+
gem "simplecov", ">= 0"
|
|
14
|
+
gem "logging"
|
|
15
|
+
gem "pry"
|
|
16
|
+
gem "pry-byebug"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
group :production do
|
|
20
|
+
gem "facets"
|
|
21
|
+
gem "json"
|
|
22
|
+
gem "rest-client"
|
|
23
|
+
gem "require_all"
|
|
24
|
+
gem "uuidtools"
|
|
25
|
+
end
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: http://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
activesupport (4.2.5.1)
|
|
5
|
+
i18n (~> 0.7)
|
|
6
|
+
json (~> 1.7, >= 1.7.7)
|
|
7
|
+
minitest (~> 5.1)
|
|
8
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
9
|
+
tzinfo (~> 1.1)
|
|
10
|
+
addressable (2.4.0)
|
|
11
|
+
builder (3.2.2)
|
|
12
|
+
byebug (8.2.2)
|
|
13
|
+
coderay (1.1.1)
|
|
14
|
+
descendants_tracker (0.0.4)
|
|
15
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
16
|
+
docile (1.1.5)
|
|
17
|
+
domain_name (0.5.20160128)
|
|
18
|
+
unf (>= 0.0.5, < 1.0.0)
|
|
19
|
+
facets (3.0.0)
|
|
20
|
+
faraday (0.9.2)
|
|
21
|
+
multipart-post (>= 1.2, < 3)
|
|
22
|
+
git (1.2.9.1)
|
|
23
|
+
github_api (0.13.1)
|
|
24
|
+
addressable (~> 2.4.0)
|
|
25
|
+
descendants_tracker (~> 0.0.4)
|
|
26
|
+
faraday (~> 0.8, < 0.10)
|
|
27
|
+
hashie (>= 3.4)
|
|
28
|
+
multi_json (>= 1.7.5, < 2.0)
|
|
29
|
+
oauth2
|
|
30
|
+
hashie (3.4.3)
|
|
31
|
+
highline (1.7.8)
|
|
32
|
+
http-cookie (1.0.2)
|
|
33
|
+
domain_name (~> 0.5)
|
|
34
|
+
i18n (0.7.0)
|
|
35
|
+
jeweler (2.0.1)
|
|
36
|
+
builder
|
|
37
|
+
bundler (>= 1.0)
|
|
38
|
+
git (>= 1.2.5)
|
|
39
|
+
github_api
|
|
40
|
+
highline (>= 1.6.15)
|
|
41
|
+
nokogiri (>= 1.5.10)
|
|
42
|
+
rake
|
|
43
|
+
rdoc
|
|
44
|
+
json (1.8.3)
|
|
45
|
+
jwt (1.5.1)
|
|
46
|
+
little-plugger (1.1.4)
|
|
47
|
+
logging (2.0.0)
|
|
48
|
+
little-plugger (~> 1.1)
|
|
49
|
+
multi_json (~> 1.10)
|
|
50
|
+
method_source (0.8.2)
|
|
51
|
+
mime-types (2.99.1)
|
|
52
|
+
mini_portile2 (2.0.0)
|
|
53
|
+
minitest (5.8.4)
|
|
54
|
+
multi_json (1.11.2)
|
|
55
|
+
multi_xml (0.5.5)
|
|
56
|
+
multipart-post (2.0.0)
|
|
57
|
+
netrc (0.11.0)
|
|
58
|
+
nokogiri (1.6.7.2)
|
|
59
|
+
mini_portile2 (~> 2.0.0.rc2)
|
|
60
|
+
oauth2 (1.1.0)
|
|
61
|
+
faraday (>= 0.8, < 0.10)
|
|
62
|
+
jwt (~> 1.0, < 1.5.2)
|
|
63
|
+
multi_json (~> 1.3)
|
|
64
|
+
multi_xml (~> 0.5)
|
|
65
|
+
rack (>= 1.2, < 3)
|
|
66
|
+
pry (0.10.3)
|
|
67
|
+
coderay (~> 1.1.0)
|
|
68
|
+
method_source (~> 0.8.1)
|
|
69
|
+
slop (~> 3.4)
|
|
70
|
+
pry-byebug (3.3.0)
|
|
71
|
+
byebug (~> 8.0)
|
|
72
|
+
pry (~> 0.10)
|
|
73
|
+
rack (1.6.4)
|
|
74
|
+
rake (10.5.0)
|
|
75
|
+
rdoc (3.12.2)
|
|
76
|
+
json (~> 1.4)
|
|
77
|
+
require_all (1.3.3)
|
|
78
|
+
rest-client (1.8.0)
|
|
79
|
+
http-cookie (>= 1.0.2, < 2.0)
|
|
80
|
+
mime-types (>= 1.16, < 3.0)
|
|
81
|
+
netrc (~> 0.7)
|
|
82
|
+
shoulda (3.5.0)
|
|
83
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
|
84
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
|
85
|
+
shoulda-context (1.2.1)
|
|
86
|
+
shoulda-matchers (2.8.0)
|
|
87
|
+
activesupport (>= 3.0.0)
|
|
88
|
+
simplecov (0.11.2)
|
|
89
|
+
docile (~> 1.1.0)
|
|
90
|
+
json (~> 1.8)
|
|
91
|
+
simplecov-html (~> 0.10.0)
|
|
92
|
+
simplecov-html (0.10.0)
|
|
93
|
+
slop (3.6.0)
|
|
94
|
+
thread_safe (0.3.5)
|
|
95
|
+
tzinfo (1.2.2)
|
|
96
|
+
thread_safe (~> 0.1)
|
|
97
|
+
unf (0.1.4)
|
|
98
|
+
unf_ext
|
|
99
|
+
unf_ext (0.0.7.2)
|
|
100
|
+
uuidtools (2.1.5)
|
|
101
|
+
|
|
102
|
+
PLATFORMS
|
|
103
|
+
ruby
|
|
104
|
+
|
|
105
|
+
DEPENDENCIES
|
|
106
|
+
bundler (~> 1.0)
|
|
107
|
+
facets
|
|
108
|
+
jeweler (~> 2.0.1)
|
|
109
|
+
json
|
|
110
|
+
logging
|
|
111
|
+
pry
|
|
112
|
+
pry-byebug
|
|
113
|
+
rdoc (~> 3.12)
|
|
114
|
+
require_all
|
|
115
|
+
rest-client
|
|
116
|
+
shoulda
|
|
117
|
+
simplecov
|
|
118
|
+
uuidtools
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2016 Hossam Saraya
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# ue-ruby-sdk
|
|
2
|
+
> A UnificationEngine client SDK for Ruby/Rails
|
|
3
|
+
|
|
4
|
+
## Installation
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
$ gem install ue-ruby-sdk
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```ruby
|
|
13
|
+
var app = UEApp.new("APP_KEY","APP_SECRET");
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
#### Creating User
|
|
17
|
+
```ruby
|
|
18
|
+
user = app.create_user
|
|
19
|
+
#user is an instance of UEUser
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
#### Listing Users
|
|
23
|
+
```ruby
|
|
24
|
+
users = app.list_users
|
|
25
|
+
#users is an array of User objects
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### Deleting User
|
|
29
|
+
```ruby
|
|
30
|
+
user = app.create_user
|
|
31
|
+
app.delete_user(user) #true
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
#### Adding a connection to a user
|
|
35
|
+
```ruby
|
|
36
|
+
connection = user.add_connection "myconnectionname", "facebook", "facebook_access_token")
|
|
37
|
+
#connection is an instance of UEConnection
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- `connection_name` must be unique per connection.
|
|
41
|
+
- `access_token` has to be valid and working from the provider side
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
#### Listing User connections
|
|
45
|
+
```ruby
|
|
46
|
+
connections = user.list_connections
|
|
47
|
+
# connections is an array of UEConnection objects
|
|
48
|
+
```
|
|
49
|
+
#### Removing a User Connection
|
|
50
|
+
```ruby
|
|
51
|
+
user.remove_connection(connection_name) #true | false
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### Testing a connection
|
|
55
|
+
```ruby
|
|
56
|
+
#return true if working, false otherwise
|
|
57
|
+
user.test_connection(service_url) #eg: facebook://accesstoken@facebook.com
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Sending a message using a connection
|
|
61
|
+
```ruby
|
|
62
|
+
options = {
|
|
63
|
+
receivers:[
|
|
64
|
+
{
|
|
65
|
+
name:"me"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name:"Page",
|
|
69
|
+
id:"122"
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
message:{
|
|
73
|
+
subject:"test",
|
|
74
|
+
body: "ABC",
|
|
75
|
+
image:"http://politibits.blogs.tuscaloosanews.com/files/2010/07/sanford_big_dummy_navy_shirt.jpg",
|
|
76
|
+
link:{
|
|
77
|
+
uri: "http://google.com",
|
|
78
|
+
description: "link desc",
|
|
79
|
+
title:"link title"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
#uris will hold the uris for the sent messages
|
|
85
|
+
uris = app.list_connections[0].send_message options
|
|
86
|
+
```
|
data/Rakefile
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'bundler'
|
|
5
|
+
begin
|
|
6
|
+
Bundler.setup(:default, :development)
|
|
7
|
+
rescue Bundler::BundlerError => e
|
|
8
|
+
$stderr.puts e.message
|
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
|
10
|
+
exit e.status_code
|
|
11
|
+
end
|
|
12
|
+
require 'rake'
|
|
13
|
+
|
|
14
|
+
require 'jeweler'
|
|
15
|
+
Jeweler::Tasks.new do |gem|
|
|
16
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
|
17
|
+
gem.name = "ue-ruby-sdk"
|
|
18
|
+
gem.homepage = "https://github.com/unifiedinbox/ue-ruby-sdk"
|
|
19
|
+
gem.license = "MIT"
|
|
20
|
+
gem.summary = %Q{UnificationEngine Ruby Client SDK}
|
|
21
|
+
gem.description = %Q{UnificationEngine Ruby SDK as a wrapper over UnificationEngine API}
|
|
22
|
+
gem.email = "hossam.saraya@gmail.com"
|
|
23
|
+
gem.authors = ["Hossam Saraya"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# dependencies defined in Gemfile
|
|
27
|
+
end
|
|
28
|
+
Jeweler::RubygemsDotOrgTasks.new
|
|
29
|
+
|
|
30
|
+
require 'rake/testtask'
|
|
31
|
+
Rake::TestTask.new(:test) do |test|
|
|
32
|
+
test.libs << 'lib' << 'test'
|
|
33
|
+
test.pattern = 'test/**/test_*.rb'
|
|
34
|
+
test.verbose = true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
desc "Code coverage detail"
|
|
38
|
+
task :simplecov do
|
|
39
|
+
ENV['COVERAGE'] = "true"
|
|
40
|
+
Rake::Task['test'].execute
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
task :default => :test
|
|
44
|
+
|
|
45
|
+
require 'rdoc/task'
|
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
|
48
|
+
|
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
50
|
+
rdoc.title = "ruby-unificationengine #{version}"
|
|
51
|
+
rdoc.rdoc_files.include('README*')
|
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
53
|
+
end
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.0.0
|
data/example/example1.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ue-ruby-sdk'
|
|
2
|
+
|
|
3
|
+
app = UEApp.new("UE_APP_ID","UE_APP_SECRET")
|
|
4
|
+
|
|
5
|
+
options = {
|
|
6
|
+
receivers:[
|
|
7
|
+
{
|
|
8
|
+
name:"me"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name:"Page",
|
|
12
|
+
id:"122"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
message:{
|
|
16
|
+
subject:"test",
|
|
17
|
+
body: "ABC",
|
|
18
|
+
image:"http://politibits.blogs.tuscaloosanews.com/files/2010/07/sanford_big_dummy_navy_shirt.jpg",
|
|
19
|
+
link:{
|
|
20
|
+
uri: "http://google.com",
|
|
21
|
+
description: "link desc",
|
|
22
|
+
title:"link title"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
user = app.create_user
|
|
29
|
+
user.list_connections[0].send_message options #send message using the first connector
|
|
30
|
+
|
data/lib/models/UEApp.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require "facets"
|
|
2
|
+
class UEApp
|
|
3
|
+
##
|
|
4
|
+
# Constructor
|
|
5
|
+
# @param {String} app_key
|
|
6
|
+
# @param {String} app_secret
|
|
7
|
+
def initialize(api_key, api_secret)
|
|
8
|
+
@api_key = api_key
|
|
9
|
+
@api_secret = api_secret
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
# Creates a UE User
|
|
16
|
+
#
|
|
17
|
+
# @return {UEUser} user the created user
|
|
18
|
+
#
|
|
19
|
+
def create_user()
|
|
20
|
+
response = UERequest.fetch "user/create", {
|
|
21
|
+
user: @api_key,
|
|
22
|
+
pass: @api_secret
|
|
23
|
+
}
|
|
24
|
+
response[:uri] ? UEUser.new(response[:uri]) : nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# Deletes a UE User
|
|
29
|
+
#
|
|
30
|
+
# @param {UEUser} user the user to delete
|
|
31
|
+
# @return {Boolean} success/fail
|
|
32
|
+
#
|
|
33
|
+
def delete_user( user )
|
|
34
|
+
response = UERequest.fetch "user/delete", {
|
|
35
|
+
user: @api_key,
|
|
36
|
+
pass: @api_secret,
|
|
37
|
+
form: {
|
|
38
|
+
uri: user.uri
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
response[:status] == 200? true: false
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# Returns a list of users for the current app
|
|
46
|
+
#
|
|
47
|
+
# @return {String[]} array of user uri without password
|
|
48
|
+
#
|
|
49
|
+
def list_users()
|
|
50
|
+
response = UERequest.fetch "user/list", {
|
|
51
|
+
user: @api_key,
|
|
52
|
+
pass: @api_secret
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
$logger.debug response[:users].inspect
|
|
56
|
+
users = response[:users].map { |user| user.symbolize_keys[:uri] }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
require "uuidtools"
|
|
2
|
+
class UEConnection
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
# @param {String} connection_name the connection identifier
|
|
7
|
+
# @param {String} connection_uri the connection uri
|
|
8
|
+
# @param {User} User the User instance of the user owning the connection
|
|
9
|
+
def initialize(connection_name, connection_uri, user)
|
|
10
|
+
@name = connection_name
|
|
11
|
+
@uri = connection_uri
|
|
12
|
+
@user = user
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def user
|
|
16
|
+
@user
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def refresh_connection()
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# Used for message parts
|
|
24
|
+
# @access private
|
|
25
|
+
# @returns {Number} random id
|
|
26
|
+
#
|
|
27
|
+
def self.generate_unique_id()
|
|
28
|
+
UUIDTools::UUID.timestamp_create.to_s
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# Builds the API message parameter from passed options
|
|
34
|
+
#
|
|
35
|
+
# @access private
|
|
36
|
+
# @param {Object} message_options options for message
|
|
37
|
+
# @param {Array} message_options.receivers channels receiving the message
|
|
38
|
+
# @param {String} message_options.receivers.name channel name (Me | Page)
|
|
39
|
+
# @param {String} message_options.receivers.id in case of Page, this is the page id
|
|
40
|
+
# @param {String} message_options.message.subject message subject
|
|
41
|
+
# @param {Array} message_options.message.body message body
|
|
42
|
+
# @param {Array} message_options.message.image image uri
|
|
43
|
+
# @param {Array} message_options.message.link message link
|
|
44
|
+
# @param {Array} message_options.message.link.uri message link uri
|
|
45
|
+
# @param {Array} message_options.message.link.description message link description
|
|
46
|
+
# @param {Array} message_options.message.link.title message link title
|
|
47
|
+
# @returns {Boolean}
|
|
48
|
+
#
|
|
49
|
+
def build_message_query(message_options)
|
|
50
|
+
throw :RECEIVERS_AND_MESSAGE_REQUIRED if !message_options.key?(:receivers) || !message_options.key?(:message)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
default_content_type = "binary";
|
|
54
|
+
params = message_options
|
|
55
|
+
queryObject = {}
|
|
56
|
+
|
|
57
|
+
#Formulate Receivers
|
|
58
|
+
params[:receivers] = params[:receivers].map { |receiver|
|
|
59
|
+
if receiver[:name ] && receiver[:name].downcase == "me"
|
|
60
|
+
{
|
|
61
|
+
name:"Me",
|
|
62
|
+
address:"test.test",
|
|
63
|
+
Connector: @name
|
|
64
|
+
}
|
|
65
|
+
elsif receiver[:name] && receiver[:name].downcase == "page"
|
|
66
|
+
{
|
|
67
|
+
name:"Page",
|
|
68
|
+
address: receiver[:id],
|
|
69
|
+
Connector: @name
|
|
70
|
+
}
|
|
71
|
+
end
|
|
72
|
+
}
|
|
73
|
+
queryObject[:receivers] = params[:receivers];
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
#Formulate Message Parts
|
|
77
|
+
queryObject[:parts] = [];
|
|
78
|
+
if params[:message].key?(:body)
|
|
79
|
+
queryObject[:parts].push({
|
|
80
|
+
id: UEConnection.generate_unique_id,
|
|
81
|
+
contentType: default_content_type,
|
|
82
|
+
type: "body",
|
|
83
|
+
data: params[:message][:body],
|
|
84
|
+
})
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#Image Part
|
|
88
|
+
if params[:message].key?(:image)
|
|
89
|
+
queryObject[:parts].push({
|
|
90
|
+
id: UEConnection.generate_unique_id,
|
|
91
|
+
contentType: default_content_type,
|
|
92
|
+
type: "image_link",
|
|
93
|
+
data: params[:message][:image]
|
|
94
|
+
})
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
#Link Part
|
|
99
|
+
if params[:message].key?(:link)
|
|
100
|
+
if params[:message][:link][:uri]
|
|
101
|
+
queryObject[:parts].push({
|
|
102
|
+
id: UEConnection.generate_unique_id,
|
|
103
|
+
contentType: default_content_type,
|
|
104
|
+
type: "link",
|
|
105
|
+
data: params[:message][:link][:uri]
|
|
106
|
+
});
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
if params[:message][:link][:description]
|
|
110
|
+
queryObject[:parts].push({
|
|
111
|
+
|
|
112
|
+
id: UEConnection.generate_unique_id,
|
|
113
|
+
contentType: default_content_type,
|
|
114
|
+
type: "link_description",
|
|
115
|
+
data: params[:message][:link][:description]
|
|
116
|
+
})
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
if params[:message][:link][:title]
|
|
120
|
+
queryObject[:parts].push({
|
|
121
|
+
id: UEConnection.generate_unique_id,
|
|
122
|
+
contentType: default_content_type,
|
|
123
|
+
type: "link_title",
|
|
124
|
+
data: params[:message][:link][:title]
|
|
125
|
+
})
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
#Subject
|
|
131
|
+
if params[:message][:subject]
|
|
132
|
+
queryObject[:subject ]= params[:message][:subject];
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
$logger.info(queryObject);
|
|
137
|
+
return queryObject;
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
##
|
|
145
|
+
# Sends a message to service using a connector. A message can have multiple parts each with a different type.
|
|
146
|
+
# eg: One can send a message with 2 parts (image_link, body) to send a message with an image and text
|
|
147
|
+
#
|
|
148
|
+
# @param {Object} message_options options for message
|
|
149
|
+
# @param {Array} message_options.receivers channels receiving the message
|
|
150
|
+
# @param {String} message_options.receivers.name channel name (Me | Page)
|
|
151
|
+
# @param {String} message_options.receivers.id in case of Page, this is the page id
|
|
152
|
+
# @param {String} message_options.message.subject message subject
|
|
153
|
+
# @param {Array} message_options.message.body message body
|
|
154
|
+
# @param {Array} message_options.message.image image uri
|
|
155
|
+
# @param {Array} message_options.message.link message link
|
|
156
|
+
# @param {Array} message_options.message.link.uri message link uri
|
|
157
|
+
# @param {Array} message_options.message.link.description message link description
|
|
158
|
+
# @param {Array} message_options.message.link.title message link title
|
|
159
|
+
#
|
|
160
|
+
# @returns {Promise}
|
|
161
|
+
#
|
|
162
|
+
def send_message(message_options)
|
|
163
|
+
response = UERequest.fetch "message/send", {
|
|
164
|
+
user: @user.user_key,
|
|
165
|
+
pass: @user.user_secret,
|
|
166
|
+
form:{
|
|
167
|
+
message: self.build_message_query(message_options)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
response[:URIs] rescue []
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require "facets"
|
|
2
|
+
class UEUser
|
|
3
|
+
|
|
4
|
+
#URI: user://e9759590-54ef-4cd3-a01c-cb2241ddd812:1aee1a25-e0c4-4036-a8fd-4d41adc8611b@
|
|
5
|
+
#COMB: key,secret
|
|
6
|
+
## Constructor
|
|
7
|
+
# @desc The constructor can be in one of two forms; URI form or key,secret form. eg new User(key,secret) or new User(uri)
|
|
8
|
+
# @param {String} uri the user uri string
|
|
9
|
+
# @param {String} key the user key
|
|
10
|
+
# @param {String} secret the user secret
|
|
11
|
+
def initialize(uri_or_key, secret=nil)
|
|
12
|
+
if secret then
|
|
13
|
+
# key,secret format
|
|
14
|
+
@user_key, @user_secret = [uri_or_key, secret]
|
|
15
|
+
@uri = "user://#{@user_key}:#{@user_secret}@"
|
|
16
|
+
else
|
|
17
|
+
# uri format
|
|
18
|
+
@uri = uri_or_key
|
|
19
|
+
@user_key, @user_secret = uri_or_key.match(/user:\/\/(.+):(.+)@/).captures
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
#Getters
|
|
25
|
+
def uri
|
|
26
|
+
@uri
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def user_key
|
|
30
|
+
@user_key
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def user_secret
|
|
34
|
+
@user_secret
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
###
|
|
38
|
+
# Adds a connection to the current user
|
|
39
|
+
#
|
|
40
|
+
# @param {String} connection_name the connection identifier. Unique per connection
|
|
41
|
+
# @param {String} service_scheme a string representing a connector service (service scheme)
|
|
42
|
+
# @param {String} service_access_token service access token acquired from the provider (fb token, twitter token..etc)
|
|
43
|
+
#
|
|
44
|
+
# @return {UEConnection} connection the created connection
|
|
45
|
+
#/
|
|
46
|
+
def add_connection(connection_name, service_scheme, service_access_token)
|
|
47
|
+
|
|
48
|
+
response = UERequest.fetch "connection/add",{
|
|
49
|
+
user: @user_key,
|
|
50
|
+
pass: @user_secret,
|
|
51
|
+
form: {
|
|
52
|
+
uri: "#{service_scheme}://#{service_access_token}@#{service_scheme}.com",
|
|
53
|
+
name: connection_name
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
(response[:status] == 200) || response
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# List connections for current user
|
|
64
|
+
# @return {Connection>} List of Connection objects representing the user connections
|
|
65
|
+
def list_connections()
|
|
66
|
+
|
|
67
|
+
response = UERequest.fetch "connection/list",{
|
|
68
|
+
user: @user_key,
|
|
69
|
+
pass: @user_secret,
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if !response[:connections]
|
|
73
|
+
return []
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
connections = []
|
|
77
|
+
response[:connections].each do |cname,v|
|
|
78
|
+
connections.push(UEConnection.new cname, response[:connections][cname.to_sym][:uri], self)
|
|
79
|
+
end
|
|
80
|
+
connections
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# Removes a connection from a user
|
|
88
|
+
#
|
|
89
|
+
# @param {String} connection_name the connection identifier
|
|
90
|
+
# @return {Boolean} Success/Fail
|
|
91
|
+
#
|
|
92
|
+
def remove_connection(connection_name)
|
|
93
|
+
response = UERequest.fetch "connection/remove",{
|
|
94
|
+
user: @user_key,
|
|
95
|
+
pass: @user_secret,
|
|
96
|
+
form:{
|
|
97
|
+
name: connection_name
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
response[:status] == 200
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# Tests a connection to a connector
|
|
109
|
+
#
|
|
110
|
+
# @param {String} serviceUri service uri. eg: facebook://accesstoken@facebook.com
|
|
111
|
+
# @return {Boolean} Success/Fail
|
|
112
|
+
#
|
|
113
|
+
def test_connection(service_uri)
|
|
114
|
+
response = UERequest.fetch "connection/test",{
|
|
115
|
+
user: @user_key,
|
|
116
|
+
pass: @user_secret,
|
|
117
|
+
form:{
|
|
118
|
+
uri: service_uri
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
response[:Status][:""][:status] == 200
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
end
|
data/lib/ue-ruby-sdk.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'logging'
|
|
2
|
+
|
|
3
|
+
Logging.color_scheme( 'bright',
|
|
4
|
+
:levels => {
|
|
5
|
+
:info => :green,
|
|
6
|
+
:warn => :yellow,
|
|
7
|
+
:error => :red,
|
|
8
|
+
:fatal => [:white, :on_red]
|
|
9
|
+
},
|
|
10
|
+
:date => :blue,
|
|
11
|
+
:logger => :cyan,
|
|
12
|
+
:message => :magenta
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
Logging.appenders.stdout(
|
|
16
|
+
'stdout',
|
|
17
|
+
:layout => Logging.layouts.pattern(
|
|
18
|
+
:pattern => '[%d] %-5l %c: %m\n',
|
|
19
|
+
:color_scheme => 'bright'
|
|
20
|
+
)
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
$logger = Logging.logger['UE']
|
|
24
|
+
$logger.add_appenders 'stdout'
|
|
25
|
+
$logger.level = :error
|
|
26
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require "rest-client"
|
|
3
|
+
require "facets"
|
|
4
|
+
|
|
5
|
+
class UERequest
|
|
6
|
+
def self.fetch(resource, request_options)
|
|
7
|
+
form = request_options[:form] || {}
|
|
8
|
+
user = request_options[:user]
|
|
9
|
+
pass = request_options[:pass]
|
|
10
|
+
|
|
11
|
+
$logger.debug form.inspect
|
|
12
|
+
#Inject user:pass into base url
|
|
13
|
+
url_prefix = Constants.base_url.gsub /https?:\/\//, "https://#{user}:#{pass}@"
|
|
14
|
+
#Concat base url with resource
|
|
15
|
+
url = url_prefix + resource
|
|
16
|
+
$logger.debug "http => #{url}"
|
|
17
|
+
|
|
18
|
+
response = RestClient.post url, form.to_json
|
|
19
|
+
|
|
20
|
+
$logger.debug "resp => #{JSON.parse(response).deep_symbolize_keys}"
|
|
21
|
+
JSON.parse(response).deep_symbolize_keys rescue response
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#Object
|
|
2
|
+
class Object
|
|
3
|
+
def deep_symbolize_keys
|
|
4
|
+
self
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class Hash
|
|
9
|
+
def deep_symbolize_keys
|
|
10
|
+
symbolize_keys.tap { |h| h.each { |k, v| h[k] = v.deep_symbolize_keys } }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
#Array
|
|
16
|
+
class Array
|
|
17
|
+
def deep_symbolize_keys
|
|
18
|
+
map(&:deep_symbolize_keys)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
data/test/helper.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'simplecov'
|
|
2
|
+
|
|
3
|
+
module SimpleCov::Configuration
|
|
4
|
+
def clean_filters
|
|
5
|
+
@filters = []
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
SimpleCov.configure do
|
|
10
|
+
clean_filters
|
|
11
|
+
load_adapter 'test_frameworks'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
ENV["COVERAGE"] && SimpleCov.start do
|
|
15
|
+
add_filter "/.rvm/"
|
|
16
|
+
end
|
|
17
|
+
require 'rubygems'
|
|
18
|
+
require 'bundler'
|
|
19
|
+
begin
|
|
20
|
+
Bundler.setup(:default, :development)
|
|
21
|
+
rescue Bundler::BundlerError => e
|
|
22
|
+
$stderr.puts e.message
|
|
23
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
|
24
|
+
exit e.status_code
|
|
25
|
+
end
|
|
26
|
+
require 'test/unit'
|
|
27
|
+
require 'shoulda'
|
|
28
|
+
|
|
29
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
30
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
31
|
+
require 'ruby-unificationengine'
|
|
32
|
+
|
|
33
|
+
class Test::Unit::TestCase
|
|
34
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ue-ruby-sdk
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Hossam Saraya
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-02-24 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: shoulda
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rdoc
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '3.12'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '3.12'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: bundler
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '1.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '1.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: jeweler
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 2.0.1
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 2.0.1
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: simplecov
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: logging
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: pry
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: pry-byebug
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ">="
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - ">="
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
125
|
+
description: UnificationEngine Ruby SDK as a wrapper over UnificationEngine API
|
|
126
|
+
email: hossam.saraya@gmail.com
|
|
127
|
+
executables: []
|
|
128
|
+
extensions: []
|
|
129
|
+
extra_rdoc_files:
|
|
130
|
+
- LICENSE.txt
|
|
131
|
+
- README.md
|
|
132
|
+
files:
|
|
133
|
+
- ".document"
|
|
134
|
+
- ".versions.conf"
|
|
135
|
+
- Gemfile
|
|
136
|
+
- Gemfile.lock
|
|
137
|
+
- LICENSE.txt
|
|
138
|
+
- README.md
|
|
139
|
+
- Rakefile
|
|
140
|
+
- VERSION
|
|
141
|
+
- example/example1.rb
|
|
142
|
+
- lib/config/Constants.rb
|
|
143
|
+
- lib/models/UEApp.rb
|
|
144
|
+
- lib/models/UEConnection.rb
|
|
145
|
+
- lib/models/UEUser.rb
|
|
146
|
+
- lib/ue-ruby-sdk.rb
|
|
147
|
+
- lib/utilities/UELogger.rb
|
|
148
|
+
- lib/utilities/UERequest.rb
|
|
149
|
+
- lib/utilities/extensions.rb
|
|
150
|
+
- test/helper.rb
|
|
151
|
+
- test/test_ruby-unificationengine.rb
|
|
152
|
+
homepage: https://github.com/unifiedinbox/ue-ruby-sdk
|
|
153
|
+
licenses:
|
|
154
|
+
- MIT
|
|
155
|
+
metadata: {}
|
|
156
|
+
post_install_message:
|
|
157
|
+
rdoc_options: []
|
|
158
|
+
require_paths:
|
|
159
|
+
- lib
|
|
160
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
|
+
requirements:
|
|
162
|
+
- - ">="
|
|
163
|
+
- !ruby/object:Gem::Version
|
|
164
|
+
version: '0'
|
|
165
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
|
+
requirements:
|
|
167
|
+
- - ">="
|
|
168
|
+
- !ruby/object:Gem::Version
|
|
169
|
+
version: '0'
|
|
170
|
+
requirements: []
|
|
171
|
+
rubyforge_project:
|
|
172
|
+
rubygems_version: 2.2.2
|
|
173
|
+
signing_key:
|
|
174
|
+
specification_version: 4
|
|
175
|
+
summary: UnificationEngine Ruby Client SDK
|
|
176
|
+
test_files: []
|