Skip to content

Commit 6147cc0

Browse files
authored
Merge pull request #237 from visualpython/release
Release v2.4.7 (Hotfix for yanked 2.4.6)
2 parents 0ee362d + 8fb83cf commit 6147cc0

File tree

12 files changed

+132
-36
lines changed

12 files changed

+132
-36
lines changed

build.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#=============================================================================
1212
# Set version and replace it
1313
#=============================================================================
14-
VP_ORG_VER=2.4.5
15-
VP_NEW_VER=2.4.6
14+
VP_ORG_VER=2.4.6
15+
VP_NEW_VER=2.4.7
1616

1717
# update version info
1818
grep -REil "VP_ORG_VER=.+$" colab/build.colab.sh jupyterlab/build.jupyterlab.sh jupyternotebook/build.jupyternotebook.sh | xargs sed -i "s/VP_ORG_VER=.\+$/VP_ORG_VER=${VP_ORG_VER}/g"

colab/build.colab.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#=============================================================================
1212
# Replace Version
1313
#=============================================================================
14-
VP_ORG_VER=2.4.5
15-
VP_NEW_VER=2.4.6
14+
VP_ORG_VER=2.4.6
15+
VP_NEW_VER=2.4.7
1616

1717
# update version info
1818
# update manifest version with new numbering for new version

colab/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "Visual Python for Colab",
33
"description": "GUI-based Python code generator for Google Colab as an extension",
4-
"version": "2.4.6",
4+
"version": "2.4.7",
55
"manifest_version": 3,
66
"icons": {
77
"48": "icon.png",

jupyterlab/build.jupyterlab.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#=============================================================================
1212
# Replace Version and Basic Files
1313
#=============================================================================
14-
VP_ORG_VER=2.4.5
15-
VP_NEW_VER=2.4.6
14+
VP_ORG_VER=2.4.6
15+
VP_NEW_VER=2.4.7
1616

1717
# update version info
1818
grep -REil "\"version\": \"${VP_ORG_VER}\"" package.json | xargs sed -i "s/\"version\": \"${VP_ORG_VER//\./\\.}\"/\"version\": \"${VP_NEW_VER}\"/g"

jupyterlab/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jupyterlab/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jupyterlab-visualpython",
3-
"version": "2.4.6",
3+
"version": "2.4.7",
44
"description": "GUI-based Python code generator for Jupyter Lab as an extension",
55
"keywords": [
66
"jupyter",

jupyterlab/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ classifiers = [
3232
"Programming Language :: Python :: 3.9",
3333
"Programming Language :: Python :: 3.10",
3434
]
35-
version = "2.4.6"
35+
version = "2.4.7"
3636

3737
[project.license]
3838
file = "LICENSE"
@@ -92,7 +92,7 @@ file = [
9292
]
9393

9494
[tool.tbump.version]
95-
current = "2.4.6"
95+
current = "2.4.7"
9696
regex = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<channel>a|b|rc|.dev)(?P<release>\\d+))?"
9797

9898
[tool.tbump.git]

jupyternotebook/build.jupyternotebook.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#=============================================================================
1212
# Replace Version and Basic Files
1313
#=============================================================================
14-
VP_ORG_VER=2.4.5
15-
VP_NEW_VER=2.4.6
14+
VP_ORG_VER=2.4.6
15+
VP_NEW_VER=2.4.7
1616

