くりにっき

フルスタックキュアエンジニアです

Rubyでプリキュアを作った #cure_advent

これは プリキュア Advent Calendar 2013 の16日目です。

はじめに

12/16はキュアピースの中の人の金元寿子さんの誕生日です。おめでとうございます!!!

ピカピカぴかりんじゃんけんぽん!キュアピース!

#いい夫婦の日なので嫁を晒す

#いい夫婦の日なので嫁を晒す 会社の方

トリプルピース

15日目

id:tdakak さんの ハートキャッチプリキュア!の好きなところ でした

16日目:Rubyプリキュアを作った

Rubicure*1というプリキュアのgemを作りました。

プリキュアハッカソンid:drillbits さんが作っていた pycureインスパイヤされてRuby版を作りました。(Ruby 2.0以上必須)

使い方

gem install rubicure

してください irb

require "rubicure"

すれば使えるようになります。

実際に使ってみます。

Rubicure::Seriesを取得

Precure.〜 でそれっぽいタイトルを入れればRubicure::Seriesを取得できます。

Precure.max_heart.title
#=> "ふたりはプリキュア Max Heart"

Precure.splash_star.title
#=> "ふたりはプリキュア Splash Star"

Precure.yes.title
#=> "Yes! プリキュア5"

Precure.yes_gogo.title
#=> "Yes! プリキュア5 Go Go!"

Precure.fresh.title
#=> "フレッシュプリキュア!"

Precure.heart_catch.title
#=> "ハートキャッチプリキュア!"

Precure.suite.title
#=> "スイートプリキュア♪"

Precure.smile.title
#=> "スマイルプリキュア!"

Precure.dokidoki.title
#=> "ドキドキ!プリキュア"

ここで勃発する初代(無印)問題。

無印は下記のようにunmarkedを使うか、Precure から Rubicure::Seriesメソッド呼んだ場合無印になります。*2

Precure.unmarked.title
#=> "ふたりはプリキュア"

Precure.title
#=> "ふたりはプリキュア"

余談ですがここの method_missing は地味に面倒くさかったです

    def method_missing(name, *args)
      unmarked_precure = Rubicure::Series::find(:unmarked)

      if Rubicure::Series::valid?(name)
        Rubicure::Series::find(name)
      elsif unmarked_precure.respond_to?(name)
        unmarked_precure.send(name, *args)
      else
        super
      end
    end

タイトルのaliasも一通り用意しているのでまず困ることはないかと思います。 https://github.com/sue445/rubicure/blob/master/config/series.yml

放映中のプリキュアを取得

Precure.nowPrecure.current で取れます。

Precure.now
#=> {:title=>"ドキドキ!プリキュア", :started_date=>Sun, 03 Feb 2013, :ended_date=>Sun, 26 Jan 2014, :girls=>["cure_heart", "cure_diamond", "cure_rosetta", "cure_sword", "cure_ace"]}

Precure.current
#=> {:title=>"ドキドキ!プリキュア", :started_date=>Sun, 03 Feb 2013, :ended_date=>Sun, 26 Jan 2014, :girls=>["cure_heart", "cure_diamond", "cure_rosetta", "cure_sword", "cure_ace"]}

プリキュアの放送がされてない期間(下のサンプルだとスマイルとドキドキの空白期間)ではエラーになります

require "delorean"
Delorean.time_travel_to "2013-02-01"
Precure.now
#=> RuntimeError: Not on air precure!

現在時刻系のテストには delorean 使うと超便利

日付を渡して放映期間中かどうか調べる

Rubicure::Series#on_air? メソッドDateTime か日付っぽい文字列*3 を渡します

Precure.dokidoki.on_air?("2013-12-16")
#=> true

Precure.smile.on_air?("2013-12-16")
#=> false

番組に出てくるプリキュアの一覧を取得する

Rubicure::Series#girlsRubicure::Girl の配列が返ってきます

