def job(self, deltas='1d 2d', name='test', **kwargs): """Make a job object. """ opts = dict( target="$name-$date", deltas=parse_deltas(deltas), name=name, sources=[self._tmpdir]) opts.update(kwargs) return Job(**opts)
# Build a list of jobs, process them. if args.config: try: jobs = config.load_config_from_file(args.config) except config.ConfigError, e: log.fatal('Error loading config file: %s' % e) return 1 else: # Only a single job, as given on the command line jobs = { None: Job( **{ 'target': args.target, 'dateformat': args.dateformat, 'deltas': args.deltas, 'sources': args.sources }) } # Validate the requested list of jobs to run if args.jobs: unknown = set(args.jobs) - set(jobs.keys()) if unknown: log.fatal('Error: not defined in the config file: %s' % ", ".join(unknown)) return 1 jobs_to_run = dict([(n, j) for n, j in jobs.iteritems() if n in args.jobs]) else:
def load_config(text): """Load the config file and return a dict of jobs, with the local and global configurations merged. """ config = yaml.load(text) default_dateformat = config.pop('dateformat', None) default_deltas = parse_deltas(config.pop('deltas', None)) default_target = require_placeholders(config.pop('target', None), ['name', 'date'], 'The global target') read_jobs = {} jobs_section = config.pop('jobs') if not jobs_section: raise ConfigError('config must define at least one job') for job_name, job_dict in jobs_section.iteritems(): job_dict = job_dict or {} # sources if 'sources' in job_dict and 'source' in job_dict: raise ConfigError(('%s: Use either the "source" or "sources" '+ 'option, not both') % job_name) if 'source' in job_dict: sources = [job_dict.pop('source')] else: sources = job_dict.pop('sources', None) # aliases if 'aliases' in job_dict and 'alias' in job_dict: raise ConfigError(('%s: Use either the "alias" or "aliases" '+ 'option, not both') % job_name) if 'alias' in job_dict: aliases = [job_dict.pop('alias')] else: aliases = job_dict.pop('aliases', None) # excludes if 'excludes' in job_dict and 'exclude' in job_dict: raise ConfigError(('%s: Use either the "excludes" or "exclude" '+ 'option, not both') % job_name) if 'exclude' in job_dict: excludes = [job_dict.pop('exclude')] else: excludes = job_dict.pop('excludes', []) new_job = Job(**{ 'name': job_name, 'sources': sources, 'aliases': aliases, 'excludes': excludes, 'target': job_dict.pop('target', default_target), 'force': job_dict.pop('force', False), 'deltas': parse_deltas(job_dict.pop('deltas', None)) or default_deltas, 'dateformat': job_dict.pop('dateformat', default_dateformat), 'exec_before': job_dict.pop('exec_before', None), 'exec_after': job_dict.pop('exec_after', None), }) if not new_job.target: raise ConfigError('%s does not have a target name' % job_name) # Note: It's ok to define jobs without sources or deltas. Those # can only be used for selected commands, then. require_placeholders(new_job.target, ['date'], '%s: target') if job_dict: raise ConfigError('%s has unsupported configuration values: %s' % ( job_name, ", ".join(job_dict.keys()))) read_jobs[job_name] = new_job # Return jobs, and all global keys not popped return read_jobs, config