Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pyproject.tomlおよびpre-commitの導入 #504

Merged
merged 9 commits into from
Jun 22, 2023

Conversation

ReiHashimoto
Copy link
Collaborator

概要

  • setup.pyからpyproject.tomlへ移行
  • 開発やテストのみに必要なライブラリをoptional-dependenciesに分離
  • pre-commitによるlint, formatを追加

運用上の変更点

  • pip install
    • pip install -r requirements.txt --> pip install -e '.[dev]'
  • pre-commit
    • pre-commit installを実行してhooksに追加(初回のみ)
  • バージョニング
    • optinist/version.py --> pyproject.toml内のversionを直接変更

備考

github actionsでのlinter, formatterチェックについて

  • pre-commitは導入したが、installがユーザー依存の操作でフォーマットされていない可能性もあるため、継続利用

テストについて

  • linterの導入時(Add linter and formater #477 )に削除していたimport pytestについては、そのまま削除で問題ないと思われる
    • 公式のtutorialのsampleでも特にimportはしておらず、 pytest.raisesのようなpytestのメソッドなどを使用するときのみimportしている
    • 念の為動作も確認
      • 定義されているtest数とmake test_run時に抽出されるケース数が49で一致
      • 一部assertの内容をfailするように変更して確認したところ、想定通り対象のテストでfail
        ============================================== FAILURES ===============================================
        ________________________________________ test_SmkSetfile_hdf5 _________________________________________
        
            def test_SmkSetfile_hdf5():
                rule = SmkRule(
                    unique_id=unique_id,
                    node=node,
                    edgeDict=edgeDict,
                    nwbfile={},
                ).hdf5()
            
        >       assert rule.type == "csv"
        E       AssertionError: assert 'hdf5' == 'csv'
        E         - csv
        E         + hdf5
        
        optinist/tests/api/snakemake/test_snakemake_setfile.py:69: AssertionError
        ======================================= short test summary info =======================================
        FAILED optinist/tests/api/snakemake/test_snakemake_setfile.py::test_SmkSetfile_hdf5 - AssertionError: assert 'hdf5' == 'csv'
        ============================== 1 failed, 48 passed in 139.81s (0:02:19) ===============================
        make: *** [test_run] Error 1
        

@itutu-tienday
Copy link
Collaborator

itutu-tienday commented May 29, 2023

@ReiHashimoto
以下、確認結果のメモを記載します。

  • pip install -e '.[dev]' は ビルド版の作成と動作確認用のコマンドと思いますが、optinistの開発作業時は、optinistはpip installの対象外とする形(開発用のdependenciesのみをinstall)が、適当ではないかと想像します。

    • poetry のようなコマンドを利用することで、対応可能?(要調査)
  • pip install -e '.[dev]' で構築した環境内で、run_optinist コマンドを実行したところ、以下のエラーが発生している模様です。 (pathが1階層深くなっている?)

    > run_optinist
    Traceback (most recent call last):
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\lib\runpy.py", line 194, in run_module_as_main
    return run_code(code, main_globals, None,
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\lib\runpy.py", line 87, in run_code
    exec(code, run_globals)
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\Scripts\run_optinist.exe_main
    .py", line 4, in
    File "D:\workspace\optinist-develop\optinist_main
    .py", line 1, in
    from optinist.main_unit import main
    File "D:\workspace\optinist-develop\optinist_main_unit.py", line 39, in
    StaticFiles(directory=f"{FRONTEND_DIRPATH}/build/static"),
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\lib\site-packages\starlette\staticfiles.py", line 57, in init
    raise RuntimeError(f"Directory '{directory}' does not exist")
    RuntimeError: Directory 'D:\workspace\optinist-develop\optinist/frontend/build/static' does not exist

  • その他

@ReiHashimoto
Copy link
Collaborator Author

@itutu-tienday

  • pip install -e '.[dev]' は ビルド版の作成と動作確認用のコマンドと思いますが、optinistの開発作業時は、optinistはpip installの対象外とする形(開発用のdependenciesのみをinstall)が、適当ではないかと想像します。

パッケージ配布をするプロジェクトの場合、開発環境に対象のパッケージがインストールされるのは正かもしれないです。(optinistはmain.pyでも使用できるので違和感があるのかもしれませんが...)

  • 試しに手元でpoetryに切り替え、poetry install --only devを実行してもoptinistはinstallされます
  • また、他所のプロジェクトがどうかという観点では、例えばfast apiのcontributor向けのページも同様のpip installを行っており、試してみると開発中パッケージがインストールされます。(builderがhatchlingという差はありますが)

  • pip install -e '.[dev]' で構築した環境内で、run_optinist コマンドを実行したところ、以下のエラーが発生している模様です。 (pathが1階層深くなっている?)

    run_optinist
    Traceback (most recent call last):
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\lib\runpy.py", line 194, in run_module_as_main
    return run_code(code, main_globals, None,
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\lib\runpy.py", line 87, in run_code
    exec(code, run_globals)
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\Scripts\run_optinist.exe__main
    .py", line 4, in
    File "D:\workspace\optinist-develop\optinist__main
    _.py", line 1, in
    from optinist.main_unit import main
    File "D:\workspace\optinist-develop\optinist__main_unit_.py", line 39, in
    StaticFiles(directory=f"{FRONTEND_DIRPATH}/build/static"),
    File "D:\AppData\Anaconda3\envs\optinist_pyoroject\lib\site-packages\starlette\staticfiles.py", line 57, in init
    raise RuntimeError(f"Directory '{directory}' does not exist")
    RuntimeError: Directory 'D:\workspace\optinist-develop\optinist/frontend/build/static' does not exist_

  • こちらでは再現しませんでしたが、ログを見ると/\が混在しているので、WIndowsとLinux、Macの差異で生じていそうですね。両OSに対応できる記載方法を確認します。

@ReiHashimoto
Copy link
Collaborator Author

ReiHashimoto commented May 29, 2023

@itutu-tienday

pyproject.tomlの84行目から93行目を以下のように書き換えるとどうでしょう?

[tool.setuptools.package-data]
"*" = ["Snakefile"]
"frontend.build" = ["*"]
"frontend.build.static" = ["*"]
"frontend.build.static.css" = ["*"]
"frontend.build.static.js" = ["*"]
"frontend.build.static.media" = ["*"]
app_config = ["*.yaml"]
config = ["*.yaml"]
conda = ["*.yaml"]

@itutu-tienday
Copy link
Collaborator

@ReiHashimoto

パッケージ配布をするプロジェクトの場合、開発環境に対象のパッケージがインストールされるのは正かもしれないです。

すみません、そもそもの前提を認識違いしていました。
-e (--editable) オプションが そもそも「モジュールインストール先(site-packages 配下)と作業ディレクトリをリンクさせるオプション」ということですね。
上記であれば、懸念した課題 (optinistモジュールが2重に存在する状態)は、発生しないですね。

pyproject.tomlの84行目から93行目を以下のように書き換えるとどうでしょう?

こちらは確認し、また結果をお知らせします。

@itutu-tienday
Copy link
Collaborator

itutu-tienday commented May 30, 2023

@ReiHashimoto

pyproject.tomlの84行目から93行目を以下のように書き換えるとどうでしょう?

一旦共有ですが、上記修正を適用し、新たなconda環境で pip install を実施しましたが、エラーは解消されませんでした。

※もしかすると、pyproject.toml の設定ではなく、pythonコード側に起因する課題(パスの取得に環境依存がある)の可能性もあるかもしれません。(要検証)
※なお開発版環境 & Windows環境 のみの事象であれば、一旦このエラーは保留して、マージを先行しておいてもよいかもしれません。

@itutu-tienday
Copy link
Collaborator

@ReiHashimoto

※もしかすると、pyproject.toml の設定ではなく、pythonコード側に起因する課題(パスの取得に環境依存がある)の可能性もあるかもしれません。(要検証)
※なお開発版環境 & Windows環境 のみの事象であれば、一旦このエラーは保留して、マージを先行しておいてもよいかもしれません。

詳細確認したところ、上記の事象は、以下が要因のようです。

  • 現行のoptinistでは、モジュールのビルド時に、frontend ディレクトリがoptinist(backend)ディレクトリの配下に、移動されている。

  • 上記より、optinistのROOTディレクトリの構成パターンが以下の様に複数存在しており、そのためpyproject版でリンク切れが生じている。

  • 【optinistのROOTディレクトリの構成パターン】

    1. 開発版:{OPTINIST_SRC_DIR}/main.py を実行する場合 … {OPTINIST_SRC_DIR} が ROOTディレクトリ
    2. 開発版:pyprojectで生成した run_optinist をローカル実行する場合 … {OPTINIST_SRC_DIR}/optinist/ が ROOTディレクトリ
    3. リリース版 … site-packages/optinist/ が ROOTディレクトリ

対応としては、以下を想定

  • 上記のパターンを整理し、簡潔なディレクトリ構成仕様とする(開発版とリリース版の2パターンまでに)
    • 案)
      • run_optinist に細工する(開発版とリリース版で処理を分岐する)
      • frontend/build のパスを、標準でoptinist配下に変更してしまう
      • など

@ReiHashimoto ReiHashimoto merged commit 4c45e9b into develop-main Jun 22, 2023
3 checks passed
@ReiHashimoto ReiHashimoto deleted the pyproject-toml-and-precommit branch June 22, 2023 01:39
quanpython pushed a commit that referenced this pull request Jun 28, 2023
pyproject.tomlおよびpre-commitの導入
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants