def fstringify_code_by_line(code, stats=False, debug=False): raw_code_lines = code.split("\n") no_skip_range, scopes_by_idx = no_skipping(code) result_lines = [] for line_idx, raw_line in enumerate(raw_code_lines): lineno = line_idx + 1 if line_idx not in no_skip_range: result_lines.append(raw_line) continue if line_idx not in scopes_by_idx: continue scoped = scopes_by_idx[line_idx] code_line, meta = fstringify_code("\n".join(scoped["strip_scope"]), include_meta=True, debug=debug) if not meta["changed"]: if debug: print("~~~~NOT CHANGED", scoped["raw_scope"], "meta", meta) result_lines += scoped["raw_scope"] continue code_line = force_double_quote_fstring(code_line) code_line_parts = code_line.strip().split("\n") indie = "" indent = scoped["indent"] indie = rebuild_transformed_lines(code_line, scoped["indent"]) result_lines.append(indie) final_code = "\n".join(result_lines) return final_code
def fstringify_code_by_line(code, stats=False, debug=False): raw_code_lines = code.split("\n") no_skip_range = [] scopes_by_idx = {} for positions in get_str_bin_op_lines(code): # for start, end in positions: if not positions: continue start, end = positions start_idx = start - 1 raw_scope = raw_code_lines[start_idx:end] if not raw_scope: continue strip_scope = map(lambda x: x.strip(), raw_scope) scopes_by_idx[start_idx] = dict( raw_scope=raw_scope, strip_scope=strip_scope, indent=get_indent(raw_scope[0]), ) no_skip_range += list(range(start_idx, end)) result_lines = [] for line_idx, raw_line in enumerate(raw_code_lines): lineno = line_idx + 1 indented = get_indent(raw_line) if line_idx not in no_skip_range: result_lines.append(raw_line) continue if line_idx not in scopes_by_idx: continue scoped = scopes_by_idx[line_idx] code_line, meta = fstringify_code("\n".join(scoped["strip_scope"]), include_meta=True, debug=debug) if not meta["changed"]: if debug: print("~~~~NOT CHANGED", scoped["raw_scope"], "meta", meta) result_lines += scoped["raw_scope"] continue code_line = force_double_quote_fstring(code_line) code_line_parts = code_line.strip().split("\n") indie = "" indent = scoped["indent"] for idx, cline in enumerate(code_line_parts): code_line_strip = cline.lstrip() # if change_add else cline if idx == 0: indie = indent + code_line_strip else: if (indie.endswith(",") or indie.endswith("else") or indie.endswith("for") or indie.endswith("in") or indie.endswith("not")): indie += " " indie += cline.strip() # else: # indie += cline.strip() result_lines.append(indie) final_code = "\n".join(result_lines) return final_code
def test_force_double_quote_fstring_edge4(self): code = " print('damnf', f'asdf: {asdf}')" expected = " print('damnf', f\"asdf: {asdf}\")" result = force_double_quote_fstring(code) self.assertCodeEqual(result, expected)
def test_force_double_quote_fstring_edge2(self): code = "print('asdf')" expected = "print('asdf')" self.assertCodeEqual(force_double_quote_fstring(code), expected)
def test_force_double_quote_fstring_has_double(self): code = "f'a val: {self.a} \"b\" val: {self.b}'" expected = "f'a val: {self.a} \"b\" val: {self.b}'" self.assertCodeEqual(force_double_quote_fstring(code), expected)
def test_force_double_quote_fstring(self): code = " f'a val: {self.a} b val: {self.b}'" expected = ' f"a val: {self.a} b val: {self.b}"' self.assertCodeEqual(force_double_quote_fstring(code), expected)