teebo 0.0.5 → 0.0.6

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
2
  SHA1:
3
- metadata.gz: 0116fd7256c8ebc11aaf32761e425cfe26793979
4
- data.tar.gz: 4ad1b311bdd1ca5420f50df2448407245618df95
3
+ metadata.gz: f974479fae12561857d5bf06a7d8dca7ccdb9ec0
4
+ data.tar.gz: 625cc67d205696380258f0609b5bf9d629a0d815
5
5
  SHA512:
6
- metadata.gz: 2cf98921da7875e0398d77725c62efb1d41d6d5ca2ef8c336fbd03516504fb607465b3e1d48d5b613b50ca74e4793a150fb4f6e670d8ab24566a2d1c0515a2ad
7
- data.tar.gz: 9f02487e929191882ea3ac11c55431f03dc42b944917654b211c90cdeb6790b0a6515dbc8382f75dc4432203b482a8a3263458f7a2bb3606f238ddd56b0bd99a
6
+ metadata.gz: ba28733ba9e1d07ce99788a6256dba6e963a82f2502f3b097f3471c3a7b0aa628fe15c7f7670cdafcf2748730ed29e76ab554b83814714a6080ca7d79fb0af3f
7
+ data.tar.gz: 27330412ec7063ebf78042caa44236bf57860ea4a2bac435ee42700406876bd52fcc5c897773b23d6a116fc63cbb1aad0560c0e40086064d92de08248f9b5882
@@ -9,7 +9,7 @@ credit-card-issuers:
9
9
  - 15
10
10
  validation: yes
11
11
  probability: .092
12
- cvc-length: 4
12
+ cvv-length: 4
13
13
  -
14
14
  name: Discover Card
15
15
  iin-prefixes: [ 6011, 622126, 622127, 622128, 622129, 622130, 622131, 622132, 622133, 622134, 622135, 622136, 622137, 622138, 622139, 622140, 622141, 622142, 622143, 622144, 622145, 622146, 622147, 622148, 622149, 622150, 622151, 622152, 622153, 622154, 622155, 622156, 622157, 622158, 622159, 622160, 622161, 622162, 622163, 622164, 622165, 622166, 622167, 622168, 622169, 622170, 622171, 622172, 622173, 622174, 622175, 622176, 622177, 622178, 622179, 622180, 622181, 622182, 622183, 622184, 622185, 622186, 622187, 622188, 622189, 622190, 622191, 622192, 622193, 622194, 622195, 622196, 622197, 622198, 622199, 622200, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 622901, 622902, 622903, 622904, 622905, 622906, 622907, 622908, 622909, 622910, 622911, 622912, 622913, 622914, 622915, 622916, 622917, 622918, 622919, 622920, 622921, 622922, 622923, 622924, 622925, 644, 645, 646, 647, 648, 649, 65 ]
@@ -17,7 +17,7 @@ credit-card-issuers:
17
17
  - 16
18
18
  validation: yes
19
19
  probability: .107
20
- cvc-length: 3
20
+ cvv-length: 3
21
21
  -
22
22
  name: MasterCard
23
23
  iin-prefixes: [ 51, 52, 53, 54, 55 ]
@@ -25,7 +25,7 @@ credit-card-issuers:
25
25
  - 16
26
26
  validation: yes
27
27
  probability: .313
28
- cvc-length: 3
28
+ cvv-length: 3
29
29
  -
30
30
  name: Visa
31
31
  iin-prefixes:
@@ -35,4 +35,4 @@ credit-card-issuers:
35
35
  - 16
36
36
  validation: yes
37
37
  probability: .488
38
- cvc-length: 3
38
+ cvv-length: 3
@@ -5,9 +5,12 @@ require 'randexp'
5
5
  module Teebo
6
6
 
7
7
  class TeeboGenerator
8
- def initialize
9
- @db_connection = Teebo::DatabaseHandler.new
10
- @yaml_mapping = YAML::load(File.open('lib/data/en-us.yml'))
8
+ def self.db_connection
9
+ @db_connection ||= Teebo::DatabaseHandler.new
10
+ end
11
+
12
+ def self.yaml_mapping
13
+ @yaml_mapping ||= YAML::load(File.open('lib/data/en-us.yml'))
11
14
  end
12
15
  end
13
16
  end
@@ -6,18 +6,29 @@ module Teebo
6
6
  #
