ruby

RustでRubyのgemを書く part2

RustでRubyのgemを書く part1 の続き。 クラスやインスタンス変数を使うメソッドを実装したので、まとめておく。 Rubyで実装したいコードのイメージ module Wasabi class Object def initialize(name) @name = name end attr_reader :name def say "say, #{n…

RustでRubyのgemを書く part1

RubyGems 3.3.11でRust拡張の対応が実験的に入ったので、少し触ってみたメモ。 In particular, it includes experimental supppot for Rust extensions. 引用: https://blog.rubygems.org/2022/04/07/3.3.11-released.html wasabi 2019年に鹿児島Ruby会議01…

RailsアプリをRBS + Steepで型チェックするまでの手順

rails new してから steep check が通るまでにやってみた作業をまとめておく。 GitHub コードはGitHubで公開しているので、詳細な手順を知りたい方は参照してください。 github.com 手順 gemを入れる steepとrbs_railsをGemfileに追加する。 # Gemfile group…

ディレクトリ構造にあわせてrbsのプロトタイプを生成するシェル

既存のリポジトリでrbsをゼロから書くのは大変なので、とりあえず雑にプロトタイプを生成する方法。 ディレクトリ構造 app 以下のディレクトリ構造にあわせて sig にrbsを置くディレクトリ構成です。 app/models/user.rb sig/app/models/user.rbs シェル fin…

Gemfileに記載してあるgemの説明を一覧で表示する #fjordbootcamp

追記: bundle info でgemの情報を表示できるので、一覧じゃなければコレで十分かも。 $ bundle info rails * rails (6.1.3.2) Summary: Full-stack web application framework. Homepage: https://rubyonrails.org Documentation: https://api.rubyonrails.o…

Rubyをインストールせず Docker だけを使ってrails newを実行する

rails new するときにDockerfileを使う必要は特にない。 むしろ開発時に使うDockerfileとは別物になるので、Dockerfileを作らない方が良いです。 コマンド $ mkdir example_app $ cd example_app $ docker run --rm -v $(pwd):/app -w /app ruby:3.0.0 bash …

CIでRailsのmasterブランチを使ってテストを実行する

Rails edgeでCIを動かしたい酔狂な人向けに記事を書いておく。 Rails edgeのGemfileを用意する # gemfiles/rails_61.gemfile eval_gemfile File.expand_path('../Gemfile', __dir__) dependencies.delete_if { |d| d.name == 'rails' } gem 'rails', github:…

gemでVERSION定数が定義されていない場合にgemのバージョンを取得する方法

ときどきVERSIONの定義されていないgemに遭遇するので、備忘録として書いておく。 VERSION の無いgem いくつかのパターンがある。 gemspecで文字列を直接指定しているケース database_rewinder.gemspec VERSION は定義してあるのに require されていないケー…

るりまの開発環境をDockerで作ってみた

はじめに あとはVSCodeなどでコンテナにアクセスするなどして編集すればOKそうです(もしくはvimとか入れてコンテナ内で編集するとか) gamelinks007.hatenablog.com この記事を読んで「ホスト側で編集するようにできそう」と思ったので、試しに開発環境を作っ…

別のディレクトリにある Gemfile をsystemメソッドで "bundle check" する

タイトルの通りなのですが、普通にやると意図した動きしなかったのでメモ。 具体的な例 factory_bot が分かりやすいです。 ルートディレクトリに Gemfile.lock がある ルートディレクトリで bundle install はしてある ルートディレクトリから gemfiles/6.0.…

銀座Railsで「Railsアプリの設計」というタイトルで発表しました #ginzarails

12/13(金)にあった銀座Rails#16で登壇しました。 スライド speakerdeck.com 話したかったこと 1〜3年目のRailsエンジニアに参考になる話がしたい 7年やって私が覚えたことは、たぶん何かしら参考になるだろう 来週の仕事ですぐ参考になる話がしたかった 懇親…

ActiveRecord::Base.unscope の呼び出しでネストが深くなっているのを浅くする

仕事で見かけたコードを汎用化した内容にして、個人ブログにメモっておく。*1 多段ネストを reverse して Proc でラップしたり、それを RSpec で検証する方法はブログ書いてないと忘れる自信がある。 モデルの定義 class User < ApplicationRecord default_s…

2019年11月現在のRailsのissueに関するメモ #heiseirb

平成.rb #10 でRailsのissueに取り組むきっかけが分からない人向けのメモです。 個人的に気になっているissueについて簡単にまとめました。 注意)特に初心者向けとかではありません。 STI と has_secure_password の組合せで、親クラスでvalidationsを切り…

Railsアプリの開発環境を速くするための調査 その1 - gemの読み込み時間

その1って書いたけど、続くかは不明。 今回は使っているgemの読み込み時間を測ってみた。 Benchmark を仕込む config/application.rb でgemを読み込む前に Kernel.require を上書きして、計測する。 +require 'benchmark' +$result = {} +Kernel.singleton_c…

Rails の issue を解決するまでの手順とOSS初心者でもできること

突然ですが、あなたはRailsのissueとプルリクがいくつあるかご存知でしょうか? 2019年10月17日現在、それぞれ issue 384 / PR 803 になります。 多いですよね...。 個人的に、最近このissueを減らすのを少しでも手伝えないものかとissueにコメントしてみた…

ActiveDecoratorにプルリクを投げるまでにやったこと