1717
# update version info
1818
grep -REil ${VP_ORG_VER//\./\\.} setup.py visualpython/js/com/com_Config.js visualpython/js/com/com_Const.js | xargs sed -i --follow-symlinks "s/${VP_ORG_VER//\./\\.}/${VP_NEW_VER}/g"

jupyternotebook/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
setup(
1212
name = name,
13-
version = '2.4.6',
13+
version = '2.4.7',
1414
packages = find_packages(),
1515
package_data = {"": ["*"], 'visualpython' : ['visualpython.yaml', 'README.md']},
1616
scripts = ['visualpython/bin/visualpy', 'visualpython/bin/visualpy.bat'],

visualpython/js/com/com_Config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ define([
10171017
/**
10181018
* Version
10191019
*/
1020-
Config.version = "2.4.6";
1020+
Config.version = "2.4.7";
10211021

10221022
/**
10231023
* Type of mode

visualpython/js/com/com_Const.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ define ([
1919
class Constants { }
2020

2121
Constants.TOOLBAR_BTN_INFO = {
22-
HELP: "Visual Python 2.4.6"
22+
HELP: "Visual Python 2.4.7"
2323
, ICON: "vp-main-icon"
2424
, ID: "vpBtnToggle"
2525
, NAME: "toggle-vp"

visualpython/js/m_ml/Pipeline.js

Lines changed: 115 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ define([
8383
modelStep: 1,
8484
step: [
8585
{ name: 'ml_dataSplit', label: 'Data Split', useApp: true },
86-
{ name: 'ml_regression', label: 'Regressor', useApp: true },
86+
{ name: 'ml_regression', label: 'Regressor', useApp: true, child: ['pp_fit', 'pp_predict'] },
8787
{ name: 'pp_fit', label: 'Fit' },
8888
{ name: 'pp_predict', label: 'Predict' },
8989
{ name: 'ml_evaluation', label: 'Evaluation', useApp: true, state: { modelType: 'rgs' } },
@@ -94,7 +94,7 @@ define([
9494
modelStep: 1,
9595
step: [
9696
{ name: 'ml_dataSplit', label: 'Data Split', useApp: true },
97-
{ name: 'ml_classification', label: 'Classifier', useApp: true },
97+
{ name: 'ml_classification', label: 'Classifier', useApp: true, child: ['pp_fit', 'pp_predict'] },
9898
{ name: 'pp_fit', label: 'Fit' },
9999
{ name: 'pp_predict', label: 'Predict' },
100100
{ name: 'ml_evaluation', label: 'Evaluation', useApp: true, state: { modelType: 'clf' } },
@@ -104,7 +104,7 @@ define([
104104
label: 'Clustering',
105105
modelStep: 0,
106106
step: [
107-
{ name: 'ml_clustering', label: 'Clustering', useApp: true },
107+
{ name: 'ml_clustering', label: 'Clustering', useApp: true, child: ['pp_fit', 'pp_predict', 'pp_transform'] },
108108
{ name: 'pp_fit', label: 'Fit' },
109109
{ name: 'pp_predict', label: 'Predict' },
110110
{ name: 'pp_transform', label: 'Transform' },
@@ -115,7 +115,7 @@ define([
115115
label: 'Dimension Reduction',
116116
modelStep: 0,
117117
step: [
118-
{ name: 'ml_dimensionReduction', label: 'Dimension Reduction', useApp: true },
118+
{ name: 'ml_dimensionReduction', label: 'Dimension Reduction', useApp: true, child: ['pp_fit', 'pp_transform'] },
119119
{ name: 'pp_fit', label: 'Fit' },
120120
{ name: 'pp_transform', label: 'Transform' }
121121
]
@@ -125,7 +125,7 @@ define([
125125
modelStep: 1,
126126
step: [
127127
{ name: 'ml_dataSplit', label: 'Data Split', useApp: true },
128-
{ name: 'ml_gridSearch', label: 'GridSearch', useApp: true },
128+
{ name: 'ml_gridSearch', label: 'GridSearch', useApp: true, child: ['pp_fit', 'pp_predict'] },
129129
{ name: 'pp_fit', label: 'Fit' },
130130
{ name: 'pp_predict', label: 'Predict' },
131131
{ name: 'ml_evaluation', label: 'Evaluation', useApp: true },
@@ -134,7 +134,22 @@ define([
134134
}
135135

136136
// menu libraries for ml
137-
let libObj = JSON.parse(librariesJson);
137+
let libObj = {};
138+
if (vpConfig.extensionType === 'lab' || vpConfig.extensionType === 'lite') {
139+
libObj = librariesJson;
140+
141+
this.MlAppComponent = {};
142+
this.MlAppComponent['ml_dataSplit'] = require('./dataSplit');
143+
this.MlAppComponent['ml_dataPrep'] = require('./DataPrep');
144+
this.MlAppComponent['ml_regression'] = require('./Regression');
145+
this.MlAppComponent['ml_classification'] = require('./Classification');
146+
this.MlAppComponent['ml_clustering'] = require('./Clustering');
147+
this.MlAppComponent['ml_dimensionReduction'] = require('./DimensionReduction');
148+
this.MlAppComponent['ml_gridSearch'] = require('./GridSearch');
149+
this.MlAppComponent['ml_evaluation'] = require('./evaluation');
150+
} else {
151+
libObj = JSON.parse(librariesJson);
152+
}
138153
this.mlAppList = libObj.library.item.filter(x => x.id === 'pkg_ml')[0].item;
139154

140155
this.modelConfig = ML_LIBRARIES;
@@ -268,7 +283,7 @@ define([
268283
let appFileList = [];
269284
// load pipeline items
270285
tplObj.step.forEach((stepObj, idx) => {
271-
let { name, label, useApp=false, state={} } = stepObj;
286+
let { name, label, useApp=false, child=[], state={} } = stepObj;
272287
ppTag.appendFormatLine(`<div class="vp-pp-item" data-flag="enabled" data-name="{0}" data-seq="{1}" data-label="{2}">
273288
<span>{3}</span>
274289
<div class="vp-pp-item-menu">
@@ -280,7 +295,7 @@ define([
280295
if (useApp === true) {
281296
let mlObj = that.mlAppList.filter(x => x.id === name)[0];
282297
if (vpConfig.extensionType === 'lab' || vpConfig.extensionType === 'lite') {
283-
appFileList.push({ index: idx, name: name, file: './' + mlObj.file});
298+
appFileList.push({ index: idx, name: name, file: 'vp_base/js/' + mlObj.file});
284299
} else {
285300
appFileList.push({ index: idx, name: name, file: 'vp_base/js/' + mlObj.file});
286301
}
@@ -293,6 +308,7 @@ define([
293308
};
294309
if (tplObj.modelStep === idx) {
295310
pipeObj.modelStep = true;
311+
pipeObj.child = child;
296312
}
297313
that.state.pipeline.push(pipeObj);
298314
// append pages
@@ -311,14 +327,15 @@ define([
311327
// for lite and lab
312328
if (vpConfig.extensionType === 'lab' || vpConfig.extensionType === 'lite') {
313329
appFileList.forEach((obj, argIdx) => {
314-
let MlComponent = require(obj.file);
330+
let MlComponent = that.MlAppComponent[obj.name];
315331
if (MlComponent) {
316332
// DUP AREA: pp-1
317-
let { name, label, index, file } = obj;
333+
let { name, index, file } = obj;
318334
let mlComponent = new MlComponent({
319-
config: { id: name, name: label, path: file, category: 'Pipeline', resizable: false },
335+
config: { id: name, name: that.state.pipeline[index].label, path: file, category: 'Pipeline', resizable: false },
320336
...that.state.pipeline[index].state
321337
});
338+
mlComponent.loadState();
322339
// mlComponent.open($(that.wrapSelector(`.vp-pp-step-page[data-name="${appId}"]`)));
323340
that.state.pipeline[index].app = mlComponent;
324341

@@ -328,6 +345,10 @@ define([
328345
that.state.modelType = mlComponent.state.modelType;
329346
let modelObj = that.modelConfig[that.state.modelType];
330347
that.state.modelTypeName = modelObj.code.split('(')[0];
348+
349+
that.state.pipeline[index].child.forEach(childId => {
350+
that.renderApp(childId);
351+
});
331352
}
332353
// handle app view
333354
that.handleAppView(name, mlComponent);
@@ -345,19 +366,25 @@ define([
345366
let MlComponent = arguments[argIdx];
346367
if (MlComponent) {
347368
// DUP AREA: pp-1
348-
let { name, label, index, file } = obj;
369+
let { name, index, file } = obj;
349370
let mlComponent = new MlComponent({
350-
config: { id: name, name: label, path: file, category: 'Pipeline', resizable: false },
371+
config: { id: name, name: that.state.pipeline[index].label, path: file, category: 'Pipeline', resizable: false },
351372
...that.state.pipeline[index].state
352373
});
374+
mlComponent.loadState();
353375
// mlComponent.open($(that.wrapSelector(`.vp-pp-step-page[data-name="${appId}"]`)));
354376
that.state.pipeline[index].app = mlComponent;
355377

356378
if (that.state.pipeline[index].modelStep === true) {
357379
// set default model type
380+
that.state.model = mlComponent.state.allocateToCreation;
358381
that.state.modelType = mlComponent.state.modelType;
359382
let modelObj = that.modelConfig[that.state.modelType];
360383
that.state.modelTypeName = modelObj.code.split('(')[0];
384+
385+
that.state.pipeline[index].child.forEach(childId => {
386+
that.renderApp(childId);
387+
});
361388
}
362389
// handle app view
363390
that.handleAppView(name, mlComponent);
@@ -460,12 +487,69 @@ define([
460487
label = com_util.optionToLabel(label);
461488
optBox.appendFormatLine('<label for="{0}" title="{1}">{2}</label>'
462489
, opt.name, opt.name, label);
463-
let content = com_generator.renderContent(this, opt.component[0], opt, this.state);
490+
let tmpState = {};
491+
if (opt.value && opt.value !== '') {
492+
tmpState[opt.name] = opt.value;
493+
}
494+
let content = com_generator.renderContent(this, opt.component[0], opt, tmpState);
464495
optBox.appendLine(content[0].outerHTML);
465496
});
466497
return optBox.toString();
467498
}
468499

500+
checkBeforeRun() {
501+
let that = this;
502+
var result = true;
503+
for (let idx = 0; idx < this.state.pipeline.length; idx++) {
504+
let ppObj = this.state.pipeline[idx];
505+
var { name, label, useApp, app } = ppObj;
506+
let requiredList = [];
507+
result = true;
508+
let isVisible = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).is(':visible') === true;
509+
let isEnabled = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).attr('data-flag') === 'enabled';
510+
if (isVisible && isEnabled) {
511+
switch (name) {
512+
case 'ml_dataSplit':
513+
requiredList = ['featureData', 'targetData'];
514+
// check required data
515+
for (let i = 0; i < requiredList.length; i++) {
516+
let reqKey = requiredList[i];
517+
result = that._checkIsEmpty($(app.wrapSelector('#' + reqKey)));
518+
if (result === false) {
519+
// show page and focus it
520+
$(that.wrapSelector(`.vp-pp-item[data-name="${name}"]`)).click();
521+
$(app.wrapSelector('#' + reqKey)).focus();
522+
break;
523+
}
524+
}
525+
break;
526+
case 'ml_gridSearch':
527+
result = app.checkBeforeRun();
528+
if (result === false) {
529+
// show page
530+
$(that.wrapSelector(`.vp-pp-item[data-name="${name}"]`)).click();
531+
break;
532+
}
533+
break;
534+
}
535+
}
536+
if (result === false) {
537+
break;
538+
}
539+
}
540+
return result;
541+
542+
}
543+
544+
_checkIsEmpty(tag) {
545+
let requiredFilled = true;
546+
// if it's empty, focus on it
547+
if (tag && $(tag) && $(tag).val() == '') {
548+
requiredFilled = false;
549+
}
550+
return requiredFilled;
551+
}
552+
469553
generateCodeForOptionPage(appId) {
470554
let actions = this.modelEditor.getAction(this.state.modelTypeName);
471555
let actObj = {};
@@ -514,24 +598,36 @@ define([
514598

515599
// check disabled
516600
let isVisible = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).is(':visible') === true;
517-
let isEnabled = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).data('flag') === 'enabled';
601+
let isEnabled = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).attr('data-flag') === 'enabled';
518602
if (isVisible && isEnabled) {
519603
if (code.toString() !== '') {
520604
code.appendLine();
521605
code.appendLine();
522606
}
523-
code.appendFormatLine("# [{0}] {1}", stepNo, label);
524607
if (useApp) {
525-
code.append(app.generateCode());
608+
let appCode = app.generateCode();
609+
if (appCode instanceof Array) {
610+
appCode = appCode.join('\n');
611+
}
612+
if (appCode && appCode.trim() !== '') {
613+
code.appendFormatLine("# [{0}] {1}", stepNo++, label);
614+
if (name === 'ml_evaluation') {
615+
// import auto generate
616+
code.appendLine(app.generateImportCode().join('\n'));
617+
}
618+
code.append(appCode);
619+
}
526620
// save state
527621
that.state.pipeline[idx].state = app.state;
528622
} else {
529623
let ppResult = that.generateCodeForOptionPage(name);
530-
code.append(ppResult.code);
624+
if (ppResult && ppResult?.code?.trim() !== '') {
625+
code.appendFormatLine("# [{0}] {1}", stepNo++, label);
626+
code.append(ppResult.code);
627+
}
531628
// save state
532629
that.state.pipeline[idx].state = ppResult.state;
533630
}
534-
stepNo++;
535631
}
536632
});
537633

0 commit comments

Comments
 (0)