pockestrap

Programmer's memo

RuboCop

正規表現でかんたんにCopを書けるRuboCop拡張 rubocop-grep をリリースしました

こんにちは。正規表現でかんたんにCopを書けるRuboCop拡張を作ってみたので紹介します。 github.com 使い方 まず、ほかのRuboCop拡張と同様にgemをインストールし、.rubocop.ymlのrequireにこのgemを指定してください。 この拡張は設定をしないと何も動きま…

Rails 7で導入される invert_where メソッドが危険そうだったので調べた

この記事は現時点(2021-04-28)のrails/railsのmainブランチの最新のコミットでテストしています。 TL;DR invert_whereはすべてのwhereをinvertする 使い方によっては意図しない条件をinvertして危険 invert_whereとは invert_whereは、Rails 7でActiveRecord…

Gemfileでバージョン指定している時にコメントを強制するRuboCopの設定

TL;DR Bundler/GemComment: Enabled: true OnlyFor: - git - github - version_specifiers 目的 私はGemfileではなるべくバージョンを指定せず、bundle updateによって常に最新のgemが使われることを意識しています。 # Gemfile # bad gem 'rubocop', '0.93.…

Action Mailerのpreview機能を使って、Railsアプリケーションから送るメールを一覧するページを作った

ある時「アプリケーションがどういうタイミングでどういうメールを送るか、エンジニア以外も把握したい」という要望が社内で上がりました。 これはもっともな要望で、アプリケーションがどういうメールを送っているのか分からずユーザーサポートするのはしん…

Rails/UniqueValidationWithoutIndex copを追加した

rubocop-rails にRails/UniqueValidationWithoutIndex copを追加しました。 rubocop-railsの次期リリース(おそらくv2.5.0)から利用できます。 github.com これはなに Rails/UniqueValidationWithoutIndex copは、RDBMSのunique indexがついていないカラムに…

rubocop-rubycwとは

github.com TL;DR ruby -cw をRuboCopのインターフェイスで扱うためのgem ruby -cwとは rubyのコマンドラインオプション。 -cを付けると、Rubyはコードを実行せず、構文のチェックのみを行う。 -c check syntax only -wを付けると、Rubyは見つけた警告をすべ…

平成Ruby会議01 で、Regression test for RuboCopというタイトルで発表しました。

heiseirb.github.io Proposalはこちら pocke.hatenablog.com ついつい本番だと早口になってしまうので、3分ぐらい余らせてしまった。余った時用のコンテンツを用意しておくのが良いのかなあ。 knuさんとkoicさんの発表がそれぞれOSSのいい話という感じで良か…

平成Ruby会議01 CfP