Precure.smile.girls
#=> [#<Rubicure::Girl:0x007fbd60a5d6e0 @human_name="星空みゆき", @precure_name="キュアハッピー", @transform_message="(レディ?)\nプリキュア・スマイルチャージ!\n(ゴー!ゴー!レッツ・ゴー!ハッピー!!)\nキラキラ輝く未来の光! キュアハッピー!\n5つの光が導く未来!\n輝け!スマイルプリキュア!\n", @extra_names=["プリンセスハッピー", "ウルトラハッピー"], @current_state=0, @state_names=["星空みゆき", "キュアハッピー", "プリンセスハッピー", "ウルトラハッピー"]>, #<Rubicure::Girl:0x007fbd60a5d5c8 @human_name="日野あかね", @precure_name="キュアサニー", @transform_message="(レディ?)\nプリキュア・スマイルチャージ!\n(ゴー!ゴー!レッツ・ゴー!サニー!!)\n太陽サンサン熱血パワー! キュアサニー!\n5つの光が導く未来!\n輝け!スマイルプリキュア!\n", @extra_names=["プリンセスサニー", "ウルトラサニー"], @current_state=0, @state_names=["日野あかね", "キュアサニー", "プリンセスサニー", "ウルトラサニー"]>, #<Rubicure::Girl:0x007fbd60a5d500 @human_name="黄瀬やよい", @precure_name="キュアピース", @transform_message="(レディ?)\nプリキュア・スマイルチャージ!\n(ゴー!ゴー!レッツ・ゴー!ピース!!)\nピカピカピカリンジャンケンポン! キュアピース!\n5つの光が導く未来!\n輝け!スマイルプリキュア!\n", @extra_names=["プリンセスピース", "ウルトラピース"], @current_state=0, @state_names=["黄瀬やよい", "キュアピース", "プリンセスピース", "ウルトラピース"]>, #<Rubicure::Girl:0x007fbd60a5d410 @human_name="緑川なお", @precure_name="キュアマーチ", @transform_message="(レディ?)\nプリキュア・スマイルチャージ!\n(ゴー!ゴー!レッツ・ゴー!マーチ!!)\n勇気リンリン直球勝負! キュアマーチ!\n5つの光が導く未来!\n輝け!スマイルプリキュア!\n", @extra_names=["プリンセスマーチ", "ウルトラマーチ"], @current_state=0, @state_names=["緑川なお", "キュアマーチ", "プリンセスマーチ", "ウルトラマーチ"]>, #<Rubicure::Girl:0x007fbd60a5d320 @human_name="青木れいか", @precure_name="キュアビューティ", @transform_message="(レディ?)\nプリキュア・スマイルチャージ!\n(ゴー!ゴー!レッツ・ゴー!ビューティ!!)\nしんしんと降り積もる清き心! キュアビューティ!\n5つの光が導く未来!\n輝け!スマイルプリキュア!\n", @extra_names=["プリンセスビューティ", "ウルトラビューティ"], @current_state=0, @state_names=["青木れいか", "キュアビューティ", "プリンセスビューティ", "ウルトラビューティ"]>]

Precure.smile.girls.map(&:human_name)
#=> ["星空みゆき", "日野あかね", "黄瀬やよい", "緑川なお", "青木れいか"]

Precure.smile.girls.map(&:precure_name)
#=> ["キュアハッピー", "キュアサニー", "キュアピース", "キュアマーチ", "キュアビューティ"]

Precure.smile.girls.count
#=> 5

Cure.~

Rubicure::GirlRubicure::Series#girls 経由じゃなくても取得できます

Cure.lemonade
#=> #<Rubicure::Girl:0x007fbd60ae72a0 @human_name="春日野うらら", @precure_name="キュアレモネード", @transform_message="プリキュア!メタモルフォーゼ!\nはじけるレモンの香り、キュアレモネード!\n希望の力と未来の光!\n華麗に羽ばたく5つの心!\nYes!プリキュア5!\n", @extra_names=[], @current_state=0, @state_names=["春日野うらら", "キュアレモネード"]>

Cure.pine
#=> #<Rubicure::Girl:0x007fbd60aee640 @human_name="山吹祈里", @precure_name="キュアパイン", @transform_message="チェインジ!プリキュア・ビートアップ!\nイエローハートは祈りのしるし!\nとれたてフレッシュ、キュアパイン!\nレッツプリキュア!\n", @extra_names=["キュアエンジェルパイン"], @current_state=0, @state_names=["山吹祈里", "キュアパイン", "キュアエンジェルパイン"]>

Cure.sunshine
#=> #<Rubicure::Girl:0x007f83413a6e18 @human_name="明堂院いつき", @precure_name="キュアサンシャイン", @transform_message="(プリキュアの種、いくですぅ!)\nプリキュア!オープンマイハート!\n陽の光浴びる一輪の花! キュアサンシャイン!\nハートキャッチ、プリキュア!\n", @extra_names=["スーパーキュアサンシャイン"], @current_state=0, @state_names=["明堂院いつき", "キュアサンシャイン", "スーパーキュアサンシャイン"]>

Cure.muse
#=> #<Rubicure::Girl:0x007fbd60af7510 @human_name="調辺アコ", @precure_name="キュアミューズ", @transform_message="レッツプレイ!プリキュアモジュレーション!!\n爪弾くは女神の調べ! キュアミューズ!\n響け4人の組曲!スイートプリキュア!\n", @extra_names=["クレッシェンドミューズ"], @current_state=0, @state_names=["調辺アコ", "キュアミューズ", "クレッシェンドミューズ"]>

Cure.peace
#=> #<Rubicure::Girl:0x007fbd60aceca0 @human_name="黄瀬やよい", @precure_name="キュアピース", @transform_message="(レディ?)\nプリキュア・スマイルチャージ!\n(ゴー!ゴー!レッツ・ゴー!ピース!!)\nピカピカピカリンジャンケンポン! キュアピース!\n5つの光が導く未来!\n輝け!スマイルプリキュア!\n", @extra_names=["プリンセスピース", "ウルトラピース"], @current_state=0, @state_names=["黄瀬やよい", "キュアピース", "プリンセスピース", "ウルトラピース"]>

