extenso_pt 0.7.0 → 0.7.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 585d41335b5503f750798310e043e7a90a55b37a616eb2fc34e8399cc7bde3df
4
- data.tar.gz: 86f6231beffdac04d18c5a32a452e48fa090e70d24a12912d0fecdb88dfbbe57
3
+ metadata.gz: 28575e30b8755723ed32e55b1914d8b4192e37d4ebe832b0bc7f2e9e11f8b5e9
4
+ data.tar.gz: 214eab4a72a820a9c6913c1080187193e594e6ab606a7d5a99c8658a086ef8a0
5
5
  SHA512:
6
- metadata.gz: 8a3741e89853e408a92e655c5333cd1e718f1b5d308f9b09ba5c50302f77de1560d272da2f9aff18c956e952f870b3964425222d4faff673fe491581b2e40bd7
7
- data.tar.gz: 113ac582f6ac5f4554b83dd64ca4e842b45b2f470c6fbfb4c1154633090fa6a8157aaf027aaecb7502623ead61b361524d7e13c9e2a72d624c9f62e976796d19
6
+ metadata.gz: a95df97ab690fe81b0d6023f8b23d5f4502f810836cb8c1a0b48542b257cf972ba46017a26a87c54c6b7277460dfa50916ec3ba8ab99d6049c9449e3e58976d4
7
+ data.tar.gz: 5d986ca8a3380c9fac8d0ba55cb8eb1ab0f70e780ab4920e0e05288f193fb79f0e3fb603e9e7b246c812a7cec84c4dc46a4be87989214735fc47b60419a9a2b2
@@ -0,0 +1,12 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.7
3
+ EnabledByDefault: true
4
+
5
+ Style/Copyright:
6
+ Enabled: false
7
+
8
+ Lint/ConstantResolution:
9
+ Enabled: false
10
+
11
+ Style/ConstantVisibility:
12
+ Enabled: false
@@ -3,5 +3,5 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.6.3
6
+ - 2.7.0
7
7
  script: bundle exec rake test
@@ -1,15 +1,69 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- extenso_pt (0.7.0)
4
+ extenso_pt (0.7.5)
5
5
  bigdecimal
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ ast (2.4.1)
11
+ backport (1.1.2)
12
+ benchmark (0.1.0)
10
13
  bigdecimal (2.0.0)
11
- minitest (5.14.1)
14
+ e2mmap (0.1.0)
15
+ jaro_winkler (1.5.4)
16
+ kwalify (0.7.2)
17
+ maruku (0.7.3)
18
+ mini_portile2 (2.4.0)
19
+ minitest (5.14.2)
20
+ nokogiri (1.10.10)
21
+ mini_portile2 (~> 2.4.0)
22
+ parallel (1.19.2)
23
+ parser (2.7.2.0)
24
+ ast (~> 2.4.1)
25
+ psych (3.1.0)
26
+ rainbow (3.0.0)
12
27
  rake (13.0.1)
28
+ reek (6.0.1)
29
+ kwalify (~> 0.7.0)
30
+ parser (>= 2.5.0.0, < 2.8, != 2.5.1.1)
31
+ psych (~> 3.1.0)
32
+ rainbow (>= 2.0, < 4.0)
33
+ regexp_parser (1.8.1)
34
+ reverse_markdown (2.0.0)
35
+ nokogiri
36
+ rexml (3.2.4)
37
+ rubocop (0.92.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 2.7.1.5)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.7)
42
+ rexml
43
+ rubocop-ast (>= 0.5.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 2.0)
46
+ rubocop-ast (0.7.1)
47
+ parser (>= 2.7.1.5)
48
+ ruby-progressbar (1.10.1)
49
+ solargraph (0.39.17)
50
+ backport (~> 1.1)
51
+ benchmark
52
+ bundler (>= 1.17.2)
53
+ e2mmap
54
+ jaro_winkler (~> 1.5)
55
+ maruku (~> 0.7, >= 0.7.3)
56
+ nokogiri (~> 1.9, >= 1.9.1)
57
+ parser (~> 2.3)
58
+ reverse_markdown (>= 1.0.5, < 3)
59
+ rubocop (~> 0.52)
60
+ thor (~> 1.0)
61
+ tilt (~> 2.0)
62
+ yard (~> 0.9, >= 0.9.24)
63
+ thor (1.0.1)
64
+ tilt (2.0.10)
65
+ unicode-display_width (1.7.0)
66
+ yard (0.9.25)
13
67
 
14
68
  PLATFORMS
15
69
  ruby
@@ -19,6 +73,9 @@ DEPENDENCIES
19
73
  extenso_pt!
20
74
  minitest
21
75
  rake
76
+ reek
77
+ rubocop
78
+ solargraph
22
79
 
23
80
  BUNDLED WITH
