mmyoji's diary

プログラミングとか日々のどうでもいいこととか

日報をrake task化(大したことない)

今働いている会社では、日報が義務付け(?)られています。(?としたのは遵守されているわけではないため)

毎日日報を *.md とか *.org で作っておき、slackの特定channelにコピペしているのがなんか嫌になったので slack-notifier 使ってコマンドラインからズビャっとできなかなと思って仕事前にちょこっと作業したお話です。

やったこと

  • 特定のフォルダに作成されている日報をSlackに送るクラス作成
  • それを実行するrake task作成

以上です。

日報クラス

事前に投稿したいslack teamのwebhook urlを取得するようにしてください。

Incoming Webhooks っていうIntegrationを追加すればURLも付いてくるはずです。(2015/07/21現在)

$ cd /path/to/workspace

$ bundle init

$ echo "gem 'slack-notifier'" >> Gemfile

$ emacs daily_report.rb

クラス

require "slack-notifier"

class DailyReport
  WEBHOOK_URI = "https://hooks.slack.com/services/fsdafasfasljfdf/faskfjlsadkfaslfkas"
  CHANNEL = "#random"
  USERNAME = "mmyoji"
  ICON_URL = "https://fasflfdasfsdfl/cicfdsosfs/mmyoji-icon.png"

  attr_reader :notifier

  def initialize
    @notifier = Slack::Notifier.new(WEBHOOK_URI, default_config)
  end

  def send
    fail unless reportable?
    notifier.ping(report_content, icon_url: ICON_URL)
  end

  private

  def default_config
    {
      channel: CHANNEL,
      username: USERNAME
    }
  end

  # もし他に条件つけたくなった時用に書いてるだけです
  def reportable?
    File.exist?(report_path)
  end

  # ファイルなければここで例外起きるので
  # #reportable? はなくて大丈夫です
  def report_content
    File.read(report_path)
  end

  def report_path
    "#{ENV['HOME']}/Documents/daily-reports/#{today}.org"
  end

  def today
    DateTime.now.strftime("%Y/%m/%d")
  end
end

notifierping してるだけで全然大したことしてないです。めんどくさかったので *.org ファイルしか許可してません。適宜 *.md なり *.txt なりに変更するのもありでしょう。

iconとかchannelは適当に設定していいかと思います。

rake task用意

毎回このファイルがあるところにcdするのもなぁと思って、「じゃあshellで関数書く??」とか考えたんですが、「globalにrake task定義できたらよくね?」ってなって調べたらやっぱりありました。

Rake: Global Tasks :: Envy

というわけでこれから全部rubyで書ける、嬉しい。

$ mkdir ~/.rake

# .rb とかしちゃわないように。ファイル名はなんでもいいです。
$ emacs ~/.rake/report.rake

rakeファイル

task :hello do
  puts "Hello, World!"
end

task :report do
  # これなんとかしたい...
  file_path = "#{ENV['HOME']}/dev/ruby/daily_report.rb"
  require file_path

  reporter = DailyReport.new
  reporter.send
end

一応 :hello で確認

$ rake -g hello
Hello, World!!

よいですね。

class作るだけ満足するかなって思ったんですが、globalなrake taskが思わぬ収穫でした。一層ruby離れができなくなりましたが...笑