billwise4r 0.1.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,42 @@
1
+ # rcov generated
2
+ coverage
3
+
4
+ # rdoc generated
5
+ rdoc
6
+
7
+ # yard generated
8
+ doc
9
+ .yardoc
10
+
11
+ # bundler
12
+ .bundle
13
+
14
+ # jeweler generated
15
+ pkg
16
+
17
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
18
+ #
19
+ # * Create a file at ~/.gitignore
20
+ # * Include files you want ignored
21
+ # * Run: git config --global core.excludesfile ~/.gitignore
22
+ #
23
+ # After doing this, these files will be ignored in all your git projects,
24
+ # saving you from having to 'pollute' every project you touch with them
25
+ #
26
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
27
+ #
28
+ # For MacOS:
29
+ #
30
+ #.DS_Store
31
+ #
32
+ # For TextMate
33
+ #*.tmproj
34
+ #tmtags
35
+ #
36
+ # For emacs:
37
+ #*~
38
+ #\#*
39
+ #.\#*
40
+ #
41
+ # For vim:
42
+ #*.swp
data/Gemfile CHANGED
@@ -1,11 +1,4 @@
1
1
  source "http://rubygems.org"
2
- gem "savon"
3
- gem "multi_xml"
4
2
 
5
- group :development do
6
- gem "shoulda", ">= 0"
7
- gem "bundler", "~> 1.0.0"
8
- gem "jeweler", "~> 1.5.1"
9
- gem "rcov", ">= 0"
10
- gem "awesome_print"
11
- end
3
+ # Specify your gem's dependencies in billwise4r.gemspec
4
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,41 +1,51 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ billwise4r (0.2.2)
5
+ multi_xml
6
+ savon
7
+
1
8
  GEM
2
9
  remote: http://rubygems.org/
3
10
  specs:
11
+ akami (1.0.0)
12
+ gyoku (>= 0.4.0)
4
13
  awesome_print (0.4.0)
5
14
  builder (3.0.0)
6
- git (1.2.5)
15
+ diff-lcs (1.1.3)
16
+ fakeweb (1.3.0)
7
17
  gyoku (0.4.4)
8
18
  builder (>= 2.1.2)
9
- httpi (0.9.4)
10
- pyu-ntlm-http (>= 0.1.3.1)
19
+ httpi (0.9.5)
11
20
  rack
12
- jeweler (1.5.2)
13
- bundler (~> 1.0.0)
14
- git (>= 1.2.5)
15
- rake
16
- multi_xml (0.2.2)
17
- nokogiri (1.4.4)
18
- nori (0.2.3)
19
- pyu-ntlm-http (0.1.3.1)
20
- rack (1.3.0)
21
- rake (0.9.2)
22
- rcov (0.9.9)
23
- savon (0.9.2)
21
+ multi_xml (0.4.1)
22
+ nokogiri (1.5.0)
23
+ nori (1.0.2)
24
+ rack (1.3.5)
25
+ rspec (2.7.0)
26
+ rspec-core (~> 2.7.0)
27
+ rspec-expectations (~> 2.7.0)
28
+ rspec-mocks (~> 2.7.0)
29
+ rspec-core (2.7.1)
30
+ rspec-expectations (2.7.0)
31
+ diff-lcs (~> 1.1.2)
32
+ rspec-mocks (2.7.0)
33
+ savon (0.9.7)
34
+ akami (~> 1.0)
24
35
  builder (>= 2.1.2)
25
36
  gyoku (>= 0.4.0)
26
- httpi (>= 0.7.8)
37
+ httpi (~> 0.9)
38
+ nokogiri (>= 1.4.0)
39
+ nori (~> 1.0)
40
+ wasabi (~> 2.0)
41
+ wasabi (2.0.0)
27
42
  nokogiri (>= 1.4.0)
28
- nori (>= 0.2.0)
29
- shoulda (2.11.3)
30
43
 
31
44
  PLATFORMS
32
45
  ruby
33
46
 
34
47
  DEPENDENCIES
35
48
  awesome_print
36
- bundler (~> 1.0.0)
37
- jeweler (~> 1.5.1)
38
- multi_xml
39
- rcov
40
- savon
41
- shoulda
49
+ billwise4r!
50
+ fakeweb
51
+ rspec
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  billwise4r
2
2
  ==========
3
3
 
4
- Gem for working with the Billwise SOAP/XML API.
4
+ Gem for working with the Billwise SOAP/XML API. Ruby 1.9.x +
5
5
 
6
6
  Examples
7
7
  --------
