bandwidth 0.0.3 → 0.0.4

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.
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
1
  source "http://rubygems.org"
2
- gem "savon"
2
+ gem "nokogiri"
3
+ gem "crack"
3
4
  gem "hashie"
5
+ gem "httpi"
4
6
 
5
7
  # Add dependencies to develop your gem here.
6
8
  # Include everything needed to run rake, tests, features, etc.
@@ -1,12 +1,9 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- builder (3.0.0)
5
4
  crack (0.1.8)
6
5
  diff-lcs (1.1.2)
7
6
  git (1.2.5)
8
- gyoku (0.3.1)
9
- builder (>= 2.1.2)
10
7
  hashie (1.0.0)
11
8
  httpi (0.9.0)
12
9
  ntlm-http (>= 0.1.1)
@@ -15,6 +12,7 @@ GEM
15
12
  bundler (~> 1.0.0)
16
13
  git (>= 1.2.5)
17
14
  rake
15
+ nokogiri (1.4.4)
18
16
  ntlm-http (0.1.1)
19
17
  rack (1.2.1)
20
18
  rake (0.8.7)
@@ -27,11 +25,6 @@ GEM
27
25
  rspec-expectations (2.3.0)
28
26
  diff-lcs (~> 1.1.2)
29
27
  rspec-mocks (2.3.0)
30
- savon (0.8.6)
31
- builder (>= 2.1.2)
32
- crack (~> 0.1.8)
33
- gyoku (>= 0.3.0)
34
- httpi (>= 0.7.8)
35
28
  yard (0.6.4)
36
29
 
37
30
  PLATFORMS
@@ -39,9 +32,11 @@ PLATFORMS
39
32
 
40
33
  DEPENDENCIES
41
34
  bundler (~> 1.0.0)
35
+ crack
42
36
  hashie
37
+ httpi
43
38
  jeweler (~> 1.5.2)
39
+ nokogiri
44
40
  rcov
45
41
  rspec (~> 2.3.0)
46
- savon
47
42
  yard (~> 0.6.0)
data/README.md CHANGED
@@ -89,6 +89,11 @@ Full details of available methods [here](https://my.bandwidth.com/portal/apidoc/
89
89
  [2.x] Restricted Operations, Numbers - getRateCenterBlockOrder
90
90
  [2.x] Restricted Operations, Numbers - getRateCenterBlockOrders
91
91
 
92
+ Notes
93
+ -----
94
+
95
+ When calling the 'basic_number_order' method, be sure to use ':number_IDs' & ':ext_ref_ID' as the correct options, given that the Bandwidth API is not following camelCase standards in this case.
96
+
92
97
  Copyright
93
98
  ---------
94
99
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bandwidth}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jason Goecke"]
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
29
29
  "examples/example.rb",
30
30
  "lib/bandwidth.rb",
31
31
  "lib/bandwidth/bandwidth.rb",
32
+ "lib/bandwidth/string_patch.rb",
32
33
  "spec/bandwidth_spec.rb",
33
34
  "spec/spec_helper.rb"
34
35
  ]
@@ -47,16 +48,20 @@ Gem::Specification.new do |s|
47
48
  s.specification_version = 3
48
49
 
49
50
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
- s.add_runtime_dependency(%q<savon>, [">= 0"])
51
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
52
+ s.add_runtime_dependency(%q<crack>, [">= 0"])
51
53
  s.add_runtime_dependency(%q<hashie>, [">= 0"])
54
+ s.add_runtime_dependency(%q<httpi>, [">= 0"])
52
55
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
53
56
  s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
54
57
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
55
58
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
56
59
  s.add_development_dependency(%q<rcov>, [">= 0"])
57
60
  else
58
- s.add_dependency(%q<savon>, [">= 0"])
61
+ s.add_dependency(%q<nokogiri>, [">= 0"])
62
+ s.add_dependency(%q<crack>, [">= 0"])
59
63
  s.add_dependency(%q<hashie>, [">= 0"])
