Skip to content

Commit

Permalink
Merge pull request #175 from quantopian/set-float-to-zero
Browse files Browse the repository at this point in the history
Make it possible to set value of float cell to zero
  • Loading branch information
TimShawver authored Mar 3, 2018
2 parents c4cf9f8 + b300c30 commit 14d562c
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 32 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ dist

# pytest
.cache/*
.pytest_cache/*

# Jupyter notebook
jupyterhub.sqlite
Expand Down
4 changes: 2 additions & 2 deletions js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "qgrid",
"version": "1.0.1",
"version": "1.0.2",
"description": "An Interactive Grid for Sorting and Filtering DataFrames in Jupyter Notebook",
"author": "Quantopian Inc.",
"main": "src/index.js",
Expand Down Expand Up @@ -34,7 +34,7 @@
"jquery-ui-dist": "1.12.1",
"json-loader": "^0.5.4",
"moment": "^2.18.1",
"slickgrid-qgrid": "0.0.4",
"slickgrid-qgrid": "0.0.5",
"style-loader": "^0.18.2",
"underscore": "^1.8.3"
},
Expand Down
4 changes: 2 additions & 2 deletions js/src/qgrid.widget.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ class QgridModel extends widgets.DOMWidgetModel {
_view_name : 'QgridView',
_model_module : 'qgrid',
_view_module : 'qgrid',
_model_module_version : '^1.0.1',
_view_module_version : '^1.0.1',
_model_module_version : '^1.0.2',
_view_module_version : '^1.0.2',
_df_json: '',
_columns: {}
});
Expand Down
2 changes: 1 addition & 1 deletion qgrid/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version_info = (1, 0, 1, 'final')
version_info = (1, 0, 2, 'final')

_specifier_ = {'alpha': 'a', 'beta': 'b', 'candidate': 'rc', 'final': ''}

Expand Down
16 changes: 10 additions & 6 deletions qgrid/grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ def show_grid(data_frame, show_toolbar=None,

PAGE_SIZE = 100


@widgets.register()
class QgridWidget(widgets.DOMWidget):
"""
Expand Down Expand Up @@ -333,8 +334,8 @@ class QgridWidget(widgets.DOMWidget):
_model_name = Unicode('QgridModel').tag(sync=True)
_view_module = Unicode('qgrid').tag(sync=True)
_model_module = Unicode('qgrid').tag(sync=True)
_view_module_version = Unicode('1.0.1').tag(sync=True)
_model_module_version = Unicode('1.0.1').tag(sync=True)
_view_module_version = Unicode('1.0.2').tag(sync=True)
_model_module_version = Unicode('1.0.2').tag(sync=True)

_df = Instance(pd.DataFrame)
_df_json = Unicode('', sync=True)
Expand Down Expand Up @@ -396,7 +397,7 @@ def _update_df(self):
# for filters, and the state we return to when filters are removed
self._unfiltered_df = self._df.copy()

self._update_table(update_columns=True)
self._update_table(update_columns=True, fire_data_change_event=False)
self._ignore_df_changed = False

def _rebuild_widget(self):
Expand Down Expand Up @@ -424,8 +425,11 @@ def _show_toolbar_changed(self):
return
self._rebuild_widget()

def _update_table(self, update_columns=False, triggered_by=None,
scroll_to_row=None):
def _update_table(self,
update_columns=False,
triggered_by=None,
scroll_to_row=None,
fire_data_change_event=True):
df = self._df.copy()

from_index = max(self._viewport_range[0] - PAGE_SIZE, 0)
Expand Down Expand Up @@ -537,7 +541,7 @@ def _update_table(self, update_columns=False, triggered_by=None,
double_precision=self.precision)

self._df_json = df_json
if not update_columns:
if fire_data_change_event:
data_to_send = {
'type': 'update_data_view',
'columns': self._columns,
Expand Down
69 changes: 48 additions & 21 deletions qgrid/tests/test_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,32 +38,60 @@ def create_interval_index_df():

def test_edit_date():
view = QgridWidget(df=create_df())
observer_called = False

check_edit_success(view,
'Date',
3,
"2013-01-02T00:00:00.000Z",
pd.Timestamp('2013-01-16 00:00:00'),
"2013-01-16T00:00:00.000Z")

def check_edit_success(widget,
col_name,
row_index,
old_value,
new_val_obj,
new_val_json):

observer_called = {}
def on_value_change(change):
nonlocal observer_called
observer_called = True
assert change['new']['Date'][3] == pd.Timestamp('2013-01-16 00:00:00')
observer_called['called'] = True
assert change['new'][col_name][row_index] == new_val_obj

view.observe(on_value_change, names=['_df'])
widget.observe(on_value_change, names=['_df'])

view._handle_qgrid_msg_helper({
'column': "Date",
'row_index': 3,
grid_data = json.loads(widget._df_json)['data']
assert grid_data[row_index][col_name] == old_value

widget._handle_qgrid_msg_helper({
'column': col_name,
'row_index': row_index,
'type': "cell_change",
'unfiltered_index': 0,
'value': "2013-01-16T00:00:00.000+00:00"
'unfiltered_index': row_index,
'value': new_val_json
})

assert observer_called
assert observer_called['called']
widget.unobserve(on_value_change, names=['_df'])

# call _update_table so the widget updates _df_json
widget._update_table(fire_data_change_event=False)
grid_data = json.loads(widget._df_json)['data']
assert grid_data[row_index][col_name] == new_val_json

def test_edit_number():
old_val = 3
view = QgridWidget(df=create_df())

for idx in range(-10, 10, 1):
check_edit_success(view, 'D', 2, old_val, idx, idx)
old_val = idx

def test_add_row():
view = QgridWidget(df=create_df())

observer_called = False
observer_called = {}
def on_value_change(change):
nonlocal observer_called
observer_called = True
observer_called['called'] = True
assert len(change['new']) == 5

view.observe(on_value_change, names=['_df'])
Expand All @@ -72,7 +100,7 @@ def on_value_change(change):
'type': 'add_row'
})

assert observer_called
assert observer_called['called']

def test_mixed_type_column():
df = pd.DataFrame({'A': [1.2, 'xy', 4], 'B': [3, 4, 5]})
Expand Down Expand Up @@ -224,10 +252,9 @@ def test_date_index():
def test_multi_index():
view = QgridWidget(df=create_multi_index_df())

observer_count = 0
def on_value_change(change):
nonlocal observer_count
observer_count += 1
observer_called = {'count': 0}
def on_value_change(_):
observer_called['count'] += 1

view.observe(on_value_change, names=['_df'])

Expand Down Expand Up @@ -271,7 +298,7 @@ def on_value_change(change):
'sort_ascending': True
})

assert observer_count == 4
assert observer_called['count'] == 4

def test_interval_index():
df = create_interval_index_df()
Expand Down

0 comments on commit 14d562c

Please sign in to comment.