def tearDownClass(cls): # アカウント情報をもとにDBとユーザを削除 if cls.db_server_connect: for connection in cls.connections: # cls.clientはpymongo経由でDB削除 cls.client.drop_database(connection['database']) # cls.testdb.dbはedman側の接続オブジェクト経由でユーザ(自分自身)の削除 db = DB(connection) testdb = db.get_db testdb.command("dropUser", connection['user'])
def setUpClass(cls): # 設定読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'test_db.ini') cls.test_ini = dict([i for i in settings['DB'].items()]) cls.test_ini['port'] = int(cls.test_ini['port']) # DB作成のため、pymongoから接続 cls.client = MongoClient(cls.test_ini['host'], cls.test_ini['port']) # 接続確認 try: cls.client.admin.command('ismaster') cls.db_server_connect = True print('Use DB.') except py_errors.ConnectionFailure: cls.db_server_connect = False print('Do not use DB.') if cls.db_server_connect: # adminで認証 cls.client[cls.test_ini['admin_db']].authenticate( cls.test_ini['admin_user'], cls.test_ini['admin_password']) # DB作成 cls.client[cls.test_ini['db']].command( "createUser", cls.test_ini['user'], pwd=cls.test_ini['password'], roles=[ { 'role': 'dbOwner', 'db': cls.test_ini['db'], }, ], ) # ユーザ側認証 cls.client[cls.test_ini['db']].authenticate( cls.test_ini['user'], cls.test_ini['password']) # edmanのDB接続オブジェクト作成 con = { 'host': cls.test_ini['host'], 'port': cls.test_ini['port'], 'database': cls.test_ini['db'], 'auth_database': cls.test_ini['db'], 'user': cls.test_ini['user'], 'password': cls.test_ini['password'] } db = DB(con) cls.testdb = db.get_db cls.search = Search(db) else: cls.search = Search()
def test_admin_insert(self): if not self.db_server_connect: return # 管理者権限で各ユーザのDBに入力 connections = copy.deepcopy(self.connections) test_results = {} for connection in connections: connection['auth_database'] = 'admin' connection['user'] = '******' connection['password'] = '******' db = DB(connection) insert_data = [ {'test_admin_insert': {'database': connection['database']}} ] result = db.insert(insert_data) result_oid = result[0]['test_admin_insert'][0] # print(result_oid) # debug test_results.update({connection['database']: result_oid}) # print(test_results) # debug # 各ユーザがDBからデータを取り出してテスト for connection in self.connections: db = DB(connection) result_doc = db.doc('test_admin_insert', test_results[connection['database']], None) # print(result_doc['database'], connection['database']) # debug with self.subTest(connection=connection): self.assertEqual(result_doc['database'], connection['database'])
def test_auth(self): if not self.db_server_connect: return # 自分のアカウントを利用して、他人のデータベースに接続する(失敗になる) dbnames = [connection['database'] for connection in self.connections] for connection in self.connections: # 自分以外のデータベース名のリストを作成 tmp_dbnames = copy.deepcopy(dbnames) if connection['database'] in tmp_dbnames: tmp_dbnames.remove(connection['database']) # 他人のデータベースに接続を試みる for dbname in tmp_dbnames: tmp_connection = copy.deepcopy(connection) tmp_connection['database'] = dbname with self.assertRaises(SystemExit): _ = DB(tmp_connection)
description='特定コレクション内のembデータの特定のキーに対してref化を行うスクリプト') parser.add_argument('collection') parser.add_argument('pullout_key') parser.add_argument('-e', '--exclusion_keys', nargs='*') # parser.add_argument('-d', '--dir', # help='Dir of report files.', # default=None) args = parser.parse_args() # 結果を記録する場合はパスの存在を調べる # if args.dir is not None: # p = Path(args.dir) # if not p.exists() and not p.is_dir(): # sys.exit('パスが不正です') # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) exclusion = tuple( args.exclusion_keys if args.exclusion_keys is not None else []) result = db.loop_exclusion_key_and_ref(args.collection, args.pullout_key, exclusion) # 結果を保存する # if args.dir is not None: # jm = JsonManager() # jm.save(result, args.dir, 'pullout', date=True)
# コマンドライン引数処理 parser = argparse.ArgumentParser(description='DBから検索したデータをコンバートしてDBに入れるスクリプト') # parser.add_argument('-c', '--collection', help='collection name.') parser.add_argument('objectid', help='objectid str.') # parser.add_argument('-s', '--structure', default='ref', # help='Select ref(Reference, default) or emb(embedded).') parser.add_argument('new_collection', help='new collection name.') args = parser.parse_args() # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) # 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと collection = db.find_collection_from_objectid(args.objectid) # 対象のドキュメントがrefかembかを調べる # (ただし、子要素が存在しないドキュメントの場合は必ずembと表示される) current_structure = db.get_structure(collection, args.objectid) print(f'このドキュメントは {current_structure} 形式です') structures = ['emb', 'ref'] structures.remove(current_structure) while True: convert_selected = input(f'{structures[0]}に変更しますか? y/n(exit) >> ') if convert_selected == 'y': result = db.structure(collection, args.objectid, structures[0], args.new_collection)
parser = argparse.ArgumentParser(description='ドキュメントの項目を削除するスクリプト') # parser.add_argument('-c', '--collection', help='collection name.') parser.add_argument('objectid', help='objectid str.') # クエリは structureがembの時だけ parser.add_argument('-q', '--query', default=None, help='Ref is ObjectId or Emb is query list strings.') args = parser.parse_args() # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) # 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと collection = db.find_collection_from_objectid(args.objectid) # ドキュメント構造の取得 structure = db.get_structure(collection, args.objectid) # クエリの変換 query = Action.file_query_eval(args.query, structure) # ドキュメント取得 doc = db.doc(collection, args.objectid, query) doc_keys = list(doc.keys()) # 項目を画面表示
parser.add_argument('-q', '--query', default=None, help='Ref is ObjectId or Emb is query list strings.') parser.add_argument('-c', '--compress', action='store_true', help='gzip compress.Default is not compressed.') args = parser.parse_args() # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) file = File(db.get_db) # 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと collection = db.find_collection_from_objectid(args.objectid) # ドキュメント構造の取得 structure = db.get_structure(collection, args.objectid) # クエリの変換 query = Action.file_query_eval(args.query, structure) if file.add_file_reference(collection, args.objectid, Action.files_read(args.path), structure, query, args.compress): print('更新しました')
# 構造はrefかembのどちらか ※モジュール内でも判断できる if not (args.structure == 'ref' or args.structure == 'emb'): parser.error("--structure requires 'ref' or 'emb'.") # 結果を記録する場合はパスの存在を調べる if args.result_dir is not None: p = Path(args.result_dir) if not p.exists() and not p.is_dir(): sys.exit('パスが不正です') # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) jm = JsonManager() convert = Convert() json_files = Action.files_read(args.path, 'json') for file in Action.file_gen(json_files): # Ednman用にjsonをコンバート converted_edman = convert.dict_to_edman(file, mode=args.structure) # コンバート結果を保存する場合 # jm.save({'converted_edman': converted_edman}, args.result_dir, # name='edman_json_list', date=True) # DBへインサート inserted_report = db.insert(converted_edman) if args.result_dir is not None:
parser.add_argument('-p', '--parent_depth', type=int, default=0) parser.add_argument('-c', '--child_depth', type=int, default=0) parser.add_argument('-o', '--out_file_name', help='generate json, Name output file.', default='search_result') parser.add_argument('-d', '--dir', help='generate json file, dir path', default='.') args = parser.parse_args() # クエリおよびクエリファイルはどちらかは必須 if not args.query and not args.query_file: parser.error("query or query_file is mandatory.") # クエリ入力値変換 query = Action.query_eval(args.query if args.query else args.query_file.read()) # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) search = Search(db) # 検索 search_result = search.find(args.collection, query, args.parent_depth, args.child_depth) # 検索結果をjsonファイルとして保存 jm = JsonManager() jm.save(search_result, args.dir, name=args.out_file_name, date=True)
from edman import DB # Ctrl-Cを押下された時の対策 signal.signal(signal.SIGINT, lambda sig, frame: sys.exit('\n')) # コマンドライン引数処理 parser = argparse.ArgumentParser(description='ドキュメントを削除するスクリプト') # parser.add_argument('-c', '--collection', help='collection name.') parser.add_argument('objectid', help='objectid str.') args = parser.parse_args() # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) db = DB(con) # 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと collection = db.find_collection_from_objectid(args.objectid) # 指定のドキュメントの文書構造を取得 structure = db.get_structure(collection, args.objectid) # 削除処理 result = db.delete(args.objectid, collection, structure) if result: print('削除成功') else: print('削除失敗')
args = parser.parse_args() # 構造はrefかembのどちらか if not (args.structure == 'ref' or args.structure == 'emb'): parser.error("structure requires 'ref' or 'emb'.") # iniファイル読み込み settings = configparser.ConfigParser() settings.read(Path.cwd() / 'ini' / 'db.ini') con = dict([i for i in settings['DB'].items()]) # ファイル読み込み try: amend_data = json.load(args.amend_file) except json.JSONDecodeError: sys.exit(f'File is not json format.') except IOError: sys.exit('file read error.') # DB接続 db = DB(con) # 対象oidの所属コレクションを自動的に取得 ※動作が遅い場合は使用しないこと collection = db.find_collection_from_objectid(args.objectid) # アップデート処理 result = db.update(collection, args.objectid, amend_data, args.structure) if result: print('アップデート成功') else: print('アップデート失敗')