コピペコードで快適生活

明日使えるソースを自分のために

Ruby

RSpecで既存のクラスをモックに差し替える

本来はDependencyInjectionでやるべきかもだけど。 そうもいかないケースもあるわけで。 # 既存クラス let(:api_client) { ::MyApp::ApiClient } let(:api_response) { double('api_response', status: 200) } # post_xxxメソッドを上書きして、api_response…

RailsEngineを作る手順メモ

RailsEngineを作る手順を雑にメモする。 Docker/Rspecを使う前提。 docker設定 Dockerfile FROM ruby:2.6.6 ENV NODE_VERSION 10.12.0 ENV BUNDLER_VERSION 1.17.3 ENV LANG C.UTF-8 # https://stackoverflow.com/questions/55361762/apt-get-update-fails-w…

Rspecでcontrollerのテスト

controllerのテストをまともに書いたことなかったので。 describe TestController, type: :controller do let(:account) { create(:account) } describe 'auth' do context '有効なトークンを渡したとき' do before do token = TokenService.build_token(acc…

RSpecで例外チェック

これまでbegin-rescueで愚直にやってたので、もう少しシュッとした書き方を。 require 'spec_helper' describe TokenService do describe :validate! do context '改ざんしたトークンを渡す' do # 処理を定義 subject { token = TokenService.build_token To…

RSpecのmockの使い方

APIクライアントを外から注入できるようにして、 モックを渡してローカル環境単体でテストできようにした例。 require 'spec_helper' class DummyService # # APIクライアントを外から指定できるようにして # 単体でテストできるようにする # def self.get_i…

RSpecのletの使い方 - before&インスタンス変数使うやり方との比較

ずっとbefore&インスタンス変数でやってたので、let使うやり方をメモしておく。 require 'spec_helper' describe 'beforeとletの違いについて' do context 'インスタンス変数を使う場合' do before do @account = create(:account) end it 'アカウントが存…

RubyのワンライナーHTTPサーバ

さくっとアクセス確認したいときなどに。 ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 80).start'

Grape+Rspec環境でAPIをテストする

既存RailsアプリにRspecを入れる - コピペコードで快適生活 の続き。まず、JSONのテストを簡単にするgemを入れる。 gem 'json_expressions' テストコードはこんな感じで書ける。 require 'rails_helper' require 'json_expressions/rspec' describe "GET api…

capistranoでデプロイされているブランチのコミットハッシュを確認する

cat ${PATH}/repo/refs/heads/${BRANCH}

sidekiqをGracefulShutdownする

# >= 5.0.0 kill -TSTP [worker_pid] # < 5.0.0 kill -USR1 [worker_pid] # すると、 # 該当のworkerにキューが入らなくなる。 # psコマンドでみたときに stopping がつく。 sidekiq 4.2.10 app_name [0 of 8 busy] stopping # busyが0になったら、-TERM送っ…

RspecでSQLやRailsのログを出力したい

こんな感じで # spec/rails_helper.rb # 略 Rails.logger = Logger.new(STDOUT) # Rails.loggerを出す ActiveRecord::Base.logger = Logger.new(STDOUT) # SQLログ出す RSpec.configure do |config| # 略 end ※STDOUTは組み込み変数 STDOUT.puts "hogehoge" …

geminaboxにgem登録する手順メモ

# 準備 gem install geminabox --no-ri --no-doc # Gemを作る gem build -V ***.gemspec mv ***-0.1.0.gem pkg/. # アップロードする gem inabox ./pkg/***-0.1.0.gem --host http://example.com

ActiveRecord::Base.transactionで並列で同じレコードを扱ったときの動きメモ

排他制御まわりがちゃんとわかっていなかったので整理。 Article.find(1).value # => 1 def inc row = Article.find(1) row.value = row.value + 1 row.save end # 同時並行処理する Thread.new { inc } Thread.new { inc } Article.find(1).value # => 2に…

RubyのThreadメモ

まずは超簡単なところから。 n = 1 # この記述に至った時点で非同期で実行開始される t1 = Thread.new do puts "t1 start" puts "t1 n is #{n}" n = 2 sleep 5 puts "t1 end" end t2 = Thread.new do puts "t2 start" sleep 5 puts "t2 n is #{n}" # => 2 ス…

ActiveSupport::CallbacksでRubyクラスにコールバックを差し込む

ActiveRecordじゃなくてもコールバックは使えるんやで。 class Article include ActiveSupport::Callbacks define_callbacks :before_submit set_callback :before_submit, :before, :validation def validation puts 'Check!!!' end def submit puts 'Submi…

