3

日付範囲で休暇を追跡するアプリを作成していますが、計算の一部で週末と休日を除外するようにしています。休日を追跡するために、Holidays gem ( https://github.com/alexdunae/holidays ) の分岐バージョンを使用して、会社が認識する休日を認識するように編集しています。私のフォーク: ( https://github.com/rclark4/holidays )。

これまでのところ、すべてがうまく機能していますが、元の宝石への追加である感謝祭の翌日に問題が発生しました。これは、YAML ファイルがどのように見えるかの抜粋です。

  11: 
  - name: Thanksgiving
    week: 4
    regions: [us]
    wday: 4
  - name: Day after Thanksgiving
    week: 4
    regions: [us]
    wday: 5

これは 2008 年から 2012 年まで機能していましたが、2013 年には機能しませんでした (そして 6 ~ 7 年ごとには機能しません)。これは、この 11 月が金曜日に始まるため、現在、感謝祭の翌日がその 1 週間前であると言っているからです。実際にあります。他のすべての休日の構文を調べて、変動休日の翌日に発生した休日の前例があるかどうかを確認しようとしましたが、見つけることができませんでした (見つけた最も近いものは、聖金曜日からイースターでした) 、しかしイースターには完全に独自の方法があります)。このための関数を作成する方法についてのアイデアはありますか?

さらに情報が必要な場合はお知らせください。

4

2 に答える 2

2

ショーンの答えはほとんど正しいですが、実際には元のファイルに地域固有のメソッドを入れることになっています。アイデアは、.yaml ファイルだけで、新しい定義を作成するために .rb ファイルに触れる必要はないということです。lib/holidays.rb は、一般的なコード ルール (to_weekday_if_weekend など) 用であり、地域固有のルール用ではありません。ルールを正確に守らなくても機能するというのはちょっとややこしいと思いますが、今年の夏の次のリリースでは (うまくいけば) すぐに変更される予定です。

したがって、11 月の us.yaml では次のようになります。

11: 
- name: Thanksgiving
  week: 4
  regions: [us]
  wday: 4
- name: Day after Thanksgiving
  function: day_after_thanksgiving(year)
  regions: [us]

同じファイル (少なくともマスター バージョンでは us_inauguration_day が定義されている場所) 内のメソッドの下では、次のようにする必要があります。

methods:
us_inauguration_day: |
# January 20, every fourth year, following Presidential election
   def self.us_inauguration_day(year)
     year % 4 == 1 ? 20 : nil
   end
day_after_thanksgiving: |
  def self.day_after_thanksgiving(year)
    Date.civil(year,11,Date.calculate_mday(year,11,:fourth,:thursday)+1)
  end

次に、rake defs:build_all を実行します (新しいリージョン ファイルを追加するときに rake defs:manifest を実行します)。テストと一致するようにコピーをプルしましたが、参考として:

tests: |
  {  Date.civil(2008,11,27) => 'Thanksgiving',
     Date.civil(2008,11,28) => 'Day after Thanksgiving'}.each do |date, name|
       assert_equal name, (Holidays.on(date, :us)[0] || {})[:name]
     end
于 2013-05-16T17:51:29.237 に答える