Capistranoデプロイ時にwheneverのタスクでinvalid byte sequenceのエラー
Capistranoでのデプロイ時に、デプロイフックでのタスク中で以下のようなエラーが出るようになりました。
DEBUG [67444af4] Command: cd /var/www/onebox/releases/20160426053048 && ( export RBENV_ROOT="/usr/local/rbenv" RBENV_VERSION="2.3.0" ; /usr/local/rbenv/bin/rbenv exec bundle exec whenever --update-crontab onebox_production --set environment=production --roles=web,app,db ) DEBUG [67444af4] /var/www/onebox/shared/bundle/ruby/2.3.0/gems/whenever-0.9.4/lib/whenever/numeric_seconds.rb:12:in `gsub': invalid byte sequence in US-ASCII (ArgumentError)
ふむふむ。どうやらエンコーディングの問題ぽい。とはすぐ思いつくものの試行錯誤しつつ解決せず...。
と悩んでたら以下の記事が解決してくれました。
AWS側で/etc/environment
を以下のように修正してロケール情報を変更します。
LANG=en_US.utf-8 LC_ALL=en_US.utf-8
LANG
とLC_ALL
という環境変数は以下を参考。
一般に、ロケール名は LANG 環境変数で指定します。ロケールカテゴリは LANG に従属しますが、個別に設定することも可能であり、そうした場合には、LANG よりそれらの設定が優先されます。LC_ALL 環境変数を設定すると、その設定が、LANG や個別のどのロケールカテゴリよりも優先されます。
Rubyのencodingは以下の2つの記事がとてもおもしろくて参考になりました。
Rails+Reactにbrowserifyを導入する
react-rails
でReactを導入してるRailsアプリにbrowserifyを導入します!
JSのモダンな環境に関してはめちゃくちゃ素人なので調べた過程で読んでよかった!な記事を順番になるようにメモしておきます。
最初に読みたい記事
最初に読んでおいたらいいなと思った良記事。
browserifyとは
browserifyがどういうものか先ずわからないくらいのフロント音痴なのでまずはそこから調べてこう。
browserifyの公式サイトはこちら。
Browserify lets you require('modules') in the browser by bundling up all of your dependencies.
そして他にもいくつか参考になったサイトから引用を上げさせてもらいます。
Browserifyの使い方について調べてみた - yutaponのブログ
Browserifyをざっくり説明すると、
ブラウザ上でもNode.js用モジュールを使えるようにする ブラウザでもrequire()を使ったモジュール管理を使えるようにする という特徴があるようです。
browser(ブラウザ)+ fy(〜する)という単語からもNode.jsをブラウザ化するってニュアンスでしょうか。
なるほどなるほど。
browserify をはじめてみる - Please Sleep
CommonJS のモジュールの仕組み、つまり Node.js の require をブラウザ上でも使えるようにするもの、ということでいいみたい。Readme を読む限りは、npm にあるモジュールをブラウザ上にもっていくために作られ始めたような印象をうけるが、ちまたのエントリーをみていると AMD に代わりに CommonJS でフロントエンドの依存関係の管理をする (RequireJS ではなく、Node.js 感覚で require 関数をフロントエンドで使う) ためのツールとしても使っていいようだ。
以下のCookpadのtech blogの記事が非常に参考になります。
モダンJavaScript開発環境 on Rails - クックパッド開発者ブログ
ふむふむ。自分はRailsはrailsから外れていくほどつらみが増えていくと認識しているので同じく最後のbrowserify-rails
を使う方針がベターかなと思いました。
フロントエンド開発の3ステップ(npmことはじめ) - Qiita
今までは、javascriptのライブラリを使う際、読み込みのためのhtmlタグを書く必要がありましたが、 browserifyを使うと、javascript上で直接ライブラリを参照することができます。 普通の言語なら当たり前の機能ですが、ブラウザ上では今までできなかった、というわけです。 browserifyを使うと、node_modules内のライブラリを、直接参照することができます。 また、ライブラリ同士の依存も自動で解決されます。 ということは npm installでライブラリを持ってきて、何も考えずにrequireで読み込める ということを意味します。
browserifyでES6使えるようにする
ということでまずはES6を使えるようにしてみます。
以下で紹介されてるサンプルアプリを参考にさせていただきました。
GitHub - hokaccha/browserify-rails-example
このcommitの差分が非常にわかりやすい。。。ありがたい。。。
browserify-rails setting · hokaccha/browserify-rails-example@4587691 · GitHub
ES6についてはとりあえずこれよんどく
Hello, ES6 ~これから迎えるJSのミライ~ - @yoshiko_pg
browserifyとReact Components
babelifyできたら次はReact Componentsを動かせるようにします。以下の記事を参考に設定しました。
Webpay::Mockで決済周りのテストを書く
この記事
とかを参考にしながらWebpayでの決済機能は実現できたものの、テスト書くのどうしよ。。
と悩んでいたところでWebpay::Mockというものを用意してくださってくれていることに気付く。
決済周りの処理のテストを書く方法をメモしておきます。
gemのREADMEと一緒に、以下の記事も参考にさせていただきました。
WebPayテスト環境のオブジェクトを削除するRakeタスク | EasyRamble
今回実装した環境は以下です。
$ bundle exec rails -v 4.2.6 $ cat .ruby-version 2.3.0
準備
まずはgemを追加してインストール。
# Gemfile gem "webpay-mock"
$ bundle
そしたら、rails_helper.rb
でrequireしてconfigも設定します。
# spec/rails_helper.rb # ... require "webpay/mock" # ... RSpec.configure do |config| # ... config.include WebPay::Mock::WebMockWrapper end
テスト実装
ここまでくれば、specファイルで例えば以下のように使用することができます。
let(:params) { { amount: 1000, currency: 'jpy', card: 'tok_xxxxxxxxx', description: 'test charge' } } let!(:response) { webpay_stub(:charges, :create, params: params) } specify { expect(webpay.charge.create(params).id).to eq response['id'] }
他のtest casesはコチラに。