この記事はCfPアドベントカレンダー1日目の記事です。 adventar.org heiseirb.github.io このトークはacceptされました。12月14日に話します。 発表タイトル(※本情報は当選時にLPに掲載されます) Regression Test for RuboCop 発表の概要(※本情報は審査にの…

RuboCopで型情報を利用した解析を試している

3行 RuboCopで「この変数はString」とかの情報を含めて解析させられないか試している まだPoCだけど、なんとなくは動いている https://github.com/pocke/rubocop-typed を見て 何をしているの rubocop-typed というプロジェクトで、RuboCopで今までできてい…

RuboCop Rake をリリースしました

github.com これはなに RuboCop Rakeは、Rake関連のファイルに対してのCopを集めたRuboCopプラグインです。 実はリリースは少し前からしていたのですが、晴れてRuboCop HQ下に移動した1のでリリース記事を書いてみました。 Cops 現在、RuboCop Rakeは3つのCo…

RuboCopのカスタムCop gemを作るためのジェネレータを作った

github.com これはなに RuboCopのカスタムCop gemを作るためのジェネレータです。 rubocop-rspecなどのgemを作る時のひな型を生成します。 使い方 まず、gem installします。 $ gem install custom_cops_generator そして、custom_cops_generatorコマンドを…

Naming/RescuedExceptionsVariableName copが壊れていたから直した

github.com Naming/RescuedExceptionsVariableNameとは rubocop.readthedocs.io RuboCopのCopで、rescue節で例外をキャプチャした時の変数名を統一するためのCop。 デフォルトではeに統一される。1 例 # good begin rescue StandardError => e end # bad beg…

RuboCopの次のバージョンから、.rubocop.ymlの重複エントリが警告されます

RuboCopの次のバージョンから、.rubocop.ymlの重複エントリが警告されます。Pull Requestはこちら。 github.com Problem RuboCopでは、.rubocop.ymlに重複したエントリがあることが原因であるIssueが度々上がってきていました。 例えば#6728などです。これは…

rubocop-rspecでもCop Generatorが動くようにした

github.com github.com TL;DR rubocop-rspecにCopを追加する時も、rake new_cop[RSpec/NewCopName]でCopの雛形を作ることができるようになった。 Cop Generatorとは RuboCopにはrake new_cop[Style/FooBar]などとすると新規Copのテンプレートを作れてしまう…

WEB+DB PRESS vol.102からRubyの連載を担当します

こんにちは。id:Pockeです。 12月23日1に発売されるWEB+DB PRESSのVol.102から、Rubyの連載2を担当いたします。 何を書くのか Rubyの連載ということで、もちろんRubyの記事を書きます。 Rubyを使う上での基礎となる技術について書いていきたいと思っています…

RuboCop 0.52.0 のCHANGELOGを読む

RuboCop のバージョン 0.52.0 がリリースされました。 https://github.com/bbatsov/rubocop/releases/tag/v0.52.0 めんどいので駆け足で。 TL;DR 追加されたCop Style/StringHashKeys Style/RandomWithOffset Lint/ShadowedArgument Lint/MissingCopEnableDi…

`Style/EmptyBlockParameter`(と`Style/EmptyLambdaParameter`)を作った

github.com Style/EmptyBlockParameterとStyle/EmptyLambdaParameterというRuboCopのCopをだいぶ前に追加した。後者はおまけ なにこれ Rubyでは、ブロック引数が存在しない場合でもバー(|)を書くことが出来る。 foo.do_something do foobar end # 上の式とこ…

Style/EvalWithLocation Copを作った

github.com github.com rubocop-jpのissuesにあげたものを、実装してみました。 このCopが対象とする問題 eval族1のメソッドには、コードの位置情報を渡すことが出来ます。 この位置情報は主に例外が上がった際のバックトレースの表示に役立ちます。 https:/…

rubocop-jp/issues を作った。

vim-jp/issues のパクリです。 https://t.co/V6MpMfF3q7 前々から作りたいと思っていた rubocop-jp を作りました。英語でバグ報告とかつらいよーという人のためのアレです。ついでにそのへんの興味ありそうな人を雑にorgに招待しました— Pocke(ぽっけ) SW-13…

RuboCopのCop数を数える方法

$ rubocop --show-cops | head # Available cops (374) + config for /tmp/tmp.osgxetgoX3: # Department 'Bundler' (3): Bundler/DuplicatedGem: Description: Checks for duplicate gem entries in Gemfile. Enabled: true Include: - "**/Gemfile" - "**/…

RuboCop 0.51.0 のCHANGELOGを読む

RuboCop のバージョン 0.51.0 がリリースされました。 https://github.com/bbatsov/rubocop/releases/tag/v0.51.0 CHANGELOG から変更を見ていこうと思います。 破壊的変更 古い Ruby のサポート終了 https://github.com/bbatsov/rubocop/pull/4789 https://…

RuboCop 0.50.0 のCHANGELOGを読む

RuboCop のバージョン 0.50.0 がリリースされました。 https://github.com/bbatsov/rubocop/releases/tag/v0.50.0 CHANGELOG から変更を見ていこうと思います。 破壊的変更 Naming Department Issue: https://github.com/bbatsov/rubocop/issues/4521 PR: ht…

RubyKaigi 2017 で Lint について話します。

RubyKaigi 2017 で Lint について話します。 rubykaigi.org Lint とは Lint というのは、バグになりうるコードを自動で検出プログラムです。 なにを話すのか Ruby のための Lint を、どう実装するかについて話します。 Lint が検出するコードの例を一つ紹介…

RuboCop-RSpec 1.16.0 の CHANGELOG を読む

RuboCop-RSpec のバージョン 1.16.0 がリリースされました。 https://github.com/backus/rubocop-rspec/releases/tag/v1.16.0 RuboCop-RSpec とは、RSpec 特有の問題を RuboCop で検知するためのプラグインです。 CHANGELOG から、新規追加の Cop を見ていこ…

RuboCop の Collaborator になりました

こんにちは。 RuboCop の Collaborator になりました。Collaborator とは、GitHub でマージボタンを押せる人です。 Promote @pocke to a Core RuboCop developer · bbatsov/rubocop@468835f · GitHub RuboCop とは Ruby のスタイルを検査/修正したり、バグに…

RuboCop の Lint/UnreachableCode を直した

なにそれ RuboCop には Lint/UnreachableCode という便利 Cop がある。 その名の通り、unreachable な code を検出してくれる。 def foo do_something return do_anything # このコードは絶対に実行されない! end 上記のような絶対に実行されないコードをつ…

RuboCop で `#each` がブロックの戻り値を使わないことを思い出せるようにした

問題 以下のようなコードは、恐らくバグになります。 json = users.each do |user| id = user.id full_name = user.full_name { id: id, full_name: full_name, } end render json: json これはidとfull_nameをもったオブジェクトの配列をjsonでrenderするよ…

RuboCop 0.49.0 のCHANGELOGを読む

RuboCop のバージョン 0.49.0 がリリースされました。 https://github.com/bbatsov/rubocop/releases/tag/v0.49.0 CHANGELOG から変更を見ていこうと思います。 破壊的変更 Layout Department PR: https://github.com/bbatsov/rubocop/pull/4278 今回のリリ…

Gem として提供されているコマンドのベンチマーク

github.com 先程、RuboCop にパフォーマンス改善の Pull-Request を投げました。3%ぐらい速くなります。 この Pull-Request の効果を検証する際に用いたベンチマークの方法が、わりと面白くて便利(自画自賛)だったので、紹介します。 そもそもの問題 Gem で…

Mry を使って RuboCop のアップデートを楽しよう

TL;DR GitHub - pocke/mry: Mry Migrates .Rubocop.Yml Mry を使うと、コマンド一発で非互換にやられた.rubocop.ymlをアップデート出来る 前置き RuboCop のバージョンをご存知でしょうか? 現在(2017/04/24)の RuboCop の最新バージョンは、0.48.1 です。バ…