-
-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Formatting & bug fixes #3563
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Formatting & bug fixes #3563
Changes from all commits
Commits
Show all changes
370 commits
Select commit
Hold shift + click to select a range
bf863a8
Merge branch 'main' into nightly
danielhanchen 84ca61f
Merge branch 'main' into nightly
danielhanchen e82fd70
Merge branch 'main' into nightly
danielhanchen c61a21d
Merge branch 'main' into nightly
danielhanchen b56cc1b
Update rl.py
danielhanchen c47f936
Fix CE Loss
danielhanchen 6093c4c
Merge branch 'main' into nightly
danielhanchen 0b896c5
Versioning
danielhanchen 327f517
Merge branch 'main' into nightly
danielhanchen 5b0c47a
Merge branch 'main' into nightly
danielhanchen de5c3b5
Merge branch 'main' into nightly
danielhanchen 7234a62
Update loader.py
danielhanchen 68c1aba
Update loader.py
danielhanchen d07b819
Merge branch 'main' into nightly
danielhanchen 05fc2f2
extract_model_type_from_config
danielhanchen 99c7afb
Model types
danielhanchen fc5d91d
Update loader.py
danielhanchen 702a9ea
get_transformers_model_type
danielhanchen 8ece4a6
Update loader.py
danielhanchen f3ac0e3
Update loader.py
danielhanchen d2b0d41
Update loader.py
danielhanchen e5920fe
Update rl.py
danielhanchen bf0367e
Update pyproject.toml
danielhanchen d2c2cc1
Update loader.py
danielhanchen 337557c
Merge branch 'main' into nightly
danielhanchen b038d5d
Merge branch 'main' into nightly
danielhanchen 39da8b4
Merge branch 'main' into nightly
danielhanchen 35ca177
Update loader.py
danielhanchen 2eaf868
Update loader.py
danielhanchen 7c892e7
Update loader.py
danielhanchen 72ff24c
Versioning
danielhanchen 9654895
Merge branch 'main' into nightly
danielhanchen 227842c
Update _utils.py
danielhanchen 505ae67
Update _utils.py
danielhanchen 80465dc
Update _utils.py
danielhanchen 4150e08
Update _utils.py
danielhanchen 27bae35
Merge branch 'main' into nightly
danielhanchen 7d4bf8d
Merge branch 'main' into nightly
danielhanchen e1f981b
Merge branch 'main' into nightly
danielhanchen 032c2c8
Update vision.py
danielhanchen b105aae
Update vision.py
danielhanchen 400df38
Fix DataParallel
danielhanchen 809a8b3
Update _utils.py
danielhanchen a5c7fa6
Merge branch 'main' into nightly
danielhanchen 78627e5
Merge branch 'main' into nightly
danielhanchen 3dcc091
Update rl.py
danielhanchen 28b1d50
Update synthetic.py
danielhanchen de162d3
Update synthetic.py
danielhanchen a507a7d
Update synthetic.py
danielhanchen cda7263
Update synthetic.py
danielhanchen dd8ad92
Update synthetic.py
danielhanchen a725b98
Update synthetic.py
danielhanchen 321f1a3
Update synthetic.py
danielhanchen 357e501
Update synthetic.py
danielhanchen 8a03656
Update synthetic.py
danielhanchen d7832d0
Update synthetic.py
danielhanchen 84f5434
Update synthetic.py
danielhanchen 17b2e98
Update synthetic.py
danielhanchen 58f658e
Merge branch 'main' into nightly
danielhanchen 5364138
Update mapper.py
danielhanchen 8dbd008
Versioning
danielhanchen 256f8fe
Merge branch 'main' into nightly
danielhanchen d7ca79f
Update loader.py
danielhanchen bb90785
Update loader.py
danielhanchen 3289826
Update rl.py
danielhanchen a042114
Versioning
danielhanchen dfa91f7
Merge branch 'main' into nightly
danielhanchen ffa04dd
Update _utils.py
danielhanchen b365444
Fix auto_mapping
danielhanchen c60dfb0
Merge branch 'main' into nightly
danielhanchen bbb8252
Merge branch 'main' into nightly
danielhanchen f88e880
Merge branch 'main' into nightly
danielhanchen 5ce7bf8
Update loader.py
danielhanchen 755e6e2
Update loader.py
danielhanchen d01b8af
Update vision.py
danielhanchen d048d3a
Update vision.py
danielhanchen 81ba78e
Update loader.py
danielhanchen 0bb74fe
Message
danielhanchen 14fdb22
Update vision.py
danielhanchen ce4f2b6
Update loader.py
danielhanchen e333b03
Update vision.py
danielhanchen 456d225
cache_implementation
danielhanchen 1cd7b85
Update vision.py
danielhanchen 2b0d219
Update loader.py
danielhanchen d1c9283
Update vision.py
danielhanchen a0df6ab
Update vision.py
danielhanchen 450b2da
Update vision.py
danielhanchen b1116d5
Update loader.py
danielhanchen 7210cb1
Update vision.py
danielhanchen f148170
Save max_seq_length
danielhanchen 7fa66da
Update _utils.py
danielhanchen 0b49db1
Update rl.py
danielhanchen f1c47f8
Update vision.py
danielhanchen 27f6203
Update llama.py
danielhanchen f06179f
Mistral3 vllm (#3349)
Datta0 67a544d
Set padding to 0
danielhanchen 7238327
Fix patch
danielhanchen 8a1e6fb
fixup patch (#3359)
danielhanchen f0ec1ae
Update vision.py
danielhanchen a64a3b2
Versioning
danielhanchen 1b7640b
Update vision.py
danielhanchen f5c4385
Update vision.py
danielhanchen 8438a76
Update vision.py
danielhanchen 5867273
Update vision.py
danielhanchen 7b2bef1
Update vision.py
danielhanchen 82a7697
Update vision.py
danielhanchen aa9b200
Update vision.py
danielhanchen eb1df23
Update vision.py
danielhanchen 563aa35
Update vision.py
danielhanchen 4bfde2e
Update vision.py
danielhanchen d6beafe
MXFP4 dequant
danielhanchen 19cfe1b
Update loader.py
danielhanchen 63a7f65
Update vision.py
danielhanchen df5282b
load_in_16bit
danielhanchen e7174b1
Update vision.py
danielhanchen ffe5aca
Update vision.py
danielhanchen 81356cc
Update vision.py
danielhanchen 2313ea9
Update rl.py
danielhanchen 0c18d86
Update vision.py
danielhanchen 19017fd
offload_embedding
danielhanchen 77fca79
Update vision.py
danielhanchen 92084ba
Update vision.py
danielhanchen 499f939
Update vision.py
danielhanchen 402af41
Merge branch 'main' into nightly
danielhanchen 07723f5
Merge branch 'main' into nightly
danielhanchen 7a499e4
Merge branch 'main' into nightly
danielhanchen fffcea8
Merge branch 'main' into nightly
danielhanchen f72c0a9
Update vision.py
danielhanchen 2a7cfa0
Update vision.py
danielhanchen 2577d81
Update vision.py
danielhanchen 1eee987
Update rl_replacements.py
danielhanchen e7f3170
Merge branch 'main' into nightly
danielhanchen 1edc796
Update loader.py
danielhanchen 205d09c
Fix padding issue
danielhanchen 07cc6ed
Update pyproject.toml
danielhanchen d225f7f
Update _utils.py
danielhanchen 5d6c3d9
Update pyproject.toml
danielhanchen af56af3
Update _utils.py
danielhanchen ad080bb
Merge branch 'main' into nightly
danielhanchen eb2d403
Update vision.py
danielhanchen 9bc76e8
Update vision.py
danielhanchen a0425bb
Update vision.py
danielhanchen b0ba73c
Update vision.py
danielhanchen f85a91a
Update vision.py
danielhanchen 80dce6b
Merge branch 'main' into nightly
danielhanchen 47f2ef7
Update vision.py
danielhanchen 06fc86f
New models
danielhanchen dcf22c8
Merge branch 'main' into nightly
danielhanchen ca3426a
Merge branch 'main' into nightly
danielhanchen 8a09a7d
Merge branch 'main' into nightly
danielhanchen 20b9202
Merge branch 'main' into nightly
danielhanchen 778da7d
Update llama.py
danielhanchen ed443ee
Versioning
danielhanchen da00e2f
Update _utils.py
danielhanchen 250ea60
Update llama.py
danielhanchen a921ea6
Update _utils.py
danielhanchen f1e76eb
Merge branch 'main' into nightly
danielhanchen c90df87
Update llama.py
danielhanchen c64f011
Fix AMD
danielhanchen 8eecf7d
Update _utils.py
danielhanchen c22b9a3
Update llama.py
danielhanchen 38b9e00
Update vision.py
danielhanchen b99dcd5
DEVICE_TYPE_TORCH
danielhanchen 19bc977
Update __init__.py
danielhanchen 5aa6a39
Update __init__.py
danielhanchen 597cf05
Merge branch 'main' into nightly
danielhanchen cbeb4be
Merge branch 'main' into nightly
danielhanchen 0576c13
Update _utils.py
danielhanchen ee46343
Move DEVICE_TYPE
danielhanchen 09fd925
Update rl_replacements.py
danielhanchen bd22cb1
Update loader.py
danielhanchen 9fe4d31
AMD install script
danielhanchen 3026498
Move AMD
danielhanchen c8150dc
Update _amd_install.sh
danielhanchen f25c365
Update pyproject.toml
danielhanchen 2b470fd
Merge branch 'main' into nightly
danielhanchen 315c2cf
Update pyproject.toml
danielhanchen b5d3df8
Delete _amd_install.sh
danielhanchen 55dd1f6
Update device_type.py
danielhanchen 0960fe4
Update loader.py
danielhanchen cb8c2bb
Merge branch 'main' into nightly
danielhanchen 5f0d9fa
Update _utils.py
danielhanchen 1f726a4
Update _utils.py
danielhanchen 8d29c64
Update _utils.py
danielhanchen 0e9fb1d
Update _utils.py
danielhanchen 9950e27
Update _utils.py
danielhanchen d995f71
Update tokenizer_utils.py
danielhanchen c4db81b
Versioning
danielhanchen ea37dd6
Update pyproject.toml
danielhanchen 5ff7234
Update loader.py
danielhanchen 47c2dd6
Update _utils.py
danielhanchen ead800e
Update pyproject.toml
danielhanchen 2dc2420
Update pyproject.toml
danielhanchen eba9bb3
Update _utils.py
danielhanchen 3c3765c
Update pyproject.toml
danielhanchen 367d6dc
Update _utils.py
danielhanchen ca3f688
Update _utils.py
danielhanchen f6dd92b
Update loader.py
danielhanchen 1393bd8
Update _utils.py
danielhanchen 0da8129
Update _utils.py
danielhanchen 0a2ce91
local_files_only
danielhanchen c9f5c1a
Cut Cross Entropy
danielhanchen 7613541
Update llama.py
danielhanchen df98380
Merge branch 'main' into nightly
danielhanchen 2014012
Merge branch 'main' into nightly
danielhanchen e7572ea
Merge branch 'main' into nightly
danielhanchen f21d215
Merge branch 'main' into nightly
danielhanchen 764fafb
Merge branch 'main' into nightly
danielhanchen 79a62ee
Merge branch 'main' into nightly
danielhanchen fe7227b
Merge branch 'main' into nightly
danielhanchen 0965781
Update vision.py
danielhanchen 6bf04ce
Update vision.py
danielhanchen 7ea715e
Update vision.py
danielhanchen dbe1eae
Merge branch 'main' into nightly
danielhanchen 97f2a84
Merge branch 'main' into nightly
danielhanchen 1d5ed23
Qwen 3 VL vLLM (#3489)
Datta0 9e71dd9
Update __init__.py
danielhanchen d3aa31e
patch_torchao
danielhanchen 65ba577
torchao_logger
danielhanchen 59e8eb8
Merge branch 'main' into nightly
danielhanchen c79e957
Update rl_replacements.py
danielhanchen df8763f
Fix
danielhanchen 716e71c
Update rl.py
danielhanchen a3ed184
Update rl.py
danielhanchen 549dfb4
Update rl.py
danielhanchen fc3a577
Update rl.py
danielhanchen 839ccbf
Update _utils.py
danielhanchen 6cd3f52
Versioning
danielhanchen 9503f41
Merge branch 'main' into nightly
danielhanchen 3f69cd9
fbgemm fp8 block quant support (>=1.4.0) (#3531)
Datta0 3457e5d
Merge branch 'main' into nightly
danielhanchen 695c102
Update vision.py
danielhanchen 6b8800a
Update vision.py
danielhanchen 10ccdfa
Update rl.py
danielhanchen fcc3cfd
vllm_sampling_params
danielhanchen fdf7386
Update rl.py
danielhanchen 40ab8d9
Update rl.py
danielhanchen cef4478
Update rl.py
danielhanchen 237124a
Merge branch 'main' into nightly
danielhanchen 2dcb6d5
Add `ruff` pre-commit hook and apply it (#3424)
djsaunde 1eee851
Fix
danielhanchen 072ad9f
Update fp8.py
danielhanchen 86cbcbd
Revert ruff on some files
danielhanchen dca55eb
Update
danielhanchen 4d32613
force-exclude = true
djsaunde 7c33425
Datasets issue
danielhanchen 91843ce
Ruff
danielhanchen 6adb1d0
Remove mapper
danielhanchen ddd0994
Update mapper.py
danielhanchen 4f4d354
Update pyproject.toml
danielhanchen File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| name: pre-commit | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
|
|
||
| jobs: | ||
| pre-commit: | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: '3.11' | ||
|
|
||
| - name: Install pre-commit | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install pre-commit | ||
|
|
||
| - name: Run pre-commit | ||
| run: pre-commit run --all-files | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -170,6 +170,7 @@ cython_debug/ | |
|
|
||
| # Ruff stuff: | ||
| .ruff_cache/ | ||
| .pre-commit-cache/ | ||
|
|
||
| # PyPI configuration file | ||
| .pypirc | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| repos: | ||
| - repo: https://github.com/astral-sh/ruff-pre-commit | ||
| rev: v0.14.0 | ||
| hooks: | ||
| - id: ruff | ||
| args: | ||
| - --fix | ||
| - --exit-non-zero-on-fix | ||
| - repo: local | ||
| hooks: | ||
| - id: ruff-format-with-kwargs | ||
| name: Ruff format with kwarg spacing | ||
| entry: scripts/run_ruff_format.py | ||
| language: python | ||
| types: [python] | ||
| additional_dependencies: | ||
| - ruff==0.6.9 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,179 @@ | ||
| #!/usr/bin/env python3 | ||
| """Ensure keyword arguments use spaces around '=', prune redundant pass statements.""" | ||
|
|
||
| from __future__ import annotations | ||
|
|
||
| import ast | ||
| import argparse | ||
| import io | ||
| import sys | ||
| import tokenize | ||
| from collections import defaultdict | ||
| from pathlib import Path | ||
|
|
||
|
|
||
| def enforce_spacing(text: str) -> tuple[str, bool]: | ||
| """Return updated text with keyword '=' padded by spaces, plus change flag.""" | ||
| lines = text.splitlines(keepends=True) | ||
| if not lines: | ||
| return text, False | ||
|
|
||
| offsets: dict[int, int] = defaultdict(int) | ||
| changed = False | ||
|
|
||
| reader = io.StringIO(text).readline | ||
| for token in tokenize.generate_tokens(reader): | ||
| if token.type != tokenize.OP or token.string != "=": | ||
| continue | ||
|
|
||
| line_index = token.start[0] - 1 | ||
| col = token.start[1] + offsets[line_index] | ||
|
|
||
| if line_index < 0 or line_index >= len(lines): | ||
| continue | ||
|
|
||
| line = lines[line_index] | ||
| if col >= len(line) or line[col] != "=": | ||
| continue | ||
|
|
||
| line_changed = False | ||
|
|
||
| # Insert a space before '=' when missing and not preceded by whitespace. | ||
| if col > 0 and line[col - 1] not in {" ", "\t"}: | ||
| line = f"{line[:col]} {line[col:]}" | ||
| offsets[line_index] += 1 | ||
| col += 1 | ||
| line_changed = True | ||
| changed = True | ||
|
|
||
| # Insert a space after '=' when missing and not followed by whitespace or newline. | ||
| next_index = col + 1 | ||
| if next_index < len(line) and line[next_index] not in {" ", "\t", "\n", "\r"}: | ||
| line = f"{line[:next_index]} {line[next_index:]}" | ||
| offsets[line_index] += 1 | ||
| line_changed = True | ||
| changed = True | ||
|
|
||
| if line_changed: | ||
| lines[line_index] = line | ||
|
|
||
| if not changed: | ||
| return text, False | ||
|
|
||
| return "".join(lines), True | ||
|
|
||
|
|
||
| def remove_redundant_passes(text: str) -> tuple[str, bool]: | ||
| """Drop pass statements that share a block with other executable code.""" | ||
|
|
||
| try: | ||
| tree = ast.parse(text) | ||
| except SyntaxError: | ||
| return text, False | ||
|
|
||
| redundant: list[ast.Pass] = [] | ||
|
|
||
| def visit(node: ast.AST) -> None: | ||
| for attr in ("body", "orelse", "finalbody"): | ||
| value = getattr(node, attr, None) | ||
| if not isinstance(value, list) or len(value) <= 1: | ||
| continue | ||
| for stmt in value: | ||
| if isinstance(stmt, ast.Pass): | ||
| redundant.append(stmt) | ||
| for stmt in value: | ||
| if isinstance(stmt, ast.AST): | ||
| visit(stmt) | ||
| handlers = getattr(node, "handlers", None) | ||
| if handlers: | ||
| for handler in handlers: | ||
| visit(handler) | ||
|
|
||
| visit(tree) | ||
|
|
||
| if not redundant: | ||
| return text, False | ||
|
|
||
| lines = text.splitlines(keepends=True) | ||
| changed = False | ||
|
|
||
| for node in sorted( | ||
| redundant, key=lambda item: (item.lineno, item.col_offset), reverse=True | ||
| ): | ||
| start = node.lineno - 1 | ||
| end = (node.end_lineno or node.lineno) - 1 | ||
| if start >= len(lines): | ||
| continue | ||
| changed = True | ||
| if start == end: | ||
| line = lines[start] | ||
| col_start = node.col_offset | ||
| col_end = node.end_col_offset or (col_start + 4) | ||
| segment = line[:col_start] + line[col_end:] | ||
| lines[start] = segment if segment.strip() else "" | ||
| continue | ||
|
|
||
| # Defensive fall-back for unexpected multi-line 'pass'. | ||
| prefix = lines[start][: node.col_offset] | ||
| lines[start] = prefix if prefix.strip() else "" | ||
| for idx in range(start + 1, end): | ||
| lines[idx] = "" | ||
| suffix = lines[end][(node.end_col_offset or 0) :] | ||
| lines[end] = suffix | ||
|
|
||
| # Normalise to ensure lines end with newlines except at EOF. | ||
| result_lines: list[str] = [] | ||
| for index, line in enumerate(lines): | ||
| if not line: | ||
| continue | ||
| if index < len(lines) - 1 and not line.endswith("\n"): | ||
| result_lines.append(f"{line}\n") | ||
| else: | ||
| result_lines.append(line) | ||
|
|
||
| return "".join(result_lines), changed | ||
|
|
||
|
|
||
| def process_file(path: Path) -> bool: | ||
| try: | ||
| with tokenize.open(path) as handle: | ||
| original = handle.read() | ||
| encoding = handle.encoding | ||
| except (OSError, SyntaxError) as exc: # SyntaxError from tokenize on invalid python | ||
| print(f"Failed to read {path}: {exc}", file=sys.stderr) | ||
| return False | ||
|
|
||
| updated, changed = enforce_spacing(original) | ||
| updated, removed = remove_redundant_passes(updated) | ||
| if changed or removed: | ||
| path.write_text(updated, encoding=encoding) | ||
| return True | ||
| return False | ||
|
|
||
|
|
||
| def main(argv: list[str]) -> int: | ||
| parser = argparse.ArgumentParser(description=__doc__) | ||
| parser.add_argument("files", nargs="+", help="Python files to fix") | ||
| args = parser.parse_args(argv) | ||
|
|
||
| touched: list[Path] = [] | ||
| self_path = Path(__file__).resolve() | ||
|
|
||
| for entry in args.files: | ||
| path = Path(entry) | ||
| # Skip modifying this script to avoid self-edit loops. | ||
| if path.resolve() == self_path: | ||
| continue | ||
| if not path.exists() or path.is_dir(): | ||
| continue | ||
| if process_file(path): | ||
| touched.append(path) | ||
|
|
||
| if touched: | ||
| for path in touched: | ||
| print(f"Adjusted kwarg spacing in {path}") | ||
| return 0 | ||
|
|
||
|
|
||
| if __name__ == "__main__": | ||
| sys.exit(main(sys.argv[1:])) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| #!/usr/bin/env python3 | ||
| """Run `ruff format` followed by kwarg spacing enforcement.""" | ||
|
|
||
| from __future__ import annotations | ||
|
|
||
| import subprocess | ||
| import sys | ||
| from pathlib import Path | ||
|
|
||
| HERE = Path(__file__).resolve().parent | ||
|
|
||
|
|
||
| def main(argv: list[str]) -> int: | ||
| files = [arg for arg in argv if Path(arg).exists()] | ||
| if not files: | ||
| return 0 | ||
|
|
||
| ruff_cmd = [sys.executable, "-m", "ruff", "format", *files] | ||
| ruff_proc = subprocess.run(ruff_cmd) | ||
| if ruff_proc.returncode != 0: | ||
| return ruff_proc.returncode | ||
|
|
||
| spacing_script = HERE / "enforce_kwargs_spacing.py" | ||
| spacing_cmd = [sys.executable, str(spacing_script), *files] | ||
| spacing_proc = subprocess.run(spacing_cmd) | ||
| return spacing_proc.returncode | ||
|
|
||
|
|
||
| if __name__ == "__main__": | ||
| raise SystemExit(main(sys.argv[1:])) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.