factory-helper 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/History.txt +126 -0
- data/License.txt +20 -0
- data/README.md +445 -0
- data/lib/extensions/array.rb +22 -0
- data/lib/extensions/symbol.rb +9 -0
- data/lib/factory-helper.rb +182 -0
- data/lib/factory-helper/address.rb +59 -0
- data/lib/factory-helper/app.rb +22 -0
- data/lib/factory-helper/avatar.rb +14 -0
- data/lib/factory-helper/bitcoin.rb +49 -0
- data/lib/factory-helper/business.rb +22 -0
- data/lib/factory-helper/code.rb +63 -0
- data/lib/factory-helper/commerce.rb +51 -0
- data/lib/factory-helper/company.rb +40 -0
- data/lib/factory-helper/date.rb +42 -0
- data/lib/factory-helper/finance.rb +26 -0
- data/lib/factory-helper/hacker.rb +31 -0
- data/lib/factory-helper/internet.rb +116 -0
- data/lib/factory-helper/lorem.rb +66 -0
- data/lib/factory-helper/name.rb +22 -0
- data/lib/factory-helper/number.rb +57 -0
- data/lib/factory-helper/phone_number.rb +52 -0
- data/lib/factory-helper/team.rb +20 -0
- data/lib/factory-helper/time.rb +48 -0
- data/lib/factory-helper/version.rb +3 -0
- data/lib/locales/de-AT.yml +49 -0
- data/lib/locales/de-CH.yml +19 -0
- data/lib/locales/de.yml +57 -0
- data/lib/locales/en-AU.yml +22 -0
- data/lib/locales/en-BORK.yml +4 -0
- data/lib/locales/en-CA.yml +14 -0
- data/lib/locales/en-GB.yml +13 -0
- data/lib/locales/en-IND.yml +20 -0
- data/lib/locales/en-NEP.yml +39 -0
- data/lib/locales/en-US.yml +83 -0
- data/lib/locales/en-au-ocker.yml +31 -0
- data/lib/locales/en.yml +155 -0
- data/lib/locales/es.yml +62 -0
- data/lib/locales/fa.yml +6 -0
- data/lib/locales/fr.yml +55 -0
- data/lib/locales/it.yml +59 -0
- data/lib/locales/ja.yml +25 -0
- data/lib/locales/ko.yml +37 -0
- data/lib/locales/nb-NO.yml +52 -0
- data/lib/locales/nl.yml +77 -0
- data/lib/locales/pl.yml +66 -0
- data/lib/locales/pt-BR.yml +57 -0
- data/lib/locales/ru.yml +65 -0
- data/lib/locales/sk.yml +72 -0
- data/lib/locales/sv.yml +76 -0
- data/lib/locales/vi.yml +63 -0
- data/lib/locales/zh-CN.yml +27 -0
- data/lib/locales/zh-TW.yml +27 -0
- metadata +140 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
module Faker
|
2
|
+
class Commerce < Base
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def color
|
6
|
+
fetch('commerce.color')
|
7
|
+
end
|
8
|
+
|
9
|
+
def department(max = 3, fixed_amount = false)
|
10
|
+
num = max if fixed_amount
|
11
|
+
num ||= 1 + rand(max)
|
12
|
+
|
13
|
+
categories = categories(num)
|
14
|
+
|
15
|
+
if num > 1
|
16
|
+
merge_categories(categories)
|
17
|
+
else
|
18
|
+
categories[0]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def product_name
|
23
|
+
fetch('commerce.product_name.adjective') + ' ' + fetch('commerce.product_name.material') + ' ' + fetch('commerce.product_name.product')
|
24
|
+
end
|
25
|
+
|
26
|
+
def price
|
27
|
+
random = Random.new
|
28
|
+
(random.rand(0..100.0) * 100).floor/100.0
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def categories(num)
|
34
|
+
categories = []
|
35
|
+
while categories.length < num do
|
36
|
+
category = fetch('commerce.department')
|
37
|
+
categories << category unless categories.include?(category)
|
38
|
+
end
|
39
|
+
|
40
|
+
categories
|
41
|
+
end
|
42
|
+
|
43
|
+
def merge_categories(categories)
|
44
|
+
separator = fetch('separator')
|
45
|
+
comma_separated = categories.slice!(0...-1).join(', ')
|
46
|
+
|
47
|
+
[comma_separated, categories[0]].join(separator)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Faker
|
2
|
+
class Company < Base
|
3
|
+
flexible :company
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def name
|
7
|
+
parse('company.name')
|
8
|
+
end
|
9
|
+
|
10
|
+
def suffix
|
11
|
+
fetch('company.suffix')
|
12
|
+
end
|
13
|
+
|
14
|
+
# Generate a buzzword-laden catch phrase.
|
15
|
+
def catch_phrase
|
16
|
+
translate('faker.company.buzzwords').collect {|list| list.sample }.join(' ')
|
17
|
+
end
|
18
|
+
|
19
|
+
# When a straight answer won't do, BS to the rescue!
|
20
|
+
def bs
|
21
|
+
translate('faker.company.bs').collect {|list| list.sample }.join(' ')
|
22
|
+
end
|
23
|
+
|
24
|
+
def ein
|
25
|
+
('%09d' % rand(10 ** 9)).gsub(/(\d\d)(\d\d\d\d\d\d\d)/, '\\1-\\2')
|
26
|
+
end
|
27
|
+
|
28
|
+
def duns_number
|
29
|
+
('%09d' % rand(10 ** 9)).gsub(/(\d\d)(\d\d\d)(\d\d\d\d)/, '\\1-\\2-\\3')
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get a random company logo url in PNG format.
|
33
|
+
def logo
|
34
|
+
rand_num = Random.rand(13) + 1
|
35
|
+
"http://pigment.github.io/fake-logos/logos/medium/color/#{rand_num}.png"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Faker
|
2
|
+
class Date < Base
|
3
|
+
class << self
|
4
|
+
def between(from, to)
|
5
|
+
from = get_date_object(from)
|
6
|
+
to = get_date_object(to)
|
7
|
+
|
8
|
+
Faker::Base::rand_in_range(from, to)
|
9
|
+
end
|
10
|
+
|
11
|
+
def forward(days = 365)
|
12
|
+
from = ::Date.today + 1
|
13
|
+
to = ::Date.today + days
|
14
|
+
|
15
|
+
between(from, to).to_date
|
16
|
+
end
|
17
|
+
|
18
|
+
def backward(days = 365)
|
19
|
+
from = ::Date.today - days
|
20
|
+
to = ::Date.today - 1
|
21
|
+
|
22
|
+
between(from, to).to_date
|
23
|
+
end
|
24
|
+
|
25
|
+
def birthday(min_age = 18, max_age = 65)
|
26
|
+
t = ::Date.today
|
27
|
+
from = ::Date.new(t.year - min_age, t.month, t.day)
|
28
|
+
to = ::Date.new(t.year - max_age, t.month, t.day)
|
29
|
+
|
30
|
+
between(from, to).to_date
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def get_date_object(date)
|
36
|
+
date = ::Date.parse(date) if date.is_a?(String)
|
37
|
+
date = date.to_date if date.respond_to?(:to_date)
|
38
|
+
date
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Faker
|
2
|
+
class Finance < Base
|
3
|
+
CREDIT_CARD_TYPES = [ :visa, :mastercard, :discover, :american_express, :diners_club, :jcb, :switch, :solo, :dankort, :maestro, :forbrugsforeningen, :laser ]
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def credit_card(*types)
|
7
|
+
types = CREDIT_CARD_TYPES if types.empty?
|
8
|
+
type = types.sample
|
9
|
+
template = numerify(fetch("credit_card.#{type}"))
|
10
|
+
|
11
|
+
# calculate the luhn checksum digit
|
12
|
+
multiplier = 1
|
13
|
+
luhn_sum = template.gsub(/[^0-9]/, '').split('').reverse.map(&:to_i).inject(0) do |sum, digit|
|
14
|
+
multiplier = (multiplier == 2 ? 1 : 2)
|
15
|
+
sum + (digit * multiplier).to_s.split('').map(&:to_i).inject(0) { |digit_sum, cur| digit_sum + cur }
|
16
|
+
end
|
17
|
+
# the sum plus whatever the last digit is must be a multiple of 10. So, the
|
18
|
+
# last digit must be 10 - the last digit of the sum.
|
19
|
+
luhn_digit = (10 - (luhn_sum % 10)) % 10
|
20
|
+
|
21
|
+
template.gsub! 'L', luhn_digit.to_s
|
22
|
+
template
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#Port of http://shinytoylabs.com/jargon/
|
2
|
+
module Faker
|
3
|
+
class Hacker < Base
|
4
|
+
flexible :hacker
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def say_something_smart
|
8
|
+
phrases.sample
|
9
|
+
end
|
10
|
+
|
11
|
+
def abbreviation; fetch('hacker.abbreviation'); end
|
12
|
+
def adjective; fetch('hacker.adjective'); end
|
13
|
+
def noun; fetch('hacker.noun'); end
|
14
|
+
def verb; fetch('hacker.verb'); end
|
15
|
+
def ingverb; fetch('hacker.ingverb'); end
|
16
|
+
|
17
|
+
def phrases
|
18
|
+
[ "If we #{verb} the #{noun}, we can get to the #{abbreviation} #{noun} through the #{adjective} #{abbreviation} #{noun}!",
|
19
|
+
"We need to #{verb} the #{adjective} #{abbreviation} #{noun}!",
|
20
|
+
"Try to #{verb} the #{abbreviation} #{noun}, maybe it will #{verb} the #{adjective} #{noun}!",
|
21
|
+
"You can't #{verb} the #{noun} without #{ingverb} the #{adjective} #{abbreviation} #{noun}!",
|
22
|
+
"Use the #{adjective} #{abbreviation} #{noun}, then you can #{verb} the #{adjective} #{noun}!",
|
23
|
+
"The #{abbreviation} #{noun} is down, #{verb} the #{adjective} #{noun} so we can #{verb} the #{abbreviation} #{noun}!",
|
24
|
+
"#{ingverb} the #{noun} won't do anything, we need to #{verb} the #{adjective} #{abbreviation} #{noun}!",
|
25
|
+
"I'll #{verb} the #{adjective} #{abbreviation} #{noun}, that should #{noun} the #{abbreviation} #{noun}!"
|
26
|
+
]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Faker
|
3
|
+
class Internet < Base
|
4
|
+
class << self
|
5
|
+
def email(name = nil)
|
6
|
+
[ user_name(name), domain_name ].join('@')
|
7
|
+
end
|
8
|
+
|
9
|
+
def free_email(name = nil)
|
10
|
+
[ user_name(name), fetch('internet.free_email') ].join('@')
|
11
|
+
end
|
12
|
+
|
13
|
+
def safe_email(name = nil)
|
14
|
+
[user_name(name), 'example.'+ %w[org com net].shuffle.first].join('@')
|
15
|
+
end
|
16
|
+
|
17
|
+
def user_name(specifier = nil, separators = %w(. _))
|
18
|
+
if specifier.kind_of? String
|
19
|
+
return specifier.scan(/\w+/).shuffle.join(separators.sample).downcase
|
20
|
+
elsif specifier.kind_of? Integer
|
21
|
+
tries = 0 # Don't try forever in case we get something like 1_000_000.
|
22
|
+
begin
|
23
|
+
result = user_name nil, separators
|
24
|
+
tries += 1
|
25
|
+
end while result.length < specifier and tries < 7
|
26
|
+
until result.length >= specifier
|
27
|
+
result = result * 2
|
28
|
+
end
|
29
|
+
return result
|
30
|
+
elsif specifier.kind_of? Range
|
31
|
+
tries = 0
|
32
|
+
begin
|
33
|
+
result = user_name specifier.min, separators
|
34
|
+
tries += 1
|
35
|
+
end while not specifier.include? result.length and tries < 7
|
36
|
+
return result[0...specifier.max]
|
37
|
+
end
|
38
|
+
|
39
|
+
fix_umlauts([
|
40
|
+
Proc.new { Name.first_name.gsub(/\W/, '').downcase },
|
41
|
+
Proc.new {
|
42
|
+
[ Name.first_name, Name.last_name ].map {|n|
|
43
|
+
n.gsub(/\W/, '')
|
44
|
+
}.join(separators.sample).downcase }
|
45
|
+
].sample.call)
|
46
|
+
end
|
47
|
+
|
48
|
+
def password(min_length = 8, max_length = 16)
|
49
|
+
temp = Lorem.characters(min_length)
|
50
|
+
diff_length = max_length - min_length
|
51
|
+
if diff_length > 0
|
52
|
+
diff_rand = rand(diff_length + 1)
|
53
|
+
temp += Lorem.characters(diff_rand)
|
54
|
+
end
|
55
|
+
temp = temp[0..min_length] if min_length > 0
|
56
|
+
return temp
|
57
|
+
end
|
58
|
+
|
59
|
+
def domain_name
|
60
|
+
[ fix_umlauts(domain_word), domain_suffix ].join('.')
|
61
|
+
end
|
62
|
+
|
63
|
+
def fix_umlauts(string)
|
64
|
+
string.gsub(/[äöüß]/i) do |match|
|
65
|
+
case match.downcase
|
66
|
+
when "ä" 'ae'
|
67
|
+
when "ö" 'oe'
|
68
|
+
when "ü" 'ue'
|
69
|
+
when "ß" 'ss'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def domain_word
|
75
|
+
Company.name.split(' ').first.gsub(/\W/, '').downcase
|
76
|
+
end
|
77
|
+
|
78
|
+
def domain_suffix
|
79
|
+
fetch('internet.domain_suffix')
|
80
|
+
end
|
81
|
+
|
82
|
+
def mac_address(prefix='')
|
83
|
+
prefix_digits = prefix.split(':').map{ |d| d.to_i(16) }
|
84
|
+
address_digits = (6 - prefix_digits.size).times.map{ rand(256) }
|
85
|
+
(prefix_digits + address_digits).map{ |d| '%02x' % d }.join(':')
|
86
|
+
end
|
87
|
+
|
88
|
+
def ip_v4_address
|
89
|
+
ary = (2..254).to_a
|
90
|
+
[ary.sample,
|
91
|
+
ary.sample,
|
92
|
+
ary.sample,
|
93
|
+
ary.sample].join('.')
|
94
|
+
end
|
95
|
+
|
96
|
+
def ip_v6_address
|
97
|
+
@@ip_v6_space ||= (0..65535).to_a
|
98
|
+
container = (1..8).map{ |_| @@ip_v6_space.sample }
|
99
|
+
container.map{ |n| n.to_s(16) }.join(':')
|
100
|
+
end
|
101
|
+
|
102
|
+
def url(host = domain_name, path = "/#{user_name}")
|
103
|
+
"http://#{host}#{path}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def slug(words = nil, glue = nil)
|
107
|
+
glue ||= %w[- _ .].sample
|
108
|
+
(words || Faker::Lorem::words(2).join(' ')).gsub(' ', glue).downcase
|
109
|
+
end
|
110
|
+
|
111
|
+
def device_token
|
112
|
+
rand(16 ** 64).to_s(16).rjust(64, '0').chars.to_a.shuffle.join
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Faker
|
2
|
+
# Based on Perl's Text::Lorem
|
3
|
+
class Lorem < Base
|
4
|
+
class << self
|
5
|
+
def word
|
6
|
+
translate('faker.lorem.words').sample
|
7
|
+
end
|
8
|
+
|
9
|
+
def words(num = 3, supplemental = false)
|
10
|
+
resolved_num = resolve(num)
|
11
|
+
word_list = (
|
12
|
+
translate('faker.lorem.words') +
|
13
|
+
(supplemental ? translate('faker.lorem.supplemental') : [])
|
14
|
+
)
|
15
|
+
word_list = word_list * ((resolved_num / word_list.length) + 1)
|
16
|
+
word_list.shuffle[0, resolved_num]
|
17
|
+
end
|
18
|
+
|
19
|
+
def character
|
20
|
+
characters(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
def characters(char_count = 255)
|
24
|
+
return '' if char_count.respond_to?(:to_i) && char_count.to_i < 1
|
25
|
+
char_count = resolve(char_count)
|
26
|
+
rand(36**char_count).to_s(36).rjust(char_count, '0').chars.to_a.shuffle.join
|
27
|
+
end
|
28
|
+
|
29
|
+
def sentence(word_count = 4, supplemental = false, random_words_to_add = 6)
|
30
|
+
words(word_count + rand(random_words_to_add.to_i).to_i, supplemental).join(' ').capitalize + '.'
|
31
|
+
end
|
32
|
+
|
33
|
+
def sentences(sentence_count = 3, supplemental = false)
|
34
|
+
[].tap do |sentences|
|
35
|
+
1.upto(resolve(sentence_count)) do
|
36
|
+
sentences << sentence(3, supplemental)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def paragraph(sentence_count = 3, supplemental = false, random_sentences_to_add = 3)
|
42
|
+
sentences(resolve(sentence_count) + rand(random_sentences_to_add.to_i).to_i, supplemental).join(' ')
|
43
|
+
end
|
44
|
+
|
45
|
+
def paragraphs(paragraph_count = 3, supplemental = false)
|
46
|
+
[].tap do |paragraphs|
|
47
|
+
1.upto(resolve(paragraph_count)) do
|
48
|
+
paragraphs << paragraph(3, supplemental)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# If an array or range is passed, a random value will be selected.
|
56
|
+
# All other values are simply returned.
|
57
|
+
def resolve(value)
|
58
|
+
case value
|
59
|
+
when Array then value[rand(value.size)]
|
60
|
+
when Range then rand((value.last+1) - value.first) + value.first
|
61
|
+
else value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Faker
|
2
|
+
class Name < Base
|
3
|
+
flexible :name
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def name
|
8
|
+
parse('name.name')
|
9
|
+
end
|
10
|
+
|
11
|
+
def first_name; fetch('name.first_name'); end
|
12
|
+
def last_name; fetch('name.last_name'); end
|
13
|
+
def prefix; fetch('name.prefix'); end
|
14
|
+
def suffix; fetch('name.suffix'); end
|
15
|
+
|
16
|
+
# Generate a buzzword-laden job title
|
17
|
+
# Wordlist from http://www.bullshitjob.com/title/
|
18
|
+
def title; fetch('name.title.descriptor') + ' ' + fetch('name.title.level') + ' ' + fetch('name.title.job'); end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Faker
|
2
|
+
class Number < Base
|
3
|
+
class << self
|
4
|
+
def number(digits)
|
5
|
+
(1..digits).collect {digit}.join
|
6
|
+
end
|
7
|
+
|
8
|
+
def decimal(l_digits, r_digits = 2)
|
9
|
+
l_d = self.number(l_digits)
|
10
|
+
r_d = self.number(r_digits)
|
11
|
+
"#{l_d}.#{r_d}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def digit
|
15
|
+
(rand() * 9).round.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def hexadecimal(digits)
|
19
|
+
hex = ""
|
20
|
+
digits.times { hex += rand(15).to_s(16) }
|
21
|
+
hex
|
22
|
+
end
|
23
|
+
|
24
|
+
def between(from = 1.00, to = 5000.00)
|
25
|
+
Faker::Base::rand_in_range(from, to)
|
26
|
+
end
|
27
|
+
|
28
|
+
def positive(from = 1.00, to = 5000.00)
|
29
|
+
random_number = between(from, to)
|
30
|
+
greater_than_zero(random_number)
|
31
|
+
end
|
32
|
+
|
33
|
+
def negative(from = -5000.00, to = -1.00)
|
34
|
+
random_number = between(from, to)
|
35
|
+
less_than_zero(random_number)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def greater_than_zero(number)
|
41
|
+
should_be(number, :>)
|
42
|
+
end
|
43
|
+
|
44
|
+
def less_than_zero(number)
|
45
|
+
should_be(number, :<)
|
46
|
+
end
|
47
|
+
|
48
|
+
def should_be(number, method_to_compare)
|
49
|
+
if number.send(method_to_compare, 0)
|
50
|
+
number
|
51
|
+
else
|
52
|
+
number * -1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|