7
7
  class CreditCard < TeeboGenerator
8
8
 
9
- def initialize
10
- super
11
- @cc_issuers = @yaml_mapping['credit-card-issuers']
9
+ def self.issuers
10
+ @cc_issuers ||= yaml_mapping['credit-card-issuers']
11
+ end
12
+
13
+ def self.generate_card(issuer=nil)
14
+ if issuer.nil?
15
+ issuer = generate_issuer
16
+ end
17
+ [
18
+ 'issuer' => issuer['name'],
19
+ 'number' => generate_number(issuer),
20
+ 'cvv' => generate_cvv_code(issuer),
21
+ 'expiration' => generate_expiration_date
22
+ ]
12
23
  end
13
24
 
14
25
  #
15
26
  # Returns a credit card issuer according to the likelihood that it would be seen in the wild.
16
27
  #
17
- def generate_issuer
28
+ def self.generate_issuer
18
29
  random_choice = Random.rand
19
30
  full_weight = 0
20
- @cc_issuers.each do |issuer|
31
+ issuers.each do |issuer|
21
32
  full_weight += issuer['probability']
22
33
  if random_choice < full_weight
23
34
  return issuer
@@ -28,23 +39,22 @@ module Teebo
28
39
  #
29
40
  # Generates a credit card number according to the pattern specified in the 'issuer' passed in.
30
41
  #
31
- def generate_number(issuer)
42
+ def self.generate_number(issuer)
32
43
  # TODO: Sample according to realistic distribution - numbers w/long prefixes are prioritized too highly right now.
33
44
  prefix = issuer['iin-prefixes'].sample.to_s
34
45
  length = issuer['lengths'].sample
35
- generated = number_to_digits(length - prefix.length)
46
+ generated = number_with_length(length - prefix.length)
36
47
  number = prefix + generated
37
48
  if issuer['validation']
38
49
  last_digit_validation(number)
39
50
  end
40
-
41
51
  end
42
52
 
43
53
  #
44
- # Gets the sum of the digits of the specified number. Necessary to calculate a credit card's
45
- # check digit.
54
+ # Gets the sum of the digits of the specified number, with every other digit doubled. Necessary
55
+ # to calculate a credit card's check digit.
46
56
  #
47
- def luhn_sum(number)
57
+ def self.luhn_sum(number)
48
58
  digits = number.to_s.chars.map(&:to_i)
49
59
  digits.reverse.each_slice(2).map do |x, y|
50
60
  [(x * 2).divmod(10), y || 0]
@@ -55,7 +65,7 @@ module Teebo
55
65
  # A simple implementation of the [Luhn algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm),
56
66
  # which all U.S.-based Credit Card issuers use for the validation check on credit card numbers.
57
67
  #
58
- def luhn_algorithm(number)
68
+ def self.luhn_algorithm(number)
59
69
  digit_sum = luhn_sum(number)
60
70
  ((10 - digit_sum % 10) % 10).to_s
61
71
  end
@@ -64,7 +74,7 @@ module Teebo
64
74
  # Uses the Luhn algorithm to replace the last digit in the generated number with the correct
65
75
  # check digit.
66
76
  #
67
- def last_digit_validation(number)
77
+ def self.last_digit_validation(number)
68
78
  trimmed_number = number[0..-2]
69
79
  check_digit = luhn_algorithm(trimmed_number)
70
80
  trimmed_number + check_digit
@@ -74,9 +84,32 @@ module Teebo
74
84
  # Generates a random number with the specified number of digits, padding the beginning with
75
85
  # '0' characters, if necessary.
76
86
  #
77
- def number_to_digits(digits)
78
- digits = digits.to_i
79
- rand(10 ** digits).to_s.rjust(digits,'0')
87
+ def self.number_with_length(length)
88
+ length = length.to_i
89
+ rand(10 ** length).to_s.rjust(length,'0')
90
+ end
91
+
92
+ #
93
+ # Generates a Credit Card CVV code. This simply returns a random number of the length used by
94
+ # the specified 'issuer' object.
95
+ #
96
+ def self.generate_cvv_code(issuer)
97
+ number_with_length(issuer['cvv-length'])
98
+ end
99
+
100
+ #
101
+ # Generates an expiration date for a credit card. These dates are, somewhat arbitrarily, simply
102
+ # some time in the next 5 years.
103
+ #
104
+ def self.generate_expiration_date
105
+ current_year = Time.now.year - 2000
106
+ month = rand(1...13)
107
+ if month <= Time.now.month
108
+ current_year += 1
109
+ end
110
+ year = rand(current_year...(current_year + 5))
111
+ month = month.to_s.rjust(2,'0')
112
+ "#{month}/#{year}"
80
113
  end