class_evalを使って、classに自由な名前でメソッドを追加

concernに書くとこんな感じか。 # # include ::Logica::DateRangeSearchable # date_range_name_is :validity, :valid # # klass.valid # -> validity_start_at, validity_end_atが期間内のみ取り出す # instance.valid? # -> validity_start_at, validity_e…

Rubyでたまにしか使わないけど便利なメソッドメモ

備忘のため。随時追加していく。 Ruby # フィールドをもつモックオブジェクトを作る Struct.new(:name, :tel).new('hogeo', '090xxxxxxxx') # => #<struct name="hogeo", tel="090xxxxxxxx"> # irbでeach回して処理した後、そのリストを出力させたくない list.each do |row| # 何かしらの処理 end; 0 </struct>…

prependでクラスメソッドを拡張する

singleton_classにprependすればOK。 class Hoge def self.hogehoge(*args) puts 'hogehoge' end end Hoge.hogehoge # => hogehoge Hoge.singleton_class.prepend Module.new { def hogehoge(*args) super(*args) puts 'extended hogehoge' end } Hoge.hogeh…

sidekiq-unique-jobsのunique値ごとの挙動

ちょっと古いけど、sidekiq-unique-jobs v4.0.8のunique値ごとの挙動を確認したのでメモしておく。GitHub - mhenrixon/sidekiq-unique-jobs at v4.0.8 while_executing 同じargsは実行中にならない。 同じargsを実行しようとしたらworkerは待ちになる。後続…

RailsConsoleでSidekiqジョブの状況を見る

運用していると状況確認したいときがあるのでメモ。 ## 実行中ジョブ Sidekiq::Workers.new.each do |process_id, thread_id, job| puts "#{process_id}, #{thread_id}, #{job}" end ## 待ち状態のジョブ Sidekiq::Queue.new("#{QUEUE_NAME}").each do |job|…

ActiveRecordで固定の日時最小値チェックのバリデーションを入れる

# # app/models/concerns/my_app/extend_validation.rb # 複数のフィールドに対して一括でバリデーション設定できるようにするために # バリデーションメソッドを追加するモジュール # module MyApp module ExtendValidation extend ActiveSupport::Concern …

cancancanでActiveRecord::RecordNotFoundを出したくないときのパッチ

module MyApp module CanCan module ControllerResourcePatch def find_resource # もともと定義してあるfind_resourceを呼び出す super rescue ActiveRecord::RecordNotFound => e # エラーさせたくないので握りつぶす end end end end CanCan::ControllerR…

RubyのGrapeメモ

たまにしか使わなくて、よく忘れている書き方をメモ。 随時追加していく。 params :example # enumの値のみ許可 optional :status, { type: String, allow_blank: true, values: User.statuses.keys } }

Rubyのinclude,extend,prepend,Concernの使い方メモ

なんとなく理解が怪しかったので復習をかねて。 includeだけでクラスメソッドとインスタンスメソッドを同時に追加する module MyModule def self.included(base) base.extend(ClassMethods) end module ClassMethods def hogehoge puts 'hogehoge!' end end …

Rubyで外からプライベート変数にアクセスする

# プライベート変数の定義状況を確認する obj.instance_variable_defined?('@raw') # プライベート変数にアクセス obj.instance_variable_get('@raw')

ffiのインストールで失敗する時

こんなエラー An error occurred while installing ffi (1.9.21), and Bundler cannot continue. Make sure that `gem install ffi -v '1.9.21'` succeeds before bundling.ライブラリがないっぽいので sudo yum install ruby-devel libffi-develすればOKだ…

CarrierWaveで既にアップロード済のファイルに新しいバージョンをあてる

User.all.each do |user| if user.avatar_file.present? user.avatar_file.recreate_versions! user.save end end

Rubyで名詞の単数形・複数形を変換する

たまにやりたくなる。いつもメソッド名忘れているけど。 require 'active_support' 'user'.pluralize # => users 'users'.singularize # => user

Rubyでメソッドの定義場所を確認する

gem pry を使うと、$で簡単に確認できる $ "".present? # From: /home/kinosuke/app/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7/lib/active_support/core_ext/object/blank.rb @ line 23: # Owner: Object # Visibility: public # Number of lines:…

RailsConsoleでサクッとメール送信

本番環境でメール送信チェックとかするとき用に。 ActionMailer::Base.mail(to: "test@example.com", from: "test@example.com", subject: "題名", body: "本文").deliver