From nobody at rubyforge.org Thu Apr 17 12:32:28 2008 From: nobody at rubyforge.org (nobody at rubyforge.org) Date: Thu, 17 Apr 2008 12:32:28 -0400 (EDT) Subject: [Digitalmoney-commits] [13] trunk: Documentation improvements and minor bugfixes Message-ID: <20080417163228.D09A61858671@rubyforge.org> Revision: 13 Author: quetzal Date: 2008-04-17 12:32:28 -0400 (Thu, 17 Apr 2008) Log Message: ----------- Documentation improvements and minor bugfixes Modified Paths: -------------- trunk/README trunk/lib/digital_money/extra/requirment.rb trunk/lib/digital_money/extra/ssl_transport.rb trunk/lib/digital_money/provider.rb trunk/lib/digital_money/providers/WebMoney/webmoney_provider.rb trunk/lib/digital_money/providers/WebMoney/webmoney_response.rb trunk/lib/digital_money/providers/WebMoney/webmoney_signer.rb trunk/lib/digital_money/response.rb trunk/test/all_ts.rb trunk/test/providers/webmoney/provider_tc.rb trunk/test/providers/webmoney/response_tc.rb trunk/test/requirment_tc.rb Modified: trunk/README =================================================================== --- trunk/README 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/README 2008-04-17 16:32:28 UTC (rev 13) @@ -2,7 +2,7 @@ * *DMP* - a Digital Money Provider * *identifier* - user identifier in terms of DMP. - Please do not be confused by adentifier and account. Think about adentifier + Please do not be confused by identifier and account. Think about identifier like a some sort of passport and about account like a bank account. You can own many accounts in one bank for several currencises and purposes using only one passport, right? In terms of DMP an identifier could be UIN, @@ -10,3 +10,20 @@ * *account* - an account in terms of DMP. It could be Purse, Metal... * *requester* - an identifier of the side that performs all the requests to provider system (it's usually you and your system of course). + +== Examples + + wm = DigitalMoney::Provider.name('webmoney') + wm.ca = 'webmoney.ca' + wm.pem = 'webmoney_keeper_light.pem' + wm_identifier = DigitalMoney::Identifier.name('webmoney') + + payer = wm_identifier.new(:identifier => '000000000001') + payee = wm_identifier.new(:identifier => '000000000002', :account => 'Z000000000009') + provider = wm.new(:requester => payee, :password => 'pass_to_open_my_pem_file') + + SomeDocument.transaction + response = provider.invoice(payer, 10.5, :currency => 'wmz', :description => 'A bill for my service') + raise('Unable to process a bill') unless response.success? + document.save + end Modified: trunk/lib/digital_money/extra/requirment.rb =================================================================== --- trunk/lib/digital_money/extra/requirment.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/extra/requirment.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -10,7 +10,7 @@ mandatory_params.each do |param| if param.is_a? Array valid = param[0..-1] - unless valid.any? { |param| keys.include?(param) && !(raise_nil(param) if hash.fetch(param).nil?) } + unless valid.any? { |param| keys.include?(param) && !hash.fetch(param).nil? } raise ParameterError.new("Either of #{valid.to_sentence(:connector => 'or')} parameters must be defined") end else Modified: trunk/lib/digital_money/extra/ssl_transport.rb =================================================================== --- trunk/lib/digital_money/extra/ssl_transport.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/extra/ssl_transport.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -21,11 +21,12 @@ # # openssl pkcs12 -in file.p12 -out file.pem -nodes # - def pem=(obj) - @pem = (obj && File.file?(obj)) ? File.read(obj) : obj + + attr_accessor :pem, :ca + + def read_pem + File.file?(self.pem) ? File.read(self.pem) : self.pem end - - def pem; @pem; end end def ssl_post(url, data, headers = {}) @@ -36,14 +37,15 @@ if self.class.ssl_strict http.verify_mode = OpenSSL::SSL::VERIFY_PEER - http.ca_file = File.dirname(__FILE__) + '/../../certs/cacert.pem' + http.ca_file = self.class.ca else http.verify_mode = OpenSSL::SSL::VERIFY_NONE end unless self.class.pem.blank? - http.cert = OpenSSL::X509::Certificate.new(self.class.pem) - http.key = OpenSSL::PKey::RSA.new(self.class.pem, @password || '') + content = self.class.read_pem + http.cert = OpenSSL::X509::Certificate.new(content) + http.key = OpenSSL::PKey::RSA.new(content, @password || '') end begin Modified: trunk/lib/digital_money/provider.rb =================================================================== --- trunk/lib/digital_money/provider.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/provider.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -38,7 +38,7 @@ # Returns specific provider constant name. # This is helper for direct initialization, for example: # - # DigitalMoney::Provider.name(Webmoney).new + # DigitalMoney::Provider.name('Webmoney').new # def self.name(name) name = name.to_s.classify Modified: trunk/lib/digital_money/providers/WebMoney/webmoney_provider.rb =================================================================== --- trunk/lib/digital_money/providers/WebMoney/webmoney_provider.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/providers/WebMoney/webmoney_provider.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -20,14 +20,13 @@ # OpenSSL PEM format matching pattern PEM_MATCHER='-----BEGIN.+CERTIFICATE-----' - # Webmoney request header, it could be :classic or :light. - def self.wm_header; @wm_header; end + cattr_accessor :wm_header + def self.pem=(crt) super - @wm_header = crt.nil? ? nil : detect_header(crt) + self.wm_header = crt.blank? ? nil : self.detect_header end - self.ssl_strict = false self.homepage_url = 'http://www.wmtransfer.com/' self.display_name = 'WebMoney' self.pem ||= (ENV["WM_PEM"] || ENV["KWM"]) @@ -416,8 +415,8 @@ # * OpenSSL PEM Certificate - is for Webmoney Keeper Light. # * Anything else - is for Webmoney Keeper Classic, of course # we assuming that it's a .kwm key file content. - def self.detect_header(content) - content.grep(/#{PEM_MATCHER}/).empty? ? :classic : :light + def self.detect_header + read_pem.grep(/#{PEM_MATCHER}/).empty? ? :classic : :light end end end Modified: trunk/lib/digital_money/providers/WebMoney/webmoney_response.rb =================================================================== --- trunk/lib/digital_money/providers/WebMoney/webmoney_response.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/providers/WebMoney/webmoney_response.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -132,9 +132,9 @@ singleton_alias :each_transfer, :each return extract(node, key_map) do |data| - Clause.new(data, - :canceled => (data[:operation_type] == 12 ? true : false), - :payed => (data[:operation_type] == 0 ? true : false)) + op_type = data[:operation_type].to_i + Clause.new(data, :canceled => (op_type == 12 ? true : false), + :payed => (op_type == 0 ? true : false)) end # Interface: X4 @@ -145,9 +145,9 @@ singleton_alias :each_invoice, :each return extract(node, key_map) do |data| - Clause.new(data, - :canceled => (data[:state] == 3 ? true : false), - :payed => (data[:state] == 1 || data[:state] == 2) ? true : false) + state = data[:state].to_i + Clause.new(data, :canceled => (state == 3 ? true : false), + :payed => (state == 1 || state == 2) ? true : false) end # Interface: X6 Modified: trunk/lib/digital_money/providers/WebMoney/webmoney_signer.rb =================================================================== --- trunk/lib/digital_money/providers/WebMoney/webmoney_signer.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/providers/WebMoney/webmoney_signer.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -11,7 +11,8 @@ # ==== Arguments: # * string - a string that should be signed # TODO: - # This should be rewriten sign a strings with an external utility. + # This should be rewriten to sign strings using the internal algorithm and not an + # external utility. def sign(kwm, string) @debug_data[:string] = string signer = self.class.wm_signer Modified: trunk/lib/digital_money/response.rb =================================================================== --- trunk/lib/digital_money/response.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/lib/digital_money/response.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -28,6 +28,7 @@ attr_reader :data, :canceled, :payed alias :canceled? :canceled alias :payed? :payed + alias :completed? :payed # See description of the Clause class # ==== Arguments: Modified: trunk/test/all_ts.rb =================================================================== --- trunk/test/all_ts.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/test/all_ts.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -1,4 +1,5 @@ # Test Suite for Digital Money Library +require 'rubygems' require 'test/unit' $:.unshift File.dirname(__FILE__) Dir[(File.dirname(__FILE__) + '/*_tc.rb')].each {|tc| require tc} Modified: trunk/test/providers/webmoney/provider_tc.rb =================================================================== --- trunk/test/providers/webmoney/provider_tc.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/test/providers/webmoney/provider_tc.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -12,8 +12,10 @@ class TestWebmoneyProvider < Test::Unit::TestCase + include DigitalMoney + def setup - DigitalMoney::Webmoney::WebmoneyProvider.mode = :development + Webmoney::WebmoneyProvider.mode = :development # pseudo data @p_identifier = Acc.new(1111111111, "Z33333333333") @p_secret = "some_secret" @@ -22,42 +24,42 @@ @p_recipient = Acc.new(2222222222, "Z33333333333") @order_id = 10000 @text = 'TEST TEST TEST TEST TEST TEST' - DigitalMoney::Webmoney::WebmoneyProvider.pem = @p_pem_light - @pr = DigitalMoney::Webmoney::WebmoneyProvider.new(:requester => @p_identifier, - :password => @p_secret) + Webmoney::WebmoneyProvider.pem = @p_pem_light + @pr = Webmoney::WebmoneyProvider.new(:requester => @p_identifier, + :password => @p_secret) end def teardown - DigitalMoney::Webmoney::WebmoneyProvider.pem = nil - DigitalMoney::Webmoney::WebmoneyProvider.ssl_strict = nil - DigitalMoney::Webmoney::WebmoneyProvider.mode = :test + Webmoney::WebmoneyProvider.mode = :test end def test_provider_header_light_direct - assert_equal true, DigitalMoney::Webmoney::WebmoneyProvider.instance_eval("detect_header('#{PEM_STR}')") == :light + Webmoney::WebmoneyProvider.pem = PEM_STR + assert_equal true, Webmoney::WebmoneyProvider.instance_eval("detect_header") == :light end def test_provider_header_classic_direct - assert_equal true, DigitalMoney::Webmoney::WebmoneyProvider.instance_eval("detect_header('la-la')") == :classic + Webmoney::WebmoneyProvider.pem = 'look-like-a-file' + assert_equal true, Webmoney::WebmoneyProvider.instance_eval("detect_header") == :classic end def test_provider_header_light - DigitalMoney::Webmoney::WebmoneyProvider.pem = @p_pem_light - @prov = DigitalMoney::Webmoney::WebmoneyProvider.new(:requester => @p_identifier, - :password => @p_secret) + Webmoney::WebmoneyProvider.pem = @p_pem_light + @prov = Webmoney::WebmoneyProvider.new(:requester => @p_identifier, + :password => @p_secret) assert_equal true, @prov.class.wm_header == :light end def test_provider_header_classic - DigitalMoney::Webmoney::WebmoneyProvider.pem = @p_pem_classic - @prov = DigitalMoney::Webmoney::WebmoneyProvider.new(:requester => @p_identifier, - :password => @p_secret) + Webmoney::WebmoneyProvider.pem = @p_pem_classic + @prov = Webmoney::WebmoneyProvider.new(:requester => @p_identifier, + :password => @p_secret) assert_equal true, @prov.class.wm_header == :classic end def test_provider_wrong_light_header - @prov = DigitalMoney::Webmoney::WebmoneyProvider.new(:requester => @p_identifier, - :password => @p_secret) + @prov = Webmoney::WebmoneyProvider.new(:requester => @p_identifier, + :password => @p_secret) assert_raise OpenSSL::X509::CertificateError do @prov.invoice(@p_recipient, AMOUNT, :order_id => @order_id, :description => @text) @@ -65,9 +67,9 @@ end def test_provider_wrong_classic_header - DigitalMoney::Webmoney::WebmoneyProvider.pem = "la-la" - @prov = DigitalMoney::Webmoney::WebmoneyProvider.new(:requester => @p_identifier, - :password => @p_secret) + Webmoney::WebmoneyProvider.pem = "la-la" + @prov = Webmoney::WebmoneyProvider.new(:requester => @p_identifier, + :password => @p_secret) assert_raise ArgumentError do @prov.invoice(@p_recipient, AMOUNT, :order_id => @order_id, :description => @text) @@ -75,9 +77,9 @@ end def test_provider_nil_header - DigitalMoney::Webmoney::WebmoneyProvider.pem = nil - @prov = DigitalMoney::Webmoney::WebmoneyProvider.new(:requester => @p_identifier, - :password => @p_secret) + Webmoney::WebmoneyProvider.pem = nil + @prov = Webmoney::WebmoneyProvider.new(:requester => @p_identifier, + :password => @p_secret) assert_equal nil, @prov.class.wm_header assert_raise ArgumentError do @prov.invoice(@p_recipient, AMOUNT, :order_id => @order_id, @@ -86,9 +88,9 @@ end def test_provider_constant_available - DigitalMoney::Webmoney::WebmoneyProvider.pem = @p_pem - assert_nothing_raised { DigitalMoney::Provider::INTERVAL } - assert_nothing_raised { DigitalMoney::Webmoney::WebmoneyProvider::EXPIRATION } + Webmoney::WebmoneyProvider.pem = @p_pem + assert_nothing_raised { Provider::INTERVAL } + assert_nothing_raised { Webmoney::WebmoneyProvider::EXPIRATION } assert_nothing_raised { @pr.class::INTERVAL } assert_nothing_raised { @pr.class::EXPIRATION } end @@ -97,18 +99,18 @@ # Interfaces tests ##################################################################### def test_provider_sent_invoice_in_test_mode - DigitalMoney::Webmoney::WebmoneyProvider.mode = :test - DigitalMoney::Webmoney::WebmoneyProvider.pem = @p_pem_light + Webmoney::WebmoneyProvider.mode = :test + Webmoney::WebmoneyProvider.pem = @p_pem_light response = @pr.invoice(@p_recipient, AMOUNT, :order_id => @order_id, :description => @text) - assert_kind_of DigitalMoney::Response, response + assert_kind_of Response, response end def test_provider_sent_transfer_in_test_mode - DigitalMoney::Webmoney::WebmoneyProvider.mode = :test - DigitalMoney::Webmoney::WebmoneyProvider.pem = @p_pem_light + Webmoney::WebmoneyProvider.mode = :test + Webmoney::WebmoneyProvider.pem = @p_pem_light response = @pr.transfer(@p_recipient, AMOUNT, :trans_id => @order_id, :description => @text) - assert_kind_of DigitalMoney::Response, response + assert_kind_of Response, response end end Modified: trunk/test/providers/webmoney/response_tc.rb =================================================================== --- trunk/test/providers/webmoney/response_tc.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/test/providers/webmoney/response_tc.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -23,7 +23,7 @@ end end - def test_response_status_ok + def test_response_status_success assert_equal true, @x3.success? assert_equal true, @x7.success? assert_equal true, @x8.success? @@ -37,7 +37,7 @@ assert_kind_of Hash, @x11.header end - def test_response_body_transformed_to_array_of_Clause_instances_successfully + def test_response_body_transformed_to_array_of_clause_instances_successfully assert_kind_of Array, @x3.clauses assert_kind_of Array, @x7.clauses assert_kind_of Array, @x8.clauses @@ -98,6 +98,11 @@ assert_nil @x11.header[:num] end + def test_response_clause_attributes + assert_equal true, @x3.clauses.first.payed? + assert_equal false, @x3.clauses.first.canceled? + end + def test_response_x3_successfully_parsed_body_with_elements assert_equal true, @x3.clauses.first.data.include?(:trans_id) assert_equal true, @x3.clauses.first.data.include?(:requester_account) Modified: trunk/test/requirment_tc.rb =================================================================== --- trunk/test/requirment_tc.rb 2007-11-29 02:55:49 UTC (rev 12) +++ trunk/test/requirment_tc.rb 2008-04-17 16:32:28 UTC (rev 13) @@ -54,6 +54,12 @@ end end + def test_params_some_required_but_one_is_nil_and_second_is_not_nil + assert_nothing_raised do + required_params(@params, [:dummy, :second], :first) + end + end + def test_params_some_required_but_none_present assert_raise DigitalMoney::ParameterError do required_params(@params, [:forth, :fifth], :first)