ffaker 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +32 -0
  3. data/README.md +7 -6
  4. data/REFERENCE.md +1355 -0
  5. data/Rakefile +6 -6
  6. data/ffaker.gemspec +16 -3
  7. data/lib/ffaker.rb +1 -1
  8. data/lib/ffaker/address_ca.rb +3 -3
  9. data/lib/ffaker/avatar.rb +20 -0
  10. data/lib/ffaker/bacon_ipsum.rb +1 -1
  11. data/lib/ffaker/data/job_cn/job_nouns +300 -0
  12. data/lib/ffaker/data/sport/names +34 -0
  13. data/lib/ffaker/dizzle_ipsum.rb +1 -1
  14. data/lib/ffaker/healthcare_ipsum.rb +1 -1
  15. data/lib/ffaker/hipster_ipsum.rb +1 -1
  16. data/lib/ffaker/html_ipsum.rb +1 -1
  17. data/lib/ffaker/identification_kr.rb +20 -0
  18. data/lib/ffaker/identification_mx.rb +3 -3
  19. data/lib/ffaker/internet.rb +3 -3
  20. data/lib/ffaker/internet_se.rb +1 -1
  21. data/lib/ffaker/job_cn.rb +12 -0
  22. data/lib/ffaker/job_fr.rb +6 -2
  23. data/lib/ffaker/locale.rb +1 -1
  24. data/lib/ffaker/lorem.rb +7 -5
  25. data/lib/ffaker/lorem_ar.rb +1 -1
  26. data/lib/ffaker/lorem_cn.rb +1 -1
  27. data/lib/ffaker/lorem_fr.rb +1 -1
  28. data/lib/ffaker/lorem_kr.rb +1 -1
  29. data/lib/ffaker/movie.rb +6 -0
  30. data/lib/ffaker/phone_number.rb +46 -17
  31. data/lib/ffaker/product.rb +1 -1
  32. data/lib/ffaker/skill.rb +1 -1
  33. data/lib/ffaker/sport.rb +10 -0
  34. data/lib/ffaker/string.rb +22 -11
  35. data/lib/ffaker/utils/array_utils.rb +4 -3
  36. data/lib/ffaker/vehicle.rb +1 -1
  37. data/scripts/reference.rb +89 -0
  38. data/test/test_address_ca.rb +6 -4
  39. data/test/test_array_utils.rb +3 -3
  40. data/test/test_avatar.rb +50 -0
  41. data/test/test_company.rb +8 -6
  42. data/test/test_identification.rb +5 -4
  43. data/test/test_identification_kr.rb +13 -0
  44. data/test/test_internet.rb +4 -0
  45. data/test/test_job.rb +1 -2
  46. data/test/test_job_cn.rb +17 -0
  47. data/test/test_job_fr.rb +4 -7
  48. data/test/test_job_ja.rb +1 -1
  49. data/test/test_job_kr.rb +1 -1
  50. data/test/test_locale.rb +21 -0
  51. data/test/test_lorem_kr.rb +1 -1
  52. data/test/test_movie.rb +8 -0
  53. data/test/test_name.rb +3 -3
  54. data/test/test_name_br.rb +7 -8
  55. data/test/test_name_cs.rb +8 -6
  56. data/test/test_name_de.rb +3 -3
  57. data/test/test_name_fr.rb +15 -17
  58. data/test/test_name_ga.rb +12 -14
  59. data/test/test_name_it.rb +14 -15
  60. data/test/test_name_ja.rb +1 -1
  61. data/test/test_name_mx.rb +82 -80
  62. data/test/test_name_nb.rb +6 -9
  63. data/test/test_name_nl.rb +3 -3
  64. data/test/test_name_ph.rb +12 -2
  65. data/test/test_name_ru.rb +14 -10
  66. data/test/test_name_se.rb +6 -9
  67. data/test/test_name_sn.rb +39 -52
  68. data/test/test_name_th.rb +7 -9
  69. data/test/test_phone_number.rb +9 -0
  70. data/test/test_sports.rb +13 -0
  71. data/test/test_string.rb +26 -16
  72. data/test/test_units.rb +8 -10
  73. data/test/test_units_english.rb +15 -22
  74. data/test/test_units_metric.rb +15 -21
  75. metadata +22 -4