Cure.rosetta
#=> #<Rubicure::Girl:0x007fbd60af42c0 @human_name="四葉ありす", @precure_name="キュアロゼッタ", @transform_message="プリキュアラブリンク!\nL! O! V! E!\nひだまりポカポカ キュアロゼッタ!\n響け愛の鼓動!ドキドキプリキュア!\n世界を制するのは愛だけです、\nさぁ、あなたも私と愛を育んでくださいな\n", @extra_names=[], @current_state=0, @state_names=["四葉ありす", "キュアロゼッタ"]>

シャイニールミナスミルキィローズは下記の方法で取得してください

Shiny.luminous
#=> #<Rubicure::Girl:0x007fbd60ad7288 @human_name="九条ひかり", @precure_name="シャイニールミナス", @transform_message="ルミナス・シャイニングストリーム!\n輝く命、シャイニールミナス!\n光の心と光の意志、すべてを一つにするために!\n", @extra_names=[], @current_state=0, @state_names=["九条ひかり", "シャイニールミナス"]>

Milky.rose
#=> #<Rubicure::Girl:0x007fbd60aded08 @human_name="美々野くるみ", @precure_name="ミルキィローズ", @transform_message="スカイローズ・トランスレイト!\n青いバラは秘密のしるし! ミルキィローズ!\n", @extra_names=[], @current_state=0, @state_names=["美々野くるみ", "ミルキィローズ"]>

その他alias https://github.com/sue445/rubicure/blob/master/config/girls.yml

Rubicure::Girl

nameで現在の名前が取れます

yayoi = Precure.smile.girls[2]

yayoi.name
#=> "黄瀬やよい"

transform! で掛け声とともに変身し、nameも変わります

yayoi.transform!

(レディ?)
プリキュア・スマイルチャージ!
(ゴー!ゴー!レッツ・ゴー!ピース!!)
ピカピカピカリンジャンケンポン! キュアピース!
5つの光が導く未来!
輝け!スマイルプリキュア!

yayoi.name
#=> "キュアピース"

第2形態以降もあれば繰り返し変身します(が、掛け声はありません)

yayoi.transform!
yayoi.name
#=> "プリンセスピース"

yayoi.transform!
yayoi.name
#=> "ウルトラピース"

最後までいくと人間に戻ります

yayoi.transform!
yayoi.name
#=> "黄瀬やよい"

humanizeだと途中でも変身を解除して人間に戻ります

yayoi.transform!.transform!
yayoi.name
#=> "プリンセスピース"

yayoi.humanize
#=> 0
yayoi.name
#=> "黄瀬やよい"

プリキュアオールスターズ

Precure.all_starsプリキュアオールスターズ全員取得できます

Precure.all_stars.count
#=> 33

Precure.all_stars.map(&:precure_name)
#=> ["キュアブラック", "キュアホワイト", "シャイニールミナス", "キュアブルーム", "キュアイーグレット", "キュアドリーム", "キュアルージュ", "キュアレモネード", "キュアミント", "キュアアクア", "ミルキィローズ", "キュアピーチ", "キュアベリー", "キュアパイン", "キュアパッション", "キュアブロッサム", "キュアマリン", "キュアサンシャイン", "キュアムーンライト", "キュアメロディ", "キュアリズム", "キュアビート", "キュアミューズ", "キュアハッピー", "キュアサニー", "キュアピース", "キュアマーチ", "キュアビューティ", "キュアハート", "キュアダイヤモンド", "キュアロゼッタ", "キュアソード", "キュアエース"]

未実装

  • transform_with
    • 初代だとパートナーがいないと変身できないという設定なので
    • ただ、厳密にやろうとするとパートナー妖精も考慮しないといけなくなるのでYAMLだけでなんとかするのは限界があった
  • (みなと)みらいのともだち
    • 坂上あゆみ?知らない子ですね
  • S☆S
    • 満と薫?知らn(ry

映画プリキュアオールスターズ NewStage みらいのともだち 特装版 [Blu-ray]

映画プリキュアオールスターズ NewStage みらいのともだち 特装版 [Blu-ray]

参考になったもの

まとめ

  • rubyを書き始めてまだ1年半ですが、自分が使いたいものを作ったり RailsにPullRequestを送る程度には使いこなせるようになったと思います
  • ネタgemを作るとメタプロが捗る *4

おまけ

せっかくなのでcodeclimate登録してみたらGPA 4.0でした (・ω<)

f:id:sue445:20131215233131p:plain

追記

ブコメレス

いや無印はunmarkedじゃないでしょう……firstとかが妥当

Enumerable以外でfirst使うのはそれはそれで違和感が。yamlで別名をつけているので

Precure.futari_wa_pretty_cure 

でも取得はできます。

追記 12/16 23:32

サンプルでスイートとサンシャインが抜けていたのを追記

18日目

@さんの プリキュアに愛を伝えたくて #cure_advent : どっくりぽんかんじま です

映画プリキュアオールスターズNew Stage2 特装版Blu-ray

映画プリキュアオールスターズNew Stage2 特装版Blu-ray

*1: Ruby + Precure = Rubicure

*2:unmarkedではなくfutari_wa_pretty_cureでも可

*3:Date.parseできればOK

*4:オヤジギャグ