diff --git a/pegleg/engine/lint.py b/pegleg/engine/lint.py index c678ad06..550c0654 100644 --- a/pegleg/engine/lint.py +++ b/pegleg/engine/lint.py @@ -183,9 +183,7 @@ def _verify_no_unexpected_files(*, sitenames=None): expected_directories = set() for site_name in sitenames: params = util.definition.load_as_params(site_name) - expected_directories.update( - util.files.directories_for( - site_name=params['site_name'], site_type=params['site_type'])) + expected_directories.update(util.files.directories_for(**params)) LOG.debug('expected_directories: %s', expected_directories) found_directories = util.files.existing_directories() LOG.debug('found_directories: %s', found_directories) diff --git a/pegleg/engine/site.py b/pegleg/engine/site.py index 2f043a55..902e1aaa 100644 --- a/pegleg/engine/site.py +++ b/pegleg/engine/site.py @@ -117,20 +117,12 @@ def list_(output_stream): # Create a table to output site information for all sites for a given repo site_table = PrettyTable() - site_table.field_names = ['site_name', 'site_type'] + field_names = ['site_name', 'site_type'] + site_table.field_names = field_names for site_name in util.files.list_sites(): - params = util.definition.load_as_params(site_name) - # TODO(felipemonteiro): This is a temporary hack around legacy manifest - # repositories containing the name of a directory that symbolizes a - # repository. Once all these manifest repositories migrate over to Git - # references instead, remove this hack. - # NOTE(felipemonteiro): The 'revision' information can instead be - # computed using :func:`process_site_repository` and storing into - # a configuration via a "set_site_revision" function, for example. - if 'revision' in params: - params.pop('revision') - site_table.add_row([params['site_name'], params['site_type']]) + params = util.definition.load_as_params(site_name, *field_names) + site_table.add_row(list(map(lambda k: params[k], field_names))) # Write table to specified output_stream output_stream.write(site_table.get_string() + "\n") @@ -141,6 +133,8 @@ def show(site_name, output_stream): # Create a table to output site information for specific site site_table = PrettyTable() site_table.field_names = ['revision', 'site_name', 'site_type', 'files'] + # TODO(felipemonteiro): Drop support for 'revision' once manifest + # repositories have removed it altogether. if 'revision' in data.keys(): for file in data['files']: site_table.add_row( diff --git a/pegleg/engine/util/definition.py b/pegleg/engine/util/definition.py index a551014d..117d2a31 100644 --- a/pegleg/engine/util/definition.py +++ b/pegleg/engine/util/definition.py @@ -30,18 +30,25 @@ def load(site, primary_repo_base=None): return files.slurp(path(site, primary_repo_base)) -def load_as_params(site_name, primary_repo_base=None): +def load_as_params(site_name, *fields, primary_repo_base=None): + """Load site definition for given ``site_name`` and return data as params. + + :param str site_name: Name of the site. + :param iterable fields: List of parameter fields to return. Defaults to + ``('site_name', 'site_type')``. + :param str primary_repo_base: Path to primary repository. + :returns: key-value pairs of parameters, whose keys are a subset of those + specified by ``fields``. + :rtype: dict + """ + if not fields: + # Default legacy fields. + fields = ('site_name', 'site_type') + definition = load(site_name, primary_repo_base) - # TODO(felipemonteiro): Currently we are filtering out "revision" from - # the params that are returned by this function because it is no longer - # supported. This is a workaround. As soon as the site definition repos - # switch to real repository format, then we can drop that workaround. - # Ideally, we should: - # 1) validate the site-definition.yaml format using lint module - # 2) extract only the required params here params = definition.get('data', {}) params['site_name'] = site_name - return params + return {k: v for k, v in params.items() if k in fields} def path(site_name, primary_repo_base=None): @@ -63,17 +70,14 @@ def pluck(site_definition, key): def site_files(site_name): params = load_as_params(site_name) - for filename in files.search( - files.directories_for( - site_name=params['site_name'], site_type=params['site_type'])): + for filename in files.search(files.directories_for(**params)): yield filename def site_files_by_repo(site_name): """Yield tuples of repo_base, file_name.""" params = load_as_params(site_name) - dir_map = files.directories_for_each_repo( - site_name=params['site_name'], site_type=params['site_type']) + dir_map = files.directories_for_each_repo(**params) for repo, dl in dir_map.items(): for filename in files.search(dl): yield (repo, filename) @@ -93,8 +97,7 @@ def documents_for_each_site(): for sitename in sitenames: params = load_as_params(sitename) - paths = files.directories_for( - site_name=params['site_name'], site_type=params['site_type']) + paths = files.directories_for(**params) filenames = set(files.search(paths)) for filename in filenames: with open(filename) as f: @@ -116,8 +119,7 @@ def documents_for_site(sitename): documents = [] params = load_as_params(sitename) - paths = files.directories_for( - site_name=params['site_name'], site_type=params['site_type']) + paths = files.directories_for(**params) filenames = set(files.search(paths)) for filename in filenames: with open(filename) as f: