Repository: PyCQA/isort

Issue:
Do not cache configuration files

isort can run in long processes when used in an editor.  In that 
scenario users might edit their configuration files and literally
save a file again to see its outcome.  

This is not possible right now because we `lru_cache()` all the
relevant functions in `settings.py`.  

It is strange that we do this in the first place as we either collect
all known configs using the `Trie` implementation *or* we only
construct exactly one `Config` object based on the first file name, 
the working dir, or from `settings_path|file`...

We can probably remove the caches in `settings.py` completely. 
Except of course you explicitly wanted to optimize for long 
running processes.

Discussion:

Patch:
diff --git a/isort/settings.py b/isort/settings.py
index fb9bba2f..24de2337 100644
--- a/isort/settings.py
+++ b/isort/settings.py
@@ -11,7 +11,6 @@ import stat
 import subprocess  # nosec: Needed for gitignore support.
 import sys
 from dataclasses import dataclass, field
-from functools import lru_cache
 from pathlib import Path
 from typing import (
     TYPE_CHECKING,
@@ -766,7 +765,6 @@ def _abspaths(cwd: str, values: Iterable[str]) -> Set[str]:
     return paths
 
 
-@lru_cache()
 def _find_config(path: str) -> Tuple[str, Dict[str, Any]]:
     current_directory = path
     tries = 0
@@ -799,7 +797,6 @@ def _find_config(path: str) -> Tuple[str, Dict[str, Any]]:
     return (path, {})
 
 
-@lru_cache()
 def find_all_configs(path: str) -> Trie:
     """
     Looks for config files in the path provided and in all of its sub-directories.
@@ -828,8 +825,7 @@ def find_all_configs(path: str) -> Trie:
     return trie_root
 
 
-@lru_cache()
-def _get_config_data(file_path: str, sections: Tuple[str]) -> Dict[str, Any]:
+def _get_config_data(file_path: str, sections: Tuple[str, ...]) -> Dict[str, Any]:
     settings: Dict[str, Any] = {}
 
     if file_path.endswith(".toml"):


Test patch:
diff --git a/tests/unit/test_settings.py b/tests/unit/test_settings.py
index 86354512..295b30c1 100644
--- a/tests/unit/test_settings.py
+++ b/tests/unit/test_settings.py
@@ -126,8 +126,6 @@ def test_find_config(tmpdir):
     tmp_config = tmpdir.join(".isort.cfg")
 
     # can't find config if it has no relevant section
-    settings._find_config.cache_clear()
-    settings._get_config_data.cache_clear()
     tmp_config.write_text(
         """
 [section]
@@ -138,14 +136,10 @@ force_grid_wrap=true
     assert not settings._find_config(str(tmpdir))[1]
 
     # or if it is malformed
-    settings._find_config.cache_clear()
-    settings._get_config_data.cache_clear()
     tmp_config.write_text("""arstoyrsyan arienrsaeinrastyngpuywnlguyn354q^%$)(%_)@$""", "utf8")
     assert not settings._find_config(str(tmpdir))[1]
 
     # can when it has either a file format, or generic relevant section
-    settings._find_config.cache_clear()
-    settings._get_config_data.cache_clear()
     _write_simple_settings(tmp_config)
     assert settings._find_config(str(tmpdir))[1]
 
@@ -155,8 +149,6 @@ def test_find_config_deep(tmpdir):
     dirs = [f"dir{i}" for i in range(settings.MAX_CONFIG_SEARCH_DEPTH + 1)]
     tmp_dirs = tmpdir.ensure(*dirs, dirs=True)
     tmp_config = tmpdir.join("dir0", ".isort.cfg")
-    settings._find_config.cache_clear()
-    settings._get_config_data.cache_clear()
     _write_simple_settings(tmp_config)
     assert not settings._find_config(str(tmp_dirs))[1]
     # but can find config if it is MAX_CONFIG_SEARCH_DEPTH up
diff --git a/tests/unit/test_ticketed_features.py b/tests/unit/test_ticketed_features.py
index 6f483e8f..32eeb709 100644
--- a/tests/unit/test_ticketed_features.py
+++ b/tests/unit/test_ticketed_features.py
@@ -555,7 +555,6 @@ def test_isort_respects_quiet_from_sort_file_api_see_1461(capsys, tmpdir):
     assert not out
 
     # Present in an automatically loaded configuration file
-    isort.settings._find_config.cache_clear()
     settings_file.write(
         """
 [isort]
@@ -610,7 +609,6 @@ quiet = true
     with pytest.warns(UserWarning):
         assert not Config(settings_file=str(settings_file)).quiet
 
-    isort.settings._get_config_data.cache_clear()
     settings_file.write(
         """
 [isort]