| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  | import pathlib | 
					
						
							|  |  |  | import functools | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-18 16:29:22 -05:00
										 |  |  | from typing import Dict, Union | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #### | 
					
						
							| 
									
										
										
										
											2023-02-18 16:29:22 -05:00
										 |  |  | # from jaraco.path 3.4.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FilesSpec = Dict[str, Union[str, bytes, 'FilesSpec']]  # type: ignore | 
					
						
							| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-18 16:29:22 -05:00
										 |  |  | def build(spec: FilesSpec, prefix=pathlib.Path()): | 
					
						
							| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     Build a set of files/directories, as described by the spec. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Each key represents a pathname, and the value represents | 
					
						
							|  |  |  |     the content. Content may be a nested directory. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> spec = { | 
					
						
							|  |  |  |     ...     'README.txt': "A README file", | 
					
						
							|  |  |  |     ...     "foo": { | 
					
						
							|  |  |  |     ...         "__init__.py": "", | 
					
						
							|  |  |  |     ...         "bar": { | 
					
						
							|  |  |  |     ...             "__init__.py": "", | 
					
						
							|  |  |  |     ...         }, | 
					
						
							|  |  |  |     ...         "baz.py": "# Some code", | 
					
						
							|  |  |  |     ...     } | 
					
						
							|  |  |  |     ... } | 
					
						
							| 
									
										
										
										
											2023-02-18 16:29:22 -05:00
										 |  |  |     >>> target = getfixture('tmp_path') | 
					
						
							|  |  |  |     >>> build(spec, target) | 
					
						
							|  |  |  |     >>> target.joinpath('foo/baz.py').read_text(encoding='utf-8') | 
					
						
							|  |  |  |     '# Some code' | 
					
						
							| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     for name, contents in spec.items(): | 
					
						
							|  |  |  |         create(contents, pathlib.Path(prefix) / name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @functools.singledispatch | 
					
						
							| 
									
										
										
										
											2023-02-18 16:29:22 -05:00
										 |  |  | def create(content: Union[str, bytes, FilesSpec], path): | 
					
						
							| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  |     path.mkdir(exist_ok=True) | 
					
						
							|  |  |  |     build(content, prefix=path)  # type: ignore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @create.register | 
					
						
							|  |  |  | def _(content: bytes, path): | 
					
						
							|  |  |  |     path.write_bytes(content) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @create.register | 
					
						
							|  |  |  | def _(content: str, path): | 
					
						
							| 
									
										
										
										
											2023-02-18 16:29:22 -05:00
										 |  |  |     path.write_text(content, encoding='utf-8') | 
					
						
							| 
									
										
										
										
											2023-01-01 11:07:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # end from jaraco.path | 
					
						
							|  |  |  | #### |