data/Rakefile CHANGED
@@ -1,51 +1 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'rake'
11
-
12
- require 'jeweler'
13
- Jeweler::Tasks.new do |gem|
14
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
- gem.name = "billwise4r"
16
- gem.homepage = "http://github.com/tropo/billwise4r"
17
- gem.license = "MIT"
18
- gem.summary = "Ruby lib for consuming the Billwise SOAP/XML API"
19
- gem.description = "Ruby lib for consuming the Billwise SOAP/XML API"
20
- gem.email = "jason@goecke.net"
21
- gem.authors = ["Jason Goecke"]
22
- gem.add_runtime_dependency 'savon'
23
- gem.add_development_dependency 'rspec'
24
- end
25
- Jeweler::RubygemsDotOrgTasks.new
26
-
27
- require 'rake/testtask'
28
- Rake::TestTask.new(:test) do |test|
29
- test.libs << 'lib' << 'test'
30
- test.pattern = 'test/**/test_*.rb'
31
- test.verbose = true
32
- end
33
-
34
- require 'rcov/rcovtask'
35
- Rcov::RcovTask.new do |test|
36
- test.libs << 'test'
37
- test.pattern = 'test/**/test_*.rb'
38
- test.verbose = true
39
- end
40
-
41
- task :default => :test
42
-
43
- require 'rake/rdoctask'
44
- Rake::RDocTask.new do |rdoc|
45
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
46
-
47
- rdoc.rdoc_dir = 'rdoc'
48
- rdoc.title = "billwise4r #{version}"
49
- rdoc.rdoc_files.include('README*')
50
- rdoc.rdoc_files.include('lib/**/*.rb')
51
- end
1
+ require "bundler/gem_tasks"
data/billwise4r.gemspec CHANGED
@@ -1,82 +1,35 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "billwise4r/version"
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = %q{billwise4r}
8
- s.version = "0.1.1"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jason Goecke"]
12
- s.date = %q{2011-06-07}
6
+ s.name = "billwise4r"
7
+ s.version = Billwise4r::VERSION
8
+ s.authors = ["Jason Goecke","John Dyer"]
9
+ s.email = ["jason@goecke.net","john@krumpt.com"]
10
+ s.homepage = %q{http://github.com/jsgoecke/billwise4r}
11
+ s.summary = %q{Ruby lib for consuming the Billwise SOAP/XML API}
13
12
  s.description = %q{Ruby lib for consuming the Billwise SOAP/XML API}
14
- s.email = %q{jason@goecke.net}
15
- s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
- "README.md"
18
- ]
19
- s.files = [
20
- ".document",
21
- "Gemfile",
22
- "Gemfile.lock",
23
- "LICENSE.txt",
24
- "README.md",
25
- "Rakefile",
26
- "VERSION",
27
- "billwise4r.gemspec",
28
- "lib/billwise4r.rb",
29
- "lib/billwise4r/billwise4r.rb",
30
- "spec/billwise4r_spec.rb",
31
- "spec/config/.gitignore",
32
- "spec/config/config.yml",
33
- "spec/connect_sm_service.wsdl",
34
- "spec/spec_helper.rb"
35
- ]
36
- s.homepage = %q{http://github.com/tropo/billwise4r}
37
- s.licenses = ["MIT"]
38
- s.require_paths = ["lib"]
39
13
  s.rubygems_version = %q{1.5.0}
14
+ s.required_ruby_version = '>= 1.9'
40
15
  s.summary = %q{Ruby lib for consuming the Billwise SOAP/XML API}
41
16
  s.test_files = [
42
17
  "spec/billwise4r_spec.rb",
43
- "spec/spec_helper.rb"
18
+ "spec/spec_helper.rb",
19
+ "spec/connect_sm_service.wsdl",
20
+ "spec/config/config.yml"
44
21
  ]
45
22
 
46
- if s.respond_to? :specification_version then
47
- s.specification_version = 3
23
+ s.rubyforge_project = "billwise4r"
48
24
 
49
- 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<multi_xml>, [">= 0"])
52
- s.add_development_dependency(%q<shoulda>, [">= 0"])
53
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
54
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
55
- s.add_development_dependency(%q<rcov>, [">= 0"])
56
- s.add_development_dependency(%q<awesome_print>, [">= 0"])
57
- s.add_runtime_dependency(%q<savon>, [">= 0"])
58
- s.add_development_dependency(%q<rspec>, [">= 0"])
59
- else
60
- s.add_dependency(%q<savon>, [">= 0"])
61
- s.add_dependency(%q<multi_xml>, [">= 0"])
62
- s.add_dependency(%q<shoulda>, [">= 0"])
63
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
64
- s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
65
- s.add_dependency(%q<rcov>, [">= 0"])
66
- s.add_dependency(%q<awesome_print>, [">= 0"])
67
- s.add_dependency(%q<savon>, [">= 0"])
68
- s.add_dependency(%q<rspec>, [">= 0"])
69
- end
70
- else
71
- s.add_dependency(%q<savon>, [">= 0"])
72
- s.add_dependency(%q<multi_xml>, [">= 0"])
73
- s.add_dependency(%q<shoulda>, [">= 0"])
74
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
75
- s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
76
- s.add_dependency(%q<rcov>, [">= 0"])
77
- s.add_dependency(%q<awesome_print>, [">= 0"])
78
- s.add_dependency(%q<savon>, [">= 0"])
79
- s.add_dependency(%q<rspec>, [">= 0"])
80
- end
81
- end
25
+ s.files = `git ls-files`.split("\n")
26
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
28
+ s.require_paths = ["lib","spec"]
82
29
 
