sue445/rubicure

View on GitHub
lib/rubicure/core.rb

Summary

Maintainability
A
2 hrs
Test Coverage
module Rubicure
  require "singleton"

  # generic methods
  class Core
    include Singleton
    include Enumerable
    include Rubicure::Concerns::Util

    Rubicure::Series.names.each do |series_name|
      define_method series_name do
        Rubicure::Series.find(series_name)
      end
    end

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

      if unmarked_precure.respond_to?(name)
        unmarked_precure.send(name, *args)
      else
        super
      end
    end

    def respond_to_missing?(name, _include_private)
      unmarked_precure = Rubicure::Series.find(:unmarked)
      unmarked_precure.respond_to?(name)
    end

    # rubocop:disable Layout/LineLength

    # get current precure series
    # @return [Rubicure::Series] current precure
    #
    # @raise [NotOnAirError] not onair!
    #
    # @example
    #   Precure.now
    #   #=> {:series_name=>"go_princess", :title=>"Go!プリンセスプリキュア", :started_date=>Sun, 01 Feb 2015, :girls=>["cure_flora", "cure_mermaid", "cure_twinkle", "cure_scarlet"]}
    def now
      current_time = Time.now
      each_with_series do |series|
        return series if series.on_air?(current_time)
      end
      raise NotOnAirError, "Not on air precure!"
    end
    # rubocop:enable Layout/LineLength

    alias_method :current, :now

    # Get precure all stars
    #
    # @param [Time,Date,String,Symbol] arg Time, Date or date like String (ex. "2013-12-16")
    #
    # @return [Array<Rubicure::Girl>]
    #
    # @example precure all stars
    #   Precure.all_stars.count
    #   Precure.all_stars.map(&:precure_name)
    #   # returns current precure count and names
    #
    #   Precure.all_stars.include?(Cure.echo)
    #   #=> false
    #
    #   Precure.all_stars("2013-10-26").count
    #   #=> 33
    #
    #   Precure.all_stars(:dx).count
    #   #=> 14
    #
    #   Precure.all_stars(:dx2).count
    #   #=> 17
    #
    #   Precure.all_stars(:dx3).count
    #   #=> 21
    #
    #   Precure.all_stars(:new_stage).count
    #   #=> 29
    #   Precure.all_stars(:new_stage).include?(Cure.echo)
    #   #=> true
    #
    #   Precure.all_stars(:new_stage2).count
    #   #=> 32
    #
    #   Precure.all_stars(:new_stage3).count
    #   #=> 37
    #   Precure.all_stars(:new_stage3).include?(Cure.echo)
    #   #=> true
    #
    #   Precure.all_stars(:spring_carnival).count
    #   #=> 40
    #
    #   Precure.all_stars(:sing_together_miracle_magic).count
    #   #=> 44
    #   Precure.all_stars(:sing_together_miracle_magic).include?(Cure.echo)
    #   #=> true
    #
    #   Precure.all_stars(:memories).count
    #   #=> 55
    #
    #   Precure.all_stars(:f).count
    #   #=> 78
    #   Precure.all_stars(:f).include?(Cure.echo)
    #   #=> false
    def all_stars(arg = Time.current)
      extra_girls = []

      # args is Time or Date
      date = to_date(arg)

      if date
        last_all_stars_date = Rubicure::Movie.find(:stmm).started_date
        if date > last_all_stars_date
          date = last_all_stars_date
        end
      else
        # args is movie name
        movie = Rubicure::Movie.find(arg.to_sym)
        date = movie.started_date

        if movie.has_key?(:extra_girls)
          extra_girls = movie.extra_girls.map {|girl_name| Rubicure::Girl.find(girl_name.to_sym) }
        end
      end

      all_girls(date) - [Cure.echo] + extra_girls
    end

    # Get all precures
    #
    # @param [Time,Date] arg Time, Date or date like String (ex. "2013-12-16")
    #
    # @return [Array<Rubicure::Girl>] all precures
    #
    # @example
    #   Precure.all_girls.count
    #   Precure.all_girls.map(&:precure_name)
    #   # returns current precure count and names
    #
    #   Precure.all_girls("2013-10-26").count
    #   #=> 33
    #
    #   Precure.all_girls.include?(Cure.echo)
    #   #=> true
    def all_girls(arg = Time.current)
      date = to_date(arg)

      unless @all_girls
        @all_girls = []
        Rubicure::Girl.names.each do |girl_name|
          @all_girls << Rubicure::Girl.find(girl_name)
        end

        @all_girls.uniq!(&:human_name)
      end

      @all_girls.select {|girl| girl.created_date && girl.created_date <= date }
    end

    alias_method :all, :all_girls
    alias_method :all_members, :all_girls

    # Get precure dream stars
    #
    # @return [Array<Rubicure::Girl>] precure dream stars
    #
    # @example
    #   Precure.dream_stars.count
    #   #=> 12
    #
    #   Precure.dream_stars.map(&:precure_name)
    #   #=> ["キュアフローラ", "キュアマーメイド", "キュアトゥインクル", "キュアスカーレット", "キュアミラクル", "キュアマジカル", "キュアフェリーチェ", "キュアホイップ", "キュアカスタード", "キュアジェラート", "キュアマカロン", "キュアショコラ"]
    def dream_stars
      return @dream_stars if @dream_stars

      girls = Precure.go_princess.girls + Precure.maho_girls.girls + Precure.a_la_mode.girls

      dream_stars_date = Rubicure::Movie.find(:dream_stars).started_date
      @dream_stars = girls.select {|girl| girl.created_date && girl.created_date <= dream_stars_date }

      @dream_stars
    end

    # Get precure super stars
    #
    # @return [Array<Rubicure::Girl>] precure super stars
    #
    # @example
    #   Precure.super_stars.count
    #   #=> 12
    #
    #   Precure.super_stars.map(&:precure_name)
    #   #=> ["キュアミラクル", "キュアマジカル", "キュアフェリーチェ", "キュアホイップ", "キュアカスタード", "キュアジェラート", "キュアマカロン", "キュアショコラ", "キュアパルフェ", "キュアエール", "キュアアンジュ", "キュアエトワール"]
    def super_stars
      return @super_stars if @super_stars

      girls = Precure.maho_girls.girls + Precure.a_la_mode.girls + Precure.hugtto.girls

      super_stars_date = Rubicure::Movie.find(:super_stars).started_date
      @super_stars = girls.select {|girl| girl.created_date && girl.created_date <= super_stars_date }

      @super_stars
    end
    alias_method :superstars, :super_stars

    # rubocop:disable Layout/LineLength

    # Get precure miracle universe
    #
    # @return [Array<Rubicure::Girl>] precure miracle universe
    #
    # @example
    #   Precure.miracle_universe.count
    #   #=> 15
    #
    #   Precure.miracle_universe.map(&:precure_name)
    #   #=> ["キュアホイップ", "キュアカスタード", "キュアジェラート", "キュアマカロン", "キュアショコラ", "キュアパルフェ", "キュアエール", "キュアアンジュ", "キュアエトワール", "キュアマシェリ", "キュアアムール", "キュアスター", "キュアミルキー", "キュアソレイユ", "キュアセレーネ"]
    def miracle_universe
      return @miracle_universe if @miracle_universe

      girls = Precure.a_la_mode.girls + Precure.hugtto.girls + Precure.star_twinkle.girls

      miracle_universe_date = Rubicure::Movie.find(:miracle_universe).started_date
      @miracle_universe = girls.select {|girl| girl.created_date && girl.created_date <= miracle_universe_date }

      @miracle_universe
    end

    # Get precure miracle leap
    #
    # @return [Array<Rubicure::Girl>] precure miracle leap
    #
    # @example
    #   Precure.miracle_leap.count
    #   #=> 13
    #
    #   Precure.miracle_leap.map(&:precure_name)
    #   #=> ["キュアエール", "キュアアンジュ", "キュアエトワール", "キュアマシェリ", "キュアアムール", "キュアスター", "キュアミルキー", "キュアソレイユ", "キュアセレーネ", "キュアグレース", "キュアフォンテーヌ", "キュアスパークル"]
    def miracle_leap
      return @miracle_leap if @miracle_leap

      girls = Precure.hugtto.girls + Precure.star_twinkle.girls + Precure.healingood.girls

      miracle_leap_date = Rubicure::Movie.find(:miracle_leap).started_date
      @miracle_leap = girls.select {|girl| girl.created_date && girl.created_date <= miracle_leap_date }
      @miracle_leap.reject! {|girl| girl == Cure.earth }

      @miracle_leap
    end

    # rubocop:enable Layout/LineLength

    # iterate with :unmarked, :max_heart, ...
    #
    # @yield series
    # @yieldparam series [Rubicure::Series]
    #
    # @return [Array<Symbol>] ex. :unmarked, :max_heart, ...
    def each_with_series
      Rubicure::Series.uniq_names.each do |series_name|
        series = Rubicure::Series.find(series_name)
        yield series
      end
    end

    alias_method :each, :each_with_series
  end
end