Пример #1
0
class Config(object):
    def __init__(self):
        self.set_defaults()
        self.parse_args()
        self.read_config()
        self.set_config()

    def set_defaults(self):
        home = os.getenv('HOME')
        now = time.localtime()
        if home:
            # configuration file
            self.config_file = home + os.sep + '.committrackerrc'
            # repository
            self.repository_root = home + os.sep + 'WebKit'
        else:
            self.config_file = None
            self.repository_root = None
        self.verbose = False
        # should we fetch the latest?
        self.do_fetch = True
        # Date to start grabbing commits at.
        self.since = '01/01/{0}'.format(now.tm_year)
        # Date to stop grabbing commits at.
        self.until = None
        self.until = '{0}/{1}/{2}'.format(now.tm_mon, now.tm_mday, now.tm_year)

        self.weekly = False
        # This should be set in the config file in the "People" section!
        # dictionary of people who's contributions we are looking for
        # name -> email address
        self.people = { }

        self.json_file = None

    def parse_args(self):
        parser = argparse.ArgumentParser(description='Count commits by the Adobe Web Platform Team')
        parser.add_argument('--config', default=None, help='Path to config file, default is {0}'.format(self.config_file))
        parser.add_argument('--verbose', action='store_true', help='Turn on verbose mode')
        parser.add_argument('--no-fetch', dest='no_fetch', action='store_true', help="Don't fetch from origin before counting")
        parser.add_argument('--since', default=None, help='Start date for counting. Defaults to Jan 1st of the current year.')
        parser.add_argument('--until', default=None, help='End date for counting.')
        parser.add_argument('--repo', dest='repository_root', default=None, help='Path to WebKit git repository')
        parser.add_argument('--weekly', dest='weekly', action='store_true', default=None, help='Query for every week between since and until, inclusive')
        parser.add_argument('--json-file', dest='json_file', default=None, help='File for writing JSON output')
        self.args = parser.parse_args()

    def read_config(self):
        self.file = SafeConfigParser(allow_no_value=True)
        if self.args.config:
            self.config_file = self.args.config
            with open(self.config_file) as fp:
                self.file.readfp(fp, self.config_file)
        else:
            self.file.read(self.config_file)

    def set_config(self):
        if self.args.verbose:
            self.verbose = True
        elif self.file.has_option('Options', 'verbose'):
            self.verbose = self.file.get_boolean('Options', 'verbose')

        if self.args.no_fetch:
            self.do_fetch = False
        elif self.file.has_option('Options', 'do_fetch'):
            self.do_fetch = self.file.get_boolean('Options', 'do_fetch')

        if self.args.since:
            self.since = self.args.since
        elif self.file.has_option('Options', 'since'):
            self.since = self.file.get('Options', 'since')

        if self.args.until:
            self.until = self.args.until
        elif self.file.has_option('Options', 'until'):
            self.until = self.file.get('Options', 'until')

        if self.args.repository_root:
            self.repository_root = self.args.repostitory_root
        elif self.file.has_option('Options', 'repository_root'):
            self.repository_root = self.file.get('Options', 'repository_root')

        if self.args.json_file:
            self.json_file = self.args.json_file
        elif self.file.has_option('Options', 'json_file'):
            self.json_file = self.file.get('Options', 'json_file')

        if self.args.weekly:
            self.weekly = self.args.weekly
        elif self.file.has_option('Options', 'weekly'):
            self.weekly = self.file.get('Options', 'weekly')

        if self.file.has_section('People'):
            self.people = { person[0] : person[1] for person in self.file.items('People') }

        # This is case insensitive because ConfigParser throws away the case of all of it's keys.
        self.people_matcher = re.compile(self.people_regexp(), re.IGNORECASE)

    def people_regexp(self):
        def helper(l):
            return '|'.join([ re.escape(i) for i in l if len(i) > 0 ])
        return helper(self.people.iterkeys()) + '|' + helper(self.people.itervalues())
