自分で作ったpythonモジュールをpoetryでパッケージ化する

- ちょくちょく使うpythonモジュールをパッケージ化してpip installしておくとpythonモジュールの場所を意識せずに実行できるので便利。
- 下記の記事で作ったCSVをJSONに変換するモジュールをパッケージ化する。
    - https://qiita.com/dokeita/items/84469815e8fc70bffa64
- 既存のモジュールをパッケージ化する場合は ``` poetry init ```することもできるが、今回は``` poetry new ```したところに作成したモジュールを配置する。
- poetry はpip installしておくこと　``` pip install poetry ```


## poetry addでパッケージディレクトリ作成
引数には最終的なパッケージ名にしておくとよい。

``` shell
% poetry new csv2json
Created package csv2json in csv2json
```
下記のような構成でディレクトリやファイルが作成される。

``` shell
current_dir
|--csv2json
|  |--README.rst
|  |--csv2json
|  |  |--__init__.py
|  |--pyproject.toml
|  |--tests
|  |  |--__init__.py
|  |  |--test_csv2json.py
```
個々のファイルの説明は省略、[公式ドキュメント][poetry]参照

## pythonモジュール配置
``` shell
Users/k-aido/work/python/hoge
|--csv2json
|  |--README.rst
|  |--csv2json
|  |  |--__init__.py
|  |  |--csv2json.py #　追加
|  |--pyproject.toml
|  |--tests
|  |  |--__init__.py
|  |  |--test_csv2json.py
```
## pyproject.toml更新
下記について更新を行う。

- 依存パッケージの追加
- 実行コマンドを定義

#### 初期状態

``` toml
[tool.poetry]
name = "csv2json"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
``` 

### 依存パッケージの追加
今回のモジュールは引数の制御に[click][]を使っているのでこれを追加する。
流れとしては下記。

1. ``` poetry search ```でパッケージ名を検索
1. ``` poetry add ```で追加

モジュール名がわかっていれば、pyproject.tomlを直接更新してもOK

``` shell
% poetry search click

click8 (8.0.1)
 Composable command line interface toolkit

click (8.0.3) #　今回使うのはこちら
 Composable command line interface toolkit

click-repl (0.2.0)
 REPL plugin for Click

click-uwescience (7.0.1)
 A simple wrapper around optparse for powerful command line utilities.

click-aliases (1.0.1)
 Enable aliases for Click

click-utils (0.2.1)
 a set of utilites for writing command line programs with Click

click-shell (2.1)
 An extension to click that easily turns your click app into a shell utility

click-restful (0.0.1)
 Turn Click CLIs into Flask RESTful APIs.

click-lock (0.6)
 Adds locks and timeouts to click entrypoints

click-configfile (0.2.3)
 This package supports click commands that use configuration files.

click-frame (0.1)

docusign-click (1.0.0)
 DocuSign Click API

click-easylog (0.1.0)

click-plus (0.0.3)
 collection of click extensions

click-params (0.1.2)
 A bunch of useful click parameter types

click-stream (0.0.10)
 Click option type for http/https/file inputs

click-demo (0.2.0)
 Click commands Implementation along with Test cases

sphinx-click (3.0.1)
 Sphinx extension that automatically documents click applications

pytest-click (1.0.2)
 Py.test plugin for Click

types-click (7.1.7)
 Typing stubs for click
```

``` shell
% poetry add click
Creating virtualenv csv2json-OWomnvc1-py3.8 in /Users/k-aido/Library/Caches/pypoetry/virtualenvs
Using version ^8.0.3 for click

Updating dependencies
Resolving dependencies... (0.9s)

Writing lock file

Package operations: 9 installs, 0 updates, 0 removals

  • Installing pyparsing (2.4.7)
  • Installing attrs (21.2.0)
  • Installing more-itertools (8.10.0)
  • Installing packaging (21.0)
  • Installing pluggy (0.13.1)
  • Installing py (1.10.0)
  • Installing wcwidth (0.2.5)
  • Installing click (8.0.3)
  • Installing pytest (5.4.3)
```

#### 実施後
``` toml
[tool.poetry]
name = "csv2json"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.8"
click = "^8.0.3" #　追加された

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
```
これでこのパッケージをインストールした際に、一緒にclickがインストールされる。

### 実行コマンドを定義

``` コマンド名 = 'tomlから見た.pyファイル:関数名' ```

``` toml
[tool.poetry.scripts]
csv2json = 'csv2json.csv2json:main'
```
## ビルド
-  ``` poetry build ```コマンドでビルドする。
- ``` -f ``` を指定すると、tar.gz形式か、whl形式かを選べる。使い分けについてはわからず。別途調べる。

``` shell
% poetry build
Building csv2json (0.1.0)
  - Building sdist
  - Built csv2json-0.1.0.tar.gz
  - Building wheel
  - Built csv2json-0.1.0-py3-none-any.whl
```
## インストールしてみる
ビルドで作成したファイルを指定してpip installすることが可能。

``` shell
% pip uninstall csv2json
Found existing installation: csv2json 0.1.0
Uninstalling csv2json-0.1.0:
  Would remove:
    /Users/k-aido/Library/Python/3.8/bin/csv2json
    /Users/k-aido/Library/Python/3.8/lib/python/site-packages/csv2json-0.1.0.dist-info/*
    /Users/k-aido/Library/Python/3.8/lib/python/site-packages/csv2json/*
Proceed (Y/n)? Y
  Successfully uninstalled csv2json-0.1.0
k-aido@k-aidonoMacBook-Air csv2json % pip install ./dist/csv2json-0.1.0-py3-none-any.whl
Defaulting to user installation because normal site-packages is not writeable
Processing ./dist/csv2json-0.1.0-py3-none-any.whl
Requirement already satisfied: click<9.0.0,>=8.0.3 in /Users/k-aido/Library/Python/3.8/lib/python/site-packages (from csv2json==0.1.0) (8.0.3)
Installing collected packages: csv2json
Successfully installed csv2json-0.1.0
```

インストールされた。

``` shell
% pip list | grep csv2json
csv2json                          0.1.0
```

こんな感じで使える。

``` shell
% csv2json sample.csv -o output.json
```


## 参考
- [click documentation][click]
- [Poetry documentation][poetry]

[click]:https://click.palletsprojects.com/en/8.0.x/
[poetry]:https://cocoatomo.github.io/poetry-ja/