ダミデータを手軽に作成できるgem「Faker」

去年の今頃、タイから一時帰国して戻ろうと思った矢先にコロナでフライトがキャンセルされ帰れずに未だに日本に滞在中です。

最近はミャンマーのクーデターの影響で彼女と連絡が取れない日があったりとツイていません。

早く以前のように渡航ができるようになることを祈ります。

Faker

先日、大量のデータを使った検証をする必要があり、手軽にダミーデータを作成できるgemがないか探していたらFakerというものがありました。

GitHub – faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.

使い方

早速使ってみたいと思います。

3.times do
  person = {
    name:             Faker::Name.name,
    phone_number:     Faker::PhoneNumber.cell_phone_in_e164,
    address: {
      zip_code:       Faker::Address.zip_code, 
      state:          Faker::Address.state, 
      city:           Faker::Address.city, 
      street_address: Faker::Address.street_address,
      full_address:   Faker::Address.full_address,
    },
    birthday:         Faker::Date.birthday(min_age: 18, max_age: 65).strftime('%Y-%m-%d'),
    favorites: {
      movies: 3.times.map{ Faker::Movie.title }.uniq,
    }
  }

  puts JSON.pretty_generate(person)
end

早速これを実行すると下記のような結果を得ることが出来ます。

{
  "name": "Mr. Frankie O'Kon",
  "phone_number": "+2976419832647",
  "address": {
    "zip_code": "16346",
    "state": "South Carolina",
    "city": "Danitaville",
    "street_address": "5795 Buford Estate",
    "full_address": "367 Tammy Rapid, Ortizside, ID 05792"
  },
  "birthday": "1969-12-22",
  "favorites": {
    "movies": [
      "All About Eve",
      "The Terminator",
      "Star Wars: Episode IV – A New Hope"
    ]
  }
}
{
  "name": "The Hon. Gerry Lebsack",
  "phone_number": "+5042636637286",
  "address": {
    "zip_code": "27427",
    "state": "Massachusetts",
    "city": "New Marcymouth",
    "street_address": "20152 Rosaura Park",
    "full_address": "92720 Keena Stravenue, Henryshire, SC 69227"
  },
  "birthday": "1995-12-07",
  "favorites": {
    "movies": [
      "Toy Story",
      "Memento",
      "Unforgiven"
    ]
  }
}
{
  "name": "Earnestine Schneider",
  "phone_number": "+3816889102763",
  "address": {
    "zip_code": "22800-7897",
    "state": "Georgia",
    "city": "Zandramouth",
    "street_address": "302 Klocko Corners",
    "full_address": "Suite 252 74813 Nienow Center, Geraldoport, TX 87676"
  },
  "birthday": "1983-12-11",
  "favorites": {
    "movies": [
      "Toy Story",
      "Paths of Glory",
      "The Thing"
    ]
  }
}

ここで注意が必要なのはaddressのzip_code,state,city,street_address,full_addressはそれぞれ関連した値ではないので正確な住所ではありません。

正確な住所が欲しい場合には別サービスのAPIを叩くなどする必要がありそうです。

また、どのようにランダムに値を取得しているかfakerの実装を見てみると下記のように sample でランダムに取得しているだけでした。

faker/faker.rb at ff071d5c8e1929ba12941ebc308d517e0f682d94 · faker-ruby/faker · GitHub

      # Helper for the common approach of grabbing a translation
      # with an array of values and selecting one of them.
      def fetch(key)
        fetched = sample(translate("faker.#{key}"))
        if fetched&.match(%r{^/}) && fetched&.match(%r{/$}) # A regex
          regexify(fetched)
        else
          fetched
        end
      end

多言語

一部のデータは日本語などにも対応しているので下記の方法で言語を変更することで日本語のダミーデータを生成することも出来ます。

# 言語を日本語に設定
Faker::Config.locale = 'ja'

puts Faker::Name.name # 原田 碧

多言語対応されているかは下記を見ることで確認、編集することが出来ます。

faker/lib/locales at master · faker-ruby/faker · GitHub

独自の翻訳ファイルを使いたい場合は locales/ja.yml のようなファイルを作成し下記のように使用します。

翻訳ファイルのフォーマットなどについては元ファイルを参照してください。

# 独自の翻訳ファイルを読み込む
I18n.load_path = Dir[File.join(__dir__, 'locales', '**/*.yml')]
I18n.reload! if I18n.backend.initialized?

# 言語を日本語に設定
Faker::Config.locale = 'ja'

puts Faker::Name.name

データの種類

名前や住所などの他に映画や漫画の登場人物など色々な値があるようです。

その他についてはこちらにまとまっています。

GitHub – faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.

まとめ

とりあえず、それっぽいデータが大量に欲しい事があるので覚えていると使える時があるかもしれませんね。