やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubアップローダのGitHubAPI部分を大幅に改修した

GitHubアップローダの改修シリーズ。

成果物

GitHubGitHub.Upload.ByPython.Add.Database.Create.refactoring.GitHubApi.201703280740

開発環境

前回まで

http://ytyaru.hatenablog.com/entry/2017/10/09/000000

  • GitHubAPIをHTTP要求する処理を共通化したい

今回

GitHubAPI部分を大幅に改修した。全体的に影響を受けている。インタフェースも変更された。

よくよく考えたら何もかも未完成なのでリファクタリングどころでは済まなかった。

課題

  • HTTP要求の共通化
    • ./database/src/license/insert/command/miscellaneous/Licenses.py
      • 共通化できていない
        • GitHub.Apis.sqlite3にLicenseAPIが入っていなかったから。いずれ追加して修正する

問題

  • HTTP要求の共通化により、コードが見づらくなった
  • いちいちGitHub.Apis.sqlite3に問い合わせる必要が生じるようになった
    • GitHub.Apis.sqlite3の整備が必要になった(ソースコードの修正でなくDBの修正をせねばならない面倒さ。)
      • 使うAPIを網羅する必要がある
      • APIが変更されたら修正する必要がある

バグ

初回DB作成時、GitHub.Accounts.sqliteにあるユーザごとにリポジトリ情報を取得することができない。

症状

  • ユーザごとのDBファイルは生成されるが、データ内容がすべて起動引数で指定したユーザのリポジトリ情報になってしまう

原因

./dataset/src/Data.pyの下記コードにより、ユーザが指定できていなかったため。

以下のように./dataset/src/Create.pyでユーザごとにリポジトリDBを生成しようとする。self.data.set_username(account['Username'])でユーザを指定しているが、これが設定できない。

Create.py

def __LoopAccounts(self, db, db_path):
    if not(os.path.isfile(db_path)):
        db['Creator'](db_path)
        self.data.load_db()
    default_user = self.data.get_username()
    try:
        for account in self.data.db_account['Accounts'].find():
            print(account['Username'])
            db_path_new = db_path.replace("{user}", account['Username'])
            if not(os.path.isfile(db_path_new)):
                shutil.copyfile(db_path, db_path_new)
                self.data.set_username(account['Username'])
                print('{0}のリポジトリDBに挿入します------------------------------'.format(self.data.get_username()))
                print(db_path_new)
                self.data.db_repo = dataset.connect('sqlite:///' + db_path_new)
                db['Inserter'](db_path_new)

Data.py

def set_username(self, username):
    if None is not self.db_account['Accounts'].find_one(Username=username):
        self.user_name = username

AccountsDBを作成しようとしているので、まだAccountsテーブルは存在しない。if文にはじかれてユーザ名を指定できない。その結果、起動時に指定したユーザ名のままリポジトリ情報を取得し、ほかのユーザのDBにそのデータを入れてしまっている。

対策

初回時、アカウント登録CUIを表示し、DBに登録するようにする。

楽をしようとして今回のset_username()を急造したが、有効なユーザ名を確実に入力させるためには、そのための処理を実装せねばならなかった。新たに機能を作らねばならないため大変。今すぐにはできない。

そもそもset_username()カプセル化的によろしくない。以下のような確認がとれたら有効なアカウントであると判断したい。

  • AccessTokenを生成するAPIを発行できた
  • SSH鍵を使って通信できた

そのためには、それらの機能をイチから作る必要がある。

自力で対処

以下の対処を自力で行えば使える。しかし、それが面倒すぎてこのGitHubアップローダを使う気になれない。

  1. GitHubアカウント作成
  2. 有効なアカウント情報を自分で用意する
    • AccessToken作成
      • 必要なscopeが付いていること(repo, delete_repo)
    • GitHub.Accounts.sqlite3の形式にあわせて登録する
      • 方法1: TSVを使って挿入する
        • ./database/src/account/res/tsv/配下にあるTSVファイルを参考にする
        • ./database/src/account/res/sql/create/配下にある.sqlファイルを参考にすると列の型がわかる
          • SQLite3の仕様を知っていないとTSVを書けないかも?
      • 方法2: SQLite3を使って挿入する
        • sqlite3 GitHub.Accounts.sqlite3コマンドを実行する
        • あとはSQL文を駆使して頑張ってね(丸投げ)
  3. SSH
    • SSH鍵を生成する(秘密鍵、公開鍵)
    • ~/.ssh/configを書く
    • GitHubにログインし、公開鍵を設定する
    • SSH接続を確認する

これまではずっとこのDBが存在することを前提にしてきたが、そもそもこれを作るのが大変。

初めてGitHubを使った時、これらの概念把握とセットアップにどれだけ苦労したことか。情弱にはハードルが高すぎる。

自動化不可

アカウント作成だけはGitHubのサイトでやるしかない。自動化できない。

しかも事前にメールアカウントの作成と、登録後、メール応答で有効アドレス確認をせねばならない。それだけで面倒だし情弱には(ry

所感

最近はずっとそうかもしれないが、今回も欠陥がある状態でのアップとなる。とりあえず、忘れないように、気づいた問題はすべて書き残しておく。