ringcentral-sdk 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e43034b49bfa6d2d866165e36e061a6ef701d506
4
- data.tar.gz: d6607d5e22320e2461f74a0448f018806d7b4cb3
3
+ metadata.gz: 22713ecf76dc139e0a97fc0947a1e81c8782d3ae
4
+ data.tar.gz: 9d3a34d9a689633fcfa6116eda4ce9545657da73
5
5
  SHA512:
6
- metadata.gz: 8d413033eace79af29bf4ecb81548cd540fd48fd0e93cbb0813a9dbc8af00ce2c56a4276a3b81bd89183ef984a757f7fa88b7a16b05df9d6cce40bd25f714dee
7
- data.tar.gz: c27d5e4a229e3e3988a1065661207595a9c59c411f1d42b4771deeaff79765e940e141668a7e91a58444da8894eaf7ebe6cf20e4bae3bc9cf838c465ab4a6d67
6
+ metadata.gz: 4518d6cc3bf373040f63960cedab921b6e13a776e6ef41b9121c3d0c2b2a04f046f821730ef07445cabfc488306bfb3c7b9252086ab32a5c27e87b291d9dc60e
7
+ data.tar.gz: bf884572171894c8df910610e0f45ea762155970d342e74a5cbdb164f94ed8756e42f108443e512b47bc7a92309b8b9a01acf3de9063c0d821bfd75d072e152f
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  ## Installation
5
5
 
6
- Add `gem 'ringcentral-sdk'` to `Gemfile`.
6
+ Add `gem 'ringcentral-sdk'` to `Gemfile` and run `bundle install`.
7
7
 
8
8
 
9
9
  ## Documentation
@@ -31,6 +31,8 @@ password=password
31
31
  receiver=number-to-receiver-sms
