Пример #1
0
def test_init_download(monkeypatch):
    mocked_api = Mock()
    mocked_rmtree = Mock()
    mocked_url = Mock()
    monkeypatch.setattr('koneko.api.myapi', mocked_api)
    monkeypatch.setattr('koneko.files.dir_not_empty', lambda x: False)
    monkeypatch.setattr('koneko.download.rmtree', mocked_rmtree)
    monkeypatch.setattr('koneko.download.itertools.filterfalse',
                        lambda *a: [mocked_url] * 2)
    monkeypatch.setattr('koneko.download.os.makedirs',
                        lambda *a, **k: True)  # Disable

    mocked_data = Mock()
    mocked_data.all_urls = [Mock()] * 2
    mocked_tracker = Mock()
    download.init_download(mocked_data, mocked_tracker)

    assert mocked_rmtree.call_args_list == [call(mocked_data.download_path)]
    assert mocked_data.method_calls == [call.download_path.is_dir()]
    assert 'page_num' in dir(mocked_data)
    assert 'newnames_with_ext' in dir(mocked_data)

    assert mocked_tracker.method_calls == [call.update(mocked_url)] * 2

    assert mocked_api.method_calls == [
        call.protected_download(mocked_data.all_urls[0],
                                mocked_data.download_path, mocked_url),
        call.protected_download(mocked_data.all_urls[1],
                                mocked_data.download_path, mocked_url)
    ]
Пример #2
0
    def _prefetch_next_page(self) -> 'IO':
        # Wait for initial request to finish, so the data object is instantiated
        # Else next_url won't be set yet
        self._maybe_join_thread()

        if self._data.next_url is None:
            return True
        # For some reason, if next_url is None, this statement doesn't catch it (???)
        if not (self._data.next_url or self._data.next_offset.isdigit()
                or self._data.is_immediate_next):
            return True

        next_offset = self._data.next_offset
        if self._data.offset == next_offset:
            return
        self._data.offset = next_offset
        self._request_then_save(self._data.page_num + 1)
        new = self._data.clone_with_page(int(self._data.offset) // 30 + 1)
        download.init_download(new, None)
Пример #3
0
    def _prefetch_next_page(self) -> 'IO':
        # Wait for initial request to finish, so the data object is instantiated
        # Else next_url won't be set yet
        self._maybe_join_thread()
        if not self._data.next_url:  # Last page
            return True

        if not self._data.next_offset.isdigit():
            return True
        # Won't download if not immediately next page, eg
        # p1 (p2 prefetched) -> p2 (p3) -> p1 -> p2 (p4 won't prefetch)
        offset_diffs = int(self._data.next_offset) - int(self._data.offset)
        immediate_next: bool = offset_diffs <= 30
        if not immediate_next:
            return

        oldnum = self._data.page_num
        self._data.offset = self._data.next_offset
        self._data.page_num = int(self._data.offset) // 30 + 1

        self._request_then_save()
        download.init_download(self._data, None)

        self._data.page_num = oldnum
Пример #4
0
 def _download_from_scratch(self) -> 'IO':
     files.remove_dir_if_exist(self._data)
     self._request_then_save()
     download.init_download(self._data, self._tracker_class(self._data))
     self._print_page_info()
Пример #5
0
 def _verify_up_to_date(self):
     if files.dir_not_empty(self._data):
         return True
     files.remove_dir_if_exist(self._data)
     download.init_download(self._data, self._tracker_class(self._data))
Пример #6
0
def test_init_download_dir_has_files(monkeypatch):
    monkeypatch.setattr('koneko.files.dir_not_empty', lambda x: True)
    assert download.init_download(None, None) is True
Пример #7
0
 def _download_save_images(self):
     tracker = self._tracker_class(self._data)
     download.init_download(self._data, tracker)
     self.images = tracker.images