qiitacli.option_parser のソースコード
'''
記事ファイルのYAMLヘッダーをパースするためのモジュール
'''
import yaml
from yaml.error import YAMLError
from qiitacli.exceptions import QiitaCliParseError
[ドキュメント]def parse(filestream, separator='---'):
'''
Parse options and body from FileStream
Args:
filestream _io.TextIOWrapper: parse file stream object
separator str: separator for options and body
Returns:
dict: {'options': options, 'body': body}
Raises:
QiitaCliParseError
'''
lines = filestream.readlines()
options = parse_option(lines)
body = parse_body(lines)
res = {'options': options, 'body': body}
return res
[ドキュメント]def parse_option(lines, separator='---'):
'''
Parse options and body from FileStream
Args:
lines list: string list
separator str: separator for options and body
Returns:
dict: options
Raises:
QiitaCliParseError
'''
text = ''.join(lines)
options = {}
require_options = ['title', 'tags']
try:
loads = yaml.safe_load_all(text)
options = next(loads)
except YAMLError as error:
raise QiitaCliParseError(error)
if not isinstance(options, dict):
raise QiitaCliParseError('{} is not dict'.format(options))
for require_option in require_options:
if require_option not in options.keys():
msg = 'options validate is failed.'
msg += '{} is required.'.format(require_option)
raise QiitaCliParseError(msg)
return options
[ドキュメント]def parse_body(lines, separator='---'):
'''
Parse options and body from FileStream
Args:
lines list: string list
separator str: separator for options and body
Returns:
str: body
Raises:
QiitaCliParseError
'''
# 2行目以降でセパレーターが来るまでを、 ヘッダーとし無視する。
separat_lineno = 1
for lineno in range(separat_lineno, len(lines)):
line = lines[lineno]
if line.startswith(separator):
separat_lineno = lineno + 1
if separat_lineno == 1:
msg = 'Separator Not Found. Separator is {}'.format(separator)
raise QiitaCliParseError(msg)
body = ''.join(lines[separat_lineno:])
return body