感恩节后如何写一个功能?假日宝石,YAML文件

时间:2013-05-14 17:53:48

标签: ruby-on-rails-3.2 yaml

我正在编写一个通过日期范围跟踪休假的应用,我的部分计算确保排除周末和假日。为了跟踪假期,我正在使用假日宝石(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月在星期五开始,所以现在它说的是感恩节后的第二天是它实际上是一周。我试着看看所有其他假期的语法,看看是否有一个假期发生在浮动假期后的一天,但我找不到一个(我发现最接近的是耶稣受难节到复活节) ,但复活节有它自己独立的方法)。关于如何为此编写函数的任何想法?

如果您需要更多信息,请与我们联系!

2 个答案:

答案 0 :(得分:2)

感恩节是11月的第4个星期四,所以第二天是+1。 Date.calculate_mday由假日宝石添加。

lib / holidays.rb中的

def self.day_after_thanksgiving(year)
  Date.civil(year,11,Date.calculate_mday(year,11,:fourth,:thursday)+1)
end
data / us.yaml中的

将假期更改为:

 - name: Day after Thanksgiving
    function: day_after_thanksgiving(year)
    regions: [us]

确保您已安装珠宝商

 rake defs:build_all

然后运行测试:[test_full_week已经破了]

 rake

然后重建你的宝石。

注意: 将感恩节定义为方法可能更有意义,然后在yaml文件中使用函数进行定义,并在星期五之后使用感恩节+ 1。

答案 1 :(得分:2)

Shawn的回答大多是正确的,但实际上你应该在原始文件中放置特定于区域的方法。这个想法是,你不应该触摸.rb文件来制作新的定义,只需要.yaml文件。 lib / holidays.rb实际上适用于通用代码规则(如to_weekday_if_weekend等),而不适用于特定于某个区域的规则。我知道,即使你没有完全遵守规则,它仍然有用,但即将发布的新版本(希望如今)将很快改变。

所以在us.yaml 11月应该是:

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