def test_has_depth_max_three(self): config = { "robot": { "controller": { "kp": 10, "ki": 0.1, }, "so": 1337, } } expected_code = [ "struct {", " parameter_namespace_t ns;", " struct {", " parameter_namespace_t ns;", " struct {", " parameter_namespace_t ns;", " parameter_t kp;", " parameter_t ki;", " } controller;", " parameter_t so;", " } robot;", "} config;", ] tree = parse_tree(config).to_struct().split("\n") self.assertEqual(tree, expected_code)
def test_has_depth_max_three(self): config = { 'robot': { 'controller': { 'kp': 10, 'ki': 0.1, }, 'so': 1337, } } expected_code = [ 'void config_init(void)', '{', ' parameter_namespace_declare(&config.ns, NULL, NULL);', ' parameter_namespace_declare(&config.robot.ns, &config.ns, "robot");', ' parameter_namespace_declare(&config.robot.controller.ns, &config.robot.ns, "controller");', ' parameter_integer_declare(&config.robot.controller.kp, &config.robot.controller.ns, "kp");', ' parameter_scalar_declare(&config.robot.controller.ki, &config.robot.controller.ns, "ki");', ' parameter_integer_declare(&config.robot.so, &config.robot.ns, "so");', '}', ] tree = parse_tree(config).to_init_code().split('\n') self.assertEqual(tree, expected_code)
def main(): args = parse_args() previous_code = None for file in args.config_file: config = yaml.load(file) config = sanitize_keys(config) config = { 'master': config['master'] } # Only generate code for master config tree = parse_tree(config) code = '' code += '#include "config.h"\n' code += '\n' code += 'static ' + tree.to_struct() code += '\n' code += '\n' code += tree.to_init_code('config_master_init') if previous_code is None: previous_code = code elif code != previous_code: raise RuntimeError('Input YAML files do not yield the same code!') args.output.write(code)
def test_has_depth_max_three(self): config = { 'robot': { 'controller': { 'kp': 10, 'ki': 0.1, }, 'so': 1337, } } expected_code = [ 'struct {', ' parameter_namespace_t ns;', ' struct {', ' parameter_namespace_t ns;', ' struct {', ' parameter_namespace_t ns;', ' parameter_t kp;', ' parameter_t ki;', ' } controller;', ' parameter_t so;', ' } robot;', '} config;', ] tree = parse_tree(config).to_struct().split('\n') self.assertEqual(tree, expected_code)
def test_has_depth_max_three(self): config = { "robot": { "controller": { "kp": 10, "ki": 0.1, }, "so": 1337, } } expected_code = [ "void config_init(void)", "{", " parameter_namespace_declare(&config.ns, NULL, NULL);", ' parameter_namespace_declare(&config.robot.ns, &config.ns, "robot");', ' parameter_namespace_declare(&config.robot.controller.ns, &config.robot.ns, "controller");', ' parameter_integer_declare(&config.robot.controller.kp, &config.robot.controller.ns, "kp");', ' parameter_scalar_declare(&config.robot.controller.ki, &config.robot.controller.ns, "ki");', ' parameter_integer_declare(&config.robot.so, &config.robot.ns, "so");', "}", ] tree = parse_tree(config).to_init_code().split("\n") self.assertEqual(tree, expected_code)
def test_is_empty_struct(self): config = {} expected_code = [ 'struct {', ' parameter_namespace_t ns;', '} config;', ] tree = parse_tree(config).to_struct().split('\n') self.assertEqual(tree, expected_code)
def test_is_empty_struct(self): config = {} expected_code = [ "struct {", " parameter_namespace_t ns;", "} config;", ] tree = parse_tree(config).to_struct().split("\n") self.assertEqual(tree, expected_code)
def test_has_one_entry(self): config = {"answer": 42} expected_code = [ "struct {", " parameter_namespace_t ns;", " parameter_t answer;", "} config;", ] tree = parse_tree(config).to_struct().split("\n") self.assertEqual(tree, expected_code)
def test_replaces_dash_in_entry_name_with_underscore(self): config = {"the-answer": 42} expected_code = [ "struct {", " parameter_namespace_t ns;", " parameter_t the_answer;", "} config;", ] tree = parse_tree(config).to_struct().split("\n") self.assertEqual(tree, expected_code)
def test_is_empty_struct(self): config = {} expected_code = [ 'void config_init(void)', '{', ' parameter_namespace_declare(&config.ns, NULL, NULL);', '}', ] tree = parse_tree(config).to_init_code().split('\n') self.assertEqual(tree, expected_code)
def test_replaces_dash_in_entry_name_with_underscore(self): config = {'the-answer': 42} expected_code = [ 'struct {', ' parameter_namespace_t ns;', ' parameter_t the_answer;', '} config;', ] tree = parse_tree(config).to_struct().split('\n') self.assertEqual(tree, expected_code)
def test_has_one_entry(self): config = {'answer': 42} expected_code = [ 'struct {', ' parameter_namespace_t ns;', ' parameter_t answer;', '} config;', ] tree = parse_tree(config).to_struct().split('\n') self.assertEqual(tree, expected_code)
def test_is_empty_struct(self): config = {} expected_code = [ "void config_init(void)", "{", " parameter_namespace_declare(&config.ns, NULL, NULL);", "}", ] tree = parse_tree(config).to_init_code().split("\n") self.assertEqual(tree, expected_code)
def test_has_one_string_entry(self): config = {'answer': '42'} expected_code = [ 'void config_init(void)', '{', ' parameter_namespace_declare(&config.ns, NULL, NULL);', ' parameter_string_declare(&config.answer, &config.ns, "answer", config.answer_buffer, sizeof(config.answer_buffer));', '}', ] tree = parse_tree(config).to_init_code().split('\n') self.assertEqual(tree, expected_code)
def test_has_one_integer_entry(self): config = {"answer": 42} expected_code = [ "void config_init(void)", "{", " parameter_namespace_declare(&config.ns, NULL, NULL);", ' parameter_integer_declare(&config.answer, &config.ns, "answer");', "}", ] tree = parse_tree(config).to_init_code().split("\n") self.assertEqual(tree, expected_code)
def test_replaces_dash_in_entry_name_with_underscore(self): config = {"the-answer": 42} expected_code = [ "void config_init(void)", "{", " parameter_namespace_declare(&config.ns, NULL, NULL);", ' parameter_integer_declare(&config.the_answer, &config.ns, "the-answer");', "}", ] tree = parse_tree(config).to_init_code().split("\n") self.assertEqual(tree, expected_code)
def test_has_one_string_entry(self): config = {"answer": "42"} expected_code = [ "void config_init(void)", "{", " parameter_namespace_declare(&config.ns, NULL, NULL);", ' parameter_string_declare(&config.answer, &config.ns, "answer", config.answer_buffer, sizeof(config.answer_buffer));', "}", ] tree = parse_tree(config).to_init_code().split("\n") self.assertEqual(tree, expected_code)
def test_has_one_integer_entry(self): config = {'answer': 42} expected_code = [ 'void config_init(void)', '{', ' parameter_namespace_declare(&config.ns, NULL, NULL);', ' parameter_integer_declare(&config.answer, &config.ns, "answer");', '}', ] tree = parse_tree(config).to_init_code().split('\n') self.assertEqual(tree, expected_code)
def test_replaces_dash_in_entry_name_with_underscore(self): config = {'the-answer': 42} expected_code = [ 'void config_init(void)', '{', ' parameter_namespace_declare(&config.ns, NULL, NULL);', ' parameter_integer_declare(&config.the_answer, &config.ns, "the-answer");', '}', ] tree = parse_tree(config).to_init_code().split('\n') self.assertEqual(tree, expected_code)
def test_has_one_namespace_with_entries(self): config = { "controller": { "kp": 10, "ki": 0.1, } } expected_code = [ "void config_init(void)", "{", " parameter_namespace_declare(&config.ns, NULL, NULL);", ' parameter_namespace_declare(&config.controller.ns, &config.ns, "controller");', ' parameter_integer_declare(&config.controller.kp, &config.controller.ns, "kp");', ' parameter_scalar_declare(&config.controller.ki, &config.controller.ns, "ki");', "}", ] tree = parse_tree(config).to_init_code().split("\n") self.assertEqual(tree, expected_code)
def test_has_one_namespace_with_entries(self): config = { 'controller': { 'kp': 10, 'ki': 0.1, } } expected_code = [ 'void config_init(void)', '{', ' parameter_namespace_declare(&config.ns, NULL, NULL);', ' parameter_namespace_declare(&config.controller.ns, &config.ns, "controller");', ' parameter_integer_declare(&config.controller.kp, &config.controller.ns, "kp");', ' parameter_scalar_declare(&config.controller.ki, &config.controller.ns, "ki");', '}', ] tree = parse_tree(config).to_init_code().split('\n') self.assertEqual(tree, expected_code)
def test_has_one_namespace_with_entries(self): config = { 'controller': { 'kp': 10, 'ki': 0.1, } } expected_code = [ 'struct {', ' parameter_namespace_t ns;', ' struct {', ' parameter_namespace_t ns;', ' parameter_t kp;', ' parameter_t ki;', ' } controller;', '} config;', ] tree = parse_tree(config).to_struct().split('\n') self.assertEqual(tree, expected_code)
def test_has_one_namespace_with_entries(self): config = { "controller": { "kp": 10, "ki": 0.1, } } expected_code = [ "struct {", " parameter_namespace_t ns;", " struct {", " parameter_namespace_t ns;", " parameter_t kp;", " parameter_t ki;", " } controller;", "} config;", ] tree = parse_tree(config).to_struct().split("\n") self.assertEqual(tree, expected_code)
def main(): args = parse_args() previous_code = None for file in args.config_file: config = yaml.safe_load(file) config = sanitize_keys(config) config = {"master": config["master"]} # Only generate code for master config tree = parse_tree(config) code = "" code += '#include "config.h"\n' code += "\n" code += "static " + tree.to_struct() code += "\n" code += "\n" code += tree.to_init_code("config_master_init") if previous_code is None: previous_code = code elif code != previous_code: raise RuntimeError("Input YAML files do not yield the same code!") args.output.write(code)
def test_throws_on_list_entry(self): config = {"answer": [1, 2, 3]} with self.assertRaises(TypeError): parse_tree(config).to_init_code()