Repository navigation
Major overhaul of documentation #84
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
Changes from all commits
Commits
Show all changes
152 commits
Select commit
Hold shift + click to select a range
a25f49a
Add initial version of AGENTS.md
bgroenks96 dd2327a
Add more docs for soil types/method interfaces
bgroenks96 65288db
Add getter for soil thermal properties
bgroenks96 b67e49d
Move soil process abstract types into separate files
bgroenks96 c196916
Add process interface stubs for soil energy/hydrology
bgroenks96 c1a8307
Initial rewrite of doc pages (still WIP)
bgroenks96 0f9a326
Minor update to abstract type interfaces
bgroenks96 0fc95b4
Minor tweaks to headings in energy/hydrology docs
bgroenks96 45a35fb
Add force = true to example notebook `mv`
bgroenks96 e267c96
Minor clean up of soil stratigraphy types
bgroenks96 671f898
Initial version of doc page on soil stratigraphy
bgroenks96 2174b31
Add initial version of docs for photosynthesis
bgroenks96 6709f19
Minor refactoring of photosynethsis code
bgroenks96 d93ab7a
Minor refactoring of phenology
bgroenks96 a93bacd
Add initial drafts of vegetation docs
bgroenks96 e0a28ad
Update include for vegetation_carbon.jl
bgroenks96 60a2dfb
Add missing docstrings and fix errors in docs
bgroenks96 deeec54
Fix outdated tests
bgroenks96 10e2ef0
Fix tests
bgroenks96 eafd689
Add RingGrids and CUDA to docs deps
bgroenks96 fb1f896
More docs/test fixes
bgroenks96 b4fce46
Add more rules to AGENTS.md
bgroenks96 82b057b
Add initial drafts of doc pages for SEB
bgroenks96 776f714
Update time units on variables for autotrophic respiration
bgroenks96 d39294c
Minor formatting changes in SEB code
bgroenks96 87d5351
Fix issues in SEB doc pages
bgroenks96 d995d54
Fix constructors in doc example blocks
bgroenks96 8a1fc69
Fix inconsistent unit for NPP in carbon dynamics
bgroenks96 404459d
Remote notebook doc pages form source control
bgroenks96 b767d2b
Add initial doc pages drafts for surface hydrology
bgroenks96 99da401
Fix issues with surface hydrology docs
bgroenks96 6d82ec7
Add initialization and timestepping sections to basic concepts
bgroenks96 08e7c8a
Fix timestepper ctor in doc example
bgroenks96 354ba51
Add initial version of soil model doc page
bgroenks96 8b464a8
Update docs/src/extending/core_interfaces.md
bgroenks96 ff73697
Update docs/src/extending/core_interfaces.md
bgroenks96 7994987
Update docs/src/introduction/basic_concepts.md
bgroenks96 0707ee3
Update docs/src/introduction/basic_concepts.md
bgroenks96 83e4ad9
Fix typos
bgroenks96 cc4fad3
Update docs/src/extending/core_interfaces.md
bgroenks96 ef84c04
Change 'early prototype' to 'prototype'
bgroenks96 22414ec
Fix incorrect branch name in git hook
bgroenks96 584f7d4
Update README
bgroenks96 61ee1fa
Fix more typos and add note about interfaces
bgroenks96 21aee49
Update docs/src/introduction/basic_concepts.md
bgroenks96 73e84bb
Fix yet more typos
bgroenks96 c6ad51a
Make var summary string more compact
bgroenks96 f7ef10d
Restructure soil hydrology doc page
bgroenks96 91cf8c4
Merge branch 'main' into bg/update-docs
bgroenks96 ae0ceb3
Fix doc build issues
bgroenks96 a491447
Improve initialization section in intro doc page
bgroenks96 5be9679
Fix draft mode for docs
bgroenks96 6a78eb5
Rewrite documentation for photosynthesis
mahabadri b54cd0d
Reorganize sections
mahabadri c5b18e8
More improvements to soil docs
bgroenks96 f8b3727
Add missing setup block to photosynthesis doc page
bgroenks96 9e9544e
Improve SEB docs
bgroenks96 b669600
Add section on building the docs
bgroenks96 12b17f5
Re-order models and processes in nav bar
bgroenks96 90a9de3
More tweaks to soil docs
bgroenks96 3831f30
Add missing docstrings and fix crossrefs
bgroenks96 151e133
Add doc pages for atmosphere and physics utils
bgroenks96 17cb788
Add table of constants to PhysicalConstants doc page
bgroenks96 4db4ee3
Update table of contents and move examples
bgroenks96 6fbb129
Update surface hydrology docs
bgroenks96 87c4f64
Remove process pages from ToC
bgroenks96 e239dda
Rewrite stomatal conductance documentation
mahabadri 28fb9a0
Fix phototsynthesis docs
mahabadri 2e2d127
Rewrite autotrophic respiration documentation
mahabadri df403fa
Add missing setup block to stomatal conductance doc page
bgroenks96 315f774
Rewrite phenology documentation
mahabadri c372e1f
Update photosynthesis docs
mahabadri f0a1290
Restructure paw and root_dist docs
mahabadri 0f65c0b
Update docs/src/index.md
bgroenks96 12fa277
Update docs/src/index.md
bgroenks96 a44ecd4
Update docs/src/introduction/basic_concepts.md
bgroenks96 2a577e2
Update docs/src/processes/soil/soil_stratigraphy.md
bgroenks96 5923782
Restructure veg_dynamics + carbon_dynamics docs
mahabadri 30fe3b0
Rewrite carbon dynamics docs
mahabadri 5e75e0a
Update docs/src/processes/surface_hydrology/surface_hydrology.md
bgroenks96 2be6c3b
Update docs/src/processes/vegetation/photosynthesis.md
bgroenks96 74009b7
Update docs/src/processes/surface_hydrology/canopy_interception.md
bgroenks96 4802aee
Update docs/src/processes/vegetation/photosynthesis.md
bgroenks96 ea50b66
Update docs/src/processes/vegetation/photosynthesis.md
bgroenks96 7c58016
Remove kernel reference in veg dynamics doc page
bgroenks96 42a6833
Update docs/src/processes/vegetation/photosynthesis.md
bgroenks96 9d2856c
Fix incorrect docstrings
bgroenks96 74931ef
Replace unfinished sentence in basic_concepts.md doc page
bgroenks96 32fe2c4
Fix incorrect rendering of admonitiions
bgroenks96 c82f9ca
More minor docs improvements
bgroenks96 33fd8a0
Update docstrings for `initialize`
bgroenks96 f0e4e14
Fix include order
bgroenks96 e4edc8e
Update docs/src/processes/atmosphere/aerodynamics.md
bgroenks96 407a34d
Update docs/src/processes/atmosphere/prescribed_atmosphere.md
bgroenks96 f57cca2
Fix typo in cross-ref
bgroenks96 676c2ad
Add more details to core interfaces doc page
bgroenks96 268804f
Update docstrings for closure! and invclosure!
bgroenks96 9a71621
Initial draft of doc page on setting up Simulations
bgroenks96 9bf4628
Use unique identifiers for doc example blocks
bgroenks96 fdcef75
Fix `show` for variables printing to wrong output stream
bgroenks96 fa29779
Fix docstrings for input sources
bgroenks96 81e94f9
Fix typos in README
bgroenks96 f2581ab
Add doc page for input sources
bgroenks96 3f890d1
Split intro sections on initialization and time stepping into separat…
bgroenks96 a191f93
Update doc build and add more page stubs
bgroenks96 6d6cfd3
Fix process doc file names
bgroenks96 a682364
Fix typo in make.jl
bgroenks96 fe12b31
Rewrite veg dynamics docs
mahabadri c871d97
Re-organize example scripts and doc pages
bgroenks96 2a79ee9
Update veg dynamics tendency test
bgroenks96 cf1b2a1
Update AGENTS.md
bgroenks96 46bb175
Add implementation example with linear heat conduction
bgroenks96 cdec726
Update doc page on implementing processes
bgroenks96 53f5848
Minor fixes in snow ddm example
bgroenks96 00a47fd
Fix typos and link issues in docs/make.jl
bgroenks96 3b49d1a
Fix more broken or incorrect links
bgroenks96 dc02598
Fix another typo
bgroenks96 f332b76
Minor improvements to soil and SEB docs
bgroenks96 a0e7720
Add more headings to DDM example
bgroenks96 ab1573a
Fix incorrect variable name in PAW
bgroenks96 42d777c
Add dedicated doc page for state variables
bgroenks96 3a07bdb
Minor docs tweaks
bgroenks96 4a2e09c
Add initial draft of page on process coupling
bgroenks96 7db3382
Minor changes to AGENTS.md
bgroenks96 04017c1
Update page on process coupling
bgroenks96 de4fbb8
Fix typo in SEB doc page
bgroenks96 a8bff93
Merge sections on process coupling
bgroenks96 767d1c7
Make link check optional in doc build
bgroenks96 78a3b9a
Minor tweaks to model/process interface docs
bgroenks96 83da404
Revise formatting of units and symbol declarations in some doc pages
bgroenks96 0d57384
Update docs for PAW and root distribution
bgroenks96 ee599ef
Add citation management with DocumenterCitations.jl
bgroenks96 8e9d941
Add references page + citation CSS
bgroenks96 a7e74e8
Add more references
bgroenks96 88b321e
Add more citations and in-page bibs
bgroenks96 a329b00
Add more refs to bibliography
bgroenks96 721cd19
Update yet more citations
bgroenks96 38c2a0d
Fix unit inconsistencies in canopy interception
bgroenks96 50bc1ed
More improvements to doc pages
bgroenks96 2dd9d85
More docs fixes and improvements
bgroenks96 e12d657
Fix ambiguous naming of process abstraction levels
bgroenks96 03d4260
Fix formatting error
bgroenks96 3e881a7
Update doc pages on atmosphere interface
bgroenks96 c229fda
Add process interface section for all processes
bgroenks96 4a3ba1a
Use SoilInitializer by default in soil model
bgroenks96 d249889
Improve soil heat examples
bgroenks96 812b15b
Add more example doc pages
bgroenks96 b1efde4
Fix issue with input file path in global example
bgroenks96 3e03d2f
Create example output dirs prior to file copy
bgroenks96 3c5c67b
Fix inconsistencies in linear heat conduction example
bgroenks96 f4b6442
Fix incorrect path in docs/make.jl
bgroenks96 5147c3d
Reduce default simulation time in global example
bgroenks96 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
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
|
maximilian-gelbrecht marked this conversation as resolved.
bgroenks96 marked this conversation as resolved.
|
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,172 @@ | ||
| # Terrarium.jl — Agent Rules | ||
|
|
||
| Note: This `AGENTS.md` file is adapted from [Oceananigans.jl](https://github.com/CliMA/Oceananigans.jl/blob/main/AGENTS.md). See relevant copyright notices therein. | ||
|
|
||
| ## Project Overview | ||
|
|
||
| Terrarium.jl is a Julia package for fast, friendly, flexible, and process-based land and | ||
| terrestrial ecosystem modeling on CPUs and GPUs. It solves the coupled heat and Richards | ||
| equations in 1D for the soil along with common 0D parameterizations of vegetation and surface | ||
| hydrology processes. Terrarium is designed to be modular in the sense that (almost) all components | ||
| should be exchangeable with alternative implementations. Terrarium is also intended to be a fully | ||
| differentiable land model with continuous-time dynamics. All process implementations must be defined | ||
| in terms of well-formed ordinary or partial differential equations. No instantaneous or discrete-time | ||
| dynamics are allowed except in very special cases where they must be clearly documented and justified. | ||
|
|
||
| ## Language & Environment | ||
|
|
||
| - **Julia 1.10+** | CPU and GPU (CUDA) | ||
| - **Key packages**: KernelAbstractions.jl, CUDA.jl, Enzyme.jl | ||
| - **Style**: ExplicitImports.jl for source code; `using Terrarium` for examples/tests | ||
|
|
||
| ## Critical Rules | ||
|
|
||
| ### Kernels (GPU compatibility) | ||
|
|
||
| - Use `@kernel` / `@index` (KernelAbstractions.jl) to define device-agnostic kernels | ||
| - Functions marked with `@kernel` are called **kernels** which then invoke **kernel functions** with call pattern `compute_something(i, j, k, grid, fields, process::ProcessType, args...)` or `compute_something!(out, i, j, k, grid, fields, proces::ProcessType)` | ||
| - Kernel functions defined for 2D kernels instead have `i, j` instead of `i, j, k` | ||
| - Kernels and their subsequent call graph must be fully **type-stable** and **allocation-free** | ||
| - Use `ifelse` — never short-circuiting `if`/`else` in kernels | ||
| - No error messages, no `AbstractModel`s, and no `state` inside kernels | ||
| - Always extract relevant input/output `Field`s with `get_fields` and related methods | ||
| - Favor explicit enumeration of process types when invoking kernels rather than passing `AbstractCoupledProcesses` types | ||
| - Mark functions called inside kernels with `@inline` or `@propagate_inbounds` when including indices | ||
| - **Never loop over grid points outside kernels** — use `launch!` | ||
|
|
||
| ### Differentiability & Enzyme.jl | ||
|
|
||
| Terrarium targets full differentiability for inverse modeling and sensitivity analysis. Compatibility with Enzyme.jl | ||
| is a top priority and must be continuously tested. | ||
|
|
||
| - **Ensure type stability**: All code in kernels and within state-mutating methods (e.g. `initialize!`, `compute_tendencies!`, `compute_auxiliary!`) must be fully type stable. | ||
| - **Minimize allocations**: Allocations should be avoided wherever possible. Prefer mutation of output `Field`s. Never mutate input or prognostic `Field`s outside of `update_inputs!` or timestepper `timestep!` respectively. | ||
| - **No global state**: Initialize all parameters explicitly; never rely on global variables or implicit state | ||
| - **Test differentiability**: Use Enzyme to test that critical functions compute valid adjoints; include in test suite. See existing tests in `test/differentiability` for reference. | ||
| - **Document AD limitations**: If a function cannot be differentiated, mark it clearly with comments and docstrings | ||
|
|
||
| ### Type Stability & Memory | ||
|
|
||
| - All structs must be concretely typed | ||
| - Minimize allocation; favor inline computation | ||
| - **Never hardcode Float64**: no literal `0.0` or `1.0` in kernels or constructors. | ||
| Use `zero(grid)`, `one(grid)`, `NF(x)` where `x` is a number, `convert(FT, 1//2)`, or rational literals | ||
|
|
||
| ### Type Annotations | ||
|
|
||
| - Type annotations are used to **dispatch to relevant types**, restrict method signatures, and enable compiler optimizations | ||
| - Type annotations express intent and document assumptions | ||
| - Annotate function arguments and struct fields to be as specific as possible but not more specific than necessary | ||
| - Avoid use of overly broad types like `Any` unless absolutely necessary; instead, use Union types or create a common abstract type. Use of `Any` is permitted for generic containers such as `state` and `grid`. | ||
| - Use `where` clauses to express type constraints that improve clarity and dispatch precision | ||
|
|
||
| ### Imports | ||
|
|
||
| - Source code: explicit imports (checked by tests) | ||
| - Examples/docs: rely on `using Terrarium`; never explicitly import exported names | ||
|
|
||
| ### Docstrings | ||
|
|
||
| - Use DocStringExtensions.jl with `$TYPEDSIGNATURES` | ||
| - **ALWAYS `jldoctest` blocks, NEVER plain `julia` blocks** — doctests are tested; plain blocks rot | ||
| - Include `# output` with verifiable output; prefer `show` methods over boolean comparisons | ||
| - Use unicode for math (`Δt`, `η`, `ρ`), not LaTeX — LaTeX doesn't render in the REPL | ||
|
|
||
| ### Documentation pages | ||
|
|
||
| - Doc pages for processes and models should always consist of the following sections: | ||
| - **Overview**: General overview of of the physical process, what the main inputs and output variables typically are, and general equations relevant for understanding the implementations. This section should not contain implementation-specific details. | ||
| - **Implementations**: There should be sections for each implementation of the abstract process type, describing the general theory and any relevant implementation details. These sections should also each include a non-canonical docstring of the concrete process type. | ||
| - For each concrete process implementation, provide docstrings for the implementation-specific dispatches of `initialize!`, `compute_auxiliary!`, and `compute_tendencies!` corresponding to each coupling interface. | ||
| - **Methods**: Enumeration of process-specific methods. | ||
| - **Kernel functions**: Enumeration of **kernel functions** of the form `compute_something(i, j, k, grid, fields, ...)` or `compute_something!(out, i, j, k, grid, fields, ...)`; do NOT include **kernels** (i.e. functions annotated with `@kernel`) | ||
| - All functions referenced in doc pages should be marked with `canonical = false` since the canonical versions of the docstrings are defined in a separate `@autodocs` block in the index | ||
| - All types and functions referenced in the doc pages must have docstrings otherwise the doc build will fail. Ensure docstrings are defined and add them if they are missing. | ||
| - Doc pages should always be prefaced with appropriate `@meta` and `@setup` blocks | ||
| - If a model or process is not fully implemented, an appropriate warning should be displayed on the doc page | ||
| - Do not use brackets for expressing units as this conflicts with Markdown link syntax; use parentheses instead | ||
| - All code examples should be given as `@example name` blocks, replacing `name` with an appropriate identifier for the page, which are executed by Documenter.jl. | ||
|
|
||
| ### Model Constructors | ||
|
|
||
| - `grid` is positional: `SoilModel(grid; initializer)` | ||
| - Omit semicolon when there are no keyword arguments: `SoilModel(grid)` | ||
|
|
||
| ## Naming Conventions | ||
|
|
||
| - **Files**: snake_case matching the type they define — `soil_hydrology.jl` | ||
| - **Types/Constructors**: PascalCase **only for true constructors** — `SoilHydrology` | ||
| - **Functions**: snake_case — `compute_tendencies!` unless commonly combined in English, e.g. `timestep!`. This is not a hard rule, exceptions are permitted. | ||
| - **Kernels**: should always be suffixed with `_kernel!` — `compute_tendencies_kernel!` | ||
| - **Kernel functions**: should always be prefixed with `compute_`; mutating variants should use the standard bang `!` convention. | ||
| - **Variables**: Prefer English long name or readable unicode math notation — do not use abbreviations that may introduce ambiguity, e.g. `cond` could be either "condition" or "conductivity"; be as specific as possible. | ||
|
|
||
| ## Physics & Process Equations | ||
|
|
||
| All dynamical processes must be grounded in physics: | ||
|
|
||
| - **Equation reference**: Every process implementation should cite the governing equations in code comments or docstrings | ||
| - **Continuous time**: Discrete-time updates (e.g., "update this once per day") are prohibited | ||
| - **Conservation where applicable**: If a process conserves a quantity (mass, energy), verify conservation in tests | ||
| - **Nondimensionalization**: Consider whether nondimensionalization would improve solver stability; document choices if used | ||
|
|
||
| ## Module Structure | ||
|
|
||
| ``` | ||
| src/ | ||
| ├── Terrarium.jl # Main module, exports | ||
| ├── abstract_model.jl # CPU/GPU architecture abstractions | ||
| ├── diagnostics/ # Diagnostic and debugging utilities | ||
| ├── grids/ # Grid types and discretizations | ||
| ├── input_output/ # Types and functions for managing inputs and outputs | ||
| ├── models/ # Model implementations | ||
| ├── processes/ # Process implementations | ||
| ├── timesteppers/ # Time stepping schemes, integrators, and integration with Oceananigans `AbstractModel` | ||
| ├── utils/ # Miscellaneous utilities | ||
| ``` | ||
|
|
||
| ## Common Pitfalls | ||
|
|
||
| 1. **Type instability** in kernels ruins GPU performance | ||
| 2. **Missing imports**: tests will catch this — add to `using` statements | ||
| 3. **Plain `julia` blocks in docstrings**: always use `jldoctest` | ||
| 4. **Subtle bugs from missing method imports**, especially in extensions | ||
| 5. **Expecting unexported names**: consider exporting them rather than changing user scripts | ||
| 6. **Extending `getproperty` to fix undefined property bugs**: fix on the caller side instead | ||
| 7. **"Type is not callable" errors**: variable name shadows a function — rename or qualify | ||
| 8. **Quick fixes that break correctness**: if a test fails after a change, revisit the original edit | ||
| 9. **Commented-out code**: delete it. Git is the journal — don't leave commented code, debugging artifacts, or stale copy-paste remnants | ||
| 10. **2D indexing on fields**: always use 3D indexing (`field[i, j, k]`). 2D indexing works by coincidence on some fields but is unsupported and will break | ||
| 11. **Hardcoded Float64**: never use `0.0`, `1.0` in kernels or constructors; use `zero(grid)` etc. | ||
| 12. **Scope creep in PRs**: keep changes focused on a single concern. Unrelated cleanup goes in a separate PR | ||
| 13. **Modifying Project.toml dependencies**: never add, remove, or change `[deps]` or `[weakdeps]` in the root `Project.toml` unless the task absolutely requires it. Dependency changes have wide-reaching consequences — they affect CI, load time, and downstream compatibility. Only touch `[compat]` bounds when explicitly asked. | ||
| 14. **Mutable function closures in kernels**: function closures that capture mutable state will not differentiate correctly — use explicit parameters instead | ||
| 15. **Non-local dependencies in process equations**: process functions must not depend on global state; pass all dependencies as arguments for traceability and differentiability | ||
|
|
||
| ## Git Workflow | ||
|
|
||
| Follow [ColPrac](https://github.com/SciML/ColPrac). Feature branches, descriptive commits, update tests and docs with code changes, check CI before merging. | ||
|
|
||
| ## Design Principles | ||
|
|
||
| - **Dispatch over conditionals**: use Julia's type system and multiple dispatch instead of `if`/`else` branching. Backend-specific code goes in `ext/` extensions, not `if` branches in `src/` | ||
| - **Use `on_architecture` for data transfers** — never manual `Array()` / `CuArray()` calls | ||
| - **Defaults serve the common case**: avoid `nothing` defaults when a concrete default (like `CPU()`) covers 80% of usage. Minimize boilerplate for the typical user. | ||
| - **Keyword argument names must be consistent** across related types and constructors | ||
| - **Always use explicit `return`** in functions longer than one expression | ||
| - **One operation per line** as default; break long expressions across lines | ||
|
|
||
| ## Agent Behavior | ||
|
|
||
| - Prioritize type stability, GPU compatibility, and differentiability | ||
| - Follow established patterns in existing code | ||
| - Add tests for new functionality; update exports when adding public API | ||
| - Reference physics equations in comments when implementing dynamics | ||
| - Do not make unsolicited changes; focus on specific tasks | ||
| - When extending Enzyme.jl compatibility, verify adjoints with `Enzyme.autodiff` | ||
| - Ensure type annotations are restrictive enough to guide dispatch and minimize misuse | ||
|
|
||
| ## Further Reading | ||
|
|
||
| For detailed guidance on specific workflows: | ||
| - `test/runtests.jl` — test organization and running conventions |
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
Oops, something went wrong.
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.