30
+ s.add_development_dependency "rspec"
31
+ s.add_development_dependency "fakeweb"
32
+ s.add_development_dependency "awesome_print"
33
+ s.add_runtime_dependency "savon"
34
+ s.add_runtime_dependency "multi_xml"
35
+ end
@@ -0,0 +1,3 @@
1
+ module Billwise4r
2
+ VERSION = "0.2.2"
3
+ end
data/lib/billwise4r.rb CHANGED
@@ -1,4 +1,120 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- require 'savon'
3
- require 'multi_xml'
4
- require 'billwise4r/billwise4r'
1
+ class Billwise
2
+ require "billwise4r/version"
3
+ require 'savon'
4
+ require 'multi_xml'
5
+
6
+ ##
7
+ # Instantiates a new Billwise class
8
+ #
9
+ def initialize(params={})
10
+ # Make sure all params we need are here or raise an error
11
+ check_initialization_params(params)
12
+
13
+ @companyCd = params[:companyCd]
14
+ log = params[:log] || false
15
+ log_level = params[:log_level] || :info
16
+ @httpi_log = params[:httpi_log] || false
17
+
18
+ Savon.configure do |config|
19
+ config.log = log
20
+ config.log_level = log_level
21
+ config.env_namespace = :soap
22
+ end
23
+
24
+ @soap_endpoint = URI.parse params[:endpoint] || 'https://cwa021.connect4billing.com:8443/axis2/services/ConnectSmService.ConnectSmServiceHttpSoap12Endpoint/'
25
+ @soap_namespace = params[:namespace] || 'http://connectsm.ws.bwse.com/xsd'
26
+
27
+ @soap_version = 2
28
+
29
+ # Build our SOAP driver
30
+ @soap_driver = Savon::Client.new do
31
+ wsse.credentials '290connectsm','ZgntS40r'
32
+ wsdl.document = 'https://cwa021.connect4billing.com:8443/axis2/services/ConnectSmService?wsdl'
33
+
34
+ end
35
+ @soap_driver.http.read_timeout = 300
36
+
37
+ @tag_order = tag_order
38
+
39
+ MultiXml.parser = :nokogiri
40
+ end
41
+
42
+ ##
43
+ # A catch all for the methods defined by the WSDL
44
+ # refer to the Billwise API documentation for details
45
+ #
46
+ # @return [Hash] the Billwise response
47
+ def method_missing(method, params)
48
+ begin
49
+ HTTPI.log = @httpi_log
50
+ response = @soap_driver.request :wsdl, method do |soap, wsse|
51
+ soap.version = @soap_version
52
+ soap.endpoint = @soap_endpoint
53
+ soap.namespaces = Hash.new
54
+ soap.namespaces["xmlns:soap"] = "http://www.w3.org/2003/05/soap-envelope"
55
+ soap.namespaces["xmlns:ins0"] = @soap_namespace
56
+
57
+ fields = { :companyCd => @companyCd }.merge!(params)
58
+
59
+ fields = order_hash(:method=>method, :fields=>fields)
60
+
61
+ soap.body = fields
62
+
63
+ end
64
+ response.to_hash["#{method}_response".to_sym][:return]
65
+ rescue Savon::SOAP::Fault => fault
66
+ response = {'error' => 'soapfault', 'message' => fault}
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ ##
73
+ # Checks that the required params have been provided, or rasies an error
74
+ def check_initialization_params(params={})
75
+ raise ArgumentError, "You must provide Billwise connection parameters." if params.length == 0
76
+ %w(companyCd username password).each { |param| raise ArgumentError, "You must provide a valid #{param}." if params[param.to_sym].nil? }
77
+ end
78
+
79
+ ##
80
+ # Decamelizes a string
81
+ #
82
+ # @param [required, String] the string to be decamelized
83
+ # @return [String] the decamelized string
84
+ def decamelize(string)
85
+ string.gsub(/[A-Z]/) { |p| '_' + p.downcase }
86
+ end
87
+
88
+ ##
89
+ # Order has correctly since billwise requires soap parameters be in correct order.
90
+ # Savon provides this functionality thru gyoku but it doesnt seem to be working in 1.9.
91
+ # This being the case I decided to roll my own
92
+ def order_hash(opts={})
93
+ ordered_hash={}
94
+ @tag_order[opts[:method].to_sym].each do |o|
95
+ ordered_hash.merge!(o.to_sym=>opts[:fields][o.to_sym])
96
+ end
97
+ ordered_hash
98
+ end
99
+
100
+ ##
101
+ # Traverses the WSDL to create a hash of methods and their ordered parameters
102
+ # only necessary since the Billwise SOAP/XML API requires attributes in order
103
+ # and the Ruby MRI likes to alphabetize, so Savon allows us to set a specific
104
+ # order when building the XML
105
+ #
106
+ # @return [Hash] the methods and their ordered parameters
107
+ def tag_order
108
+ actions = {}
109
+ MultiXml.parse(@soap_driver.wsdl.xml)['definitions']['types']['schema'][3]['element'].each do |action|
110
+ attributes = []
111
+ if action['complexType']['sequence']['element'].instance_of?(Hash)
112
+ attributes << action['complexType']['sequence']['element']['name'].to_sym
113
+ else
114
+ action['complexType']['sequence']['element'].each { |item| attributes << item['name'].to_sym }
115
+ end
116
+ actions[decamelize(action['name']).to_sym] = attributes
117
+ end
118
+ actions
119
+ end
120
+ end
@@ -4,43 +4,62 @@ describe "Billwise" do
4
4
  before(:all) do