32
32
  ```
33
33
 
34
+ Run `rake test`
35
+
34
36
 
35
37
  ## License
36
38
 
@@ -39,7 +41,6 @@ MIT
39
41
 
40
42
  ## Todo
41
43
 
42
- - unit tests
43
44
  - Travis CI
44
45
  - code coverage
45
- - publish to https://rubygems.org
46
+ - PubNub subscription
data/lib/ringcentral.rb CHANGED
@@ -1,5 +1,140 @@
1
+ require 'base64'
2
+ require 'addressable/uri'
3
+ require 'subscription'
4
+ require 'rest-client'
5
+ require 'json'
6
+
1
7
  class RingCentral
2
- def self.hi
3
- 'hello'
8
+ def self.SANDBOX_SERVER
9
+ 'https://platform.devtest.ringcentral.com'
10
+ end
11
+
12
+ def self.PRODUCTION_SERVER
13
+ 'https://platform.ringcentral.com'
14
+ end
15
+
16
+ attr_reader :app_key, :app_secret, :server
17
+ attr_accessor :auto_refresh
18
+
19
+ def initialize(app_key, app_secret, server)
20
+ @app_key = app_key
21
+ @app_secret = app_secret
22
+ @server = server
23
+ @auto_refresh = true
24
+ @token = nil
25
+ end
26
+
27
+ def token
28
+ @token
29
+ end
30
+
31
+ def token=(value)
32
+ @token = value
33
+ if @timer != nil
34
+ @timer.shutdown
35
+ @timer = nil
36
+ end
37
+ if @auto_refresh && value != nil
38
+ @timer = Concurrent::TimerTask.new(execution_interval: value.expires_in - 120, timeout_interval: 60) do
39
+ refresh
40
+ end
41
+ @timer.execute
42
+ end
43
+ end
44
+
45
+ def authorize(username: nil, extension: nil, password: nil, auth_code: nil, redirect_uri: nil)
46
+ if auth_code != nil
47
+ payload = {
48
+ grant_type: 'authorization_code',
49
+ code: auth_code,
50
+ redirect_uri: redirect_uri,
51
+ }
52
+ else
53
+ payload = {
54
+ grant_type: 'password',
55
+ username: username,
56
+ extension: extension,
57
+ password: password,
58
+ }
59
+ end
60
+ @token = nil
61
+ r = post('/restapi/oauth/token', payload: payload)
62
+ @token = JSON.parse(r.body)
63
+ end
64
+
65
+ def refresh
66
+ return if @token == nil
67
+ payload = {
68
+ grant_type: 'refresh_token',
69
+ refresh_token: @token['refresh_token']
70
+ }
71
+ @token = nil
72
+ r = post('/restapi/oauth/token', payload: payload)
73
+ @token = JSON.parse(r.body)
74
+ end
75
+
76
+ def revoke
77
+ return if @token == nil
78
+ payload = {
79
+ token: @token['access_token']
80
+ }
81
+ @token = nil
82
+ post('/restapi/oauth/revoke', payload: payload)
83
+ end
84
+
85
+ def authorize_uri(redirect_uri, state = '')
86
+ uri = Addressable::URI.parse(@server) + '/restapi/oauth/authorize'
87
+ uri.query_values = {
88
+ response_type: 'code',
89
+ state: state,
90
+ redirect_uri: redirect_uri,
91
+ client_id: @app_secret
92
+ }
93
+ uri.to_s
94
+ end
95
+
96
+ def get(endpoint, params = nil)
97
+ request(:get, endpoint, params: params)
98
+ end
99
+
100
+ def post(endpoint, payload: nil, params: nil, files: nil)
101
+ request(:post, endpoint, payload: payload, params: params, files: files)
102
+ end
103
+
104
+ def put(endpoint, payload: nil, params: nil, files: nil)
105
+ request(:put, endpoint, payload: payload, params: params, files: files)
106
+ end
107
+
108
+ def delete(endpoint, params = nil)
109
+ request(:delete, endpoint, params: params)
110
+ end
111
+
112
+ def subscription(event_filters, callback)
113
+ Subscription.new(event_filters, callback)
114
+ end
115
+
116
+ private
117
+
118
+ def basic_key
119
+ Base64.encode64("#{@app_key}:#{@app_secret}").gsub(/\s/, '')
120
+ end
121
+
122
+ def autorization_header
123
+ return "Bearer #{@token['access_token']}" if @token != nil
124
+ return "Basic #{basic_key}"
125
+ end
126
+
127
+ def request(method, endpoint, params: nil, payload: nil, files: nil)
128
+ url = (Addressable::URI.parse(@server) + endpoint).to_s
129
+ user_agent_header = "ringcentral/ringcentral-ruby Ruby #{RUBY_VERSION} #{RUBY_PLATFORM}"
130
+ headers = {
131
+ 'Authorization': autorization_header,
132
+ 'RC-User-Agent': user_agent_header
133
+ }
134
+ if payload != nil && @token != nil
135
+ headers['Content-Type'] = 'application/json'
136
+ payload = payload.to_json
137
+ end
138
+ RestClient::Request.execute(method: method.to_sym, url: url, params: params, payload: payload, headers: headers, files: files)
4
139
  end
5
140
  end
@@ -0,0 +1,2 @@
1
+ class Subscription
2
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'ringcentral-sdk'
3
- gem.version = '0.1.0'
3
+ gem.version = '0.2.0'
4
4
  gem.authors = ['Tyler Liu']
5
5
  gem.email = ['tyler.liu@ringcentral.com']
6
6
  gem.description = 'Ruby SDK for you to access RingCentral platform API.'
@@ -13,5 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.files += Dir['lib/**/*.rb']
14
14
  gem.test_files = Dir['test/**/*.rb']
15
15
 
16
- gem.add_dependency('rest-client', '>= 2.0.2')
16
+ gem.add_dependency('rest-client', '~> 2.0', '>= 2.0.2')
17
+ gem.add_dependency('addressable', '~> 2.5', '>= 2.5.2')
18
+ gem.add_dependency('concurrent-ruby', '~> 1.0', '>= 1.0.2')
17
19
  end
@@ -1,8 +1,81 @@
1
1
  require 'test/unit'
2
2
  require 'ringcentral'
3
+ require 'dotenv'
3
4
 
4
5
  class RingCentralTest < Test::Unit::TestCase
5
- def test_hello
6
- assert_equal "hello", RingCentral.hi
6
+ def test_class_variables
7
+ assert_equal 'https://platform.devtest.ringcentral.com', RingCentral.SANDBOX_SERVER
8
+ assert_equal 'https://platform.ringcentral.com', RingCentral.PRODUCTION_SERVER
9
+ end
10
+
11
+ def test_initializer
12
+ rc = RingCentral.new('app_key', 'app_secret', RingCentral.SANDBOX_SERVER)
13
+ assert_equal 'app_key', rc.app_key
14
+ assert_equal 'app_secret', rc.app_secret
15
+ assert_equal 'https://platform.devtest.ringcentral.com', rc.server
16
+ assert_equal true, rc.auto_refresh
17
+ end
18
+
19
+ def test_authorize_uri
20
+ rc = RingCentral.new('app_key', 'app_secret', RingCentral.SANDBOX_SERVER)
21
+ assert_equal RingCentral.SANDBOX_SERVER + '/restapi/oauth/authorize?client_id=app_secret&redirect_uri=https%3A%2F%2Fexample.com&response_type=code&state=mystate', rc.authorize_uri('https://example.com', 'mystate')
22
+ end
23
+
24
+ def test_password_flow
25
+ Dotenv.load
26
+ rc = RingCentral.new(ENV['appKey'], ENV['appSecret'], ENV['server'])
27
+ assert_equal nil, rc.token
28
+
29
+ # create token
30
+ rc.authorize(username: ENV['username'], extension: ENV['extension'], password: ENV['password'])
31
+ assert_not_equal nil, rc.token
32
+
33
+ # refresh token
34
+ rc.refresh
35
+ assert_not_equal nil, rc.token
36
+
37
+ # revoke token
38
+ rc.revoke
39
+ assert_equal nil, rc.token
40
+ end
41
+
42
+ def test_http_methods
43
+ Dotenv.load
44
+ rc = RingCentral.new(ENV['appKey'], ENV['appSecret'], ENV['server'])
45
+ rc.authorize(username: ENV['username'], extension: ENV['extension'], password: ENV['password'])
46
+
47
+ # get
48
+ r = rc.get('/restapi/v1.0/account/~/extension/~')
49
+ assert_not_equal nil, r
50
+ assert_equal '101', JSON.parse(r.body)['extensionNumber']
51
+
52
+ # post
53
+ r = rc.post('/restapi/v1.0/account/~/extension/~/sms', payload: {
54
+ to: [{phoneNumber: ENV['receiver']}],
55
+ from: {phoneNumber: ENV['username']},
56
+ text: 'Hello world'
57
+ })
58
+ assert_not_equal nil, r
59
+ message = JSON.parse(r.body)
60
+ assert_equal 'SMS', message['type']
61
+ messageUrl = "/restapi/v1.0/account/~/extension/~/message-store/#{message['id']}"
62
+
63
+ # put
64
+ r = rc.put(messageUrl, payload: { readStatus: 'Unread' })
65
+ assert_not_equal nil, r
66
+ message = JSON.parse(r.body)
67
+ assert_equal 'Unread', message['readStatus']
68
+ r = rc.put(messageUrl, payload: { readStatus: 'Read' })
69
+ assert_not_equal nil, r
70
+ message = JSON.parse(r.body)
71
+ assert_equal 'Read', message['readStatus']
72
+
73
+ # delete
74
+ r = rc.delete(messageUrl)
75
+ assert_not_equal nil, r
76
+ r = rc.get(messageUrl)
77
+ assert_not_equal nil, r
78
+ message = JSON.parse(r.body)
79
+ assert_equal 'Deleted', message['availability']
7
80
  end
8
81
  end
metadata CHANGED
@@ -1,19 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ringcentral-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Liu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-19 00:00:00.000000000 Z
11
+ date: 2017-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
17
20
  - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 2.0.2
@@ -21,9 +24,52 @@ dependencies:
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
24
30
  - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: 2.0.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: addressable
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.5'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.5.2
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.5'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.5.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: concurrent-ruby
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.2
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.0.2
27
73
  description: Ruby SDK for you to access RingCentral platform API.
28
74
  email:
29
75
  - tyler.liu@ringcentral.com
@@ -34,6 +80,7 @@ files:
34
80
  - README.md
35
81
  - Rakefile
36
82
  - lib/ringcentral.rb
83
+ - lib/subscription.rb
37
84
  - ringcentral-sdk.gemspec
38
85
  - test/test_ringcentral.rb
39
86
  homepage: https://github.com/tylerlong/ringcentral-ruby