id_ecuador 0.0.1.alpha → 0.0.1.beta

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.
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## v0.0.1.alpha
4
+
5
+ *Versión inicial*
6
+
7
+ * La clase **IdEcuador::Id** valida cédulas, RUCs
8
+
9
+ ## v0.0.1.beta
10
+
11
+ * Agregado `IdEcuador.new` como alias de `IdEcuador::Id.new`
12
+ * Verificando que cuando un modelo en rails utiliza el validador, no se vuelva a instanciar otro validador a menos que la identificación (atributo) del mismo cambie.
13
+ * Agregado `factory_girl` para testing
14
+ * Tests refactored
data/README.md CHANGED
@@ -1,8 +1,12 @@
1
1
  # IdEcuador
2
- [![Build Status](https://travis-ci.org/macool/id_ecuador.png?branch=master)](https://travis-ci.org/macool/id_ecuador)
3
2
 
4
3
  Gema para validar la cédula o ruc de Ecuador
5
4
 
5
+ ## Status
6
+
7
+ [![Build Status](https://travis-ci.org/macool/id_ecuador.png?branch=master)](https://travis-ci.org/macool/id_ecuador)
8
+ [![Gem Version](https://badge.fury.io/rb/id_ecuador.png)](http://badge.fury.io/rb/id_ecuador)
9
+
6
10
  ## Installation
7
11
 
8
12
  Add this line to your application's Gemfile:
@@ -19,44 +23,58 @@ Or install it yourself as:
19
23
 
20
24
  ## Usage
21
25
 
22
- ```ruby
23
- cedula = IdEcuador::Id.new "1104680135"
24
- cedula.valid? # => true
25
- cedula.tipo_id # => "Cédula Persona natural"
26
- cedula.codigo_provincia # => 11
26
+ ```ruby
27
+ require "id_ecuador"
28
+
29
+ cedula = IdEcuador::Id.new "1104680135"
30
+ cedula.valid? # => true
31
+ cedula.tipo_id # => "Cédula Persona natural"
32
+ cedula.codigo_provincia # => 11
27
33
 
28
- cedula_invalida = IdEcuador::Id.new "1105680134"
29
- cedula_invalida.errors # => ["ID inválida"]
30
- ```
34
+ cedula_invalida = IdEcuador::Id.new "1105680134"
35
+ cedula_invalida.errors # => ["ID inválida"]
36
+ ```
31
37
 
32
38
  No validar automáticamente:
33
- ```ruby
34
- cedula = IdEcuador::Id.new "1104680135", auto_validate: false
35
- cedula.validate!.valid?
36
- ```
39
+
40
+ ```ruby
41
+ cedula = IdEcuador::Id.new "1104680135", auto_validate: false
42
+ cedula.validate!.valid?
43
+ ```
37
44
 
38
45
  ## Rails
39
46
 
40
- ```ruby
41
- class User < ActiveRecord::Base
42
- validates_id :identificacion
43
- end
44
- ```
47
+ ```ruby
48
+ class User < ActiveRecord::Base
49
+ validates_id :identificacion
50
+ end
51
+ ```
45
52
 
46
53
  Con opciones:
47
- ```ruby
48
- class User < ActiveRecord::Base
49
- validates_id :identificacion, allow_blank: false, message: "Cédula inválida", only: [:cedula, :ruc]
50
- end
51
- ```
54
+
55
+ ```ruby
56
+ class User < ActiveRecord::Base
57
+ validates_id :identificacion, allow_blank: false, message: "Cédula inválida", only: [:cedula, :ruc]
58
+ end
59
+ ```
52
60
 
53
61
  Ejemplo API Rails:
54
- ```ruby
55
- user = User.new identificacion: "110468135001"
56
- user.identificacion_id_validator.class # => IdEcuador::Id
57
- user.identificacion_tipo_id # => "RUC Persona natural"
58
- user.identificacion_codigo_provincia # => 11
59
- ```
62
+
63
+ ```ruby
64
+ user = User.new identificacion: "110468135001"
65
+ user.identificacion_id_validator.class # => IdEcuador::Id
66
+ user.identificacion_tipo_id # => "RUC Persona natural"
67
+ user.identificacion_codigo_provincia # => 11
68
+ ```
69
+
70
+ ## Documentación
71
+
72
+ [rubydoc](http://rubydoc.info/github/macool/id_ecuador/master/frames)
73
+
74
+ ## TODO
75
+
76
+ - [ ] Documentar
77
+ - [ ] Escribir la documentación en un solo idioma
60
78
 
61
79
  ## Contributing
62
80
 
@@ -22,5 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
24
  spec.add_development_dependency "supermodel"
25
+ spec.add_development_dependency "factory_girl"
25
26
 
26
27
  end
@@ -3,6 +3,23 @@ require "id_ecuador/id"
3
3
  require "id_ecuador/model_additions"
4
4
  require "id_ecuador/railtie" if defined? Rails
5
5
 
6
+ # Este módulo debe servir como <em>namespace</em>
7
+ #
8
+ # @author macool <a@macool.me>
9
+ #
10
+ # Contiene:
11
+ # Clases:
12
+ # * <tt>Id</tt>
13
+ #
14
+ # Módulos:
15
+ # * <tt>ModelAdditions</tt>
16
+ # * <tt>Railtie</tt>
6
17
  module IdEcuador
7
- # Your code goes here...
18
+
19
+ # Alias al método #new de la clase IdEcuador::Id
20
+ # @example Instanciar ID
21
+ # IdEcuador.new("1104680135").class #=> IdEcuador::Id
22
+ def self.new(*args)
23
+ IdEcuador::Id.new(*args)
24
+ end
8
25
  end
@@ -1,10 +1,30 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module IdEcuador
4
+ # Clase que va a analizar la cédula. Recibe un id y unas opciones
5
+ # @attr_reader [Array] errors Los errores que tiene el ID. Array vacío si es un ID válido
6
+ #
7
+ # @attr_reader [String] tipo_id El tipo de identificación. Puede ser:
8
+ # - "Cédula Persona natural"
9
+ # - "RUC Persona natural"
10
+ # - "Sociedad pública"
11
+ # - "Sociedad privada o extranjera"
12
+ #
13
+ # @attr_reader [Fixnum] codigo_provincia El código de la provincia del ID ingresado
14
+ #
15
+ # @attr_reader [Symbol] tipo_id_sym El tipo de identificación en símbolo. Puede ser:
16
+ # - :ruc
17
+ # - :cedula
18
+ # - :sociedad_publica
19
+ # - :sociedad_privada
20
+ #
4
21
  class Id
5
22
 
6
23
  attr_reader :errors, :tipo_id, :codigo_provincia, :tipo_id_sym
7
24
 
25
+ # @param [String] id El ID que se va a analizar
26
+ # @param [Hash] options Las opciones
27
+ # @option options [Boolean] :auto_validate Validar automáticamente el ID al instanciar. <tt>true</tt> por defecto
8
28
  def initialize(id="", options={})
9
29
  @id = id.to_s
10
30
  @errors = []
@@ -15,15 +35,21 @@ module IdEcuador
15
35
  @options = defaults.merge options
16
36
  validate! if @options[:auto_validate]
17
37
  end
38
+
39
+ # @return [Boolean] Si es un ID válido o no
18
40
  def valid?
19
41
  validate! unless already_validated
20
42
  @errors.empty?
21
43
  end
44
+
45
+ # @return [self] Método que valida
22
46
  def validate!
23
47
  @already_validated = true
24
48
  validate_length and evaluate_province_code and evaluate_third_digit
25
49
  self
26
50
  end
51
+
52
+ # @return [Boolean] Si el ID ya ha sido validado
27
53
  def already_validated
28
54
  !!@already_validated
29
55
  end
@@ -1,20 +1,32 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module IdEcuador
4
+ # Módulo que agrega funcionalidad a los modelos de Rails
5
+ # Permite llamar a <tt>validates_id</tt> dentro de un modelo de Rails
4
6
  module ModelAdditions
7
+
8
+ # @param [Symbol] attribute Atributo que va a validar IdEcuador::Id
9
+ # @param [Hash] options Opciones para la validación
10
+ # @option options [Boolean] :allow_blank Poner (o no) errores si el atributo es nulo
11
+ # @option options [String] :message Mensaje de error que se va a poner en el atributo
12
+ # @option options [Array] :only Tipos de ID que se va a permitir: <tt>[:cedula, :ruc, :sociedad_publica, :sociedad_privada]</tt>
5
13
  def validates_id(attribute, options={})
6
- # options for only: [:cedula, :ruc, :sociedad_publica, :sociedad_privada]
14
+
15
+ # parse options:
7
16
  defaults = {
8
17
  allow_blank: true,
9
18
  message: nil,
10
19
  only: []
11
20
  }
21
+ # options for :only: [:cedula, :ruc, :sociedad_publica, :sociedad_privada]
12
22
  options = defaults.merge options
13
23
 
14
- # to array if not:
24
+ # transform options[:only] to array if it's not:
15
25
  unless options[:only].class == Array
16
26
  options[:only] = [options[:only]]
17
27
  end
28
+
29
+
18
30
  # poner métodos:
19
31
 
20
32
  # getter del atributo que siempre retorna una instancia de IdEcuador::Id y se encarga de hacer cache basado en el valor del atributo
@@ -38,15 +50,19 @@ module IdEcuador
38
50
  end
39
51
  EVAL
40
52
 
53
+ # método de validación
41
54
  validate do
55
+ # Agregar error si <tt>allow_blank</tt> es <tt>false</tt> y <tt>attribute</tt> está en blanco
42
56
  if not options[:allow_blank] and send(:"#{attribute}").blank?
43
57
  errors.add attribute.to_sym, (options[:message] or "No puede quedar en blanco")
44
58
  else
45
59
  # normal validations:
46
60
  if not send(:"#{attribute}").blank? and not send(:"#{attribute}_id_validator").valid?
47
61
  if options[:message]
62
+ # poner <tt>options[:message]</tt> si algo está mal
48
63
  errors.add attribute.to_sym, options[:message]
49
64
  else
65
+ # poner los mensajes por defecto si no hay un <tt>options[:message]</tt>
50
66
  send(:"#{attribute}_id_validator").errors.each do |error|
51
67
  errors.add attribute.to_sym, error
52
68
  end
@@ -55,6 +71,7 @@ module IdEcuador
55
71
  # for options:
56
72
  unless options[:only].empty?
57
73
  unless options[:only].include?(send(:"#{attribute}_id_validator").tipo_id_sym)
74
+ # si está especificado <tt>options[:only]</tt>, validar que el tipo de ID esté permitido
58
75
  errors.add attribute.to_sym, (options[:message] or "Tipo de identificación no permitido")
59
76
  end
60
77
  end
@@ -1,4 +1,5 @@
1
1
  module IdEcuador
2
+ # extend <tt>IdEcuador::ModelAdditions</tt> module into Rails' <tt>ActiveRecord::Base</tt>
2
3
  class Railtie < Rails::Railtie
3
4
  intializer 'id_ecuador.model_additions' do
4
5
  ActiveSupport.on_load :active_record do
@@ -1,3 +1,3 @@
1
1
  module IdEcuador
2
- VERSION = "0.0.1.alpha"
2
+ VERSION = "0.0.1.beta"
3
3
  end
@@ -0,0 +1,17 @@
1
+ require "factory_girl"
2
+
3
+ CEDULA_VALIDA = "1104680135"
4
+ CEDULA_INVALIDA = "1104680134"
5
+ RUC_VALIDO = "1104680135001"
6
+
7
+ FactoryGirl.define do
8
+ factory :user do
9
+ identificacion CEDULA_VALIDA
10
+ end
11
+ factory :user_invalid, class: "User" do
12
+ identificacion CEDULA_INVALIDA
13
+ end
14
+ factory :user_ruc, class: "User" do
15
+ identificacion RUC_VALIDO
16
+ end
17
+ end
@@ -5,12 +5,12 @@ describe IdEcuador::Id do
5
5
 
6
6
  describe "interfaz de la clase" do
7
7
  it "debe llamar automáticamente al método validate!" do
8
- id = IdEcuador::Id.new("1104680135")
8
+ id = IdEcuador::Id.new CEDULA_VALIDA
9
9
  id.send(:already_validated).should be_true
10
10
  end
11
11
  it "no debe llamar automáticamente al método validate!" do
12
12
  IdEcuador::Id.any_instance.stub(:validate!)
13
- id = IdEcuador::Id.new("1104680135", validate: false)
13
+ id = IdEcuador::Id.new CEDULA_VALIDA, validate: false
14
14
  id.send(:already_validated).should be_false
15
15
  end
16
16
  end
@@ -27,11 +27,11 @@ describe IdEcuador::Id do
27
27
  id.errors.should include(@error)
28
28
  end
29
29
  it "no debería incluir problemas de longitud con 10 caracteres" do
30
- id = IdEcuador::Id.new "1104680135"
30
+ id = IdEcuador::Id.new CEDULA_VALIDA
31
31
  id.errors.should_not include(@error)
32
32
  end
33
33
  it "no debería incluir problemas de longitud con 13 caracteres" do
34
- id = IdEcuador::Id.new "1104680135001"
34
+ id = IdEcuador::Id.new RUC_VALIDO
35
35
  id.errors.should_not include(@error)
36
36
  end
37
37
  it "debería fallar con longitud mayor a 13 caracteres" do
@@ -47,7 +47,7 @@ describe IdEcuador::Id do
47
47
  id.errors.should include("Código de provincia incorrecto")
48
48
  end
49
49
  it "debería decir que el código de la provincia es 11" do
50
- id = IdEcuador::Id.new "1104680135"
50
+ id = IdEcuador::Id.new CEDULA_VALIDA
51
51
  id.codigo_provincia.should eq(11)
52
52
  end
53
53
  end
@@ -74,11 +74,11 @@ describe IdEcuador::Id do
74
74
  # 6 -> sociedades públicas
75
75
  # 0..5 -> personas naturales
76
76
  it "debería decir que es una persona natural" do
77
- id = IdEcuador::Id.new "1104680135"
77
+ id = IdEcuador::Id.new CEDULA_VALIDA
78
78
  id.tipo_id.should eq("Cédula Persona natural")
79
79
  end
80
80
  it "debería decir que es el RUC de una persona natural" do
81
- id = IdEcuador::Id.new "1104680135001"
81
+ id = IdEcuador::Id.new RUC_VALIDO
82
82
  id.tipo_id.should eq("RUC Persona natural")
83
83
  end
84
84
  it "debería decir que es una sociedad pública" do
@@ -93,10 +93,10 @@ describe IdEcuador::Id do
93
93
 
94
94
  describe "probar con algunas cédulas" do
95
95
  it "debería decir que esta cédula es válida" do
96
- IdEcuador::Id.new("1104680135").valid?.should be_true
96
+ IdEcuador::Id.new(CEDULA_VALIDA).valid?.should be_true
97
97
  end
98
98
  it "debería decir que esta cédula es inválida" do
99
- IdEcuador::Id.new("1104680134").valid?.should be_false
99
+ IdEcuador::Id.new(CEDULA_INVALIDA).valid?.should be_false
100
100
  end
101
101
  it "debería decir que estas cédulas son válidas" do
102
102
  ["1104077209",
@@ -16,12 +16,32 @@ describe IdEcuador::ModelAdditions do
16
16
  user.save.should be_true
17
17
  end
18
18
 
19
+ describe "cache on #attribute_id_validator" do
20
+ it "debería decir que el id del objeto que retorna el método es el mismo mientras la identificación no cambie" do
21
+ user = FactoryGirl.build :user
22
+ id = user.identificacion_id_validator.object_id
23
+ user.identificacion_id_validator.object_id.should eq(id)
24
+ end
25
+ it "no debería expirar el caché si se reasigna el mismo ID" do
26
+ user = FactoryGirl.build :user
27
+ id = user.identificacion_id_validator.object_id
28
+ user.identificacion = FactoryGirl.attributes_for(:user)[:identificacion]
29
+ user.identificacion_id_validator.object_id.should eq(id)
30
+ end
31
+ it "debería expirar el caché si se reasigna otro ID" do
32
+ user = FactoryGirl.build :user
33
+ id = user.identificacion_id_validator.object_id
34
+ user.identificacion = FactoryGirl.attributes_for(:user_invalid)[:identificacion]
35
+ user.identificacion_id_validator.object_id.should_not eq(id)
36
+ end
37
+ end
38
+
19
39
  describe "valida el ID de un usuario antes de guardarlo a la base de datos" do
20
40
  it "debería decir que es válido" do
21
- User.new(identificacion: "1104680135").valid?.should be_true
41
+ FactoryGirl.build(:user).valid?.should be_true
22
42
  end
23
43
  it "debería decir que es inválido" do
24
- user = User.new(identificacion: "1104680134")
44
+ user = FactoryGirl.build(:user_invalid)
25
45
  user.save.should be_false
26
46
  user.errors[:identificacion].should include("ID inválida")
27
47
  end
@@ -52,12 +72,12 @@ describe IdEcuador::ModelAdditions do
52
72
 
53
73
  describe "debe agregar métodos al atributo" do
54
74
  it "debe agregar método `identificacion_tipo_id`" do
55
- user = User.new(identificacion: "1104680135")
75
+ user = FactoryGirl.build(:user)
56
76
  user.respond_to?(:identificacion_tipo_id).should be_true
57
77
  user.identificacion_tipo_id.should eq("Cédula Persona natural")
58
78
  end
59
79
  it "debe agregar método `identificacion_codigo_provincia`" do
60
- user = User.new(identificacion: "1104680135")
80
+ user = FactoryGirl.build(:user)
61
81
  user.respond_to?(:identificacion_codigo_provincia).should be_true
62
82
  user.identificacion_codigo_provincia.should eq(11)
63
83
  end
@@ -77,6 +97,7 @@ describe IdEcuador::ModelAdditions do
77
97
  user.errors[:identificacion].should include("No puede quedar en blanco")
78
98
  end
79
99
  end
100
+
80
101
  describe "specify message" do
81
102
  class UserWithOptionsMessage < SuperModel::Base
82
103
  extend IdEcuador::ModelAdditions
@@ -89,7 +110,7 @@ describe IdEcuador::ModelAdditions do
89
110
  user.errors[:identificacion].should eq(["Not valid!"])
90
111
  end
91
112
  it "debería mostrar 'Not valid!' como error con cédula" do
92
- user = UserWithOptionsMessage.new identificacion: "1104680134"
113
+ user = UserWithOptionsMessage.new FactoryGirl.attributes_for(:user_invalid)
93
114
  user.valid?.should be_false
94
115
  user.errors[:identificacion].should eq(["Not valid!"])
95
116
  end
@@ -102,11 +123,11 @@ describe IdEcuador::ModelAdditions do
102
123
  end
103
124
 
104
125
  it "debería decir que es válido" do
105
- user = UserWithOptionsOnlyCedula.new identificacion: "1104680135"
126
+ user = UserWithOptionsOnlyCedula.new FactoryGirl.attributes_for(:user)
106
127
  user.valid?.should be_true
107
128
  end
108
129
  it "debería decir que es inválido" do
109
- user = UserWithOptionsOnlyCedula.new identificacion: "1104680135001"
130
+ user = UserWithOptionsOnlyCedula.new FactoryGirl.attributes_for(:user_ruc)
110
131
  user.valid?.should be_false
111
132
  user.errors[:identificacion].should include("Tipo de identificación no permitido")
112
133
  end
@@ -117,11 +138,11 @@ describe IdEcuador::ModelAdditions do
117
138
  validates_id :identificacion, only: :ruc
118
139
  end
119
140
  it "debería decir que es válido" do
120
- user = UserWithOptionsOnlyRUC.new identificacion: "1104680135001"
141
+ user = UserWithOptionsOnlyRUC.new FactoryGirl.attributes_for(:user_ruc)
121
142
  user.valid?.should be_true
122
143
  end
123
144
  it "debería decir que es inválido" do
124
- user = UserWithOptionsOnlyRUC.new identificacion: "1104680135"
145
+ user = UserWithOptionsOnlyRUC.new FactoryGirl.attributes_for(:user)
125
146
  user.valid?.should be_false
126
147
  user.errors[:identificacion].should include("Tipo de identificación no permitido")
127
148
  end
@@ -2,5 +2,8 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe IdEcuador do
5
-
5
+ it "should alias IdEcuador#new to IdEcuador::Id#new" do
6
+ id = IdEcuador.new CEDULA_VALIDA
7
+ id.class.should eq(IdEcuador::Id)
8
+ end
6
9
  end
@@ -1,3 +1,4 @@
1
1
  # encoding: utf-8
2
2
  require "id_ecuador"
3
3
  require "supermodel"
4
+ require "factories"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: id_ecuador
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha
4
+ version: 0.0.1.beta
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -75,6 +75,22 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: factory_girl
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
78
94
  description: Validate Ecuador's CI and RUC
79
95
  email:
80
96
  - a@macool.me
@@ -84,6 +100,7 @@ extra_rdoc_files: []
84
100
  files:
85
101
  - .rspec
86
102
  - .travis.yml
103
+ - CHANGELOG.md
87
104
  - Gemfile
88
105
  - LICENSE.txt
89
106
  - README.md
@@ -94,6 +111,7 @@ files:
94
111
  - lib/id_ecuador/model_additions.rb
95
112
  - lib/id_ecuador/railtie.rb
96
113
  - lib/id_ecuador/version.rb
114
+ - spec/factories.rb
97
115
  - spec/id_ecuador/id_spec.rb
98
116
  - spec/id_ecuador/model_additions_spec.rb
99
117
  - spec/id_ecuador_spec.rb
@@ -124,6 +142,7 @@ signing_key:
124
142
  specification_version: 3
125
143
  summary: Gem to validate Ecuador's CI and RUC
126
144
  test_files:
145
+ - spec/factories.rb
127
146
  - spec/id_ecuador/id_spec.rb
128
147
  - spec/id_ecuador/model_additions_spec.rb
129
148
  - spec/id_ecuador_spec.rb