def create_project_dir(cls, project_name, args): print("in create project dir") """ Create project directory in args.root_dir/project_name, and initialize there all required files If some files are missed, restore them from defaults. If config files are specified by args, copy them in project directory :param project_name: :param args: :return: """ dir = cls.get_project_dir(project_name, args) os.makedirs(dir, exist_ok=True) label_config_name = 'config.xml' output_dir_name = 'completions' input_path_name = 'tasks.json' default_config_file = os.path.join(dir, 'config.json') default_label_config_file = os.path.join(dir, label_config_name) default_output_dir = os.path.join(dir, output_dir_name) default_input_path = os.path.join(dir, input_path_name) if hasattr(args, 'config_path') and args.config_path: copy2(args.config_path, default_config_file) if hasattr(args, 'input_path') and args.input_path: copy2(args.input_path, default_input_path) if hasattr(args, 'output_dir') and args.output_dir: if os.path.exists(args.output_dir): copy2(args.output_dir, default_output_dir) if hasattr(args, 'label_config') and args.label_config: copy2(args.label_config, default_label_config_file) default_config = { 'title': 'Label Studio', 'port': 8200, 'debug': False, 'label_config': label_config_name, 'input_path': input_path_name, 'output_dir': output_dir_name, 'instruction': 'Type some <b>hypertext</b> for label experts!', 'allow_delete_completions': True, 'templates_dir': 'examples', 'editor': { 'debug': False }, '!ml_backend': { 'url': 'http://localhost:9090', 'model_name': 'my_super_model' }, 'sampling': 'uniform' } # create input_path (tasks.json) if not os.path.exists(default_input_path): with io.open(default_input_path, mode='w') as fout: json.dump([], fout, indent=2) print(default_input_path + ' input path has been created.') else: print(default_input_path + ' input path already exists.') # create config file (config.json) if not os.path.exists(default_config_file): with io.open(default_config_file, mode='w') as fout: json.dump(default_config, fout, indent=2) print(default_config_file + ' config file has been created.') else: print(default_config_file + ' config file already exists.') # create label config (config.xml) if not os.path.exists(default_label_config_file): path = find_file('examples/image_polygons/config.xml') default_label_config = open(path).read() with io.open(default_label_config_file, mode='w') as fout: fout.write(default_label_config) print(default_label_config_file + ' label config file has been created.') else: print(default_label_config_file + ' label config file already exists.') # create output dir (completions) if not os.path.exists(default_output_dir): os.makedirs(default_output_dir) print(default_output_dir + ' output directory has been created.') else: print(default_output_dir + ' output directory already exists.') print('') print( 'Label Studio has been successfully initialized. Check project states in ' + dir) print('Start the server: label-studio start ' + dir) return dir
def create_project_dir(cls, project_name, args): """ Create project directory in args.root_dir/project_name, and initialize there all required files If some files are missed, restore them from defaults. If config files are specified by args, copy them in project directory :param project_name: :param args: :return: """ dir = cls.get_project_dir(project_name, args) if args.force: delete_dir_content(dir) os.makedirs(dir, exist_ok=True) config = (json_load(args.config_path) if args.config_path else json_load(find_file("default_config.json"))) def already_exists_error(what, path): raise RuntimeError( '{path} {what} already exists. Use "--force" option to recreate it.' .format(path=path, what=what)) input_path = args.input_path or config.get("input_path") # save label config config_xml = "config.xml" config_xml_path = os.path.join(dir, config_xml) label_config_file = args.label_config or config.get("label_config") if label_config_file: copy2(label_config_file, config_xml_path) print(label_config_file + " label config copied to " + config_xml_path) else: if os.path.exists(config_xml_path) and not args.force: already_exists_error("label config", config_xml_path) if not input_path: # create default config with polygons only if input data is not set default_label_config = find_file( "examples/image_polygons/config.xml") copy2(default_label_config, config_xml_path) print(default_label_config + " label config copied to " + config_xml_path) else: with io.open(config_xml_path, mode="w") as fout: fout.write("<View></View>") print("Empty config has been created in " + config_xml_path) config["label_config"] = config_xml if args.source: config["source"] = { "type": args.source, "path": args.source_path, "params": args.source_params, } else: # save tasks.json tasks_json = "tasks.json" tasks_json_path = os.path.join(dir, tasks_json) if input_path: tasks = cls._load_tasks(input_path, args, config_xml_path) else: tasks = {} with io.open(tasks_json_path, mode="w") as fout: json.dump(tasks, fout, indent=2) config["input_path"] = tasks_json config["source"] = { "name": "Tasks", "type": "tasks-json", "path": os.path.abspath(tasks_json_path), } logger.debug( "{tasks_json_path} input file with {n} tasks has been created from {input_path}" .format(tasks_json_path=tasks_json_path, n=len(tasks), input_path=input_path)) if args.target: config["target"] = { "type": args.target, "path": args.target_path, "params": args.target_params, } else: completions_dir = os.path.join(dir, "completions") if os.path.exists(completions_dir) and not args.force: already_exists_error("output dir", completions_dir) if os.path.exists(completions_dir): delete_dir_content(completions_dir) print(completions_dir + " output dir already exists. Clear it.") else: os.makedirs(completions_dir, exist_ok=True) print(completions_dir + " output dir has been created.") config["output_dir"] = "completions" config["target"] = { "name": "Completions", "type": "completions-dir", "path": os.path.abspath(completions_dir), } if "ml_backends" not in config or not isinstance( config["ml_backends"], list): config["ml_backends"] = [] if args.ml_backends: for url in args.ml_backends: config["ml_backends"].append( cls._create_ml_backend_params(url, project_name)) if args.sampling: config["sampling"] = args.sampling if args.port: config["port"] = args.port if args.host: config["host"] = args.host if args.allow_serving_local_files: config["allow_serving_local_files"] = True if args.key_file and args.cert_file: config["protocol"] = "https://" config["cert"] = args.cert_file config["key"] = args.key_file if (hasattr(args, "web_gui_project_desc") and args.web_gui_project_desc) or args.project_desc: config[ "description"] = args.web_gui_project_desc or args.project_desc # create config.json config_json = "config.json" config_json_path = os.path.join(dir, config_json) if os.path.exists(config_json_path) and not args.force: already_exists_error("config", config_json_path) with io.open(config_json_path, mode="w") as f: json.dump(config, f, indent=2) print("") print( "Label Studio has been successfully initialized. Check project states in " + dir) print("Start the server: label-studio start " + dir) return dir
def create_project_dir(cls, project_name, args): """ Create project directory in args.root_dir/project_name, and initialize there all required files If some files are missed, restore them from defaults. If config files are specified by args, copy them in project directory :param project_name: :param args: :return: """ dir = cls.get_project_dir(project_name, args) if args.force: delete_dir_content(dir) os.makedirs(dir, exist_ok=True) config = json_load( args.config_path) if args.config_path else json_load( find_file('default_config.json')) def already_exists_error(what, path): raise RuntimeError( '{path} {what} already exists. Use "--force" option to recreate it.' .format(path=path, what=what)) input_path = args.input_path or config.get('input_path') # save label config config_xml = 'config.xml' config_xml_path = os.path.join(dir, config_xml) label_config_file = args.label_config or config.get('label_config') if label_config_file: copy2(label_config_file, config_xml_path) print(label_config_file + ' label config copied to ' + config_xml_path) else: if os.path.exists(config_xml_path) and not args.force: already_exists_error('label config', config_xml_path) if not input_path: # create default config with polygons only if input data is not set default_label_config = find_file( 'examples/image_polygons/config.xml') copy2(default_label_config, config_xml_path) print(default_label_config + ' label config copied to ' + config_xml_path) else: with io.open(config_xml_path, mode='w') as fout: fout.write('<View></View>') print('Empty config has been created in ' + config_xml_path) config['label_config'] = config_xml if args.source: config['source'] = { 'type': args.source, 'path': args.source_path, 'params': args.source_params } else: # save tasks.json tasks_json = 'tasks.json' tasks_json_path = os.path.join(dir, tasks_json) if input_path: tasks = cls._load_tasks(input_path, args, config_xml_path) else: tasks = {} with io.open(tasks_json_path, mode='w') as fout: json.dump(tasks, fout, indent=2) config['input_path'] = tasks_json config['source'] = { 'name': 'Tasks', 'type': 'tasks-json', 'path': os.path.abspath(tasks_json_path) } logger.debug( '{tasks_json_path} input file with {n} tasks has been created from {input_path}' .format(tasks_json_path=tasks_json_path, n=len(tasks), input_path=input_path)) if args.target: config['target'] = { 'type': args.target, 'path': args.target_path, 'params': args.target_params } else: completions_dir = os.path.join(dir, 'completions') if os.path.exists(completions_dir) and not args.force: already_exists_error('output dir', completions_dir) if os.path.exists(completions_dir): delete_dir_content(completions_dir) print(completions_dir + ' output dir already exists. Clear it.') else: os.makedirs(completions_dir, exist_ok=True) print(completions_dir + ' output dir has been created.') config['output_dir'] = 'completions' config['target'] = { 'name': 'Completions', 'type': 'completions-dir', 'path': os.path.abspath(completions_dir) } if 'ml_backends' not in config or not isinstance( config['ml_backends'], list): config['ml_backends'] = [] if args.ml_backends: for url in args.ml_backends: config['ml_backends'].append( cls._create_ml_backend_params(url, project_name)) if args.sampling: config['sampling'] = args.sampling if args.port: config['port'] = args.port if args.host: config['host'] = args.host if args.allow_serving_local_files: config['allow_serving_local_files'] = True if args.key_file and args.cert_file: config['protocol'] = 'https://' config['cert'] = args.cert_file config['key'] = args.key_file # create config.json config_json = 'config.json' config_json_path = os.path.join(dir, config_json) if os.path.exists(config_json_path) and not args.force: already_exists_error('config', config_json_path) with io.open(config_json_path, mode='w') as f: json.dump(config, f, indent=2) print('') print( 'Label Studio has been successfully initialized. Check project states in ' + dir) print('Start the server: label-studio start ' + dir) return dir
def create_project_dir(cls, project_name, args): """ Create project directory in args.root_dir/project_name, and initialize there all required files If some files are missed, restore them from defaults. If config files are specified by args, copy them in project directory :param project_name: :param args: :return: """ dir = cls.get_project_dir(project_name, args) os.makedirs(dir, exist_ok=True) config = json_load( args.config_path) if args.config_path else json_load( find_file('default_config.json')) def already_exists_error(what, path): raise RuntimeError( '{path} {what} already exists. Use "--force" option to recreate it.' .format(path=path, what=what)) input_path = args.input_path or config.get('input_path') # save label config config_xml = 'config.xml' config_xml_path = os.path.join(dir, config_xml) label_config_file = args.label_config or config.get('label_config') if label_config_file: copy2(label_config_file, config_xml_path) print(label_config_file + ' label config copied to ' + config_xml_path) else: if os.path.exists(config_xml_path) and not args.force: already_exists_error('label config', config_xml_path) if not input_path: # create default config with polygons only if input data is not set default_label_config = find_file( 'examples/image_polygons/config.xml') copy2(default_label_config, config_xml_path) print(default_label_config + ' label config copied to ' + config_xml_path) else: with io.open(config_xml_path, mode='w') as fout: fout.write('<View></View>') print('Empty config has been created in ' + config_xml_path) config['label_config'] = config_xml # save tasks.json tasks_json = 'tasks.json' tasks_json_path = os.path.join(dir, tasks_json) if input_path: tasks = cls._load_tasks(input_path, args, config_xml_path) with io.open(tasks_json_path, mode='w') as fout: json.dump(tasks, fout, indent=2) print(tasks_json_path + ' input path has been created from ' + input_path) else: if os.path.exists(tasks_json_path) and not args.force: already_exists_error('input path', tasks_json_path) with io.open(tasks_json_path, mode='w') as fout: json.dump({}, fout) print(tasks_json_path + ' input path has been created with empty tasks.') config['input_path'] = tasks_json # create completions dir completions_dir = os.path.join(dir, 'completions') if os.path.exists(completions_dir) and not args.force: already_exists_error('output dir', completions_dir) if os.path.exists(completions_dir): delete_dir_content(completions_dir) print(completions_dir + ' output dir already exists. Clear it.') else: os.makedirs(completions_dir, exist_ok=True) print(completions_dir + ' output dir has been created.') config['output_dir'] = 'completions' if args.ml_backend_url: if 'ml_backend' not in config or not isinstance( config['ml_backend'], dict): config['ml_backend'] = {} config['ml_backend']['url'] = args.ml_backend_url if args.ml_backend_name: config['ml_backend']['name'] = args.ml_backend_name else: config['ml_backend']['name'] = str(uuid4()) # create config.json config_json = 'config.json' config_json_path = os.path.join(dir, config_json) if os.path.exists(config_json_path) and not args.force: already_exists_error('config', config_json_path) with io.open(config_json_path, mode='w') as f: json.dump(config, f, indent=2) print('') print( 'Label Studio has been successfully initialized. Check project states in ' + dir) print('Start the server: label-studio start ' + dir) return dir
class CustomJsonFormatter(jsonlogger.JsonFormatter): def add_fields(self, log_record, record, message_dict): super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict) if not log_record.get('timestamp'): # this doesn't use record.created, so it is slightly off now = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ') log_record['timestamp'] = now if log_record.get('level'): log_record['level'] = log_record['level'].upper() else: log_record['level'] = record.levelname # read logger config with open(find_file('logger.json')) as f: log_config = json.load(f) logfile = os.path.join(os.path.dirname(__file__), '..', 'static', 'logs', 'service.log') # create log file os.makedirs(os.path.dirname(logfile), exist_ok=True) open(logfile, 'w') if not os.path.exists(logfile) else () file_handler = logging.FileHandler(logfile) file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(CustomJsonFormatter()) # set logger config logging.config.dictConfig(log_config) log = logging.getLogger('service') log.addHandler(file_handler)