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) ]
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)
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
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()
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))
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
def _download_save_images(self): tracker = self._tracker_class(self._data) download.init_download(self._data, tracker) self.images = tracker.images