From 1bf1db707cb44535fa2b733c93c1adc467bdf34f Mon Sep 17 00:00:00 2001 From: Serene-Arc Date: Sun, 14 Mar 2021 09:00:00 +1000 Subject: [PATCH] Add XML and YAML to archiver --- bulkredditdownloader/archiver.py | 15 ++++++++-- bulkredditdownloader/tests/test_archiver.py | 32 +++++++++++++++++---- requirements.txt | 2 ++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/bulkredditdownloader/archiver.py b/bulkredditdownloader/archiver.py index a29aaee..d7ad086 100644 --- a/bulkredditdownloader/archiver.py +++ b/bulkredditdownloader/archiver.py @@ -4,7 +4,9 @@ import json import logging +import dict2xml import praw.models +import yaml from bulkredditdownloader.archive_entry import ArchiveEntry from bulkredditdownloader.configuration import Configuration @@ -45,7 +47,16 @@ class Archiver(RedditDownloader): json.dump(entry.compile(), file) def _write_submission_xml(self, entry: ArchiveEntry): - raise NotImplementedError + resource = Resource(entry.submission, '', '.xml') + file_path = self.file_name_formatter.format_path(resource, self.download_directory) + with open(file_path, 'w') as file: + logger.debug(f'Writing submission {entry.submission.id} to file in XML format at {file_path}') + xml_entry = dict2xml.dict2xml(entry.compile(), wrap='root') + file.write(xml_entry) def _write_submission_yaml(self, entry: ArchiveEntry): - raise NotImplementedError + resource = Resource(entry.submission, '', '.yaml') + file_path = self.file_name_formatter.format_path(resource, self.download_directory) + with open(file_path, 'w') as file: + logger.debug(f'Writing submission {entry.submission.id} to file in YAML format at {file_path}') + yaml.dump(entry.compile(), file) diff --git a/bulkredditdownloader/tests/test_archiver.py b/bulkredditdownloader/tests/test_archiver.py index 7c497ff..a2da7c5 100644 --- a/bulkredditdownloader/tests/test_archiver.py +++ b/bulkredditdownloader/tests/test_archiver.py @@ -26,11 +26,31 @@ def test_write_submission_json(test_submission_id: str, tmp_path: Path, reddit_i assert test_path.exists() -@pytest.mark.skip -def test_write_submission_xml(): - raise NotImplementedError +@pytest.mark.online +@pytest.mark.reddit +@pytest.mark.parametrize('test_submission_id', ( + 'm3reby', +)) +def test_write_submission_xml(test_submission_id: str, tmp_path: Path, reddit_instance: praw.Reddit): + archiver_mock = MagicMock() + test_path = Path(tmp_path, 'test.xml') + test_submission = reddit_instance.submission(id=test_submission_id) + archiver_mock.file_name_formatter.format_path.return_value = test_path + test_entry = ArchiveEntry(test_submission) + Archiver._write_submission_xml(archiver_mock, test_entry) + assert test_path.exists() -@pytest.mark.skip -def test_write_submission_yaml(): - raise NotImplementedError +@pytest.mark.online +@pytest.mark.reddit +@pytest.mark.parametrize('test_submission_id', ( + 'm3reby', +)) +def test_write_submission_yaml(test_submission_id: str, tmp_path: Path, reddit_instance: praw.Reddit): + archiver_mock = MagicMock() + test_path = Path(tmp_path, 'test.yaml') + test_submission = reddit_instance.submission(id=test_submission_id) + archiver_mock.file_name_formatter.format_path.return_value = test_path + test_entry = ArchiveEntry(test_submission) + Archiver._write_submission_yaml(archiver_mock, test_entry) + assert test_path.exists() diff --git a/requirements.txt b/requirements.txt index 814a67c..291cf96 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,9 @@ appdirs bs4 click +dict2xml ffmpeg-python praw +pyyaml requests youtube-dl \ No newline at end of file