@@ -0,0 +1,34 @@
1
+ Surfing
2
+ Bodyboarding
3
+ Wakeboarding
4
+ Kitesurfing
5
+ Mountain Bike
6
+ Longboard
7
+ Skateboarding
8
+ Windsurfing
9
+ Bodysurfing
10
+ BMX
11
+ Base jumping
12
+ Ski
13
+ Skimboarding
14
+ Snowboarding
15
+ Sandboarding
16
+ Soccer
17
+ Volleyball
18
+ Football
19
+ Hockey
20
+ Basketball
21
+ Rugby
22
+ Running
23
+ Jiu Jitsu
24
+ Mixed Martial Arts
25
+ Karate
26
+ Judo
27
+ Wrestling
28
+ Kickboxing
29
+ Muay-Thai
30
+ Rapel
31
+ Formula One
32
+ Formula Indy
33
+ Nascar
34
+ Rafting
@@ -15,7 +15,7 @@ module FFaker
15
15
  end
16
16
 
17
17
  def words(num = 3)
18
- DIZZLE_WORDS.random_pick(num)
18
+ DIZZLE_WORDS.sample(num)
19
19
  end
20
20
  end
21
21
  end
@@ -14,7 +14,7 @@ module FFaker
14
14
  end
15
15
 
16
16
  def words(num = 3)
17
- HEALTHCARE_WORDS.random_pick(num)
17
+ HEALTHCARE_WORDS.sample(num)
18
18
  end
19
19
  end
20
20
  end
@@ -15,7 +15,7 @@ module FFaker
15
15
  end
16
16
 
17
17
  def words(num = 3)
18
- HIPSTER_WORDS.random_pick(num)
18
+ HIPSTER_WORDS.sample(num)
19
19
  end
20
20
  end
21
21
  end
@@ -129,7 +129,7 @@ module FFaker
129
129
  "<code>#{words 2}</code>",
130
130
  "#{a 2}"
131
131
  ] + FFaker::Lorem::paragraphs(count))
132
- a.random_pick(count).join(sep)
132
+ a.sample(count).join(sep)
133
133
  end
134
134
 
