Exemplo n.º 1
0
def test_process_broken_link_move(mocker, capsys):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output', move=True)
    phockup.process_file("input/not_a_file.jpg")
    assert 'skipped, no such file or directory' in capsys.readouterr()[0]
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 2
0
def test_process_broken_link_move(mocker, capsys):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output', move=True)
    phockup.process_file("input/not_a_file.jpg")
    assert 'skipped, no such file or directory' in capsys.readouterr()[0]
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 3
0
def test_removing_trailing_slash_for_input_output(mocker):
    mocker.patch('os.makedirs')
    mocker.patch('sys.exit')
    if sys.platform == 'win32':
        phockup = Phockup('in\\', 'out\\')
    else:
        phockup = Phockup('in/', 'out/')
    assert phockup.input_dir == 'in'
    assert phockup.output_dir == 'out'
Exemplo n.º 4
0
def test_process_broken_link_move(mocker, caplog):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output', move=True)
    phockup.process_file("input/not_a_file.jpg")
    with caplog.at_level(logging.WARNING):
        Phockup('input', 'output').process_file("input/not_a_file.jpg")
    assert 'skipped, no such file or directory' in caplog.text
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 5
0
def test_process_exists_same(mocker, capsys):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("input/exif.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    phockup.process_file("input/exif.jpg")
    assert 'skipped, duplicated file' in capsys.readouterr()[0]
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 6
0
def test_process_same_date_different_files_rename(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("input/exif.jpg")
    mocker.patch.object(Exif, 'data')
    Exif.data.return_value = {
        "MIMEType": "image/jpeg",
        "CreateDate": "2017:01:01 01:01:01"
    }
    phockup.process_file("input/date_20170101_010101.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101-2.jpg")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 7
0
def test_error_for_no_write_access_when_creating_output_dir(mocker, capsys):
    mocker.patch.object(Phockup, 'walk_directory')
    mocker.patch('os.makedirs', side_effect=Exception("No write access"))
    mocker.patch('sys.exit')
    Phockup('input', '/root/phockup')
    sys.exit.assert_called_once_with(1)
    assert 'No write access' in capsys.readouterr()[0]
Exemplo n.º 8
0
def test_get_file_name(mocker):
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    date = {"date": datetime(2017, 1, 1, 1, 1, 1), "subseconds": "20"}

    assert Phockup('in', 'out').get_file_name("Bar/Foo.jpg",
                                              date) == "20170101-01010120.jpg"
Exemplo n.º 9
0
def test_process_image_exif_date(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    Phockup('input', 'output').process_file("input/exif.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 10
0
def test_walking_directory():
    shutil.rmtree('output', ignore_errors=True)
    Phockup('input', 'output')
    dir1 = 'output/2017/01/01'
    dir2 = 'output/2017/10/06'
    dir3 = 'output/unknown'
    dir4 = 'output/2018/01/01/'
    assert os.path.isdir(dir1)
    assert os.path.isdir(dir2)
    assert os.path.isdir(dir3)
    assert os.path.isdir(dir4)
    assert len([
        name for name in os.listdir(dir1)
        if os.path.isfile(os.path.join(dir1, name))
    ]) == 3
    assert len([
        name for name in os.listdir(dir2)
        if os.path.isfile(os.path.join(dir2, name))
    ]) == 1
    assert len([
        name for name in os.listdir(dir3)
        if os.path.isfile(os.path.join(dir3, name))
    ]) == 1
    assert len([
        name for name in os.listdir(dir4)
        if os.path.isfile(os.path.join(dir4, name))
    ]) == 1
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 11
0
def test_process_other(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    Phockup('input', 'output').process_file("input/other.txt")
    assert os.path.isfile("output/unknown/other.txt")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 12
0
def test_exception_if_missing_input_directory(mocker):
    mocker.patch('os.makedirs')
    mocker.patch('sys.exit')

    with pytest.raises(RuntimeError,
                       match="Input directory 'in' does not exist"):
        Phockup('in', 'out')
Exemplo n.º 13
0
def test_process_move(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    mocker.patch.object(Exif, 'data')
    Exif.data.return_value = {"MIMEType": "image/jpeg"}
    phockup = Phockup('input', 'output', move=True)
    open("input/tmp_20170101_010101.jpg", "w").close()
    open("input/tmp_20170101_010101.xmp", "w").close()
    phockup.process_file("input/tmp_20170101_010101.jpg")
    phockup.process_file("input/tmp_20170101_010101.xmp")
    assert not os.path.isfile("input/tmp_20170101_010101.jpg")
    assert not os.path.isfile("input/tmp_20170101_010101.xmp")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.xmp")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 14
0
def test_keep_original_filenames_and_filenames_case(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    Phockup('input', 'output', original_filenames=True).process_file("input/UNKNOWN.jpg")
    assert os.path.isfile("output/2017/10/06/UNKNOWN.jpg")
    assert not 'unknown.jpg' in os.listdir("output/2017/10/06")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 15
0
def test_keep_original_filenames(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    Phockup('input', 'output', original_filenames=True).process_file("input/exif.jpg")
    assert os.path.isfile("output/2017/01/01/exif.jpg")
    assert not os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 16
0
def test_exception_if_input_not_directory(mocker):
    mocker.patch('os.makedirs')
    mocker.patch('sys.exit')

    with pytest.raises(
            RuntimeError,
            match="Input directory 'input/exif.jpg' is not a directory"):
        Phockup('input/exif.jpg', 'out')
Exemplo n.º 17
0
def test_process_skip_ignored_file():
    shutil.rmtree('output', ignore_errors=True)
    shutil.rmtree('input_ignored', ignore_errors=True)
    os.mkdir('input_ignored')
    open("input_ignored/.DS_Store", "w").close()
    Phockup('input_ignored', 'output')
    assert not os.path.isfile("output/unknown/.DS_Store")
    shutil.rmtree('output', ignore_errors=True)
    shutil.rmtree('input_ignored', ignore_errors=True)
Exemplo n.º 18
0
def test_process_file_with_filename_date(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    mocker.patch.object(Exif, 'data')
    Exif.data.return_value = {"MIMEType": "image/jpeg"}
    Phockup('input', 'output').process_file("input/date_20170101_010101.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 19
0
def test_process_image_unknown(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    mocker.patch.object(Exif, 'data')
    Exif.data.return_value = {"MIMEType": "image/jpeg"}
    Phockup('input', 'output').process_file("input/UNKNOWN.jpg")
    assert os.path.isfile("output/unknown/unknown.jpg")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 20
0
def test_process_move(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    mocker.patch.object(Exif, 'data')
    Exif.data.return_value = {
        "MIMEType": "image/jpeg"
    }
    phockup = Phockup('input', 'output', move=True)
    open("input/tmp_20170101_010101.jpg", "w").close()
    open("input/tmp_20170101_010101.xmp", "w").close()
    phockup.process_file("input/tmp_20170101_010101.jpg")
    phockup.process_file("input/tmp_20170101_010101.xmp")
    assert not os.path.isfile("input/tmp_20170101_010101.jpg")
    assert not os.path.isfile("input/tmp_20170101_010101.xmp")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.xmp")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 21
0
def test_exception_for_no_write_access_when_creating_output_dir(mocker):
    mocker.patch.object(Phockup, 'walk_directory')
    if sys.platform == 'win32':
        protected_dir = f"{os.getenv('WINDIR')}/phockup"
    else:
        protected_dir = '/root/phockup'
    with pytest.raises(OSError, match="Cannot create output.*"):

        Phockup('input', protected_dir)
Exemplo n.º 22
0
def test_dry_run():
    shutil.rmtree('output', ignore_errors=True)
    Phockup('input', 'output', dry_run=True)
    assert not os.path.isdir('output')
    dir1 = 'output/2017/01/01'
    dir2 = 'output/2017/10/06'
    dir3 = 'output/unknown'
    assert not os.path.isdir(dir1)
    assert not os.path.isdir(dir2)
    assert not os.path.isdir(dir3)
Exemplo n.º 23
0
def main(argv):
    check_dependencies()

    move = False
    link = False
    date_regex = None
    dir_format = os.path.sep.join(['%Y', '%m', '%d'])

    try:
        opts, args = getopt.getopt(argv[2:], "d:r:mlh", ["date=", "regex=", "move", "link", "help"])
    except getopt.GetoptError:
        help(version)
        sys.exit(2)

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            help(version)
            sys.exit(2)

        if opt in ("-d", "--date"):
            if not arg:
                printer.print.error("Date format cannot be empty")
            dir_format = Date().parse(arg)

        if opt in ("-m", "--move"):
            move = True
            printer.line("Using move strategy!")

        if opt in ("-l", "--link"):
            link = True
            printer.line("Using link strategy!")

        if opt in ("-r", "--regex"):
            try:
                date_regex = re.compile(arg)
            except:
                printer.error("Provided regex is invalid!")
                sys.exit(2)

    if link and move:
        printer.error("Can't use move and link strategy together!")
        sys.exit(1)

    if len(argv) < 2:
        help(version)
        sys.exit(2)

    return Phockup(
        argv[0], argv[1],
        dir_format=dir_format,
        move=move,
        link=link,
        date_regex=date_regex
    )
Exemplo n.º 24
0
def test_process_exists_same(mocker, capsys):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("input/exif.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    phockup.process_file("input/exif.jpg")
    assert 'skipped, duplicated file' in capsys.readouterr()[0]
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 25
0
def test_process_exists_same(mocker, caplog):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("input/exif.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101.jpg")
    with caplog.at_level(logging.INFO):
        phockup.process_file("input/exif.jpg")
    assert 'skipped, duplicated file' in caplog.text
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 26
0
def main(options):
    check_dependencies()

    return Phockup(
        options.input_dir,
        options.output_dir,
        dir_format=options.date,
        move=options.move,
        link=options.link,
        date_regex=options.regex,
        original_filenames=options.original_names,
        timestamp=options.timestamp,
        date_field=options.date_field,
        dry_run=options.dry_run,
        quiet=options.quiet,
        max_depth=options.maxdepth,
    )
Exemplo n.º 27
0
def main(options):
    check_dependencies()

    return Phockup(options.input_dir,
                   options.output_dir,
                   dir_format=options.date,
                   move=options.move,
                   link=options.link,
                   date_regex=options.regex,
                   original_filenames=options.original_names,
                   timestamp=options.timestamp,
                   date_field=options.date_field,
                   dry_run=options.dry_run,
                   quiet=options.quiet,
                   progress=options.progress,
                   max_depth=options.maxdepth,
                   file_type=options.file_type,
                   max_concurrency=options.max_concurrency,
                   no_date_dir=options.no_date_dir)
Exemplo n.º 28
0
def test_process_same_date_different_files_rename(mocker):
    shutil.rmtree('output', ignore_errors=True)
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("input/exif.jpg")
    mocker.patch.object(Exif, 'data')
    Exif.data.return_value = {
        "MIMEType": "image/jpeg",
        "CreateDate": "2017:01:01 01:01:01"
    }
    phockup.process_file("input/date_20170101_010101.jpg")
    assert os.path.isfile("output/2017/01/01/20170101-010101-2.jpg")
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 29
0
def test_maxdepth_zero():
    shutil.rmtree('output', ignore_errors=True)
    Phockup('input', 'output', maxdepth=0)
    dir1 = 'output/2017/01/01'
    dir2 = 'output/2017/10/06'
    dir3 = 'output/unknown'
    assert os.path.isdir(dir1)
    assert os.path.isdir(dir2)
    assert os.path.isdir(dir3)
    assert len([
        name for name in os.listdir(dir1)
        if os.path.isfile(os.path.join(dir1, name))
    ]) == 3
    assert len([
        name for name in os.listdir(dir2)
        if os.path.isfile(os.path.join(dir2, name))
    ]) == 1
    assert len([
        name for name in os.listdir(dir3)
        if os.path.isfile(os.path.join(dir3, name))
    ]) == 1
    shutil.rmtree('output', ignore_errors=True)
Exemplo n.º 30
0
def test_error_for_missing_input_dir(mocker, capsys):
    mocker.patch('sys.exit')
    Phockup('in', 'out')
    sys.exit.assert_called_once_with(1)
    assert 'Input directory "in" does not exist' in capsys.readouterr()[0]
Exemplo n.º 31
0
def test_removing_trailing_slash_for_input_output(mocker):
    mocker.patch('os.makedirs')
    mocker.patch('sys.exit')
    phockup = Phockup('in/', 'out/')
    assert phockup.input == 'in'
    assert phockup.output == 'out'
Exemplo n.º 32
0
def test_exit_if_missing_input_directory(mocker):
    mocker.patch('os.makedirs')
    mocker.patch('sys.exit')
    Phockup('in', 'out')
    sys.exit.assert_called_once_with(1)
Exemplo n.º 33
0
def test_process_skip_xmp(mocker):
    # Assume no errors == skip XMP file
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("skip.xmp")
Exemplo n.º 34
0
def test_is_image_or_video(mocker):
    mocker.patch.object(Phockup, 'check_directories')
    assert Phockup('in', '.').is_image_or_video("image/jpeg")
    assert Phockup('in', '.').is_image_or_video("video/mp4")
    assert not Phockup('in', '.').is_image_or_video("foo/bar")
Exemplo n.º 35
0
def test_process_skip_xmp(mocker):
    # Assume no errors == skip XMP file
    mocker.patch.object(Phockup, 'check_directories')
    mocker.patch.object(Phockup, 'walk_directory')
    phockup = Phockup('input', 'output')
    phockup.process_file("skip.xmp")