24
- 2.1.2
81
+ 2.1.4
data/README.md CHANGED
@@ -6,9 +6,7 @@ Produz extenso em portugês de portugal, brasil ou numeracao romana. Os valores
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- ```ruby
10
- gem 'extenso_pt'
11
- ```
9
+ gem 'extenso_pt'
12
10
 
13
11
  And then execute:
14
12
 
@@ -20,26 +18,24 @@ Or install it yourself as:
20
18
 
21
19
  ## Usage
22
20
 
23
- ```ruby
24
- 1234.extenso => "MIL DUZENTOS E TRINTA E QUATRO EUROS"
25
- 1234.romana => "MCCXXXIV"
26
- "MCCXXXIV".romana => 1234
27
- 12000000.12.extenso => "DOZE MILHÕES DE EUROS E DOZE CÊNTIMOS"
28
- 1.01.extenso(moeda_singular: 'DÓLAR') => "UM DÓLAR E UM CÊNTIMO"
29
- 14.1.extenso(moeda_plural: 'REAIS') => "CATORZE REAIS E DEZ CÊNTIMOS"
30
- 14.1.extenso(lc: :br) => "QUATORZE REAIS E DEZ CENTAVOS"
31
- 10.01.extenso(fracao_plural: 'CENTAVOS') => "DEZ EUROS E UM CENTAVO" # singular inferido = <plural> menos "S"
32
- 10.10.extenso(fracao_singular: 'CENTAVO') => "DEZ EUROS E DEZ CENTAVOS" # plural inferido = <silgular> mais "S"
33
- 1e10.extenso(lc: :pt) => "DEZ MIL MILHÕES DE EUROS" # portugal usa escala longa
34
- 1e10.extenso(lc: :br) => "DEZ BILHÕES DE REAIS" # brasil usa escala curta
35
- [0.01, 0.2].extenso => ["UM CÊNTIMO","VINTE CÊNTIMOS"]
36
- [4, 5, 6, 7].romana => ["IV", "V", "VI", "VII"]
37
- (1..2).extenso => ["UM EURO","DOIS EUROS"]
38
- (7..9).romana => ["VII", "VIII", "IX"]
39
- {:a=>1, :b=>2}.extenso => {:a=>"UM EURO",:b=>"DOIS EUROS"}
40
- {:a=>[3, 4], :b=>2}.extenso => {:a=>["TRÊS EUROS", "QUATRO EUROS"],:b=>"DOIS EUROS"}
41
- {:a=>["MCMLXVIII", "XIV"], :b=>4}.romana => {:a=>[1968, 14], :b=>"IV"}
42
- ```
21
+ 1234.extenso => 'MIL DUZENTOS E TRINTA E QUATRO EUROS'
22
+ 1234.romana => 'MCCXXXIV'
23
+ 'MCCXXXIV'.romana => 1234
24
+ 12000000.12.extenso => 'DOZE MILHÕES DE EUROS E DOZE CÊNTIMOS'
25
+ 1.01.extenso(moeda_singular: 'DÓLAR') => 'UM DÓLAR E UM CÊNTIMO'
26
+ 14.1.extenso(moeda_plural: 'REAIS') => 'CATORZE REAIS E DEZ CÊNTIMOS'
27
+ 14.1.extenso(lc: :br) => 'QUATORZE REAIS E DEZ CENTAVOS'
28
+ 10.01.extenso(fracao_plural: 'CENTAVOS') => 'DEZ EUROS E UM CENTAVO' # singular inferido = plural menos S
29
+ 10.10.extenso(fracao_singular: 'CENTAVO') => 'DEZ EUROS E DEZ CENTAVOS' # plural inferido = silgular mais S
30
+ 1e10.extenso(lc: :pt) => 'DEZ MIL MILHÕES DE EUROS' # portugal usa escala longa
31
+ 1e10.extenso(lc: :br) => 'DEZ BILHÕES DE REAIS' # brasil usa escala curta
32
+ [0.01, 0.2].extenso => ['UM CÊNTIMO','VINTE CÊNTIMOS']
33
+ [4, 5, 6, 7].romana => ['IV', 'V', 'VI', 'VII']
34
+ (1..2).extenso => ['UM EURO','DOIS EUROS']
35
+ (7..9).romana => ['VII', 'VIII', 'IX']
36
+ {a: 1, b: 2}.extenso => {a: 'UM EURO',b: 'DOIS EUROS'}
37
+ {a: [3, 4], b: 2}.extenso => {a: ['TRÊS EUROS', 'QUATRO EUROS' ],b: 'DOIS EUROS'}
38
+ {a: ['MCMLXVIII', 'XIV'], b: 4}.romana => {a: [1968, 14], b: 'IV'}
43
39
 
44
40
  ## Development
45
41
 
