kangal 1.2.0 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +32 -4
- data/config/locales/en.yml +10 -2
- data/config/locales/fr.yml +8 -0
- data/config/locales/tr.yml +8 -0
- data/lib/kangal.rb +3 -0
- data/lib/kangal/identity_number.rb +2 -0
- data/lib/kangal/phone.rb +17 -0
- data/lib/kangal/tax_number.rb +2 -0
- data/lib/kangal/tckn.rb +33 -0
- data/lib/kangal/tcvkn.rb +40 -0
- data/lib/kangal/version.rb +1 -1
- data/spec/email_spec.rb +2 -7
- data/spec/identity_number_spec.rb +2 -7
- data/spec/phone_spec.rb +82 -0
- data/spec/spec_helper.rb +1 -5
- data/spec/subdomain_spec.rb +16 -7
- data/spec/tax_number_spec.rb +2 -7
- data/spec/tckn_spec.rb +19 -0
- data/spec/tcvkn_spec.rb +19 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 451e3bb3d08ea408e4a54fded98b428db3c0cdbf
|
4
|
+
data.tar.gz: 445d0d87de688fd8f2f52c4b897a1a315363834c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd2c1ac1fcbceba099f7b06ec480ab3632177f05b63816582cfa9fdcec837423fd314332206acd671618492732ee4aadba534a001ea528f615113debfc276cf0
|
7
|
+
data.tar.gz: 62ca23261a9a961d837fbeed31f6dbf1434b21b521053f8f6006192224f9ad39159e2f80d9214c5006bf5f48786c6fdbfab9df702d5ba26dbfa46c4dc3d515a2
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -80,7 +80,7 @@ p.valid? # => true
|
|
80
80
|
|
81
81
|
**Default reserved names:** www, ftp, mail, pop, smtp, admin, ssl, sftp, http, https
|
82
82
|
|
83
|
-
|
83
|
+
### Turkish Government Identity Number Validator
|
84
84
|
```ruby
|
85
85
|
require 'kangal'
|
86
86
|
class User
|
@@ -88,7 +88,7 @@ class User
|
|
88
88
|
attr_accessor :identity
|
89
89
|
|
90
90
|
# Identity Number validator
|
91
|
-
validates :email, presence: :true,
|
91
|
+
validates :email, presence: :true, tcno: :true
|
92
92
|
end
|
93
93
|
|
94
94
|
p = User.new
|
@@ -104,7 +104,7 @@ p.identity = "83317527040" # (this isn't a real identity number)
|
|
104
104
|
p.valid? # => true
|
105
105
|
```
|
106
106
|
|
107
|
-
|
107
|
+
### Turkish Government Tax Number Validator
|
108
108
|
```ruby
|
109
109
|
require 'kangal'
|
110
110
|
class User
|
@@ -112,7 +112,7 @@ class User
|
|
112
112
|
attr_accessor :tax_number
|
113
113
|
|
114
114
|
# Identity Number validator
|
115
|
-
validates :tax_number, presence: :true,
|
115
|
+
validates :tax_number, presence: :true, tcvkn: :true
|
116
116
|
end
|
117
117
|
|
118
118
|
p = User.new
|
@@ -128,6 +128,34 @@ p.tax_number = "6120069217" # (this isn't a real tax number)
|
|
128
128
|
p.valid? # => true
|
129
129
|
```
|
130
130
|
|
131
|
+
### IP Validator
|
132
|
+
```ruby
|
133
|
+
require 'kangal'
|
134
|
+
class Server
|
135
|
+
include ActiveModel::Validations
|
136
|
+
attr_accessor :ip
|
137
|
+
|
138
|
+
# Ip validator
|
139
|
+
validates :ip, presence: :true, ip: :true
|
140
|
+
end
|
141
|
+
|
142
|
+
p = Server.new
|
143
|
+
p.ip = "10.10.10.256"
|
144
|
+
p.valid? # => false
|
145
|
+
|
146
|
+
p = Server.new
|
147
|
+
p.ip = "2222.22.22.22"
|
148
|
+
p.valid? # => false
|
149
|
+
|
150
|
+
p = Server.new
|
151
|
+
p.ip = "255.255.255.255"
|
152
|
+
p.valid? # => true
|
153
|
+
|
154
|
+
p = Server.new
|
155
|
+
p.ip = "132.254.111.10"
|
156
|
+
p.valid? # => true
|
157
|
+
```
|
158
|
+
|
131
159
|
## Bugs and Feedback
|
132
160
|
|
133
161
|
If you discover any bugs or want to drop a line, feel free to create an issue on GitHub.
|
data/config/locales/en.yml
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
en:
|
2
2
|
kangal:
|
3
3
|
validations:
|
4
|
+
common:
|
5
|
+
invalid: 'is invalid'
|
4
6
|
email:
|
5
7
|
invalid: 'is invalid'
|
6
8
|
subdomain:
|
@@ -10,7 +12,13 @@ en:
|
|
10
12
|
alphanumeric: 'must be alphanumeric; A-Z, 0-9 or hyphen'
|
11
13
|
identity_number:
|
12
14
|
invalid: 'is invalid.'
|
13
|
-
|
15
|
+
tckn:
|
14
16
|
invalid: 'is invalid.'
|
15
17
|
tax_number:
|
16
|
-
invalid: 'is invalid.'
|
18
|
+
invalid: 'is invalid.'
|
19
|
+
tcvkn:
|
20
|
+
invalid: 'is invalid.'
|
21
|
+
ip:
|
22
|
+
invalid: 'is invalid.'
|
23
|
+
phone:
|
24
|
+
tr: 'should be start with 90'
|
data/config/locales/fr.yml
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
en:
|
2
2
|
kangal:
|
3
3
|
validations:
|
4
|
+
common:
|
5
|
+
invalid: 'est invalide'
|
4
6
|
email:
|
5
7
|
invalid: 'est invalide'
|
6
8
|
subdomain:
|
@@ -10,7 +12,13 @@ en:
|
|
10
12
|
alphanumeric: 'il faut être alphanumérique; A-Z, 0-9 ou trait'
|
11
13
|
identity_number:
|
12
14
|
invalid: 'est invalide.'
|
15
|
+
tckn:
|
16
|
+
invalid: 'est invalide.'
|
13
17
|
tax_number:
|
14
18
|
invalid: 'est invalide.'
|
19
|
+
tcvkn:
|
20
|
+
invalid: 'est invalide.'
|
15
21
|
ip:
|
16
22
|
invalid: 'est invalide.'
|
23
|
+
phone:
|
24
|
+
tr: '90 ile başlaması lazım.'
|
data/config/locales/tr.yml
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
tr:
|
2
2
|
kangal:
|
3
3
|
validations:
|
4
|
+
common:
|
5
|
+
invalid: 'geçersizdir.'
|
4
6
|
email:
|
5
7
|
invalid: 'geçersizdir.'
|
6
8
|
subdomain:
|
@@ -10,7 +12,13 @@ tr:
|
|
10
12
|
alphanumeric: 'alfanümerik olmalıdır; A-Z, 0-9 veya tire'
|
11
13
|
identity_number:
|
12
14
|
invalid: 'geçersizdir.'
|
15
|
+
tckn:
|
16
|
+
invalid: 'geçersizdir.'
|
13
17
|
tax_number:
|
14
18
|
invalid: 'geçersizdir.'
|
19
|
+
tcvkn:
|
20
|
+
invalid: 'geçersizdir.'
|
15
21
|
ip:
|
16
22
|
invalid: 'geçersizdir.'
|
23
|
+
phone:
|
24
|
+
tr: '90 ile başlaması lazım.'
|
data/lib/kangal.rb
CHANGED
@@ -2,7 +2,10 @@ require 'kangal/version'
|
|
2
2
|
require 'kangal/email'
|
3
3
|
require 'kangal/subdomain'
|
4
4
|
require 'kangal/identity_number'
|
5
|
+
require 'kangal/tckn'
|
5
6
|
require 'kangal/tax_number'
|
7
|
+
require 'kangal/tcvkn'
|
6
8
|
require 'kangal/ip'
|
9
|
+
require 'kangal/phone'
|
7
10
|
|
8
11
|
I18n.load_path += Dir.glob(File.expand_path('../../config/locales/**/*',__FILE__))
|
@@ -4,6 +4,8 @@ require 'active_model/validations'
|
|
4
4
|
class IdentityNumberValidator < ActiveModel::EachValidator
|
5
5
|
def validate_each(record, attribute, value)
|
6
6
|
|
7
|
+
ActiveSupport::Deprecation.warn "`identity_number: :true` is deprecated and may be removed from future releases, use `tckn: true` instead.", caller
|
8
|
+
|
7
9
|
return if options[:allow_nil] && value.nil?
|
8
10
|
return if options[:allow_blank] && value.blank?
|
9
11
|
|
data/lib/kangal/phone.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_model/validations'
|
3
|
+
|
4
|
+
# All phones number should be store e.164 format standard
|
5
|
+
class PhoneValidator < ActiveModel::EachValidator
|
6
|
+
def validate_each(object, attribute, value)
|
7
|
+
|
8
|
+
return if options[:allow_nil] && value.nil?
|
9
|
+
return if options[:allow_blank] && value.blank?
|
10
|
+
|
11
|
+
if options[:tr]
|
12
|
+
object.errors[attribute] << I18n.t('kangal.validations.common.invalid') unless value =~ /^(90)+\d{10}$/i
|
13
|
+
end
|
14
|
+
|
15
|
+
object.errors[attribute] << I18n.t('kangal.validations.phone.tr') unless value =~ /^\d{11,14}$/i
|
16
|
+
end
|
17
|
+
end
|
data/lib/kangal/tax_number.rb
CHANGED
@@ -4,6 +4,8 @@ require 'active_model/validations'
|
|
4
4
|
class TaxNumberValidator < ActiveModel::EachValidator
|
5
5
|
def validate_each(object, attribute, value)
|
6
6
|
|
7
|
+
ActiveSupport::Deprecation.warn "`tax_number: :true` is deprecated and may be removed from future releases, use `tcvkn: true` instead.", caller
|
8
|
+
|
7
9
|
return if options[:allow_nil] && value.nil?
|
8
10
|
return if options[:allow_blank] && value.blank?
|
9
11
|
|
data/lib/kangal/tckn.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_model/validations'
|
3
|
+
|
4
|
+
class TcknValidator < ActiveModel::EachValidator
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
|
7
|
+
return if options[:allow_nil] && value.nil?
|
8
|
+
return if options[:allow_blank] && value.blank?
|
9
|
+
|
10
|
+
digits = value[0..-3].each_char.map(&:to_i).each_with_index
|
11
|
+
first, last =
|
12
|
+
digits.reduce([0, 0]) do |memo, (digit, idx)|
|
13
|
+
add = digit * (idx.even? ? 7 : -1)
|
14
|
+
[
|
15
|
+
(memo.first + add) % 10,
|
16
|
+
(memo.last + digit + add) % 10
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
valid = (!invalid_value?(value, 11) && value[-2] == first.to_s && value[-1] == last.to_s)
|
21
|
+
record.errors.add attribute, (options[:message] || I18n.t(:invalid, :scope => 'kangal.validations.tckn')) unless valid
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def invalid_value?(str, length)
|
27
|
+
str.nil? || str.length != length || !numeric?(str)
|
28
|
+
end
|
29
|
+
|
30
|
+
def numeric?(str)
|
31
|
+
!!(str =~ /\A[[:digit:]]+\Z/)
|
32
|
+
end
|
33
|
+
end
|
data/lib/kangal/tcvkn.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_model/validations'
|
3
|
+
|
4
|
+
class TcvknValidator < ActiveModel::EachValidator
|
5
|
+
def validate_each(object, attribute, value)
|
6
|
+
|
7
|
+
return if options[:allow_nil] && value.nil?
|
8
|
+
return if options[:allow_blank] && value.blank?
|
9
|
+
|
10
|
+
|
11
|
+
digits = value[0..-2].each_char.map(&:to_i).each_with_index
|
12
|
+
|
13
|
+
checksum =
|
14
|
+
digits.reduce(0) do |memo, (digit, idx)|
|
15
|
+
rev_idx = 9 - idx
|
16
|
+
coeff = [1, 2, 4, 8, 7, 5][rev_idx % 6]
|
17
|
+
result = (digit + rev_idx) % 10
|
18
|
+
|
19
|
+
if result.nonzero?
|
20
|
+
result = (coeff * result) % 9
|
21
|
+
result = 9 if result.zero?
|
22
|
+
end
|
23
|
+
memo += result
|
24
|
+
end
|
25
|
+
|
26
|
+
valid = !invalid_value?(value, 10) && ((checksum + value[-1].to_i) % 10 == 0)
|
27
|
+
|
28
|
+
object.errors.add attribute, (options[:message] || I18n.t(:invalid, :scope => 'kangal.validations.tax_number')) unless valid
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def invalid_value?(str, length)
|
34
|
+
str.nil? || str.length != length || !numeric?(str)
|
35
|
+
end
|
36
|
+
|
37
|
+
def numeric?(str)
|
38
|
+
!!(str =~ /\A[[:digit:]]+\Z/)
|
39
|
+
end
|
40
|
+
end
|
data/lib/kangal/version.rb
CHANGED
data/spec/email_spec.rb
CHANGED
@@ -6,13 +6,8 @@ end
|
|
6
6
|
|
7
7
|
describe 'Email format' do
|
8
8
|
|
9
|
-
let(:invalid_emails)
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:valid_emails) do
|
14
|
-
%w(info@lab2023.com abc@ab.com)
|
15
|
-
end
|
9
|
+
let(:invalid_emails) { %w(invalid email) }
|
10
|
+
let(:valid_emails) { %w(info@lab2023.com abc@ab.com) }
|
16
11
|
|
17
12
|
it 'should be invalid' do
|
18
13
|
invalid_emails.each { |email| User.new(email: email).valid?.should be_false }
|
@@ -6,13 +6,8 @@ end
|
|
6
6
|
|
7
7
|
describe 'Identity number format' do
|
8
8
|
|
9
|
-
let(:invalid_identity_numbers)
|
10
|
-
%w(
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:valid_identity_numbers) do
|
14
|
-
%w(21432692144 55679901158 83317527040)
|
15
|
-
end
|
9
|
+
let(:invalid_identity_numbers) { %w(1 3 434542345678) }
|
10
|
+
let(:valid_identity_numbers) { %w(21432692144 55679901158 83317527040) }
|
16
11
|
|
17
12
|
it 'should be invalid' do
|
18
13
|
invalid_identity_numbers.each { |identity| Profile.new(identity: identity).valid?.should be_false }
|
data/spec/phone_spec.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Phone < SpecModel
|
4
|
+
validates :number, phone: true
|
5
|
+
end
|
6
|
+
|
7
|
+
class PhoneTr < SpecModel
|
8
|
+
validates :number, phone: {tr: true}
|
9
|
+
end
|
10
|
+
|
11
|
+
class PhoneTrMobile < SpecModel
|
12
|
+
validates :number, phone: {tr_and_mobile: true}
|
13
|
+
end
|
14
|
+
|
15
|
+
class PhoneTrNormal < SpecModel
|
16
|
+
validates :number, phone: {tr_and_normal: true}
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'Phone format' do
|
20
|
+
|
21
|
+
let(:valid_phone) do
|
22
|
+
%w(
|
23
|
+
905532620000
|
24
|
+
902122120000
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:invalid_phone) do
|
29
|
+
%w(
|
30
|
+
abde
|
31
|
+
1234
|
32
|
+
12341234123443434
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should be valid' do
|
37
|
+
valid_phone.each { |number| Phone.new(number: number).valid?.should be_true }
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should be invalid' do
|
41
|
+
invalid_phone.each { |number| Phone.new(number: number).valid?.should be_false }
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:valid_tr) do
|
45
|
+
%w(
|
46
|
+
905326200000
|
47
|
+
908508850000
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
let(:invalid_tr) do
|
52
|
+
%w(
|
53
|
+
+1231231233200
|
54
|
+
00100000000000
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should be valid with tr option' do
|
59
|
+
valid_tr.each { |tr_phone| PhoneTr.new(number: tr_phone).valid?.should be_true }
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should be invalid with tr option' do
|
63
|
+
invalid_tr.each { |tr_phone| PhoneTr.new(number: tr_phone).valid?.should be_false }
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should be valid with tr and mobile option' do
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should be invalid with tr and mobile option' do
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should be valid with tr and normal option' do
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should be invalid with tr and normal option' do
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/subdomain_spec.rb
CHANGED
@@ -4,15 +4,14 @@ class Company < SpecModel
|
|
4
4
|
validates :subdomain, subdomain: true
|
5
5
|
end
|
6
6
|
|
7
|
-
|
7
|
+
class Account < SpecModel
|
8
|
+
validates :subdomain, subdomain: {reserved: %w{help reserved_word}}
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
%w(-lab2023 https ab)
|
11
|
-
end
|
11
|
+
describe 'Subdomain format' do
|
12
12
|
|
13
|
-
let(:
|
14
|
-
%w(lab2023 lab2023-internet)
|
15
|
-
end
|
13
|
+
let(:invalid_subdomains) { %w(-lab2023 https ab) }
|
14
|
+
let(:valid_subdomains) { %w(lab2023 lab2023-internet) }
|
16
15
|
|
17
16
|
it 'should be invalid' do
|
18
17
|
invalid_subdomains.each { |subdomain| Company.new(subdomain: subdomain).valid?.should be_false }
|
@@ -22,4 +21,14 @@ describe 'Subdomain format' do
|
|
22
21
|
valid_subdomains.each { |subdomain| Company.new(subdomain: subdomain).valid?.should be_true }
|
23
22
|
end
|
24
23
|
|
24
|
+
it 'should be invalid because of reserved' do
|
25
|
+
account = Account.new(subdomain: 'reserved_word')
|
26
|
+
account.valid?
|
27
|
+
account.errors.messages[:subdomain].should include(I18n.t(:reserved, scope: 'kangal.validations.subdomain'))
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should be valid because of reserved' do
|
31
|
+
Account.new(subdomain: 'unreservedword').valid?.should be_true
|
32
|
+
end
|
33
|
+
|
25
34
|
end
|
data/spec/tax_number_spec.rb
CHANGED
@@ -6,13 +6,8 @@ end
|
|
6
6
|
|
7
7
|
describe 'tax number format' do
|
8
8
|
|
9
|
-
let(:invalid_tax_numbers)
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:valid_tax_numbers) do
|
14
|
-
%w(2640020928 6120069217)
|
15
|
-
end
|
9
|
+
let(:invalid_tax_numbers) { %w(1 3 434542345678 43454234567) }
|
10
|
+
let('valid_tax_numbers') { %w(2640020928 6120069217) }
|
16
11
|
|
17
12
|
it 'should be invalid' do
|
18
13
|
invalid_tax_numbers.each { |tax| CompanyDetail.new(tax: tax).valid?.should be_false }
|
data/spec/tckn_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Profile < SpecModel
|
4
|
+
validates :identity, tckn: true
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'Tckn number format' do
|
8
|
+
|
9
|
+
let(:invalid_tckn) { %w(1 3 434542345678) }
|
10
|
+
let(:valid_tckn) { %w(21432692144 55679901158 83317527040) }
|
11
|
+
|
12
|
+
it 'should be invalid' do
|
13
|
+
invalid_tckn.each { |identity| Profile.new(identity: identity).valid?.should be_false }
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should be valid' do
|
17
|
+
valid_tckn.each { |identity| Profile.new(identity: identity).valid?.should be_true }
|
18
|
+
end
|
19
|
+
end
|
data/spec/tcvkn_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class CompanyDetail < SpecModel
|
4
|
+
validates :tax, tcvkn: true
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'tax number format' do
|
8
|
+
|
9
|
+
let(:invalid_tcvkn) { %w(1 3 434542345678 43454234567) }
|
10
|
+
let(:valid_tcvkn) { %w(2640020928 6120069217) }
|
11
|
+
|
12
|
+
it 'should be invalid' do
|
13
|
+
invalid_tcvkn.each { |tax| CompanyDetail.new(tax: tax).valid?.should be_false }
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should be valid' do
|
17
|
+
valid_tcvkn.each { |tax| CompanyDetail.new(tax: tax).valid?.should be_true }
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kangal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lab2023
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -105,15 +105,21 @@ files:
|
|
105
105
|
- lib/kangal/email.rb
|
106
106
|
- lib/kangal/identity_number.rb
|
107
107
|
- lib/kangal/ip.rb
|
108
|
+
- lib/kangal/phone.rb
|
108
109
|
- lib/kangal/subdomain.rb
|
109
110
|
- lib/kangal/tax_number.rb
|
111
|
+
- lib/kangal/tckn.rb
|
112
|
+
- lib/kangal/tcvkn.rb
|
110
113
|
- lib/kangal/version.rb
|
111
114
|
- spec/email_spec.rb
|
112
115
|
- spec/identity_number_spec.rb
|
113
116
|
- spec/ip_spec.rb
|
117
|
+
- spec/phone_spec.rb
|
114
118
|
- spec/spec_helper.rb
|
115
119
|
- spec/subdomain_spec.rb
|
116
120
|
- spec/tax_number_spec.rb
|
121
|
+
- spec/tckn_spec.rb
|
122
|
+
- spec/tcvkn_spec.rb
|
117
123
|
homepage: https://github.com/kebab-project/kangal
|
118
124
|
licenses:
|
119
125
|
- MIT
|