なんか書いていこうぜー .com

Let's write something good

active_decorator の spec でハマった話

2015-07-30
  • Share on Facebook
  • Tweet
  • Add to Pocket

今日、app/modelsに配置されているただの class で表示用のメソッドがごにょごにょ生えているのを ActiveDecorator に移動させてはどうかと指摘をいただいたので、移動させた。 spec が 1 件だけあったので、これも Decorator のテストに書き換えようとして、ハマった。

まとめ(先に)

  • Thank you, @flada_auxv san!
  • ActiveDecorator のテストをするとき、Controllerインスタンスから view_context を生成すると思うけど、ApplicationControlle#request を設定しておくと、URL使うテストでハマらない。

コード例と現象

まずは、例とするコード(若干適当なところが…)

class GroupSummary
  def initialize(group, total_count, failure_count)
    @group         = group
    @total_count   = total_count.to_i
    @failure_count = failure_count.to_i
  end
end

module GroupSummaryDecorator
  # NOTE これがポイント
  def summary_url
    group_summary_url(@group)
  end

  # こいつらはテストしても期待通りに動く
  def success_count
    @total_count - @failure_count
  end
end

describe GroupSummaryDecorator do
  let(:group) { FactoryGirl.create(:group) }
  let(:group_summary) { GroupSummary.new(group, 0, 0) }

  before do
    ActiveDecorator::ViewContext.push ApplicationController.new.view_context
  end

  after do
    ActiveDecorator::ViewContext.pop
  end

  describe '#summary_url' do
    before do
      ActiveDecorator::Decorator.instance.decorate group_summary
    end

    specify do
      expect(group_summary.summary_url).to eq 'http://localhost:3000/groups/1000'
    end
  end
end

bundle exec rspec spec/decorators/group_summary_decorator_spec.rb
# => NoMethodError: undefined method `group_summary_url` for #<GroupSummary:0x00000000>

ActiveDecorator::ViewContext に ApplicationController インスタンスの view_context を push しているにもかかわらず NoMethodError が出る。 Decorator のメソッドはみつかっているものの、その中の url_for なパスがないって言われる。

調べてみた

ググッてみると、以下の記事をみつけた。

Testing Draper decorators with real helpers, including URL helpers.

hoge_path、fuga_url のような Decorator内で url_for なメソッドを使いたい場合は、view_context のレシーバとなる Controller のインスタンスに request を設定しなければならない様子。

これは ActiveDecoratorが、ここで method_missing を利用して view_context にある同メソッドを呼び出すと思うのですが、ここで actionpack/lib/action_controller/metal/url_for.rb で上書きされている url_optionsurl_for で利用しており、その影響で request が空だとうまく URL が作成できないため(らしい)。

ActionDispatch::TestRequest という便利なものが用意されているので、これを ApplicationController#request に代入してやるとうまいこと URL が作られた。

describe GroupSummaryDecorator do
  let(:group) { FactoryGirl.create(:group) }
  let(:group_summary) { GroupSummary.new(group, 0, 0) }

  before do
    controller = ApplicationController.new
    controller.request = ActionDispatch::TestRequest.new

    ActiveDecorator::ViewContext.push controller.view_context
  end
  ------
end

bundle exec rspec spec/decorators/group_summary_decorator_spec.rb
# => passed

※ URL の port がうまく設定されず困っていたが、このTestRequestのリファレンスみると、‘HTTP_HOST’ に対してホスト名とポートをくっつけたものを渡せば反映されるっぽいので、反映したらうまくポートも反映されたのであった。

関西Ruby会議06に参加してLTしてきた

2015-07-12
  • Share on Facebook
  • Tweet
  • Add to Pocket

CFP だして LT 通ったので、夜な夜なせっせこアプリを作っていたのだけれど間に合わず、当日本番までに動くものを用意できなかったので、ハマったところを挙げてスライド作ってみた。

前日最終ということで脳内練習したら時間余ったので、急遽5枚くらい追加したのであるが、ド緊張でスピードが出ず全く到達しなかったemoji-sob

発表時 poltergeist のくだりで、「ポルターガイストのくせに、モノが動かずに(エラーメッセージの)文字列だけが返ってくる」と話したのであるが、この部分はそもそもポルターガイストは何もしていないのに物体が勝手に動いたりする現象なのに、モノが動かないのはポルターガイスト現象って… という意味を掛けた感じだったのであるが、懇親会で会話したところ「めんどくせぇ!」と一蹴されたのであった。

