PyPiデビュー 日本の祝日を調べるライブラリをpip install出来るようにしてみた

完成までに[クッキー](http://orteil.dashnet.org/cookieclicker/)2000万枚焼いた

# 概要と特徴
今日が祝日かGoogleカレンダーv3 APIを使って調べる。
特徴はAPI問い合わせ結果をclassキャッシュに格納するので、1万回呼び出しても1秒以内に応答すること。
https://pypi.python.org/pypi/japan_holiday

# install
```shell-session
pip install japan_holiday
```

# 使い方
```py
# 今日が祝日か判定(today is holiday)
from japan_holiday import JapanHoliday
JapanHoliday(google_api_token).today()
>>>False

# 今日が祝日若しくは週末か判定(today is holiday or weekend)
JapanHoliday(google_api_token).today(weekend=True)
>>>True

# 指定日が祝日若しくは週末か判定(the chosen day is holiday or weekend)
from datetime import datetime
now = datetime(2016, 1, 8, 00, 00, 00)
JapanHoliday(google_api_token).check(now=now, weekend=True)
>>>True

# list
JapanHoliday(google_api_token).get_holiday_calender(2015)
>>>[元日:2015/1/1, 成人の日:2015/1/12, 建国記念の日:2015/2/11, 春分の日:2015/3/21, 昭和の日:2015/4/29, 憲法記念日:2015/5/3, みどりの日:2015/5/4, こどもの日:2015/5/5, 憲法記念日 振替休日:2015/5/6, 海の日:2015/7/20, 敬老の日:2015/9/21, 国民の休日:2015/9/22, 秋分の日:2015/9/23, 体育の日:2015/10/12, 文化の日:2015/11/3, 勤労感謝の日:2015/11/23, 天皇誕生日:2015/12/23]

```

# 初めてPyPi作ってみて
既に似たライブラリが[存在](https://pypi.python.org/pypi/japanese_holiday/0.0.4)することは知っていたのですが、利用にGoogleAPIのトークンが必要でした。トークンが必要ない方法を調べてみたら[XMLフィード](https://www.google.com/calendar/feeds/japanese__ja%40holiday.calendar.google.com/public/basic?start-min=2015-10-01&start-max=2015-12-31&alt=json)だと必要ないみたい。本格的に開発着手しました。

ほぼ完成した段階で[XMLフィード](https://www.google.com/calendar/feeds/japanese__ja%40holiday.calendar.google.com/public/basic?start-min=2015-10-01&start-max=2015-12-31&alt=json)をよーくみると...
![スクリーンショット 2015-10-16 19.25.35.png](https://qiita-image-store.s3.amazonaws.com/0/65312/ad7b87c2-5331-7bd8-b265-0a60f83ef0c9.png)

方向転換してトークン利用してAPIを叩くことにする。これじゃ既存ライブラリと差別化できない、かといってここまで作っておいて...という典型的な損切りできない症候群が発病。仕方が無いので差別化するため方向をよりシンプル、より高速に、ドキュメントちゃんと書くの3点に焦点を当てて作ってみました。

かなり無駄なことして迷走してます。設計と検証って大事。



# PyPiは結構クソ
pipの仕組みはとっても便利で素晴らしいのですが、登録者視点だと結構クソでした。
WEBに手順が散見するので簡単に登録できるかなーと思ったら、[登録用のIDとパスワードを平文でPCに保存](http://stackoverflow.com/questions/1569315/setup-py-upload-is-failing-with-upload-failed-401-you-must-be-identified-t)させられたり、setup.pyの標準的な書き方が整備されていなかったり。ただこんな些細なデメリットを吹き飛ばすくらい便利な仕組みなので、今後も末永く利用([Python3.4からpipが標準インストーラに！？](http://qiita.com/ksato9700/items/c5a6db9d17ad0770a747))されそうですねー。


# PyPiはここに気をつけると楽できる
setup.pyの書き方が色んな流派があるので、最初とっても戸惑った。
迷ったら[requests](https://github.com/kennethreitz/requests)と[redis](https://github.com/andymccurdy/redis-py)を参考にすると楽できると思います。

最後にPyPi登録にあたり、これをやっといた方がと思ったところを紹介して締めたいと思います。

##1. 失敗したこと
module名を失敗しました。importするときにこう書くことになります。

```py
from japan_holiday import JapanHoliday
```

アンダースコア気持ち悪いので、次回からは気をつけたいと思います。

##2. SEO対策する
全部英語で書いてもいいけど、特に今回のようなドメスティックなライブラリだと利用が想定される国が限定されるので、日本語で検索したときに引っ掛かるように日本語のキーワードを入れてみました。
たぶんこの話は賛否が別れそう。

##3. READMEをPyPiとGitHubで一元管理する
```py:README.rstをPyPiとGitHubで一元管理する

import os
f = open(os.path.join(os.path.dirname(__file__), 'README.rst'))
long_description = f.read()
f.close()

setup(
    long_description=long_description,
...
```
参考: https://github.com/andymccurdy/redis-py/blob/master/setup.py#L30

##4. VersionをPyPiとmoduleで一元管理する
```py:versionをPyPiとmoduleで一元管理する
# 1. init.pyに__version__ = '0.0.5'と書いておいて
# 2. setup.pyで呼び出す
from redis import __version__
...
setup(
    name='redis',
    version=__version__,
...
```
参考: https://github.com/andymccurdy/redis-py/blob/master/setup.py#L5


##5. README.rstに書く内容に迷ったら..
英語辛いですね。何書くか迷ったらrequestsを参考に書けば間違いないと思います。
[requestsのGitHub](https://github.com/kennethreitz/requests)
[requestsのPyPi](https://pypi.python.org/pypi/requests/)

###PyPiバージョンアップ用コマンド
```py
python setup.py sdist upload
```