def check_config_file(path): cp = Config.create_parser() with open(path, 'r') as ini: cp.readfp(ini) print('Checking config file at {0} for unmigrated keys.'.format(path), file=sys.stderr) def section(s): return cyan('[{0}]'.format(s)) for src, dst in migrations.items(): check_option(cp, src, dst) # Special-case handling of per-task subsystem options, so we can sweep them up in all # sections easily. def check_task_subsystem_options(subsystem_sec, options_map, sections=None): sections = sections or cp.sections() for src_sec in ['DEFAULT'] + sections: dst_sec = subsystem_sec if src_sec == 'DEFAULT' else '{}.{}'.format(subsystem_sec, src_sec) for src_key, dst_key in options_map.items(): check_option(cp, (src_sec, src_key), (dst_sec, dst_key)) artifact_cache_options_map = { 'read_from_artifact_cache': 'read', 'write_to_artifact_cache': 'write', 'overwrite_cache_artifacts': 'overwrite', 'read_artifact_caches': 'read_from', 'write_artifact_caches': 'write_to', 'cache_compression': 'compression_level', } check_task_subsystem_options('cache', artifact_cache_options_map) jvm_options_map = { 'jvm_options': 'options', 'args': 'program_args', 'debug': 'debug', 'debug_port': 'debug_port', 'debug_args': 'debug_args', } jvm_options_sections = [ 'repl.scala', 'test.junit', 'run.jvm', 'bench', 'doc.javadoc', 'doc.scaladoc' ] check_task_subsystem_options('jvm', jvm_options_map, sections=jvm_options_sections) # Check that all values are parseable. for sec in ['DEFAULT'] + cp.sections(): for key, value in cp.items(sec): value = value.strip() if value.startswith('['): try: custom_types.list_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON list.'.format(key=green(key), section=section(sec))) elif value.startswith('{'): try: custom_types.dict_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON object.'.format(key=green(key), section=section(sec)))
def check_config_file(path): cp = Config.create_parser() with open(path, 'r') as ini: cp.readfp(ini) config = SingleFileConfig(path, cp) print('Checking config file at {0} for unmigrated keys.'.format(path), file=sys.stderr) def section(s): return cyan('[{0}]'.format(s)) for (src_section, src_key), dst in migrations.items(): def has_explicit_option(section, key): # David tried to avoid poking into cp's guts in https://rbcommons.com/s/twitter/r/1451/ but # that approach fails for the important case of boolean options. Since this is a ~short term # tool and its highly likely its lifetime will be shorter than the time the private # ConfigParser_sections API we use here changes, its worth the risk. return cp.has_section(section) and (key in cp._sections[section]) if has_explicit_option(src_section, src_key): if dst is not None: dst_section, dst_key = dst print('Found {src_key} in section {src_section}. Should be {dst_key} in section ' '{dst_section}.'.format(src_key=green(src_key), src_section=section(src_section), dst_key=green(dst_key), dst_section=section(dst_section)), file=sys.stderr) elif (src_section, src_key) not in notes: print('Found {src_key} in section {src_section} and there is no automated migration path' 'for this option. Please consult the ' 'codebase.'.format(src_key=red(src_key), src_section=red(src_section))) if (src_section, src_key) in notes: print(' Note: {0}'.format(yellow(notes[(src_section, src_key)]))) # Check that all values are parseable. for sec in ['DEFAULT'] + cp.sections(): for key, value in cp.items(sec): value = value.strip() if value.startswith('['): try: custom_types.list_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON list.'.format(key=green(key), section=section(sec))) elif value.startswith('{'): try: custom_types.dict_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON object.'.format(key=green(key), section=section(sec)))
def check_config_file(path): config = Config.load(configpaths=[path]) print('Checking config file at {0} for unmigrated keys.'.format(path), file=sys.stderr) def section(s): return cyan('[{0}]'.format(s)) cp = config.configparser for (src_section, src_key), (dst_section, dst_key) in migrations.items(): def has_non_default_option(section, key): return cp.has_option( section, key) and cp.get(section, key) != cp.defaults().get(key, None) if config.has_section(src_section) and has_non_default_option( src_section, src_key): print( 'Found {src_key} in section {src_section}. Should be {dst_key} in section ' '{dst_section}.'.format(src_key=green(src_key), src_section=section(src_section), dst_key=green(dst_key), dst_section=section(dst_section)), file=sys.stderr) if (src_section, src_key) in notes: print(' Note: {0}'.format(notes[(src_section, src_key)])) # Check that all values are parseable. for sec in ['DEFAULT'] + cp.sections(): for key, value in cp.items(sec): value = value.strip() if value.startswith('['): try: custom_types.list_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON list.'.format(key=green(key), section=section(sec))) elif value.startswith('{'): try: custom_types.dict_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON object.'.format(key=green(key), section=section(sec)))
def _do_test(self, expected_val, s): if isinstance(expected_val, dict): val = dict_type(s) elif isinstance(expected_val, (list, tuple)): val = list_type(s) else: raise Exception('Expected value {0} is of unsupported type: {1}'.format(expected_val, type(expected_val))) self.assertEquals(expected_val, val)
def check_config_file(path): cp = Config.create_parser() with open(path, 'r') as ini: cp.readfp(ini) config = SingleFileConfig(path, cp) print('Checking config file at {0} for unmigrated keys.'.format(path), file=sys.stderr) def section(s): return cyan('[{0}]'.format(s)) for (src_section, src_key), (dst_section, dst_key) in migrations.items(): def has_non_default_option(section, key): return cp.has_option(section, key) and cp.get(section, key) != cp.defaults().get(key, None) if config.has_section(src_section) and has_non_default_option(src_section, src_key): print('Found {src_key} in section {src_section}. Should be {dst_key} in section ' '{dst_section}.'.format(src_key=green(src_key), src_section=section(src_section), dst_key=green(dst_key), dst_section=section(dst_section)), file=sys.stderr) if (src_section, src_key) in notes: print(' Note: {0}'.format(notes[(src_section, src_key)])) # Check that all values are parseable. for sec in ['DEFAULT'] + cp.sections(): for key, value in cp.items(sec): value = value.strip() if value.startswith('['): try: custom_types.list_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON list.'.format(key=green(key), section=section(sec))) elif value.startswith('{'): try: custom_types.dict_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON object.'.format(key=green(key), section=section(sec)))
def check_config_file(path): cp = Config.create_parser() with open(path, 'r') as ini: cp.readfp(ini) print('Checking config file at {0} for unmigrated keys.'.format(path), file=sys.stderr) def section(s): return cyan('[{0}]'.format(s)) for src, dst in migrations.items(): check_option(cp, src, dst) # Special-case handling of per-task subsystem options, so we can sweep them up in all # sections easily. def check_task_subsystem_options(subsystem_sec, options_map, sections=None): sections = sections or cp.sections() for src_sec in ['DEFAULT'] + sections: dst_sec = subsystem_sec if src_sec == 'DEFAULT' else '{}.{}'.format( subsystem_sec, src_sec) for src_key, dst_key in options_map.items(): check_option(cp, (src_sec, src_key), (dst_sec, dst_key)) artifact_cache_options_map = { 'read_from_artifact_cache': 'read', 'write_to_artifact_cache': 'write', 'overwrite_cache_artifacts': 'overwrite', 'read_artifact_caches': 'read_from', 'write_artifact_caches': 'write_to', 'cache_compression': 'compression_level', } check_task_subsystem_options('cache', artifact_cache_options_map) jvm_options_map = { 'jvm_options': 'options', 'args': 'program_args', 'debug': 'debug', 'debug_port': 'debug_port', 'debug_args': 'debug_args', } jvm_options_sections = [ 'repl.scala', 'test.junit', 'run.jvm', 'bench', 'doc.javadoc', 'doc.scaladoc' ] check_task_subsystem_options('jvm', jvm_options_map, sections=jvm_options_sections) # Check that all values are parseable. for sec in ['DEFAULT'] + cp.sections(): for key, value in cp.items(sec): value = value.strip() if value.startswith('['): try: custom_types.list_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON list.'.format(key=green(key), section=section(sec))) elif value.startswith('{'): try: custom_types.dict_type(value) except ParseError: print('Value of {key} in section {section} is not a valid ' 'JSON object.'.format(key=green(key), section=section(sec)))