2009-05-12 1 views
1

どうやら私の質問"Can I restrict nose coverage output to directory (rather than package)?"の答えはいいえですが、--coverage-package=PACKAGEオプションを、各.pyファイルのパッケージ名をディレクトリに含めて鼻に渡すことができます。例えばのでディレクトリ内のすべてのファイル名をコマンドラインオプションに変換するための(bash)シェルスクリプトを書くにはどうすればよいですか?

、ディレクトリが含まれている場合:

foo.py 
bar.py 
baz.py 

を...そして私は、コマンドを使用する必要があります:

nosetests --with-coverage --coverage-package=foo --coverage-package=bar --coverage-package=baz 

だから私の質問は、誰かがいくつかのシェルスクリプトを書くことができ、あります現在のディレクトリ内の.py拡張子を持つすべてのファイル名を取り、上記のコマンドライン(.py拡張子を削除したもの)を生成するには、コード(shまたはbashが望ましい)を使用しますか?私のbashスキルはかなり限られています。 (私はPythonでそれを行うように誘惑しています。)

答えて

13
nosetests --with-coverage $(for f in *.py; do echo --cover-package="${f%.*}"; done) 

トリックは、ここでファイルの拡張子を削除するparameter substitutionを使用しています。

${f%.*} 
+0

このソリューションは、スペースまたはglobメタキャラクタを含むすべての.pyファイルで失敗します。そして、Pythonスクリプトのファイル名にはこのようなものが含まれていることは明らかですが、壊れた解決策を簡単に簡単に実行できるようにしておく必要はありません。 – lhunath

+0

なぜ失敗するかは、引用符で囲まれていない展開ではbashの単語分割とbashパス名の拡張が行われます。したがって、foo = "A * in the sky.mp3"; rm -f $ fooは悲惨な結果になります。この悪い練習の結果がどれほど悲惨であるかは、しばしば予測できないので、**常に**あなたのコマンドに対する別の引数を適切に引用するだけです。この場合、各--cover-packageは個別の引数であり、個別に引用符で囲む必要があります。 – lhunath

+0

ありがとうございます。 "$ {f%。*}"を引用すると、あなたが記述している問題に対して保護されているようです。私は私の答えを編集しました。私は、1.py、2.pyと "3 * 4.pl"というファイルを作成し、次にrm $を実行してテストしました(* .plのfの場合echo; "$ f"; done)。このコマンドは、最後のファイルのみを削除します。私はforループをはるかに読みやすくするために私のソリューションを修正する方が好きです。 –

2
nosetests --with-coverage `ls *.py|sed -e 's/^/--cover-package=' -e 's/\.py$//'` 
+0

これは末尾の '.py'ビットを取り除いていません。 –

+0

ああ。ええ、その要件を逃した。一時的に修正されました。 – chaos

3

そして、あなたはそれが正しい(意味、離れてあなたのファイル名をカットするwordsplittingまたはランダムなファイル名に展開するグロブ予期せぬことはできません)行うことを気にしている場合、配列を使用します。

files=(*.py) 
packages=("${files[@]/%.py/}") 
nosetests --with-coverage "${packages[@]/#/--coverage-package=}" 
+0

オプションの「--cover-package =」部分をどのように含めるのですか? (正確に言えば、 " - with-coverage"も含める必要があります。) –

+0

ああ、確かに。私はそれにそれを追加させてください。 – lhunath

+0

私の答えが失敗する例を教えてください。私はあなたと同じグロビングパターンを使用しました。 –

関連する問題