correios-frete 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,10 @@
1
+ == Versão 1.0.0
2
+ - Aviso: Quebra de compatibilidade com a versão 0.3.0.
3
+ - Novo: Adicionado log de requisição e resposta do Web Service dos Correios.
4
+
1
5
  == Versão 0.3.0
2
6
  - Novo: Métodos diretos para cálculo de um serviço de frete por vez. Exemplo: Correios::Frete#calcular_sedex.
7
+
3
8
  == Versão 0.2.1
4
9
  - Melhoria: Alias Correios::Frete::Servico#sucesso? para Correios::Frete::Servico#success?
5
10
  - Melhoria: Alias Correios::Frete::Servico#erro? para Correios::Frete::Servico#error?
data/README.rdoc CHANGED
@@ -1,8 +1,13 @@
1
1
  = correios-frete
2
2
 
3
+ ---
4
+ Esta documentação é da <b>versão 1.0.0</b>.
5
+ Para a versão 0.3.0, por favor veja {README_v0.3.0.rdoc}[https://github.com/prodis/correios-frete/blob/master/README_v0.3.0.rdoc]
6
+ ---
7
+
3
8
  Cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).
4
9
 
5
- Serviços de frete suportados são PAC, SEDEX, SEDEX 10, SEDEX Hoje e e-SEDEX (necessário informar código de empresa e senha).
10
+ Os serviços de frete suportados são PAC, SEDEX, SEDEX 10, SEDEX Hoje e e-SEDEX (necessário informar código de empresa e senha).
6
11
 
7
12
  == Instalando
8
13
 
