Source code for jsonica

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, sys
import argparse
from util import Hoare

# global settings.
VERSION = '0.1.0'
PROGNAME = os.path.basename(__file__)

codec_help_url = 'https://docs.python.org/3.6/library/codecs.html#standard-encodings'

[docs]class Jsonica: """ 具象操作に流すための、utility的位置づけ""" DEBUG = True # DEBUG出力用 jsonは別扱い # 簡単なので、仮実装 vs. 素直にargparse actionに直接__run__()を割り当てるか、その場合前処理をどうするか。 sub_commands = {} def __init__(self): pass
[docs] def regist_subcommand(self, command): """ sub_commandsの型に依存させないためのIF 型変更の必要がでたら、局所的に操作を書き換える """ from sub_command_core.sub_command import SubCommands Hoare.P(issubclass(command.__class__, SubCommands)) # 衝突注意 for name in command.command_names: Hoare.P(not (name in self.sub_commands.keys()),\ '"{}" collision were detected in {}'.format(name, self.sub_commands.keys())) # NOTE: commandは参照であること。tupleへのrefactoring注意 self.sub_commands.update({name: command})
@property def sub_command_names(self): return self.sub_commands.keys()
[docs] def test(self): args = self.ARGS subcommand = self.sub_commands[args.subcmd_name] subcommand.__run__(args=args)
[docs] def prepare_argparser(self): argParser = argparse.ArgumentParser(prog=PROGNAME, description='generate complex JSON structure with analyzing META descripted file like xlsx.') # Version desctiprtion argParser.add_argument('-v', '--version', action='version', version='%s %s'%(PROGNAME, VERSION)) # see. https://docs.python.org/3/library/argparse.html subParsers = argParser.add_subparsers(dest='subcmd_name', metavar='', help='sub-commands') for name, command in self.sub_commands.items(): if name == command.command_name: command.make_argparse(subParsers) argParser.add_argument('-e', '--encoding', type=str, default='utf-8', metavar='{python built-in codec}', help='Set default charactor encode. When not set this, it is treated as "utf-8".\ see also. %s'%codec_help_url) self.ARGS = argParser.parse_args()
[docs]def errorout(e, additonal=''): """ 強制的に止める sys.stderr へ出力 """ errors = ['OK', 'sheets link not found.', 'schema not found.', # 1, 2 'root sheet not found.', 'Unrecognized item type were found.', # 3, 4 'Unknown accumulator!', 'Output json has failed.', # 5, 6 'Unsupported table filetype found.', 'setting yaml file not found'] Hoare.P(e < len(errors) and e >= 0) print('%s : %s'%(errors[e], additonal), file=sys.stderr) sys.exit(e)
[docs]def refactor_check(validation): Hoare.P(validation, 'Have you made refactor??')
if __name__ == '__main__': ins = Jsonica() # NOTE: subcommand 設定 https://github.com/setminami/Jsonica/issues/31 from sub_command_core import (Initialize, Generate) # FIXME: とりあえず仮実装 Plugin実装する際に再考 for x in [Initialize(), Generate()]: ins.regist_subcommand(x) ins.prepare_argparser() ins.test()