@@ -2,15 +2,16 @@
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'extenso_pt/version'
5
+ require('extenso_pt/version')
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = 'extenso_pt'
9
- spec.version = ExtensoPt::VERSION
10
- spec.authors = ['Hernâni Rodrigues Vaz']
11
- spec.email = ['hernanirvaz@gmail.com']
12
- spec.homepage = 'https://github.com/hernanilr/extenso_pt'
13
- spec.license = 'MIT'
8
+ spec.name = 'extenso_pt'
9
+ spec.version = ExtensoPt::VERSION
10
+ spec.authors = ['Hernâni Rodrigues Vaz']
11
+ spec.email = ['hernanirvaz@gmail.com']
12
+ spec.homepage = 'https://github.com/hernanilr/extenso_pt'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = '~> 2.7'
14
15
 
15
16
  spec.summary = 'Produz extenso em portugês de portugal, brasil ou numeracao romana.'
16
17
  spec.description = spec.summary
@@ -18,21 +19,26 @@ Gem::Specification.new do |spec|
18
19
  '(array, range, hash). O extenso pode ser produzido na escala longa (utilizada em todos os países lusófonos) ou '\
19
20
  'na escala curta (utilizada no Brasil). Pode ainda produzir numeracao romana e vice versa.'
20
21
 
21
- spec.metadata['yard.run'] = 'yard' # use "yard" to build full HTML docs.
22
+ # use "yard" to build full HTML docs.
23
+ spec.metadata['yard.run'] = 'yard'
22
24
  spec.metadata['homepage_uri'] = spec.homepage
23
25
 
24
26
  # Specify which files should be added to the gem when it is released.
25
27
  # loads the files in the RubyGem that have been added into git.
26
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
27
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
- end
28
+ spec.files =
29
+ Dir.chdir(File.expand_path(__dir__)) do
30
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
31
+ end
29
32
  spec.bindir = 'exe'
30
33
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
34
  spec.require_paths = ['lib']
32
35
 
33
- spec.add_development_dependency 'bundler'
34
- spec.add_development_dependency 'minitest'
35
- spec.add_development_dependency 'rake'
36
+ spec.add_development_dependency('bundler')
37
+ spec.add_development_dependency('minitest')
38
+ spec.add_development_dependency('rake')
39
+ spec.add_development_dependency('reek')
40
+ spec.add_development_dependency('rubocop')
41
+ spec.add_development_dependency('solargraph')
36
42
 
37
- spec.add_dependency 'bigdecimal'
43
+ spec.add_dependency('bigdecimal')
38
44
  end
@@ -1,16 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bigdecimal/util'
4
- require 'extenso_pt/constantes'
5
- require 'extenso_pt/variaveis'
6
- require 'extenso_pt/extenso'
7
- require 'extenso_pt/romana'
8
- require 'extenso_pt/version'
3
+ require('bigdecimal/util')
4
+ require('extenso_pt/extenso')
5
+ require('extenso_pt/romana')
6
+ require('extenso_pt/version')
9
7
 
10
8
  # @author Hernani Rodrigues Vaz
11
9
  module ExtensoPt
12
- class Error < StandardError; end
13
- # Produz extenso em portugues de portugal ou brasil a partir de valor numerico
10
+ # expressao regular da numeracao romana
11
+ RO_RE = /^M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i.freeze
12
+ # chaves parametrizacao moeda permitidas
13
+ MOEDA = %i[moeda_singular fracao_singular moeda_plural fracao_plural lc].freeze
14
+ # somente portugues de portugal ou brasil permitidos, qualquer outro locale equivale usar :pt
15
+ EXTLC = %i[pt br].freeze
16
+
17
+ # Processa objeto criando extenso(s) em portugues de portugal ou brasil
14
18
  #
15
19
  # @note valor numerico pode ser uma string digitos
16
20
  # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
@@ -25,33 +29,14 @@ module ExtensoPt
25
29
  # Hash<extensos> se objecto for (Hash)
26
30
  def extenso(moeda = { lc: :pt })
27
31
  # parametrizar moeda
28
- ExtensoPt.prmo(moeda.parametrizar)
32
+ ExtensoPt.parametrizar_moeda(moeda.parametrizar)
29
33
 
30
34
  processa
31
35
  end
32
36
 
33
- # Processa objeto criando extenso(s) em portugues de portugal ou brasil
34
- #
35
- # @return (see #extenso)
36
- def processa
37
- # converte valores do Hash nos seus extensos
38
- if is_a?(Hash) then map { |k, v| [k, v.processa] }.to_h
39
- # converte objecto num Array com os valores convertidos nos seus extensos
40
- elsif respond_to?(:to_a) then to_a.map(&:processa)
41
- else
42
- # converte objeto em string digitos utilizando bigdecimal para
43
- # evitar problemas com aritmetica virgula flutuante em valores >1e12
44
- # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos
45
- ExtensoPt.prif(to_d.to_s('F'))
46
-
47
- # processar extenso - valores >1e24 sao ignorados
48
- ExtensoPt.cvai.count > 8 ? '' : ExtensoPt.ejun
49
- end
50
- end
51
-
52
37
  # @return [Hash<String, Symbol>] parametrizacao moeda por defeito para :br & inferencias & errados
53
38
  def parametrizar
