From d3d26a71e570315e88a4ae4cef540f40dc37005b Mon Sep 17 00:00:00 2001 From: Stefanni Brasil Date: Tue, 10 Feb 2026 14:59:34 -0700 Subject: [PATCH] Lazy load experiment results Related #3199 Please refer to /experiments/lazy_loading doc for more details. --- .github/workflows/ruby.yml | 2 +- benchmark/load.rb | 10 ++ benchmark/load_faker.rb | 8 ++ doc/internet/http.md | 17 +-- doc/music/music.md | 14 +-- experiments/lazy_loading.md | 103 ++++++++++++++++ lib/faker.rb | 40 +++++- lib/faker/blockchain.rb | 9 ++ lib/faker/books.rb | 9 ++ lib/faker/creature.rb | 9 ++ lib/faker/default.rb | 9 ++ lib/faker/{books => default}/book.rb | 0 lib/faker/{games => default}/game.rb | 0 lib/faker/default/html.rb | 6 +- lib/faker/default/http.rb | 46 +++++++ lib/faker/default/internet.rb | 6 +- lib/faker/default/internet_http.rb | 48 -------- lib/faker/default/lorem.rb | 4 +- lib/faker/default/markdown.rb | 6 +- lib/faker/{movies => default}/movie.rb | 0 lib/faker/default/omniauth.rb | 116 +++++++++--------- lib/faker/{quotes => default}/quote.rb | 0 lib/faker/default/religion.rb | 6 - lib/faker/{music/music.rb => default/song.rb} | 18 +-- lib/faker/{sports => default}/sport.rb | 0 lib/faker/fantasy.rb | 9 ++ lib/faker/games.rb | 9 ++ lib/faker/japanese_media.rb | 9 ++ lib/faker/locations.rb | 9 ++ lib/faker/movies.rb | 9 ++ lib/faker/music.rb | 9 ++ lib/faker/music/bossa_nova.rb | 2 - lib/faker/music/grateful_dead.rb | 2 - lib/faker/music/pearl_jam.rb | 2 - lib/faker/music/rush.rb | 2 - lib/faker/music/smashing_pumpkins.rb | 2 - lib/faker/quotes.rb | 9 ++ lib/faker/religion.rb | 9 ++ lib/faker/religion/bible.rb | 2 +- lib/faker/sports.rb | 9 ++ lib/faker/travel.rb | 9 ++ lib/faker/tv_shows.rb | 9 ++ test/faker/{books => default}/test_book.rb | 0 .../{games => default}/test_faker_game.rb | 0 ...er_internet_http.rb => test_faker_http.rb} | 4 +- .../{movies => default}/test_faker_movie.rb | 0 .../{quotes => default}/test_faker_quote.rb | 2 +- .../test_faker_song.rb} | 4 +- .../{sports => default}/test_faker_sport.rb | 0 .../{spongebob.rb => test_spongebob.rb} | 0 test/test_de_locale.rb | 2 +- test/test_determinism.rb | 28 +---- 52 files changed, 444 insertions(+), 193 deletions(-) create mode 100644 benchmark/load.rb create mode 100755 benchmark/load_faker.rb create mode 100644 experiments/lazy_loading.md create mode 100644 lib/faker/blockchain.rb create mode 100644 lib/faker/books.rb create mode 100644 lib/faker/creature.rb create mode 100644 lib/faker/default.rb rename lib/faker/{books => default}/book.rb (100%) rename lib/faker/{games => default}/game.rb (100%) create mode 100644 lib/faker/default/http.rb delete mode 100644 lib/faker/default/internet_http.rb rename lib/faker/{movies => default}/movie.rb (100%) rename lib/faker/{quotes => default}/quote.rb (100%) delete mode 100644 lib/faker/default/religion.rb rename lib/faker/{music/music.rb => default/song.rb} (87%) rename lib/faker/{sports => default}/sport.rb (100%) create mode 100644 lib/faker/fantasy.rb create mode 100644 lib/faker/games.rb create mode 100644 lib/faker/japanese_media.rb create mode 100644 lib/faker/locations.rb create mode 100644 lib/faker/movies.rb create mode 100644 lib/faker/music.rb create mode 100644 lib/faker/quotes.rb create mode 100644 lib/faker/religion.rb create mode 100644 lib/faker/sports.rb create mode 100644 lib/faker/travel.rb create mode 100644 lib/faker/tv_shows.rb rename test/faker/{books => default}/test_book.rb (100%) rename test/faker/{games => default}/test_faker_game.rb (100%) rename test/faker/default/{test_faker_internet_http.rb => test_faker_http.rb} (91%) rename test/faker/{movies => default}/test_faker_movie.rb (100%) rename test/faker/{quotes => default}/test_faker_quote.rb (94%) rename test/faker/{music/test_faker_music.rb => default/test_faker_song.rb} (94%) rename test/faker/{sports => default}/test_faker_sport.rb (100%) rename test/faker/tv_shows/{spongebob.rb => test_spongebob.rb} (100%) 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}" 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