#!/usr/bin/env python
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See http://swift.org/LICENSE.txt for license information
# See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors

import util
from simplebuild import *

class GetFileInfoRule(SimpleAsyncRule):
    """
    Rule which synchronizes the state of external file.
    """

    def __init__(self, path):
        self.path = str(path)

    def run(self):
        util.note("getting file info: %r" % (self.path,))
        return util.get_stat_info(self.path)

    def is_data_valid(self, engine, data):
        # Check if the current info is up-to-date.
        util.note("checking file info: %r" % (self.path,))
        return util.get_stat_info(self.path) == data


    
class CountLinesRule(SimpleAsyncRule):
    def __init__(self, path):
        self.path = str(path)

    def run(self):
        with open(self.path) as file:
            return len(file.readlines())

    def start(self, engine):
        engine.task_needs_input(self, GetFileInfoRule.asKey(self.path),
                                input_id=0)

    def provide_data(self, engine, input_id, data):
        pass

# Get the input path.
_,path = sys.argv

# Run the job
engine = DataDrivenEngine(globals())
engine.attach_db(".count-lines.db")

result = engine.build(CountLinesRule.asKey(path))
print result