54
- if value?(:br) && %i[moeda_singular moeda_plural].all? { |e| !keys.include?(e) }
39
+ if value?(:br) && %i[moeda_singular moeda_plural].all? { |syb| !keys.include?(syb) }
55
40
  { lc: :br, moeda_singular: 'REAL', moeda_plural: 'REAIS', fracao_singular: 'CENTAVO', fracao_plural: 'CENTAVOS' }
56
41
  else
57
42
  inferir_singular.eliminar_errados
@@ -60,33 +45,58 @@ module ExtensoPt
60
45
 
61
46
  # @return [Hash<String, Symbol>] parametrizacao moeda singular inferindo do plural
62
47
  def inferir_singular
63
- self[:moeda_singular] ||= (fetch(:moeda_plural, '')[0..-2] if fetch(:moeda_plural, '')[-1] == 'S')
64
- self[:fracao_singular] ||= (fetch(:fracao_plural, '')[0..-2] if fetch(:fracao_plural, '')[-1] == 'S')
48
+ mdp = fetch(:moeda_plural, '')
49
+ frp = fetch(:fracao_plural, '')
50
+ self[:moeda_singular] ||= (mdp[0..-2] if mdp[-1] == 'S')
51
+ self[:fracao_singular] ||= (frp[0..-2] if frp[-1] == 'S')
65
52
  self
66
53
  end
67
54
 
68
55
  # @return [Hash<String, Symbol>] parametrizacao moeda eliminar parametros errados
69
56
  def eliminar_errados
70
- keep_if { |k, v| MOEDA.include?(k) && (k != :lc || EXTLC.include?(v)) }
57
+ keep_if { |key, val| MOEDA.include?(key) && (key != :lc || EXTLC.include?(val)) }
71
58
  end
72
59
 
73
- # @return [true, false] testa se contem numeracao romana
74
- def romana?
75
- is_a?(String) ? RO_RE.match?(upcase) : false
60
+ # @return (see #extenso)
61
+ def processa
62
+ # converte num Array com os valores convertidos nos seus extensos
63
+ return to_a.map(&:processa) if is_a?(Range) || is_a?(Array)
64
+ # converte valores do Hash nos seus extensos
65
+ return transform_values(&:processa) if is_a?(Hash)
66
+
67
+ # converte objeto em string digitos utilizando bigdecimal para
68
+ # evitar problemas com aritmetica virgula flutuante em valores >1e12
69
+ # valores negativos sao convertidos em positivos
70
+ # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos
71
+ ExtensoPt.parametrizar_grupos(to_d.abs.to_s('F'))
72
+
73
+ # processar extenso - valores >= 1e24 sao ignorados
74
+ ExtensoPt.grupos.count > 8 ? '' : ExtensoPt.extenso_completo
76
75
  end
77
76
 
78
77
  # @note valor numerico pode ser uma string digitos
79
78
  # @return [String, Integer] numeracao romana a partir de numerico ou inteiro a partir da numeracao romana
80
79
  def romana
80
+ # converte num Array com os valores convertidos
81
+ return to_a.map(&:romana) if is_a?(Range) || is_a?(Array)
81
82
  # converte os valores do Hash
82
- if is_a?(Hash) then map { |k, v| [k, v.romana] }.to_h
83
- # converte objecto num Array com os valores convertidos
84
- elsif respond_to?(:to_a) then to_a.map(&:romana)
85
- # numeracao romana a partir de inteiro ou string digitos (ignora parte fracionaria)
86
- elsif (inteiro = to_i) != 0 then ExtensoPt.ri2r(inteiro)
83
+ return transform_values(&:romana) if is_a?(Hash)
84
+
85
+ romana_base(to_i.abs)
86
+ end
87
+
88
+ # @return (see #romana)
89
+ def romana_base(inteiro)
90
+ # numeracao romana a partir de inteiro ou string digitos (ignora parte fracionaria & negativos)
91
+ return ExtensoPt.ri2r(inteiro) unless inteiro.zero?
92
+
87
93
  # inteiro a partir da numeracao romana
88
- else RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : ''
89
- end
94
+ RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : ''
95
+ end
96
+
97
+ # @return [true, false] testa se contem numeracao romana
98
+ def romana?
99
+ is_a?(String) ? RO_RE.match?(upcase) : false
90
100
  end
91
101
  end
92
102
 
@@ -2,105 +2,170 @@
2
2
 
3
3
  # @author Hernani Rodrigues Vaz
4
4
  module ExtensoPt
