pylsp: Tweak default user settings (cherry-pick #21025) (#21028)

gcp-cherry-pick-bot[bot] and Piotr Osiewicz created

Cherry-picked pylsp: Tweak default user settings (#21025)

I've also looked into not creating temp dirs in project directories and
succeeded at that for Mypy; no dice for rope though, I'll have to send a
patch to pylsp to fix that.
Closes #20646

Release Notes:

- Python: tweaked default pylsp settings to be less noisy (mypy and
pycodestyle are no longer enabled by default).

Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>

Change summary

crates/languages/src/python.rs | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)

Detailed changes

crates/languages/src/python.rs 🔗

@@ -736,13 +736,17 @@ impl LspAdapter for PyLspAdapter {
                     .unwrap_or_else(|| {
                         json!({
                             "plugins": {
-                                "rope_autoimport": {"enabled": true},
-                                "mypy": {"enabled": true}
-                            }
+                                "pycodestyle": {"enabled": false},
+                                "rope_autoimport": {"enabled": true, "memory": true},
+                                "mypy": {"enabled": false}
+                            },
+                            "rope": {
+                                "ropeFolder": null
+                            },
                         })
                     });
 
-            // If python.pythonPath is not set in user config, do so using our toolchain picker.
+            // If user did not explicitly modify their python venv, use one from picker.
             if let Some(toolchain) = toolchain {
                 if user_settings.is_null() {
                     user_settings = Value::Object(serde_json::Map::default());
@@ -758,23 +762,22 @@ impl LspAdapter for PyLspAdapter {
                         .or_insert(Value::Object(serde_json::Map::default()))
                         .as_object_mut()
                     {
-                        jedi.insert(
-                            "environment".to_string(),
-                            Value::String(toolchain.path.clone().into()),
-                        );
+                        jedi.entry("environment".to_string())
+                            .or_insert_with(|| Value::String(toolchain.path.clone().into()));
                     }
                     if let Some(pylint) = python
                         .entry("mypy")
                         .or_insert(Value::Object(serde_json::Map::default()))
                         .as_object_mut()
                     {
-                        pylint.insert(
-                            "overrides".to_string(),
+                        pylint.entry("overrides".to_string()).or_insert_with(|| {
                             Value::Array(vec![
                                 Value::String("--python-executable".into()),
                                 Value::String(toolchain.path.into()),
-                            ]),
-                        );
+                                Value::String("--cache-dir=/dev/null".into()),
+                                Value::Bool(true),
+                            ])
+                        });
                     }
                 }
             }