135
135
  private
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ module FFaker
4
+ module IdentificationKr
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ # Resident Registration Number
9
+ # http://ko.wikipedia.org/wiki/%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EB%B2%88%ED%98%B8
10
+ def rrn
11
+ birth = [*Date.new(1970, 1, 1)..Date.new(1999, 12, 31)].sample.strftime("%y%d%m")
12
+ sex = [1, 2].sample
13
+ loc = FFaker.numerify("#{[*"00".."95"].sample}###")
14
+ a, b, c, d, e, f, g, h, i, j, k, l = "#{birth}#{sex}#{loc}".split(//).map(&:to_i)
15
+ checksum = (11 - (2 * a + 3 * b + 4 * c + 5 * d + 6 * e + 7 * f + 8 * g + 9 * h + 2 * i + 3 * j + 4 * k + 5 * l) % 11) % 10
16
+ "#{birth}-#{sex}#{loc}#{checksum}"
17
+ end
18
+ end
19
+ end
20
+
@@ -18,7 +18,7 @@ module FFaker
18
18
  consonants_n = CONSONANTS + ["Ñ"]
19
19
  all_letters = consonants_n + VOWELS
20
20
  date = ::Time.at(rand * ::Time.now.to_f).strftime("%y%m%d")
21
- "#{consonants_n.sample}#{VOWELS.sample}#{ArrayUtils.random_pick(all_letters,2).join}#{date}#{ArrayUtils.random_pick(HOMOCLAVE,3).join}"
21
+ "#{consonants_n.sample}#{VOWELS.sample}#{all_letters.sample(2).join}#{date}#{HOMOCLAVE.sample(3).join}"
22
22
  end
23
23
 
24
24
  # http://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico)
@@ -27,7 +27,7 @@ module FFaker
27
27
  consonants_n_amp = CONSONANTS + ["Ñ", "&"]
28
28
  all_letters = consonants_n_amp + VOWELS
29
29
  date = ::Time.at(rand * ::Time.now.to_f).strftime("%y%m%d")
30
- "#{ArrayUtils.random_pick(all_letters,3).join}#{date}#{ArrayUtils.random_pick(HOMOCLAVE,3).join}"
30
+ "#{all_letters.sample(3).join}#{date}#{HOMOCLAVE.sample(3).join}"
31
31
  end
32
32
 
33
33
  # http://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico)
@@ -42,7 +42,7 @@ module FFaker
42
42
  all_letters = CONSONANTS + VOWELS
43
43
  hm = ["H","M"]
44
44
  date = ::Time.at(rand * ::Time.now.to_f).strftime("%y%m%d")
45
- "#{CONSONANTS.sample}#{VOWELS.sample}#{ArrayUtils.random_pick(all_letters,2).join}#{date}#{hm.sample}#{ESTADOS_CURP.sample}#{ArrayUtils.random_pick(CONSONANTS,3).join}#{HOMOCLAVE.sample}#{rand(10)}"
45
+ "#{CONSONANTS.sample}#{VOWELS.sample}#{all_letters.sample(2).join}#{date}#{hm.sample}#{ESTADOS_CURP.sample}#{CONSONANTS.sample(3).join}#{HOMOCLAVE.sample}#{rand(10)}"
46
46
  end
47
47
  end
48
48
  end
@@ -26,12 +26,12 @@ module FFaker
26
26
  end
27
27
 
28
28
  def safe_email(name = nil)
29
- [user_name(name), 'example.'+ %w[org com net].shuffle.first].join('@')
29
+ [user_name(name), 'example.'+ %w[org com net].sample].join('@')
30
30
  end
31
31
 
32
32
  def user_name(name = nil)
33
33
  if name
34
- parts = ArrayUtils.shuffle(name.scan(/\w+/)).join(%w(. _).sample)
34
+ parts = name.scan(/\w+/).shuffle.join(%w(. _).sample)
35
35
  parts.downcase
36
36
  else
37
37
  case rand(2)
@@ -84,7 +84,7 @@ module FFaker
84
84
  while temp.length < min_length
85
85
  temp += Lorem.word
86
86
  end
87
- if max_length > min_length && temp.length > max_length
87
+ if max_length >= min_length && temp.length > max_length
88
88
  temp = temp.slice(0, max_length)
89
89
  end
90
90
 
@@ -63,7 +63,7 @@ module FFaker
63
63
  end
64
64
 
65
65
  def user_name_from_name(name)
66
- array_parts = ArrayUtils.shuffle(name.scan(/\w+/))
66
+ array_parts = name.scan(/\w+/).shuffle
67
67
  join_to_user_name(array_parts)
68
68
  end
69
69
 
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module FFaker
4
+ module JobCN
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ def title
9
+ JOB_NOUNS.sample
10
+ end
11
+ end
12
+ end
@@ -5,10 +5,14 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- JOB_ADJECTIVES = ['', 'general', '', 'adjoint', '', 'associé', '']
8
+ JOB_ADJECTIVES = %w(general adjoint associé)
9
9
 
10
10
  def title
11
- "#{JOB_PREFIXES.sample} #{JOB_ADJECTIVES.sample} #{JOB_NOUNS.sample}"
11
+ if rand(2).zero?
12
+ "#{JOB_PREFIXES.sample} #{JOB_ADJECTIVES.sample} #{JOB_NOUNS.sample}"
13
+ else
14
+ "#{JOB_PREFIXES.sample} #{JOB_NOUNS.sample}"
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -15,7 +15,7 @@ module FFaker
15
15
  end
16
16
 
17
17
  def language(given_code = nil)
18
- language_index = LANGUAGE_CODE.index(given_code.upcase)
18
+ language_index = LANGUAGE_CODE.index(given_code && given_code.upcase)
19
19
  if given_code && language_index
20
20
  LANGUAGE[language_index]
21
21
  else
@@ -15,14 +15,16 @@ module FFaker
15
15
  end
16
16
 
17
17
  def words(num = 3)
18
- WORDS.random_pick(num)
18
+ WORDS.sample(num)
19
19
  end
20
20
 
21
21
  def sentence(word_count = 4)
22
- s = words(word_count + rand(5) + 1)
23
- s[0].capitalize!
24
- s = s.join(' ')
25
- "#{s}."
22
+ first_word, *last_words = words(word_count + rand(5) + 1)
23
+ if last_words.nil?
24
+ first_word.capitalize
25
+ else
26
+ "#{first_word.capitalize} #{last_words.join(' ')}."
27
+ end
26
28
  end
27
29
 
28
30
  alias_method :phrase, :sentence
@@ -11,7 +11,7 @@ module FFaker
11
11
  end
12
12
 
13
13
  def words(num = 3)
14
- WORDS.random_pick(num)
14
+ WORDS.sample(num)
15
15
  end
16
16
 
17
17
  def sentence(word_count = 4)
@@ -11,7 +11,7 @@ module FFaker
11
11
  end
12
12
 
13
13
  def words(num = 3)
14
- WORDS.random_pick(num)
14
+ WORDS.sample(num)
15
15
  end
16
16
 
17
17
  def sentence(word_count = 4)
@@ -10,7 +10,7 @@ module FFaker
10
10
  end
11
11
 
12
12
  def words(num = 3)
13
- WORDS.random_pick(num)
13
+ WORDS.sample(num)
14
14
  end
15
15
 
16
16
  def sentence(word_count = 4)
@@ -10,7 +10,7 @@ module FFaker
10
10
  end
11
11
 
12
12
  def words(num = 3)
13
- WORDS.random_pick(num)
13
+ WORDS.sample(num)
14
14
  end
15
15
 
16
16
  def sentence(word_count = 4)
@@ -11,6 +11,8 @@ module FFaker
11
11
  ]