@@ -17,12 +22,12 @@ Serviços de frete suportados são PAC, SEDEX, SEDEX 10, SEDEX Hoje e e-SEDEX (n
17
22
 
18
23
  require 'correios-frete'
19
24
 
20
- frete = Correios::Frete.new :cep_origem => "04094-050",
21
- :cep_destino => "90619-900",
22
- :peso => 0.3,
23
- :comprimento => 30,
24
- :largura => 15,
25
- :altura => 2
25
+ frete = Correios::Frete::Calculador.new :cep_origem => "04094-050",
26
+ :cep_destino => "90619-900",
27
+ :peso => 0.3,
28
+ :comprimento => 30,
29
+ :largura => 15,
30
+ :altura => 2
26
31
 
27
32
  Cálculo de vários serviços ao mesmo tempo:
28
33
 
@@ -72,6 +77,17 @@ Usando a interface pública em inglês:
72
77
  servico.success? # => true
73
78
  servico.error? # => false
74
79
 
80
+ == Log
81
+
82
+ Por padrão, cada chamada ao Web Service dos Correios é logada usando STDOUT.
83
+
84
+ Para desabilitar o log ou configurar um outro mecanismo de log, você pode configurar o módulo Correios::Frete.
85
+
86
+ Correios::Frete.configure do |config|
87
+ config.log_enabled = false # Desabilita o log
88
+ config.logger = Rails.logger # Usa o logger do Rails
89
+ end
90
+
75
91
  == Informações adicionais
76
92
 
77
93
  === Serviços suportados
@@ -82,18 +98,18 @@ Usando a interface pública em inglês:
82
98
  :e_sedex
83
99
 
84
100
 
85
- === Maneiras de configurar atributos no construtor de Correios::Frete
101
+ === Maneiras de configurar atributos no construtor de Correios::Frete::Calculador
86
102
 
87
103
  ==== Com um hash
88
- frete = Correios::Frete.new :cep_origem => "04094-050",
89
- :cep_destino => "90619-900",
90
- :peso => 0.3,
91
- :comprimento => 30,
92
- :largura => 15,
93
- :altura => 2
104
+ frete = Correios::Frete::Calculador.new :cep_origem => "04094-050",
105
+ :cep_destino => "90619-900",
106
+ :peso => 0.3,
107
+ :comprimento => 30,
108
+ :largura => 15,
109
+ :altura => 2
94
110
 
95
111
  ==== Com um bloco
96
- frete = Correios::Frete.new do |f|
112
+ frete = Correios::Frete::Calculador.new do |f|
97
113
  f.cep_origem = "04094-050"
98
114
  f.cep_destino = "90619-900"
99
115
  f.peso = 0.3
@@ -103,7 +119,7 @@ Usando a interface pública em inglês:
103
119
  end
104
120
 
105
121
 
106
- === Atributos de Correios::Frete
122
+ === Atributos de Correios::Frete::Calculador
107
123
 
108
124
  ==== String
109
125
  cep_origem, cep_destino, codigo_empresa, senha
@@ -134,7 +150,7 @@ Usando a interface pública em inglês:
134
150
 
135
151
  (The MIT License)
136
152
 
137
- {Prodis a.k.a. Fernando Hamasaki de Amorim}[http://prodis.blog.br]
153
+ {Prodis a.k.a. Fernando Hamasaki}[http://prodis.blog.br]
138
154
 
139
155
  Copyright (c) 2011 Prodis
140
156
 
@@ -0,0 +1,164 @@
1
+ = correios-frete
2
+
3
+ ---
4
+ Esta documentação é da <b>versão 0.3.0</b>.
5
+ Para a versão 1.0.0 ou acima, por favor veja {README.rdoc}[https://github.com/prodis/correios-frete/blob/master/README.rdoc]
6
+ ---
7
+
8
+ Cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).
9
+
10
+ Os serviços de frete suportados são PAC, SEDEX, SEDEX 10, SEDEX Hoje e e-SEDEX (necessário informar código de empresa e senha).
11
+
12
+ == Instalando
13
+
14
+ === Gemfile
15
+ gem 'correios-frete'
16
+
17
+ === Instalação direta
18
+ $ gem install correios-frete
19
+
20
+
21
+ == Usando
22
+
23
+ require 'correios-frete'
24
+
25
+ frete = Correios::Frete.new :cep_origem => "04094-050",
26
+ :cep_destino => "90619-900",
27
+ :peso => 0.3,
28
+ :comprimento => 30,
29
+ :largura => 15,
30
+ :altura => 2
31
+
32
+ Cálculo de vários serviços ao mesmo tempo:
33
+
34
+ servicos = frete.calcular :sedex, :pac
35
+
36
+ servicos[:sedex].nome # => "SEDEX"
37
+ servicos[:sedex].valor # => 26.2
38
+ servicos[:sedex].prazo_entrega # => 1
39
+
40
+ servicos[:pac].nome # => "PAC"
41
+ servicos[:pac].valor # => 10.0
42
+ servicos[:pac].prazo_entrega # => 5
43
+
44
+ Cálculo de um serviço de frete passando o serviço para parâmetro:
45
+
46
+ servico = frete.calcular :sedex
47
+ service.nome # => "SEDEX"
48
+ servico.valor # => 26.2
49
+ servico.prazo_entrega # => 1
50
+
51
+ servico = frete.calcular :pac
52
+ service.nome # => "PAC"
53
+ servico.valor # => 10.0
54
+ servico.prazo_entrega # => 5
55
+
56
+ Cálculo de um serviço de frete chamando o método direto do serviço:
57
+
58
+ servico = frete.calcular_sedex
59
+ service.nome # => "SEDEX"
60
+ servico.valor # => 26.2
61
+ servico.prazo_entrega # => 1
62
+
63
+ servico = frete.calcular_pac
64
+ service.nome # => "PAC"
65
+ servico.valor # => 10.0
66
+ servico.prazo_entrega # => 5
67
+
68
+ Verificação de sucesso e erro:
69
+
70
+ servico = frete.calcular_sedex
71
+ servico.sucesso? # => true
72
+ servico.erro? # => false
73
+
74
+ Usando a interface pública em inglês:
75
+
76
+ servico = frete.calculate_sedex
77
+ servico.success? # => true
78
+ servico.error? # => false
79
+
80
+ == Informações adicionais
81
+
82
+ === Serviços suportados
83
+ :pac
84
+ :sedex
85
+ :sedex_10
86
+ :sedex_hoje
87
+ :e_sedex
88
+
89
+
90
+ === Maneiras de configurar atributos no construtor de Correios::Frete
91
+
92
+ ==== Com um hash
93
+ frete = Correios::Frete.new :cep_origem => "04094-050",
94
+ :cep_destino => "90619-900",
95
+ :peso => 0.3,
96
+ :comprimento => 30,
97
+ :largura => 15,
98
+ :altura => 2
99
+
100
+ ==== Com um bloco
101
+ frete = Correios::Frete.new do |f|
102
+ f.cep_origem = "04094-050"
103
+ f.cep_destino = "90619-900"
104
+ f.peso = 0.3
105
+ f.comprimento = 30
106
+ f.largura = 15
107
+ f.altura = 2
108
+ end
109
+
110
+
111
+ === Atributos de Correios::Frete
112
+
113
+ ==== String
114
+ cep_origem, cep_destino, codigo_empresa, senha
115
+ ==== Float
116
+ peso, valor_declarado
117
+ ==== Fixnum
118
+ comprimento, largura, altura, diametro
119
+ ==== Boolean
120
+ mao_propria, aviso_recebimento
121
+ ==== Symbol
122
+ formato (:caixa_pacote, :rolo_prisma)
123
+
124
+
125
+ === Atributos de Correios::Frete::Servico
126
+
127
+ ==== String
128
+ codigo, erro, msg_erro, nome
129
+ ==== Float
130
+ valor, valor_mao_propria, valor_aviso_recebimento, valor_valor_declarado
131
+ ==== Fixnum
132
+ prazo_entrega
133
+ ==== Boolean
134
+ entrega_domiciliar, entrega_sabado
135
+ ==== Symbol
136
+ tipo (:pac, :sedex, :sedex_10, :sedex_hoje, :e_sedex)
137
+
138
+ == Copyright
139
+
140
+ (The MIT License)
141
+
142
+ {Prodis a.k.a. Fernando Hamasaki}[http://prodis.blog.br]
143
+
144
+ Copyright (c) 2011 Prodis
145
+
146
+ Permission is hereby granted, free of charge, to any person obtaining
147
+ a copy of this software and associated documentation files (the
148
+ "Software"), to deal in the Software without restriction, including
149
+ without limitation the rights to use, copy, modify, merge, publish,
150
+ distribute, sublicense, and/or sell copies of the Software, and to
151
+ permit persons to whom the Software is furnished to do so, subject to
152
+ the following conditions:
153
+
154
+ The above copyright notice and this permission notice shall be
155
+ included in all copies or substantial portions of the Software.
156
+
157
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
158
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
159
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
160
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
161
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
162
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
163
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
164
+
data/Rakefile CHANGED
@@ -20,8 +20,8 @@ Jeweler::Tasks.new do |gem|
20
20
  gem.summary = %Q{Cálculo de frete dos Correios.}
21
21
  gem.description = %Q{Cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices). Serviços de frete suportados são PAC, SEDEX, SEDEX 10, SEDEX Hoje e e-SEDEX (necessário informar código de empresa e senha).}
22
22
  gem.email = "prodis@gmail.com"
23
- gem.authors = ["Prodis a.k.a. Fernando Hamasaki de Amorim"]
24
- gem.version = Correios::Frete::Version::STRING
23
+ gem.authors = ["Prodis a.k.a. Fernando Hamasaki"]
24
+ gem.version = Correios::Frete::Version::VERSION
25
25
  # dependencies defined in Gemfile
26
26
  end
27
27
  Jeweler::RubygemsDotOrgTasks.new
@@ -5,15 +5,16 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{correios-frete}
8
- s.version = "0.3.0"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Prodis a.k.a. Fernando Hamasaki de Amorim"]
12
- s.date = %q{2011-08-02}
11
+ s.authors = ["Prodis a.k.a. Fernando Hamasaki"]
12
+ s.date = %q{2011-08-10}
13
13
  s.description = %q{Cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices). Serviços de frete suportados são PAC, SEDEX, SEDEX 10, SEDEX Hoje e e-SEDEX (necessário informar código de empresa e senha).}
14
14
  s.email = %q{prodis@gmail.com}
15
15
  s.extra_rdoc_files = [
16
- "README.rdoc"
16
+ "README.rdoc",
17
+ "README_v0.3.0.rdoc"
17
18
  ]
18
19
  s.files = [
19
20
  ".document",
@@ -22,14 +23,18 @@ Gem::Specification.new do |s|
22
23
  "Gemfile",
23
24
  "Gemfile.lock",
24
25
  "README.rdoc",
26
+ "README_v0.3.0.rdoc",
25
27
  "Rakefile",
26
28
  "correios-frete.gemspec",
27
29
  "lib/correios-frete.rb",
28
30
  "lib/correios/frete.rb",
31
+ "lib/correios/frete/calculador.rb",
32
+ "lib/correios/frete/logger.rb",
29
33
  "lib/correios/frete/parser.rb",
30
34
  "lib/correios/frete/servico.rb",
31
35
  "lib/correios/frete/version.rb",
32
36
  "lib/correios/frete/web_service.rb",
37
+ "spec/correios/frete/calculador_spec.rb",
33
38
  "spec/correios/frete/parser_spec.rb",
34
39
  "spec/correios/frete/servico_spec.rb",
35
40
  "spec/correios/frete/web_service_spec.rb",
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  require 'rubygems'
3
3
  require 'correios/frete'
4
+ require 'correios/frete/calculador'
4
5
  require 'correios/frete/parser'
5
6
  require 'correios/frete/servico'
6
7
  require 'correios/frete/web_service'
@@ -1,58 +1,12 @@
1
1
  # encoding: UTF-8
2
- module Correios
3
- class Frete
4
- attr_accessor :cep_origem, :cep_destino
5
- attr_accessor :peso, :comprimento, :altura, :largura, :diametro
6
- attr_accessor :formato, :mao_propria, :aviso_recebimento, :valor_declarado
7
- attr_accessor :codigo_empresa, :senha
8
- attr_writer :web_service, :parser
9
-
10
- DEFAULT_OPTIONS = {
11
- :peso => 0.0,
12
- :comprimento => 0.0,
13
- :altura => 0.0,
14
- :largura => 0.0,
15
- :diametro => 0.0,
16
- :formato => :caixa_pacote,
17
- :mao_propria => false,
18
- :aviso_recebimento => false,
19
- :valor_declarado => 0.0
20
- }
2
+ require 'correios/frete/logger'
21
3
 
22
- def initialize(options = {})
23
- DEFAULT_OPTIONS.merge(options).each do |attr, value|
24
- self.send("#{attr}=", value)
25
- end
4
+ module Correios
5
+ module Frete
6
+ extend Logger
26
7
 
8
+ def self.configure
27
9
  yield self if block_given?
28
10
  end
29
-
30
- def web_service
31
- @web_service ||= Correios::Frete::WebService.new
32
- end
33
-
34
- def parser
35
- @parser ||= Correios::Frete::Parser.new
36
- end
37
-
38
- def calcular(*service_types)
39
- response = web_service.request(self, service_types)
40
- services = parser.servicos(response)
41
-
42
- if service_types.size == 1
43
- services.values.first
44
- else
45
- services
46
- end
47
- end
48
-
49
- alias calculate calcular
50
-
51
- private
52
-
53
- def method_missing(method_name, *args)
54
- return calcular($2.to_sym) if method_name.to_s =~ /^(calcular|calculate)_(.*)/ && Correios::Frete::Servico.code_from_type($2.to_sym)
55
- super
56
- end
57
11
  end
58
12
  end
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+ module Correios
3
+ module Frete
4
+ class Calculador
5
+ attr_accessor :cep_origem, :cep_destino
6
+ attr_accessor :peso, :comprimento, :altura, :largura, :diametro
7
+ attr_accessor :formato, :mao_propria, :aviso_recebimento, :valor_declarado
8
+ attr_accessor :codigo_empresa, :senha
9
+ attr_writer :web_service, :parser
10
+
11
+ DEFAULT_OPTIONS = {
12
+ :peso => 0.0,
13
+ :comprimento => 0.0,
14
+ :altura => 0.0,
15
+ :largura => 0.0,
16
+ :diametro => 0.0,
17
+ :formato => :caixa_pacote,
18
+ :mao_propria => false,
19
+ :aviso_recebimento => false,
20
+ :valor_declarado => 0.0
21
+ }
22
+
23
+ def initialize(options = {})
24
+ DEFAULT_OPTIONS.merge(options).each do |attr, value|
25
+ self.send("#{attr}=", value)
26
+ end
27
+
28
+ yield self if block_given?
29
+ end
30
+
31
+ def web_service
32
+ @web_service ||= Correios::Frete::WebService.new
33
+ end
34
+
35
+ def parser
36
+ @parser ||= Correios::Frete::Parser.new
37
+ end
38
+
39
+ def calcular(*service_types)
40
+ response = web_service.request(self, service_types)
41
+ services = parser.servicos(response)
42
+
43
+ if service_types.size == 1
44
+ services.values.first
45
+ else
46
+ services
47
+ end
48
+ end
49
+
50
+ alias calculate calcular
51
+
52
+ private
53
+
54
+ def method_missing(method_name, *args)
55
+ return calcular($2.to_sym) if method_name.to_s =~ /^(calcular|calculate)_(.*)/ && Correios::Frete::Servico.code_from_type($2.to_sym)
56
+ super
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+ require 'logger'
3
+
4
+ module Correios
5
+ module Frete
6
+ module Logger
7
+ attr_writer :log_enabled
8
+ attr_writer :logger
9
+
10
+ def log_enabled?
11
+ @log_enabled != false
12
+ end
13
+
14
+ def logger
15
+ @logger ||= ::Logger.new STDOUT
16
+ end
17
+
18
+ def log(message)
19
+ logger.info(message) if log_enabled?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,15 +1,19 @@
1
1
  # encoding: UTF-8
2
2
  require 'nokogiri'
3
3
 
4
- class Correios::Frete::Parser
5
- def servicos(xml)
6
- servicos = {}
4
+ module Correios
5
+ module Frete
6
+ class Parser
7
+ def servicos(xml)
8
+ servicos = {}
7
9
 
8
- Nokogiri::XML(xml).root.elements.each do |element|
9
- servico = Correios::Frete::Servico.new.parse(element.to_xml)
10
- servicos[servico.tipo] = servico
11
- end
10
+ Nokogiri::XML(xml).root.elements.each do |element|
11
+ servico = Correios::Frete::Servico.new.parse(element.to_xml)
12
+ servicos[servico.tipo] = servico
13
+ end
12
14
 
13
- servicos
15
+ servicos
16
+ end
17
+ end
14
18
  end
15
19
  end
@@ -1,77 +1,81 @@
1
1
  # encoding: UTF-8
2
2
  require 'sax-machine'
3
3
 
4
- class Correios::Frete::Servico
5
- include SAXMachine
4
+ module Correios
5
+ module Frete
6
+ class Servico
7
+ include SAXMachine
6
8
 
7
- AVAILABLE_SERVICES = {
8
- "41106" => { :type => :pac , :name => "PAC" },
9
- "40010" => { :type => :sedex , :name => "SEDEX" },
10
- "40215" => { :type => :sedex_10 , :name => "SEDEX 10" },
11
- "40290" => { :type => :sedex_hoje, :name => "SEDEX Hoje" },
12
- "81019" => { :type => :e_sedex , :name => "e-SEDEX" }
13
- }
9
+ AVAILABLE_SERVICES = {
10
+ "41106" => { :type => :pac , :name => "PAC" },
11
+ "40010" => { :type => :sedex , :name => "SEDEX" },
12
+ "40215" => { :type => :sedex_10 , :name => "SEDEX 10" },
13
+ "40290" => { :type => :sedex_hoje, :name => "SEDEX Hoje" },
14
+ "81019" => { :type => :e_sedex , :name => "e-SEDEX" }
15
+ }
14
16
 
15
- element :Codigo, :as => :codigo
16
- element :Valor, :as => :valor
17
- element :PrazoEntrega, :as => :prazo_entrega
18
- element :ValorMaoPropria, :as => :valor_mao_propria
19
- element :ValorAvisoRecebimento, :as => :valor_aviso_recebimento
20
- element :ValorValorDeclarado, :as => :valor_valor_declarado
21
- element :EntregaDomiciliar, :as => :entrega_domiciliar
22
- element :EntregaSabado, :as => :entrega_sabado
23
- element :Erro, :as => :erro
24
- element :MsgErro, :as => :msg_erro
25
- attr_reader :tipo, :nome
17
+ element :Codigo, :as => :codigo
18
+ element :Valor, :as => :valor
19
+ element :PrazoEntrega, :as => :prazo_entrega
20
+ element :ValorMaoPropria, :as => :valor_mao_propria
21
+ element :ValorAvisoRecebimento, :as => :valor_aviso_recebimento
22
+ element :ValorValorDeclarado, :as => :valor_valor_declarado
23
+ element :EntregaDomiciliar, :as => :entrega_domiciliar
24
+ element :EntregaSabado, :as => :entrega_sabado
25
+ element :Erro, :as => :erro
26
+ element :MsgErro, :as => :msg_erro
27
+ attr_reader :tipo, :nome
26
28
 
27
- alias_method :original_parse, :parse
29
+ alias_method :original_parse, :parse
28
30
 
29
- def parse(xml_text)
30
- original_parse xml_text
31
+ def parse(xml_text)
32
+ original_parse xml_text
31
33
 
32
- if AVAILABLE_SERVICES[codigo]
33
- @tipo = AVAILABLE_SERVICES[codigo][:type]
34
- @nome = AVAILABLE_SERVICES[codigo][:name]
35
- end
34
+ if AVAILABLE_SERVICES[codigo]
35
+ @tipo = AVAILABLE_SERVICES[codigo][:type]
36
+ @nome = AVAILABLE_SERVICES[codigo][:name]
37
+ end
36
38
 
37
- cast_to_float! :valor, :valor_mao_propria, :valor_aviso_recebimento, :valor_valor_declarado
38
- cast_to_int! :prazo_entrega
39
- cast_to_boolean! :entrega_domiciliar, :entrega_sabado
40
- self
41
- end
39
+ cast_to_float! :valor, :valor_mao_propria, :valor_aviso_recebimento, :valor_valor_declarado
40
+ cast_to_int! :prazo_entrega
41
+ cast_to_boolean! :entrega_domiciliar, :entrega_sabado
42
+ self
43
+ end
42
44
 
43
- def success?
44
- erro == "0"
45
- end
46
- alias sucesso? success?
45
+ def success?
46
+ erro == "0"
47
+ end
48
+ alias sucesso? success?
47
49
 
48
- def error?
49
- !success?
50
- end
51
- alias erro? error?
50
+ def error?
51
+ !success?
52
+ end
53
+ alias erro? error?
52
54
 
53
- def self.code_from_type(type)
54
- # I don't use select method for Ruby 1.8.7 compatibility.
55
- AVAILABLE_SERVICES.map { |key, value| key if value[:type] == type }.compact.first
56
- end
55
+ def self.code_from_type(type)
56
+ # I don't use select method for Ruby 1.8.7 compatibility.
57
+ AVAILABLE_SERVICES.map { |key, value| key if value[:type] == type }.compact.first
58
+ end
57
59
 
58
- private
60
+ private
59
61
 
60
- def cast_to_float!(*attributes)
61
- attributes.each do |attr|
62
- instance_variable_set("@#{attr}", send(attr).to_s.gsub("," ,".").to_f)
63
- end
64
- end
62
+ def cast_to_float!(*attributes)
63
+ attributes.each do |attr|
64
+ instance_variable_set("@#{attr}", send(attr).to_s.gsub("," ,".").to_f)
65
+ end
66
+ end
65
67
 
66
- def cast_to_int!(*attributes)
67
- attributes.each do |attr|
68
- instance_variable_set("@#{attr}", send(attr).to_i)
69
- end
70
- end
68
+ def cast_to_int!(*attributes)
69
+ attributes.each do |attr|
70
+ instance_variable_set("@#{attr}", send(attr).to_i)
71
+ end
72
+ end
71
73
 
72
- def cast_to_boolean!(*attributes)
73
- attributes.each do |attr|
74
- instance_variable_set("@#{attr}", send(attr) == "S")
74
+ def cast_to_boolean!(*attributes)
75
+ attributes.each do |attr|
76
+ instance_variable_set("@#{attr}", send(attr) == "S")
77
+ end
78
+ end
75
79
  end
76
80
  end
77
81
  end
@@ -2,10 +2,10 @@
2
2
  module Correios
3
3
  module Frete
4
4
  module Version
5
- MAJOR = 0
6
- MINOR = 3
5
+ MAJOR = 1
6
+ MINOR = 0
7
7
  PATCH = 0
8
- STRING = [MAJOR, MINOR, PATCH].join(".")
8
+ VERSION = [MAJOR, MINOR, PATCH].join(".")
9
9
  end
10
10
  end
11
11
  end
@@ -2,36 +2,55 @@
2
2
  require 'net/http'
3
3
  require 'uri'
4
4
 
5
- class Correios::Frete::WebService
6
- URL = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx"
7
- FORMATS = { :caixa_pacote => 1, :rolo_prisma => 2 }
8
- CONDITIONS = { true => "S", false => "N" }
5
+ module Correios
6
+ module Frete
7
+ class WebService
8
+ URL = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx"
9
+ FORMATS = { :caixa_pacote => 1, :rolo_prisma => 2 }
10
+ CONDITIONS = { true => "S", false => "N" }
9
11
 
10
- def request(frete, service_types)
11
- Net::HTTP.get(URI.parse("#{URL}?#{params_for(frete, service_types)}"))
12
- end
12
+ def request(frete, service_types)
13
+ @url = "#{URL}?#{params_for(frete, service_types)}"
14
+ with_log { Net::HTTP.get_response URI.parse(@url) }
15
+ end
13
16
 
14
- private
17
+ private
15
18
 
16
- def params_for(frete, service_types)
17
- "sCepOrigem=#{frete.cep_origem}&" +
18
- "sCepDestino=#{frete.cep_destino}&" +
19
- "nVlPeso=#{frete.peso}&" +
20
- "nVlComprimento=#{frete.comprimento}&" +
21
- "nVlAltura=#{frete.altura}&" +
22
- "nVlLargura=#{frete.largura}&" +
23
- "nVlDiametro=#{frete.diametro}&" +
24
- "nCdFormato=#{FORMATS[frete.formato]}&" +
25
- "sCdMaoPropria=#{CONDITIONS[frete.mao_propria]}&" +
26
- "sCdAvisoRecebimento=#{CONDITIONS[frete.aviso_recebimento]}&" +
27
- "nVlValorDeclarado=#{frete.valor_declarado}&" +
28
- "nCdServico=#{service_codes_for(service_types)}&" +
29
- "nCdEmpresa=#{frete.codigo_empresa}&" +
30
- "sDsSenha=#{frete.senha}&" +
31
- "StrRetorno=xml"
32
- end
19
+ def params_for(frete, service_types)
20
+ "sCepOrigem=#{frete.cep_origem}&" +
21
+ "sCepDestino=#{frete.cep_destino}&" +
22
+ "nVlPeso=#{frete.peso}&" +
23
+ "nVlComprimento=#{frete.comprimento}&" +
24
+ "nVlAltura=#{frete.altura}&" +
25
+ "nVlLargura=#{frete.largura}&" +
26
+ "nVlDiametro=#{frete.diametro}&" +
27
+ "nCdFormato=#{FORMATS[frete.formato]}&" +
28
+ "sCdMaoPropria=#{CONDITIONS[frete.mao_propria]}&" +
29
+ "sCdAvisoRecebimento=#{CONDITIONS[frete.aviso_recebimento]}&" +
30
+ "nVlValorDeclarado=#{frete.valor_declarado}&" +
31
+ "nCdServico=#{service_codes_for(service_types)}&" +
32
+ "nCdEmpresa=#{frete.codigo_empresa}&" +
33
+ "sDsSenha=#{frete.senha}&" +
34
+ "StrRetorno=xml"
35
+ end
36
+
37
+ def service_codes_for(service_types)
38
+ service_types.map { |type| Correios::Frete::Servico.code_from_type(type) }.join(",")
39
+ end
40
+
41
+ def with_log
42
+ Correios::Frete.log "Correios-Frete Request:\n#{@url}"
43
+ response = yield
44
+ Correios::Frete.log format_response_message(response)
45
+ response.body
46
+ end
33
47
 
34
- def service_codes_for(service_types)
35
- service_types.map { |type| Correios::Frete::Servico.code_from_type(type) }.join(",")
48
+ def format_response_message(response)
49
+ message = "Correios-Frete Response:\n"
50
+ message << "HTTP/#{response.http_version} #{response.code} #{response.message}\n"
51
+ response.each_header { |header| message << "#{header}: #{response[header]}\n" }
52
+ message << response.body
53
+ end
54
+ end
36
55
  end
37
56
  end
@@ -0,0 +1,120 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe Correios::Frete::Calculador do
5
+ describe ".new" do
6
+ context "create with default value of" do
7
+ before(:each) { @frete = Correios::Frete::Calculador.new }
8
+
9
+ { :peso => 0.0,
10
+ :comprimento => 0.0,
11
+ :altura => 0.0,
12
+ :largura => 0.0,
13
+ :diametro => 0.0,
14
+ :formato => :caixa_pacote,
15
+ :mao_propria => false,
16
+ :aviso_recebimento => false,
17
+ :valor_declarado => 0.0
18
+ }.each do |attr, value|
19
+ it attr do
20
+ @frete.send(attr).should == value
21
+ end
22
+ end
23
+ end
24
+
25
+ { :cep_origem => "01000-000",
26
+ :cep_destino => "021222-222",
27
+ :peso => 0.321,
28
+ :comprimento => 12.5,
29
+ :altura => 1.4,
30
+ :largura => 4.6,
31
+ :diametro => 5.0,
32
+ :formato => :rolo_prisma,
33
+ :mao_propria => true,
34
+ :aviso_recebimento => true,
35
+ :valor_declarado => 1.99,
36
+ :codigo_empresa => "1234567890",
37
+ :senha => "senha",
38
+ :web_service => Correios::Frete::WebService.new,
39
+ :parser => Correios::Frete::Parser.new
40
+ }.each do |attr, value|
41
+ context "when #{attr} is supplied" do
42
+ it "sets #{attr}" do
43
+ @frete = Correios::Frete::Calculador.new(attr => value)
44
+ @frete.send(attr).should == value
45
+ end
46
+ end
47
+
48
+ context "when #{attr} is supplied in a block" do
49
+ it "sets #{attr}" do
50
+ @frete = Correios::Frete::Calculador.new { |f| f.send("#{attr}=", value) }
51
+ @frete.send(attr).should == value
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ describe "#calcular" do
58
+ before :each do
59
+ @web_service = Correios::Frete::WebService.new
60
+ @parser = Correios::Frete::Parser.new
61
+ @frete = Correios::Frete::Calculador.new(:web_service => @web_service, :parser => @parser)
62
+ end
63
+
64
+ context "to many services" do
65
+ before :each do
66
+ @xml = '<?xml version="1.0" encoding="ISO-8859-1" ?><Servicos><cServico><Codigo>41106</Codigo><Valor>15,70</Valor><PrazoEntrega>3</PrazoEntrega><ValorMaoPropria>3,70</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>1,50</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>N</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro></cServico><cServico><Codigo>40010</Codigo><Valor>17,80</Valor><PrazoEntrega>1</PrazoEntrega><ValorMaoPropria>3,70</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>1,50</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>S</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro></cServico></Servicos>'
67
+ @servicos = { :pac => Correios::Frete::Servico.new, :sedex => Correios::Frete::Servico.new }
68
+
69
+ @parser.stub(:servicos).and_return(@servicos)
70
+ @web_service.stub(:request).with(@frete, [:pac, :sedex]).and_return(@xml)
71
+ end
72
+
73
+ it "returns all services" do
74
+ @frete.calcular(:pac, :sedex).should == @servicos
75
+ end
76
+ end
77
+
78
+ context "to one service" do
79
+ before :each do
80
+ @xml = '<?xml version="1.0" encoding="ISO-8859-1" ?><cServico><Codigo>40010</Codigo><Valor>17,80</Valor><PrazoEntrega>1</PrazoEntrega><ValorMaoPropria>3,70</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>1,50</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>S</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro></cServico></Servicos>'
81
+ @servico = Correios::Frete::Servico.new
82
+
83
+ @parser.stub(:servicos).and_return(:sedex => @servico)
84
+ @web_service.stub(:request).with(@frete, [:sedex]).and_return(@xml)
85
+ end
86
+
87
+ it "returns only one service" do
88
+ @frete.calcular(:sedex).should == @servico
89
+ end
90
+ end
91
+ end
92
+
93
+ ["calcular", "calculate"].each do |method_name|
94
+ Correios::Frete::Servico::AVAILABLE_SERVICES.each do |key, service|
95
+ describe "##{method_name}_#{service[:type]}" do
96
+ before :each do
97
+ web_service = Correios::Frete::WebService.new
98
+ parser = Correios::Frete::Parser.new
99
+ @frete = Correios::Frete::Calculador.new(:web_service => web_service, :parser => parser)
100
+ @servico = Correios::Frete::Servico.new
101
+
102
+ parser.stub(:servicos).and_return(service[:type] => @servico)
103
+ web_service.stub(:request).with(@frete, [service[:type]]).and_return("XML")
104
+ end
105
+
106
+ it "calculates #{service[:name]}" do
107
+ @frete.send("#{method_name}_#{service[:type]}").should == @servico
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "##{method_name}_servico_que_nao_existe" do
113
+ before(:each) { @frete = Correios::Frete::Calculador.new }
114
+
115
+ it "raises NoMethodError" do
116
+ expect { @frete.send("#{method_name}_servico_que_nao_existe") }.to raise_error(NoMethodError)
117
+ end
118
+ end
119
+ end
120
+ end
@@ -4,19 +4,20 @@ require 'spec_helper'
4
4
  describe Correios::Frete::WebService do
5
5
  describe "#request" do
6
6
  before :each do
7
- @frete = Correios::Frete.new :cep_origem => "01000-000",
8
- :cep_destino => "021222-222",
9
- :peso => 0.321,
10
- :comprimento => 12.5,
11
- :altura => 1.4,
12
- :largura => 4.6,
13
- :diametro => 5.0,
14
- :formato => :rolo_prisma,
15
- :mao_propria => true,
16
- :aviso_recebimento => false,
17
- :valor_declarado => 1.99,
18
- :codigo_empresa => "1234567890",
19
- :senha => "senha"
7
+ @frete = Correios::Frete::Calculador.new :cep_origem => "01000-000",
8
+ :cep_destino => "021222-222",
9
+ :peso => 0.321,
10
+ :comprimento => 12.5,
11
+ :altura => 1.4,
12
+ :largura => 4.6,
13
+ :diametro => 5.0,
14
+ :formato => :rolo_prisma,
15
+ :mao_propria => true,
16
+ :aviso_recebimento => false,
17
+ :valor_declarado => 1.99,
18
+ :codigo_empresa => "1234567890",
19
+ :senha => "senha"
20
+
20
21
  url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?" +
21
22
  "sCepOrigem=01000-000&" +
22
23
  "sCepDestino=021222-222&" +
@@ -33,10 +34,20 @@ describe Correios::Frete::WebService do
33
34
  "nCdEmpresa=1234567890&" +
34
35
  "sDsSenha=senha&" +
35
36
  "StrRetorno=xml"
36
- Net::HTTP.stub(:get).with(URI.parse(url)).and_return("<xml><fake></fake>")
37
+
38
+ response = Net::HTTPOK.new nil, 200, "OK"
39
+ response.stub(:body).and_return("<xml><fake></fake>")
40
+ Net::HTTP.stub(:get_response).with(URI.parse(url)).and_return(response)
41
+
37
42
  @web_service = Correios::Frete::WebService.new
38
43
  end
39
44
 
45
+ around do |example|
46
+ Correios::Frete.configure { |config| config.log_enabled = false }
47
+ example.run
48
+ Correios::Frete.configure { |config| config.log_enabled = true }
49
+ end
50
+
40
51
  it "returns XML response" do
41
52
  @web_service.request(@frete, [:pac, :sedex]).should == "<xml><fake></fake>"
42
53
  end
@@ -2,118 +2,61 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Correios::Frete do
5
- describe ".new" do
6
- context "create with default value of" do
7
- before(:each) { @frete = Correios::Frete.new }
8
-
9
- { :peso => 0.0,
10
- :comprimento => 0.0,
11
- :altura => 0.0,
12
- :largura => 0.0,
13
- :diametro => 0.0,
14
- :formato => :caixa_pacote,
15
- :mao_propria => false,
16
- :aviso_recebimento => false,
17
- :valor_declarado => 0.0
18
- }.each do |attr, value|
19
- it attr do
20
- @frete.send(attr).should == value
21
- end
22
- end
5
+ describe "#log_enabled?" do
6
+ it "default is true" do
7
+ Correios::Frete.log_enabled?.should be_true
23
8
  end
24
9
 
25
- { :cep_origem => "01000-000",
26
- :cep_destino => "021222-222",
27
- :peso => 0.321,
28
- :comprimento => 12.5,
29
- :altura => 1.4,
30
- :largura => 4.6,
31
- :diametro => 5.0,
32
- :formato => :rolo_prisma,
33
- :mao_propria => true,
34
- :aviso_recebimento => true,
35
- :valor_declarado => 1.99,
36
- :codigo_empresa => "1234567890",
37
- :senha => "senha",
38
- :web_service => Correios::Frete::WebService.new,
39
- :parser => Correios::Frete::Parser.new
40
- }.each do |attr, value|
41
- context "when #{attr} is supplied" do
42
- it "sets #{attr}" do
43
- @frete = Correios::Frete.new(attr => value)
44
- @frete.send(attr).should == value
45
- end
10
+ context "when disable log" do
11
+ around do |example|
12
+ Correios::Frete.configure { |config| config.log_enabled = false }
13
+ example.run
14
+ Correios::Frete.configure { |config| config.log_enabled = true }
46
15
  end
47
16
 
48
- context "when #{attr} is supplied in a block" do
49
- it "sets #{attr}" do
50
- @frete = Correios::Frete.new { |f| f.send("#{attr}=", value) }
51
- @frete.send(attr).should == value
52
- end
17
+ it "returns false" do
18
+ Correios::Frete.log_enabled?.should be_false
53
19
  end
54
20
  end
55
21
  end
56
22
 
57
- describe "#calcular" do
58
- before :each do
59
- @web_service = Correios::Frete::WebService.new
60
- @parser = Correios::Frete::Parser.new
61
- @frete = Correios::Frete.new(:web_service => @web_service, :parser => @parser)
62
- end
63
-
64
- context "to many services" do
65
- before :each do
66
- @xml = '<?xml version="1.0" encoding="ISO-8859-1" ?><Servicos><cServico><Codigo>41106</Codigo><Valor>15,70</Valor><PrazoEntrega>3</PrazoEntrega><ValorMaoPropria>3,70</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>1,50</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>N</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro></cServico><cServico><Codigo>40010</Codigo><Valor>17,80</Valor><PrazoEntrega>1</PrazoEntrega><ValorMaoPropria>3,70</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>1,50</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>S</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro></cServico></Servicos>'
67
- @servicos = { :pac => Correios::Frete::Servico.new, :sedex => Correios::Frete::Servico.new }
68
-
69
- @parser.stub(:servicos).and_return(@servicos)
70
- @web_service.stub(:request).with(@frete, [:pac, :sedex]).and_return(@xml)
71
- end
72
-
73
- it "returns all services" do
74
- @frete.calcular(:pac, :sedex).should == @servicos
75
- end
23
+ describe "#logger" do
24
+ it "default is Logger" do
25
+ Correios::Frete.logger.should be_a(Logger)
76
26
  end
77
27
 
78
- context "to one service" do
79
- before :each do
80
- @xml = '<?xml version="1.0" encoding="ISO-8859-1" ?><cServico><Codigo>40010</Codigo><Valor>17,80</Valor><PrazoEntrega>1</PrazoEntrega><ValorMaoPropria>3,70</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>1,50</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>S</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro></cServico></Servicos>'
81
- @servico = Correios::Frete::Servico.new
82
-
83
- @parser.stub(:servicos).and_return(:sedex => @servico)
84
- @web_service.stub(:request).with(@frete, [:sedex]).and_return(@xml)
85
- end
86
-
87
- it "returns only one service" do
88
- @frete.calcular(:sedex).should == @servico
28
+ context "when set logger" do
29
+ it "returns set logger" do
30
+ fake_logger = Class.new
31
+ Correios::Frete.configure { |config| config.logger = fake_logger }
32
+ Correios::Frete.logger.should == fake_logger
89
33
  end
90
34
  end
91
35
  end
92
36
 
93
- ["calcular", "calculate"].each do |method_name|
94
- Correios::Frete::Servico::AVAILABLE_SERVICES.each do |key, service|
95
- describe "##{method_name}_#{service[:type]}" do
96
- before :each do
97
- web_service = Correios::Frete::WebService.new
98
- parser = Correios::Frete::Parser.new
99
- @frete = Correios::Frete.new(:web_service => web_service, :parser => parser)
100
- @servico = Correios::Frete::Servico.new
101
-
102
- parser.stub(:servicos).and_return(service[:type] => @servico)
103
- web_service.stub(:request).with(@frete, [service[:type]]).and_return("XML")
104
- end
37
+ describe "#log" do
38
+ before :each do
39
+ @log_stream = StringIO.new
40
+ Correios::Frete.configure { |config| config.logger = Logger.new(@log_stream) }
41
+ end
105
42
 
106
- it "calculates #{service[:name]}" do
107
- @frete.send("#{method_name}_#{service[:type]}").should == @servico
108
- end
43
+ context "when log is enabled" do
44
+ it "logs the message" do
45
+ Correios::Frete.log("Some message to log.")
46
+ @log_stream.string.should include("Some message to log.")
109
47
  end
110
48
  end
111
49
 
112
- describe "##{method_name}_servico_que_nao_existe" do
113
- before(:each) { @frete = Correios::Frete.new }
50
+ context "when log is disabled" do
51
+ around do |example|
52
+ Correios::Frete.configure { |config| config.log_enabled = false }
53
+ example.run
54
+ Correios::Frete.configure { |config| config.log_enabled = true }
55
+ end
114
56
 
115
- it "raises NoMethodError" do
116
- expect { @frete.send("#{method_name}_servico_que_nao_existe") }.to raise_error(NoMethodError)
57
+ it "does not log the message" do
58
+ Correios::Frete.log("Some message to log.")
59
+ @log_stream.string.should be_empty
117
60
  end
118
61
  end
119
62
  end
metadata CHANGED
@@ -2,15 +2,15 @@
2
2
  name: correios-frete
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.0
5
+ version: 1.0.0
6
6
  platform: ruby
7
7
  authors:
8
- - Prodis a.k.a. Fernando Hamasaki de Amorim
8
+ - Prodis a.k.a. Fernando Hamasaki
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-08-02 00:00:00 -03:00
13
+ date: 2011-08-10 00:00:00 -03:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -76,6 +76,7 @@ extensions: []
76
76
 
77
77
  extra_rdoc_files:
78
78
  - README.rdoc
79
+ - README_v0.3.0.rdoc
79
80
  files:
80
81
  - .document
81
82
  - .rspec
@@ -83,14 +84,18 @@ files:
83
84
  - Gemfile
84
85
  - Gemfile.lock
85
86
  - README.rdoc
87
+ - README_v0.3.0.rdoc
86
88
  - Rakefile
87
89
  - correios-frete.gemspec
88
90
  - lib/correios-frete.rb
89
91
  - lib/correios/frete.rb
92
+ - lib/correios/frete/calculador.rb
93
+ - lib/correios/frete/logger.rb
90
94
  - lib/correios/frete/parser.rb
91
95
  - lib/correios/frete/servico.rb
92
96
  - lib/correios/frete/version.rb
93
97
  - lib/correios/frete/web_service.rb
98
+ - spec/correios/frete/calculador_spec.rb
94
99
  - spec/correios/frete/parser_spec.rb
95
100
  - spec/correios/frete/servico_spec.rb
96
101
  - spec/correios/frete/web_service_spec.rb
@@ -110,7 +115,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
115
  requirements:
111
116
  - - ">="
112
117
  - !ruby/object:Gem::Version
113
- hash: -510697009
118
+ hash: 829032559
114
119
  segments:
115
120
  - 0
116
121
  version: "0"