伝わらなかったらしい。emoji-sweat_drops

※スライドにも書いてあるけど、2.0.0 でモノが動くようになっているので安心してご利用ください。emoji-smile

本番で時間が足りなかったので到達してないのであるが、まとめとして「涙の数だけ強くなれるよ…」というのを入れていて、この部分で「アスファルトに咲く花ではないけど」という岡本真夜的な雰囲気を醸し出す枕詞をつける予定だったので、到達しなかったのが非常に残念であった。

さすがにここはわかってもらえたはず…

会自体は平和な雰囲気で進んでいき、基調講演であるMatzのRuby開発の変遷の話や、ささださんのキーワード引数の話、スポンサーLT、CFPから採択された発表、LTなどなど、あっという間に時間が過ぎていった感じがした。

今回の関西Ruby会議は、実装や業務で投入したものの話が多く、非常に勉強になるものが多かったと思った。ささださんの発表でキーワード引数をブロック引数にも使えることを初めて知った。emoji-memo

なんかスライドまとまってた関西Ruby会議06 スライドまとめ #kanrk06のでリンク貼っておきます。

何ヶ月前から準備をしていたスタッフのみなさん、当日スタッフのみなさん、基調講演のMatzとささださん、発表者のみなさん、スポンサー各位、参加者のみなさんお疲れ様でした。ありがとうございましたemoji-bow

※スタッフのみなさんはまだ終わっていないのは存じあげておりますが一旦の区切りとして。

minami.rb最初で最後のLT大会に参加してきた

2015-03-29
  • Share on Facebook
  • Tweet
  • Add to Pocket

minami.rb が終了する というので、最初で最後のLT大会 に LT 申し込んで参加してきました。

雰囲気

終わるとかいう悲観的な雰囲気は一切なく、同窓会的な雰囲気のある感じでした。

特に何も持ってくる必要はない、と言われつつも、みんなおやつを持参してくるのが実に minami.rb っぽい。↑これが全部ではなかった…

参加者は、大阪で開催しているにもかかわらず兵庫、和歌山、神奈川、東京などから来ているという幅広さ。

会場は、糸屋町STUDIO というところで、もともと写真撮影に使うスタジオらしいのだけれども、こういう感じのイベントにも提供をしているんだそうな。

前半戦

一発目の発表者が遅れてくる(後半戦に結局やった)というハプニングが発生しつつ、飛ばして順番に LT をしていくスタイル。今回は 5 分は目安ということで進行していきました。

自分語りや、minami.rb の思い出・成長記録、テックトーク、エバンジェリストの活動報告などなど皆々様思い思いの LT を実施しておりました。

↓ 私の発表はこれ。

前半戦の〆として、辻田さんの LT。 minami.rb の歴史を振り返ってこれまでにやったことなんかを発表されておりました。

酒・飯

後半戦に入る前に、酒・飯です。これも minami.rb らしいところなんですが、日本酒を主として参加者がこんだけ酒持ってきましたemoji-smile (全部は呑みきれませんでしたけどね)

他にも寿司とか、おでん、お手製のオードブル、(酒呑みらしく)漬物 などなど。 (料理もっと撮影しておけばよかったけど、忘れてた。。)

かなりみなさんご歓談しておりまして、後半の開始が遅れておりました。

後半戦

だいぶ酒入ってきたので、ゆるい感じになりつつ、LT を再開。 コミュニティに対する活動報告や、Rails を勉強してつまずいたところの復習、Rails で解決させた悩み、mruby の話や、3 分クッキングまで多種多様の楽しい LT がありました。

↓ 5 分の LT で、3 分間クッキング(例のBGMつき) をやってできたナポリタンを振る舞った跡

ファウンダの一人である、よしださんのモチベーションと学習方法についての LT で後半戦は終了となりました。

後半戦があった後、食べ物、飲み物を胃の中に入れる時間があったので、みんなで食べ飲みしてました。 21 時に会が終了ということで、最後に辻田さんからお言葉をいただいて〆となりました。

最後に、minami.rb を終了する理由について語られて(後日ブログに書くとのこと)、参加者・関係者の皆様に感謝の言葉を述べられて終了となりました。

会場の片付けをした後、出口でメッセージつきのお菓子をいただきましたemoji-exclamation(写真は控えます)

最後に

辻田さん、吉田さん、minami.rb の運営お疲れ様でした!

