Beispiel #1
0
def test_list(clone_examples, capsys):
    examples.main(name=None, force=False)
    captured = capsys.readouterr()

    assert 'Basic' in captured.out
    assert 'Intermediate' in captured.out
    assert 'Advanced' in captured.out
Beispiel #2
0
def test_list(clone_examples, capsys):
    examples.main(name=None, force=False)
    captured = capsys.readouterr()

    assert examples._DEFAULT_BRANCH in captured.out
    assert 'Ploomber examples' in captured.out
    assert 'Templates' in captured.out
    assert 'Guides' in captured.out
    assert 'Cookbook' in captured.out
Beispiel #3
0
def test_error_if_already_exists(clone_examples, tmp_directory):
    examples.main(name='templates/ml-online', force=False)

    with pytest.raises(ClickException) as excinfo:
        examples.main(name='templates/ml-online', force=False)

    expected = ("'templates/ml-online' already exists in the current working "
                "directory, please rename it or move it to another "
                "location and try again.")
    assert expected == str(excinfo.value)
Beispiel #4
0
def test_do_not_clone_if_recent(clone_examples, monkeypatch):
    # mock metadata to make it look recent
    metadata = _mock_metadata()
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # prevent actual deletion
    monkeypatch.setattr(examples.shutil, 'rmtree', lambda _: None)

    examples.main(name=None, force=False)

    mock_run.assert_not_called()
Beispiel #5
0
def test_clones_if_outdated(clone_examples, monkeypatch):
    # mock metadata to make it look older
    metadata = dict(timestamp=(datetime.now() - timedelta(days=1)).timestamp())
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # prevent actual deletion
    monkeypatch.setattr(examples.shutil, 'rmtree', lambda _: None)

    examples.main(name=None, force=False, catch_exception=False)

    mock_run.assert_called_once()
Beispiel #6
0
def test_force_clone(clone_examples, monkeypatch):
    # mock metadata to make it look recent
    metadata = dict(timestamp=datetime.now().timestamp())
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # prevent actual deletion
    monkeypatch.setattr(examples.shutil, 'rmtree', lambda _: None)

    # force download
    examples.main(name=None, force=True, catch_exception=False)

    mock_run.assert_called_once()
Beispiel #7
0
def test_error_if_git_clone_fails(monkeypatch):
    # mock metadata to make it look recent
    metadata = dict(timestamp=datetime.now().timestamp())
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    mock_run = Mock(side_effect=Exception('message'))
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    with pytest.raises(RuntimeError) as excinfo:
        examples.main(name=None, force=True)

    assert str(excinfo.value) == (
        'An error occurred when downloading '
        'examples. Verify git is installed and your internet connection. '
        "(Error message: 'message')")
Beispiel #8
0
def test_clones_if_corrupted_metadata(clone_examples, tmp_directory,
                                      monkeypatch):
    # corrupt metadata
    not_json = Path(tmp_directory, 'not.json')
    not_json.write_text('hello')
    monkeypatch.setattr(examples._ExamplesManager, 'path_to_metadata',
                        not_json)

    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # prevent actual deletion
    monkeypatch.setattr(examples.shutil, 'rmtree', lambda _: None)

    examples.main(name=None, force=False)

    mock_run.assert_called_once()
Beispiel #9
0
def test_clones_if_different_branch(clone_examples, monkeypatch, capsys):
    # mock metadata to make it look like it's a copy from another branch
    metadata = _mock_metadata(branch='another-branch')
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # prevent actual deletion
    monkeypatch.setattr(examples.shutil, 'rmtree', lambda _: None)

    examples.main(name=None, force=False, branch='some-new-branch')

    mock_run.assert_called_once()
    captured = capsys.readouterr()
    assert 'Different branch requested...' in captured.out
