ucpaas 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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: