cz_faker 0.0.1

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
+ SHA1:
3
+ metadata.gz: 5d0f86c89f74147d4fb42a1623cc1f5e50ea6505
4
+ data.tar.gz: f19457c82e839390fb712901cb9adfc409003146
5
+ SHA512:
6
+ metadata.gz: 4e1609622f0c36409361253798b008b9126e6db6bc8d392200ee50b3e5de1409f31e2d80fbdcbae04c22b8a797654c41ca327e6ef59d7b70b64d9b07f4ccff06
7
+ data.tar.gz: d535c06503e5de3e909e6741499e1053cfb6eecd0a2360f5935a338ca9aea52f1fb2a9c45150c0c223c0884c4d8a9aa0422dc6f771daeac073fe3f5a438c080b
@@ -0,0 +1,42 @@
1
+ module CzFaker
2
+ class Address
3
+ class << self
4
+ def load_address
5
+ @address ||= Base.read_sample_data('address')
6
+ @address
7
+ end
8
+
9
+ def street
10
+ load_address['streets'].sample
11
+ end
12
+
13
+ def city
14
+ load_address['cities'].sample
15
+ end
16
+
17
+ def house_number
18
+ Number.integer(2)
19
+ end
20
+
21
+ def street_number
22
+ Number.integer(1)
23
+ end
24
+
25
+ def city_part
26
+ load_address['city_parts'].sample
27
+ end
28
+
29
+ def region
30
+ load_address['regions'].sample
31
+ end
32
+
33
+ def post_code
34
+ load_address['zips'].sample
35
+ end
36
+
37
+ def address
38
+ ["#{street} #{house_number}/#{street_number}", city, post_code].join(", ")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,117 @@
1
+ module CzFaker
2
+ class Bank
3
+ class << self
4
+
5
+ CARD_DEFS = {
6
+ master_card: {length: 16, prefixes: %w[51 52 53 54 55] },
7
+ maestro: { length: 16, prefixes: %w[5018 5020 5038 5893 6304 6759 6761 6762 6763]},
8
+ visa: { length: 16, prefixes: %w[4]}
9
+ }.freeze
10
+ CARD_TYPES = %i[ visa maestro master_card ].freeze
11
+ ACCOUNT_PREFIX_WEIGHTS = [ 10, 5, 8, 4, 2 ].freeze
12
+ ACCOUNT_NUMBER_WEIGHTS = [ 6, 3, 7, 9, 10, 5, 8, 4, 2 ].freeze
13
+
14
+ def load_codes
15
+ @codes ||= Base.read_sample_data('bank')
16
+ @codes
17
+ end
18
+
19
+ def full_account_number(with_prefix = false)
20
+ "#{account_number(with_prefix)}/#{bank_code}"
21
+ end
22
+
23
+ def account_number(with_prefix = false)
24
+ number = begin
25
+ base = []
26
+ sum = 0
27
+ ACCOUNT_NUMBER_WEIGHTS.each do |weight|
28
+ base << Number.integer(1).to_i
29
+ sum += (weight * base.last)
30
+ end
31
+ base << (11 - (sum % 11)) % 10
32
+ base.join.to_i.to_s
33
+ end
34
+ if with_prefix
35
+ "#{account_prefix}-#{number}"
36
+ else
37
+ number
38
+ end
39
+ end
40
+
41
+ def bank_code
42
+ load_codes['banks'].sample['code']
43
+ end
44
+
45
+ def bank_name
46
+ load_codes['banks'].sample['name']
47
+ end
48
+
49
+ def bank_swift
50
+ while (swift = load_codes['banks'].sample['swift']) == ""
51
+ end
52
+ swift
53
+ end
54
+
55
+ def bank
56
+ load_codes['banks'].sample
57
+ end
58
+
59
+ def iban
60
+ nil
61
+ end
62
+
63
+ def credit_card(type = nil)
64
+ type = CARD_TYPES.sample if type.nil?
65
+ card_number = card_issuer_prefix(type)
66
+ (CARD_DEFS[type][:length] - 7).times do
67
+ card_number += Number.integer(1)
68
+ end
69
+ card_number += luhn(card_number).to_s
70
+ end
71
+
72
+ def credit_card_formated(type = nil)
73
+ credit_card(type).chars.each_slice(4).map(&:join).join(" ")
74
+ end
75
+
76
+ private
77
+
78
+ def account_prefix
79
+ base = []
80
+ sum = 0
81
+ ACCOUNT_PREFIX_WEIGHTS.each do |weight|
82
+ base << Number.integer(1).to_i
83
+ sum += (weight * base.last)
84
+ end
85
+ base << (11 - (sum % 11)) % 10
86
+ base.join.to_i.to_s
87
+ end
88
+
89
+ def card_issuer_prefix(type)
90
+ prefix = CARD_DEFS[type][:prefixes].sample.to_s
91
+ (6 - prefix.size).times do
92
+ prefix += Number.integer(1)
93
+ end
94
+ prefix
95
+ end
96
+
97
+ def luhn(card_number)
98
+ ss = card_number.split(//)
99
+ alternate = true
100
+ total = 0
101
+ ss.each do |c|
102
+ total += alternate ? double_mod(c.to_i) : c.to_i
103
+ alternate = !alternate
104
+ end
105
+ (10 - (total % 10)) % 10
106
+ end
107
+
108
+ def double_mod(i)
109
+ i *= 2
110
+ if i > 9
111
+ i = i % 10 + 1
112
+ end
113
+ i
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,42 @@
1
+ module CzFaker
2
+ class Company
3
+ LEGAL_FORMS = ['Společnost s ručením omezeným', 'Akciová společnost', 'Komanditni společnost', 'Obecně prospěšná společnost', 'Zapsaný spolek'].freeze
4
+ BASE_NAMES = ["Společnost A", "Agenda B", "Firma C", "Spolek D", "Fabrika E"].freeze
5
+ SUFFIXES = ["s.r.o", "a.s.", "k.s.", "o.p.s.", "z.s."].freeze
6
+ ICO_WEIGHTS = [8, 7, 6, 5, 4, 3, 2].freeze
7
+
8
+ class << self
9
+ def name
10
+ [base_name, suffix].join(" ")
11
+ end
12
+
13
+ def suffix
14
+ SUFFIXES.sample
15
+ end
16
+
17
+ def base_name
18
+ BASE_NAMES.sample
19
+ end
20
+
21
+ def ico
22
+ sum = 0
23
+ base = []
24
+ ICO_WEIGHTS.each do |weight|
25
+ base << Number.integer(1).to_i
26
+ sum += (weight * base.last)
27
+ end
28
+ base << (11 - (sum % 11)) % 10
29
+ base.join
30
+ end
31
+
32
+ def dic(ico = nil)
33
+ ["CZ", ico.nil? ? Number.integer(9) : ico].join("")
34
+ end
35
+
36
+ def legal_form
37
+ LEGAL_FORMS.sample
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ module CzFaker
2
+ class Date
3
+
4
+ MONTHS = %w[ leden únor březen duben květen červen červenec srpen září říjen listopad prosinec ].freeze
5
+ YEARS = (1950..2018).to_a.freeze
6
+ class << self
7
+ def numbers(year = 1920..(Time.now.year))
8
+ random_date(year).strftime("%-d.%-m.%Y")
9
+ end
10
+
11
+ def numbers_padded(year = 1920..(Time.now.year))
12
+ random_date(year).strftime("%d.%m.%Y")
13
+ end
14
+
15
+ def words(year = 1920..(Time.now.year))
16
+ date = random_date(year)
17
+ "#{date.day}. #{MONTHS[date.month]} #{date.year}"
18
+ end
19
+
20
+ def random_date(year)
21
+ return rand(::Date.civil(year.min, 1, 1)..::Date.civil(year.max, 12, 31)) if year.is_a?(Range)
22
+ rand(::Date.civil(year, 1, 1)..::Date.civil(year, 12, 31))
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module CzFaker
2
+ class Energy
3
+
4
+ GAS_DISTRIBUTORS = ["RWE GasNet", "E.ON Distribuce", "Pražská Plynárenská"].freeze
5
+ ELECTRICITY_DISTRIBUTORS = ["ČEZ Distribuce", "E.ON Distribuce", "PREdistribuce"].freeze
6
+
7
+ class << self
8
+
9
+ def ean
10
+ "1"
11
+ end
12
+
13
+ def eic
14
+ "1"
15
+ end
16
+
17
+ def gas_distribution_company
18
+ GAS_DISTRIBUTORS.sample
19
+ end
20
+
21
+ def electricity_distribution_company
22
+ ELECTRICITY_DISTRIBUTORS.sample
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,53 @@
1
+ module CzFaker
2
+ class Name
3
+ PREFIXES = %w[Bc. Mgr. MgA. Ing. JUDr. MUDr. MDDr. MVDr. RNDr. PharmDr. PhDr. PeaDr. Dr.].freeze
4
+ SUFFIXES = %w[CSc. Ph.D. Th.D. DSc. DiS. MBA].freeze
5
+ GENDERS = %i[male female].freeze
6
+
7
+ class << self
8
+ def load_names
9
+ @names ||= Base.read_sample_data('name')
10
+ @names
11
+ end
12
+
13
+ def first_name(gender = :random)
14
+ load_names['first_names'][random_gender(gender)].sample['name']
15
+ end
16
+
17
+ def last_name(gender = :random)
18
+ load_names['last_names'][random_gender(gender)].sample['name']
19
+ end
20
+
21
+ def name(gender = :random)
22
+ gender = random_gender(gender)
23
+ [first_name(gender), last_name(gender)].join(" ")
24
+ end
25
+
26
+ def name_with_prefix(gender = :random)
27
+ [prefix, name(gender)].join(" ")
28
+ end
29
+
30
+ def name_with_suffix(gender = :random)
31
+ [name(gender), suffix].join(" ")
32
+ end
33
+
34
+ def name_with_titles(gender = :random)
35
+ [prefix, name(gender), suffix].join(" ")
36
+ end
37
+
38
+ def random_gender(gender = :random)
39
+ return GENDERS.sample.to_s if gender == :random
40
+ gender.to_s
41
+ end
42
+
43
+ def prefix
44
+ PREFIXES.sample
45
+ end
46
+
47
+ def suffix
48
+ SUFFIXES.sample
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,16 @@
1
+ module CzFaker
2
+ class Number
3
+ class << self
4
+ def integer(length = 6)
5
+ if length.is_a?(Range)
6
+ length = integer_between(length.begin, length.end)
7
+ end
8
+ Array.new(length) { rand(10) }.join
9
+ end
10
+
11
+ def integer_between(min, max)
12
+ rand(max - min) + min
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module CzFaker
2
+ class PaymentMethod
3
+ METHODS = %w[ převodem složenkou SIPO inkaso ].freeze
4
+ class << self
5
+ def method
6
+ METHODS.sample
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,50 @@
1
+ module CzFaker
2
+ class Person
3
+ GENDERS = %w[ muž žena ].freeze
4
+ RELIGIONS = %w[ křesťan katolík muslim pretestant ateista žid ].freeze
5
+
6
+ class << self
7
+ def gender
8
+ GENDERS.sample
9
+ end
10
+
11
+ def birth_number(date = nil, gender = :male, slash = true)
12
+ if date
13
+ date_part = ::Date.parse(date.to_s).strftime("%y%m%d")
14
+ else
15
+ date_part = ::Date.parse(Date.numbers).strftime("%y%m%d")
16
+ "#{Number.integer(6)}/#{Number.integer(4)}"
17
+ end
18
+ if gender == :female
19
+ date_part[2] = (date_part[2].to_i + 5).to_s
20
+ end
21
+ count = rand(989).to_s.rjust(3, "0")
22
+ while (check = eleven_checksum(date_part + count)) == "10"
23
+ count = rand(989).to_s.rjust(3, "0")
24
+ end
25
+ "#{date_part}#{slash ? '/' : ''}#{count}#{check}"
26
+ end
27
+
28
+ def drivers_license
29
+ Number.integer(10)
30
+ end
31
+
32
+ def id_number
33
+ Number.integer(10)
34
+ end
35
+
36
+ def religion
37
+ RELIGIONS.sample
38
+ end
39
+
40
+ def eleven_checksum(number)
41
+ sum = 0
42
+ number.split('').each_slice(2) do |odd, even|
43
+ sum += even.to_i - odd.to_i
44
+ end
45
+ ((11 - (sum % 11)) % 11).to_s
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,49 @@
1
+ module CzFaker
2
+ class PhoneNumber
3
+
4
+ CELL_PREFIXES = ((601..608).to_a + (702..799).to_a).map(&:to_s).freeze
5
+ LAND_LINE_PREFIXES = (200..599).to_a.map(&:to_s).freeze
6
+ FREE_LINE_PREFIXES = ["800"].freeze
7
+ COUNTRY_PREFIX = ["+420", "00420"].freeze
8
+
9
+ class << self
10
+
11
+ def cell
12
+ CELL_PREFIXES.sample + Number.integer(6)
13
+ end
14
+
15
+ def land_line
16
+ LAND_LINE_PREFIXES.sample + Number.integer(6)
17
+ end
18
+
19
+ def free_line
20
+ FREE_LINE_PREFIXES.sample + Number.integer(6)
21
+ end
22
+
23
+ def international_cell
24
+ [COUNTRY_PREFIX[0], cell].join("")
25
+ end
26
+
27
+ def international_land_line
28
+ [COUNTRY_PREFIX[0], land_line].join("")
29
+ end
30
+
31
+ def country_prefix
32
+ COUNTRY_PREFIX.sample
33
+ end
34
+
35
+ def cell_prefix
36
+ CELL_PREFIXES.sample
37
+ end
38
+
39
+ def land_line_prefix
40
+ LAND_LINE_PREFIXES.sample
41
+ end
42
+
43
+ def free_prefix
44
+ FREE_LINE_PREFIXES.sample
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,93 @@
1
+ module CzFaker
2
+ module Validator
3
+ class Bank
4
+ CARD_DEFS = {
5
+ master_card: {length: 16, prefixes: %w[51 52 53 54 55] },
6
+ maestro: { length: 16, prefixes: %w[5018 5020 5038 5893 6304 6759 6761 6762 6763]},
7
+ visa: { length: 16, prefixes: %w[4]}
8
+ }.freeze
9
+ ACCOUNT_PREFIX_WEIGHTS = [ 10, 5, 8, 4, 2, 1 ].freeze
10
+ ACCOUNT_NUMBER_WEIGHTS = [ 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ].freeze
11
+
12
+ class << self
13
+ def account_number?(account_number)
14
+ prefix, number = account_number.split("-")
15
+ if prefix && number
16
+ return false if prefix.size > 6
17
+ return false unless prefix_number? prefix
18
+ else
19
+ number = prefix
20
+ end
21
+ return false if number.size > 10
22
+ base_account_number? number
23
+ end
24
+
25
+ def full_account_number?(account_number)
26
+ number, code = account_number.split("/")
27
+ return false unless account_number? number
28
+ bank_code? code
29
+ end
30
+
31
+ def credit_card?(card_number)
32
+ return false unless credit_card_issuer(card_number)
33
+ luhn(card_number)
34
+ end
35
+
36
+ def bank_code?(code)
37
+ code.size == 4
38
+ end
39
+
40
+ private
41
+
42
+ def credit_card_issuer(card_number)
43
+ card_number = card_number.to_s
44
+ CARD_DEFS.each do |issuer, definition|
45
+ definition[:prefixes].each do |prefix|
46
+ return issuer if card_number.start_with?(prefix)
47
+ end
48
+ end
49
+ nil
50
+ end
51
+
52
+ def base_account_number?(account_number)
53
+ account_number = account_number.to_s
54
+ number = "#{'0' * (10 - account_number.size)}#{account_number}"
55
+ sum = 0
56
+ ACCOUNT_NUMBER_WEIGHTS.each_with_index do |weight, index|
57
+ sum += number[index].to_i * weight
58
+ end
59
+ (sum % 11).zero?
60
+ end
61
+
62
+ def prefix_number?(account_prefix)
63
+ account_prefix = account_prefix.to_s
64
+ prefix = "#{'0' * (6 - account_prefix.size)}#{account_prefix}"
65
+ sum = 0
66
+ ACCOUNT_PREFIX_WEIGHTS.each_with_index do |weight, index|
67
+ sum += prefix[index].to_i * weight
68
+ end
69
+ (sum % 11).zero?
70
+ end
71
+
72
+ def luhn(card_number)
73
+ ss = card_number.split(//)
74
+ alternate = true
75
+ total = 0
76
+ ss.each do |c|
77
+ total += alternate ? double_mod(c.to_i) : c.to_i
78
+ alternate = !alternate
79
+ end
80
+ (total % 10).zero?
81
+ end
82
+
83
+ def double_mod(i)
84
+ i *= 2
85
+ if i > 9
86
+ i = i % 10 + 1
87
+ end
88
+ i
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,22 @@
1
+ module CzFaker
2
+ module Validator
3
+ class Company
4
+ ICO_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 1].freeze
5
+ class << self
6
+ def ico?(number)
7
+ number = "#{'0' * (8 - number.to_s.size)}#{number}"
8
+ sum = 0
9
+ ICO_WEIGHTS.each_with_index do |weight, index|
10
+ sum += (weight * number[index].to_i)
11
+ end
12
+ (sum % 11).zero?
13
+ end
14
+
15
+ def dic?(number)
16
+ return false unless number.start_with?("CZ")
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module CzFaker
2
+ module Validator
3
+ class Person
4
+ class << self
5
+ def birth_number?(birth_number)
6
+ eleven_checksum(birth_number.split('/').join('')).zero?
7
+ end
8
+
9
+ private
10
+
11
+ def eleven_checksum(number)
12
+ sum = 0
13
+ number.split('').each_slice(2) do |odd, even|
14
+ sum += even.to_i - odd.to_i
15
+ end
16
+ ((11 - (sum % 11)) % 11)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/cz_faker.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'yaml'
2
+
3
+ module CzFaker
4
+ BASE_LIB_PATH = File.expand_path(__dir__)
5
+
6
+ class Base
7
+ class << self
8
+ def read_sample_data(dataset)
9
+ data_path = "#{CzFaker::BASE_LIB_PATH}/data/#{dataset}.yaml"
10
+ YAML.load(File.open(data_path))
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ Dir.glob(File.join(File.dirname(__FILE__), 'cz_faker', '*.rb')).sort.each { |f| require f }
17
+ Dir.glob(File.join(File.dirname(__FILE__), 'cz_faker', 'validator', '*.rb')).sort.each { |f| require f }