paypal-frete-facil 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,9 +1,11 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "nokogiri"
3
+ gem "log-me", "~> 0.0.2"
4
+ gem "nokogiri", "~> 1.4.6"
4
5
 
5
6
  group :development do
6
- gem "rspec"
7
+ gem "rspec", "~> 2.6.0"
7
8
  gem "bundler", "~> 1.0.0"
8
- gem "jeweler"
9
+ gem "jeweler", "~> 1.6.2"
10
+ gem "rcov", ">= 0"
9
11
  end
@@ -7,8 +7,10 @@ GEM
7
7
  bundler (~> 1.0)
8
8
  git (>= 1.2.5)
9
9
  rake
10
+ log-me (0.0.2)
10
11
  nokogiri (1.4.6)
11
12
  rake (0.9.2)
13
+ rcov (0.9.10)
12
14
  rspec (2.6.0)
13
15
  rspec-core (~> 2.6.0)
14
16
  rspec-expectations (~> 2.6.0)
@@ -23,6 +25,8 @@ PLATFORMS
23
25
 
24
26
  DEPENDENCIES
25
27
  bundler (~> 1.0.0)
26
- jeweler
27
- nokogiri
28
- rspec
28
+ jeweler (~> 1.6.2)
29
+ log-me (~> 0.0.2)
30
+ nokogiri (~> 1.4.6)
31
+ rcov
32
+ rspec (~> 2.6.0)
@@ -1,11 +1,11 @@
1
1
  = paypal-frete-facil
2
2
 
