zensend 0.0.1
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/lib/zensend.rb +5 -0
- data/lib/zensend/client.rb +125 -0
- data/lib/zensend/operator_lookup_response.rb +15 -0
- data/lib/zensend/sms_response.rb +16 -0
- data/lib/zensend/version.rb +3 -0
- data/lib/zensend/zensend_exception.rb +13 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 763343e142097259cb183048822aee92ae368ac0
|
4
|
+
data.tar.gz: ce842952d1c2b3bc5a1db29bf98fcbdfad1b2f2a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 699fe7f0819a9716a4a12250b742124fb2b624075979acd5373d6923db02e861620c83a34d403febb0873f0447c7e8f1fdd26c95b45f6c34f6e4b4972932e6c0
|
7
|
+
data.tar.gz: ef74cefbc3fe51f3e4852e6b09e00b197f36fd279599ba7606e66a28d438d604efdeeb2cf0e845079d56cf2ec482c9bab35b472fa260387be170cabf5fcb5975
|
data/lib/zensend.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
module ZenSend
|
5
|
+
|
6
|
+
|
7
|
+
class Client
|
8
|
+
|
9
|
+
ZENSEND_URL = "https://api.zensend.io"
|
10
|
+
|
11
|
+
attr_accessor :api_key, :url, :http_opts
|
12
|
+
|
13
|
+
def initialize(api_key, http_opts = {open_timeout: 60, read_timeout: 60}, url = ZENSEND_URL)
|
14
|
+
@api_key = api_key
|
15
|
+
@url = url
|
16
|
+
@http_opts = http_opts
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Sends an sms message
|
21
|
+
#
|
22
|
+
# Named paramters:
|
23
|
+
# originator: the originator to send from
|
24
|
+
# body: the body of the sms message
|
25
|
+
# numbers: an array of numbers to send to. they must not contain the ',' character
|
26
|
+
# originator_type: :alpha or :msisdn (not required)
|
27
|
+
# timetolive_in_minutes: number of minutes before message expires (not required)
|
28
|
+
# encoding: :ucs2 or :gsm (not required defaults to automatic)
|
29
|
+
#
|
30
|
+
# A ZenSend::ZenSendException or StandardError or ArgumentError can be raised by this
|
31
|
+
# method. StandardError is raised by net/http. It may be one of the following subclasses:
|
32
|
+
# [Errno::ETIMEDOUT, Errno::ECONNRESET, Errno::EHOSTUNREACH, SocketError, Net::ReadTimeout, Net::OpenTimeout]
|
33
|
+
# This list is not exhaustive.
|
34
|
+
#
|
35
|
+
# An ArgumentError can be raised if any of the numbers includes a ',' character or
|
36
|
+
# a required parameter is not specified or an unknown parameter is specified.
|
37
|
+
#
|
38
|
+
VALID_OPTIONS = [:originator, :body, :numbers, :originator_type, :timetolive_in_minutes, :encoding]
|
39
|
+
|
40
|
+
def send_sms(options)
|
41
|
+
|
42
|
+
originator = required_param(options, :originator)
|
43
|
+
body = required_param(options, :body)
|
44
|
+
numbers = required_param(options, :numbers)
|
45
|
+
|
46
|
+
raise ArgumentError.new("invalid character in numbers") if numbers.any? {|x| x.include?(",")}
|
47
|
+
|
48
|
+
|
49
|
+
options.keys.each do |key|
|
50
|
+
raise ArgumentError.new("unknown option: #{key}") if !VALID_OPTIONS.include?(key)
|
51
|
+
end
|
52
|
+
|
53
|
+
sms_response = SmsResponse.new
|
54
|
+
|
55
|
+
params = {"ORIGINATOR" => originator, "BODY" => body, "NUMBERS" => numbers.join(",")}
|
56
|
+
|
57
|
+
add_optional_param(params, options, "ORIGINATOR_TYPE", :originator_type)
|
58
|
+
add_optional_param(params, options, "TIMETOLIVE", :timetolive_in_minutes)
|
59
|
+
add_optional_param(params, options, "ENCODING", :encoding)
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
sms_response.set_from_response(make_request("/v3/sendsms", :post, params))
|
64
|
+
|
65
|
+
sms_response
|
66
|
+
end
|
67
|
+
|
68
|
+
def check_balance
|
69
|
+
response = make_request("/v3/checkbalance", :get)
|
70
|
+
response["balance"]
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_prices
|
74
|
+
response = make_request("/v3/prices", :get)
|
75
|
+
response["prices_in_pence"]
|
76
|
+
end
|
77
|
+
|
78
|
+
def lookup_operator(msisdn)
|
79
|
+
operator_lookup_response = OperatorLookupResponse.new
|
80
|
+
operator_lookup_response.set_from_response(make_request("/v3/operator_lookup?" + URI.encode_www_form({"NUMBER" => msisdn}), :get))
|
81
|
+
operator_lookup_response
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def add_optional_param(params, options, name, key)
|
87
|
+
params[name] = options[key] if options.include?(key)
|
88
|
+
end
|
89
|
+
|
90
|
+
def required_param(options, param)
|
91
|
+
raise ArgumentError.new("missing: #{param}") if !options.include?(param)
|
92
|
+
options[param]
|
93
|
+
end
|
94
|
+
|
95
|
+
def make_request(path, method, params = {})
|
96
|
+
uri = URI("#{@url}#{path}")
|
97
|
+
|
98
|
+
response = Net::HTTP.start(uri.hostname, uri.port, @http_opts.merge(:use_ssl => uri.scheme == "https")) {|http|
|
99
|
+
|
100
|
+
request = Net::HTTP::Post.new(uri.request_uri) if method == :post
|
101
|
+
request = Net::HTTP::Get.new(uri.request_uri) if method == :get
|
102
|
+
|
103
|
+
request['X-API-KEY'] = @api_key
|
104
|
+
|
105
|
+
request.set_form_data(params) if method == :post && params
|
106
|
+
|
107
|
+
http.request(request)
|
108
|
+
}
|
109
|
+
|
110
|
+
if !response.content_type.nil? && response.content_type.include?("application/json")
|
111
|
+
json_response = JSON.parse(response.body)
|
112
|
+
if json_response['success']
|
113
|
+
return json_response['success']
|
114
|
+
elsif json_response['failure']
|
115
|
+
failure = json_response['failure']
|
116
|
+
raise ZenSendException.new(response.code, failure["failcode"], failure["parameter"], failure["cost_in_pence"], failure["new_balance_in_pence"])
|
117
|
+
else
|
118
|
+
raise ZenSendException.new(response.code, nil, nil, nil, nil)
|
119
|
+
end
|
120
|
+
else
|
121
|
+
raise ZenSendException.new(response.code, nil, nil, nil, nil)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ZenSend
|
2
|
+
OperatorLookupResponse = Struct.new(:mnc, :mcc, :operator, :new_balance_in_pence, :cost_in_pence)
|
3
|
+
|
4
|
+
class OperatorLookupResponse
|
5
|
+
|
6
|
+
def set_from_response(response_hash)
|
7
|
+
self.mnc = response_hash["mnc"]
|
8
|
+
self.mcc = response_hash["mcc"]
|
9
|
+
self.operator = response_hash["operator"]
|
10
|
+
self.new_balance_in_pence = response_hash["new_balance_in_pence"]
|
11
|
+
self.cost_in_pence = response_hash["cost_in_pence"]
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ZenSend
|
2
|
+
SmsResponse = Struct.new(:tx_guid, :numbers, :sms_parts, :encoding, :cost_in_pence, :new_balance_in_pence)
|
3
|
+
|
4
|
+
class SmsResponse
|
5
|
+
|
6
|
+
def set_from_response(response_hash)
|
7
|
+
self.tx_guid = response_hash["txguid"]
|
8
|
+
self.numbers = response_hash["numbers"]
|
9
|
+
self.sms_parts = response_hash["smsparts"]
|
10
|
+
self.encoding = response_hash["encoding"]
|
11
|
+
self.cost_in_pence = response_hash["cost_in_pence"]
|
12
|
+
self.new_balance_in_pence = response_hash["new_balance_in_pence"]
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ZenSend
|
2
|
+
class ZenSendException < Exception
|
3
|
+
attr_reader :failcode, :parameter, :http_code, :cost_in_pence, :new_balance_in_pence
|
4
|
+
|
5
|
+
def initialize(http_code, failcode, parameter, cost_in_pence, new_balance_in_pence)
|
6
|
+
@http_code = http_code
|
7
|
+
@failcode = failcode
|
8
|
+
@parameter = parameter
|
9
|
+
@cost_in_pence = cost_in_pence
|
10
|
+
@new_balance_in_pence = new_balance_in_pence
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zensend
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fonix
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
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: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: webmock
|
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: simplecov
|
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
|
+
description: A simple REST API for ZenSend in Ruby
|
70
|
+
email: tech@fonix.com
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- lib/zensend/client.rb
|
76
|
+
- lib/zensend/operator_lookup_response.rb
|
77
|
+
- lib/zensend/sms_response.rb
|
78
|
+
- lib/zensend/version.rb
|
79
|
+
- lib/zensend/zensend_exception.rb
|
80
|
+
- lib/zensend.rb
|
81
|
+
homepage: http://rubygems.org/gems/zensend_ruby_api
|
82
|
+
licenses:
|
83
|
+
- FONIX
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.0.14
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: ZenSendr's REST API
|
105
|
+
test_files: []
|