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.
@@ -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
@@ -0,0 +1,5 @@
1
+ require "zensend/version"
2
+ require 'zensend/client'
3
+ require 'zensend/sms_response'
4
+ require 'zensend/operator_lookup_response'
5
+ require 'zensend/zensend_exception'
@@ -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,3 @@
1
+ module ZenSend
2
+ VERSION = "0.0.1"
3
+ 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: []