7

そのレポジトリからソース コードを複製しました(これが本当のプロジェクト名です、ええ、私は知っています...)。次のコマンドで開発用にインストールしようとしました:

pip install -r requirements.txt
python setup.py develop

うまくいきました。その後、次の方法でテストを実行しようとしました:

py.test

次のエラーが発生しました。

================================== FAILURES ===================================
_______________________________ test_load_rule ________________________________

mocker = <pytest_mock.MockFixture object at 0x03275A10>

    def test_load_rule(mocker):
        match = object()
        get_new_command = object()
        load_source = mocker.patch(
            'thefuck.main.load_source',
            return_value=Mock(match=match,
                              get_new_command=get_new_command,
                              enabled_by_default=True,
                              priority=900))
        assert main.load_rule(Path('/rules/bash.py')) \
               == Rule('bash', match, get_new_command, priority=900)
>       load_source.assert_called_once_with('bash', '/rules/bash.py')

tests\test_main.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
C:\Python34\lib\unittest\mock.py:782: in assert_called_once_with
    return self.assert_called_with(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

_mock_self = <MagicMock name='load_source' id='52977776'>
args = ('bash', '/rules/bash.py'), kwargs = {}
expected = (('bash', '/rules/bash.py'), {})
_error_message = <function NonCallableMock.assert_called_with.<locals>._error_me
ssage at 0x032A1030>
actual = call('bash', '\\rules\\bash.py'), cause = None

    def assert_called_with(_mock_self, *args, **kwargs):
        """assert that the mock was called with the specified arguments.

            Raises an AssertionError if the args and keyword args passed in are
            different to the last call to the mock."""
        self = _mock_self
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            raise AssertionError('Expected call: %s\nNot called' % (expected,))

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher((args, kwargs))
        actual = self._call_matcher(self.call_args)
        if expected != actual:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: Expected call: load_source('bash', '/rules/bash.py')

E           Actual call: load_source('bash', '\\rules\\bash.py')

C:\Python34\lib\unittest\mock.py:771: AssertionError
__________________ TestGetRules.test_get[conf_rules0-rules0] __________________

self = <tests.test_main.TestGetRules object at 0x03286F50>
monkeypatch = <_pytest.monkeypatch.monkeypatch object at 0x03286CD0>
glob = <MagicMock name='glob' id='52981200'>, conf_rules = []
rules = ['bash', 'lisp', 'bash', 'lisp']

    @pytest.mark.parametrize('conf_rules, rules', [
        (conf.DEFAULT_RULES, ['bash', 'lisp', 'bash', 'lisp']),
        (types.RulesNamesList(['bash']), ['bash', 'bash'])])
    def test_get(self, monkeypatch, glob, conf_rules, rules):
>       glob.return_value = [PosixPath('bash.py'), PosixPath('lisp.py')]

tests\test_main.py:35:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'pathlib.PosixPath'>, args = ('bash.py',), kwargs = {}
self = PosixPath('bash.py')

    def __new__(cls, *args, **kwargs):
        if cls is Path:
            cls = WindowsPath if os.name == 'nt' else PosixPath
        self = cls._from_parts(args, init=False)
        if not self._flavour.is_supported:
            raise NotImplementedError("cannot instantiate %r on your system"
>                                     % (cls.__name__,))
E           NotImplementedError: cannot instantiate 'PosixPath' on your system

C:\Python34\lib\site-packages\pathlib-1.0.1-py3.4.egg\pathlib.py:939: NotImpleme
ntedError
__________________ TestGetRules.test_get[conf_rules1-rules1] __________________

self = <tests.test_main.TestGetRules object at 0x032BAB50>
monkeypatch = <_pytest.monkeypatch.monkeypatch object at 0x03275A30>
glob = <MagicMock name='glob' id='53194576'>, conf_rules = ['bash']
rules = ['bash', 'bash']

    @pytest.mark.parametrize('conf_rules, rules', [
        (conf.DEFAULT_RULES, ['bash', 'lisp', 'bash', 'lisp']),
        (types.RulesNamesList(['bash']), ['bash', 'bash'])])
    def test_get(self, monkeypatch, glob, conf_rules, rules):
>       glob.return_value = [PosixPath('bash.py'), PosixPath('lisp.py')]

tests\test_main.py:35:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'pathlib.PosixPath'>, args = ('bash.py',), kwargs = {}
self = PosixPath('bash.py')

    def __new__(cls, *args, **kwargs):
        if cls is Path:
            cls = WindowsPath if os.name == 'nt' else PosixPath
        self = cls._from_parts(args, init=False)
        if not self._flavour.is_supported:
            raise NotImplementedError("cannot instantiate %r on your system"
>                                     % (cls.__name__,))
E           NotImplementedError: cannot instantiate 'PosixPath' on your system

C:\Python34\lib\site-packages\pathlib-1.0.1-py3.4.egg\pathlib.py:939: NotImpleme
ntedError
______________________________ test_side_effect _______________________________

ssh_error = ('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!  ...own_hosts', <function ssh_e
rror.<locals>.reset at 0x033F16F0>, <function ssh_error.<locals>.known_hosts at
0x033F1198>)

    def test_side_effect(ssh_error):
        errormsg, path, reset, known_hosts = ssh_error
        command = Command('ssh user@host', stderr=errormsg)
        side_effect(command, None)
        expected = ['123.234.567.890 asdjkasjdakjsd\n', '111.222.333.444 qwepoiw
qepoiss\n']
>       assert known_hosts(path) == expected
E       assert ['123.234.567...oiwqepoiss\n'] == ['123.234.567....oiwqepoiss\n']

E         At index 1 diff: '98.765.432.321 ejioweojwejrosj\n' != '111.222.333.44
4 qwepoiwqepoiss\n'
E         Left contains more items, first extra item: '111.222.333.444 qwepoiwqe
poiss\n'
E         Use -v to get the full diff

tests\rules\test_ssh_known_host.py:61: AssertionError
=============== 4 failed, 122 passed, 2 skipped in 0.56 seconds ===============

C:\code\thefuck>

このツールは、Linux および UNIX のようなコマンド ラインでのみ動作するように作成されていると思われます。

  • このエラーの理由は何ですか?
  • また、Windows 用に実装されていない Python ライブラリの一部である場合、簡単な修正はありますか?

より良い開発者になるために、オープンソース プロジェクトに取り組みたいと思っています。私の開発タスクに Linux を使用することは問題ではありません。これについて、より経験豊富な開発者の意見を知っていれば助かります。

4

1 に答える 1

11

このエラーの理由は、Windows ではPosixPathが実装されていないためです。しかし、プラットフォームに依存しない POSIX パスの処理PurePosixPathに使用したい場所ならどこでも使用できる があります。PosixPathあるいは、実際にはプラットフォームに依存するパス (つまり/、Linux と\Windows) が必要な場合もあります。その場合は、単に を使用する必要がありますPath

ドキュメントから(継承図の下):

純粋なパスは、いくつかの特別な場合に役立ちます。例えば:

  1. Unix マシンで Windows パスを操作したい場合 (またはその逆)。Unix での実行時に WindowsPath をインスタンス化することはできませんが、PureWindowsPath をインスタンス化することはできます。
于 2018-04-26T09:32:14.797 に答える