12
12
  COLORS = %w{Red Yellow Black White}
13
13
 
14
+ RATINGS = %w(G PG PG-13 R NC-17) # According to MPAA
15
+
14
16
  def title
15
17
  case rand(4)
16
18
  when 0 then title_with_prefix
@@ -20,6 +22,10 @@ module FFaker
20
22
  end
21
23
  end
22
24
 
25
+ def rating
26
+ RATINGS.sample
27
+ end
28
+
23
29
  private
24
30
 
25
31
  def title_with_prefix
@@ -7,27 +7,56 @@ module FFaker
7
7
 
8
8
  def phone_number
9
9
  FFaker.numerify case rand(20)
10
- when 0 then '###-###-#### x#####'
11
- when 1 then '###-###-#### x####'
12
- when 2 then '###-###-#### x###'
13
- when 3..4 then '###-###-####'
14
- when 5 then '###.###.#### x#####'
15
- when 6 then '###.###.#### x####'
16
- when 7 then '###.###.#### x###'
17
- when 8..9 then '###.###.####'
18
- when 10 then '(###)###-#### x#####'
19
- when 11 then '(###)###-#### x####'
20
- when 12 then '(###)###-#### x###'
21
- when 13..14 then '(###)###-####'
22
- when 15 then '1-###-###-#### x#####'
23
- when 16 then '1-###-###-#### x####'
24
- when 17 then '1-###-###-#### x###'
25
- when 18..19 then '1-###-###-####'
10
+ when 0 then "#{area_code}-###-#### x#####"
11
+ when 1 then "#{area_code}-###-#### x####"
12
+ when 2 then "#{area_code}-###-#### x###"
13
+ when 3..4 then "#{area_code}-###-####"
14
+ when 5 then "#{area_code}.###.#### x#####"
15
+ when 6 then "#{area_code}.###.#### x####"
16
+ when 7 then "#{area_code}.###.#### x###"
17
+ when 8..9 then "#{area_code}.###.####"
18
+ when 10 then "(#{area_code})###-#### x#####"
19
+ when 11 then "(#{area_code})###-#### x####"
20
+ when 12 then "(#{area_code})###-#### x###"
21
+ when 13..14 then "(#{area_code})###-####"
22
+ when 15 then "1-#{area_code}-###-#### x#####"
23
+ when 16 then "1-#{area_code}-###-#### x####"
24
+ when 17 then "1-#{area_code}-###-#### x###"
25
+ when 18..19 then "1-#{area_code}-###-####"
26
26
  end
27
27
  end
28
28
 
29
+ def area_code
30
+ # The North American Numbering Plan (NANP) does not permit the digits 0
31
+ # and 1 as the leading digit of an area code.
32
+ # https://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes
33
+ rand(201..999)
34
+ end
35
+
29
36
  def short_phone_number
30
- FFaker.numerify('###-###-####')
37
+ FFaker.numerify("#{area_code}-###-####")
38
+ end
39
+
40
+ def imei(serial_number=nil)
41
+ # IMEI Format:
42
+ # AA-BBBBBB-CCCCCC-D
43
+
44
+ rbi = "00" # Test IMEI for countries with 2-digit country codes
45
+ tac = "#{rbi}124500" # iPhone
46
+
47
+ serial_number ||= rand(1_000_000)
48
+ serial_number = sprintf('%06d', serial_number)
49
+
50
+ imei_base = tac + serial_number
51
+
52
+ check_digit = 0
53
+ base_digits = imei_base.split('').map(&:to_i)
54
+ base_digits.each_with_index do |digit, i|
55
+ check_digit += i.even? ? 2*digit : digit
56
+ end
57
+ check_digit = (10 - check_digit % 10) % 10
58
+
59
+ "#{imei_base}#{check_digit}"
31
60
  end
