'''
Copyright (C) 2019 Vanessa Sochat.
This Source Code Form is subject to the terms of the
Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
from watchme.logger import bot
from watchme.command import (
get_commits,
git_show,
git_date
)
import os
import json
# Data Exports
[docs]def export_dict(self, task,
filename,
name=None,
export_json=False,
from_commit=None,
to_commit=None,
base=None):
'''Export a data frame of changes for a filename over time.
Parameters
==========
task: the task folder for the watcher to look in
name: the name of the watcher, defaults to the client's
base: the base of watchme to look for the task folder
from_commit: the commit to start at
to_commit: the commit to go to
grep: the expression to match (not used if None)
filename: the filename to filter to. Includes all files if not specified.
'''
if name is None:
name = self.name
if base is None:
base = self.base
# Quit early if the task isn't there
if not self.has_task(task) and not task.startswith('decorator'):
bot.exit('%s is not a valid task or decorator for %s' % (task, name))
repo = os.path.join(base, self.name)
if not os.path.exists(repo):
bot.exit('%s does not exist.' % repo)
filepath = os.path.join(base, self.name, task, filename)
# Ensure that the filename exists in the repository
if not os.path.exists(filepath):
bot.exit('%s does not exist for watcher %s' %(filepath, name))
# Now filepath must be relative to the repo
filepath = os.path.join(task, filename)
commits = get_commits(repo=repo,
from_commit=from_commit,
to_commit=to_commit,
grep="ADD results %s" % task,
filename=filepath)
# Keep lists of commits, dates, content
result = {'commits': [], 'dates': [], 'content': []}
# Empty content (or other) returns None
for commit in commits:
content = git_show(repo=repo, commit=commit, filename=filepath)
if export_json is True:
content = json.loads(content)
# If it's a list, add it to content
if isinstance(content, list):
result['content'] += content
# Otherwise, append
else:
result['content'].append(content)
result['dates'].append(git_date(repo=repo, commit=commit))
result['commits'].append(commit)
return result