import os
import py
import pytest

import setuptools_scm
from setuptools_scm import dump_version

from setuptools_scm.utils import data_from_mime, do


@pytest.mark.parametrize('cmd', ['ls', 'dir'])
def test_do(cmd, tmpdir):
    if not py.path.local.sysfind(cmd):
        pytest.skip(cmd + ' not found')
    do(cmd, str(tmpdir))


def test_data_from_mime(tmpdir):
    tmpfile = tmpdir.join('test.archival')
    tmpfile.write('name: test\nrevision: 1')

    res = data_from_mime(str(tmpfile))
    assert res == {
        'name': 'test',
        'revision': '1',
    }


def test_version_from_pkginfo(wd):
    wd.write('PKG-INFO', 'Version: 0.1')
    assert wd.version == '0.1'

    # replicate issue 167
    assert wd.get_version(version_scheme="1.{0.distance}.0".format) == '0.1'


def assert_root(monkeypatch, expected_root):
    """
    Patch version_from_scm to simply assert that root is expected root
    """
    def assertion(root, unused_parse):
        assert root == expected_root
    monkeypatch.setattr(setuptools_scm, '_do_parse', assertion)


def test_root_parameter_creation(monkeypatch):
    assert_root(monkeypatch, os.getcwd())
    setuptools_scm.get_version()


def test_root_parameter_pass_by(monkeypatch, tmpdir):
    assert_root(monkeypatch, tmpdir)
    setuptools_scm.get_version(root=tmpdir.strpath)


def test_pretended(monkeypatch):
    pretense = '2345'
    monkeypatch.setenv(setuptools_scm.PRETEND_KEY, pretense)
    assert setuptools_scm.get_version() == pretense


def test_root_relative_to(monkeypatch, tmpdir):
    assert_root(monkeypatch, tmpdir.join('alt').strpath)
    __file__ = tmpdir.join('module/file.py').strpath
    setuptools_scm.get_version(root='../alt', relative_to=__file__)


def test_dump_version(tmpdir):
    sp = tmpdir.strpath

    dump_version(sp, '1.0', 'first.txt')
    assert tmpdir.join('first.txt').read() == '1.0'
    dump_version(sp, '1.0', 'first.py')
    content = tmpdir.join('first.py').read()
    assert repr('1.0') in content
    import ast
    ast.parse(content)


def test_parse_plain(recwarn):
    def parse(root):
        return 'tricked you'
    assert setuptools_scm.get_version(parse=parse) == 'tricked you'
    assert str(recwarn.pop().message) == \
        'version parse result was a string\nplease return a parsed version'
