Exemple #1
0
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)