bonzi_cep 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 48d3f5f1c0a144c6c3cb23e0be83a0a0970293209caa20906fca66222ecd4f08
4
+ data.tar.gz: 61e8b9137090c0a1d5d3288729cd29f9afecbde7d947320df0bd23567c9efe19
5
+ SHA512:
6
+ metadata.gz: 771edcf914343bd6e6a6a844d3feb752e7344107b95de385ece52f986434f3748b196a69cd0f570c873bf4b3690597985410b76a86895cec54492ced737af1aa
7
+ data.tar.gz: 93ab0447720194236dfcba4745c9c58aa1d399d7fe26465164ce28433ec4ff90e2e41261f06d54f91ad2ab81c1369296091349ecb6bf5fde6b2062e6af6bc313
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # BonziCep
2
+
3
+ TODO: Delete this and the text below, and describe your gem
4
+
5
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/bonzi_cep`. To experiment with that code, run `bin/console` for an interactive prompt.
6
+
7
+ ## Installation
8
+
9
+ TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
+
11
+ Install the gem and add to the application's Gemfile by executing:
12
+
13
+ ```bash
14
+ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
15
+ ```
16
+
17
+ If bundler is not being used to manage dependencies, install the gem by executing:
18
+
19
+ ```bash
20
+ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/bonzi_cep.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/exe/bonzi_cep ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bonzi_cep'
4
+ require 'optparse'
5
+
6
+ options = {}
7
+ OptionParser.new do |opts|
8
+ opts.banner = "Uso: bonzi_cep [opções]"
9
+
10
+ opts.on("-g", "--gerar", "Gerar um CEP aleatório") do
11
+ options[:gerar] = true
12
+ end
13
+
14
+ opts.on("-eESTADO", "--estado=ESTADO", "Gerar CEP para um estado específico") do |estado|
15
+ options[:estado] = estado.upcase
16
+ end
17
+
18
+ opts.on("-cCEP", "--consulta=CEP", "Consultar um CEP") do |cep|
19
+ options[:consulta] = cep
20
+ end
21
+
22
+ opts.on("-vCEP", "--validar=CEP", "Validar um CEP") do |cep|
23
+ options[:validar] = cep
24
+ end
25
+
26
+ opts.on("-l", "--lista", "Listar estados suportados") do
27
+ options[:lista] = true
28
+ end
29
+
30
+ opts.on("-h", "--help", "Mostrar ajuda") do
31
+ puts opts
32
+ puts "\nExemplos:"
33
+ puts " bonzi_cep -g # Gera CEP aleatório"
34
+ puts " bonzi_cep -g -e SP # Gera CEP para São Paulo"
35
+ puts " bonzi_cep -c 01001-000 # Consulta um CEP"
36
+ puts " bonzi_cep -v 12345-678 # Valida um CEP"
37
+ puts " bonzi_cep -l # Lista estados suportados"
38
+ exit
39
+ end
40
+ end.parse!
41
+
42
+ if options[:gerar]
43
+ begin
44
+ if options[:estado]
45
+ resultado = BonziCEP.gerar_para_estado(options[:estado])
46
+ puts "\n📍 CEP Gerado para #{resultado[:estado]}:"
47
+ else
48
+ resultado = BonziCEP.gerar
49
+ puts "\n📍 CEP Aleatório Gerado:"
50
+ end
51
+
52
+ puts "├─ CEP: #{resultado[:cep]}"
53
+ puts "├─ Estado: #{resultado[:estado]}"
54
+ puts "└─ Região: #{resultado[:regiao]}"
55
+
56
+ rescue BonziCEP::EstadoInvalido => e
57
+ puts "\n❌ Erro: #{e.message}"
58
+ puts "Use 'bonzi_cep -l' para ver estados válidos"
59
+ end
60
+
61
+ elsif options[:consulta]
62
+ begin
63
+ resultado = BonziCEP.consultar(options[:consulta])
64
+ puts "\n🔍 Consulta CEP #{resultado[:cep]}:"
65
+ puts "├─ Estado: #{resultado[:estado]}"
66
+ puts "└─ Região: #{resultado[:regiao]}"
67
+ rescue BonziCEP::CEPInvalido => e
68
+ puts "\n❌ Erro: #{e.message}"
69
+ end
70
+
71
+ elsif options[:validar]
72
+ valido = BonziCEP.valido?(options[:validar])
73
+ puts "\n#{valido ? '✅' : '❌'} O CEP #{options[:validar]} é #{valido ? 'válido' : 'inválido'}"
74
+
75
+ if valido
76
+ begin
77
+ estado = BonziCEP.consultar(options[:validar])[:estado]
78
+ puts "├─ Pertence ao estado: #{estado}"
79
+ puts "└─ Região: #{BonziCEP::REGIOES_POR_ESTADO[estado]}"
80
+ rescue
81
+ puts "└─ (Estado não identificado)"
82
+ end
83
+ end
84
+
85
+ elsif options[:lista]
86
+ puts "\n🇧🇷 Estados Suportados:"
87
+ BonziCEP.estados_suportados.each do |estado|
88
+ puts "├─ #{estado}: #{BonziCEP::REGIOES_POR_ESTADO[estado]}"
89
+ end
90
+ puts "└─ Total: #{BonziCEP.estados_suportados.size} estados"
91
+
92
+ else
93
+ puts "Use -h para ver as opções disponíveis"
94
+ end
@@ -0,0 +1,5 @@
1
+ # lib/bonzi_cep/version.rb
2
+
3
+ module BonziCEP
4
+ VERSION = "0.1.0"
5
+ end
data/lib/bonzi_cep.rb ADDED
@@ -0,0 +1,149 @@
1
+ # lib/bonzi_cep.rb
2
+
3
+ require "bonzi_cep/version"
4
+
5
+ module BonziCEP
6
+ class Error < StandardError; end
7
+ class EstadoInvalido < Error; end
8
+ class CEPInvalido < Error; end
9
+
10
+ # Prefixos de CEP por estado (primeiros dígitos)
11
+ ESTADOS_POR_PREFIXO = {
12
+ 'SP' => [*1..9, 10, 11, 12].freeze,
13
+ 'RJ' => [20, 21, 22, 23, 24].freeze,
14
+ 'ES' => [29].freeze,
15
+ 'MG' => [*30..39].freeze,
16
+ 'BA' => [*40..48].freeze,
17
+ 'SE' => [49].freeze,
18
+ 'PE' => [*50..56].freeze,
19
+ 'AL' => [57].freeze,
20
+ 'PB' => [58].freeze,
21
+ 'RN' => [59].freeze,
22
+ 'CE' => [*60..63, 64].freeze,
23
+ 'PI' => [64].freeze,
24
+ 'MA' => [65].freeze,
25
+ 'PA' => [*66..68].freeze,
26
+ 'AP' => [68].freeze,
27
+ 'AM' => [69].freeze,
28
+ 'RR' => [69].freeze,
29
+ 'AC' => [69].freeze,
30
+ 'DF' => [70, 71, 72, *73..74].freeze,
31
+ 'GO' => [72, *73..76].freeze,
32
+ 'TO' => [77].freeze,
33
+ 'MT' => [78].freeze,
34
+ 'MS' => [79].freeze,
35
+ 'RO' => [76].freeze,
36
+ 'PR' => [*80..87].freeze,
37
+ 'SC' => [*88..89].freeze,
38
+ 'RS' => [*90..99].freeze
39
+ }.freeze
40
+
41
+ # Regiões por estado
42
+ REGIOES_POR_ESTADO = {
43
+ 'AC' => 'Norte', 'AL' => 'Nordeste', 'AP' => 'Norte',
44
+ 'AM' => 'Norte', 'BA' => 'Nordeste', 'CE' => 'Nordeste',
45
+ 'DF' => 'Centro-Oeste', 'ES' => 'Sudeste', 'GO' => 'Centro-Oeste',
46
+ 'MA' => 'Nordeste', 'MT' => 'Centro-Oeste', 'MS' => 'Centro-Oeste',
47
+ 'MG' => 'Sudeste', 'PA' => 'Norte', 'PB' => 'Nordeste',
48
+ 'PR' => 'Sul', 'PE' => 'Nordeste', 'PI' => 'Nordeste',
49
+ 'RJ' => 'Sudeste', 'RN' => 'Nordeste', 'RS' => 'Sul',
50
+ 'RO' => 'Norte', 'RR' => 'Norte', 'SC' => 'Sul',
51
+ 'SP' => 'Sudeste', 'SE' => 'Nordeste', 'TO' => 'Norte'
52
+ }.freeze
53
+
54
+ class << self
55
+ CEP_REGEX = /\A\d{5}-?\d{3}\z/
56
+
57
+ # Gera um CEP aleatório
58
+ def gerar(formato: true, estado: nil)
59
+ estado = estado.to_s.upcase if estado
60
+
61
+ prefixos = if estado && ESTADOS_POR_PREFIXO.key?(estado)
62
+ ESTADOS_POR_PREFIXO[estado]
63
+ else
64
+ ESTADOS_POR_PREFIXO.values.flatten
65
+ end
66
+
67
+ prefixo = prefixos.sample.to_s.rjust(2, '0')
68
+ sufixo = rand(100..999).to_s
69
+ cep_numero = "#{prefixo}#{rand(100..999)}#{sufixo}"
70
+
71
+ estado ||= encontrar_estado_por_prefixo(prefixo.to_i)
72
+
73
+ {
74
+ cep: formatar_cep(cep_numero, formato),
75
+ estado: estado,
76
+ regiao: REGIOES_POR_ESTADO[estado]
77
+ }
78
+ end
79
+
80
+ # Gera CEP para um estado específico
81
+ def gerar_para_estado(estado, formato: true)
82
+ estado = estado.to_s.upcase
83
+ raise EstadoInvalido, "Estado inválido" unless ESTADOS_POR_PREFIXO.key?(estado)
84
+
85
+ gerar(formato: formato, estado: estado)
86
+ end
87
+
88
+ # Valida formato do CEP
89
+ def valido?(cep)
90
+ cep.to_s.match?(CEP_REGEX)
91
+ end
92
+
93
+ # Verifica se CEP pertence a um estado
94
+ def pertence_a_estado?(cep, estado)
95
+ estado = estado.to_s.upcase
96
+ raise EstadoInvalido, "Estado inválido" unless ESTADOS_POR_PREFIXO.key?(estado)
97
+
98
+ cep_normalizado = normalizar_cep(cep)
99
+ return false unless valido?(cep_normalizado)
100
+
101
+ prefixo = cep_normalizado[0..1].to_i
102
+ ESTADOS_POR_PREFIXO[estado].include?(prefixo)
103
+ end
104
+
105
+ # Consulta informações do CEP
106
+ def consultar(cep)
107
+ cep_normalizado = normalizar_cep(cep)
108
+ raise CEPInvalido, "CEP inválido" unless valido?(cep_normalizado)
109
+
110
+ prefixo = cep_normalizado[0..1].to_i
111
+ estado = encontrar_estado_por_prefixo(prefixo)
112
+ raise CEPInvalido, "CEP não encontrado" unless estado
113
+
114
+ {
115
+ cep: formatar_cep(cep_normalizado, true),
116
+ estado: estado,
117
+ regiao: REGIOES_POR_ESTADO[estado]
118
+ }
119
+ end
120
+
121
+ # Lista de estados suportados
122
+ def estados_suportados
123
+ ESTADOS_POR_PREFIXO.keys.sort
124
+ end
125
+
126
+ # Lista de regiões suportadas
127
+ def regioes_suportadas
128
+ REGIOES_POR_ESTADO.values.uniq.sort
129
+ end
130
+
131
+ private
132
+
133
+ def normalizar_cep(cep)
134
+ cep.to_s.gsub(/[^0-9]/, '')
135
+ end
136
+
137
+ def formatar_cep(cep, formato)
138
+ cep_normalizado = normalizar_cep(cep)
139
+ formato ? "#{cep_normalizado[0..4]}-#{cep_normalizado[5..7]}" : cep_normalizado
140
+ end
141
+
142
+ def encontrar_estado_por_prefixo(prefixo)
143
+ ESTADOS_POR_PREFIXO.each do |estado, prefixos|
144
+ return estado if prefixos.include?(prefixo)
145
+ end
146
+ nil
147
+ end
148
+ end
149
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bonzi_cep
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - sheran
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: Gem Ruby para trabalhar com Códigos de Endereçamento Postal brasileiros
13
+ (CEP)
14
+ email:
15
+ - bonzibudddy@proton.me
16
+ executables:
17
+ - bonzi_cep
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - README.md
22
+ - exe/bonzi_cep
23
+ - lib/bonzi_cep.rb
24
+ - lib/bonzi_cep/version.rb
25
+ homepage: https://github.com/sheranrafael/bonzi_cep
26
+ licenses:
27
+ - MIT
28
+ metadata:
29
+ homepage_uri: https://github.com/sheranrafael/bonzi_cep
30
+ source_code_uri: https://github.com/sheranrafael/bonzi_cep
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: 3.1.0
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubygems_version: 3.7.1
46
+ specification_version: 4
47
+ summary: Gem para gerar, validar e consultar CEPs brasileiros
48
+ test_files: []