私含め、たくさんのメンバーが minami.rb に参加して、minami.rb から Ruby, Rails, お酒(w), その他技術やコミュニティに関する刺激を受けたと思います。 minami.rb は終了しますが、活動が止まるお二人ではないと思いますので、今後のご活躍をお祈りしつつ、応援しております。ありがとうございました emoji-bow

DeNAさんの若手の方々とのLT大会でLTした話

2015-03-26
  • Share on Facebook
  • Tweet
  • Add to Pocket

昨日、DeNA さんの若手(1年目の方々)と弊社アジャイル事業部の有志で LT 交流会がありました。

当日の tweet まとめは基調講演を行った @yucao24hours がまとめた こちら

ここで 地域コミュニティのススメ というタイトルで LT しました。

もともと、取りまとめをしていた @takkanm から「コミュニティ」の話をしてほしい、と言われていたので、どうしたものか と考えて、基調講演と内容が被らないように唸りながらひねり出したのがアレです。

また地域 Ruby 会議ススメルおぢさんな感じになっているのですが、そこはご容赦をemoji-bow

資料つくって思ったこと

自分のこれまでを考えたときに、いろいろな地域の地域 Ruby 会議や RubyKaigi、勉強会みたいなイベントに参加してきたけど、 結局は「イベント」というよりは、その場で会ったり、話したりした「人」が印象に残っているなぁ、と思いました。

「つべこべ言わずにコード書け!」と言われると間違いなくそうなんですが、楽しんでそうしたいし、続くかたちでそうしたい。 そんなときに、コミュニティに頼ってもいいんじゃないかと。ライバルや師匠がいたほうが刺激があってよいし、刺激を与える側 になると、反応があったほうが楽しい。

Github みたいなリポジトリを中心にしてテキストのやりとりでも実現できるかもしれないけど、直接会って話したほうが伝わるし、 自分の思っていることも伝えやすいと思います。日常生活でも仕事でも、システム作っていても相手は人なので、人と交流して おくことは重要。全く関係ない人といきなり交流するよりは、同じようなものに興味のある人同士で交流したほうが楽で楽しい じゃないですかemoji-exclamation (休日は低機動型寝たきり二時間サスペンス廃人な私が言うことではないのですが…)

こう書くと、「頼る」だけな感じになってしまうのですが、恩返しというか**「刺激を返す」ことが最も重要**だと思います。

発表の内容はコミュニティ、イベントに頼る内容になってしまっているのですが、コミュニティやイベントが存続し続けるかと いうとそうではないんですよね。イベントが続くのは、参加者からの刺激があるから、主催者が刺激を受けられるから、というのが 大きいと思います。義務感や惰性だけで続けられるほど楽なものじゃないです。「刺激を受ける」側にいるだけじゃなくて、 「刺激を与える」側に回らないと、イベントやコミュティ自体が絶滅してしまう可能性だってあるんですよね。

いつまでもあると思うな、イベントとコミュニティ。続いている間に恩返しができるように、自分が成長できるように頑張らねば ならない、と思ったのでした。

(結局恩返しするために、コード書けよ、という話になるのか…)

http_status_task という gem を作った

2015-03-05
  • Share on Facebook
  • Tweet
  • Add to Pocket

さて、普段の仕事で HTTP status code とその意味が知りたくなったときに Wikipedia なんかをよく検索しにいくので、ローカルで検索できるように Rakeタスクにしてみた。

きっかけ

きっかけは、仕事で状態の更新タイミングによって遷移できない状態に陥った時に、なにかよい status code がないものかと探したことだった。 かねてから gem 作りたいという欲求もあったので、いきなり難易度高いものでなく、地味に役に立つものを作ろうとして着手してみた。

リポジトリは こちら

ハマったところ

以下の2つ。

  1. Rack から status code とその説明が書かれた Hash はすぐにみつけたが、404:not_found を対応付けた定義があるところが見つからなかった。
  2. Rails から使うときには、Rails::Engine を継承しないといけない、というのに気がつくのが遅かった。

1 のほうは、実は status code と説明が書かれた Hash の下に、その Hash から生成して定数にしているところがあったのだが、:not_found とかそういう文字列で検索していたので引っかからなかったのであった。

2 のほうは、意識してなかったというか、Rails 用の gem を作り慣れていないのがもろバレである。なんか似たような gem 探してソースみたらすぐわかったので、助かった。

折角作ったので活用していこうと思うけど、そんなに HTTP status code 直接使う作業って今のところないんだよ…API 作るときには活躍しそうな気がする。 あともうちょっと綺麗にしたい。