81
114
  end
82
115
  end
@@ -12,11 +12,11 @@ module Teebo
12
12
  # Picks a random first & last name, selecting a random gender if it's not
13
13
  # specified.
14
14
  #
15
- def name (sex=nil)
15
+ def self.generate_name (sex=nil)
16
16
  if sex.nil?
17
17
  sex = %w(M F).sample
18
18
  end
19
- given_name(sex) + ' ' + surname
19
+ generate_given_name(sex) + ' ' + generate_surname
20
20
  end
21
21
 
22
22
  #
@@ -26,38 +26,38 @@ module Teebo
26
26
  # simply be another given name of the same gender is almost certainly less
27
27
  # than 100%.
28
28
  #
29
- def full_name(sex=nil)
29
+ def self.generate_full_name(sex=nil)
30
30
  # TODO: Take into account different probabilities of different types of middle names.
31
31
  if sex.nil?
32
32
  sex = %w(M F).sample
33
33
  end
34
- given_name(sex) + ' ' + given_name(sex) + ' ' + surname
34
+ generate_given_name(sex) + ' ' + generate_given_name(sex) + ' ' + generate_surname
35
35
  end
36
36
 
37
37
  #
38
38
  # Finds the total count for the number of names in the database.
39
39
  #
40
- def sum_count(sex)
41
- @db_connection.get_sum(GIVEN_NAMES_TABLE, 'count', {column: 'sex', condition: sex})
40
+ def self.sum_count(sex)
41
+ db_connection.get_sum(GIVEN_NAMES_TABLE, 'count', {column: 'sex', condition: sex})
42
42
  end
43
43
 
44
44
  #
45
45
  # Selects a random (weighted) given name from the database.
46
46
  #
47
- def given_name(sex)
47
+ def self.generate_given_name(sex)
48
48
  count = sum_count(sex)
49
49
  selection = rand(count)
50
- @db_connection.get_row_for_count(GIVEN_NAMES_TABLE, 'count_to', selection,
50
+ db_connection.get_row_for_count(GIVEN_NAMES_TABLE, 'count_to', selection,
51
51
  {column: 'sex', condition: sex})['name']
52
52
  end
53
53
 
54
54
  #
55
55
  # Selects a random (weighted) surname from the database.
56
56
  #
57
- def surname
58
- count = @db_connection.get_sum(SURNAMES_TABLE, 'count')
57
+ def self.generate_surname
58
+ count = db_connection.get_sum(SURNAMES_TABLE, 'count')
59
59
  selection = rand(count)
60
- @db_connection.get_row_for_count(SURNAMES_TABLE, 'count_to', selection)['name']
60
+ db_connection.get_row_for_count(SURNAMES_TABLE, 'count_to', selection)['name']
61
61
  end
62
62
  end
63
63
  end
@@ -9,7 +9,7 @@ module Teebo
9
9
  # A basic implementation of the Box-Muller transform. Adapted from an answer by antonakos on
10
10
  # Stack Overflow here: http://stackoverflow.com/questions/5825680
11
11
  #
12
- def normal_dist(mean, std_deviation, rand = lambda { Kernel.rand })
12
+ def self.normal_dist(mean, std_deviation, rand = lambda { Kernel.rand })
13
13
  theta = 2 * Math::PI * rand.call
14
14
  rho = Math.sqrt(-2 * Math.log(1 - rand.call))
15
15
  scale = std_deviation * rho
@@ -20,7 +20,7 @@ module Teebo
20
20
  # Generates a number according to Benford's law, meaning that it is more indicative of numbers
21
21
  # encountered in real life.
22
22
  #
23
- def benford_dist(upper_bound, decimals=0)
23
+ def self.benford_dist(upper_bound, decimals=0)
24
24
  (upper_bound**Random.rand).round(decimals)
25
25
  end
26
26
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teebo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russ Taylor
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-12 00:00:00.000000000 Z
11
+ date: 2014-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3