怪しい挙動を見つけたきっかけ テストコードで以下のようなことをしてました。 Rails.application.eager_load! testでもproductionと同じ環境になるように事前に読み込んでいたのですが、テストを個別に実行するときにも全ファイルを読み込んでしまうため消…

ActiveRecordのissueで再現コードを書くときに発行されたSQLを確認する方法

rails/rails#36895 の挙動を確認してみようかなーと思ったけど、発行されるSQLを確認する方法が分からなかったので調べた。 Rails本体のテストコードだと assert_no_queries が使えるけど、これは外で使えないので。 動いたコード assert_no_queriesの定義さ…

Railsのissueに書いてある再現コードを使ってgit bisectする方法

備忘録。 具体的な例 先日に登録されたissueを例にしてみる。 github.com 再現コードを少し書き換える v5.2.3と6.0.0.rc2でsqlite3の依存周りでエラーが出たので、Gemfileのあたりを少しだけ弄った。 # frozen_string_literal: true require "bundler/inline…

minitestで書かれたActiveRecordのテストで特定のケースだけを実行する方法

追記: activerecord/RUNNING_UNIT_TESTS に書いてあった。 自分用の備忘録。 特定のファイルを実行する方法 $ cd activerecord $ ARCONN=postgresql ruby \ -I"lib:test" \ test/cases/adapters/postgresql/range_test.rb 特定のテストケースを実行する方法 …

ActiveRecordでRails.cacheを良い感じに使うgemを作った

作ったgemはこれです。 github.com 使い方 ApplicationRecord でモジュールを include してください。 class ApplicationRecord < ActiveRecord::Base include ActiveRecordInCache::Methods self.abstract_class = true end 自動的に maximum(:updated_at) …

表参道.rb #47 〜API〜で共有した知見 #omotesandorb

LTする方が少なかったので、自分がやってる知見的な事を紹介するためのブログ。 API ドキュメント OpenAPIで書いています。 初めて聞いた人向けの説明 Swagger Editorで書くと、 Swagger UIみたいな見た目のドキュメントが作れる。 ファイルの置き場所 #{Rai…

RubyVM::AbstractSyntaxTree.ofをevalやirbで動かすために調べたこと

調査結果を書いただけで、あまり良い解決方法は見つけられていない・・・。 調べたきっかけ RubyKaigi 2019でRubyVM::AbstractSyntaxTree.ofメソッドを 悪用 活用している方々の発表を聞いて、自分でも試してみようとirbでメソッドを使ったら、無慈悲にもエ…

RailsアプリでElasticsearchを扱うならchewyがおすすめ

Twitterでツイートしたり、表参道.rbの懇親会では紹介していたけど、ブログに書いていなかったので今更ながらまとめておきます。 github.com Chewyの利点 READMEを一通り読んでもらうと 最高に便利なのが分かる とは思うのですが、それだと身も蓋もないので…

「privateメソッドのテストについての考え方」を読んで #yochiyochirb

highwide.hatenablog.com を読んで、「自分なら設計を変えて、publicにしてからテストを書くなー」と思ったので、考え方・直し方の一例としてブログを書く。 元の設計 元記事のスライドの途中に出てくるコードはこんな感じで、バッチ処理などでよくある設計…

Railsアプリでrakeタスクのログを見やすくする

rakeタスクのログを調べやすくするために、ActiveSupport::TaggedLoggingを使って読みやすくする方法のメモ。 # lib/rake_logger_rails.rb module RakeLoggerRails # rakeタスクでログを出力するとき、自動的にタグ付けを行います。 # # task foo: :environm…

rubyのflat_mapをちゃんと理解した

2019年の最初だし、ブログでも書いてみようという試み。 事の発端のツイート コード読んでいて違和感あるけど、修正しなくても動いている場合のレビューが難しい。例えば、無駄なメソッド呼び出しとか。def foo(x) a = x.flat_map(&:bar) (a + [1]).flattene…

「現場で使えるRuby on Rails5速習実践ガイド」の感想 #現場rails

なかなか読む時間が取れなくて積み本になっていたのを週末に読んだので、その感想です。 現場で使える Ruby on Rails 5速習実践ガイド(特典PDF付き)作者: 大場寧子,松本拓也,櫻井達生,小田井優,大塚隆弘,依光奏江,銭神裕宜,小芝美由紀出版社/メーカー: マイ…

表参道.rb で「毎日gemをアップグレードする生活」のタイトルでLTした #omotesandorb

omotesandorb.connpass.com 忙しくて2ヶ月くらい表参道.rbに行けてなかったけど、今回は参加できた。 今回の会場は外苑前の株式会社ビジネスバンクグループさんで、懇親会の時に軽食の提供があった。 ありがとうございます。 LT資料 毎日gemをアップグレード…

Hash#key? を上書きしてもキーワード引数は上書きできない

Ruby のしくみに面白いコードが書かれていました。 class Hash def key?(val) puts "Looking for key #{val}" false end end def add_two(a: 2, b: 3) a+b end puts add_two(a: 1, b: 1) # Looking for key a # Looking for key b # 5 キーワード引数は内部…

Rubyのdefの後に何を書けるか調べる実験

実務では一切の役に立たないRuby雑学。 普通のdef まずは基本の書き方。 def foo puts "hello" end foo #=> "hello" class User def self.foo puts "foo" end class << self def bar puts "bar" end end end User.foo #=> "foo" User.bar #=> "bar" 特異クラ…