5
- # Produz extenso das centenas em portugues de portugal ou brasil
5
+ # extensos 1-19; 20-90; 100-900
6
+ e013a = %w[UM DOIS TRÊS QUATRO CINCO SEIS SETE OITO NOVE DEZ ONZE DOZE TREZE].freeze
7
+ e019a = %w[QUINZE DEZASSEIS DEZASSETE DEZOITO DEZANOVE].freeze
8
+ e090a = %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA].freeze
9
+ e900a = %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS].freeze
10
+ A0020 = { pt: [''] + e013a + ['CATORZE'] + e019a, br: [''] + e013a + ['QUATORZE'] + e019a }.freeze
11
+ A0100 = { pt: ['', ''] + e090a, br: ['', ''] + e090a }.freeze
12
+ A1000 = { pt: [''] + e900a, br: [''] + e900a }.freeze
13
+
14
+ # singular extensos 1e3 ate 1e24
15
+ # @note escala segundo convencao entre varios paises,
16
+ # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
17
+ # organizada pelo Bureau International des Poids et Mesures
18
+ # @example
19
+ # 1 000 000 = milhao
20
+ # 1 000 000 000 000 = biliao
21
+ # 1 000 000 000 000 000 000 = triliao
22
+ # 1 000 000 000 000 000 000 000 000 = quadriliao
23
+ # 1 000 000 000 000 000 000 000 000 000 000 = quintiliao
24
+ # 1 000 000 000 000 000 000 000 000 000 000 000 000 = sextiliao
25
+ S1E24 = {
26
+ pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO', ' MIL BILIÃO', ' TRILIÃO', ' MIL TRILIÃO'],
27
+ br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO', ' QUADRILHÃO', ' QUINTILHÃO', ' SEXTILHÃO']
28
+ }.freeze
29
+
30
+ # plural extensos 1e3 ate 1e24
31
+ # @note escala segundo convencao entre varios paises,
32
+ # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
33
+ # organizada pelo Bureau International des Poids et Mesures
34
+ P1E24 = {
35
+ pt: ['', ' MIL', ' MILHÕES', ' MIL MILHÕES', ' BILIÕES', ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
36
+ br: ['', ' MIL', ' MILHÕES', ' BILHÕES', ' TRILHÕES', ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES']
37
+ }.freeze
38
+
39
+ # Parametrizar variaveis da moeda
6
40
  #
7
- # @param [Integer] mil o valor dum grupo 3 digitos a converter
8
- # @return [String] extenso das centenas
9
- def self.e900(mil)
10
- A1000[@lc][(mil > 100 ? 1 : 0) + mil / 100] +
11
- (mil > 100 && (mil % 100).positive? ? ' E ' : '')
41
+ # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
42
+ # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br)
43
+ # @option moeda [String] :moeda_singular moeda no singular
44
+ # @option moeda [String] :fracao_singular fracao no singular
45
+ # @option moeda [String] :moeda_plural moeda no plural
46
+ # @option moeda [String] :fracao_plural fracao no plural
47
+ def self.parametrizar_moeda(moeda)
48
+ # parametrizacao por defeito
49
+ # the first mention of a @<variable> creates that instance variable in the current object ie: self = ExtensoPt
50
+ @lc = moeda[:lc] || :pt
51
+ @ms = moeda[:moeda_singular] || 'EURO'
52
+ @fs = moeda[:fracao_singular] || 'CÊNTIMO'
53
+ @mp = moeda[:moeda_plural] || "#{@ms}S"
54
+ @fp = moeda[:fracao_plural] || "#{@fs}S"
12
55
  end
13
56
 
14
- # Produz extenso das dezenas em portugues de portugal ou brasil
57
+ # Parametrizar variaveis parte inteira e fracionaria
15
58
  #
59
+ # @param [String] digitos do valor monetario a converter
60
+ def self.parametrizar_grupos(digitos)
61
+ # cria array de grupos 3 digitos da parte inteira ex: 123022.12 => [22, 123]
62
+ @ai = digitos[/^\d+/].reverse.scan(/\d{1,3}/).map { |grp| Integer(grp.reverse) }
63
+
64
+ # obtem parte fracionaria da string digitos arredondada a 2 casas decimais ex: 123022.124 => 12, 123022.125 => 13
65
+ @nf = (Float(digitos[/\.\d*/]) * 100).round
66
+ end
67
+
68
+ # @return [Array<Integer>] grupos 3 digitos da parte inteira
69
+ def self.grupos
70
+ @ai
71
+ end
72
+
73
+ # @return [Integer] soma grupos 1-8 de digitos
74
+ def self.soma_grupos
75
+ Integer(@ai[0]) + Integer(@ai[1] || 0) * 2 + Integer(@ai[2..].to_a.inject(:+) || 0) * 2
76
+ end
77
+
78
+ # @return [true, false] sim ou nao proposicao DE
79
+ def self.testa_de?
80
+ Integer(@ai[0..1].inject(:+)).zero? && Integer(@ai[2..].to_a.inject(:+) || 0).positive?
81
+ end
82
+
83
+ # @param [Integer] mil o valor dum grupo 3 digitos a converter
84
+ # @return [String] extenso das centenas em portugues de portugal ou brasil
85
+ def self.centenas(mil)
86
+ cem = mil > 100
87
+ A1000[@lc][(cem ? 1 : 0) + mil / 100] + (cem && (mil % 100).positive? ? ' E ' : '')
88
+ end
89
+
16
90
  # @param [Integer] cem a centena dum grupo 3 digitos a converter
17
- # @return [String] extenso das dezenas
18
- def self.e090(cem)
19
- A0100[@lc][cem / 10] +
20
- (cem > 20 && (cem % 10).positive? ? ' E ' : '')
91
+ # @return [String] extenso das dezenas em portugues de portugal ou brasil
92
+ def self.dezenas(cem)
93
+ A0100[@lc][cem / 10] + (cem > 20 && (cem % 10).positive? ? ' E ' : '')
21
94
  end
22
95
 
23
- # Produz extenso das unidades em portugues de portugal ou brasil
24
- #
25
96
  # @param [Integer] cem a centena dum grupo 3 digitos a converter
26
- # @return [String] extenso das unidades
27
- def self.e009(cem)
97
+ # @return [String] extenso das unidades em portugues de portugal ou brasil
98
+ def self.unidades(cem)
28
99
  A0020[@lc][cem < 20 ? cem : cem % 10]
29
100
  end
30
101
 
31
- # @return [String] extenso da parte fracionaria em portugues de portugal ou brasil
32
- def self.ef99
33
- if cnf?
34
- e090(@nf) + e009(@nf) + ' ' + (@nf > 1 ? @fp : @fs)
102
+ # @return [String] proposicao E & extenso da parte fracionaria em portugues de portugal ou brasil
103
+ def self.fracionaria
104
+ if @nf.positive?
105
+ "#{soma_grupos.positive? ? ' E ' : ''}#{dezenas(@nf)}#{unidades(@nf)} #{@nf > 1 ? @fp : @fs}"
35
106
  else
36
107
  ''
37
108
  end
38
109
  end
39
110
 
40
111
  # @return [String] final da moeda em portugues de portugal ou brasil
41
- def self.efim
42
- t = c124
43
- if t.positive?
44
- # proposicao DE entre parte inteira e moeda & moeda singular/plural & proposicao E entre moeda e parte fracionaria
45
- (cde? ? ' DE ' : ' ') + (t > 1 ? @mp : @ms) + (cnf? ? ' E ' : '')
112
+ def self.final
113
+ som = soma_grupos
114
+ if som.positive?
115
+ # proposicao DE entre parte inteira e moeda & moeda singular/plural
116
+ "#{testa_de? ? ' DE ' : ' '}#{som > 1 ? @mp : @ms}"
46
117
  else
47
118
  ''
48
- end + ef99
119
+ end + fracionaria
49
120
  end
50
121
 
51
- # Produz proposicao E entre grupos 3 digitos
52
- #
53
122
  # @param [Integer] pos posicao actual nos grupos 3 digitos
54
123
  # @return [String] proposicao E entre grupos 3 digitos
55
- def self.edgs(pos)
56
- if pos.positive? && @ai[pos - 1].positive?
57
- @ai[pos - 1] > 100 ? ' ' : ' E '
124
+ def self.proposicao_grupo(pos)
125
+ grp = @ai[pos - 1]
126
+ if pos.positive? && grp.positive?
127
+ grp > 100 ? ' ' : ' E '
58
128
  else
59
129
  ''
60
130
  end
61
131
  end
62
132
 
63
- # Produz qualificador grupo de 3 digitos em portugues de portugal ou brasil
64
- #
65
133
  # @param [Integer] pos posicao actual nos grupos 3 digitos
66
- # @return [String] qualificador grupo de 3 digitos
67
- def self.e124(pos)
68
- if @ai[pos].positive?
69
- @ai[pos] > 1 ? P1E24[@lc][pos] : S1E24[@lc][pos]
134
+ # @return [String] qualificador grupo de 3 digitos em portugues de portugal ou brasil
135
+ def self.qualificador_grupo(pos)
136
+ grp = @ai[pos]
137
+ if grp.positive?
138
+ grp > 1 ? P1E24[@lc][pos] : S1E24[@lc][pos]
70
139
  else
71
140
  ''
72
- end + edgs(pos)
141
+ end + proposicao_grupo(pos)
73
142
  end
74
143
 
75
- # Produz extenso de grupo 3 digitos em portugues de portugal ou brasil
76
- #
77
144
  # @param [Integer] pos posicao actual nos grupos 3 digitos
78
- # @return [String] extenso do grupo 3 digitos
79
- def self.edg3(pos)
145
+ # @return [String] extenso do grupo 3 digitos em portugues de portugal ou brasil
146
+ def self.extenso_grupo(pos)
147
+ grp = @ai[pos]
148
+ dez = grp % 100
80
149
  # caso especial MIL EUROS
81
- if pos == 1 && @ai[pos] == 1
150
+ if pos == 1 && grp == 1
82
151
  ''
83
152
  else
84
153
  # extenso das centenas + extenso das dezenas + extenso das unidades
85
- e900(@ai[pos]) + e090(@ai[pos] % 100) + e009(@ai[pos] % 100)
86
- end + e124(pos)
154
+ "#{centenas(grp)}#{dezenas(dez)}#{unidades(dez)}"
155
+ end + qualificador_grupo(pos)
87
156
  end
88
157
 
89
- # Produz extenso da parte inteira e fracionaria
90
- #
91
158
  # @param [Integer] pos posicao no grupo 3 digitos
92
159
  # @param [String] ext extenso em construcao
93
- # @return [String] extenso do valor monetario
94
- def self.ejun(pos = 0, ext = '')
160
+ # @return [String] extenso do valor monetario completo
161
+ def self.extenso_completo(pos = 0, ext = '')
95
162
  # testa fim do valor monetario
96
163
  if pos >= @ai.count
97
164
  # caso especial de zero
98
- (c124 + @nf).zero? ? 'ZERO ' + @mp : ext + efim
165
+ (soma_grupos + @nf).zero? ? "ZERO #{@mp}" : "#{ext}#{final}"
99
166
  else
100
167
  # converte grupo 3 digitos na posicao corrente & envoca proxima posicao
101
- ejun(pos + 1, edg3(pos) + ext)
168
+ extenso_completo(pos + 1, extenso_grupo(pos) + ext)
102
169
  end
103
170
  end
104
- # private_class_method :e900, :e090, :e009, :ef99, :efim,
105
- # :edgs, :e124, :edg3
106
171
  end
@@ -2,27 +2,24 @@
2
2
 
3
3
  # @author Hernani Rodrigues Vaz
4
4
  module ExtensoPt
5
- # Produz numeral romano a partir de inteiro
6
- #
5
+ # numeracao romana ordem decrescente (ordem importante)
6
+ ROMAN = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 }.freeze
7
+
7
8
  # @param [Integer] inteiro a converter
8
9
  # @return [String] numeral romano do inteiro
9
10
  def self.ri2r(inteiro)
10
11
  return '' if inteiro.zero?
11
12
 
12
- # numeracao romana nao tem negativos
13
- inteiro = inteiro.abs if inteiro.negative?
14
- ROMAN.each { |r, v| return r.to_s + ri2r(inteiro - v) if v <= inteiro }
13
+ ROMAN.each { |srm, val| return "#{srm}#{ri2r(inteiro - val)}" if val <= inteiro }
15
14
  end
16
15
 
17
- # Produz inteiro a partir de numeral romano
18
- #
19
16
  # @param [String] numeral romano a converter
20
17
  # @param [Integer] ultimo valor convertido
21
18
  # @return [Integer] inteiro do numeral romano
22
19
  def self.rr2i(numeral, ultimo)
23
20
  return 0 if numeral.empty?
24
21
 
25
- v = ROMAN[numeral[-1].to_sym]
26
- rr2i(numeral.chop, v) + (v < ultimo ? -v : v)
22
+ val = ROMAN[numeral[-1].to_sym]
23
+ rr2i(numeral.chop, val) + (val < ultimo ? -val : val)
27
24
  end
28
25
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExtensoPt
4
- VERSION = '0.7.0'
4
+ VERSION = '0.7.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extenso_pt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hernâni Rodrigues Vaz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-01 00:00:00.000000000 Z
11
+ date: 2020-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: reek
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: solargraph
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: bigdecimal
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -79,6 +121,7 @@ extra_rdoc_files: []
79
121
  files:
80
122
  - ".gitignore"
81
123
  - ".project_alt.json"
124
+ - ".rubocop.yml"
82
125
  - ".travis.yml"
83
126
  - Gemfile
84
127
  - Gemfile.lock
@@ -89,10 +132,8 @@ files:
89
132
  - bin/setup
90
133
  - extenso_pt.gemspec
91
134
  - lib/extenso_pt.rb
92
- - lib/extenso_pt/constantes.rb
93
135
  - lib/extenso_pt/extenso.rb
94
136
  - lib/extenso_pt/romana.rb
95
- - lib/extenso_pt/variaveis.rb
96
137
  - lib/extenso_pt/version.rb
97
138
  homepage: https://github.com/hernanilr/extenso_pt
98
139
  licenses:
@@ -106,9 +147,9 @@ require_paths:
106
147
  - lib
107
148
  required_ruby_version: !ruby/object:Gem::Requirement
108
149
  requirements:
109
- - - ">="
150
+ - - "~>"
110
151
  - !ruby/object:Gem::Version
111
- version: '0'
152
+ version: '2.7'
112
153
  required_rubygems_version: !ruby/object:Gem::Requirement
113
154
  requirements:
114
155
  - - ">="
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @author Hernani Rodrigues Vaz
4
- module ExtensoPt
5
- # chaves parametrizacao moeda permitidas
6
- MOEDA = %i[moeda_singular fracao_singular moeda_plural fracao_plural lc].freeze
7
-
8
- # somente portugues de portugal ou brasil permitidos, qualquer outro locale equivale usar :pt
9
- EXTLC = %i[pt br].freeze
10
-
11
- E13 = %w[UM DOIS TRÊS QUATRO CINCO SEIS SETE OITO NOVE DEZ ONZE DOZE TREZE].freeze
12
-
13
- # extensos 1 ate 19
14
- A0020 = {
15
- pt: [''] + E13 + %w[CATORZE QUINZE DEZASSEIS DEZASSETE DEZOITO DEZANOVE],
16
- br: [''] + E13 + %w[QUATORZE QUINZE DEZESSEIS DEZESSETE DEZOITO DEZENOVE]
17
- }.freeze
18
-
19
- # extensos 20 ate 90
20
- A0100 = {
21
- pt: ['', ''] + %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA],
22
- br: ['', ''] + %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA]
23
- }.freeze
24
-
25
- # extensos 100 ate 900
26
- A1000 = {
27
- pt: [''] + %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS],
28
- br: [''] + %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS]
29
- }.freeze
30
-
31
- # singular extensos 1e3 ate 1e24
32
- # @note escala segundo convencao entre varios paises,
33
- # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
34
- # organizada pelo Bureau International des Poids et Mesures
35
- # @example
36
- # 1 000 000 = milhao
37
- # 1 000 000 000 000 = biliao
38
- # 1 000 000 000 000 000 000 = triliao
39
- # 1 000 000 000 000 000 000 000 000 = quadriliao
40
- # 1 000 000 000 000 000 000 000 000 000 000 = quintiliao
41
- # 1 000 000 000 000 000 000 000 000 000 000 000 000 = sextiliao
42
- S1E24 = {
43
- pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO', ' MIL BILIÃO', ' TRILIÃO', ' MIL TRILIÃO'],
44
- br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO', ' QUADRILHÃO', ' QUINTILHÃO', ' SEXTILHÃO']
45
- }.freeze
46
-
47
- # plural extensos 1e3 ate 1e24
48
- # @note escala segundo convencao entre varios paises,
49
- # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
50
- # organizada pelo Bureau International des Poids et Mesures
51
- P1E24 = {
52
- pt: ['', ' MIL', ' MILHÕES', ' MIL MILHÕES', ' BILIÕES', ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
53
- br: ['', ' MIL', ' MILHÕES', ' BILHÕES', ' TRILHÕES', ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES']
54
- }.freeze
55
-
56
- # numeracao romana
57
- ROMAN = {
58
- M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1
59
- }.freeze
60
-
61
- # expressao regular da numeracao romana
62
- RO_RE = /^M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i.freeze
63
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @author Hernani Rodrigues Vaz
4
- module ExtensoPt
5
- # Parametrizar variaveis da moeda
6
- #
7
- # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
8
- # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br)
9
- # @option moeda [String] :moeda_singular moeda no singular
10
- # @option moeda [String] :fracao_singular fracao no singular
11
- # @option moeda [String] :moeda_plural moeda no plural
12
- # @option moeda [String] :fracao_plural fracao no plural
13
- def self.prmo(moeda)
14
- # parametrizacao por defeito
15
- # the first mention of a @<variable> creates that instance variable in the current object ie: self = ExtensoPt
16
- @lc = moeda[:lc] || :pt
17
- @ms = moeda[:moeda_singular] || 'EURO'
18
- @fs = moeda[:fracao_singular] || 'CÊNTIMO'
19
- @mp = moeda[:moeda_plural] || @ms + 'S'
20
- @fp = moeda[:fracao_plural] || @fs + 'S'
21
- end
22
-
23
- # Parametrizar variaveis parte inteira e fracionaria
24
- #
25
- # @param [String] digitos do valor monetario a converter
26
- def self.prif(digitos)
27
- # cria array de grupos 3 digitos da parte inteira ex: 123022.12 => [22, 123]
28
- @ai = digitos[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map { |i| i.reverse.to_i }
29
-
30
- # obtem parte fracionaria da string digitos arredondada a 2 casas decimais ex: 123022.12 => 12
31
- @nf = (digitos[/\.\d*/].to_f * 100).round
32
- end
33
-
34
- # @return [Array<Integer>] grupos 3 digitos da parte inteira
35
- def self.cvai
36
- @ai
37
- end
38
-
39
- # @return [Integer] soma grupos 1-8 de digitos
40
- def self.c124
41
- @ai[0].to_i + @ai[1].to_i * 2 + @ai[2..-1].to_a.inject(:+).to_i * 2
42
- end
43
-
44
- # @return [true, false] sim ou nao para controle proposicao DE
45
- def self.cde?
46
- @ai[0..1].to_a.inject(:+).to_i.zero? && @ai[2..-1].to_a.inject(:+).to_i.positive?
47
- end
48
-
49
- # @return [true, false] sim ou nao para controle proposicao E
50
- def self.cnf?
51
- @nf.positive?
52
- end
53
- # private_class_method :c124, :cde?, :cnf?
54
- end