やってみる

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

GitHubアップローダの応答部分を改修した

ちょっとすっきり。

成果物

GitHubGitHub.Upload.Response.201703291452

開発環境

前回まで

http://ytyaru.hatenablog.com/entry/2017/10/14/000000
http://ytyaru.hatenablog.com/entry/2017/10/15/000000
http://ytyaru.hatenablog.com/entry/2017/10/16/000000
http://ytyaru.hatenablog.com/entry/2017/10/17/000000
http://ytyaru.hatenablog.com/entry/2017/10/18/000000

pythonのHTTPライブラリrequestsにより簡易化できる部分があったことが判明。今回はそれをやる。

今回

  • HTTPヘッダContent-Typeを調べて返却する型を決めるよう改修した
  • HTTPコード例外処理はrequestsの例外発生用関数r.raise_for_status()があったので、それを使うようにした

パッケージ変更

  • before: ./web/http/Response.py
  • after: ./web/service/github/api/v3/Response.py

一括置換(import, インスタンス生成部分)

grep検索。

find . -type f | grep '*.py$' | xargs grep "web.http.Response"

grep置換。

find . -type f | grep '*.py$' | xargs sed -i 's/web.http.Response/web.service.github.api.v3.Response/g'

以下、実行結果。

$ find . -type f | grep '*.py$' | xargs grep "web.http.Response"
./database/src/license/insert/command/miscellaneous/Licenses.py:import web.http.Response
./database/src/license/insert/command/miscellaneous/Licenses.py:        self.response = web.http.Response.Response()
./web/service/github/api/v3/Client.py:import web.http.Response
./web/service/github/api/v3/Client.py:        self.__response = web.http.Response.Response()
./web/service/github/api/v3/repositories/Repositories.py:import web.http.Response
$ find . -type f | grep '*.py$' | xargs sed -i 's/web.http.Response/web.service.github.api.v3.Response/g'

一括置換(呼出部分)

self.response.Get(r, res_type='json')self.response.Get(r)に置換したい。

grep検索

find . -type f | grep '*.py$' | xargs grep "self.response.Get("
find . -type f | grep '*.py$' | xargs grep "self.response.Get(r, res_type='json')"

grep置換

NG…

find . -type f | grep '*.py$' | xargs sed -i 's/self.response.Get(r, res_type='json')/self.response.Get(r)/g'

NG…

find . -type f | grep '*.py$' | xargs sed -i 's/self.response.Get\(r, res_type='json'\)/self.response.Get\(r\)/g'

OK!

find . -type f | grep '*.py$' | xargs sed -i "s/self.response.Get(r, res_type='json')/self.response.Get(r)/g"

以下、実行結果。

$ find . -type f | grep '*.py$' | xargs grep "self.response.Get(r, res_type='json')"
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:            repos += self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/miscellaneous/Licenses.py:            licenses += self.response.Get(r, res_type='json')
./web/service/github/api/v3/miscellaneous/Licenses.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/miscellaneous/Licenses.py:        return self.response.Get(r, res_type='json')
$ find . -type f | grep '*.py$' | xargs grep "self.response.Get("
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:            repos += self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r)
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/repositories/Repositories.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/miscellaneous/Licenses.py:            licenses += self.response.Get(r, res_type='json')
./web/service/github/api/v3/miscellaneous/Licenses.py:        return self.response.Get(r, res_type='json')
./web/service/github/api/v3/miscellaneous/Licenses.py:        return self.response.Get(r, res_type='json')
$ find . -type f | grep '*.py$' | xargs sed -i "s/self.response.Get(r, res_type='json')/self.response.Get(r)/g"
$: コマンドが見つかりません

内容変更

インタフェース

after

def Get(self, r, sleep_time=2, is_show=True):

before

def Get(self, r, res_type=None, success_code=None, sleep_time=2, is_show=True):
  • res_typeにjsonなどを渡していたが、Content-Typeで識別するようにしたため不要になった
  • success_codeに200などを渡していたが、r.raise_for_status()で実行するようにしたため不要になった

エラー処理

after

r.raise_for_status()

before

if None is not success_code:
    if (success_code != r.status_code):
        raise Exception('HTTP Error: {0}'.format(r.status_code))
        return None

HTTPレスポンス値の返却

after

def __init__(self):
    self.re_content_type_raw = re.compile('application/vnd.github.*.raw')
    self.re_charset = re.compile(r'charset=', re.IGNORECASE)
    self.__mime_type = None
    self.__char_set = None
self.__SplitContentType(r)
if None is self.__mime_type:
    return r.text
elif 'application/json' == self.__mime_type:
    return r.json()
elif self.re_content_type_raw.match(self.__mime_type):
    return r.content
else:
    raise Exception('対象外のContent-Typeです。: ' + self.__mime_type)
def __SplitContentType(self, r):
    if not('Content-Type' in r.headers) or (None is r.headers['Content-Type']) or ('' == r.headers['Content-Type']):
        self.__mime_type = None
        self.__char_set = None
    else:
        self.__mime_type, self.__char_set = r.headers['Content-Type'].split(';')
        if None is not self.__mime_type:
            self.__mime_type = self.__mime_type.strip()
        if None is not self.__char_set:
            # 'charset='を大小文字に関わらず削除する
            self.__char_set = re.sub(self.re_charset, '', self.__char_set).strip()
    print('MimeType: {0}'.format(self.__mime_type))
    print('CharSet: {0}'.format(self.__char_set))

before

if None is res_type or 'text' == res_type.lower():
    return r.text
elif 'json' == res_type.lower():
    return r.json()
elif 'binary' == res_type.lower():
    return r.content
else:
    raise Exception("指定されたres_type {0} は対象外です。".format(res_type))

所感

MimeTypeデータベースを用意せず、GitHub専用にすることで簡単に済ませた。