ringcentral-sdk 0.1.0 → 0.2.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 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