📅

自分自身を半自動的に更新し続ける祝日ライブラリ

2021/08/23に公開2

概要

国民の祝日のリストを管理するライブラリを作ると、国が祝日のリストを更新するたびにライブラリのリストを修正する必要が出てきてしまいます。国は祝日のリストを更新したらライブラリに Pull Request すべきなのです(ぐるぐる目)。

そんなわけで、国民の祝日のリストが更新されたら自動的に自分自身に PR を送って自分自身を半自動的に更新する祝日ライブラリを作成しました。

https://github.com/ikawaha/holiday

祝日について

「国民の祝日」に関する事務は大臣官房総務課で所掌していらっしゃるとのことで、「国民の祝日」について のページにいつが祝日になるのかがお知らせされています。

祝日は大抵は規則的に決定されている(成人式は1月の第2月曜日 etc.)ので、大抵はプログラムで判定できるわけですが、今年のようにオリンピックの開催にともなって祝日が移動されたりすると、もはやお手上げです。祝日のリストが必要そうです。

祝日のリストは上記のページに 昭和30年(1955年)から令和4年(2022年)国民の祝日(csv形式:19KB) アップロードされています。もし、変更があればこの csv ファイルが更新されると踏んで、こいつを watch して変更があれば差分を PR するようにしていきます。 この仮定は少々強すぎるのかも・・・という不安はある

祝日のリスト

うれしいことに祝日のリストは csv 形式です。ただし文字コードは SJIS です。これをダウンロードして json にしてリポジトリに置いておくことにします。csv の日付の形式は 2006/1/2 なので、2006/01/02 形式に変換して保持することにします。

Go 1.16 からは embed でアセットをライブラリに含めることが出来るようになっているので、この json ファイルを埋め込んでおいて、init() で map に入れ直します。キーは日付で、値は祝日名です(元旦とか)。ライブラリ内でリストが必要なときはこの map を利用します。また、map を外部に公開しているのでそのまま利用してもいいです。

リストが更新されていたら Pull Request する

https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv を watch しておいて、もし更新があれば PR を作成するようにします。月に1度チェックすれば十分だと思うので、Github Actions で cron を仕掛けておきます。

差分があったときだけ PR を作成したいわけですが、PR の作成は hub コマンドでやります。

      - name: Create pull request
        run: |
          git config --local user.email "ikawaha@users.noreply.github.com"
          git config --local user.name "ikawaha"
          DATE=`date +"%Y%m%d"`
          BRANCH="update_$DATE"
          git add holidays.json
          git diff --cached --quiet || (\
              git switch -c $BRANCH &&\
              git commit -m "Update holidays" &&\
              git push origin $BRANCH &&\
              hub pull-request -b main -m "Update holidays")
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

これで、差分があったら hub コマンドで main ブランチに向けて PR を作成してくれます。hub pull-request は PR を作成してくれるだけなので、更新のためのブランチは先に push しておかないといけないです(hub pull-request-pオプションがあるのでもしかしたらもう少しうまくやれるのかも・・・)。

差分があれば PR が来るので、一応確認してマージすれば更新完了です。下記は擬似的に差分を作ったときの PR:

https://github.com/ikawaha/holiday/pull/2

おわりに

作っておいて何ですが、内閣府が祝日のリストを更新するときに、違う URI で更新してきたら何の役にも立ちません。きっとこの csv が更新されるだろうという期待の元に祝日が更新されるのを待ちます。まぁファイルが削除されていれば Github Actions がコケるので、何らかは分かるだろうという期待をしております。

内閣府からの PR をお待ちしています 😇。

Happy hacking!

Discussion

SpiegelSpiegel

私は国立天文台の iCal データから拾っています。以下は昨年末に急遽祝休日を変更しやがったときの記事です。

https://zenn.dev/spiegel/articles/20201205-koyomi

祝日を含む暦を発表(通常は毎年2月1日に翌年の暦が官報で公表)するのは国立天文台の仕事なので,ここから取得するのが一番正確です。

ikawahaikawaha

これは有益情報!ありがとうございます。なるほど国立天文台のデータを使えばいいのかー
というか koyomi ライブラリ使えばよいのだな ╭( ・ㅂ・)و ̑̑ グッ !