correios-frete 0.3.0 → 1.0.0

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/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"