turkish_id 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dc0c27c0249bbc0975bbbee292472f7610332dca
4
- data.tar.gz: f31b8b7ebac5f45001d9bd250d7a3e91bfbcaf98
2
+ SHA256:
3
+ metadata.gz: bbb26b22018a74e1d6f96e7a99fb04b67e62763b3470b3fa3b4efebd347dee95
4
+ data.tar.gz: 426878d705b49faeb15398622e4746a30f0955cb31fe80c27f8193be72397297
5
5
  SHA512:
6
- metadata.gz: 7b0709b84290238345307945fbc083f9cf42114c02d6cf4e5fb78e71a14a77bf455d1963980664d57d8307b85fbe7d4d3c7cacaadfcb398c6705a5fe409139fb
7
- data.tar.gz: 4d7e23a004e3253997ccb60a8e5dcbf3ce98a2a68ab3078d8866658b1c90b279abb4eb07ecd54821558ce8427c0272f09d1e9d242bfe8fbce6dc607cf06ec143
6
+ metadata.gz: 662308d80cd939cdeaccb7e121d84b26051f2f29827d54ec617a17786d372d8f985ddd964c33547e7c693226aedc138d98e18e728655ddee67d74ab73f498cf5
7
+ data.tar.gz: 2a0e0d9fe6f032e5d7a7766281fbbeae8610b35eaa06758edeaaf959c766a4d19d96e317bdf5bd946fda02f3d3d31bb6cbb2359aca79a05b4b69088316daa4f2
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.2.0
1
+ ruby-2.5.1
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
- # Turkish ID [![Build Status](https://travis-ci.org/krmbzds/turkish_id.svg?branch=master)](https://travis-ci.org/krmbzds/turkish_id) [![Dependency Status](https://gemnasium.com/krmbzds/turkish_id.svg)](https://gemnasium.com/krmbzds/turkish_id) [![Gem](https://img.shields.io/gem/dt/turkish_id.svg)](https://rubygems.org/gems/turkish_id) [![Code Climate](https://codeclimate.com/github/krmbzds/turkish_id/badges/gpa.svg)](https://codeclimate.com/github/krmbzds/turkish_id) [![Test Coverage](https://codeclimate.com/github/krmbzds/turkish_id/badges/coverage.svg)](https://codeclimate.com/github/krmbzds/turkish_id/coverage)
2
- This gem provides methods to validate Turkish Identification Numbers.
1
+ # Turkish ID
2
+
3
+ [![Build Status](https://travis-ci.org/krmbzds/turkish_id.svg?branch=master)](https://travis-ci.org/krmbzds/turkish_id) [![Gem](https://img.shields.io/gem/v/turkish_id.svg)](https://github.com/krmbzds/turkish_id) [![Dependencies](https://img.shields.io/badge/dependencies-none-brightgreen.svg)](https://rubygems.org/gems/turkish_id) [![Gem](https://img.shields.io/gem/dt/turkish_id.svg)](https://rubygems.org/gems/turkish_id) [![Code Climate](https://codeclimate.com/github/krmbzds/turkish_id/badges/gpa.svg)](https://codeclimate.com/github/krmbzds/turkish_id) [![Test Coverage](https://codeclimate.com/github/krmbzds/turkish_id/badges/coverage.svg)](https://codeclimate.com/github/krmbzds/turkish_id/coverage)
3
4
 
5
+ This gem provides methods to validate Turkish Identification Numbers.
4
6
 
5
7
  ## Installation
6
8
 
@@ -23,7 +25,7 @@ Or install it yourself as:
23
25
  Create a new instance:
24
26
 
25
27
  ```rb
26
- identity_number = TurkishId.new('10000000146')
28
+ identity_number = TurkishId.new(10000000146)
27
29
  ```
28
30
 
29
31
  Use ```is_valid?``` method to check validity:
@@ -54,6 +56,49 @@ Where ```dn``` refers to the ```n-th``` digit of the identification number.
54
56
 
55
57
  Remember that a valid identification number does not imply the existence of an ID. It could only be used as a preliminary check e.g. before querying a government website. This is very similar to credit card validation.
56
58
 
59
+
60
+ ## Generating Relatives
61
+
62
+ You can generate ID numbers for your younger or elder relatives.
63
+
64
+ ```rb
65
+ me = TurkishId.new(10000000146)
66
+ me.elder_relatives.take(5)
67
+ ```
68
+
69
+ Calling `younger_relative` or `elder_relative` will return an Enumerable class.
70
+
71
+ ```rb
72
+ me.elder_relative
73
+ #=> #<Enumerator:0x00007f9e629032d0>
74
+ ```
75
+
76
+ You can perform standard Enumerable operations on it.
77
+
78
+ ```rb
79
+ me.elder_relative.first
80
+
81
+ #=> 10003000082
82
+ ```
83
+
84
+ ```rb
85
+ 3.times do
86
+ puts me.elder_relative.next()
87
+ end
88
+
89
+ #=> 10035998982
90
+ #=> 10005999902
91
+ #=> 10008999848
92
+ ```
93
+
94
+ ```rb
95
+ me.elder_relative.take(5)
96
+
97
+ #=> [10003000082, 10005999902, 10008999848, 10011999774, 10014999610]
98
+ ```
99
+
100
+ And so on.
101
+
57
102
  ## Development
58
103
 
59
104
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/bin/console CHANGED
@@ -7,8 +7,8 @@ require "turkish_id"
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
9
  # (If you use this, don't forget to add pry to your Gemfile!)
10
- require "pry"
11
- Pry.start
10
+ # require "pry"
11
+ # Pry.start
12
12
 
13
- # require "irb"
14
- # IRB.start
13
+ require "irb"
14
+ IRB.start
@@ -1,3 +1,3 @@
1
1
  class TurkishId
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/turkish_id.rb CHANGED
@@ -1,54 +1,79 @@
1
1
  require "turkish_id/version"
2
2
 
3
3
  class TurkishId
4
- attr_reader :id_number, :checksum
4
+ attr_reader :id_number, :checksum, :elder_relative, :younger_relative
5
5
 
6
6
  def initialize(id_number)
7
- @id_number = digitize(id_number)
7
+ @id_number = get_id_array(id_number)
8
8
  @checksum = calculate_checksum(@id_number)
9
+ @elder_relative = generate_relatives(@id_number, :up)
10
+ @younger_relative = generate_relatives(@id_number, :down)
9
11
  end
10
12
 
11
13
  def is_valid?
12
- id = @id_number # For brevity
13
-
14
14
  # Early termination, bad length or first digit
15
- return false if id.length != 11 || id.first == 0
15
+ return false if @id_number.length != 11 || @id_number.first == 0
16
16
 
17
17
  # Calculate checksum if not already calculated
18
- @checksum ||= calculate_checksum(id_number)
19
-
20
- # Check if the tenth digit matches the algorithm
21
- return false if id[9] != @checksum[0]
18
+ @checksum ||= calculate_checksum(@id_number)
22
19
 
23
- # Check if the eleventh digit matches the algorithm
24
- return false if id[10] != @checksum[1]
20
+ # Check if tenth or eleventh digits match the algorithm
21
+ return false if @id_number[9] != @checksum[0] || @id_number[10] != @checksum[1]
25
22
 
26
23
  true # All conditions met
27
24
  end
28
25
 
29
26
  private
30
27
 
31
- def calculate_checksum(id_number)
28
+ def calculate_checksum(id_array)
32
29
  # Calculate the sums of odd and even digits
33
- odds = id_number.values_at(0, 2, 4, 6, 8).reduce(:+)
34
- evens = id_number.values_at(1, 3, 5, 7).reduce(:+)
30
+ odds = id_array.values_at(0, 2, 4, 6, 8).reduce(:+)
31
+ evens = id_array.values_at(1, 3, 5, 7).reduce(:+)
35
32
 
36
33
  # Generate checksum digits
37
34
  d10 = ((odds * 7) - evens) % 10
38
- d11 = (id_number.take(9).reduce(:+) + d10) % 10
35
+ d11 = (id_array.take(9).reduce(:+) + d10) % 10
39
36
 
40
37
  # Return checksum
41
38
  [d10, d11]
42
39
  rescue
43
- [] # Unable to calculate checksum, initial value remains unchainged
40
+ []
41
+ end
42
+
43
+ def append_checksum(id)
44
+ id_core = split_num(id)
45
+ join_num(id_core + calculate_checksum(id_core))
46
+ end
47
+
48
+ def next_relative(id_array, direction)
49
+ tree = { up: 1, down: -1 }
50
+ get_core(id_array) + 29999 * tree[direction]
44
51
  end
45
52
 
46
- def digitize(id_number)
47
- # Narrow down scope of accepted types
48
- return [] unless [String, Integer, Fixnum].include?(id_number.class)
53
+ def generate_relatives(id_array, direction)
54
+ Enumerator.new do |y|
55
+ id = join_num(id_array)
56
+ loop do
57
+ id = next_relative(id, direction)
58
+ y << append_checksum(id)
59
+ end
60
+ end
61
+ end
62
+
63
+ def get_id_array(id)
64
+ split_num(Integer(id)) rescue []
65
+ end
49
66
 
50
- # Convert string of numbers into an array of integers
51
- id_number.to_s.split('').map { |s| Integer(s) }
67
+ def split_num(num)
68
+ n = Math.log10(num).floor
69
+ (0..n).map{ |i| (num / 10 ** (n - i)) % 10 }
52
70
  end
53
71
 
72
+ def join_num(id_array)
73
+ id_array.inject{ |a, i| a * 10 + i }
74
+ end
75
+
76
+ def get_core(id_array)
77
+ join_num(split_num(id_array).take(9))
78
+ end
54
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turkish_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kerem Bozdas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-10 00:00:00.000000000 Z
11
+ date: 2018-04-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Validate Turkish Identification Numbers and More!
14
14
  email:
@@ -54,7 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
54
54
  version: '0'
55
55
  requirements: []
56
56
  rubyforge_project:
57
- rubygems_version: 2.6.14
57
+ rubygems_version: 2.7.6
58
58
  signing_key:
59
59
  specification_version: 4
60
60
  summary: Validate Turkish Identification Numbers and More!