mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Allow both files and directories to be passed to update-all (#10575)
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
This commit is contained in:
		| @@ -272,12 +272,15 @@ class OrderedDict(collections.OrderedDict): | |||||||
|         return dict(self).__repr__() |         return dict(self).__repr__() | ||||||
|  |  | ||||||
|  |  | ||||||
| def list_yaml_files(folders: list[str]) -> list[str]: | def list_yaml_files(configs: list[str]) -> list[str]: | ||||||
|     files = filter_yaml_files( |     files: list[str] = [] | ||||||
|         [os.path.join(folder, p) for folder in folders for p in os.listdir(folder)] |     for config in configs: | ||||||
|     ) |         if os.path.isfile(config): | ||||||
|     files.sort() |             files.append(config) | ||||||
|     return files |         else: | ||||||
|  |             files.extend(os.path.join(config, p) for p in os.listdir(config)) | ||||||
|  |     files = filter_yaml_files(files) | ||||||
|  |     return sorted(files) | ||||||
|  |  | ||||||
|  |  | ||||||
| def filter_yaml_files(files: list[str]) -> list[str]: | def filter_yaml_files(files: list[str]) -> list[str]: | ||||||
|   | |||||||
							
								
								
									
										143
									
								
								tests/unit_tests/test_util.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								tests/unit_tests/test_util.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | |||||||
|  | """Tests for esphome.util module.""" | ||||||
|  |  | ||||||
|  | from pathlib import Path | ||||||
|  |  | ||||||
|  | import pytest | ||||||
|  |  | ||||||
|  | from esphome import util | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_list_yaml_files_with_files_and_directories(tmp_path: Path) -> None: | ||||||
|  |     """Test that list_yaml_files handles both files and directories.""" | ||||||
|  |     # Create directory structure | ||||||
|  |     dir1 = tmp_path / "configs" | ||||||
|  |     dir1.mkdir() | ||||||
|  |     dir2 = tmp_path / "more_configs" | ||||||
|  |     dir2.mkdir() | ||||||
|  |  | ||||||
|  |     # Create YAML files in directories | ||||||
|  |     (dir1 / "config1.yaml").write_text("test: 1") | ||||||
|  |     (dir1 / "config2.yml").write_text("test: 2") | ||||||
|  |     (dir1 / "not_yaml.txt").write_text("not yaml") | ||||||
|  |  | ||||||
|  |     (dir2 / "config3.yaml").write_text("test: 3") | ||||||
|  |  | ||||||
|  |     # Create standalone YAML files | ||||||
|  |     standalone1 = tmp_path / "standalone.yaml" | ||||||
|  |     standalone1.write_text("test: 4") | ||||||
|  |     standalone2 = tmp_path / "another.yml" | ||||||
|  |     standalone2.write_text("test: 5") | ||||||
|  |  | ||||||
|  |     # Test with mixed input (directories and files) | ||||||
|  |     configs = [ | ||||||
|  |         str(dir1), | ||||||
|  |         str(standalone1), | ||||||
|  |         str(dir2), | ||||||
|  |         str(standalone2), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     result = util.list_yaml_files(configs) | ||||||
|  |  | ||||||
|  |     # Should include all YAML files but not the .txt file | ||||||
|  |     assert set(result) == { | ||||||
|  |         str(dir1 / "config1.yaml"), | ||||||
|  |         str(dir1 / "config2.yml"), | ||||||
|  |         str(dir2 / "config3.yaml"), | ||||||
|  |         str(standalone1), | ||||||
|  |         str(standalone2), | ||||||
|  |     } | ||||||
|  |     # Check that results are sorted | ||||||
|  |     assert result == sorted(result) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_list_yaml_files_only_directories(tmp_path: Path) -> None: | ||||||
|  |     """Test list_yaml_files with only directories.""" | ||||||
|  |     dir1 = tmp_path / "dir1" | ||||||
|  |     dir1.mkdir() | ||||||
|  |     dir2 = tmp_path / "dir2" | ||||||
|  |     dir2.mkdir() | ||||||
|  |  | ||||||
|  |     (dir1 / "a.yaml").write_text("test: a") | ||||||
|  |     (dir1 / "b.yml").write_text("test: b") | ||||||
|  |     (dir2 / "c.yaml").write_text("test: c") | ||||||
|  |  | ||||||
|  |     result = util.list_yaml_files([str(dir1), str(dir2)]) | ||||||
|  |  | ||||||
|  |     assert set(result) == { | ||||||
|  |         str(dir1 / "a.yaml"), | ||||||
|  |         str(dir1 / "b.yml"), | ||||||
|  |         str(dir2 / "c.yaml"), | ||||||
|  |     } | ||||||
|  |     assert result == sorted(result) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_list_yaml_files_only_files(tmp_path: Path) -> None: | ||||||
|  |     """Test list_yaml_files with only files.""" | ||||||
|  |     file1 = tmp_path / "file1.yaml" | ||||||
|  |     file2 = tmp_path / "file2.yml" | ||||||
|  |     file3 = tmp_path / "file3.yaml" | ||||||
|  |     non_yaml = tmp_path / "not_yaml.json" | ||||||
|  |  | ||||||
|  |     file1.write_text("test: 1") | ||||||
|  |     file2.write_text("test: 2") | ||||||
|  |     file3.write_text("test: 3") | ||||||
|  |     non_yaml.write_text("{}") | ||||||
|  |  | ||||||
|  |     # Include a non-YAML file to test filtering | ||||||
|  |     result = util.list_yaml_files( | ||||||
|  |         [ | ||||||
|  |             str(file1), | ||||||
|  |             str(file2), | ||||||
|  |             str(file3), | ||||||
|  |             str(non_yaml), | ||||||
|  |         ] | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     assert set(result) == { | ||||||
|  |         str(file1), | ||||||
|  |         str(file2), | ||||||
|  |         str(file3), | ||||||
|  |     } | ||||||
|  |     assert result == sorted(result) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_list_yaml_files_empty_directory(tmp_path: Path) -> None: | ||||||
|  |     """Test list_yaml_files with an empty directory.""" | ||||||
|  |     empty_dir = tmp_path / "empty" | ||||||
|  |     empty_dir.mkdir() | ||||||
|  |  | ||||||
|  |     result = util.list_yaml_files([str(empty_dir)]) | ||||||
|  |  | ||||||
|  |     assert result == [] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_list_yaml_files_nonexistent_path(tmp_path: Path) -> None: | ||||||
|  |     """Test list_yaml_files with a nonexistent path raises an error.""" | ||||||
|  |     nonexistent = tmp_path / "nonexistent" | ||||||
|  |     existing = tmp_path / "existing.yaml" | ||||||
|  |     existing.write_text("test: 1") | ||||||
|  |  | ||||||
|  |     # Should raise an error for non-existent directory | ||||||
|  |     with pytest.raises(FileNotFoundError): | ||||||
|  |         util.list_yaml_files([str(nonexistent), str(existing)]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_list_yaml_files_mixed_extensions(tmp_path: Path) -> None: | ||||||
|  |     """Test that both .yaml and .yml extensions are recognized.""" | ||||||
|  |     dir1 = tmp_path / "configs" | ||||||
|  |     dir1.mkdir() | ||||||
|  |  | ||||||
|  |     yaml_file = dir1 / "config.yaml" | ||||||
|  |     yml_file = dir1 / "config.yml" | ||||||
|  |     other_file = dir1 / "config.txt" | ||||||
|  |  | ||||||
|  |     yaml_file.write_text("test: yaml") | ||||||
|  |     yml_file.write_text("test: yml") | ||||||
|  |     other_file.write_text("test: txt") | ||||||
|  |  | ||||||
|  |     result = util.list_yaml_files([str(dir1)]) | ||||||
|  |  | ||||||
|  |     assert set(result) == { | ||||||
|  |         str(yaml_file), | ||||||
|  |         str(yml_file), | ||||||
|  |     } | ||||||
		Reference in New Issue
	
	Block a user