GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

facebook

codemod – Codemodは、大規模なコードベースのリファクタを手助けするツール/ライブラリですが、これは部分的に自動化できますが、依然として人間の監視..

投稿日:

Codemodは、大規模なコードベースのリファクタを手助けするツール/ライブラリですが、これは部分的に自動化できますが、依然として人間の監視と時折の介入が必要です。 CodemodはFacebookで開発され、オープンソースとしてリリースされました。

コードムド

概要

codemodは、部分的に自動化することができる大規模なコードベースのリファクタを手助けするためのツール/ライブラリですが、依然として人間の監視と時折の介入が必要です。

例: <font>タグの使用を非難するとしましょう。 コマンドラインから次のコマンドを実行して進捗を確認することができます。

codemod -m -d /home/jrosenstein/www --extensions php,html \
    '<font *color="?(.*?)"?>(.*?)</font>' \
    '<span style="color: \1;">\2</span>'

正規表現の各マッチについて、色付きのdiffが表示され、変更を受け入れるか( <font>タグを<span>タグに置き換える)、拒否するか、行を編集するかを尋ねられますあなたの$EDITORで質問してください。

インストール

仮想環境または管理者ユーザー

pip install codemod

またはsudoを使用してシステム全体

sudo -H pip install codemod

使用法

最後の2つの引数は、一致させる正規表現と置換文字列です。 または、置換文字列を省略して、エディタで編集するかどうかを入力する必要があります。

オプション(すべてオプション):

-m
  Have regex work over multiple lines (e.g. have dot match newlines).  By
  default, codemod applies the regex one line at a time.
-d
  The path whose ancestor files are to be explored.  Defaults to current dir.
-i
  Make your search case-insensitive
--start
  A path:line_number-formatted position somewhere in the hierarchy from which
  to being exploring, or a percentage (e.g. "--start 25%") of the way through
  to start.  Useful if you're divvying up the substitution task across
  multiple people.
--end
  A path:line_number-formatted position somewhere in the hierarchy just
  *before* which we should stop exploring, or a percentage of the way
  through, just before which to end.
--extensions
  A comma-delimited list of file extensions to process. Also supports Unix
  pattern matching.
--include-extensionless
  If set, this will check files without an extension, along with any
  matching file extensions passed in --extensions
--accept-all
  Automatically accept all changes (use with caution)
--default-no
  Set default behavior to reject the change.
--editor
  Specify an editor, e.g. "vim" or "emacs".  If omitted, defaults to $EDITOR
  environment variable.
--count
  Don't run normally.  Instead, just print out number of times places in the
  codebase where the 'query' matches.
--test
  Don't run normally.  Instead, just run the unit tests embedded in the
  codemod library.

正規表現の置換よりはるかに洗練された変換にcodemodを使用することもできます。 コマンドラインを使用するのではなく、次のようなPythonコードを記述します。

import codemod
codemod.Query(...).run_interactive()

詳細については、Queryクラスのドキュメントを参照してください。

バックグラウンド

Justin RosensteinによるFacebookノートの発表、2008年12月

なぜ大部分のコード(そしてほとんどのソフトウェア)がそんなに厄介なのかは、徹底的な変更を加えることは難しいということです。

1か月前に、あなた(またはあなたの会社全体)が頻繁に使用していた機能を書いたとしましょう。 そして、名前を変更したり、パラメータの順序を変更したり、2つの別々の機能に分割して、コールサイトの半分が古いコールサイトを使用したり、コールサイトの半分が新しいコールサイトを使用したり、スカラーから追加情報を持つ構造体にタイプします。 IDEやsedのような標準の* nixツールが役立ちますが、通常はエラーを導入して間接的に導入することとのトレードオフが必要です。 その結果、あまりにもしばしば、私たちは、掃くような変化は価値がないと(しばしば無意識のうちに)判断し、望ましくないパターンを未来のバージョンのためにそのまま残し、他の人たちは不満を募らせ、パターンはますますコードベースに特有のものです。

あなたが本当に望むのは、80%の場合の正規表現か、より複雑な変換のためのPythonコードのいずれかを使用して、ソースコードの行(または行の集合)と一致して何かに変換する任意の変換を記述できることですもっと望ましいですが、各変更サイトを一度に1つずつ表示し、変更を受け入れるか、変更を拒否するか、または選択したエディタを使用して手動で介入するかを尋ねるツールがあります。

だからFacebookにいる間、私はまさにそれを行うスクリプトを書いた。 codemod.py部分的に自動化することができるが人間の監視と時折の介入を必要とするコードベースのリファクタを支援する小さなユーティリティ/ライブラリ。 David Fetterman氏のおかげで、codemodはオープンソースとなりました。 それをチェックしてください(話すように):

git clone git://github.com/facebook/codemod.git
(previously svn checkout https://codemod.svn.sourceforge.net/svnroot/codemod/trunk codemod)

頻繁に使用されるコードパターンを再考するのはあまりにも邪魔になるので、コードを使用する場所が多いほど、コードの品質を損なっていることに気づくでしょう。迷惑な。 私は毎日それを使用しています。

依存関係

  • python2

クレジット

著作権(c)2007-2008 Facebook。

Justin Rosensteinによって作成されました。

Apache License、Version 2.0でライセンスされています。







-facebook

執筆者: