【Python】【fishingz】fishingz の Python3 版を作成する (1)

概要

fishingz の Python3 版を作成する プロジェクトというか、Python の勉強。
 
【fish】fishingz の詳細設計編【fishingz】 の「1.1」 のシーケンス部の実装である。
まだ、Python に慣れていないので、クラスは使わずに関数のみで実装している。
 

処理内容

下記の呼び出しをしたときに、初期設定ファイルの読み込みを含めた、fishingz の初期化処理をする。
設定ファイルのフォーマットは ConfigParser にした。

fishingz --find-dir
fishingz --find-file
fishingz --find-link
fishingz --find-mru

 

コード

fishingz_py.py

#!/usr/bin/env python3
# 次のコマンドを実行して ConfigParser.py をインストールすること
# pip3 install ConfigParser

import  getopt
import  sys
import  os
import  uuid
import  configparser    # Python 3.6 ではファイル名は configparser.py である
from    collections import OrderedDict

def  __load_conf(path):
    try:
        config = configparser.ConfigParser()
        config.read(path)    # $HOME/.fishingz/init.conf の内容が config に格納される
    except:
        e = traceback.print_exc()
        sys.stderr.write('Cause: {0}'.format(e))
    else:
#       for k, v in config.items():
#           #print("{0}=>{1}".format(k,v))
#           for i, d in config.items(k):
#               print("{0}=>{1}".format(i,d))
        pass
    return config


def  load_userfile():
    home    = os.environ.get("HOME")
    iniFile = os.path.join(home, '.fishingz/init.conf')
    return __load_conf(iniFile)


def  load_settings():
    user    = os.environ.get("USER")

    od = OrderedDict()
    od['FISHINGZ_UUID']      = uuid.uuid4().hex
    od['FISHINGZ_USER_AREA'] = os.path.join('/tmp',user+'.fishingz')
    od['FISHINGZ_WORKDIR']   = os.path.join(od['FISHINGZ_USER_AREA'], od['FISHINGZ_UUID'])
    od['FISHINGZ_AVATAR']    = ""
    od['FISHINGZ_D_CMD']     = "cd"

    return  od


def   verify_settings(settings):
    if   'FISHINGZ_D_CMD'     not in settings:
        return False
    elif 'FISHINGZ_WORKDIR'   not in settings:
        return False
    elif 'FISHINGZ_USER_AREA' not in settings:
        return False
    else:
        return True


def stream(*args):

    # fishingz::stream::init 相当の処理開始
    evtmap   = load_userfile()  # ファイル種別ごとの処理を定義したテーブル
    settings = load_settings()  # fishingz クラスの初期値

    retval   = verify_settings(settings)    # 設定値が妥当かチェックする。
    if retval != True:
        sys.exit(2)
    else:   # verify ok
        for k, v in settings.items():
            print("{0}=>{1}".format(k,v))
        return True


def main():

    OPT_S_FMT = "iR"
    OPT_L_FMT = ['find-dir', 'find-file', 'find-link', 'find-mru']

    try:
        opts, args = getopt.getopt(sys.argv[1:], OPT_S_FMT, OPT_L_FMT)

    except getopt.GetoptError as err:
        sys.stderr.write(err)
        sys.exit(2)

    for o, a in opts:
        if ( o == "-i" or o == "-R" ):
            print("Option is {0}".format(o))
            pass
        elif o in ('--find-dir', '--find-file', '--find-link', '--find-mru'):
            isOptFindMode  = True
            print("Option is {0}".format(o))
            stream(o)
        else:
            assert False, "unhandled option"


if __name__ == '__main__':

    main()