GitHubアップローダの応答部分を改修した
ちょっとすっきり。
成果物
GitHub.Upload.Response.201703291452
開発環境
- Linux Mint 17.3 MATE 32bit
- SQLite 3.8.2
- Python 3.4.3
前回まで
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専用にすることで簡単に済ませた。