Moonpick は Moonscript の代替リンターです。 Moonscript にはリンターが組み込まれていますが、現時点では検出できる内容が限られています。たとえば、組み込みのリンターは未使用の変数を検出しますが、それは考えられるすべての未使用宣言のサブセットに対してのみです。未使用のインポート変数、分解変数、未使用の関数などは検出されません。Moonpick は、上記などを検出するために生まれました。
Moonpick は Luarocks 経由でインストールできます。
$ luarocks install moonpick
その後、コマンドラインから実行できます。
$ moonpick < path-to-file >
出力は、Moonscript の組み込みリンターの出力をよく似ています。
また、唯一の依存関係が Moonscript であるため、スタンドアロン アプリケーションに簡単にバンドルすることもできます。プログラムで実行する方法の詳細については、「API」セクションを参照してください。
Moonpick は、代入を介して変数として明示的に使用されているか、 import
ステートメントやテーブル分解ステートメントなどの一部として暗黙的に作成されているかにかかわらず、すべての形式で未使用の変数を検出します。
Moonpick は、宣言されているが未使用の関数パラメータを検出して警告することもできます。未使用のパラメータがあることが非常に一般的であるため、これはデフォルトでは有効になっていません。たとえば、関数が外部 API に従い、すべてが使用されていない場合でも、使用可能なパラメーターを示したい場合があります。これを有効にするには、 report_params
構成オプションをtrue
に設定します。
Moonpick には、「_」で始まるパラメータをホワイトリストに登録するデフォルト設定が付属しており、関数のドキュメント的な側面を維持しながらリンターを満足させる方法を提供します。
未使用のループ変数が検出されました。構成でこれを完全に無効にすることも、ループ変数に対してのみ明示的なホワイトリストを提供することもできます。 Moonpick には、引数「i」と「j」、または「_」で始まる変数をホワイトリストに登録するデフォルト設定が付属しています。
組み込みリンターと同様に、Moonpick は未定義の参照を検出します。
宣言のシャドウイングは、宣言が同じ名前を持つ以前の宣言をシャドウするたびに発生します。次のコードを考えてみましょう。
my_mod = require ' my_mod '
-- [.. more code in between.. ]
for my_mod in get_modules ( ' foo ' )
my_mod . bar!
上記の例では、ループ内で宣言されたmy_mod
がトップレベルのmy_mod
と異なることは明らかですが、 for 宣言とその後の使用の間により多くのコードが挿入されると、すぐに明確でなくなる可能性があります。その時点でコードは曖昧になってしまいます。宣言のシャドウイングは、各変数が明確な方法で最大 1 回定義されるようにすることで、これに役立ちます。
検出は、 report_shadowing
構成変数を false に設定することによって完全にオフにすることができ、ホワイトリストは、 whitelist_shadowing
構成リストを指定することによって構成できます。
Moonscript の 0.5 より前のバージョンでは、この種のシャドウイングは実際には以前の宣言を再利用するだけであり、見落とされやすく混乱を招くバグにつながることに注意してください。
関数値を保持する以前に定義された変数の再割り当てが必要になることはほとんどなく、以前の宣言を忘れた結果として起こることがよくあります。
-- with the following declaration and usage
done = ( x ) -> x . foo and x . bar
done ( {} )
-- one might mistakenly reuse the name further down
i = 1
-- [..]
done = i == 10
これにより、特に常に実行されるわけではないコード パスでのみ再割り当てが行われる場合、デバッグが困難な問題が発生する可能性があります。
検出は、 report_fndef_reassignments
構成変数を false に設定することによって完全にオフにすることができ、ホワイトリストは、 whitelist_fndef_reassignments
構成リストを指定することによって構成できます。
関数またはメソッド内からのトップレベル変数の再代入は、明らかではない、とらえどころのないバグの原因となる場合があります。例:
module = require ' lib.module '
-- [..] much further down
get_foo = ( y ) ->
module = y match ( ' %w+ ' ) lower! -- mistakenly reusing the `module` var
return " #{module}_bar "
上記のget_foo
条件付きでのみ呼び出すと、重大なバグが見逃される可能性があります。
他の検出とは異なり、この検出はデフォルトでは有効になっていません。検出を有効にするには、 report_top_level_reassignments
構成変数を true に設定します。ホワイトリストは、 whitelist_top_level_reassignments
構成リストを指定することによって構成できます。ただし、これを有効にすることを強くお勧めします。
これがデフォルトで有効になっていない理由は、サブ関数またはメソッド内からトップレベルの変数を操作する正当なコードが存在することが珍しくないためです。リンターからの苦情を避けるためには、ホワイトリストを構成するか、トップレベルの変数が再割り当てされない別のコーディングスタイルを採用する必要があります (たとえば、代わりにモジュールの状態を保持するテーブルを使用するなど)。
Moonpick は、組み込みリンターと同じ構成ファイルと形式のスーパー セットをサポートします。
関数パラメータとループ変数の lint 設定のサポートを追加することで追加の設定オプションが提供され、すべてのホワイトリストで Lua パターンも許可されます。リンター構成ファイルは、Lua または Moonscript (それぞれlint_config.lua
およびlint_config.moon
) で作成できます。
以下の例を参照してください (lint_config.moon、Moonscript 構文を使用)。
{
whitelist_globals : {
-- whitelist for all files
[ " . " ] : { ' always_ignore ' } ,
-- whitelist for files matching 'spec'
spec : { ' test_helper ' } ,
}
whitelist_params : {
-- whitelist params for all files
[ " . " ] : { ' my_param ' } ,
-- ignore unused param for files in api
api : { ' extra_info ' } ,
}
whitelist_loop_variables : {
-- always allow loop variables 'i', 'j', 'k', as well as any
-- variable starting with '_' (using a Lua pattern)
[ " . " ] : { ' i ' , ' j ' , ' k ' , ' ^_ ' } ,
}
-- general whitelist for unused variables if desired for
-- some reason
whitelist_unused : {
[ " . " ] : {} ,
}
-- below you'll see the boolean switches controlling the
-- linting, shown with the default value
-- report_loop_variables: true
-- report_params: true
-- report_shadowing: true
-- report_fndef_reassignments: true
-- report_top_level_reassignments: false
}
ホワイトリスト項目が英数字以外で構成されている場合、その項目はパターンとして扱われます。
local moonpick = require ( ' moonpick ' )
code
内の指定されたコードを lint し、lint 検査のテーブルを返します。 config
、ファイルに使用する lint 設定であり、通常は設定ファイルに含まれる要素 ( whitelist_globals
、 whitelist_params
、 whitelist_loop_variables
、 whitelist_unused
、 report_params
、 report_loop_variables
) のフラット バージョンを含めることができます。
構成テーブルの例 (Lua 構文):
local moonpick = require ( ' moonpick ' )
local code = ' a = 2 '
moonpick . lint ( code , {
whitelist_globals = { ' foo ' , ' bar ' , }
whitelist_params = { ' ^_+ ' , ' other_+ ' }
})
返される検査テーブルは、上記の例では次のようになります。
{
{
line = 1 ,
pos = 1 ,
msg = ' declared but unused - `a` ' ,
code = ' a = 2 '
}
}
指定されたfile
を lint し、lint 検査のテーブルを返します。現在、 opts
lint_config
という 1 つの値を含めることができます。これは、構成をロードする構成ファイルを指定します。
local moonpick_config = require ( ' moonpick.config ' )
path
に関連する設定ファイルのパスを返します。何も見つからなかった場合はnil
返します。
config_path
で指定された構成ファイルからファイルfile
の lint 構成をロードします。返される構成は、 file
のテーブルをフラット化した構成オプションになります。
指定された lint オプションのエバリュエーター インスタンスを返します (たとえば、 load_config_from
によって返されるものなど)。エバリュエーター インスタンスは、次の関数を提供します (これらは、通常のドット演算子 . を使用して呼び出される関数であることに注意してください.
。
allow_global_access
、 allow_unused_param
、 allow_unused_loop_variable
、 allow_unused
、 allow_fndef_reassignment
、 allow_top_level_reassignment
。
これらはすべて、最初の引数としてシンボル (文字列として) を受け取り、シンボルが lint に合格するかどうかに応じてtrue
またはfalse
返します。
Moonpick はこの段階では比較的新しいため、大規模なコード ベースで正常に実行されていますが、誤検知や誤ったレポートが生成される可能性が非常に高いことに注意してください。この問題が発生した場合は、誤った動作を示すコード サンプルを問題として報告してください。
著作権 2016-2017 ニルス ノードマン
Moonpick は MIT ライセンスに基づいてリリースされています (詳細については、LICENSE ファイルを参照してください)。
テストを実行するには、 busted
とpl
モジュール (Penlight - luarock install penlight
) が必要です。プロジェクトのルート ディレクトリでbusted
実行するだけです。
ローカルのsrc
ディレクトリを指す指定された LUA_PATH を使用して実行します。チェックアウト場所が~/code/moonpick
であると仮定します。
LUA_PATH= " $HOME /code/moonpick/src/?.lua; $HOME /code/moonpick/src/?/init.lua; $( lua -e ' print(package.path) ' ) " ~ /code/moonpick/bin/moonpick * .moon