From 423a887f568526cc24caaf518d1024e642fa0225 Mon Sep 17 00:00:00 2001 From: Paul Makepeace Date: Tue, 26 Apr 2011 16:55:07 -0400 Subject: [PATCH] Add Engine.set_facets() so RefineProject.{compute_facets,get_rows}() don't lose the Engine's other attrs (i.e. mode). Split TestFacet into component classes in test_facet.py. --- google/refine/facet.py | 6 ++- google/refine/refine.py | 6 +-- google/test/test_facet.py | 82 +++++++++++++++++++++++--------------- google/test/test_refine.py | 1 + 4 files changed, 57 insertions(+), 38 deletions(-) diff --git a/google/refine/facet.py b/google/refine/facet.py index ea73186..6d0044c 100644 --- a/google/refine/facet.py +++ b/google/refine/facet.py @@ -105,7 +105,6 @@ class BlankFacet(BoolFacet): expression='isBlank(value)', selection=selection) - # Capitalize 'From' to get around python's reserved word. class NumericFacet(Facet): def __init__(self, column, From=None, to=None, select_blank=True, select_error=True, select_non_numeric=True, select_numeric=True, **options): @@ -152,12 +151,15 @@ class FacetsResponse(object): class Engine(object): def __init__(self, facets=None, mode='row-based'): + self.set_facets(facets) + self.mode = mode + + def set_facets(self, facets=None): if facets is None: facets = [] elif not isinstance(facets, list): facets = [facets] self.facets = facets - self.mode = mode def as_dict(self): return { diff --git a/google/refine/refine.py b/google/refine/refine.py index f6327d9..8d17447 100644 --- a/google/refine/refine.py +++ b/google/refine/refine.py @@ -282,13 +282,13 @@ class RefineProject: def compute_facets(self, facets=None): if facets: - self.engine = facet.Engine(facets) + self.engine.set_facets(facets) response = self.do_json('compute-facets') return facet.FacetsResponse(response) def get_rows(self, facets=None, sort_by=None, start=0, limit=10): if facets: - self.engine = facet.Engine(facets) + self.engine.set_facets(facets) if sort_by is not None: self.sorting = facet.Sorting(sort_by) response = self.do_json('get-rows', {'sorting': self.sorting.as_json(), @@ -306,7 +306,7 @@ class RefineProject: def remove_rows(self, facets=None): if facets: - self.engine = facet.Engine(facets) + self.engine.set_facets(facets) return self.do_json('remove-rows') def text_transform(self, column, expression, on_error='set-to-blank', diff --git a/google/test/test_facet.py b/google/test/test_facet.py index 7f4204a..1a8ca83 100644 --- a/google/test/test_facet.py +++ b/google/test/test_facet.py @@ -50,6 +50,31 @@ class FacetTest(unittest.TestCase): self.assertEqual(facet.selection[0]['v']['v'], False) self.assertRaises(ValueError, FlaggedFacet, 'false') # no strings + def test_selections(self): + facet = TextFacet('column name') + facet.include('element') + self.assertEqual(len(facet.selection), 1) + facet.include('element 2') + self.assertEqual(len(facet.selection), 2) + facet.exclude('element') + self.assertEqual(len(facet.selection), 1) + facet.reset() + self.assertEqual(len(facet.selection), 0) + facet.include('element').include('element 2') + self.assertEqual(len(facet.selection), 2) + + +class EngineTest(unittest.TestCase): + def test_init(self): + engine = Engine() + self.assertEqual(engine.mode, 'row-based') + engine.mode = 'record-based' + self.assertEqual(engine.mode, 'record-based') + engine.set_facets(BlankFacet) + self.assertEqual(engine.mode, 'record-based') + engine.set_facets([BlankFacet] * 2) + self.assertEqual(len(engine), 2) + def test_serialize(self): engine = Engine() engine_json = engine.as_json() @@ -59,6 +84,29 @@ class FacetTest(unittest.TestCase): facet = NumericFacet(column='column', From=1, to=5) self.assertEqual(facet.as_dict(), {'from': 1, 'to': 5, 'selectBlank': True, 'name': 'column', 'selectError': True, 'expression': 'value', 'selectNumeric': True, 'columnName': 'column', 'selectNonNumeric': True, 'type': 'range'}) + def test_add_facet(self): + facet = TextFacet(column='Party Code') + engine = Engine(facet) + engine.add_facet(TextFacet(column='Ethnicity')) + self.assertEqual(len(engine.facets), 2) + self.assertEqual(len(engine), 2) + + def test_reset_remove(self): + text_facet1 = TextFacet('column name') + text_facet1.include('element') + text_facet2 = TextFacet('column name 2') + text_facet2.include('element 2') + engine = Engine([text_facet1, text_facet2]) + self.assertEqual(len(engine), 2) + self.assertEqual(len(text_facet1.selection), 1) + engine.reset_all() + self.assertEqual(len(text_facet1.selection), 0) + self.assertEqual(len(text_facet2.selection), 0) + engine.remove_all() + self.assertEqual(len(engine), 0) + + +class SortingTest(unittest.TestCase): def test_sorting(self): sorting = Sorting() self.assertEqual(sorting.as_json(), '{"criteria": []}') @@ -78,40 +126,8 @@ class FacetTest(unittest.TestCase): self.assertEqual(c['column'], 'date') self.assertEqual(c['valueType'], 'date') - def test_add_facet(self): - facet = TextFacet(column='Party Code') - engine = Engine(facet) - engine.add_facet(TextFacet(column='Ethnicity')) - self.assertEqual(len(engine.facets), 2) - self.assertEqual(len(engine), 2) - - def test_selections(self): - facet = TextFacet('column name') - facet.include('element') - self.assertEqual(len(facet.selection), 1) - facet.include('element 2') - self.assertEqual(len(facet.selection), 2) - facet.exclude('element') - self.assertEqual(len(facet.selection), 1) - facet.reset() - self.assertEqual(len(facet.selection), 0) - facet.include('element').include('element 2') - self.assertEqual(len(facet.selection), 2) - - def test_reset_remove(self): - text_facet1 = TextFacet('column name') - text_facet1.include('element') - text_facet2 = TextFacet('column name 2') - text_facet2.include('element 2') - engine = Engine([text_facet1, text_facet2]) - self.assertEqual(len(engine), 2) - self.assertEqual(len(text_facet1.selection), 1) - engine.reset_all() - self.assertEqual(len(text_facet1.selection), 0) - self.assertEqual(len(text_facet2.selection), 0) - engine.remove_all() - self.assertEqual(len(engine), 0) +class FacetsResponseTest(unittest.TestCase): def test_facets_response(self): response = """{"facets":[{"name":"Party Code","expression":"value","columnName":"Party Code","invert":false,"choices":[{"v":{"v":"D","l":"D"},"c":3700,"s":false},{"v":{"v":"R","l":"R"},"c":1613,"s":false},{"v":{"v":"N","l":"N"},"c":15,"s":false},{"v":{"v":"O","l":"O"},"c":184,"s":false}],"blankChoice":{"s":false,"c":1446}}],"mode":"row-based"}""" response = FacetsResponse(json.loads(response)) diff --git a/google/test/test_refine.py b/google/test/test_refine.py index de9d017..21de81b 100644 --- a/google/test/test_refine.py +++ b/google/test/test_refine.py @@ -20,6 +20,7 @@ class RefineServerTest(refinetest.RefineTestCase): def test_init(self): self.assertEqual(self.server.server, 'http://%s:%s' % (refine.REFINE_HOST, refine.REFINE_PORT)) + # strip trailing / server = refine.RefineServer('http://refine.example/') self.assertEqual(server.server, 'http://refine.example')