add 'contributions distinct' command
Add a tool to find sets of distinct values within a data set. Change-Id: I193ef507e3e3a688508c2902673cb9327f4e528c Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
parent
5af6614932
commit
aff3aa9555
37
goal_tools/tests/test_distinct.py
Normal file
37
goal_tools/tests/test_distinct.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from goal_tools.who_helped import distinct
|
||||||
|
from goal_tools.tests import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestGetDistinct(base.TestCase):
|
||||||
|
|
||||||
|
_data = [
|
||||||
|
{'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'},
|
||||||
|
{'a': 'A', 'b': 'C', 'c': 'D', 'd': 'D'},
|
||||||
|
]
|
||||||
|
|
||||||
|
def test_group_by_one_column(self):
|
||||||
|
results = distinct._get_distinct(['a'], self._data)
|
||||||
|
expected = set([
|
||||||
|
('A',),
|
||||||
|
])
|
||||||
|
self.assertEqual(expected, results)
|
||||||
|
|
||||||
|
def test_group_by_two_columns(self):
|
||||||
|
results = distinct._get_distinct(['a', 'b'], self._data)
|
||||||
|
expected = set([
|
||||||
|
('A', 'B'),
|
||||||
|
('A', 'C'),
|
||||||
|
])
|
||||||
|
self.assertEqual(expected, results)
|
56
goal_tools/who_helped/distinct.py
Normal file
56
goal_tools/who_helped/distinct.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from goal_tools.who_helped import contributions
|
||||||
|
from goal_tools.who_helped import report
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_distinct(by_names, data_source):
|
||||||
|
return set(
|
||||||
|
tuple(row[b] for b in by_names)
|
||||||
|
for row in data_source
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class DistinctContributions(report.ContributionsReportBase):
|
||||||
|
"Show distinct values in a contribution report."
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super().get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
'--by', '-b',
|
||||||
|
action='append',
|
||||||
|
default=[],
|
||||||
|
choices=contributions._COLUMNS,
|
||||||
|
help=('column(s) to summarize by (may be repeated), '
|
||||||
|
'defaults to "Organization"'),
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
group_by = parsed_args.by[:]
|
||||||
|
if not group_by:
|
||||||
|
group_by.append('Organization')
|
||||||
|
|
||||||
|
data = self.get_contributions(parsed_args)
|
||||||
|
|
||||||
|
values = _get_distinct(group_by, data)
|
||||||
|
|
||||||
|
output_rows = sorted(values)
|
||||||
|
|
||||||
|
columns = tuple(group_by)
|
||||||
|
|
||||||
|
return (columns, output_rows)
|
@ -31,6 +31,7 @@ console_scripts =
|
|||||||
who_helped =
|
who_helped =
|
||||||
contributions list = goal_tools.who_helped.contributions:ListContributions
|
contributions list = goal_tools.who_helped.contributions:ListContributions
|
||||||
contributions summarize = goal_tools.who_helped.summarize:SummarizeContributions
|
contributions summarize = goal_tools.who_helped.summarize:SummarizeContributions
|
||||||
|
contributions distinct = goal_tools.who_helped.distinct:DistinctContributions
|
||||||
member show = goal_tools.who_helped.members:ShowMember
|
member show = goal_tools.who_helped.members:ShowMember
|
||||||
changes query = goal_tools.who_helped.changes:QueryChanges
|
changes query = goal_tools.who_helped.changes:QueryChanges
|
||||||
cache remove = goal_tools.who_helped.cache:CacheRemove
|
cache remove = goal_tools.who_helped.cache:CacheRemove
|
||||||
|
Loading…
Reference in New Issue
Block a user