diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml
index 283959e203..cc75722ee9 100644
--- a/.github/workflows/ruby.yml
+++ b/.github/workflows/ruby.yml
@@ -58,4 +58,4 @@ jobs:
bundler-cache: true
- name: Run tests
- run: bundle exec rake test
+ run: bundle exec rake test LAZY_LOAD=1
diff --git a/benchmark/load.rb b/benchmark/load.rb
new file mode 100644
index 0000000000..bbe1bc35cb
--- /dev/null
+++ b/benchmark/load.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'benchmark/ips'
+
+Benchmark.ips do |x|
+ x.report('require') { system('ruby load_faker.rb') }
+ x.report('lazyload') { system('LAZY_LOAD=1 ruby load_faker.rb') }
+
+ x.compare!(order: :baseline)
+end
diff --git a/benchmark/load_faker.rb b/benchmark/load_faker.rb
new file mode 100755
index 0000000000..3d1c146253
--- /dev/null
+++ b/benchmark/load_faker.rb
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+if defined?(Faker)
+ raise 'fake is already defined...'
+end
+
+load('/Users/stefannibrasil/projects/faker/lib/faker.rb')
diff --git a/doc/internet/http.md b/doc/internet/http.md
index ce3331591c..9037e6d669 100644
--- a/doc/internet/http.md
+++ b/doc/internet/http.md
@@ -1,13 +1,14 @@
-# Faker::Internet::HTTP
+# Faker::HTTP
Available since version next.
# Keyword arguments: group
+
```ruby
-Faker::Internet::HTTP.status_code #=> 418
-Faker::Internet::HTTP.status_code(group: :information) #=> 102
-Faker::Internet::HTTP.status_code(group: :successful) #=> 200
-Faker::Internet::HTTP.status_code(group: :redirect) #=> 306
-Faker::Internet::HTTP.status_code(group: :client_error) #=> 451
-Faker::Internet::HTTP.status_code(group: :server_error) #=> 502
-```
\ No newline at end of file
+Faker::HTTP.status_code #=> 418
+Faker::HTTP.status_code(group: :information) #=> 102
+Faker::HTTP.status_code(group: :successful) #=> 200
+Faker::HTTP.status_code(group: :redirect) #=> 306
+Faker::HTTP.status_code(group: :client_error) #=> 451
+Faker::HTTP.status_code(group: :server_error) #=> 502
+```
diff --git a/doc/music/music.md b/doc/music/music.md
index 09032e6229..f6a1547b4f 100644
--- a/doc/music/music.md
+++ b/doc/music/music.md
@@ -3,17 +3,17 @@
Available since version 1.6.4.
```ruby
-Faker::Music.key #=> "C"
+Faker::Song.key #=> "C"
-Faker::Music.chord #=> "Amaj7"
+Faker::Song.chord #=> "Amaj7"
-Faker::Music.instrument #=> "Ukelele"
+Faker::Song.instrument #=> "Ukelele"
-Faker::Music.band #=> "The Beatles"
+Faker::Song.band #=> "The Beatles"
-Faker::Music.album #=> "Sgt. Pepper's Lonely Hearts Club"
+Faker::Song.album #=> "Sgt. Pepper's Lonely Hearts Club"
-Faker::Music.genre #=> "Rock"
+Faker::Song.genre #=> "Rock"
-Faker::Music.mambo_no_5 #=> "Monica"
+Faker::Song.mambo_no_5 #=> "Monica"
```
diff --git a/experiments/lazy_loading.md b/experiments/lazy_loading.md
new file mode 100644
index 0000000000..85c8910f6d
--- /dev/null
+++ b/experiments/lazy_loading.md
@@ -0,0 +1,103 @@
+# Lazy load experiment results
+
+Branch: sb-ta/lazy-load-experiment
+Date: February 10th, 2026
+Owner(s): Stefanni Brasil and Thiago Araujo
+
+## Impact
+
+Using `const_missing` to lazy load generators was an idea from talking with Jeremy Evans, who kindly responded our questions about improving faker's performance.
+
+### Changes needed
+
+#### Namespace changes
+
+A few generators had namespaces that didn't match their file name, and most of them were manageable, but two needed to be renamed:
+
+- `Faker::Music` -> `Faker::Song`. `Faker::Music` is a nested namespace.
+- `Faker::Internet::HTTP` -> `Faker::HTTP`. `Faker::Internet` is another generator.
+
+Considering that only two generators would be renamed, it wouldn't be a huge burden for users to use this approach.
+
+#### File location changes
+
+To prevent other generators from erroring out due to namespace clashing, some generators have to be moved around (ex. `Faker::Quote` was moved from `/faker/quotes/quote` to `faker/default/quote`). Users can still use the generators as before, their namespaces didn't change.
+
+### Benefits
+
+- no additional dependencies needed
+- code is extremely faster
+- after changing these two generators, which would be breaking changes, we can enable this as an opt-in configuration
+
+## Results
+
+profiler:
+
+[bundle exec vernier run -- ruby -e "require 'faker'" LAZY_LOAD=1](https://share.firefox.dev/3ZuCP55)
+[bundle exec vernier run --interval 100 --allocation-interval 10 -- ruby -e "require 'faker'; Faker::Internet.email" LAZY_LOAD=1](https://share.firefox.dev/4601PoA)
+
+benchmarks (Machine specs: Apple M1 Pro 16GB memory on MacOS Sequoia 15.7.3.)
+
+```sh
+benchmark % ruby require.rb
+took 250.0249999575317ms to load
+```
+
+```sh
+benchmark % ruby load.rb
+ruby 3.3.10 (2025-10-23 revision 343ea05002) [arm64-darwin24]
+Warming up --------------------------------------
+ require 1.000 i/100ms
+ lazyload 1.000 i/100ms
+Calculating -------------------------------------
+ require 5.874 (± 0.0%) i/s (170.25 ms/i) - 30.000 in 5.115652s
+ lazyload 12.207 (± 8.2%) i/s (81.92 ms/i) - 61.000 in 5.007059s
+
+Comparison:
+ require: 5.9 i/s
+ lazyload: 12.2 i/s - 2.08x faster
+```
+
+## Artifacts
+
+### Scripts
+
+Constants were registered using this script:
+
+```ruby
+# lazy_load.rb
+
+CATEGORIES = {
+ Blockchain: 'blockchain',
+ Books: 'books',
+ Creature: 'creature',
+ Default: 'default',
+ Fantasy: 'fantasy',
+ Games: 'games',
+ JapaneseMedia: 'japanese_media',
+ Locations: 'locations',
+ Movies: 'movies',
+ Music: 'music',
+ Quotes: 'quotes',
+ Religion: 'religion',
+ Sports: 'sports',
+ Travel: 'travel',
+ TvShows: 'tv_shows'
+}.freeze
+
+def template(key)
+"# frozen_string_literal: true
+
+module Faker
+ class #{key}
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end"
+end
+
+CATEGORIES.each do |key, value|
+ File.write(File.join('lib', 'faker', "#{value}.rb"), template(key))
+end
+```
diff --git a/lib/faker.rb b/lib/faker.rb
index f44bc26e5b..e47f0d223d 100644
--- a/lib/faker.rb
+++ b/lib/faker.rb
@@ -275,7 +275,43 @@ def disable_enforce_available_locales
end
end
end
+
+ if ENV['LAZY_LOAD'] == '1'
+ def self.load_path(*constants)
+ constants.map do |class_name|
+ class_name
+ .to_s
+ .gsub('::', '/')
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
+ .tr('-', '_')
+ .downcase
+ end.join('/')
+ end
+
+ def self.lazy_load(klass)
+ def klass.const_missing(class_name)
+ load_path = case class_name
+ when :DnD
+ Faker.load_path('faker/games/dnd')
+ else
+ Faker.load_path(name, class_name)
+ end
+
+ begin
+ require(load_path)
+ rescue LoadError
+ require(load_path.gsub('faker/', 'faker/default/'))
+ end
+
+ const_get(class_name)
+ end
+ end
+
+ lazy_load(self)
+ end
end
-# require faker objects
-Dir.glob(File.join(mydir, 'faker', '/**/*.rb')).each { |file| require file }
+if ENV['LAZY_LOAD'] != '1'
+ Dir.glob(File.join(mydir, 'faker', '/**/*.rb')).each { |file| require file }
+end
diff --git a/lib/faker/blockchain.rb b/lib/faker/blockchain.rb
new file mode 100644
index 0000000000..85e23730ab
--- /dev/null
+++ b/lib/faker/blockchain.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Blockchain
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/books.rb b/lib/faker/books.rb
new file mode 100644
index 0000000000..0766c7b90d
--- /dev/null
+++ b/lib/faker/books.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Books
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/creature.rb b/lib/faker/creature.rb
new file mode 100644
index 0000000000..613499ec11
--- /dev/null
+++ b/lib/faker/creature.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Creature
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/default.rb b/lib/faker/default.rb
new file mode 100644
index 0000000000..944e5a2ca9
--- /dev/null
+++ b/lib/faker/default.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Default
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/books/book.rb b/lib/faker/default/book.rb
similarity index 100%
rename from lib/faker/books/book.rb
rename to lib/faker/default/book.rb
diff --git a/lib/faker/games/game.rb b/lib/faker/default/game.rb
similarity index 100%
rename from lib/faker/games/game.rb
rename to lib/faker/default/game.rb
diff --git a/lib/faker/default/html.rb b/lib/faker/default/html.rb
index a78be30ea4..bf94c2b1d9 100644
--- a/lib/faker/default/html.rb
+++ b/lib/faker/default/html.rb
@@ -14,7 +14,7 @@ class << self
# @faker.version 3.2.1
def heading
level = rand(1..6)
- "#{Lorem.word.capitalize}"
+ "#{Faker::Lorem.word.capitalize}"
end
##
@@ -97,7 +97,7 @@ def unordered_list
#
# @faker.version 3.2.1
def code
- "#{Lorem.sentence(word_count: 1)}"
+ "#{Faker::Lorem.sentence(word_count: 1)}"
end
##
@@ -165,7 +165,7 @@ def link(rel: 'stylesheet')
# Faker::HTML.element(tag: 'div', content: "This is a div with XSS attributes.", attributes: {class: 'xss', onclick: "alert('XSS')"}) #=> "
This is a div with XSS attributes.
"
#
# @faker.version 3.2.1
- def element(tag: 'div', content: Lorem.sentence(word_count: 3), attributes: { class: Lorem.word, onclick: "#{Lorem.word}()" })
+ def element(tag: 'div', content: Faker::Lorem.sentence(word_count: 3), attributes: { class: Faker::Lorem.word, onclick: "#{Faker::Lorem.word}()" })
attribute_string = attributes.map { |key, value| "#{key}=\"#{value}\"" }.join(' ')
"<#{tag} #{attribute_string}>#{content}#{tag}>"
end
diff --git a/lib/faker/default/http.rb b/lib/faker/default/http.rb
new file mode 100644
index 0000000000..2f631ae957
--- /dev/null
+++ b/lib/faker/default/http.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Faker
+ class HTTP < Base
+ STATUS_CODES = {
+ information: [100, 101, 102, 103],
+ successful: [200, 201, 202, 203, 204, 205, 206, 207, 208, 226],
+ redirect: [300, 301, 302, 303, 304, 305, 306, 307, 308],
+ client_error: [400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412,
+ 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428,
+ 429, 431, 451],
+ server_error: [500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511]
+ }.freeze
+
+ STATUS_CODES_GROUPS = STATUS_CODES.keys.freeze
+
+ class << self
+ ##
+ # Produces an HTTP status code
+ #
+ # @return [Integer]
+ #
+ # @example
+ # Faker::HTTP.status_code #=> 418
+ # @example
+ # Faker::HTTP.status_code(group: :information) #=> 102
+ # @example
+ # Faker::HTTP.status_code(group: :successful) #=> 200
+ # @example
+ # Faker::HTTP.status_code(group: :redirect) #=> 306
+ # @example
+ # Faker::HTTP.status_code(group: :client_error) #=> 451
+ # @example
+ # Faker::HTTP.status_code(group: :server_error) #=> 502
+ #
+ # @faker.version 2.13.0
+ def status_code(group: nil)
+ return STATUS_CODES[STATUS_CODES_GROUPS.sample].sample unless group
+
+ raise ArgumentError, 'Invalid HTTP status code group' unless STATUS_CODES_GROUPS.include?(group)
+
+ STATUS_CODES[group].sample
+ end
+ end
+ end
+end
diff --git a/lib/faker/default/internet.rb b/lib/faker/default/internet.rb
index a0c198aaa6..8f64f783a4 100644
--- a/lib/faker/default/internet.rb
+++ b/lib/faker/default/internet.rb
@@ -93,8 +93,8 @@ def username(specifier: nil, separators: %w[. _])
end
sample([
- Char.prepare(Name.first_name),
- [Name.first_name, Name.last_name].map do |name|
+ Char.prepare(Faker::Name.first_name),
+ [Faker::Name.first_name, Faker::Name.last_name].map do |name|
Char.prepare(name)
end.join(sample(separators))
])
@@ -235,7 +235,7 @@ def fix_umlauts(string: '')
# @example
# Faker::Internet.domain_word #=> "senger"
def domain_word
- with_locale(:en) { Char.prepare(Company.name.split.first) }
+ with_locale(:en) { Char.prepare(Faker::Company.name.split.first) }
end
## Returns the domain suffix e.g. com, org, co, biz, info etc.
diff --git a/lib/faker/default/internet_http.rb b/lib/faker/default/internet_http.rb
deleted file mode 100644
index feee44c4b9..0000000000
--- a/lib/faker/default/internet_http.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-module Faker
- class Internet
- class HTTP < Base
- STATUS_CODES = {
- information: [100, 101, 102, 103],
- successful: [200, 201, 202, 203, 204, 205, 206, 207, 208, 226],
- redirect: [300, 301, 302, 303, 304, 305, 306, 307, 308],
- client_error: [400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412,
- 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428,
- 429, 431, 451],
- server_error: [500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511]
- }.freeze
-
- STATUS_CODES_GROUPS = STATUS_CODES.keys.freeze
-
- class << self
- ##
- # Produces an HTTP status code
- #
- # @return [Integer]
- #
- # @example
- # Faker::Internet::HTTP.status_code #=> 418
- # @example
- # Faker::Internet::HTTP.status_code(group: :information) #=> 102
- # @example
- # Faker::Internet::HTTP.status_code(group: :successful) #=> 200
- # @example
- # Faker::Internet::HTTP.status_code(group: :redirect) #=> 306
- # @example
- # Faker::Internet::HTTP.status_code(group: :client_error) #=> 451
- # @example
- # Faker::Internet::HTTP.status_code(group: :server_error) #=> 502
- #
- # @faker.version 2.13.0
- def status_code(group: nil)
- return STATUS_CODES[STATUS_CODES_GROUPS.sample].sample unless group
-
- raise ArgumentError, 'Invalid HTTP status code group' unless STATUS_CODES_GROUPS.include?(group)
-
- STATUS_CODES[group].sample
- end
- end
- end
- end
-end
diff --git a/lib/faker/default/lorem.rb b/lib/faker/default/lorem.rb
index 1fbd9f4139..69e09f0584 100644
--- a/lib/faker/default/lorem.rb
+++ b/lib/faker/default/lorem.rb
@@ -58,7 +58,7 @@ def words(number: 3, supplemental: false, exclude_words: nil)
#
# @faker.version 2.1.3
def character
- sample(Types::CHARACTERS)
+ sample(Faker::Types::CHARACTERS)
end
##
@@ -78,7 +78,7 @@ def character
#
# @faker.version 2.1.3
def characters(number: 255, min_alpha: 0, min_numeric: 0)
- Alphanumeric.alphanumeric(number: number, min_alpha: min_alpha, min_numeric: min_numeric)
+ Faker::Alphanumeric.alphanumeric(number: number, min_alpha: min_alpha, min_numeric: min_numeric)
end
##
diff --git a/lib/faker/default/markdown.rb b/lib/faker/default/markdown.rb
index 1f12e0f435..e591679123 100644
--- a/lib/faker/default/markdown.rb
+++ b/lib/faker/default/markdown.rb
@@ -13,7 +13,7 @@ class << self
#
# @faker.version 1.8.0
def headers
- "#{fetch('markdown.headers')} #{Lorem.word.capitalize}"
+ "#{fetch('markdown.headers')} #{Faker::Lorem.word.capitalize}"
end
##
@@ -95,7 +95,7 @@ def inline_code
#
# @faker.version 1.8.0
def block_code
- "```ruby\n#{Lorem.sentence(word_count: 1)}\n```"
+ "```ruby\n#{Faker::Lorem.sentence(word_count: 1)}\n```"
end
##
@@ -110,7 +110,7 @@ def block_code
def table
table = []
3.times do
- table << "#{Lorem.word} | #{Lorem.word} | #{Lorem.word}"
+ table << "#{Faker::Lorem.word} | #{Faker::Lorem.word} | #{Faker::Lorem.word}"
end
table.insert(1, '---- | ---- | ----')
table.join("\n")
diff --git a/lib/faker/movies/movie.rb b/lib/faker/default/movie.rb
similarity index 100%
rename from lib/faker/movies/movie.rb
rename to lib/faker/default/movie.rb
diff --git a/lib/faker/default/omniauth.rb b/lib/faker/default/omniauth.rb
index 486152dd31..567c6bdf88 100644
--- a/lib/faker/default/omniauth.rb
+++ b/lib/faker/default/omniauth.rb
@@ -11,8 +11,8 @@ class Omniauth < Base
def initialize(name: nil, email: nil)
super()
- @name = name || "#{Name.first_name} #{Name.last_name}"
- @email = email || Internet.email(name: self.name)
+ @name = name || "#{Faker::Name.first_name} #{Faker::Name.last_name}"
+ @email = email || Faker::Internet.email(name: self.name)
@first_name, @last_name = self.name.split
end
@@ -27,8 +27,8 @@ class << self
# @return [Hash] An auth hash in the format provided by omniauth-google.
#
# @faker.version 1.8.0
- def google(name: nil, email: nil, uid: Number.number(digits: 9).to_s)
- auth = Omniauth.new(name: name, email: email)
+ def google(name: nil, email: nil, uid: Faker::Number.number(digits: 9).to_s)
+ auth = new(name: name, email: email)
{
provider: 'google_oauth2',
uid: uid,
@@ -40,9 +40,9 @@ def google(name: nil, email: nil, uid: Number.number(digits: 9).to_s)
image: image
},
credentials: {
- token: Crypto.md5,
- refresh_token: Crypto.md5,
- expires_at: Time.forward.to_i,
+ token: Faker::Crypto.md5,
+ refresh_token: Faker::Crypto.md5,
+ expires_at: Faker::Time.forward.to_i,
expires: true
},
extra: {
@@ -56,20 +56,20 @@ def google(name: nil, email: nil, uid: Number.number(digits: 9).to_s)
profile: "https://plus.google.com/#{uid}",
picture: image,
gender: gender,
- birthday: Date.backward(days: 36_400).strftime('%Y-%m-%d'),
+ birthday: Faker::Date.backward(days: 36_400).strftime('%Y-%m-%d'),
locale: 'en',
- hd: "#{Company.name.downcase}.com"
+ hd: "#{Faker::Company.name.downcase}.com"
},
id_info: {
iss: 'accounts.google.com',
- at_hash: Crypto.md5,
+ at_hash: Faker::Crypto.md5,
email_verified: true,
- sub: Number.number(digits: 28).to_s,
+ sub: Faker::Number.number(digits: 28).to_s,
azp: 'APP_ID',
email: auth.email,
aud: 'APP_ID',
- iat: Time.forward.to_i,
- exp: Time.forward.to_i,
+ iat: Faker::Time.forward.to_i,
+ exp: Faker::Time.forward.to_i,
openid_id: "https://www.google.com/accounts/o8/id?id=#{uid}"
}
}
@@ -87,8 +87,8 @@ def google(name: nil, email: nil, uid: Number.number(digits: 9).to_s)
# @return [Hash] An auth hash in the format provided by omniauth-facebook.
#
# @faker.version 1.8.0
- def facebook(name: nil, email: nil, username: nil, uid: Number.number(digits: 7).to_s)
- auth = Omniauth.new(name: name, email: email)
+ def facebook(name: nil, email: nil, username: nil, uid: Faker::Number.number(digits: 7).to_s)
+ auth = new(name: name, email: email)
username ||= "#{auth.first_name.downcase[0]}#{auth.last_name.downcase}"
{
provider: 'facebook',
@@ -102,7 +102,7 @@ def facebook(name: nil, email: nil, username: nil, uid: Number.number(digits: 7)
verified: random_boolean
},
credentials: {
- token: Crypto.md5,
+ token: Faker::Crypto.md5,
expires_at: Time.forward.to_i,
expires: true
},
@@ -115,7 +115,7 @@ def facebook(name: nil, email: nil, username: nil, uid: Number.number(digits: 7)
link: "http://www.facebook.com/#{username}",
username: username,
location: {
- id: Number.number(digits: 9).to_s,
+ id: Faker::Number.number(digits: 9).to_s,
name: city_state
},
gender: gender,
@@ -123,7 +123,7 @@ def facebook(name: nil, email: nil, username: nil, uid: Number.number(digits: 7)
timezone: timezone,
locale: 'en_US',
verified: random_boolean,
- updated_time: Time.backward.iso8601
+ updated_time: Faker::Time.backward.iso8601
}
}
}
@@ -139,11 +139,11 @@ def facebook(name: nil, email: nil, username: nil, uid: Number.number(digits: 7)
# @return [Hash] An auth hash in the format provided by omniauth-twitter.
#
# @faker.version 1.8.0
- def twitter(name: nil, nickname: nil, uid: Number.number(digits: 6).to_s)
- auth = Omniauth.new(name: name)
+ def twitter(name: nil, nickname: nil, uid: Faker::Number.number(digits: 6).to_s)
+ auth = new(name: name)
nickname ||= auth.name.downcase.delete(' ')
location = city_state
- description = Lorem.sentence
+ description = Faker::Lorem.sentence
{
provider: 'twitter',
uid: uid,
@@ -159,26 +159,26 @@ def twitter(name: nil, nickname: nil, uid: Number.number(digits: 6).to_s)
}
},
credentials: {
- token: Crypto.md5,
- secret: Crypto.md5
+ token: Faker::Crypto.md5,
+ secret: Faker::Crypto.md5
},
extra: {
access_token: '',
raw_info: {
name: auth.name,
listed_count: random_number_from_range(1..10),
- profile_sidebar_border_color: Color.hex_color,
+ profile_sidebar_border_color: Faker::Color.hex_color,
url: nil,
lang: 'en',
statuses_count: random_number_from_range(1..1000),
profile_image_url: image,
profile_background_image_url_https: image,
location: location,
- time_zone: Address.city,
+ time_zone: Faker::Address.city,
follow_request_sent: random_boolean,
id: uid,
profile_background_tile: random_boolean,
- profile_sidebar_fill_color: Color.hex_color,
+ profile_sidebar_fill_color: Faker::Color.hex_color,
followers_count: random_number_from_range(1..10_000),
default_profile_image: random_boolean,
screen_name: '',
@@ -186,7 +186,7 @@ def twitter(name: nil, nickname: nil, uid: Number.number(digits: 6).to_s)
utc_offset: timezone,
verified: random_boolean,
favourites_count: random_number_from_range(1..10),
- profile_background_color: Color.hex_color,
+ profile_background_color: Faker::Color.hex_color,
is_translator: random_boolean,
friends_count: random_number_from_range(1..10_000),
notifications: random_boolean,
@@ -194,8 +194,8 @@ def twitter(name: nil, nickname: nil, uid: Number.number(digits: 6).to_s)
profile_background_image_url: image,
protected: random_boolean,
description: description,
- profile_link_color: Color.hex_color,
- created_at: Time.backward.strftime('%a %b %d %H:%M:%S %z %Y'),
+ profile_link_color: Faker::Color.hex_color,
+ created_at: Faker::Time.backward.strftime('%a %b %d %H:%M:%S %z %Y'),
id_str: uid,
profile_image_url_https: image,
default_profile: random_boolean,
@@ -222,15 +222,15 @@ def twitter(name: nil, nickname: nil, uid: Number.number(digits: 6).to_s)
# @return [Hash] An auth hash in the format provided by omniauth-linkedin.
#
# @faker.version 1.8.0
- def linkedin(name: nil, email: nil, uid: Number.number(digits: 6).to_s)
+ def linkedin(name: nil, email: nil, uid: Faker::Number.number(digits: 6).to_s)
auth = Omniauth.new(name: name, email: email)
first_name = auth.first_name.downcase
last_name = auth.last_name.downcase
location = city_state
- description = Lorem.sentence
- token = Crypto.md5
- secret = Crypto.md5
- industry = Commerce.department
+ description = Faker::Lorem.sentence
+ token = Faker::Crypto.md5
+ secret = Faker::Crypto.md5
+ industry = Faker::Commerce.department
url = "http://www.linkedin.com/in/#{first_name}#{last_name}"
{
provider: 'linkedin',
@@ -244,7 +244,7 @@ def linkedin(name: nil, email: nil, uid: Number.number(digits: 6).to_s)
location: location,
description: description,
image: image,
- phone: PhoneNumber.phone_number,
+ phone: Faker::PhoneNumber.phone_number,
headline: description,
industry: industry,
urls: {
@@ -275,7 +275,7 @@ def linkedin(name: nil, email: nil, uid: Number.number(digits: 6).to_s)
industry: industry,
lastName: auth.last_name,
location: {
- country: { code: Address.country_code.downcase },
+ country: { code: Faker::Address.country_code.downcase },
name: city_state.split(', ').first
},
pictureUrl: image,
@@ -295,8 +295,8 @@ def linkedin(name: nil, email: nil, uid: Number.number(digits: 6).to_s)
# @return [Hash] An auth hash in the format provided by omniauth-github.
#
# @faker.version 1.8.0
- def github(name: nil, email: nil, uid: Number.number(digits: 8).to_s)
- auth = Omniauth.new(name: name, email: email)
+ def github(name: nil, email: nil, uid: Faker::Number.number(digits: 8).to_s)
+ auth = new(name: name, email: email)
login = auth.name.downcase.tr(' ', '-')
html_url = "https://github.com/#{login}"
api_url = "https://api.github.com/users/#{login}"
@@ -346,8 +346,8 @@ def github(name: nil, email: nil, uid: Number.number(digits: 8).to_s)
public_gists: random_number_from_range(1..1000),
followers: random_number_from_range(1..1000),
following: random_number_from_range(1..1000),
- created_at: Time.backward(days: 36_400).iso8601,
- updated_at: Time.backward(days: 2).iso8601
+ created_at: Faker::Time.backward(days: 36_400).iso8601,
+ updated_at: Faker::Time.backward(days: 2).iso8601
}
}
}
@@ -364,8 +364,8 @@ def github(name: nil, email: nil, uid: Number.number(digits: 8).to_s)
#
# @faker.version 2.3.0
def apple(name: nil, email: nil, uid: nil)
- uid ||= "#{Number.number(digits: 6)}.#{Number.hexadecimal(digits: 32)}.#{Number.number(digits: 4)}"
- auth = Omniauth.new(name: name, email: email)
+ uid ||= "#{Faker::Number.number(digits: 6)}.#{Faker::Number.hexadecimal(digits: 32)}.#{Faker::Number.number(digits: 4)}"
+ auth = new(name: name, email: email)
{
provider: 'apple',
uid: uid,
@@ -376,20 +376,20 @@ def apple(name: nil, email: nil, uid: nil)
last_name: auth.last_name
},
credentials: {
- token: Crypto.md5,
- refresh_token: Crypto.md5,
- expires_at: Time.forward.to_i,
+ token: Faker::Crypto.md5,
+ refresh_token: Faker::Crypto.md5,
+ expires_at: Faker::Time.forward.to_i,
expires: true
},
extra: {
raw_info: {
iss: 'https://appleid.apple.com',
aud: 'CLIENT_ID',
- exp: Time.forward.to_i,
- iat: Time.forward.to_i,
+ exp: Faker::Time.forward.to_i,
+ iat: Faker::Time.forward.to_i,
sub: uid,
- at_hash: Crypto.md5,
- auth_time: Time.forward.to_i,
+ at_hash: Faker::Crypto.md5,
+ auth_time: Faker::Time.forward.to_i,
email: auth.email,
email_verified: true
}
@@ -408,8 +408,8 @@ def apple(name: nil, email: nil, uid: nil)
#
# @faker.version next
def auth0(name: nil, email: nil, uid: nil)
- uid ||= "auth0|#{Number.hexadecimal(digits: 24)}"
- auth = Omniauth.new(name: name, email: email)
+ uid ||= "auth0|#{Faker::Number.hexadecimal(digits: 24)}"
+ auth = new(name: name, email: email)
{
provider: 'auth0',
uid: uid,
@@ -423,9 +423,9 @@ def auth0(name: nil, email: nil, uid: nil)
expires_at: Time.forward.to_i,
expires: true,
token_type: 'Bearer',
- id_token: Crypto.sha256,
- token: Crypto.md5,
- refresh_token: Crypto.md5
+ id_token: Faker::Crypto.sha256,
+ token: Faker::Crypto.md5,
+ refresh_token: Faker::Crypto.md5
},
extra: {
raw_info: {
@@ -434,8 +434,8 @@ def auth0(name: nil, email: nil, uid: nil)
iss: 'https://auth0.com/',
sub: uid,
aud: 'Auth012345',
- iat: Time.forward.to_i,
- exp: Time.forward.to_i
+ iat: Faker::Time.forward.to_i,
+ exp: Faker::Time.forward.to_i
}
}
}
@@ -452,11 +452,11 @@ def timezone
end
def image
- Placeholdit.image
+ Faker::Placeholdit.image
end
def city_state
- "#{Address.city}, #{Address.state}"
+ "#{Faker::Address.city}, #{Faker::Address.state}"
end
def random_number_from_range(range)
diff --git a/lib/faker/quotes/quote.rb b/lib/faker/default/quote.rb
similarity index 100%
rename from lib/faker/quotes/quote.rb
rename to lib/faker/default/quote.rb
diff --git a/lib/faker/default/religion.rb b/lib/faker/default/religion.rb
deleted file mode 100644
index c8c4102b65..0000000000
--- a/lib/faker/default/religion.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-module Faker
- module Religion
- end
-end
diff --git a/lib/faker/music/music.rb b/lib/faker/default/song.rb
similarity index 87%
rename from lib/faker/music/music.rb
rename to lib/faker/default/song.rb
index fe65f9abe1..35f40da244 100644
--- a/lib/faker/music/music.rb
+++ b/lib/faker/default/song.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Faker
- class Music < Base
+ class Song < Base
class << self
NOTE_LETTERS = %w[C D E F G A B].freeze
ACCIDENTAL_SIGNS = ['b', '#', ''].freeze
@@ -14,7 +14,7 @@ class << self
# @return [String]
#
# @example
- # Faker::Music.key #=> "A#"
+ # Faker::Song.key #=> "A#"
#
# @faker.version 1.6.4
def key
@@ -27,7 +27,7 @@ def key
# @return [String]
#
# @example
- # Faker::Music.chord #=> "Adim7"
+ # Faker::Song.chord #=> "Adim7"
#
# @faker.version 1.6.4
def chord
@@ -40,7 +40,7 @@ def chord
# @return [String]
#
# @example
- # Faker::Music.instrument #=> "Acoustic Guitar"
+ # Faker::Song.instrument #=> "Acoustic Guitar"
#
# @faker.version 1.6.4
def instrument
@@ -73,7 +73,7 @@ def key_variants
# @return [Array]
#
# @example
- # Faker::Music.key_types #=> ['', 'm']
+ # Faker::Song.key_types #=> ['', 'm']
#
# @faker.version 1.6.4
def key_types
@@ -96,7 +96,7 @@ def chord_types
# @return [String]
#
# @example
- # Faker::Music.band #=> "The Beatles"
+ # Faker::Song.band #=> "The Beatles"
#
# @faker.version 1.9.1
def band
@@ -109,7 +109,7 @@ def band
# @return [String]
#
# @example
- # Faker::Music.album #=> "Sgt. Pepper's Lonely Hearts Club"
+ # Faker::Song.album #=> "Sgt. Pepper's Lonely Hearts Club"
#
# @faker.version 1.9.1
def album
@@ -122,7 +122,7 @@ def album
# @return [String]
#
# @example
- # Faker::Music.genre #=> "Rock"
+ # Faker::Song.genre #=> "Rock"
#
# @faker.version 1.9.1
def genre
@@ -135,7 +135,7 @@ def genre
# @return [String]
#
# @example
- # Faker::Music.mambo #=> "Monica"
+ # Faker::Song.mambo #=> "Monica"
# @faker.version next
def mambo_no_5
fetch('music.mambo_no_5')
diff --git a/lib/faker/sports/sport.rb b/lib/faker/default/sport.rb
similarity index 100%
rename from lib/faker/sports/sport.rb
rename to lib/faker/default/sport.rb
diff --git a/lib/faker/fantasy.rb b/lib/faker/fantasy.rb
new file mode 100644
index 0000000000..0668aecf12
--- /dev/null
+++ b/lib/faker/fantasy.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Fantasy
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/games.rb b/lib/faker/games.rb
new file mode 100644
index 0000000000..2de5a26197
--- /dev/null
+++ b/lib/faker/games.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Games
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/japanese_media.rb b/lib/faker/japanese_media.rb
new file mode 100644
index 0000000000..7e617df7c7
--- /dev/null
+++ b/lib/faker/japanese_media.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class JapaneseMedia
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/locations.rb b/lib/faker/locations.rb
new file mode 100644
index 0000000000..3f7293abbf
--- /dev/null
+++ b/lib/faker/locations.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Locations
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/movies.rb b/lib/faker/movies.rb
new file mode 100644
index 0000000000..81a68980a9
--- /dev/null
+++ b/lib/faker/movies.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Movies
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/music.rb b/lib/faker/music.rb
new file mode 100644
index 0000000000..e981b05957
--- /dev/null
+++ b/lib/faker/music.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Music
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/music/bossa_nova.rb b/lib/faker/music/bossa_nova.rb
index 29dc8ea4f7..7d4f9b7f05 100644
--- a/lib/faker/music/bossa_nova.rb
+++ b/lib/faker/music/bossa_nova.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require_relative 'music'
-
module Faker
class Music
class BossaNova < Base
diff --git a/lib/faker/music/grateful_dead.rb b/lib/faker/music/grateful_dead.rb
index b7d0853e0d..8f1aa33df1 100644
--- a/lib/faker/music/grateful_dead.rb
+++ b/lib/faker/music/grateful_dead.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require_relative 'music'
-
module Faker
class Music
class GratefulDead < Base
diff --git a/lib/faker/music/pearl_jam.rb b/lib/faker/music/pearl_jam.rb
index c1c2ef59ae..78ebcbe6f8 100644
--- a/lib/faker/music/pearl_jam.rb
+++ b/lib/faker/music/pearl_jam.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require_relative 'music'
-
module Faker
class Music
class PearlJam < Base
diff --git a/lib/faker/music/rush.rb b/lib/faker/music/rush.rb
index 2af9596011..b002381c3d 100644
--- a/lib/faker/music/rush.rb
+++ b/lib/faker/music/rush.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require_relative 'music'
-
module Faker
class Music
class Rush < Base
diff --git a/lib/faker/music/smashing_pumpkins.rb b/lib/faker/music/smashing_pumpkins.rb
index 337f78f6aa..92df395fc4 100644
--- a/lib/faker/music/smashing_pumpkins.rb
+++ b/lib/faker/music/smashing_pumpkins.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require_relative 'music'
-
module Faker
class Music
class SmashingPumpkins < Base
diff --git a/lib/faker/quotes.rb b/lib/faker/quotes.rb
new file mode 100644
index 0000000000..2f49f1b77b
--- /dev/null
+++ b/lib/faker/quotes.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Quotes
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/religion.rb b/lib/faker/religion.rb
new file mode 100644
index 0000000000..d49cb7cc96
--- /dev/null
+++ b/lib/faker/religion.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Religion
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/religion/bible.rb b/lib/faker/religion/bible.rb
index bacaef3c99..2530b897e8 100644
--- a/lib/faker/religion/bible.rb
+++ b/lib/faker/religion/bible.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Faker
- module Religion
+ class Religion
class Bible < Base
flexible :bible
diff --git a/lib/faker/sports.rb b/lib/faker/sports.rb
new file mode 100644
index 0000000000..ead7a3dcb4
--- /dev/null
+++ b/lib/faker/sports.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Sports
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/travel.rb b/lib/faker/travel.rb
new file mode 100644
index 0000000000..763cb081f7
--- /dev/null
+++ b/lib/faker/travel.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class Travel
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/lib/faker/tv_shows.rb b/lib/faker/tv_shows.rb
new file mode 100644
index 0000000000..551ee82876
--- /dev/null
+++ b/lib/faker/tv_shows.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Faker
+ class TvShows
+ if ENV['LAZY_LOAD'] == '1'
+ Faker.lazy_load(self)
+ end
+ end
+end
diff --git a/test/faker/books/test_book.rb b/test/faker/default/test_book.rb
similarity index 100%
rename from test/faker/books/test_book.rb
rename to test/faker/default/test_book.rb
diff --git a/test/faker/games/test_faker_game.rb b/test/faker/default/test_faker_game.rb
similarity index 100%
rename from test/faker/games/test_faker_game.rb
rename to test/faker/default/test_faker_game.rb
diff --git a/test/faker/default/test_faker_internet_http.rb b/test/faker/default/test_faker_http.rb
similarity index 91%
rename from test/faker/default/test_faker_internet_http.rb
rename to test/faker/default/test_faker_http.rb
index b6c21341f5..d53ae3ee22 100644
--- a/test/faker/default/test_faker_internet_http.rb
+++ b/test/faker/default/test_faker_http.rb
@@ -2,9 +2,9 @@
require_relative '../../test_helper'
-class TestFakerInternetHTTP < Test::Unit::TestCase
+class TestFakerHTTP < Test::Unit::TestCase
def setup
- @tester = Faker::Internet::HTTP
+ @tester = Faker::HTTP
end
def test_status_code
diff --git a/test/faker/movies/test_faker_movie.rb b/test/faker/default/test_faker_movie.rb
similarity index 100%
rename from test/faker/movies/test_faker_movie.rb
rename to test/faker/default/test_faker_movie.rb
diff --git a/test/faker/quotes/test_faker_quote.rb b/test/faker/default/test_faker_quote.rb
similarity index 94%
rename from test/faker/quotes/test_faker_quote.rb
rename to test/faker/default/test_faker_quote.rb
index ab480e29dc..0258f1f5cc 100644
--- a/test/faker/quotes/test_faker_quote.rb
+++ b/test/faker/default/test_faker_quote.rb
@@ -2,7 +2,7 @@
require_relative '../../test_helper'
-class TestFakerYoda < Test::Unit::TestCase
+class TestFakerQuote < Test::Unit::TestCase
def setup
@tester = Faker::Quote
end
diff --git a/test/faker/music/test_faker_music.rb b/test/faker/default/test_faker_song.rb
similarity index 94%
rename from test/faker/music/test_faker_music.rb
rename to test/faker/default/test_faker_song.rb
index 86c7d6a0d3..0070802b99 100644
--- a/test/faker/music/test_faker_music.rb
+++ b/test/faker/default/test_faker_song.rb
@@ -2,9 +2,9 @@
require_relative '../../test_helper'
-class TestFakerMusic < Test::Unit::TestCase
+class TestFakerSong < Test::Unit::TestCase
def setup
- @tester = Faker::Music
+ @tester = Faker::Song
end
def test_keys
diff --git a/test/faker/sports/test_faker_sport.rb b/test/faker/default/test_faker_sport.rb
similarity index 100%
rename from test/faker/sports/test_faker_sport.rb
rename to test/faker/default/test_faker_sport.rb
diff --git a/test/faker/tv_shows/spongebob.rb b/test/faker/tv_shows/test_spongebob.rb
similarity index 100%
rename from test/faker/tv_shows/spongebob.rb
rename to test/faker/tv_shows/test_spongebob.rb
diff --git a/test/test_de_locale.rb b/test/test_de_locale.rb
index 1fe86dd563..c1fe526ef9 100644
--- a/test/test_de_locale.rb
+++ b/test/test_de_locale.rb
@@ -105,7 +105,7 @@ def test_de_name_methods
end
def test_de_music_methods
- assert_kind_of String, Faker::Music.instrument
+ assert_kind_of String, Faker::Song.instrument
end
def test_de_pokemon_methods
diff --git a/test/test_determinism.rb b/test/test_determinism.rb
index 0dd805d125..a60b045c89 100644
--- a/test/test_determinism.rb
+++ b/test/test_determinism.rb
@@ -82,41 +82,17 @@ def skipped_classes
Bank
Base
Base58
- Books
- Cat
Char
ChileRut
- CLI
Config
- Creature
Date
Deprecator
- Dog
- DragonBall
- Dota
- ElderScrolls
- Fallout
Games
- GamesHalfLife
- HeroesOfTheStorm
+ HTTP
Internet
- JapaneseMedia
- LeagueOfLegends
- Locations
- Movies
- Myst
- Overwatch
- OnePiece
- Pokemon
- Religion
- Sports
- SwordArtOnline
- TvShows
Time
+ TvShows
VERSION
- Witcher
- WorldOfWarcraft
- Zelda
]
end
end