ucpaas 0.1.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e22b8e5250ff338b3268cbf31359cff77deb5249
4
+ data.tar.gz: 67c205ef75433063346db9c393d48ed26721f870
5
+ SHA512:
6
+ metadata.gz: dfd9c1bb12f3bff3cf738e48defeccee5c4456771c4a1571eabb603ed02d1bae4dcff7b8f0e5f4b55844e3384f135313b1f0a9a12a2e1908140558f95bf173fc
7
+ data.tar.gz: bf4c8ce8dcdff4b77b3fde6f4de71d931d27aab45971570e50a76db6ea3802f00e0093b0885f238868cf90cf6537cf6712b850362ef4bf3565a8691520bed0dd
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+ pkg
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format doc
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - ruby-head
4
+ - 2.1.0
5
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'http://ruby.taobao.org'
2
+ # Specify your gem's dependencies in ucpaas.gemspec
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'guard'
7
+ gem 'guard-rspec'
8
+ gem 'rspec-its'
9
+ end
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard 'rspec', cmd: "bundle exec rspec" do
2
+ # watch /lib/ files
3
+ watch(%r{^lib/(.+).rb$}) do |m|
4
+ "spec/#{m[1]}_spec.rb"
5
+ end
6
+
7
+ # watch /spec/ files
8
+ watch(%r{^spec/(.+).rb$}) do |m|
9
+ "spec/#{m[1]}.rb"
10
+ end
11
+ end
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # 云之讯 UCPAAS Ruby REST API Client
2
+
3
+ [![Build Status](https://travis-ci.org/lazing/ucpaas-rb.svg)](https://travis-ci.org/lazing/ucpaas-rb)
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
@@ -0,0 +1,18 @@
1
+ module Ucpaas
2
+ # call client api
3
+ module Call
4
+ def dull_call(app_id, from_number, to_number, options = {})
5
+ client = find_or_create_client(app_id, from_number)
6
+ client_number = client['clientNumber']
7
+ data = {
8
+ appId: app_id,
9
+ fromClient: client_number,
10
+ to: to_number
11
+ }.merge(options)
12
+ response = post('/Calls/callBack', data)
13
+ response['resp']['callback']
14
+ end
15
+
16
+ private
17
+ end
18
+ end
@@ -0,0 +1,117 @@
1
+ require 'faraday'
2
+ require 'logger'
3
+ require 'base64'
4
+ require 'ucpaas/manage'
5
+ require 'ucpaas/sms'
6
+ require 'ucpaas/call'
7
+
8
+ # Ucpaas
9
+ module Ucpaas
10
+ # Ucpaas Error
11
+ class UcpaasError < RuntimeError; end
12
+ class AccountError < UcpaasError; end
13
+ class DevelopError < UcpaasError; end
14
+ class ApplicationError < UcpaasError; end
15
+ class CallError < UcpaasError; end
16
+ class SmsError < UcpaasError; end
17
+
18
+ ERRORS = {
19
+ '100' => AccountError,
20
+ '101' => DevelopError,
21
+ '102' => ApplicationError,
22
+ '103' => ApplicationError,
23
+ '104' => CallError,
24
+ '105' => SmsError
25
+ }
26
+
27
+ # client for ucpass service
28
+ class Client
29
+ include Sms
30
+ include Call
31
+ include Manage
32
+
33
+ ATTRIBUTES = %w(base_url sid token soft_version).freeze
34
+ attr_reader(*ATTRIBUTES)
35
+
36
+ attr_accessor :logger
37
+
38
+ def initialize(sid, token)
39
+ @sid, @token = sid, token
40
+ @base_url = 'https://api.ucpaas.com'
41
+ @soft_version = '2014-06-30'
42
+ @logger = Logger.new(STDOUT)
43
+ @logger.level = Logger::INFO
44
+ end
45
+
46
+ def get(origin, params = {})
47
+ logger.info { format('GET: %s %s', origin, params) }
48
+ resp = connection.get do |request|
49
+ time = formated_time
50
+ request.url path(origin), params.merge(sig: sign(time))
51
+ request.headers.merge!(headers(time))
52
+ end
53
+ handle(resp)
54
+ end
55
+
56
+ def post(origin, params)
57
+ logger.info { format('POST: %s %s', origin, params) }
58
+ resp = connection.post do |request|
59
+ time = formated_time
60
+ request.url path(origin), sig: sign(time)
61
+ request.headers.merge!(headers(time))
62
+ request.body = MultiJson.dump(params)
63
+ end
64
+ handle(resp)
65
+ end
66
+
67
+ def handle(resp)
68
+ logger.debug { resp }
69
+ fail UcpaasError, resp.status unless resp.status == 200
70
+ response = MultiJson.load(resp.body)
71
+ resp_code = response['resp']['respCode']
72
+ return response if resp_code == '000000'
73
+ handle_error(response)
74
+ end
75
+
76
+ def handle_error(response)
77
+ logger.error response
78
+ code = response['resp']['respCode']
79
+ fail ERRORS[code[0..2]], code
80
+ end
81
+
82
+ def path(origin)
83
+ format('%s/%s/Accounts/%s%s', base_url, soft_version, sid, origin)
84
+ end
85
+
86
+ def headers(time)
87
+ {
88
+ accept: 'application/json',
89
+ content_type: 'application/json;charset=utf-8;',
90
+ authorization: authorization(time)
91
+ }
92
+ end
93
+
94
+ def sign(time)
95
+ data = format('%s%s%s', sid, token, time)
96
+ Digest::MD5.hexdigest(data).upcase
97
+ end
98
+
99
+ def authorization(time)
100
+ Base64.strict_encode64(format('%s:%s', sid, time))
101
+ end
102
+
103
+ def formated_time
104
+ Time.now.getlocal('+08:00').strftime('%Y%m%d%H%M%S')
105
+ end
106
+
107
+ private
108
+
109
+ def connection
110
+ @connection ||= begin
111
+ Faraday.new do |faraday|
112
+ faraday.adapter Faraday.default_adapter
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,29 @@
1
+ module Ucpaas
2
+ # sms client api
3
+ module Manage
4
+ def find_or_create_client(app_id, mobile, options = {})
5
+ mob = mobile.gsub(/^\+?86/, '')
6
+ client_info = get('/ClientsByMobile', appId: app_id, mobile: mob)
7
+ return client_info['resp']['client'] if client_info['resp']['client']
8
+ params = {
9
+ appId: app_id,
10
+ clientType: 0,
11
+ mobile: mob
12
+ }.merge(options)
13
+ new_client = post('/Clients', params)
14
+ new_client['resp']['client']
15
+ end
16
+
17
+ def clients(app_id, start = 0, limit = 10)
18
+ params = {
19
+ client: {
20
+ appId: app_id,
21
+ start: start,
22
+ limit: limit
23
+ }
24
+ }
25
+ response = post('/clientList', params)
26
+ response['resp']['client']
27
+ end
28
+ end
29
+ end
data/lib/ucpaas/sms.rb ADDED
@@ -0,0 +1,16 @@
1
+ module Ucpaas
2
+ # sms client api
3
+ module Sms
4
+ def send_sms(app_id, tmp_id, mobile, *params)
5
+ data = {
6
+ templateSMS: {
7
+ appId: app_id,
8
+ templateId: tmp_id,
9
+ to: mobile,
10
+ param: params.map(&:to_s).join(',')
11
+ }
12
+ }
13
+ post '/Messages/templateSMS.json', data
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module Ucpaas
2
+ VERSION = '0.1.2'
3
+ end
data/lib/ucpaas.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'ucpaas/version'
2
+ require 'ucpaas/client'
3
+ require 'multi_json'
4
+
5
+ # ucpaas ruby api wrapper
6
+ module Ucpaas
7
+ end
@@ -0,0 +1,14 @@
1
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
2
+
3
+ require 'rubygems'
4
+ require "bundler"
5
+ require 'bundler/setup'
6
+
7
+ Bundler.require
8
+
9
+ require 'rspec/its'
10
+
11
+ require "faraday"
12
+ require "multi_json"
13
+
14
+ require 'webmock/rspec'
@@ -0,0 +1,28 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ RSpec.describe Ucpaas::Call do
4
+ let(:target_class) do
5
+ Class.new do
6
+ include Ucpaas::Call
7
+ end
8
+ end
9
+
10
+ subject { target_class.new }
11
+
12
+ it :dull_call do
13
+ client_resp = {
14
+ 'clientNumber' => '1111'
15
+ }
16
+ call_resp = {
17
+ 'resp' => {
18
+ 'callback' => {
19
+ 'callId' => '1111'
20
+ }
21
+ }
22
+ }
23
+ expect(subject).to receive(:find_or_create_client).and_return(client_resp)
24
+ expect(subject).to receive(:post).and_return(call_resp)
25
+ result = subject.dull_call('appid', 'from', 'to')
26
+ expect(result).to have_key('callId')
27
+ end
28
+ end
@@ -0,0 +1,59 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ RSpec.describe Ucpaas::Client do
4
+ subject { Ucpaas::Client.new('APPID', 'APPSECRET') }
5
+
6
+ before do
7
+ subject.logger.level = Logger::DEBUG
8
+ end
9
+
10
+ context :initialize do
11
+ let(:time) { Time.now.strftime('%Y%m%d%H%M%S') }
12
+
13
+ it :path do
14
+ expect(subject.path('/root/')).to match(/ucpaas.+root/)
15
+ end
16
+
17
+ its :formated_time do
18
+ is_expected.to match(/2015/)
19
+ end
20
+
21
+ it :headers do
22
+ headers = subject.headers(time)
23
+ expect(headers).to have_key(:authorization)
24
+ end
25
+
26
+ it :sign do
27
+ sign = subject.sign(time)
28
+ expect(sign).not_to be_nil
29
+ end
30
+ end
31
+
32
+ context :request do
33
+ it :get do
34
+ stub_request(:get, /api\.ucpaas\.com.*/)
35
+ .with { |req| req.headers.key?('Authorization') }
36
+ .to_return(body: '{"resp": {"respCode": "000000"}}')
37
+ subject.get '/'
38
+ end
39
+
40
+ it :post do
41
+ stub_request(:post, /api\.ucpaas\.com.*/)
42
+ .with { |req| req.headers.key?('Authorization') }
43
+ .to_return(body: '{"resp": {"respCode": "000000"}}')
44
+ subject.post '/', '{appId: 1}'
45
+ end
46
+ end
47
+
48
+ context :handle_error do
49
+ it :develop do
50
+ response = {
51
+ 'resp' => {
52
+ 'respCode' => '101001'
53
+ }
54
+ }
55
+ expect { subject.handle_error(response) }
56
+ .to(raise_error(Ucpaas::DevelopError))
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ RSpec.describe Ucpaas::Manage do
4
+ let(:target_class) do
5
+ Class.new do
6
+ include Ucpaas::Manage
7
+ end
8
+ end
9
+
10
+ subject { target_class.new }
11
+
12
+ it :find_or_create_client do
13
+ get_resp = {
14
+ 'resp' => {
15
+ 'respCode' => '000000',
16
+ 'client' => nil
17
+ }
18
+ }
19
+ post_resp = {
20
+ 'resp' => {
21
+ 'respCode' => '000000',
22
+ 'client' => { 'clientNumber' => '11111' }
23
+ }
24
+ }
25
+ expect(subject).to receive(:get).and_return(get_resp)
26
+ expect(subject).to receive(:post).and_return(post_resp)
27
+ client = subject.find_or_create_client 'appid', '+8618888888888'
28
+ expect(client).to have_key('clientNumber')
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ RSpec.describe Ucpaas::Sms do
4
+ let(:target_class) do
5
+ Class.new do
6
+ include Ucpaas::Sms
7
+ end
8
+ end
9
+ subject { target_class.new }
10
+
11
+ it :send_sms do
12
+ expect(subject).to receive(:post)
13
+ subject.send_sms('appid', 'tmpid', 'mobile', '1', '2')
14
+ end
15
+ end
data/ucpaas.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ucpaas/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ucpaas"
8
+ spec.version = Ucpaas::VERSION
9
+ spec.authors = ["Ryan Wong"]
10
+ spec.email = ["lazing@gmail.com"]
11
+ spec.summary = %q{UCPAAS API wrapper}
12
+ spec.homepage = "https://github.com/lazing/ucpaas-rb"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency "faraday", "~> 0.9"
21
+ spec.add_runtime_dependency "multi_json", "~> 1.2"
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "pry"
25
+ spec.add_development_dependency "rspec", "~> 3.0"
26
+ spec.add_development_dependency "webmock", "~> 1.18"
27
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ucpaas
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Wong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-09-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
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: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.18'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.18'
111
+ description:
112
+ email:
113
+ - lazing@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - Guardfile
123
+ - README.md
124
+ - Rakefile
125
+ - lib/ucpaas.rb
126
+ - lib/ucpaas/call.rb
127
+ - lib/ucpaas/client.rb
128
+ - lib/ucpaas/manage.rb
129
+ - lib/ucpaas/sms.rb
130
+ - lib/ucpaas/version.rb
131
+ - spec/spec_helper.rb
132
+ - spec/ucpaas/call_spec.rb
133
+ - spec/ucpaas/client_spec.rb
134
+ - spec/ucpaas/manage_spec.rb
135
+ - spec/ucpaas/sms_spec.rb
136
+ - ucpaas.gemspec
137
+ homepage: https://github.com/lazing/ucpaas-rb
138
+ licenses:
139
+ - MIT
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 2.2.2
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: UCPAAS API wrapper
161
+ test_files:
162
+ - spec/spec_helper.rb
163
+ - spec/ucpaas/call_spec.rb
164
+ - spec/ucpaas/client_spec.rb
165
+ - spec/ucpaas/manage_spec.rb
166
+ - spec/ucpaas/sms_spec.rb
167
+ has_rdoc: