Astropyにコードを提供するのは良い例です

この例は修復に基づいています Issue 1761 以下のリストから astropy issues on GitHub それがそうです。それが原因となったのは pull request 1917 それがそうです。

問題のタイトルは“len()は座標に適用されない”であり,その記述は“使用できればよかった”である. len 座標配列上に,いくつの座標が存在するかを知る.

この特定の例を選択したのは、それがGitHubで簡単に表記されているからだ;最高の出発点のように見える!

あなたが始める前に

前述したようにAstpyのローカルコピーが設定されていることを確認します 開発版を試用する それがそうです。簡単に言うと git remote -v 地元のディレクトリで実行します astropy 駐留はこうでしょう

astropy   git@github.com:astropy/astropy.git (fetch)
astropy   git@github.com:astropy/astropy.git (push)
your-user-name     git@github.com:your-user-name/astropy.git (fetch)
your-user-name     git@github.com:your-user-name/astropy.git (push)

正確なURLのフォーマットです your-user-name GitHubを使用して設定された認証方法に依存します。

重要なのは astropy 役人を指すべきだ astropy 買い戻しと your-user-name 指向すべきである. your コピー.コピー astropy GitHubにあります

Asterpyの最新更新を取得する

このチュートリアルのいくつかのステップは、1つのコマンドのみを使用します。それらは分離され、この過程を文字とコードの形で要約した。

地元のコピーをお知らせします astropy 開発バージョンの最新変更については、アクセスしてください。

git fetch astropy --tags

隔離作業エリアを設置する

  • 新しいものを作ります git この問題を解決するためのノードは、分岐に切り替えられる:

    git checkout astropy/master -b fix-1761
    
  • このために修復はPython環境を作成し、その環境に切り替えます。以下の例では、Miniconda/Anaconda Python配布に必要な手順を示します。

    conda create -n apy-1761 python=3.9 # replace 3.9 with desired version
    conda activate apy-1761
    

    異なる発行版をお使いでしたら、ご参照ください Python仮想環境 新しい環境の作成と活性化についての説明は参照されたい。

  • 以下の命令を用いてこの環境に我々の分岐機構を実装する.

    pip install -e .[test]
    

あなたは本当に各パッチに個別のPython環境を設定する必要がありますか?必要ありませんが、コードに貢献するためのPython環境を持つことを望んでいるに違いありません。新たな環境を作成する速度が速く、空間をあまり占有することなく、組織作業を行う方法を提供する。

インストールに失敗した場合は、アップグレードしてみてください pip Vbl.使用 pip install pip -U 指揮部。これも良いやり方です conda 運行することで conda update conda -n base システムがそうするように指示すると git そうですよね。

まずテストしてください

Astropyでテストを行うことの重要性はいくら強調しても過言ではない.テストはあなたが新しいコードがそれがすべきことをしたと確信させ、それが古いコードを破壊しないようにする。

任意の変更を行う前に、少なくとも関連テストを実行して、Python環境が正しく設定されていることを保証しなければなりません。

最初の挑戦はどこで関連するテストを探すかを見つけることだ。 Issue 1761 問題なのは coordinates バッグのテストは astropy/coordinates/tests それがそうです。残りの astropy 似たようなレイアウトを持っています テストガイド. それがそうです。

使用:このディレクトリの現在のテストを実行します

pytest astropy/coordinates/tests

処理中のエラーがリモートデータアクセスに関連する場合、追加のフラグを使用してテストを実行する必要があります。 pytest ... --remote-data それがそうです。

すべてのテストが通過するが,誤りがある場合には,この誤りを暴露するための新たなテストが必要となる.

サブパケットは、そのテストを複数のテストモジュールに編成する;例えば、:

$ ls astropy/coordinates/tests
test_angles.py
test_angular_separation.py
test_api_ape5.py
test_arrays.py
...

Issue 1761 座標配列に影響を与えるため,新たなテストを test_arrays.py それがそうです。すべてのステップと同様に、ご質問がございましたら、どうぞ astropy-dev mailing list それがそうです。

このときの目標は直感に反する可能性がある:現在のコードを使用すると失敗することを知っているテストを作成する.このテストは astropy 我々の修復が確かに有効であるかどうかを自動的にチェックし,回帰を防ぐ(すなわち,将来のコードの変更が我々の修復を破壊しないことを保証する).

既存のコードの表示 test_arrays.py それぞれのテストは1つの名前で test_ それがそうです。テストの適切な位置を追加することは,ファイル中の最後のテスト関数の後である.

かなり明確な名前をテストしてみましょう test_array_len それがそうです。何を導入するか,テストをどのように設定するかを決定するためには,他のテストを見ることが最も簡単である.完全なテストは次と次のバックトラックにある. pull request 1917 それがそうです。

テストを作成して、それが予想通りに動作しているかどうかを確認します。この例では、正常に動作することを期待しています。 fail もし来なかったら pull request 1917 それがそうです。運行中です pytest astropy/coordinates/tests/test_arrays.py 予想された失敗が与えられる;出力抄録は以下のとおりである.

================= FAILURES =============================
______________ test_array_len __________________________

    def test_array_len():
        from .. import ICRS

        input_length = 5
        ra = np.linspace(0, 360, input_length)
        dec = np.linspace(0, 90, input_length)

        c = ICRS(ra, dec, unit=(u.degree, u.degree))

>       assert len(c) == input_length
E       TypeError: object of type 'ICRS' has no len()

astropy/coordinates/tests/test_arrays.py:291: TypeError

やったぞ!

このテストを地元に追加します git 買い戻し.

取っておいて git 一度は論理的なことだけに集中しています。私たちがさっき作成したテストは論理的な変更なので、私たちはそれを提出するつもりだ。よろしければ、あなたはこのテストと修復を待って提出することができます。

このチュートリアルについては、個別にテストを提出します。どうすればいいかわからないなら、聞いてみましょう astropy-dev mailing list それがそうです。

変更の内容をチェックする

どのような変化が起こっているのかを見ることができます git status **

$ git status
On branch fix-1761
Your branch is up-to-date with 'astropy/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   astropy/coordinates/tests/test_arrays.py

no changes added to commit (use "git add" and/or "git commit -a")

ここに2つの情報があります

  • ファイルが変更されました astropy/coordinates/tests/test_arrays.py

  • このファイルはgitの一時的な領域に追加されていないので、ここに列挙されています Changes not staged for commit それがそうです。

使用 git diff 変更を確認するには、以下の操作を実行してください。

$ git diff
diff --git a/astropy/coordinates/tests/test_arrays.py b/astropy/coordinates/test
index 2785b59..7eecfbb 100644
--- a/astropy/coordinates/tests/test_arrays.py
+++ b/astropy/coordinates/tests/test_arrays.py
@@ -278,3 +278,14 @@ def test_array_indexing():
     assert c2.equinox == c1.equinox
     assert c3.equinox == c1.equinox
     assert c4.equinox == c1.equinox
+
+
+def test_array_len():
+    from .. import ICRS
+
+    input_length = 5
+    ra = np.linspace(0, 360, input_length)
+    dec = np.linspace(0, 90, input_length)
+
+    c = ICRS(ra, dec, unit=(u.degree, u.degree))
+
+    assert len(c) == input_length

Gitのグラフィックスインタフェースは、これらのタイプの変更を追跡することを容易にします。参照してください。 Git GUIの取得(オプション) もしあなたが興味があれば。

この変革を上演する

git 2つのステップに変更を追加する必要があります。

  • 以下のように変更を上演する git add ... ;これは、ファイルをプロジェクトリストに追加し、提出しようとすると、これらの項目が買い戻しに追加されます。

  • 使用提出変更 git commit ... ;これは実際に買い戻しに変更を追加するだろう。

これらは1つのステップに統合することができる(推奨されない);2つのステップに分けて完了する利点は、一時保存を破棄することが提出よりも容易であることである。後でご覧になるように git status やり方も教えてくれます

同時にいくつかの違うところで変更したいなら、試運転はとても便利かもしれません。まず1回目の変更をしてから2回目の変更をしてから2回目の変更をしてから2回目の変更をしますすべての内容の準備ができたら、変更を1つの提出として提出してください。

この場合、第1段階変更:

git add astropy/coordinates/tests/test_arrays.py

コマンドラインでは何の変更の通知も受けていませんが、 git status お見せしましょう

$ git status
On branch fix-1761
Your branch is up-to-date with 'astropy/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   astropy/coordinates/tests/test_arrays.py

注意してください git もしあなたが望むなら、ダンプ変更をキャンセルするために必要なコマンドを非常に助けることができます。

変更を提出します

次に、修復なしにテストを提出します:

$ git commit -m "Add test for array coordinate length (issue #1761)"
[fix-1761 dd4ef8c] Add test for array coordinate length (issue #1761)
 1 file changed, 12 insertions(+)

メッセージを提出するには簡潔で要を得なければならない.GitHubを含む問題番号は、GitHubが関連する問題のリンクを自動的に作成することを可能にします。

使用 git status 私たちの今までの位置を振り返ってみるには、以下の操作を実行してください。

$ git status
On branch fix-1761
Your branch is ahead of 'astropy/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

言い換えれば私たちのローカルコピーを変更しました astropy しかし、私たちはこの変更を私たちのGitHubアカウントにプッシュ(転送)しなかった。

問題を解決する

コードを書く

私たちがテストを作成したので、私たちはこの問題を解決するつもりだ。この修復の全面的な議論は、本チュートリアルの範囲を超えていますが、修復方法は1つを追加することです __len__ 方法,.を.とする方法 astropy.coordinates.SphericalCoordinatesBase はい。 coordsystems.py (コードを検索しようとする場合、コードが再構成されています)。すべての球面座標系はこの基底クラスから継承されており,この基底クラスが実現している. __getitem__ 座標配列をインデックスする方法を許す.

pull request 1917 コードの変更を見る場合は、以下の操作を実行してください。

変更をテストします

以下のレベルでテストを行う必要があります。

  • 今、コード変更は私たちが作成したテストを成功させますか?以下の命令を実行することで検査を行う pytest astropy/coordinates/tests/test_arrays.py それがそうです。この場合、そうです!

  • 残りの座標テストはまだ合格しましたか?以下の命令を実行することで検査を行う pytest astropy/coordinates/ それがそうです。この場合、はい、私たちは何も割っていません!

  • すべての星座テストはまだ成功していますか?以下の命令を実行することで検査を行う pytest トップカタログから。これは時間がかかるかもしれませんが、具体的にはあなたのシステムの速度にかかっています。また成功した!

注釈

スキップまたはx失敗のテストはすべて正常である.失敗や誤りはよくない。もし詰まったら、聞いてください astropy-dev mailing list 助けを求めて!

変更を一時保存して提出します

このファイルをあなたのに追加します git 買い戻しは2段階で行われる:先に段階を分けて提出する。

上で行った提出とは少し違いますので、トップカタログにあることを確認してチェックしてください git status **

$ git status
On branch fix-1761
Your branch is ahead of 'astropy/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   astropy/coordinates/coordsystems.py

no changes added to commit (use "git add" and/or "git commit -a")

Gitは、どのディレクトリにいても(repoの1つのディレクトリにある限り)、どのように変化したかを知っています。

以下のコマンドを使用して変更されます:

git add astropy/coordinates/coordsystems.py

この提出に対して、複数行の提出メッセージを使用することは、この変更を受けたときにGitHub上の問題を自動的にオフにするメッセージを使用するのに役立つであろう。次のコード片はbash(類似したシェル)で実現されている:

$ git commit -m"
> Add len() to coordinates
>
> Closes #1761"
[fix-1761 f196771] Add len() to coordinates
 1 file changed, 4 insertions(+)

複数行のメッセージ提出のもう1つのオプションは、Git GUIを使用するか、または実行することです git commit 提示されたメッセージは編集されていない.

検査を用いた場合,提出後のメッセージは以下のようになるはずである. git log **

Add len() to coordinates

Closes #1761

メッセージを提出するのが正しくないようでしたら、運行してください git commit --amend それがそうです。もしあなたがまだ問題があったら、ここにいてください astropy-dev mailing list それがそうです。

この時点で、Astropy保守員はあなたの変更について何も知りません。

この問題は後で“引張要求”で解決しますが、まず、参照してください 立ち止まって考えてみてください:もっと多くのテストや他の変化はありますか? それがそうです。

立ち止まって考えてみてください:もっと多くのテストや他の変化はありますか?

この点であなたが提案した変更が完了したかどうかを一時停止して検査することは悪いことではありません。この場合、例えば、より多くのテストを含むことができる。

  • 次のようなことがあったとき何が起こりますか len() 1つの座標で呼び出されますこの座標は not 1つの配列?

  • そうかな? len() 座標が1つだけの配列である場合は働きますか?

どちらもいます pull request 1917 だから、検査しても大したことはありません。この場合、彼らはまた説明する機会を提供します pytest フレームワーク。

2つ目の場合は比較的簡単であるため,まず我々が用いた開発周期に従って処理する.

  • 中で変更する astropy/coordinates/tests/test_arrays.py

  • 変更をテストする

テストは合格した;しかし、私たちはこの変更を提出せず、スカラー状況の検査も実現するだろう。

ここでは2つの理想的な結果が想像できます

  • len(scalar_coordinate) その行動は len(scalar_angle) 1つ上げて TypeError スカラー座標に用いる.

  • len(scalar_coordinate) 1に戻るのは,座標が1つしかないからである.

もしあなたがこのような状況にあったら、どうしたらいいのかわからないなら、聞いてみてください。あなたが修復している質問に対して、最高の問い合わせ位置はGitHub上のページです。

代替的に、選択を行い、GitHub上の引き出し要求において、あなたが何を選択したかおよび理由を明確に説明し、関連説明は以下のとおりである。

予想ミスをテストする

この場合私たちは1つを向上させることを選びました TypeError ユーザは、後でインデックス付けを試みると、彼らが作成した座標が1つの座標の配列のように動作しないことを知る必要があるからである。

♪the pytest フレームワークは例外テストを比較的容易にする;失敗すると予想されるコードを with データブロック::

c = ICRS(0, 0, unit=(u.degree, u.degree))

with pytest.raises(TypeError):
    len(c)

このようなテストを追加することができます test_array_len はい。 test_arrays.py それがそうです。あなた自身の仕事で、あなたが望むなら、それを新しいテスト関数に入れることを選択することもできます。

Python授業は誰かに仕事をさせます

この問題の実際的な解決は非常に短い。はい。 coordsystems.py 2行追加しました:

def __len__(self):
    return len(self.lonangle)

lonangle 包含 Angle Sは経度(RAである場合があり,経度である場合がある)を表す.簡単に呼べばいいです len() あなたが無料で手に入れた配列の一つの角度では Angle クラスがスカラーを処理する場合.

ここでスカラ状況の明示的なチェックを追加することには、同期を維持する必要があるという2つの非常に大きな欠点がある。 Angle そして座標にあります

他の変更を提出します

修正が必要な他のファイル(ChangeLogを含む)については、上記の開発サイクルに引き続き従ってください(参照 変更ログを編集する )と文書、必要があれば:

  • それをチェックしてください all astropy テストはまだ合格した 変更をテストします

  • git status 準備と提出が必要な内容を確認する

  • git add ... 変更を行うには、以下の操作を実行してください

  • git commit ... 変更を提出するには、以下の操作を実行してください

  • git log 変更履歴をチェックするには、以下の操作を実行してください

♪the git 出力を持たない命令には,以下のようなものがある.

git status
git add astropy/coordinates/tests/test_arrays.py
git commit -m "Add tests of len() for scalar coordinate and length 1 coordinate"
git log

変更ログを編集する

各貢献者が変更を提案する際に適切な更新を行わない限り、変更リストを最新に維持することはほとんど不可能である。

ファイルに変更する CHANGES.rst トップカタログでは setup.py IS)。変更はマイルストーンにマッチするリストの下に置きます(とも呼ばれますバージョン)は、GitHub内の問題保守担当者によって設定されています。Pull要求で新しい機能を提案する場合、Pull要求を検討するまで、この変更を待つ必要がある場合があります。

この問題はすでにマークされています astropy 0.3.1次図に示すように,ChangeLogエントリがそこに現れる.

../../_images/milestone.png

中の項目 CHANGES.rst あなたがしたことをまとめて、引き出し要求番号を含めなければなりません。ChangeLogエントリを作成するためには、使用されているマークアップ言語をあまり理解する必要はありません( Sphinx primer );他のエントリを表示し、シミュレーションを行います。

この問題に対して項目は - Implemented **

astropy.coordinates
^^^^^^^^^^^^^^^^^^^

- Implemented ``len()`` for coordinate objects. [#1761]

行の初めは1つである - 項目記号付きリスト項を作成し,それを astropy.coordinates パターと len() テキストを等幅フォントで表現する.

CHANGES.rstへの変更を提出

ご利用いただけます git status 上述したように、または試運転および提出に直接ジャンプする:

git add CHANGES.rst
git commit -m "Add changelog entry for 1761"

変更をAstpyのGitHub分岐にプッシュします

このコマンドを使用して、ローカル変更をコピーにプッシュします astropy 審査変更を要求する前に、GitHub上で以下の動作を実行してください。

git push your-user-name fix-1761

引き込み要求に変更をお勧めします

この段階でGitHubアカウントに転送してナビゲーションする必要があります your コピー.コピー astropy Urlは https://github.com/your-user-name/astropy それがそうです。

到着後、ノードドロップダウンリストから修復プログラムを含むノードを選択します。

../../_images/worked_example_switch_branch.png

正しい枝を選択した後,“引き取り要求”ボタンをクリックすると,次の図のようになる:

../../_images/pull_button.png

あなたのプル型要請を合理的な名前に名前をつけてください。プリアンブル付きの発行番号が含まれています # Pull要求の記述では、上述したように、元の問題へのリンクを作成するために使用される astropy テンプレートをプル的に要求します。

どうぞご覧ください pull request 1917 このチュートリアルで示された引き出し要求のために使用されます。

必要に応じて修正して推送する

Pull要求を検討する際に変更を要求する場合があります。これらの変更は、ローカルコピーで行われ、ローカルrepoに提出され、GitHubにプッシュされます。GitHubはあなたの引き出し要求を自動的に更新します。