1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
# frozen_string_literal: true
module Faker
class Types < Base
CHARACTERS = ('0'..'9').to_a + ('a'..'z').to_a
SIMPLE_TYPES = %i[string fixnum].freeze
COMPLEX_TYPES = %i[hash array].freeze
class << self
##
# Produces a random String created from word (Faker::Lorem.word)
#
# @return [String]
#
# @example
# Faker::Types.rb_string #=> "foobar"
#
# @faker.version 1.8.6
def rb_string(words: 1)
resolved_num = resolve(words)
word_list = translate('faker.lorem.words')
word_list *= ((resolved_num / word_list.length) + 1)
sample(word_list, resolved_num).join(' ')
end
##
# Produces a random character from the a-z, 0-9 ranges.
#
# @return [String]
#
# @example
# Faker::Types.character #=> "n"
#
# @faker.version 1.8.6
def character
sample(CHARACTERS)
end
##
# Produces a random integer.
#
# @return [Integer]
#
# @example
# Faker::Types.rb_integer #=> 1
#
# @faker.version 1.8.6
def rb_integer(from: 0, to: 100)
rand(from..to).to_i
end
##
# Produces a random hash with random keys and values.
#
# @param number [Integer] Specifies the number of key-value pairs.
# @return [Hash]
#
# @example
# Faker::Types.rb_hash #=> {name: "bob"}
# Faker::Types.rb_hash(number: 1) #=> {name: "bob"}
# Faker::Types.rb_hash(number: 2) #=> {name: "bob", last: "marley"}
#
# @faker.version 1.8.6
def rb_hash(number: 1, type: -> { random_type })
{}.tap do |hsh|
Lorem.words(number: number * 2).uniq.first(number).each do |s|
value = type.is_a?(Proc) ? type.call : type
hsh.merge!(s.to_sym => value)
end
end
end
##
# Produces a random complex hash with random keys and values where the values may include other hashes and arrays.
#
# @param number [Integer] Specifies the number of key-value pairs.
# @return [Hash]
#
# @example
# Faker::Types.complex_rb_hash #=> {user: {first: "bob", last: "marley"}}
# Faker::Types.complex_rb_hash(number: 1) #=> {user: {first: "bob", last: "marley"}}
# Faker::Types.complex_rb_hash(number: 2) #=> {user: {first: "bob", last: "marley"}, son: ["damien", "marley"]}
#
# @faker.version 1.8.6
def complex_rb_hash(number: 1)
rb_hash(number: number, type: -> { random_complex_type })
end
##
# Produces a random array.
#
# @param len [Integer] Specifies the number of elements in the array.
# @return [Array]
#
# @example
# Faker::Types.rb_array #=> ["a"]
# Faker::Types.rb_array(len: 4) #=> ["a", 1, 2, "bob"]
# Faker::Types.rb_array(len: 2, type: -> { Faker::Types.rb_string }) #=> ["cat", "foo"]
#
# @faker.version 1.8.6
def rb_array(len: 1, type: -> { random_type })
[].tap do |ar|
len.times do
ar.push type.is_a?(Proc) ? type.call : type
end
end
end
##
# Produces a random type that's either a String or an Integer.
#
# @return [String, Integer]
#
# @example
# Faker::Types.random_type #=> 1 or "a" or "bob"
#
# @faker.version 1.8.6
def random_type
type_to_use = SIMPLE_TYPES[rand(0..(SIMPLE_TYPES.length - 1))]
case type_to_use
when :string
rb_string
when :fixnum
rb_integer
end
end
##
# Produces a random complex type that's either a String, an Integer, an array or a hash.
#
# @return [String, Integer]
#
# @example
# Faker::Types.random_complex_type #=> 1 or "a" or "bob" or {foo: "bar"}
#
# @faker.version 1.8.6
def random_complex_type
types = SIMPLE_TYPES + COMPLEX_TYPES
type_to_use = types[rand(0..(types.length - 1))]
case type_to_use
when :string
rb_string
when :fixnum
rb_integer
when :hash
rb_hash
when :array
rb_array
end
end
private
def titleize(word)
word.split(/(\W)/).map(&:capitalize).join
end
end
end
end
|