Пример #2
0
class Config(object):
    def __init__(self):
        self.set_defaults()
        self.parse_args()
        self.read_config()
        self.set_config()


    def set_defaults(self):
        home = os.getenv('HOME')
        now = time.localtime()
        if home:
            # configuration file
            self.config_file = home + os.sep + '.committrackerrc'
            # repository
            self.repository_root = home + os.sep + 'WebKit'
        else:
            self.config_file = None
            self.repository_root = None

        self.scriptdir = os.path.abspath( os.path.dirname(sys.argv[0]) )

        self.verbose = False
        # should we fetch the latest?
        self.do_fetch = True
        # Date to start grabbing commits at.
        self.since = '01/01/{0}'.format(now.tm_year)
        # Date to stop grabbing commits at.
        self.until = None
        self.until = '{0}/{1}/{2}'.format(now.tm_mon, now.tm_mday, now.tm_year)

        self.weekly = False
        # This should be set in the config file in the "People" section!
        # dictionary of people who's contributions we are looking for
        # name -> email address
        self.people = { }

        self.json_file = None

        self.people_file = None

    def parse_args(self):
        parser = argparse.ArgumentParser(description='Count commits by the Adobe Web Platform Team')
        parser.add_argument('--config', default=None, help='Path to config file, default is {0}'.format(self.config_file))
        parser.add_argument('--verbose', action='store_true', help='Turn on verbose mode')
        parser.add_argument('--no-fetch', dest='no_fetch', action='store_true', help="Don't fetch from origin before counting")
        parser.add_argument('--since', default=None, help='Start date for counting. Defaults to Jan 1st of the current year.')
        parser.add_argument('--until', default=None, help='End date for counting.')
        parser.add_argument('--repo', dest='repository_root', default=None, help='Path to WebKit git repository')
        parser.add_argument('--weekly', dest='weekly', action='store_true', default=None, help='Query for every week between since and until, inclusive')
        parser.add_argument('--json-file', dest='json_file', default=None, help='File for writing JSON output')
        parser.add_argument('--people-file', dest='people_file', default=None, help='JSON input file for descripting people to track')
        self.args = parser.parse_args()

    def read_config(self):
        self.file = SafeConfigParser(allow_no_value=True)
        if self.args.config:
            self.config_file = self.args.config
            with open(self.config_file) as fp:
                self.file.readfp(fp, self.config_file)
        else:
            self.file.read(self.config_file)

    def read_people(self):
        with open(self.people_file,'r') as f:
            self.people = json.load(f)['people']

            # replace date string with real dates
            for k in self.people.itervalues(): 
                if 'ranges' in k:
                    for r in k['ranges']:
                        if 'start' in r:
                            r['start'] = _parse_date(r['start'])
                        if 'end' in r:
                            r['end'] = _parse_date(r['end'])



        return True

    def set_config(self):
        if self.args.verbose:
            self.verbose = True
        elif self.file.has_option('Options', 'verbose'):
            self.verbose = self.file.get_boolean('Options', 'verbose')

        if self.args.no_fetch:
            self.do_fetch = False
        elif self.file.has_option('Options', 'do_fetch'):
            self.do_fetch = self.file.get_boolean('Options', 'do_fetch')

        if self.args.since:
            self.since = self.args.since
        elif self.file.has_option('Options', 'since'):
            self.since = self.file.get('Options', 'since')

        if self.args.until:
            self.until = self.args.until
        elif self.file.has_option('Options', 'until'):
            self.until = self.file.get('Options', 'until')

        if self.args.repository_root:
            self.repository_root = self.args.repostitory_root
        elif self.file.has_option('Options', 'repository_root'):
            self.repository_root = self.file.get('Options', 'repository_root')

        if self.args.json_file:
            self.json_file = self.args.json_file
        elif self.file.has_option('Options', 'json_file'):
            self.json_file = self.file.get('Options', 'json_file')

        if self.args.people_file:
            self.people_file = self.args.people_file
        elif self.file.has_option('Options', 'people_file'):
            self.people_file = self.file.get('Options', 'people_file')
        else:
            self.people_file = os.path.join(self.scriptdir, 'people.json')

        if self.args.weekly:
            self.weekly = self.args.weekly
        elif self.file.has_option('Options', 'weekly'):
            self.weekly = self.file.get('Options', 'weekly')

        self.read_people()

        self.people_matcher = re.compile(self.people_regexp())

    def people_regexp(self):
        def helper(l):
            return '|'.join([ re.escape(i) for i in l if len(i) > 0 ])
        def email_helper(l):
            return '|'.join([helper(i['emails']) for i in l])

        return helper(self.people.iterkeys()) + '|' + email_helper(self.people.itervalues())