64
+ s.add_dependency(%q<httpi>, [">= 0"])
60
65
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
61
66
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
62
67
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -64,8 +69,10 @@ Gem::Specification.new do |s|
64
69
  s.add_dependency(%q<rcov>, [">= 0"])
65
70
  end
66
71
  else
67
- s.add_dependency(%q<savon>, [">= 0"])
72
+ s.add_dependency(%q<nokogiri>, [">= 0"])
73
+ s.add_dependency(%q<crack>, [">= 0"])
68
74
  s.add_dependency(%q<hashie>, [">= 0"])
75
+ s.add_dependency(%q<httpi>, [">= 0"])
69
76
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
70
77
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
71
78
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -1,2 +1,2 @@
1
1
  $: << File.expand_path(File.dirname(__FILE__))
2
- %w(savon hashie bandwidth/bandwidth).each { |lib| require lib }
2
+ %w(nokogiri crack httpi hashie bandwidth/bandwidth bandwidth/string_patch).each { |lib| require lib }
@@ -61,17 +61,14 @@ class Bandwidth
61
61
  raise NoMethodError, "The method #{method_name.to_s} does not exist." if API_METHODS.include?(method_name) == false
62
62
 
63
63
  if method_name == :get_cdr_archive
64
- @cdrs_request.body = Gyoku.xml({ method_name => params.merge({ :developer_key => @developer_key }),
65
- :attributes! => xml_namespaces(method_name) })
64
+ @cdrs_request.body = build_xml(method_name, params)
66
65
 
67
66
  response = HTTPI.post @cdrs_request
68
67
  Hashie::Mash.new({ :code => response.code,
69
68
  :body => response.raw_body,
70
69
  :headers => response.headers })
71
70
  else
72
- @numbers_request.body = Gyoku.xml({ method_name => params.merge({ :developer_key => @developer_key }),
73
- :attributes! => xml_namespaces(method_name) })
74
-
71
+ @numbers_request.body = build_xml(method_name, params)
75
72
  response = HTTPI.post @numbers_request
76
73
  Hashie::Mash.new({ :code => response.code,
77
74
  :body => Crack::XML.parse(response.raw_body),
@@ -79,6 +76,36 @@ class Bandwidth
79
76
  end
80
77
  end
81
78
 
79
+ ##
80
+ # Builds the XML document for the method call
81
+ #
82
+ # @param [required, Symbol] the method name to invoke on the REST API
83
+ # @param [optional, Hash] the parameters to pass to the method, should be symbols and may be all lowercase with underscores or camelCase
84
+ # @return [String] the resulting XML document
85
+ def build_xml(method_name, params)
86
+ builder_params = params.merge({ :developer_key => @developer_key })
87
+
88
+ builder = Nokogiri::XML::Builder.new do |xml|
89
+ xml.send(method_name.to_s.camelize.uncapitalize.to_sym, xml_namespaces) do
90
+ builder_params.each do |parent_k, parent_v|
91
+ if parent_v.instance_of?(Array)
92
+ xml.send(parent_k.to_s.camelize.uncapitalize.to_sym) do
93
+ parent_v.each do |item|
94
+ item.each do |item_k, item_v|
95
+ symbol = (item_k.to_s + '_').to_sym
96
+ xml.send(symbol, item_v)
97
+ end
98
+ end
99
+ end
100
+ else
101
+ xml.send(parent_k.to_s.camelize.uncapitalize.to_sym, parent_v)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ builder.to_xml
107
+ end
108
+
82
109
  private
83
110
 
84
111
  ##
@@ -121,9 +148,9 @@ class Bandwidth
121
148
  #
122
149
  # @param [required, Symbol] method_name to add the XML namespace details to
123
150
  # @return [Hash] the resulting XML namespace attributes
124
- def xml_namespaces(method_name)
125
- { method_name => { 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
126
- 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
127
- 'xmlns' => 'http://www.bandwidth.com/api/' } }
151
+ def xml_namespaces
152
+ { 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
153
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
154
+ 'xmlns' => 'http://www.bandwidth.com/api/' }
128
155
  end
129
156
  end
@@ -0,0 +1,9 @@
1
+ class String
2
+ def camelize
3
+ self.split(/[^a-z0-9]/i).map{ |w| w[0, 1].upcase + w[1..-1] }.join
4
+ end
5
+
6
+ def uncapitalize
7
+ self.sub(/^(.)/) { |m| m.downcase }
8
+ end
9
+ end
@@ -8,6 +8,24 @@ describe "Bandwidth" do
8
8
  :log_level => :debug })