5
5
  config = YAML.load(File.open('spec/config/config.yml'))
6
6
  @options = config.merge!({ :log => false })
7
-
7
+
8
8
  @billwise = Billwise.new @options
9
9
  end
10
-
10
+
11
11
  it "should create a Billwise object" do
12
12
  @billwise = Billwise.new @options
13
13
  @billwise.instance_of?(Billwise).should == true
14
14
  end
15
-
15
+
16
+ it "should order the hash correctly" do
17
+ @billwise = Billwise.new @options
18
+ result = @billwise.find_invoices({:serviceId => 'A000000000046590',:customerCd => '000155', :status => 'A' })
19
+ result[0][:invoice_number].should == "STMNT-201005"
20
+ end
21
+
22
+ it "should find customer usage" do
23
+ result = @billwise.get_usage({:customerCd => '000404', :invoiceMonth => "20111101",:serviceId => 'A000000000051238'})
24
+ puts result
25
+ end
26
+
16
27
  it "should raise errors if required params are not passed" do
17
28
  begin
18
29
  Billwise.new
19
30
  rescue => e
20
31
  e.to_s.should == "You must provide Billwise connection parameters."
21
32
  end
22
-
33
+
23
34
  begin
24
35
  Billwise.new({ :companyCd => 100 })
25
36
  rescue => e
26
37
  e.to_s.should == "You must provide a valid username."
27
38
  end
28
39
  end
29
-
40
+
41
+ it "should honor timeout" do
42
+ begin
43
+ Billwise.new @options.merge!({ :timeout => 1 })
44
+ rescue => e
45
+ e.to_s.should == "Timeout was reached"
46
+ end
47
+ end
48
+
30
49
  it "should find a valid customer" do
31
- result = @billwise.find_customer({ :customerCd => '000155' })
50
+ result = @billwise.find_customer_entity({ :customerCd => '000155' })
32
51
  result[:customer_cd].should == "000155"
33
52
  end
34
-
53
+
35
54
  it "should find that customers invoices" do
36
55
  result = @billwise.find_invoices({ :customerCd => '000155' })
37
56
  result[0][:invoice_number].should == "STMNT-201005"
38
57
  end
39
-
58
+
40
59
  it "should find services" do
41
60
  result = @billwise.find_services({ :customerCd => '000155',
42
- :serviceId => 'A000000000046590',
43
- :status => 'A' })
61
+ :serviceId => 'A000000000046590',
62
+ :status => 'A' })
44
63
  result[:service_id].should == 'A000000000046590'
45
64
  end
46
- end
65
+ end
@@ -1,3 +1,3 @@
1
- :companyCd: 123
1
+ :companyCd: 290
2
2
  :username: username
3
3
  :password: password