LINE Notifyを使ってLINEへメッセージを送信するpythonプログラムを作ってみる２

前回まで
[LINE Notifyを使ってLINEへメッセージを送信するpythonプログラムを作ってみる
](https://qiita.com/hidemusiam/items/48c8c75d35b2005e913d)

前回の続きでは、iniファイルの読み込み部分も起動するプログラムファイル内に含めているが、java屋のクセとして機能的に分割したい。
iniファイルを読み込むプログラムとメッセージ送信プログラムを区別してみる。

## コーディング３回目

1. setting.iniは前回と同じ
2. setting.iniを読み込んで設定情報にアクセスするためのクラス(Settings.py)を追加
3. 起動するプログラムから2.を参照する
4. 2.の単体テスト用プログラム

```setting.ini
[LINENotify]
line_notify_token = <アクセストークン>
line_notify_api = https://notify-api.line.me/api/notify
```

```Python:Settings.py
from configparser import ConfigParser
from pconst import const

# Settting.iniを管理するクラス
class Settings:
    
    # setting.ini セクション名
    NOTIFY = 'LINENotify'
    const.SECTION_LINENotify = NOTIFY
    # LINENotifyセクション　トークン名
    NOTIFY_TOKEN = 'line_notify_token'
    const.LINENotify_TOKEN = NOTIFY_TOKEN
    # LINENotifyセクション　URL
    NOTIFY_APIURL = 'line_notify_api'
    const.LINENotify_APIURL = NOTIFY_APIURL

    # コンストラクタ
    # iniファイルを読み込み
    def __init__(self):
        self.config = ConfigParser()
        self.config.read('setting.ini', encoding="utf-8")

    # ConfigParserインスタンスを生成する
    def getConfigParserInstance(self):
        return self.config

    # setting.iniよりアクセストークンを取得する
    def getLINENotify_Token(self):
        return self.config[const.SECTION_LINENotify][const.LINENotify_TOKEN]

    # setting.iniよりアクセスURLを取得する
    def getLINENotify_APIPath(self):
        return self.config[const.SECTION_LINENotify][const.LINENotify_APIURL]
```

```Python:sendmessege.py
# -*- coding: utf-8 -*-
import requests
import configparser
from Settings import Settings

def main():
    # 設定ファイル読み込み
    config = Settings()

    print("LINEへ送信するメッセージを入力してください。")
    message = input("送信メッセージ：")
    
    print('送信メッセージ：' + message)
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + config.getLINENotify_Token()}
    requests.post(config.getLINENotify_APIPath(), data=payload, headers=headers)

if __name__== '__main__':
    main()
```

```Python:SettingsTest.py
import unittest
from Settings import Settings

# Setttingsユニットテストクラス
class SettingsTest(unittest.TestCase):

    # # テスト準備
    def setUp(self):
        self.config = Settings()

    # テストケース：コンストラクタ
    def test_constructor(self):
        self.assertIsNotNone(self.config)
        
    # テストケース：iniファイル設定値取得メソッド
    def test_getSettings(self):
        self.assertIsNotNone(self.config.getConfigParserInstance())
        self.assertIsNotNone(self.config.getLINENotify_Token())
        self.assertIsNotNone(self.config.getLINENotify_APIPath())

if __name__ == '__name__':
    unittest.main()
```

### 気づき・感想
- setting.iniにはアクセストークンが記載されており、アプリケーション固有の設定情報が記載されたiniファイルはこのままGitHubへpushできない。
- 設定情報を扱うクラスを区別化したことで、変更箇所だけをテストでき保守性がアップした。
- pconstがあれば定数行を宣言できる。

## コーディング４回目

1. setting.iniはパラメータのみ削除する
2. アプリ固有の設定情報は初期セットアップ時にsetting.iniを書き込むためのクラス(SetUpScript.py)を追加

```setting.ini
[LINENotify]
line_notify_token = 
line_notify_api = 
```

```Python:SetUpScript.py
"""
セットアップ用スクリプト
Setting.iniファイルの初期設定を行う。
"""
from Settings import Settings

config = Settings()
cpins = config.getConfigParserInstance()

print("Setting.iniの初期設定を開始します。")
print()
print("LINE Notify登録時のアクセストークンを入力してください。")

token = input('アクセストークン：')
cpins.set(config.NOTIFY, config.NOTIFY_TOKEN, token)
print("アクセストークンを登録しました。")

cpins.set(config.NOTIFY, config.NOTIFY_APIURL, 'https://notify-api.line.me/api/notify')
print("API用URLを登録しました。")

with open('setting.ini', 'w') as contextfile:
    cpins.write(contextfile)

print()
print("Setting.iniの初期設定が完了しました。")

```
### 気づき・感想
- GitHubにsetting.iniを追加できた。
- アプリ固有の設定情報はローカルにて設定できるようになった。