Source code for watchme.watchers.data

'''

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