# 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

    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