Skip to content

Commit a75ff41

Browse files
author
minjk-bl
committed
Add checking functions and package whether it is declared or not
1 parent 4587a36 commit a75ff41

23 files changed

+336
-143
lines changed

js/com/com_Config.js

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
define([
1515
'./com_Const',
1616
'./com_util',
17-
'./com_interface'
18-
], function(com_Const, com_util, com_interface) {
17+
'./com_interface',
18+
'text!vp_base/python/userCommand.py',
19+
], function(com_Const, com_util, com_interface, userCommandFile) {
1920
'use strict';
2021
//========================================================================
2122
// Define Inner Variable
@@ -115,7 +116,64 @@ define([
115116
this.defaultConfig = {};
116117
this.metadataSettings = {};
117118

119+
this.moduleDict = {
120+
'np': {
121+
code: 'import numpy as np',
122+
type: 'package'
123+
},
124+
'numpy': {
125+
code: 'import numpy as np',
126+
type: 'package'
127+
},
128+
'pd': {
129+
code: 'import pandas as pd',
130+
type: 'package'
131+
},
132+
'pandas': {
133+
code: 'import pandas as pd',
134+
type: 'package'
135+
},
136+
'plt': {
137+
code: 'import matplotlib.pyplot as plt\n%matplotlib inline',
138+
type: 'package'
139+
},
140+
'sns': {
141+
code: 'import seaborn as sns',
142+
type: 'package'
143+
},
144+
'metrics': {
145+
code: 'from sklearn import metrics',
146+
type: 'package'
147+
},
148+
'ProfileReport': {
149+
code: 'from pandas_profiling import ProfileReport',
150+
type: 'package'
151+
},
152+
'px': {
153+
code: 'import plotly.express as px',
154+
type: 'package'
155+
},
156+
'WordCloud': {
157+
code: 'from wordcloud import WordCloud',
158+
type: 'package'
159+
},
160+
'fitz': {
161+
code: 'import fitz',
162+
type: 'package'
163+
},
164+
'nltk': {
165+
code: "import nltk\nnltk.download('punkt')",
166+
type: 'package'
167+
},
168+
'Counter': {
169+
code: 'from collections import Counter',
170+
type: 'package'
171+
}
172+
}
173+
118174
this._readDefaultConfig();
175+
this._readUserCommandList();
176+
119177
}
120178

121179
/**
@@ -150,6 +208,46 @@ define([
150208
$.extend(true, this.defaultConfig, this.metadataSettings);
151209
}
152210

211+
_readUserCommandList() {
212+
let divider = '#'.repeat(6);
213+
// get list of codes (ignore first 2 items)
214+
let tmpList = userCommandFile.split(divider).slice(2);
215+
216+
// match key-codes-description
217+
// { 'func_name': { code: '', description: '' } }
218+
let funcDict = {};
219+
let reg = /^def (.+)\(/;
220+
let name = '';
221+
let code = '';
222+
let desc = '';
223+
let packageAlias = {
224+
'_vp_np': 'np',
225+
'_vp_pd': 'pd',
226+
'_vp_plt': 'plt'
227+
}
228+
229+
for (let i = 0; i < tmpList.length; i += 2) {
230+
desc = tmpList[i].trim();
231+
code = tmpList[i + 1].trim();
232+
let regResult = reg.exec(code);
233+
if (regResult !== null) {
234+
name = regResult[1];
235+
// convert code's package alias
236+
Object.keys(packageAlias).forEach(key => {
237+
let desAlias = packageAlias[key];
238+
code = code.replaceAll(key + '.', desAlias + '.');
239+
});
240+
// list up
241+
funcDict[name] = { code: code, type: 'function', description: desc };
242+
}
243+
}
244+
245+
this.moduleDict = {
246+
...this.moduleDict,
247+
...funcDict
248+
}
249+
}
250+
153251
/**
154252
* Read kernel functions for using visualpython
155253
* - manually click restart menu (MenuFrame.js)
@@ -161,7 +259,7 @@ define([
161259
'fileNaviCommand.py',
162260
'pandasCommand.py',
163261
'variableCommand.py',
164-
'userCommand.py'
262+
// 'userCommand.py'
165263
];
166264
let promiseList = [];
167265
libraryList.forEach(libName => {
@@ -464,6 +562,17 @@ define([
464562
return Object.keys(Config.ML_DATA_DICT);
465563
}
466564

565+
getModuleCode(modName='') {
566+
if (modName == '') {
567+
return this.moduleDict;
568+
}
569+
try {
570+
return this.moduleDict[modName];
571+
} catch {
572+
return null;
573+
}
574+
}
575+
467576
}
468577

469578
//========================================================================

js/com/com_Kernel.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,23 @@ define([
9696
});
9797
}
9898

99+
/**
100+
* Check if module/function is loaded already
101+
* @param {*} moduleList
102+
*/
103+
checkModule(moduleList) {
104+
var that = this;
105+
return new Promise(function(resolve, reject) {
106+
that.execute(com_util.formatString('_vp_print(_vp_check_module_loaded({0}))', JSON.stringify(moduleList))).then(function(resultObj) {
107+
// resolve
108+
resolve(resultObj);
109+
}).catch(function(err) {
110+
// reject
111+
reject(err);
112+
})
113+
});
114+
}
115+
99116
getDataList(dataTypeList=[], excludeList=[]) {
100117
// use function command to get variable list of selected data types
101118
var cmdSB = '_vp_print(_vp_get_variables_list(None))';

js/com/component/InnerFuncViewer.js

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@
1515
define([
1616
'text!vp_base/html/component/innerFuncViewer.html!strip',
1717
'css!vp_base/css/component/innerFuncViewer.css',
18-
'text!vp_base/python/userCommand.py',
1918
'vp_base/js/com/com_util',
2019
'vp_base/js/com/com_String',
2120
'vp_base/js/com/component/PopupComponent',
2221
'vp_base/js/com/component/FileNavigation'
23-
], function(ifHtml, ifCss, userCommandFile, com_util, com_String, PopupComponent, FileNavigation) {
22+
], function(ifHtml, ifCss, com_util, com_String, PopupComponent, FileNavigation) {
2423

2524
/**
2625
* InnerFuncViewer
@@ -46,12 +45,6 @@ define([
4645

4746
// double click setter
4847
this.clicked = 0;
49-
50-
this.packageAlias = {
51-
'_vp_np': 'np',
52-
'_vp_pd': 'pd',
53-
'_vp_plt': 'plt'
54-
}
5548
}
5649

5750
_bindEvent() {
@@ -181,33 +174,8 @@ define([
181174
loadUserCommandList() {
182175
var that = this;
183176

184-
let divider = '#'.repeat(6);
185-
// get list of codes (ignore first 2 items)
186-
let tmpList = userCommandFile.split(divider).slice(2);
187-
188-
// match key-codes-description
189-
// { 'func_name': { code: '', description: '' } }
190-
let funcDict = {};
191-
let reg = /^def (.+)\(/;
192-
let name = '';
193-
let code = '';
194-
let desc = '';
195-
196-
for (let i = 0; i < tmpList.length; i += 2) {
197-
desc = tmpList[i].trim();
198-
code = tmpList[i + 1].trim();
199-
let regResult = reg.exec(code);
200-
if (regResult !== null) {
201-
name = regResult[1];
202-
// convert code's package alias
203-
Object.keys(that.packageAlias).forEach(key => {
204-
let desAlias = that.packageAlias[key];
205-
code = code.replaceAll(key + '.', desAlias + '.');
206-
});
207-
// list up
208-
funcDict[name] = { code: code, description: desc };
209-
}
210-
}
177+
let funcDict = vpConfig.getModuleCode();
178+
funcDict = Object.fromEntries(Object.entries(funcDict).filter(([key]) => funcDict[key].type == 'function'));
211179

212180
// clear table except head
213181
$(this.wrapSelector('.vp-if-table')).html('');

js/com/component/LibraryComponent.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ define([
4444
vpLog.display(VP_LOG_TYPE.ERROR, 'Cannot find package id from library: ' + this.packageId);
4545
return;
4646
}
47+
this.config.checkModules = [this.package.library];
4748

4849
vpLog.display(VP_LOG_TYPE.DEVELOP, 'loading state', this.state);
4950
}

js/com/component/PopupComponent.js

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ define([
6666
footer: true,
6767
position: { right: 10, top: 120 },
6868
size: { width: 400, height: 550 },
69-
saveOnly: false
69+
saveOnly: false,
70+
checkModules: [] // module aliases or function names
7071
};
7172

7273
// check BoardFrame width and set initial position of popup
@@ -725,26 +726,59 @@ define([
725726
return requiredFilled;
726727
}
727728

729+
checkAndRunModules(execute=true, background=false) {
730+
let sigText = this.getSigText();
731+
732+
let checkModules = this.config.checkModules;
733+
return new Promise(function(resolve, reject) {
734+
if (checkModules.length > 0) {
735+
vpKernel.checkModule(checkModules).then(function(resultObj) {
736+
let { result } = resultObj;
737+
let checkedList = JSON.parse(result);
738+
let executeList = [];
739+
checkedList && checkedList.forEach((mod, idx) => {
740+
if (mod == false) {
741+
let modInfo = vpConfig.getModuleCode(checkModules[idx]);
742+
if (modInfo) {
743+
executeList.push(modInfo.code);
744+
}
745+
}
746+
});
747+
if (executeList && executeList.length > 0) {
748+
com_interface.insertCell('code', executeList.join('\n'), execute, sigText);
749+
}
750+
resolve(executeList);
751+
});
752+
} else {
753+
resolve([]);
754+
}
755+
});
756+
}
757+
728758
run(execute=true, addcell=true) {
729759
// check required
730760
if (this.checkRequiredOption() === false) {
731-
return null;
761+
return false;
732762
}
733763

734-
let code = this.generateCode();
735764
let mode = this.config.executeMode;
736765
let sigText = this.getSigText();
766+
let code = this.generateCode();
767+
737768
vpLog.display(VP_LOG_TYPE.DEVELOP, sigText, mode, code);
738769

739-
if (addcell) {
740-
if (Array.isArray(code)) {
741-
// insert cells if it's array of codes
742-
com_interface.insertCells(mode, code, execute, sigText);
743-
} else {
744-
com_interface.insertCell(mode, code, execute, sigText);
770+
// check modules
771+
this.checkAndRunModules(execute).then(function(executeList) {
772+
if (addcell) {
773+
if (Array.isArray(code)) {
774+
// insert cells if it's array of codes
775+
com_interface.insertCells(mode, code, execute, sigText);
776+
} else {
777+
com_interface.insertCell(mode, code, execute, sigText);
778+
}
745779
}
746-
}
747-
return code;
780+
});
781+
return true;
748782
}
749783

750784
/**

js/m_apps/Bind.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ define([
3030
super._init();
3131
/** Write codes executed before rendering */
3232
this.config.sizeLevel = 2;
33+
this.config.checkModules = ['pd'];
3334

3435
this.howList = [
3536
{ label: 'Inner', value: 'inner', desc: 'Inner join' },

js/m_apps/File.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ define([
3535
/** Write codes executed before rendering */
3636
this.config.dataview = false;
3737
this.config.sizeLevel = 1;
38+
this.config.checkModules = ['pd'];
3839

3940
this.fileExtensions = {
4041
'csv': 'csv',

js/m_apps/Frame.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ define([
3030
_init() {
3131
super._init();
3232
this.config.sizeLevel = 3;
33+
this.config.checkModules = ['pd'];
3334

3435
// state
3536
this.state = {
@@ -369,6 +370,12 @@ define([
369370
case FRAME_EDIT_TYPE.AS_TYPE:
370371
that.openInputPopup(editType);
371372
break;
373+
case FRAME_EDIT_TYPE.DROP_OUT:
374+
that.config.checkModules = ['pd', 'np', 'vp_drop_outlier'];
375+
that.checkAndRunModules(true).then(function() {
376+
that.loadCode(that.getTypeCode(editType));
377+
});
378+
break;
372379
default:
373380
that.loadCode(that.getTypeCode(editType));
374381
break;
@@ -1221,6 +1228,7 @@ define([
12211228
switch (type) {
12221229
case FRAME_EDIT_TYPE.INIT:
12231230
code.appendFormat('{0} = {1}.copy()', tempObj, orgObj);
1231+
this.config.checkModules = ['pd'];
12241232
break;
12251233
case FRAME_EDIT_TYPE.DROP:
12261234
code.appendFormat("{0}.drop([{1}], axis={2}, inplace=True)", tempObj, selectedName, axis);

js/m_apps/Groupby.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ define([
3030
super._init();
3131
/** Write codes executed before rendering */
3232
this.config.size = { width: 700, height: 550 };
33+
this.config.checkModules = ['pd'];
3334

3435
this.periodList = [
3536
{ label: 'business day', value: 'B'},

js/m_apps/Import.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ define([
4646
/** Write codes executed before rendering */
4747
this.config.dataview = false;
4848
this.config.sizeLevel = 1;
49+
this.config.checkModules = ['pd'];
4950

5051
let savedData = vpConfig.getDataSimple('', 'vpimport');
5152
// Reset abnormal data

js/m_apps/Instance.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ define([
3232
/** Write codes executed before rendering */
3333
this.config.dataview = false;
3434
this.config.sizeLevel = 1;
35+
this.config.checkModules = ['pd'];
3536

3637
this.state = {
3738
vp_instanceVariable: '',

0 commit comments

Comments
 (0)