32
61
 
33
62
  end
@@ -31,7 +31,7 @@ module FFaker
31
31
  end
32
32
 
33
33
  def letters(n)
34
- max = n.is_a?(Range) ? n.to_a.shuffle.first : n
34
+ max = n.is_a?(Range) ? n.to_a.sample : n
35
35
  (0...max).map { LETTERS.sample.upcase }.join
36
36
  end
37
37
 
@@ -10,7 +10,7 @@ module FFaker
10
10
  end
11
11
 
12
12
  def tech_skills(num = 3)
13
- TECH_SKILLS.random_pick(num)
13
+ TECH_SKILLS.sample(num)
14
14
  end
15
15
 
16
16
  def specialty
@@ -0,0 +1,10 @@
1
+ module FFaker
2
+ module Sport
3
+ extend ModuleUtils
4
+ extend self
5
+
6
+ def name
7
+ NAMES.sample
8
+ end
9
+ end
10
+ end
@@ -6,13 +6,14 @@ module FFaker
6
6
  extend self
7
7
 
8
8
  BACKSLASH = '\\'
9
+ DASH = '-'
9
10
 
10
11
  LOWERS = [*'a'..'z']
11
12
  UPPERS = [*'A'..'Z']
12
13
  LETTERS = LOWERS + UPPERS
13
14
  NUMBERS = [*'0'..'9']
14
15
  WORD_CHARS = LETTERS + NUMBERS + ['_']
15
- SPACES = [" ", "\t"]
16
+ SPACES = [' ', "\t"]
16
17
  ESCAPEABLE_CHARS = '\\', '/', '.', '(', ')', '[', ']', '{', '}'
17
18
 
18
19
  def from_regexp(exp)
@@ -30,12 +31,17 @@ module FFaker
30
31
 
31
32
  private
32
33
 
33
- def join_escapes(tokens)
34
+ def generate_range(tokens)
34
35
  result = []
35
36
  while tokens.any?
36
37
  token = tokens.shift
37
- token << tokens.shift if token == BACKSLASH
38
- result << token
38
+ if token == DASH && tokens.first && result.last
39
+ result += [*result.pop..tokens.shift]
40
+ elsif token == BACKSLASH
41
+ result << special(tokens.shift)
42
+ else
43
+ result << token
44
+ end
39
45
  end
40
46
  result
41
47
  end
@@ -47,18 +53,18 @@ module FFaker
47
53
 
48
54
  case token
49
55
  when '?' then
50
- # TODO: Let ? generate nothong
51
- return '' # We already printed its target
56
+ # TODO: Let ? generate nothing
57
+ '' # We already printed its target
52
58
  when '+' then
53
59
  tokens.unshift(token) if rand(2) == 1 # Leave the `+` on to run again
54
- return process_token(@last_token) # Run the last one at least once
60
+ process_token(@last_token) # Run the last one at least once
55
61
  when '*' then
56
62
  tokens.unshift(token) if rand(2) == 1 # Leave the `*` on to run again
57
63
  return '' if rand(2) == 1 # Or maybe do nothing
58
- return process_token(@last_token) # Else run the last one again
64
+ process_token(@last_token) # Else run the last one again
65
+ else
66
+ generate_token token, tokens
59
67
  end
60
-
61
- generate_token token, tokens
62
68
  end
63
69
 
64
70
  def generate_token(token, tokens)
@@ -76,7 +82,10 @@ module FFaker
76
82
  set << ch
77
83
  end
78
84
  @last_token = ['['] + set + [']']
79
- process_token([join_escapes(set).sample])
85
+
86
+ process_token([generate_range(set).sample])
87
+ else
88
+ token
80
89
  end
81
90
  end
82
91
 
@@ -86,6 +95,8 @@ module FFaker
86
95
  when 'd' then NUMBERS.sample
87
96
  when 's' then SPACES.sample
88
97
  when *ESCAPEABLE_CHARS then token
98
+ else
99
+ ''
89
100
  end
90
101
  end
91
102
  end