diff --git a/crates/ty/docs/rules.md b/crates/ty/docs/rules.md
index 7fb0c70c67..81162cb9ec 100644
--- a/crates/ty/docs/rules.md
+++ b/crates/ty/docs/rules.md
@@ -1230,6 +1230,30 @@ at runtime.
* [View source](https://github.com/astral-sh/ruff/blob/main/crates%2Fty_python_semantic%2Fsrc%2Ftypes%2Fdiagnostic.rs#L1013)
+## `unresolved-reference`
+
+**Default level**: error
+
+
+detects references to names that are not defined
+
+### What it does
+Checks for references to names that are not defined.
+
+### Why is this bad?
+Using an undefined variable will raise a `NameError` at runtime.
+
+### Example
+
+```python
+print(x) # NameError: name 'x' is not defined
+```
+
+### Links
+* [Related issues](https://github.com/astral-sh/ty/issues?q=sort%3Aupdated-desc%20is%3Aissue%20is%3Aopen%20unresolved-reference)
+* [View source](https://github.com/astral-sh/ruff/blob/main/crates%2Fty_python_semantic%2Fsrc%2Ftypes%2Fdiagnostic.rs#L1027)
+
+
## `unsupported-bool-conversion`
**Default level**: error
@@ -1471,30 +1495,6 @@ a = 20 / 0 # ty: ignore[division-by-zero]
* [View source](https://github.com/astral-sh/ruff/blob/main/crates%2Fty_python_semantic%2Fsrc%2Fsuppression.rs#L40)
-## `unresolved-reference`
-
-**Default level**: warn
-
-
-detects references to names that are not defined
-
-### What it does
-Checks for references to names that are not defined.
-
-### Why is this bad?
-Using an undefined variable will raise a `NameError` at runtime.
-
-### Example
-
-```python
-print(x) # NameError: name 'x' is not defined
-```
-
-### Links
-* [Related issues](https://github.com/astral-sh/ty/issues?q=sort%3Aupdated-desc%20is%3Aissue%20is%3Aopen%20unresolved-reference)
-* [View source](https://github.com/astral-sh/ruff/blob/main/crates%2Fty_python_semantic%2Fsrc%2Ftypes%2Fdiagnostic.rs#L1027)
-
-
## `unused-ignore-comment`
**Default level**: warn
diff --git a/crates/ty/tests/cli.rs b/crates/ty/tests/cli.rs
index be19281a1e..394ceac4fa 100644
--- a/crates/ty/tests/cli.rs
+++ b/crates/ty/tests/cli.rs
@@ -389,7 +389,7 @@ fn configuration_rule_severity() -> anyhow::Result<()> {
|
info: `lint:division-by-zero` is enabled by default
- warning: lint:unresolved-reference: Name `prin` used when not defined
+ error: lint:unresolved-reference: Name `prin` used when not defined
--> test.py:7:1
|
5 | x = a
@@ -480,7 +480,7 @@ fn cli_rule_severity() -> anyhow::Result<()> {
|
info: `lint:division-by-zero` is enabled by default
- warning: lint:unresolved-reference: Name `prin` used when not defined
+ error: lint:unresolved-reference: Name `prin` used when not defined
--> test.py:9:1
|
7 | x = a
@@ -571,7 +571,7 @@ fn cli_rule_severity_precedence() -> anyhow::Result<()> {
|
info: `lint:division-by-zero` is enabled by default
- warning: lint:unresolved-reference: Name `prin` used when not defined
+ error: lint:unresolved-reference: Name `prin` used when not defined
--> test.py:7:1
|
5 | x = a
@@ -589,7 +589,7 @@ fn cli_rule_severity_precedence() -> anyhow::Result<()> {
assert_cmd_snapshot!(
case
.command()
- .arg("--error")
+ .arg("--warn")
.arg("unresolved-reference")
.arg("--warn")
.arg("division-by-zero")
@@ -676,7 +676,7 @@ fn cli_unknown_rules() -> anyhow::Result<()> {
fn exit_code_only_warnings() -> anyhow::Result<()> {
let case = TestCase::with_file("test.py", r"print(x) # [unresolved-reference]")?;
- assert_cmd_snapshot!(case.command(), @r"
+ assert_cmd_snapshot!(case.command().arg("--warn").arg("unresolved-reference"), @r"
success: true
exit_code: 0
----- stdout -----
@@ -686,7 +686,7 @@ fn exit_code_only_warnings() -> anyhow::Result<()> {
1 | print(x) # [unresolved-reference]
| ^
|
- info: `lint:unresolved-reference` is enabled by default
+ info: `lint:unresolved-reference` was selected on the command line
Found 1 diagnostic
@@ -760,7 +760,7 @@ fn exit_code_only_info_and_error_on_warning_is_true() -> anyhow::Result<()> {
fn exit_code_no_errors_but_error_on_warning_is_true() -> anyhow::Result<()> {
let case = TestCase::with_file("test.py", r"print(x) # [unresolved-reference]")?;
- assert_cmd_snapshot!(case.command().arg("--error-on-warning"), @r"
+ assert_cmd_snapshot!(case.command().arg("--error-on-warning").arg("--warn").arg("unresolved-reference"), @r"
success: false
exit_code: 1
----- stdout -----
@@ -770,7 +770,7 @@ fn exit_code_no_errors_but_error_on_warning_is_true() -> anyhow::Result<()> {
1 | print(x) # [unresolved-reference]
| ^
|
- info: `lint:unresolved-reference` is enabled by default
+ info: `lint:unresolved-reference` was selected on the command line
Found 1 diagnostic
@@ -793,7 +793,7 @@ fn exit_code_no_errors_but_error_on_warning_is_enabled_in_configuration() -> any
),
])?;
- assert_cmd_snapshot!(case.command(), @r"
+ assert_cmd_snapshot!(case.command().arg("--warn").arg("unresolved-reference"), @r"
success: false
exit_code: 1
----- stdout -----
@@ -803,7 +803,7 @@ fn exit_code_no_errors_but_error_on_warning_is_enabled_in_configuration() -> any
1 | print(x) # [unresolved-reference]
| ^
|
- info: `lint:unresolved-reference` is enabled by default
+ info: `lint:unresolved-reference` was selected on the command line
Found 1 diagnostic
@@ -823,7 +823,7 @@ fn exit_code_both_warnings_and_errors() -> anyhow::Result<()> {
"#,
)?;
- assert_cmd_snapshot!(case.command(), @r"
+ assert_cmd_snapshot!(case.command().arg("--warn").arg("unresolved-reference"), @r"
success: false
exit_code: 1
----- stdout -----
@@ -834,7 +834,7 @@ fn exit_code_both_warnings_and_errors() -> anyhow::Result<()> {
| ^
3 | print(4[1]) # [non-subscriptable]
|
- info: `lint:unresolved-reference` is enabled by default
+ info: `lint:unresolved-reference` was selected on the command line
error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method
--> test.py:3:7
@@ -863,7 +863,7 @@ fn exit_code_both_warnings_and_errors_and_error_on_warning_is_true() -> anyhow::
"###,
)?;
- assert_cmd_snapshot!(case.command().arg("--error-on-warning"), @r"
+ assert_cmd_snapshot!(case.command().arg("--warn").arg("unresolved-reference").arg("--error-on-warning"), @r"
success: false
exit_code: 1
----- stdout -----
@@ -874,7 +874,7 @@ fn exit_code_both_warnings_and_errors_and_error_on_warning_is_true() -> anyhow::
| ^
3 | print(4[1]) # [non-subscriptable]
|
- info: `lint:unresolved-reference` is enabled by default
+ info: `lint:unresolved-reference` was selected on the command line
error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method
--> test.py:3:7
@@ -903,7 +903,7 @@ fn exit_code_exit_zero_is_true() -> anyhow::Result<()> {
"#,
)?;
- assert_cmd_snapshot!(case.command().arg("--exit-zero"), @r"
+ assert_cmd_snapshot!(case.command().arg("--exit-zero").arg("--warn").arg("unresolved-reference"), @r"
success: true
exit_code: 0
----- stdout -----
@@ -914,7 +914,7 @@ fn exit_code_exit_zero_is_true() -> anyhow::Result<()> {
| ^
3 | print(4[1]) # [non-subscriptable]
|
- info: `lint:unresolved-reference` is enabled by default
+ info: `lint:unresolved-reference` was selected on the command line
error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method
--> test.py:3:7
@@ -966,8 +966,8 @@ fn user_configuration() -> anyhow::Result<()> {
assert_cmd_snapshot!(
case.command().current_dir(case.root().join("project")).env(config_env_var, config_directory.as_os_str()),
@r"
- success: true
- exit_code: 0
+ success: false
+ exit_code: 1
----- stdout -----
warning: lint:division-by-zero: Cannot divide object of type `Literal[4]` by zero
--> main.py:2:5
@@ -979,7 +979,7 @@ fn user_configuration() -> anyhow::Result<()> {
|
info: `lint:division-by-zero` was selected in the configuration file
- warning: lint:unresolved-reference: Name `prin` used when not defined
+ error: lint:unresolved-reference: Name `prin` used when not defined
--> main.py:7:1
|
5 | x = a
@@ -995,7 +995,7 @@ fn user_configuration() -> anyhow::Result<()> {
"
);
- // The user-level configuration sets the severity for `unresolved-reference` to error.
+ // The user-level configuration sets the severity for `unresolved-reference` to warn.
// Changing the level for `division-by-zero` has no effect, because the project-level configuration
// has higher precedence.
case.write_file(
@@ -1003,15 +1003,15 @@ fn user_configuration() -> anyhow::Result<()> {
r#"
[rules]
division-by-zero = "error"
- unresolved-reference = "error"
+ unresolved-reference = "warn"
"#,
)?;
assert_cmd_snapshot!(
case.command().current_dir(case.root().join("project")).env(config_env_var, config_directory.as_os_str()),
@r"
- success: false
- exit_code: 1
+ success: true
+ exit_code: 0
----- stdout -----
warning: lint:division-by-zero: Cannot divide object of type `Literal[4]` by zero
--> main.py:2:5
@@ -1023,7 +1023,7 @@ fn user_configuration() -> anyhow::Result<()> {
|
info: `lint:division-by-zero` was selected in the configuration file
- error: lint:unresolved-reference: Name `prin` used when not defined
+ warning: lint:unresolved-reference: Name `prin` used when not defined
--> main.py:7:1
|
5 | x = a
@@ -1181,7 +1181,7 @@ fn concise_diagnostics() -> anyhow::Result<()> {
"#,
)?;
- assert_cmd_snapshot!(case.command().arg("--output-format=concise"), @r"
+ assert_cmd_snapshot!(case.command().arg("--output-format=concise").arg("--warn").arg("unresolved-reference"), @r"
success: false
exit_code: 1
----- stdout -----
diff --git a/crates/ty_python_semantic/src/types/diagnostic.rs b/crates/ty_python_semantic/src/types/diagnostic.rs
index 6adcc7d902..d2d920a4e8 100644
--- a/crates/ty_python_semantic/src/types/diagnostic.rs
+++ b/crates/ty_python_semantic/src/types/diagnostic.rs
@@ -1039,7 +1039,7 @@ declare_lint! {
pub(crate) static UNRESOLVED_REFERENCE = {
summary: "detects references to names that are not defined",
status: LintStatus::preview("1.0.0"),
- default_level: Level::Warn,
+ default_level: Level::Error,
}
}
diff --git a/ty.schema.json b/ty.schema.json
index e5b495438a..96ff87a26f 100644
--- a/ty.schema.json
+++ b/ty.schema.json
@@ -783,7 +783,7 @@
"unresolved-reference": {
"title": "detects references to names that are not defined",
"description": "## What it does\nChecks for references to names that are not defined.\n\n## Why is this bad?\nUsing an undefined variable will raise a `NameError` at runtime.\n\n## Example\n\n```python\nprint(x) # NameError: name 'x' is not defined\n```",
- "default": "warn",
+ "default": "error",
"oneOf": [
{
"$ref": "#/definitions/Level"