Beispiel #10
0
def test_clones_if_outdated(clone_examples, monkeypatch, capsys):
    # mock metadata to make it look older
    metadata = _mock_metadata(timestamp=(datetime.now() -
                                         timedelta(days=1)).timestamp(),
                              branch='another-branch')
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # prevent actual deletion
    monkeypatch.setattr(examples.shutil, 'rmtree', lambda _: None)

    examples.main(name=None, force=False)

    mock_run.assert_called_once()
    captured = capsys.readouterr()
    assert 'Examples copy is more than 1 day old...' in captured.out
Beispiel #11
0
def test_clones_in_home_directory(monkeypatch, tmp_directory):
    # patch home directory
    monkeypatch.setattr(examples, '_home', str(tmp_directory))

    # mock subprocess.run
    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # mock list, otherwise this will fail since we aren't cloning
    monkeypatch.setattr(examples._ExamplesManager, 'list', lambda _: None)

    examples.main(name=None, force=False)

    # check clones inside home directory
    mock_run.assert_called_once_with([
        'git', 'clone', '--depth', '1', '--branch', examples._DEFAULT_BRANCH,
        'https://github.com/ploomber/projects',
        str(Path(tmp_directory, 'projects'))
    ],
                                     check=True)
Beispiel #12
0
def test_change_default_branch(monkeypatch, tmp_directory):
    # mock metadata to make it look older
    metadata = _mock_metadata(timestamp=(datetime.now() -
                                         timedelta(days=1)).timestamp())
    monkeypatch.setattr(examples._ExamplesManager, 'load_metadata',
                        lambda _: metadata)

    # mock subprocess.run
    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # mock list, otherwise this will fail since we aren't cloning
    monkeypatch.setattr(examples._ExamplesManager, 'list', lambda _: None)

    examples.main(name=None, force=False, branch='custom-branch')

    # check clones inside home directory
    mock_run.assert_called_once_with([
        'git', 'clone', '--depth', '1', '--branch', 'custom-branch',
        'https://github.com/ploomber/projects',
        str(Path('~', '.ploomber', 'projects').expanduser())
    ],
                                     check=True)
Beispiel #13
0
def test_does_not_download_again_if_no_explicit_branch_requested(
        monkeypatch, tmp_directory):
    dir_ = Path(tmp_directory, 'examples')
    monkeypatch.setattr(examples, '_home', dir_)

    examples.main(name=None, force=False)

    # fake metadata to make it believe that we got if from another branch
    meta = json.loads((dir_ / '.metadata').read_text())
    meta['branch'] = 'some-other-branch'
    (dir_ / '.metadata').write_text(json.dumps(meta))

    # mock it so we test if we downloaded again
    mock_run = Mock()
    monkeypatch.setattr(examples.subprocess, 'run', mock_run)

    # if called again but no force nor branch arg, it shouldn't download again
    examples.main(name=None, force=False, branch=None)
    examples.main(name='templates/ml-online', force=False, branch=None)

    mock_run.assert_not_called()
Beispiel #14
0
def clone_examples():
    examples.main(name=None, force=False)
Beispiel #15
0
def test_copy_example(clone_examples, tmp_directory):
    examples.main(name='ml-online', force=False)
    assert Path(tmp_directory, 'ml-online').exists()
Beispiel #16
0
def test_error_unknown_example(clone_examples, capsys):
    examples.main(name='not-an-example', force=False)
    captured = capsys.readouterr()
    assert "There is no example named 'not-an-example'" in captured.out
Beispiel #17
0
def test_copy_to_custom_directory(clone_examples, tmp_directory, target):
    examples.main('templates/ml-online', output=target)

    assert Path(tmp_directory, target).is_dir()
    assert Path(tmp_directory, target, 'src', 'ml_online').is_dir()
Beispiel #18
0
def test_copy_example(clone_examples, tmp_directory):
    examples.main(name='templates/ml-online', force=False)

    assert Path(tmp_directory, 'templates/ml-online').is_dir()
    assert Path(tmp_directory, 'templates/ml-online', 'src',
                'ml_online').is_dir()
Beispiel #19
0
def clone_examples():
    examples.main(name=None, force=True)