3
- Cálculo de frete através do Frete Fácil do PayPal.
3
+ Cálculo de frete através do PayPal Frete Fácil (http://www.paypal-brasil.com.br/fretefacil/).
4
4
 
5
5
  == Instalando
6
6
 
7
7
  === Gemfile
8
- gem 'paypal-frete-facil'
8
+ gem 'paypal-frete-facil', '~> 0.1.0'
9
9
 
10
10
  === Instalação direta
11
11
  $ gem install paypal-frete-facil
@@ -22,8 +22,43 @@ Cálculo de frete através do Frete Fácil do PayPal.
22
22
  :profundidade => 30,
23
23
  :peso => 0.3
24
24
 
25
- frete.calcular # => 13.873999999999999
26
- frete.calculate # => 13.873999999999999
25
+ frete.calcular # => 13.87
26
+ frete.calculate # => 13.87
27
+
28
+
29
+ == Log
30
+
31
+ Por padrão, cada chamada ao Web Service do PayPal Frete Fácil é logada em STDOUT, usando a gem {LogMe}[http://github.com/prodis/log-me].
32
+
33
+ Para desabilitar o log ou configurar um outro mecanismo de log, você pode configurar o módulo PayPal::FreteFacil.
34
+
35
+ PayPal::FreteFacil.configure do |config|
36
+ config.log_enabled = false # Desabilita o log
37
+ config.log_level = :debug # Altera o nível do log
38
+ config.logger = Rails.logger # Usa o logger do Rails
39
+ end
40
+
41
+ Exemplo de log:
42
+ I, [2011-08-29T22:00:52.624430 #2186] INFO -- : PayPal-Frete-Facil Request:
43
+ https://ff.paypal-brasil.com.br/FretesPayPalWS/WSFretesPayPal
44
+ accept: */*
45
+ user-agent: Ruby
46
+ content-type: text/xml; charset=utf-8
47
+ soapaction: https://ff.paypal-brasil.com.br/FretesPayPalWS/WSFretesPayPal/getPreco
48
+ <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:frete="https://ff.paypal-brasil.com.br/FretesPayPalWS"><soapenv:Header /><soapenv:Body><frete:getPreco><cepOrigem>04094-050</cepOrigem><cepDestino>90619-900</cepDestino><largura>15</largura><altura>2</altura><profundidade>30</profundidade><peso>0.3</peso></frete:getPreco></soapenv:Body></soapenv:Envelope>
49
+
50
+ I, [2011-08-29T22:00:53.917895 #2186] INFO -- : PayPal-Frete-Facil Response:
51
+ HTTP/1.1 200 OK
52
+ date: Tue, 30 Aug 2011 01:00:52 GMT
53
+ server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 mod_jk/1.2.30
54
+ content-length: 271
55
+ content-type: text/xml;charset=utf-8
56
+ set-cookie: ROUTEID=.2; path=/
57
+ connection: close
58
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getPrecoResponse xmlns:ns2="https://ff.paypal-brasil.com.br/FretesPayPalWS"><return>13.873999999999999</return></ns2:getPrecoResponse></S:Body></S:Envelope>
59
+
60
+
61
+ == Informações adicionais
27
62
 
28
63
  === Maneiras de configurar atributos no construtor de Correios::Frete::Calculador
29
64
 
@@ -1,5 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  require 'rubygems'
3
+ require 'paypal/fretefacil'
3
4
  require 'paypal/fretefacil/frete'
4
5
  require 'paypal/fretefacil/parser'
5
6
  require 'paypal/fretefacil/web_service'
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+ require 'log-me'
3
+
4
+ module PayPal
5
+ module FreteFacil
6
+ extend LogMe
7
+ end
8
+ end
@@ -5,6 +5,7 @@ module PayPal
5
5
  attr_accessor :cep_origem, :cep_destino
6
6
  attr_accessor :largura, :altura, :profundidade
7
7
  attr_accessor :peso
8
+ attr_writer :web_service, :parser
8
9
 
9
10
  DEFAULT_OPTIONS = {
10
11
  :largura => 0,
@@ -5,7 +5,7 @@ module PayPal
5
5
  module FreteFacil
6
6
  class Parser
7
7
  def parse(xml)
8
- Nokogiri::XML(xml).root.elements.children.children.children.text.to_f
8
+ Nokogiri::XML(xml).xpath("//return").text.to_f.round(2)
9
9
  end
10
10
  end
11
11
  end
@@ -3,8 +3,8 @@ module PayPal
3
3
  module FreteFacil
4
4
  module Version
5
5
  MAJOR = 0
6
- MINOR = 0
7
- PATCH = 3
6
+ MINOR = 1
7
+ PATCH = 0
8
8
  VERSION = [MAJOR, MINOR, PATCH].join(".")
9
9
  end
10
10
  end
@@ -21,8 +21,7 @@ module PayPal
21
21
  request["SoapAction"] = "#{URL}/getPreco"
22
22
  request.body = request_body_for(frete)
23
23
 
24
- response = http.request(request)
25
- response.body
24
+ with_log(request) { http.request(request) }
26
25
  end
27
26
 
28
27
  private
@@ -42,6 +41,35 @@ module PayPal
42
41
  "</soapenv:Body>" +
43
42
  "</soapenv:Envelope>"
44
43
  end
44
+
45
+ def with_log(request)
46
+ PayPal::FreteFacil.log format_request_message(request)
47
+ response = yield
48
+ PayPal::FreteFacil.log format_response_message(response)
49
+ response.body
50
+ end
51
+
52
+ def format_request_message(request)
53
+ message = with_line_break { "PayPal-Frete-Facil Request:" }
54
+ message << with_line_break { URL }
55
+ message << with_line_break { format_headers_for(request) }
56
+ message << with_line_break { request.body }
57
+ end
58
+
59
+ def format_response_message(response)
60
+ message = with_line_break { "PayPal-Frete-Facil Response:" }
61
+ message << with_line_break { "HTTP/#{response.http_version} #{response.code} #{response.message}" }
62
+ message << with_line_break { format_headers_for(response) }
63
+ message << with_line_break { response.body }
64
+ end
65
+
66
+ def format_headers_for(http)
67
+ http.each_header.map { |name, value| "#{name}: #{value}" }.join("\n")
68
+ end
69
+
70
+ def with_line_break
71
+ "#{yield}\n"
72
+ end
45
73
  end
46
74
  end
47
75
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{paypal-frete-facil}
8
- s.version = "0.0.3"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Prodis a.k.a. Fernando Hamasaki"]
12
- s.date = %q{2011-08-22}
12
+ s.date = %q{2011-08-29}
13
13
  s.description = %q{Cálculo de frete utilizando o Web Service do Frete Fácil do PayPal.}
14
14
  s.email = %q{prodis@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -23,12 +23,14 @@ Gem::Specification.new do |s|
23
23
  "README.rdoc",
24
24
  "Rakefile",
25
25
  "lib/paypal-frete-facil.rb",
26
+ "lib/paypal/fretefacil.rb",
26
27
  "lib/paypal/fretefacil/frete.rb",
27
28
  "lib/paypal/fretefacil/parser.rb",
28
29
  "lib/paypal/fretefacil/version.rb",
29
30
  "lib/paypal/fretefacil/web_service.rb",
30
31
  "paypal-frete-facil.gemspec",
31
- "spec/paypal-frete-facil_spec.rb",
32
+ "spec/paypal/fretefacil/frete_spec.rb",
33
+ "spec/paypal/fretefacil/parser_spec.rb",
32
34
  "spec/spec_helper.rb"
33
35
  ]
34
36
  s.homepage = %q{http://github.com/prodis/paypal-frete-facil}
@@ -42,21 +44,27 @@ Gem::Specification.new do |s|
42
44
  s.specification_version = 3
43
45
 
44
46
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
- s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
46
- s.add_development_dependency(%q<rspec>, [">= 0"])
47
+ s.add_runtime_dependency(%q<log-me>, ["~> 0.0.2"])
48
+ s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.6"])
49
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
47
50
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
48
- s.add_development_dependency(%q<jeweler>, [">= 0"])
51
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
52
+ s.add_development_dependency(%q<rcov>, [">= 0"])
49
53
  else
50
- s.add_dependency(%q<nokogiri>, [">= 0"])
51
- s.add_dependency(%q<rspec>, [">= 0"])
54
+ s.add_dependency(%q<log-me>, ["~> 0.0.2"])
55
+ s.add_dependency(%q<nokogiri>, ["~> 1.4.6"])
56
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
52
57
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
53
- s.add_dependency(%q<jeweler>, [">= 0"])
58
+ s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
59
+ s.add_dependency(%q<rcov>, [">= 0"])
54
60
  end
55
61
  else
56
- s.add_dependency(%q<nokogiri>, [">= 0"])
57
- s.add_dependency(%q<rspec>, [">= 0"])
62
+ s.add_dependency(%q<log-me>, ["~> 0.0.2"])
63
+ s.add_dependency(%q<nokogiri>, ["~> 1.4.6"])
64
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
58
65
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
59
- s.add_dependency(%q<jeweler>, [">= 0"])
66
+ s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
67
+ s.add_dependency(%q<rcov>, [">= 0"])
60
68
  end
61
69
  end
62
70
 
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe PayPal::FreteFacil::Frete do
5
+ describe ".new" do
6
+ context "create with default value of" do
7
+ before(:each) { @frete = PayPal::FreteFacil::Frete.new }
8
+
9
+ { :largura => 0,
10
+ :altura => 0,
11
+ :profundidade => 0,
12
+ :peso => 0.0
13
+ }.each do |attr, value|
14
+ it attr do
15
+ @frete.send(attr).should == value
16
+ end
17
+ end
18
+ end
19
+
20
+ { :cep_origem => "01000-000",
21
+ :cep_destino => "021222-222",
22
+ :largura => 15,
23
+ :altura => 2,
24
+ :profundidade => 30,
25
+ :peso => 0.321,
26
+ :web_service => PayPal::FreteFacil::WebService.new,
27
+ :parser => PayPal::FreteFacil::Parser.new
28
+ }.each do |attr, value|
29
+ context "when #{attr} is supplied" do
30
+ it "sets #{attr}" do
31
+ @frete = PayPal::FreteFacil::Frete.new(attr => value)
32
+ @frete.send(attr).should == value
33
+ end
34
+ end
35
+
36
+ context "when #{attr} is supplied in a block" do
37
+ it "sets #{attr}" do
38
+ @frete = PayPal::FreteFacil::Frete.new { |f| f.send("#{attr}=", value) }
39
+ @frete.send(attr).should == value
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#calcular" do
46
+ before :each do
47
+ web_service = PayPal::FreteFacil::WebService.new
48
+ parser = PayPal::FreteFacil::Parser.new
49
+ @frete = PayPal::FreteFacil::Frete.new(:web_service => web_service, :parser => parser)
50
+
51
+ web_service.stub(:request).with(@frete).and_return('<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getPrecoResponse xmlns:ns2="https://ff.paypal-brasil.com.br/FretesPayPalWS"><return>8.19</return></ns2:getPrecoResponse></S:Body></S:Envelope>')
52
+ parser.stub(:parser).and_return(8.19)
53
+ end
54
+
55
+ it "returns shipping price" do
56
+ @frete.calcular.should == 8.19
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe PayPal::FreteFacil::Parser do
5
+ describe "#parse" do
6
+ before(:each) { @parser = PayPal::FreteFacil::Parser.new }
7
+
8
+ context "when XML is correct" do
9
+ it "returns shipping price" do
10
+ xml = """<?xml version=\"1.0\" encoding=\"UTF-8\"?>
11
+ <S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">
12
+ <S:Body>
13
+ <ns2:getPrecoResponse xmlns:ns2=\"https://ff.paypal-brasil.com.br/FretesPayPalWS\">
14
+ <return>8.19</return>
15
+ </ns2:getPrecoResponse>
16
+ </S:Body>
17
+ </S:Envelope>"""
18
+ @parser.parse(xml).should == 8.19
19
+ end
20
+
21
+ context "and shipping price has more then two decimal places" do
22
+ it "returns shipping price rounded to two decimal places" do
23
+ xml = """<?xml version=\"1.0\" encoding=\"UTF-8\"?>
24
+ <S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">
25
+ <S:Body>
26
+ <ns2:getPrecoResponse xmlns:ns2=\"https://ff.paypal-brasil.com.br/FretesPayPalWS\">
27
+ <return>8.2261234567</return>
28
+ </ns2:getPrecoResponse>
29
+ </S:Body>
30
+ </S:Envelope>"""
31
+ @parser.parse(xml).should == 8.23
32
+ end
33
+ end
34
+ end
35
+
36
+ context "when XML is not correct" do
37
+ it "returns zero" do
38
+ xml = "<error>Error message.</error>"
39
+ @parser.parse(xml).should be_zero
40
+ end
41
+ end
42
+ end
43
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: paypal-frete-facil
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Prodis a.k.a. Fernando Hamasaki
@@ -10,45 +10,67 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-08-22 00:00:00 -03:00
13
+ date: 2011-08-29 00:00:00 -03:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: nokogiri
17
+ name: log-me
18
18
  requirement: &id001 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
- - - ">="
21
+ - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: "0"
23
+ version: 0.0.2
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: *id001
27
27
  - !ruby/object:Gem::Dependency
28
- name: rspec
28
+ name: nokogiri
29
29
  requirement: &id002 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
- - - ">="
32
+ - - ~>
33
33
  - !ruby/object:Gem::Version
34
- version: "0"
35
- type: :development
34
+ version: 1.4.6
35
+ type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: *id002
38
38
  - !ruby/object:Gem::Dependency
39
- name: bundler
39
+ name: rspec
40
40
  requirement: &id003 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 1.0.0
45
+ version: 2.6.0
46
46
  type: :development
47
47
  prerelease: false
48
48
  version_requirements: *id003
49
49
  - !ruby/object:Gem::Dependency
50
- name: jeweler
50
+ name: bundler
51
51
  requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.0
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: jeweler
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: 1.6.2
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rcov
73
+ requirement: &id006 !ruby/object:Gem::Requirement
52
74
  none: false
53
75
  requirements:
54
76
  - - ">="
@@ -56,7 +78,7 @@ dependencies:
56
78
  version: "0"
57
79
  type: :development
58
80
  prerelease: false
59
- version_requirements: *id004
81
+ version_requirements: *id006
60
82
  description: "C\xC3\xA1lculo de frete utilizando o Web Service do Frete F\xC3\xA1cil do PayPal."
61
83
  email: prodis@gmail.com
62
84
  executables: []
@@ -73,12 +95,14 @@ files:
73
95
  - README.rdoc
74
96
  - Rakefile
75
97
  - lib/paypal-frete-facil.rb
98
+ - lib/paypal/fretefacil.rb
76
99
  - lib/paypal/fretefacil/frete.rb
77
100
  - lib/paypal/fretefacil/parser.rb
78
101
  - lib/paypal/fretefacil/version.rb
79
102
  - lib/paypal/fretefacil/web_service.rb
80
103
  - paypal-frete-facil.gemspec
81
- - spec/paypal-frete-facil_spec.rb
104
+ - spec/paypal/fretefacil/frete_spec.rb
105
+ - spec/paypal/fretefacil/parser_spec.rb
82
106
  - spec/spec_helper.rb
83
107
  has_rdoc: true
84
108
  homepage: http://github.com/prodis/paypal-frete-facil
@@ -1,7 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "PaypalFreteFacil" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
7
- end