9
9
  end
10
10
 
11
+ describe "string patch" do
12
+ it 'should camelize a string' do
13
+ "foo_bar".camelize.should == 'FooBar'
14
+ end
15
+
16
+ it 'should uncapitalize a string' do
17
+ "FooBar".uncapitalize.should == 'fooBar'
18
+ end
19
+
20
+ it 'should camelize and uncapitlize a string' do
21
+ "foo_bar".camelize.uncapitalize.should == 'fooBar'
22
+ end
23
+
24
+ it 'should leave the ID alone' do
25
+ "foobar_IDs".camelize.uncapitalize.should == 'foobarIDs'
26
+ end
27
+ end
28
+
11
29
  describe "numbers" do
12
30
  it "should instantiate a Bandwidth::Numbers class" do
13
31
  @bandwidth.instance_of?(Bandwidth).should == true
@@ -55,9 +73,55 @@ describe "Bandwidth" do
55
73
 
56
74
  describe "cdrs" do
57
75
  it "should get a resopnse when retrieving cdrs" do
58
- #pending('It appears Bandwidth has not provided access to this just yet.')
59
76
  result = @bandwidth.get_cdr_archive(:get_type => 'Daily', :get_value => '20110221')
60
- result['Content-Type'].should == nil
77
+ result['headers']['Content-Type'].should == 'application/zip'
78
+ end
79
+ end
80
+
81
+ describe "xml builder" do
82
+ it "should build a valid area code search XML document" do
83
+ params = { :npa_nxx => '303', :max_quantity => '3' }
84
+ result = @bandwidth.build_xml(:area_code_number_search, params)
85
+ Crack::XML.parse(result).should == {
86
+ "areaCodeNumberSearch" => {
87
+ "developerKey" => ENV['BANDWIDTH_DEVELOPER_KEY'],
88
+ "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema",
89
+ "maxQuantity" => "3",
90
+ "npaNxx" => "303",
91
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
92
+ "xmlns" => "http://www.bandwidth.com/api/"
93
+ }
94
+ }
95
+ end
96
+
97
+ it "should build a valid basic number order document" do
98
+ params = { :order_name => 'Foobar 0',
99
+ :ext_ref_ID => 'Foobar 1',
100
+ :number_IDs => [ { :id => '1' }, { :id => '2' }],
101
+ :subscriber => 'Tropo',
102
+ :end_points => { :host => 'sip.tropo.com' } }
103
+ result = @bandwidth.build_xml(:basic_number_order, params)
104
+
105
+ Crack::XML.parse(result).should == {
106
+ "basicNumberOrder" => {
107
+ "developerKey" => ENV['BANDWIDTH_DEVELOPER_KEY'],
108
+ "subscriber" => "Tropo",
109
+ "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema",
110
+ "extRefID" => "Foobar 1",
111
+ "orderName" => "Foobar 0",
112
+ "numberIDs" => {
113
+ "id" => [
114
+ "1",
115
+ "2"
116
+ ]
117
+ },
118
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
119
+ "xmlns" => "http://www.bandwidth.com/api/",
120
+ "endPoints" => {
121
+ "host" => "sip.tropo.com"
122
+ }
123
+ }
124
+ }
61
125
  end
62
126
  end
63
127
  end
@@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  require 'rspec'
4
4
  require 'bandwidth'
5
+ require 'awesome_print'
5
6
 
6
7
  # Requires supporting files with custom matchers and macros, etc,
7
8
  # in ./support/ and its subdirectories.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bandwidth
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jason Goecke
@@ -29,7 +29,7 @@ dependencies:
29
29
  segments:
30
30
  - 0
31
31
  version: "0"
32
- name: savon
32
+ name: nokogiri
33
33
  version_requirements: *id001
34
34
  prerelease: false
35
35
  - !ruby/object:Gem::Dependency
@@ -43,12 +43,40 @@ dependencies:
43
43
  segments:
44
44
  - 0
45
45
  version: "0"
46
- name: hashie
46
+ name: crack
47
47
  version_requirements: *id002
48
48
  prerelease: false
49
49
  - !ruby/object:Gem::Dependency
50
- type: :development
50
+ type: :runtime
51
51
  requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ name: hashie
61
+ version_requirements: *id003
62
+ prerelease: false
63
+ - !ruby/object:Gem::Dependency
64
+ type: :runtime
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ name: httpi
75
+ version_requirements: *id004
76
+ prerelease: false
77
+ - !ruby/object:Gem::Dependency
78
+ type: :development
79
+ requirement: &id005 !ruby/object:Gem::Requirement
52
80
  none: false
53
81
  requirements:
54
82
  - - ~>
@@ -60,11 +88,11 @@ dependencies:
60
88
  - 0
61
89
  version: 2.3.0
62
90
  name: rspec
63
- version_requirements: *id003
91
+ version_requirements: *id005
64
92
  prerelease: false
65
93
  - !ruby/object:Gem::Dependency
66
94
  type: :development
67
- requirement: &id004 !ruby/object:Gem::Requirement
95
+ requirement: &id006 !ruby/object:Gem::Requirement
68
96
  none: false
69
97
  requirements:
70
98
  - - ~>
@@ -76,11 +104,11 @@ dependencies:
76
104
  - 0
77
105
  version: 0.6.0
78
106
  name: yard
79
- version_requirements: *id004
107
+ version_requirements: *id006
80
108
  prerelease: false
81
109
  - !ruby/object:Gem::Dependency
82
110
  type: :development
83
- requirement: &id005 !ruby/object:Gem::Requirement
111
+ requirement: &id007 !ruby/object:Gem::Requirement
84
112
  none: false
85
113
  requirements:
86
114
  - - ~>
@@ -92,11 +120,11 @@ dependencies:
92
120
  - 0
93
121
  version: 1.0.0
94
122
  name: bundler
95
- version_requirements: *id005
123
+ version_requirements: *id007
96
124
  prerelease: false
97
125
  - !ruby/object:Gem::Dependency
98
126
  type: :development
99
- requirement: &id006 !ruby/object:Gem::Requirement
127
+ requirement: &id008 !ruby/object:Gem::Requirement
100
128
  none: false
101
129
  requirements:
102
130
  - - ~>
@@ -108,11 +136,11 @@ dependencies:
108
136
  - 2
109
137
  version: 1.5.2
110
138
  name: jeweler
111
- version_requirements: *id006
139
+ version_requirements: *id008
112
140
  prerelease: false
113
141
  - !ruby/object:Gem::Dependency
114
142
  type: :development
115
- requirement: &id007 !ruby/object:Gem::Requirement
143
+ requirement: &id009 !ruby/object:Gem::Requirement
116
144
  none: false
117
145
  requirements:
118
146
  - - ">="
@@ -122,7 +150,7 @@ dependencies:
122
150
  - 0
123
151
  version: "0"
124
152
  name: rcov
125
- version_requirements: *id007
153
+ version_requirements: *id009
126
154
  prerelease: false
127
155
  description: "More detail here: https://my.bandwidth.com/portal/apidoc/welcome.htm"
128
156
  email: jason@goecke.net
@@ -146,6 +174,7 @@ files:
146
174
  - examples/example.rb
147
175
  - lib/bandwidth.rb
148
176
  - lib/bandwidth/bandwidth.rb
177
+ - lib/bandwidth/string_patch.rb
149
178
  - spec/bandwidth_spec.rb
150
179
  - spec/spec_helper.rb
151
180
  has_rdoc: true