mblox 0.2.9 → 0.3.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 +8 -8
- data/lib/mblox/from_xml.rb +3 -7
- data/lib/mblox/sms_receipt.rb +25 -14
- data/lib/mblox/sms_response.rb +13 -8
- data/lib/mblox/version.rb +1 -1
- data/mblox.gemspec +1 -0
- data/spec/sms_receipt_spec.rb +4 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDhiNjUwZDE4N2YyOTU3MGI3NWQ2MjBmYmUxODYzOTAzZjdjOGNjMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MDc4NzYxYWE4MjhkZGJiNDE5OTZiNGUyODBhODNhMWZkZDZlOGQ4NA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OGNhNjBjYjI0NWUxMGJmZGU3ODQxZTIyMDNiNjIwNjk1NzNkNDdkNzQ3Zjc3
|
10
|
+
OTc1NWI5MDk3ZjU0OTAzZTE4YTE0YjY4YTAwZjEzOTM1YjJjZDllNWUyMDEz
|
11
|
+
NmUxMzQ2YjJmZWVhZjgyZTVlODA4YmNkMjZjY2U3ZjZiYmVjN2I=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTNiMThhMDMzZTRkZTJlZmIyNGQ0OWVjMzIxNTNkYzJiN2Y4YWY5NzdmYTdm
|
14
|
+
MmIxNjE5NDI3NDZkYWY3MTlmMmUzODAwYzgwYzg4NTAwNTY5ZWNiNTBmODU1
|
15
|
+
ZTJhYTRjNWRiOTkzZTk1ZWY0MTFiZTFmMWIwYjRhMGE0OGMzY2U=
|
data/lib/mblox/from_xml.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
|
-
require '
|
2
|
-
require 'active_model/serializers/xml.rb'
|
1
|
+
require 'nokogiri'
|
3
2
|
|
4
3
|
module Mblox
|
5
4
|
class MissingExpectedXmlContentError < StandardError; end
|
6
|
-
|
7
5
|
class << self
|
8
6
|
def from_xml(xml)
|
9
|
-
|
10
|
-
|
11
|
-
rescue REXML::ParseException
|
12
|
-
raise MissingExpectedXmlContentError, "'#{xml}' is not parseable as XML"
|
7
|
+
Nokogiri::XML(xml) { |config| config.nonet }.tap do |_|
|
8
|
+
raise MissingExpectedXmlContentError, "'#{xml}' is not parseable as XML" unless _.errors.empty?
|
13
9
|
end
|
14
10
|
end
|
15
11
|
end
|
data/lib/mblox/sms_receipt.rb
CHANGED
@@ -2,38 +2,49 @@ require 'mblox/from_xml'
|
|
2
2
|
|
3
3
|
module Mblox
|
4
4
|
class SmsReceipt
|
5
|
-
attr_reader :batch_id, :subscriber_number, :timestamp, :msg_reference, :status, :reason
|
5
|
+
attr_reader :batch_id, :subscriber_number, :timestamp, :msg_reference, :status, :reason, :operator
|
6
6
|
def initialize(xml)
|
7
|
-
data = Mblox.from_xml(xml)
|
7
|
+
data = Mblox.from_xml(xml).xpath '//NotificationService'
|
8
8
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' node, but was #{xml}" if data.blank?
|
9
9
|
|
10
|
-
data = data
|
10
|
+
data = data.xpath '//NotificationList'
|
11
11
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' -> 'NotificationList' node, but was #{xml}" if data.blank?
|
12
12
|
|
13
|
-
data = data
|
13
|
+
data = data.xpath '//Notification'
|
14
14
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' -> 'NotificationList' -> 'Notification' node, but was #{xml}" if data.blank?
|
15
|
+
@batch_id = data.attribute('BatchID').value.to_i
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
data = data['Subscriber']
|
17
|
+
data = data.xpath '//Subscriber'
|
19
18
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' -> 'NotificationList' -> 'Notification' -> 'Subscriber' node, but was #{xml}" if data.blank?
|
20
19
|
|
21
|
-
@subscriber_number = data
|
20
|
+
@subscriber_number = value_at(:SubscriberNumber, data)
|
22
21
|
@subscriber_number = @subscriber_number[1..-1] if '1' == @subscriber_number[0]
|
23
22
|
|
24
|
-
|
23
|
+
timestamp = value_at(:TimeStamp, data)
|
24
|
+
unless timestamp.blank?
|
25
25
|
@timestamp = begin
|
26
|
-
Time.strptime("#{
|
26
|
+
Time.strptime("#{timestamp}+0000", '%Y%m%d%H%M%z')
|
27
27
|
rescue ArgumentError
|
28
28
|
nil
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
@timestamp = @timestamp.to_datetime if @timestamp
|
33
|
-
|
34
|
-
@
|
35
|
-
|
36
|
-
@reason =
|
33
|
+
@msg_reference = value_at(:MsgReference, data)
|
34
|
+
@status = value_at(:Status, data)
|
35
|
+
reason = value_at(:Reason, data)
|
36
|
+
@reason = reason.blank? ? nil : reason.to_i
|
37
|
+
data = data.xpath('//Tags').xpath('//Tag')
|
38
|
+
return if data.empty?
|
39
|
+
data.each do |d|
|
40
|
+
@operator = d.child.content.to_i if "Operator" == data.attribute('Name').content
|
41
|
+
return if @operator
|
42
|
+
end
|
37
43
|
end
|
44
|
+
private
|
45
|
+
def value_at(path, data)
|
46
|
+
data = data.xpath("//#{path}")
|
47
|
+
(data.empty? || data.children.empty?) ? nil : data.first.child.content
|
48
|
+
end
|
38
49
|
end
|
39
50
|
end
|
data/lib/mblox/sms_response.rb
CHANGED
@@ -19,6 +19,11 @@ module Mblox
|
|
19
19
|
@code, @text = (code.to_i.to_s == code ? code.to_i : code), text
|
20
20
|
end
|
21
21
|
|
22
|
+
def self.from_xml(xml, xpath)
|
23
|
+
code, text = xml.xpath("//#{xpath}Code"), xml.xpath("//#{xpath}Text")
|
24
|
+
new(code.first.child.content, text.first.child.content)
|
25
|
+
end
|
26
|
+
|
22
27
|
def ok?
|
23
28
|
0 == @code
|
24
29
|
end
|
@@ -33,25 +38,25 @@ module Mblox
|
|
33
38
|
|
34
39
|
attr_reader :request, :result, :subscriber_result
|
35
40
|
def initialize(xml)
|
36
|
-
data = Mblox.from_xml(xml)
|
41
|
+
data = Mblox.from_xml(xml).xpath '//NotificationRequestResult'
|
37
42
|
|
38
43
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationRequestResult' node, but was #{xml}" if data.blank?
|
39
|
-
header = data
|
44
|
+
header = data.xpath '//NotificationResultHeader'
|
40
45
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationRequestResult' -> 'NotificationResultHeader' node, but was #{xml}" if header.blank?
|
41
|
-
@request = Result.
|
46
|
+
@request = Result.from_xml(header, :RequestResult)
|
42
47
|
@request = nil unless @request.valid?
|
43
48
|
|
44
|
-
result_list = data
|
49
|
+
result_list = data.xpath '//NotificationResultList'
|
45
50
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationRequestResult' -> 'NotificationResultList' node, but was #{xml}" if result_list.blank?
|
46
|
-
result_list = result_list
|
51
|
+
result_list = result_list.xpath '//NotificationResult'
|
47
52
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationRequestResult' -> 'NotificationResultList' -> 'NotificationResult' node, but was #{xml}" if result_list.blank?
|
48
|
-
@result = Result.
|
53
|
+
@result = Result.from_xml(result_list, :NotificationResult)
|
49
54
|
@result = nil unless @result.valid?
|
50
55
|
|
51
56
|
if @result.ok?
|
52
|
-
result_list = result_list
|
57
|
+
result_list = result_list.xpath '//SubscriberResult'
|
53
58
|
raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationRequestResult' -> 'NotificationResultList' -> 'NotificationResult' -> 'SubscriberResult' node, but was #{xml}" if result_list.blank?
|
54
|
-
@subscriber_result = Result.
|
59
|
+
@subscriber_result = Result.from_xml(result_list, :SubscriberResult)
|
55
60
|
@subscriber_result = nil unless @subscriber_result.valid?
|
56
61
|
end
|
57
62
|
end
|
data/lib/mblox/version.rb
CHANGED
data/mblox.gemspec
CHANGED
data/spec/sms_receipt_spec.rb
CHANGED
@@ -33,6 +33,9 @@ describe Mblox::SmsReceipt do
|
|
33
33
|
s.MsgReference(msg_reference)
|
34
34
|
s.Status(status)
|
35
35
|
s.Reason(reason)
|
36
|
+
s.Tags do |t|
|
37
|
+
t.Tag(10487, :Name => :Operator)
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
@@ -105,6 +108,7 @@ describe Mblox::SmsReceipt do
|
|
105
108
|
target.msg_reference.should == msg_reference
|
106
109
|
target.status.should == status
|
107
110
|
target.reason.should == reason
|
111
|
+
target.operator.should == 10487
|
108
112
|
end
|
109
113
|
|
110
114
|
it "should raise error when missing root node" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mblox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Isaac Betesh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: nokogiri
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.5.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.5.0
|
111
125
|
description: Send SMS messages
|
112
126
|
email:
|
113
127
|
- iybetesh@gmail.com
|