Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
copy.py558 linesDownload Raw Back to abstract
1from hashlib import md52from itertools import product3 4import pytest5 6from fsspec.tests.abstract.common import GLOB_EDGE_CASES_TESTS7 8 9class AbstractCopyTests:10    def test_copy_file_to_existing_directory(11        self,12        fs,13        fs_join,14        fs_bulk_operations_scenario_0,15        fs_target,16        supports_empty_directories,17    ):18        # Copy scenario 1a19        source = fs_bulk_operations_scenario_020 21        target = fs_target22        fs.mkdir(target)23        if not supports_empty_directories:24            # Force target directory to exist by adding a dummy file25            fs.touch(fs_join(target, "dummy"))26        assert fs.isdir(target)27 28        target_file2 = fs_join(target, "file2")29        target_subfile1 = fs_join(target, "subfile1")30 31        # Copy from source directory32        fs.cp(fs_join(source, "file2"), target)33        assert fs.isfile(target_file2)34 35        # Copy from sub directory36        fs.cp(fs_join(source, "subdir", "subfile1"), target)37        assert fs.isfile(target_subfile1)38 39        # Remove copied files40        fs.rm([target_file2, target_subfile1])41        assert not fs.exists(target_file2)42        assert not fs.exists(target_subfile1)43 44        # Repeat with trailing slash on target45        fs.cp(fs_join(source, "file2"), target + "/")46        assert fs.isdir(target)47        assert fs.isfile(target_file2)48 49        fs.cp(fs_join(source, "subdir", "subfile1"), target + "/")50        assert fs.isfile(target_subfile1)51 52    def test_copy_file_to_new_directory(53        self, fs, fs_join, fs_bulk_operations_scenario_0, fs_target54    ):55        # Copy scenario 1b56        source = fs_bulk_operations_scenario_057 58        target = fs_target59        fs.mkdir(target)60 61        fs.cp(62            fs_join(source, "subdir", "subfile1"), fs_join(target, "newdir/")63        )  # Note trailing slash64        assert fs.isdir(target)65        assert fs.isdir(fs_join(target, "newdir"))66        assert fs.isfile(fs_join(target, "newdir", "subfile1"))67 68    def test_copy_file_to_file_in_existing_directory(69        self,70        fs,71        fs_join,72        fs_bulk_operations_scenario_0,73        fs_target,74        supports_empty_directories,75    ):76        # Copy scenario 1c77        source = fs_bulk_operations_scenario_078 79        target = fs_target80        fs.mkdir(target)81        if not supports_empty_directories:82            # Force target directory to exist by adding a dummy file83            fs.touch(fs_join(target, "dummy"))84        assert fs.isdir(target)85 86        fs.cp(fs_join(source, "subdir", "subfile1"), fs_join(target, "newfile"))87        assert fs.isfile(fs_join(target, "newfile"))88 89    def test_copy_file_to_file_in_new_directory(90        self, fs, fs_join, fs_bulk_operations_scenario_0, fs_target91    ):92        # Copy scenario 1d93        source = fs_bulk_operations_scenario_094 95        target = fs_target96        fs.mkdir(target)97 98        fs.cp(99            fs_join(source, "subdir", "subfile1"), fs_join(target, "newdir", "newfile")100        )101        assert fs.isdir(fs_join(target, "newdir"))102        assert fs.isfile(fs_join(target, "newdir", "newfile"))103 104    def test_copy_directory_to_existing_directory(105        self,106        fs,107        fs_join,108        fs_bulk_operations_scenario_0,109        fs_target,110        supports_empty_directories,111    ):112        # Copy scenario 1e113        source = fs_bulk_operations_scenario_0114 115        target = fs_target116        fs.mkdir(target)117        if not supports_empty_directories:118            # Force target directory to exist by adding a dummy file119            dummy = fs_join(target, "dummy")120            fs.touch(dummy)121        assert fs.isdir(target)122 123        for source_slash, target_slash in zip([False, True], [False, True]):124            s = fs_join(source, "subdir")125            if source_slash:126                s += "/"127            t = target + "/" if target_slash else target128 129            # Without recursive does nothing130            fs.cp(s, t)131            assert fs.ls(target, detail=False) == (132                [] if supports_empty_directories else [dummy]133            )134 135            # With recursive136            fs.cp(s, t, recursive=True)137            if source_slash:138                assert fs.isfile(fs_join(target, "subfile1"))139                assert fs.isfile(fs_join(target, "subfile2"))140                assert fs.isdir(fs_join(target, "nesteddir"))141                assert fs.isfile(fs_join(target, "nesteddir", "nestedfile"))142                assert not fs.exists(fs_join(target, "subdir"))143 144                fs.rm(145                    [146                        fs_join(target, "subfile1"),147                        fs_join(target, "subfile2"),148                        fs_join(target, "nesteddir"),149                    ],150                    recursive=True,151                )152            else:153                assert fs.isdir(fs_join(target, "subdir"))154                assert fs.isfile(fs_join(target, "subdir", "subfile1"))155                assert fs.isfile(fs_join(target, "subdir", "subfile2"))156                assert fs.isdir(fs_join(target, "subdir", "nesteddir"))157                assert fs.isfile(fs_join(target, "subdir", "nesteddir", "nestedfile"))158 159                fs.rm(fs_join(target, "subdir"), recursive=True)160            assert fs.ls(target, detail=False) == (161                [] if supports_empty_directories else [dummy]162            )163 164            # Limit recursive by maxdepth165            fs.cp(s, t, recursive=True, maxdepth=1)166            if source_slash:167                assert fs.isfile(fs_join(target, "subfile1"))168                assert fs.isfile(fs_join(target, "subfile2"))169                assert not fs.exists(fs_join(target, "nesteddir"))170                assert not fs.exists(fs_join(target, "subdir"))171 172                fs.rm(173                    [174                        fs_join(target, "subfile1"),175                        fs_join(target, "subfile2"),176                    ],177                    recursive=True,178                )179            else:180                assert fs.isdir(fs_join(target, "subdir"))181                assert fs.isfile(fs_join(target, "subdir", "subfile1"))182                assert fs.isfile(fs_join(target, "subdir", "subfile2"))183                assert not fs.exists(fs_join(target, "subdir", "nesteddir"))184 185                fs.rm(fs_join(target, "subdir"), recursive=True)186            assert fs.ls(target, detail=False) == (187                [] if supports_empty_directories else [dummy]188            )189 190    def test_copy_directory_to_new_directory(191        self,192        fs,193        fs_join,194        fs_bulk_operations_scenario_0,195        fs_target,196        supports_empty_directories,197    ):198        # Copy scenario 1f199        source = fs_bulk_operations_scenario_0200 201        target = fs_target202        fs.mkdir(target)203 204        for source_slash, target_slash in zip([False, True], [False, True]):205            s = fs_join(source, "subdir")206            if source_slash:207                s += "/"208            t = fs_join(target, "newdir")209            if target_slash:210                t += "/"211 212            # Without recursive does nothing213            fs.cp(s, t)214            if supports_empty_directories:215                assert fs.ls(target) == []216            else:217                with pytest.raises(FileNotFoundError):218                    fs.ls(target)219 220            # With recursive221            fs.cp(s, t, recursive=True)222            assert fs.isdir(fs_join(target, "newdir"))223            assert fs.isfile(fs_join(target, "newdir", "subfile1"))224            assert fs.isfile(fs_join(target, "newdir", "subfile2"))225            assert fs.isdir(fs_join(target, "newdir", "nesteddir"))226            assert fs.isfile(fs_join(target, "newdir", "nesteddir", "nestedfile"))227            assert not fs.exists(fs_join(target, "subdir"))228 229            fs.rm(fs_join(target, "newdir"), recursive=True)230            assert not fs.exists(fs_join(target, "newdir"))231 232            # Limit recursive by maxdepth233            fs.cp(s, t, recursive=True, maxdepth=1)234            assert fs.isdir(fs_join(target, "newdir"))235            assert fs.isfile(fs_join(target, "newdir", "subfile1"))236            assert fs.isfile(fs_join(target, "newdir", "subfile2"))237            assert not fs.exists(fs_join(target, "newdir", "nesteddir"))238            assert not fs.exists(fs_join(target, "subdir"))239 240            fs.rm(fs_join(target, "newdir"), recursive=True)241            assert not fs.exists(fs_join(target, "newdir"))242 243    def test_copy_glob_to_existing_directory(244        self,245        fs,246        fs_join,247        fs_bulk_operations_scenario_0,248        fs_target,249        supports_empty_directories,250    ):251        # Copy scenario 1g252        source = fs_bulk_operations_scenario_0253 254        target = fs_target255        fs.mkdir(target)256        if not supports_empty_directories:257            # Force target directory to exist by adding a dummy file258            dummy = fs_join(target, "dummy")259            fs.touch(dummy)260        assert fs.isdir(target)261 262        for target_slash in [False, True]:263            t = target + "/" if target_slash else target264 265            # Without recursive266            fs.cp(fs_join(source, "subdir", "*"), t)267            assert fs.isfile(fs_join(target, "subfile1"))268            assert fs.isfile(fs_join(target, "subfile2"))269            assert not fs.isdir(fs_join(target, "nesteddir"))270            assert not fs.exists(fs_join(target, "nesteddir", "nestedfile"))271            assert not fs.exists(fs_join(target, "subdir"))272 273            fs.rm(274                [275                    fs_join(target, "subfile1"),276                    fs_join(target, "subfile2"),277                ],278                recursive=True,279            )280            assert fs.ls(target, detail=False) == (281                [] if supports_empty_directories else [dummy]282            )283 284            # With recursive285            for glob, recursive in zip(["*", "**"], [True, False]):286                fs.cp(fs_join(source, "subdir", glob), t, recursive=recursive)287                assert fs.isfile(fs_join(target, "subfile1"))288                assert fs.isfile(fs_join(target, "subfile2"))289                assert fs.isdir(fs_join(target, "nesteddir"))290                assert fs.isfile(fs_join(target, "nesteddir", "nestedfile"))291                assert not fs.exists(fs_join(target, "subdir"))292 293                fs.rm(294                    [295                        fs_join(target, "subfile1"),296                        fs_join(target, "subfile2"),297                        fs_join(target, "nesteddir"),298                    ],299                    recursive=True,300                )301                assert fs.ls(target, detail=False) == (302                    [] if supports_empty_directories else [dummy]303                )304 305                # Limit recursive by maxdepth306                fs.cp(307                    fs_join(source, "subdir", glob), t, recursive=recursive, maxdepth=1308                )309                assert fs.isfile(fs_join(target, "subfile1"))310                assert fs.isfile(fs_join(target, "subfile2"))311                assert not fs.exists(fs_join(target, "nesteddir"))312                assert not fs.exists(fs_join(target, "subdir"))313 314                fs.rm(315                    [316                        fs_join(target, "subfile1"),317                        fs_join(target, "subfile2"),318                    ],319                    recursive=True,320                )321                assert fs.ls(target, detail=False) == (322                    [] if supports_empty_directories else [dummy]323                )324 325    def test_copy_glob_to_new_directory(326        self, fs, fs_join, fs_bulk_operations_scenario_0, fs_target327    ):328        # Copy scenario 1h329        source = fs_bulk_operations_scenario_0330 331        target = fs_target332        fs.mkdir(target)333 334        for target_slash in [False, True]:335            t = fs_join(target, "newdir")336            if target_slash:337                t += "/"338 339            # Without recursive340            fs.cp(fs_join(source, "subdir", "*"), t)341            assert fs.isdir(fs_join(target, "newdir"))342            assert fs.isfile(fs_join(target, "newdir", "subfile1"))343            assert fs.isfile(fs_join(target, "newdir", "subfile2"))344            assert not fs.exists(fs_join(target, "newdir", "nesteddir"))345            assert not fs.exists(fs_join(target, "newdir", "nesteddir", "nestedfile"))346            assert not fs.exists(fs_join(target, "subdir"))347            assert not fs.exists(fs_join(target, "newdir", "subdir"))348 349            fs.rm(fs_join(target, "newdir"), recursive=True)350            assert not fs.exists(fs_join(target, "newdir"))351 352            # With recursive353            for glob, recursive in zip(["*", "**"], [True, False]):354                fs.cp(fs_join(source, "subdir", glob), t, recursive=recursive)355                assert fs.isdir(fs_join(target, "newdir"))356                assert fs.isfile(fs_join(target, "newdir", "subfile1"))357                assert fs.isfile(fs_join(target, "newdir", "subfile2"))358                assert fs.isdir(fs_join(target, "newdir", "nesteddir"))359                assert fs.isfile(fs_join(target, "newdir", "nesteddir", "nestedfile"))360                assert not fs.exists(fs_join(target, "subdir"))361                assert not fs.exists(fs_join(target, "newdir", "subdir"))362 363                fs.rm(fs_join(target, "newdir"), recursive=True)364                assert not fs.exists(fs_join(target, "newdir"))365 366                # Limit recursive by maxdepth367                fs.cp(368                    fs_join(source, "subdir", glob), t, recursive=recursive, maxdepth=1369                )370                assert fs.isdir(fs_join(target, "newdir"))371                assert fs.isfile(fs_join(target, "newdir", "subfile1"))372                assert fs.isfile(fs_join(target, "newdir", "subfile2"))373                assert not fs.exists(fs_join(target, "newdir", "nesteddir"))374                assert not fs.exists(fs_join(target, "subdir"))375                assert not fs.exists(fs_join(target, "newdir", "subdir"))376 377                fs.rm(fs_join(target, "newdir"), recursive=True)378                assert not fs.exists(fs_join(target, "newdir"))379 380    @pytest.mark.parametrize(381        GLOB_EDGE_CASES_TESTS["argnames"],382        GLOB_EDGE_CASES_TESTS["argvalues"],383    )384    def test_copy_glob_edge_cases(385        self,386        path,387        recursive,388        maxdepth,389        expected,390        fs,391        fs_join,392        fs_glob_edge_cases_files,393        fs_target,394        fs_sanitize_path,395    ):396        # Copy scenario 1g397        source = fs_glob_edge_cases_files398 399        target = fs_target400 401        for new_dir, target_slash in product([True, False], [True, False]):402            fs.mkdir(target)403 404            t = fs_join(target, "newdir") if new_dir else target405            t = t + "/" if target_slash else t406 407            fs.copy(fs_join(source, path), t, recursive=recursive, maxdepth=maxdepth)408 409            output = fs.find(target)410            if new_dir:411                prefixed_expected = [412                    fs_sanitize_path(fs_join(target, "newdir", p)) for p in expected413                ]414            else:415                prefixed_expected = [416                    fs_sanitize_path(fs_join(target, p)) for p in expected417                ]418            assert sorted(output) == sorted(prefixed_expected)419 420            try:421                fs.rm(target, recursive=True)422            except FileNotFoundError:423                pass424 425    def test_copy_list_of_files_to_existing_directory(426        self,427        fs,428        fs_join,429        fs_bulk_operations_scenario_0,430        fs_target,431        supports_empty_directories,432    ):433        # Copy scenario 2a434        source = fs_bulk_operations_scenario_0435 436        target = fs_target437        fs.mkdir(target)438        if not supports_empty_directories:439            # Force target directory to exist by adding a dummy file440            dummy = fs_join(target, "dummy")441            fs.touch(dummy)442        assert fs.isdir(target)443 444        source_files = [445            fs_join(source, "file1"),446            fs_join(source, "file2"),447            fs_join(source, "subdir", "subfile1"),448        ]449 450        for target_slash in [False, True]:451            t = target + "/" if target_slash else target452 453            fs.cp(source_files, t)454            assert fs.isfile(fs_join(target, "file1"))455            assert fs.isfile(fs_join(target, "file2"))456            assert fs.isfile(fs_join(target, "subfile1"))457 458            fs.rm(459                [460                    fs_join(target, "file1"),461                    fs_join(target, "file2"),462                    fs_join(target, "subfile1"),463                ],464                recursive=True,465            )466            assert fs.ls(target, detail=False) == (467                [] if supports_empty_directories else [dummy]468            )469 470    def test_copy_list_of_files_to_new_directory(471        self, fs, fs_join, fs_bulk_operations_scenario_0, fs_target472    ):473        # Copy scenario 2b474        source = fs_bulk_operations_scenario_0475 476        target = fs_target477        fs.mkdir(target)478 479        source_files = [480            fs_join(source, "file1"),481            fs_join(source, "file2"),482            fs_join(source, "subdir", "subfile1"),483        ]484 485        fs.cp(source_files, fs_join(target, "newdir") + "/")  # Note trailing slash486        assert fs.isdir(fs_join(target, "newdir"))487        assert fs.isfile(fs_join(target, "newdir", "file1"))488        assert fs.isfile(fs_join(target, "newdir", "file2"))489        assert fs.isfile(fs_join(target, "newdir", "subfile1"))490 491    def test_copy_two_files_new_directory(492        self, fs, fs_join, fs_bulk_operations_scenario_0, fs_target493    ):494        # This is a duplicate of test_copy_list_of_files_to_new_directory and495        # can eventually be removed.496        source = fs_bulk_operations_scenario_0497 498        target = fs_target499        assert not fs.exists(target)500        fs.cp([fs_join(source, "file1"), fs_join(source, "file2")], target)501 502        assert fs.isdir(target)503        assert fs.isfile(fs_join(target, "file1"))504        assert fs.isfile(fs_join(target, "file2"))505 506    def test_copy_directory_without_files_with_same_name_prefix(507        self,508        fs,509        fs_join,510        fs_target,511        fs_dir_and_file_with_same_name_prefix,512        supports_empty_directories,513    ):514        # Create the test dirs515        source = fs_dir_and_file_with_same_name_prefix516        target = fs_target517 518        # Test without glob519        fs.cp(fs_join(source, "subdir"), target, recursive=True)520 521        assert fs.isfile(fs_join(target, "subfile.txt"))522        assert not fs.isfile(fs_join(target, "subdir.txt"))523 524        fs.rm([fs_join(target, "subfile.txt")])525        if supports_empty_directories:526            assert fs.ls(target) == []527        else:528            assert not fs.exists(target)529 530        # Test with glob531        fs.cp(fs_join(source, "subdir*"), target, recursive=True)532 533        assert fs.isdir(fs_join(target, "subdir"))534        assert fs.isfile(fs_join(target, "subdir", "subfile.txt"))535        assert fs.isfile(fs_join(target, "subdir.txt"))536 537    def test_copy_with_source_and_destination_as_list(538        self, fs, fs_target, fs_join, fs_10_files_with_hashed_names539    ):540        # Create the test dir541        source = fs_10_files_with_hashed_names542        target = fs_target543 544        # Create list of files for source and destination545        source_files = []546        destination_files = []547        for i in range(10):548            hashed_i = md5(str(i).encode("utf-8")).hexdigest()549            source_files.append(fs_join(source, f"{hashed_i}.txt"))550            destination_files.append(fs_join(target, f"{hashed_i}.txt"))551 552        # Copy and assert order was kept553        fs.copy(path1=source_files, path2=destination_files)554 555        for i in range(10):556            file_content = fs.cat(destination_files[i]).decode("utf-8")557            assert file_content == str(i)558 
codekingpro/portable-devtools · Team Ai