ZAICOでは、Android・iOS・Rubyエンジニアを絶賛募集中です! 詳しくは、採用ページをご覧ください。
去年の今頃、タイから一時帰国して戻ろうと思った矢先にコロナでフライトがキャンセルされ帰れずに未だに日本に滞在中です。
最近はミャンマーのクーデターの影響で彼女と連絡が取れない日があったりとツイていません。
早く以前のように渡航ができるようになることを祈ります。
Faker
先日、大量のデータを使った検証をする必要があり、手軽にダミーデータを作成できるgemがないか探していたらFakerというものがありました。
使い方
早速使ってみたいと思います。
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
データの種類
名前や住所などの他に映画や漫画の登場人物など色々な値があるようです。
その他についてはこちらにまとまっています。
まとめ
とりあえず、それっぽいデータが大量に欲しい事があるので覚えていると使える時があるかもしれませんね。