From 3f09c5bf7b950cf7eda2f82fcdd447e77476e412 Mon Sep 17 00:00:00 2001 From: Nutti Date: Tue, 11 Apr 2017 21:19:57 +0900 Subject: [PATCH] Version 0.3 released --- .gitignore | 4 +- README.md | 46 +- build.js | 4 - build_mac.js | 5 +- main.js | 30 - package.json | 2 +- requirements.txt | 5 +- src/client/html/index.html | 5 + src/client/html/partials/error-popup.html | 15 +- src/client/js/addon.js | 1 + src/client/js/app.js | 590 ++++++++++-------- src/client/js/db.js | 5 + src/client/js/error.js | 1 + src/client/js/task.js | 1 + src/client/js/ui.js | 1 + src/client/sass/components/_button.scss | 4 +- src/client/sass/components/_popup.scss | 39 +- src/client/sass/lib/_variables.scss | 4 +- src/lib/js/blam-constants.js | 38 ++ .../js/{db_writer.js => blam-db-writer.js} | 5 +- src/lib/js/{bl_add-on_db.js => blam-db.js} | 18 +- .../js/{bl_addon_checker.js => blam-local.js} | 10 +- src/lib/js/{bl-addon.js => blam.js} | 81 ++- src/lib/js/logger.js | 13 +- .../js/{pydict_parser.js => pydict-parser.js} | 0 src/lib/js/utils.js | 50 +- src/server/db.rb | 43 -- src/server/js/bladdon_collector.js | 17 +- src/server/js/test_db.js | 32 - src/server/run.sh | 4 + src/server/server.py | 2 +- 31 files changed, 597 insertions(+), 478 deletions(-) create mode 100644 src/client/js/addon.js create mode 100644 src/client/js/db.js create mode 100644 src/client/js/error.js create mode 100644 src/client/js/task.js create mode 100644 src/client/js/ui.js create mode 100644 src/lib/js/blam-constants.js rename src/lib/js/{db_writer.js => blam-db-writer.js} (95%) rename src/lib/js/{bl_add-on_db.js => blam-db.js} (96%) rename src/lib/js/{bl_addon_checker.js => blam-local.js} (96%) rename src/lib/js/{bl-addon.js => blam.js} (79%) rename src/lib/js/{pydict_parser.js => pydict-parser.js} (100%) delete mode 100755 src/server/db.rb delete mode 100644 src/server/js/test_db.js create mode 100644 src/server/run.sh diff --git a/.gitignore b/.gitignore index 725324c..b76252b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ *~ *.swp +*.pyc + node_modules/ src/js/ext/ bower_components/ -server/venv +venv images/ext diff --git a/README.md b/README.md index 385284f..cb775a6 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,11 @@ You can install/uninstall/update all add-on's released on GitHub with this appli ## Download URL -|Version|URL| +|Version|Download URL| |---|---| -|0.1|Download| +|0.3|[Download](https://github.com/nutti/Blender-Add-on-Manager/releases/tag/v0.3)| +|0.2|[Download](https://github.com/nutti/Blender-Add-on-Manager/releases/tag/v0.2)| +|0.1|[Download](https://github.com/nutti/Blender-Add-on-Manager/releases/tag/v0.1)| ## Support Languages @@ -39,14 +41,16 @@ See [Wiki Page](https://github.com/nutti/Blender-Add-on-Manager-for-GitHub/wiki/ Project "Blender Add-on Manager" is on going. See the link below for further details. -* [Blender Artist Thread]() +* [Blender Artist Thread](https://blenderartists.org/forum/showthread.php?418833-Blender-Add-on-Manager-(About-2-000-add-ons-are-available)) ## Change Log -|Version|URL| -|---|---| -|0.1|First release for testing| +|Version|Release Date|Change Log| +|---|---|---| +|0.3|2017.4.11|[1] Move config/DB file to user directory
[2] Improve server's stability
[3] Error popup
[4] Fix bug
- Failed to run application developed by unidentified developer on macOS
- Failed to load add-on at Blender installed by this application| +|0.2|2017.4.2|[1] Support macOS
[2] Add features
- Link button to Add-on repository
- Case-insensitive search
[3]Fix bug
- Failed to install when ```__init__.py``` is located on the top directory| +|0.1|2017.3.25|First release for testing| ## Bug Report / Feature Request @@ -61,6 +65,36 @@ https://github.com/nutti/Blender-Add-on-Manager-for-GitHub/issues If you want to contribute this project, please send pull request to **develop** branch. DO NOT send pull request to **master** branch. +https://github.com/nutti/Blender-Add-on-Manager/tree/develop + +To build and run application for testing. + +```sh +$ git clone https://github.com/nutti/Blender-Add-on-Manager.git +$ cd Blender-Add-on-Manager +$ npm install +$ bower install +$ gulp +$ gulp start +``` + +To build application for relase. + +```sh +$ git clone https://github.com/nutti/Blender-Add-on-Manager.git +$ cd Blender-Add-on-Manager +$ npm install +$ bower install +$ gulp + +$ npm run build # for Windows/linux + +or + +$ node build_mac.js # for macOS +``` + + ## License MIT License. diff --git a/build.js b/build.js index a2f549f..42c7b2f 100644 --- a/build.js +++ b/build.js @@ -1,6 +1,4 @@ const packager = require('electron-packager'); -const fs = require('fs'); -const fsext = require('fs-extra'); const package = require('./package.json'); packager({ @@ -28,7 +26,5 @@ packager({ for (var i = 0; i < appPaths.length; ++i) { var path = appPaths[i]; console.log("Build is done. (path=" + path + ")"); - fs.mkdirSync(path + '/config'); - fsext.copySync('./config/config.json', path + '/config/config.json'); } }); diff --git a/build_mac.js b/build_mac.js index 8eab96c..f787aca 100644 --- a/build_mac.js +++ b/build_mac.js @@ -1,6 +1,4 @@ const packager = require('electron-packager'); -const fs = require('fs'); -const fsext = require('fs-extra'); const package = require('./package.json'); packager({ @@ -15,6 +13,7 @@ packager({ asar: true, prune: true, ignore: "node_modules/electron-connect", + "sign": "Developer ID Application: COLORFUL PICO", "appVersion": package['version'], "version-string": { companyName: "colorful-pico.net", @@ -28,7 +27,5 @@ packager({ for (var i = 0; i < appPaths.length; ++i) { var path = appPaths[i]; console.log("Build is done. (path=" + path + ")"); - fs.mkdirSync(path + '/config'); - fsext.copySync('./config/config.json', path + '/config/config.json'); } }); diff --git a/main.js b/main.js index 6964cbb..78b2c31 100755 --- a/main.js +++ b/main.js @@ -2,16 +2,12 @@ var fs = require('fs'); var electron = require('electron'); -const path = require('path'); var app = electron.app; var BrowserWindow = electron.BrowserWindow; var crashReporter = electron.crashReporter; var mainWindow = null; -var config = null; - -var CONFIG_FILE_PATH = path.join(__dirname, "config.json"); const DEBUG = false; @@ -22,16 +18,6 @@ crashReporter.start({ autoSubmit: false }); -function isExistFile(file) { - try { - fs.statSync(file); - return true; - } - catch (err) { - return false; // 'ENOENT' - } -} - app.on('window-all-closed', function() { if (process.platform != 'darwin') { @@ -39,16 +25,6 @@ app.on('window-all-closed', function() { } }); -app.on('login', function(event, webContents, request, authInfo, callback) { - event.preventDefault(); - - if (config == undefined) { return; } - if (config.proxy == undefined) { return; } - if (config.proxy.username == undefined || config.proxy.password == undefined) { return; } - - callback(config.proxy.username, config.proxy.password); -}); - app.on('ready', function() { mainWindow = new BrowserWindow({ width: 1024, @@ -60,12 +36,6 @@ app.on('ready', function() { if (DEBUG) { mainWindow.openDevTools(); } - // read configuration file - if (!isExistFile(CONFIG_FILE_PATH)) { throw new Error(CONFIG_FILE_PATH + "is not exist"); } - var text = fs.readFileSync(CONFIG_FILE_PATH, 'utf8'); - config = JSON.parse(text); - - //mainWindow.loadURL('file://' + __dirname + '/src/html/index.html'); mainWindow.loadURL('file://' + __dirname + '/html/index.html'); mainWindow.show(); diff --git a/package.json b/package.json index 66e1eb2..defbad7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Blender_Add-on_Manager", - "version": "0.2.0", + "version": "0.3.0", "description": "Blender Add-on Manager", "main": "main.js", "scripts": { diff --git a/requirements.txt b/requirements.txt index 3ced2e4..1c66bf2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,13 +1,16 @@ aniso8601==1.2.0 +appdirs==1.4.3 click==6.6 Flask==0.11.1 Flask-RESTful==0.3.5 +gunicorn==19.7.1 itsdangerous==0.24 Jinja2==2.8 MarkupSafe==0.23 +packaging==16.8 pymongo==3.4.0 +pyparsing==2.2.0 python-dateutil==2.6.0 pytz==2016.7 six==1.10.0 Werkzeug==0.11.11 -wheel==0.26.0 diff --git a/src/client/html/index.html b/src/client/html/index.html index 8b0b443..f922e3c 100755 --- a/src/client/html/index.html +++ b/src/client/html/index.html @@ -17,6 +17,11 @@ + + + + +
diff --git a/src/client/html/partials/error-popup.html b/src/client/html/partials/error-popup.html index 7c9c941..e237886 100644 --- a/src/client/html/partials/error-popup.html +++ b/src/client/html/partials/error-popup.html @@ -1,12 +1,19 @@
- -

Error!!

+

{{ errTitle }}

+

{{ errMsg }}

- Error body + {{ errCallTrace }}
+
diff --git a/src/client/js/addon.js b/src/client/js/addon.js new file mode 100644 index 0000000..ad9a93a --- /dev/null +++ b/src/client/js/addon.js @@ -0,0 +1 @@ +'use strict'; diff --git a/src/client/js/app.js b/src/client/js/app.js index a5dcc9f..fe10652 100755 --- a/src/client/js/app.js +++ b/src/client/js/app.js @@ -6,120 +6,242 @@ import del from 'del'; import electron from 'electron'; import * as Utils from 'utils'; -let cwd = Utils.getCwd(); - -import BlAddonDB from 'bl_add-on_db'; -const builder = new BlAddonDB(); -import BlAddonChecker from 'bl_addon_checker'; -const checker = new BlAddonChecker(); +import BlamDB from 'blam-db'; +const blamDB = new BlamDB(); +import BlamLocal from 'blam-local'; +const blamLocal = new BlamLocal(); import TaskMgr from 'task'; const taskMgr = new TaskMgr(); import Logger from 'logger'; const logger = new Logger(); -import * as BlAddon from 'bl-addon'; +import * as Blam from 'blam'; +import { + DB_DIR, API_VERSION_FILE, GITHUB_ADDONS_DB, INSTALLED_ADDONS_DB, + CONFIG_DIR, CONFIG_FILE_PATH, BL_INFO_UNDEF, CONFIG_FILE_INIT +} from 'blam-constants'; -var DB_DIR = cwd + '/db'; -var API_VERSION_FILE = cwd + '/db/version'; -var GITHUB_ADDONS_DB = cwd + '/db/add-on_list.db'; -var INSTALLED_ADDONS_DB = cwd + '/db/installed_add-on_list.db'; -var CONFIG_FILE_PATH = cwd + '/config/config.json'; -var BL_INFO_UNDEF = "626c5f696e666f5f@UNDEF"; var config = null; var app = angular.module('blAddonMgr', []) +function redrawApp($scope) +{ + setTimeout(function () { + $scope.$apply(); + }, 1); +} -app.controller('MainController', function ($scope, $timeout) { - // read configuration file - if (!Utils.isExistFile(CONFIG_FILE_PATH)) { throw new Error(CONFIG_FILE_PATH + "is not exist"); } - var text = fs.readFileSync(CONFIG_FILE_PATH, 'utf8'); - config = JSON.parse(text); - // initialize - builder.init(config); - - // make task - taskMgr.makeTasks(['INSTALL', 'REMOVE', 'UPDATE']); - taskMgr.addItems( - 'INSTALL', - [ - 'Downloading Add-on ...', - 'Extracting Add-on ...', - 'Installing Add-on ...', - 'Cleaning up ...', - 'Updating Installed Add-on Database ...', - 'Updating Internal Information ...' - ] - ); - taskMgr.setCompletionString('INSTALL', 'Installed Add-on'); - - taskMgr.addItems( - 'REMOVE', - [ - 'Removing Add-on ...', - 'Updating Installed Add-on Database ...', - 'Updating Internal Information ...' - ] - ) - taskMgr.setCompletionString('REMOVE', 'Deleted Add-on'); - - taskMgr.addItems( - 'UPDATE', - [ - 'Removing Add-on ...', - 'Downloading Add-on ...', - 'Extracting Add-on ...', - 'Installing Add-on ...', - 'Cleaning up ...', - 'Updating Installed Add-on Database ...', - 'Updating Internal Information ...' - ] - ) - taskMgr.setCompletionString('UPDATE', 'Updated Add-on'); - - function setTaskAndUpdate(taskName) - { - taskMgr.setTask(taskName); - updateTask(); - } +// handle error +function handleException($scope, e) { + logger.category('app').error(e); + showErrorPopup($scope, e.name, e.message, e.stack); + redrawApp($scope); +} - function advanceProgressAndUpdate() - { - taskMgr.advanceProgress(); - updateTask(); - } +// show error popup +function showErrorPopup($scope, title, msg, trace) { + $('.error-popup').css('display', 'block'); + $('.error-popup-background').css('display', 'block'); + $scope.errTitle = title; + $scope.errMsg = msg; + $scope.errCallTrace = trace; +} - function updateTask() - { - setTimeout(function () { - $scope.task = { - 'progress': taskMgr.genProgressString(), - 'progressRate': taskMgr.getCurTaskProgressRate() - }; - $scope.$apply(); - }, 1); - } +// close +function hideErrorPopup($scope) { + $('.error-popup').css('display', 'none'); + $('.error-popup-background').css('display', 'none'); + $scope.errTitle = ""; + $scope.errMsg = ""; + $scope.errCallTrace = ""; + $scope.isOpsLocked = false; + redrawApp($scope); +} + +function loadGitHubAddonDB() { + if (!Utils.isExistFile(GITHUB_ADDONS_DB)) { return {}; } + logger.category('app').info("Loading GitHub add-ons DB file ..."); + return blamDB.readDBFile(GITHUB_ADDONS_DB); +} + +function loadInstalledAddonsDB() { + if (!Utils.isExistFile(INSTALLED_ADDONS_DB)) { return {}; } + logger.category('app').info("Loading installed add-ons DB file ..."); + return blamDB.readDBFile(INSTALLED_ADDONS_DB); +} - function completeTask(addon) - { - advanceProgressAndUpdate(); - setTimeout(function () { - $scope.task = { - 'progress': taskMgr.genProgressString() + " '" + addon + "'", - 'progressRate': 1.0 - }; - $scope.$apply(); - }, 1); + + +async function installAddon($scope, key, repo, cb) { + try { + logger.category('app').info("Downloding add-on '" + repo['bl_info']['name'] + "' from " + repo['download_url']); + let target = blamLocal.getAddonPath($scope.blVerSelect); + if (target == null) { + // try to make add-on dir. + blamLocal.createAddonDir($scope.blVerSelect); + target = blamLocal.getAddonPath($scope.blVerSelect); + if (target == null) { throw new Error("Failed to make add-on directory"); } + } + + // download and extract add-on + let downloadTo = target + blamLocal.getPathSeparator() + repo['bl_info']['name'] + ".zip"; + logger.category('app').info("Save to " + downloadTo + " ..."); + const download = await Utils.downloadFile(config, repo['download_url'], downloadTo); + const extract = await Utils.extractZipFile(downloadTo, target, true); + + let extractedPath = target + blamLocal.getPathSeparator() + repo['repo_name'] + '-master'; + let srcPath = extractedPath + repo['src_dir'] + '/' + repo['src_main']; + let sp = srcPath.split(/[\/\\]/); + let copingFiles = []; + let isPackage = false; + // Package + if (sp[sp.length - 1] == "__init__.py") { + isPackage = true; + } + // Module + else { + isPackage = false; + } + advanceProgressAndUpdate($scope); + advanceProgressAndUpdate($scope); + let basePath = ""; + for (let i = 0; i < sp.length - 1; ++i) { + basePath += sp[i] + blamLocal.getPathSeparator(); + } + if (isPackage) { + let list = fs.readdirSync(basePath); + for (let i = 0; i < list.length; ++i) { + copingFiles.push({ 'path': basePath + list[i], 'filename': list[i]} ); + } + } + else { + let modPath = basePath + blamLocal.getPathSeparator() + sp[sp.length - 1]; + copingFiles.push({'path': modPath, 'filename': sp[sp.length - 1]}); + } + // copy add-on to add-on directory + let targetDir = target; + if (isPackage) { + let keyAfter = key.replace(/\s/g, '_'); + targetDir = target + blamLocal.getPathSeparator() + keyAfter; + fs.mkdirSync(targetDir); + } + for (let i = 0; i < copingFiles.length; ++i) { + let source = copingFiles[i]['path']; + let target = targetDir + blamLocal.getPathSeparator() + copingFiles[i]['filename']; + fsext.copySync(source, target); + } + advanceProgressAndUpdate($scope); + // delete garbage data + del.sync([extractedPath], {force: true}); + + cb(); } + catch (e) { + handleException($scope, e); + } +} - function redrawApp() - { - setTimeout(function () { - $scope.$apply(); - }, 1); +function removeAddon($scope, repo) { + try { + var deleteFrom = repo['src_path']; + if (!deleteFrom) { throw new Error(deleteFrom + "is not found"); } + logger.category('app').info("Deleting '" + deleteFrom + "' ..."); + advanceProgressAndUpdate($scope); + var result = del.sync([deleteFrom], {force: true}); + logger.category('app').info("Deleted '" + deleteFrom + "'"); } + catch (e) { + handleException($scope, e); + } +} + +function setTaskAndUpdate($scope, taskName) +{ + taskMgr.setTask(taskName); + updateTask($scope); +} + +function advanceProgressAndUpdate($scope) +{ + taskMgr.advanceProgress(); + updateTask($scope); +} + +function updateTask($scope) +{ + setTimeout(function () { + $scope.task = { + 'progress': taskMgr.genProgressString(), + 'progressRate': taskMgr.getCurTaskProgressRate() + }; + $scope.$apply(); + }, 1); +} + +function completeTask($scope, addon) +{ + advanceProgressAndUpdate($scope); + setTimeout(function () { + $scope.task = { + 'progress': taskMgr.genProgressString() + " '" + addon + "'", + 'progressRate': 1.0 + }; + $scope.$apply(); + }, 1); +} + +// make task +taskMgr.makeTasks(['INSTALL', 'REMOVE', 'UPDATE']); +taskMgr.addItems( + 'INSTALL', + [ + 'Downloading Add-on ...', + 'Extracting Add-on ...', + 'Installing Add-on ...', + 'Cleaning up ...', + 'Updating Installed Add-on Database ...', + 'Updating Internal Information ...' + ] +); +taskMgr.setCompletionString('INSTALL', 'Installed Add-on'); + +taskMgr.addItems( + 'REMOVE', + [ + 'Removing Add-on ...', + 'Updating Installed Add-on Database ...', + 'Updating Internal Information ...' + ] +) +taskMgr.setCompletionString('REMOVE', 'Deleted Add-on'); + +taskMgr.addItems( + 'UPDATE', + [ + 'Removing Add-on ...', + 'Downloading Add-on ...', + 'Extracting Add-on ...', + 'Installing Add-on ...', + 'Cleaning up ...', + 'Updating Installed Add-on Database ...', + 'Updating Internal Information ...' + ] +) +taskMgr.setCompletionString('UPDATE', 'Updated Add-on'); + + +app.controller('MainController', function ($scope, $timeout) { + + var main = this; + main.repoList = []; + + $scope.blVerList = blamLocal.getInstalledBlVers(); + $scope.blVerSelect = $scope.blVerList[0]; + $scope.showBlVerSelect = true; + + $scope.onAddonSelectorChanged = onAddonSelectorChanged; - $scope.blVerList = checker.getInstalledBlVers(); //$scope.blVerList.push('Custom'); $scope.addonCategories = [ {id: 1, name: 'All', value: 'All'}, @@ -148,65 +270,18 @@ app.controller('MainController', function ($scope, $timeout) { {id: 3, name: 'Update', value: 'update'} ]; $scope.customAddonDirList = []; - - $scope.githubAddons = loadGitHubAddonDB(); - $scope.installedAddons = loadInstalledAddonsDB(); - $scope.addonStatus = BlAddon.updateAddonStatus($scope.githubAddons, $scope.installedAddons, $scope.blVerList); - - - var main = this; - main.repoList = []; - - $scope.blVerSelect = $scope.blVerList[0]; - $scope.showBlVerSelect = true; - $scope.isOpsLocked = false; - - $scope.onAddonSelectorChanged = onAddonSelectorChanged; + $scope.addonListActive = 1; // "Update GitHub DB" button $scope.onGitHubDBBtnClicked = function ($event) { - updateGitHubAddonDB(); + updateGitHubAddonDB($scope); }; // "Update Install DB" button $scope.onInstDBBtnClicked = function ($event) { - updateInstalledAddonDB(); + updateInstalledAddonDB($scope); }; - // show error popup - function openErrorPopup() { - $('.error-popup').css('display', 'none'); - } - - openErrorPopup(); - - async function updateGitHubAddonDB() { - $scope.isOpsLocked = true; - redrawApp(); - if (!Utils.isExistFile(DB_DIR)) { - fs.mkdirSync(DB_DIR); - } - const version = await builder.makeAPIStatusFile(API_VERSION_FILE); - const fetch = await builder.fetchFromDBServer(GITHUB_ADDONS_DB); - $scope.githubAddons = loadGitHubAddonDB(); - $scope.addonStatus = BlAddon.updateAddonStatus($scope.githubAddons, $scope.installedAddons, $scope.blVerList); - onAddonSelectorChanged(); - $scope.isOpsLocked = false; - redrawApp(); - } - - function updateInstalledAddonDB() { - checker.checkInstalledBlAddon(); - if (!Utils.isExistFile(DB_DIR)) { - fs.mkdirSync(DB_DIR); - } - checker.saveTo(INSTALLED_ADDONS_DB); - $scope.installedAddons = loadInstalledAddonsDB(); - $scope.addonStatus = BlAddon.updateAddonStatus($scope.githubAddons, $scope.installedAddons, $scope.blVerList); - onAddonSelectorChanged(); - } - - $scope.isAddonListActive = function (index) { if ($scope.addonListActive == undefined) { $scope.onAddonListSelectorChanged(0); @@ -273,7 +348,7 @@ app.controller('MainController', function ($scope, $timeout) { defaultPath: '.' }, (folderName) => { $scope.customAddonDir = folderName; - redrawApp(); + redrawApp($scope); }); }; @@ -289,6 +364,81 @@ app.controller('MainController', function ($scope, $timeout) { consle.log($scope.customAddonDirList); }; + + async function initApp() { + $scope.isOpsLocked = true; + redrawApp($scope); + + // setup users directory + if (!Utils.isExistFile(DB_DIR)) { fs.mkdirSync(DB_DIR); } + if (!Utils.isExistFile(CONFIG_DIR)) { fs.mkdirSync(CONFIG_DIR); } + + // make config.json + if (!Utils.isExistFile(CONFIG_FILE_PATH)) { + fs.writeFileSync(CONFIG_FILE_PATH, CONFIG_FILE_INIT); + } + + // read configuration file + let text = fs.readFileSync(CONFIG_FILE_PATH, 'utf8'); + config = JSON.parse(text); + // initialize + blamDB.init(config); + + // make installed add-on DB + if (!Utils.isExistFile(INSTALLED_ADDONS_DB)) { + blamLocal.checkInstalledBlAddon(); + blamLocal.saveTo(INSTALLED_ADDONS_DB); + } + + // make github add-on DB + if (!Utils.isExistFile(GITHUB_ADDONS_DB)) { + const version = await blamDB.makeAPIStatusFile(API_VERSION_FILE); + const fetch = await blamDB.fetchFromDBServer(GITHUB_ADDONS_DB); + } + + $scope.githubAddons = loadGitHubAddonDB(); + $scope.installedAddons = loadInstalledAddonsDB(); + $scope.addonStatus = Blam.updateAddonStatus($scope.githubAddons, $scope.installedAddons, $scope.blVerList); + onAddonSelectorChanged(); + + $scope.isOpsLocked = false; + redrawApp($scope); + } + + + initApp(); + + + $scope.closeErrorPopup = () => { + hideErrorPopup($scope); + } + + async function updateGitHubAddonDB($scope) { + $scope.isOpsLocked = true; + redrawApp($scope); + if (!Utils.isExistFile(DB_DIR)) { + fs.mkdirSync(DB_DIR); + } + const version = await blamDB.makeAPIStatusFile(API_VERSION_FILE); + const fetch = await blamDB.fetchFromDBServer(GITHUB_ADDONS_DB); + $scope.githubAddons = loadGitHubAddonDB(); + $scope.addonStatus = Blam.updateAddonStatus($scope.githubAddons, $scope.installedAddons, $scope.blVerList); + onAddonSelectorChanged(); + $scope.isOpsLocked = false; + redrawApp($scope); + } + + function updateInstalledAddonDB($scope) { + blamLocal.checkInstalledBlAddon(); + if (!Utils.isExistFile(DB_DIR)) { + fs.mkdirSync(DB_DIR); + } + blamLocal.saveTo(INSTALLED_ADDONS_DB); + $scope.installedAddons = loadInstalledAddonsDB(); + $scope.addonStatus = Blam.updateAddonStatus($scope.githubAddons, $scope.installedAddons, $scope.blVerList); + onAddonSelectorChanged(); + } + function onAddonSelectorChanged() { // collect filter condition var activeList = $scope.addonLists[$scope.addonListActive]['value']; @@ -309,7 +459,7 @@ app.controller('MainController', function ($scope, $timeout) { case 'installed': logger.category('app').info("Show Installed add-on list"); if ($scope.addonStatus) { - addons = BlAddon.filterAddons( + addons = Blam.filterAddons( $scope.addonStatus, 'installed', ['INSTALLED', 'UPDATABLE'], @@ -322,20 +472,26 @@ app.controller('MainController', function ($scope, $timeout) { case 'github': logger.category('app').info("Show GitHub add-on list"); if ($scope.addonStatus) { - addons = BlAddon.filterAddons( + addons = Blam.filterAddons( $scope.addonStatus, 'github', ['INSTALLED', 'NOT_INSTALLED', 'UPDATABLE'], blVer, activeCategory, searchStr); + // addons = Blam.sortAddons( + // $scope.addonStatus, + // addons, + // 'github', + // 'NAME', + // 'ASCEND'); } $scope.addonInfoTpl = 'partials/addon-info/github.html'; break; case 'update': logger.category('app').info("Show Updatable add-on list"); if ($scope.addonStatus) { - addons = BlAddon.filterAddons( + addons = Blam.filterAddons( $scope.addonStatus, 'installed', ['UPDATABLE'], @@ -354,83 +510,6 @@ app.controller('MainController', function ($scope, $timeout) { main.repoList = addons; - async function installAddon(key, repo, cb) { - try { - logger.category('app').info("Downloding add-on '" + repo['bl_info']['name'] + "' from " + repo['download_url']); - let target = checker.getAddonPath($scope.blVerSelect); - if (target == null) { - // try to make add-on dir. - checker.createAddonDir($scope.blVerSelect); - target = checker.getAddonPath($scope.blVerSelect); - if (target == null) { throw new Error("Failed to make add-on directory"); } - } - - // download and extract add-on - let downloadTo = target + checker.getPathSeparator() + repo['bl_info']['name'] + ".zip"; - logger.category('app').info("Save to " + downloadTo + " ..."); - const download = await Utils.downloadFile(config, repo['download_url'], downloadTo); - const extract = await Utils.extractZipFile(downloadTo, target, true); - - let extractedPath = target + checker.getPathSeparator() + repo['repo_name'] + '-master'; - let srcPath = extractedPath + repo['src_dir'] + '/' + repo['src_main']; - let sp = srcPath.split(/[\/\\]/); - let copingFiles = []; - let isPackage = false; - // Package - if (sp[sp.length - 1] == "__init__.py") { - isPackage = true; - } - // Module - else { - isPackage = false; - } - advanceProgressAndUpdate(); - advanceProgressAndUpdate(); - let basePath = ""; - for (let i = 0; i < sp.length - 1; ++i) { - basePath += sp[i] + checker.getPathSeparator(); - } - if (isPackage) { - let list = fs.readdirSync(basePath); - for (let i = 0; i < list.length; ++i) { - copingFiles.push({ 'path': basePath + list[i], 'filename': list[i]} ); - } - } - else { - let modPath = basePath + checker.getPathSeparator() + sp[sp.length - 1]; - copingFiles.push({'path': modPath, 'filename': sp[sp.length - 1]}); - } - // copy add-on to add-on directory - let targetDir = target; - if (isPackage) { - targetDir = target + checker.getPathSeparator() + key; - fs.mkdirSync(targetDir); - } - for (let i = 0; i < copingFiles.length; ++i) { - let source = copingFiles[i]['path']; - let target = targetDir + checker.getPathSeparator() + copingFiles[i]['filename']; - fsext.copySync(source, target); - } - advanceProgressAndUpdate(); - // delete garbage data - del.sync([extractedPath], {force: true}); - - cb(); - } - catch (e) { - logger.category('app').error(e); - } - } - - function removeAddon(repo) { - var deleteFrom = repo['src_path']; - if (!deleteFrom) { throw new Error(deleteFrom + "is not found"); } - logger.category('app').info("Deleting '" + deleteFrom + "' ..."); - advanceProgressAndUpdate(); - var result = del.sync([deleteFrom], {force: true}); - logger.category('app').info("Deleted '" + deleteFrom + "'"); - } - function onLnBtnClicked($event) { let repoIndex = $($event.target).data('repo-index'); let repo = $scope.addonStatus[main.repoList[repoIndex]]['github']; @@ -439,65 +518,65 @@ app.controller('MainController', function ($scope, $timeout) { } function onDlBtnClicked($event) { - setTaskAndUpdate('INSTALL'); + setTaskAndUpdate($scope, 'INSTALL'); let repoIndex = $($event.target).data('repo-index'); let repo = $scope.addonStatus[main.repoList[repoIndex]]['github']; let key = main.repoList[repoIndex]; $scope.isOpsLocked = true; - installAddon(key, repo, () => { + installAddon($scope, key, repo, () => { try { - advanceProgressAndUpdate(); - updateInstalledAddonDB(); - advanceProgressAndUpdate(); + advanceProgressAndUpdate($scope); + updateInstalledAddonDB($scope); + advanceProgressAndUpdate($scope); $scope.isOpsLocked = false; - completeTask(repo['bl_info']['name']); + completeTask($scope, repo['bl_info']['name']); } catch (e) { - logger.category('app').err(e); + handleException($scope, e); } }); } function onRmBtnClicked($event) { try { - setTaskAndUpdate('REMOVE'); + setTaskAndUpdate($scope, 'REMOVE'); let repoIndex = $($event.target).data('repo-index'); let repo = $scope.addonStatus[main.repoList[repoIndex]]['installed'][blVer]; $scope.isOpsLocked = true; - removeAddon(repo); - advanceProgressAndUpdate(); - updateInstalledAddonDB(); + removeAddon($scope, repo); + advanceProgressAndUpdate($scope); + updateInstalledAddonDB($scope); $scope.isOpsLocked = false; - completeTask(repo['bl_info']['name']); + completeTask($scope, repo['bl_info']['name']); } catch (e) { - logger.category('app').err(e); + handleException($scope, e); } } function onUpBtnClicked($event) { - setTaskAndUpdate('UPDATE'); + setTaskAndUpdate($scope, 'UPDATE'); let repoIndex = $($event.target).data('repo-index'); let repoInstalled = $scope.addonStatus[main.repoList[repoIndex]]['installed'][blVer]; let repoGitHub = $scope.addonStatus[main.repoList[repoIndex]]['github']; let key = main.repoList[repoIndex]; $scope.isOpsLocked = true; try { - removeAddon(repoInstalled); + removeAddon($scope, repoInstalled); } catch (e) { - logger.category('app').err(e); + handleException($scope, e); } - installAddon(key, repoGitHub, () => { + installAddon($scope, key, repoGitHub, () => { try { - advanceProgressAndUpdate(); - updateInstalledAddonDB(); - advanceProgressAndUpdate(); + advanceProgressAndUpdate($scope); + updateInstalledAddonDB($scope); + advanceProgressAndUpdate($scope); $scope.isOpsLocked = false; - completeTask(repoGitHub['bl_info']['name']); + completeTask($scope, repoGitHub['bl_info']['name']); } catch (e) { - logger.category('app').err(e); + handleException($scope, e); } }); } @@ -510,17 +589,6 @@ app.controller('MainController', function ($scope, $timeout) { $scope.onRmBtnClicked = onRmBtnClicked; // "Update" button $scope.onUpBtnClicked = onUpBtnClicked; + } }); - -function loadGitHubAddonDB() { - if (!Utils.isExistFile(GITHUB_ADDONS_DB)) { return {}; } - logger.category('app').info("Loading GitHub add-ons DB file ..."); - return builder.readDBFile(GITHUB_ADDONS_DB); -} - -function loadInstalledAddonsDB() { - if (!Utils.isExistFile(INSTALLED_ADDONS_DB)) { return {}; } - logger.category('app').info("Loading installed add-ons DB file ..."); - return builder.readDBFile(INSTALLED_ADDONS_DB); -} diff --git a/src/client/js/db.js b/src/client/js/db.js new file mode 100644 index 0000000..6924154 --- /dev/null +++ b/src/client/js/db.js @@ -0,0 +1,5 @@ +'use strict'; + +import { + GITHUB_ADDONS_DB, INSTALLED_ADDONS_DB +} from 'blam-constants'; diff --git a/src/client/js/error.js b/src/client/js/error.js new file mode 100644 index 0000000..ad9a93a --- /dev/null +++ b/src/client/js/error.js @@ -0,0 +1 @@ +'use strict'; diff --git a/src/client/js/task.js b/src/client/js/task.js new file mode 100644 index 0000000..ad9a93a --- /dev/null +++ b/src/client/js/task.js @@ -0,0 +1 @@ +'use strict'; diff --git a/src/client/js/ui.js b/src/client/js/ui.js new file mode 100644 index 0000000..ad9a93a --- /dev/null +++ b/src/client/js/ui.js @@ -0,0 +1 @@ +'use strict'; diff --git a/src/client/sass/components/_button.scss b/src/client/sass/components/_button.scss index fb99745..3e2afd4 100644 --- a/src/client/sass/components/_button.scss +++ b/src/client/sass/components/_button.scss @@ -1,6 +1,6 @@ .text-button-wrapper { - width: 20%; - max-width: 20%; + width: 10rem; + max-width: 10rem; display: inline-block; .text-button { cursor: pointer; diff --git a/src/client/sass/components/_popup.scss b/src/client/sass/components/_popup.scss index 05f257b..beac9c8 100644 --- a/src/client/sass/components/_popup.scss +++ b/src/client/sass/components/_popup.scss @@ -8,8 +8,43 @@ position: fixed; top: 50%; left: 50%; - background-color: #FFFFFF; - overflow: hidden; + background-color: #252525; + z-index: 101; + box-shadow: 0px 0px 20px 20px rgba(0,0,0,1.0); + .error-popup-header { + h3 { + font-size: 2rem; + padding-left: 1rem; + margin: 1.0rem; + } + h4 { + color: $body-color - #202020; + font-size: 1.3rem; + padding-left: 3.0rem; + margin: 1.0rem; + } + } + .error-popup-body { + color: $body-color - #303030; + font-size: 0.9rem; + padding-left: 6rem; + } + .close-button-wrapper { + padding-right: 3rem; + position: absolute; + top: $popup-height - 70px; + left: $popup-width - 150px; + } + } + .error-popup-background { + display: none; + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + opacity: 0.7; + background-color: #000000; z-index: 100; } } diff --git a/src/client/sass/lib/_variables.scss b/src/client/sass/lib/_variables.scss index 25aed3b..7cc30d9 100644 --- a/src/client/sass/lib/_variables.scss +++ b/src/client/sass/lib/_variables.scss @@ -26,5 +26,5 @@ $footer-height: 3.0rem; $progressbar-color: #333366; $progressbar-complete-color: $progressbar-color + #777799; -$popup-width: 600px; -$popup-height: 300px; +$popup-width: 700px; +$popup-height: 400px; diff --git a/src/lib/js/blam-constants.js b/src/lib/js/blam-constants.js new file mode 100644 index 0000000..8a9c6df --- /dev/null +++ b/src/lib/js/blam-constants.js @@ -0,0 +1,38 @@ +'use strict'; + +import electron from 'electron'; + +export const USER_DIR = electron.remote.app.getPath('userData'); +export const DB_DIR = USER_DIR + '/db'; +export const API_VERSION_FILE = DB_DIR + '/version'; +export const GITHUB_ADDONS_DB = DB_DIR + '/add-on_list.db'; +export const INSTALLED_ADDONS_DB = DB_DIR + '/installed_add-on_list.db'; +export const CONFIG_DIR = USER_DIR + '/config'; +export const CONFIG_FILE_PATH = CONFIG_DIR + '/config.json'; +export const BL_INFO_UNDEF = "626c5f696e666f5f@UNDEF"; + +export const GITHUB_URL = 'https://github.com'; + +export const DB_NAME = 'blAddonMgr'; +export const COLLECTION_NAME = 'blAddonGitHub'; +export const DB_HOSTNAME = 'localhost'; +export const DB_PORT = 27017; + +export const MAX_LOG_SIZE = 3 * 1024 * 1024; // 3MiB +export const MAX_BACKUPS = 3; +export const LOG_DIR = USER_DIR + '/logs'; + +export const CONFIG_FILE_INIT = +`{ + "db": { + "server": "colorful-pico.net", + "port": "5000", + "api": "/api/bl-addon-db", + "endpoint": { + "addon-list": "/addon-list", + "addon-total": "/addon-total", + "version": "/version", + "services": "/services" + } + } +}`; diff --git a/src/lib/js/db_writer.js b/src/lib/js/blam-db-writer.js similarity index 95% rename from src/lib/js/db_writer.js rename to src/lib/js/blam-db-writer.js index 681c473..7d1b858 100644 --- a/src/lib/js/db_writer.js +++ b/src/lib/js/blam-db-writer.js @@ -3,10 +3,7 @@ import MongoDB from 'mongodb'; const mongodb = MongoDB.MongoClient; -const DB_NAME = 'blAddonMgr'; -const COLLECTION_NAME = 'blAddonGitHub'; -const DB_HOSTNAME = 'localhost'; -const DB_PORT = 27017; +import {DB_NAME, COLLECTION_NAME, DB_HOSTNAME, DB_PORT} from 'blam-constants'; export default class DBWriter { diff --git a/src/lib/js/bl_add-on_db.js b/src/lib/js/blam-db.js similarity index 96% rename from src/lib/js/bl_add-on_db.js rename to src/lib/js/blam-db.js index ef0111f..7f0ade3 100644 --- a/src/lib/js/bl_add-on_db.js +++ b/src/lib/js/blam-db.js @@ -8,13 +8,13 @@ import request from 'request'; // own modules import * as Utils from 'utils'; -import * as BlAddon from 'bl-addon'; +import * as Blam from 'blam'; import Logger from 'logger'; const logger = new Logger(); -const GITHUB_URL = 'https://github.com'; +import {GITHUB_URL} from 'blam-constants'; -export default class BlAddonDB +export default class BlamDB { constructor() { this['config'] = null; @@ -156,13 +156,13 @@ export default class BlAddonDB _parseMainSrc(srcBody) { if (!srcBody) { return null; } - var blInfoBody = Utils.extractBlInfoBody(srcBody); + var blInfoBody = Blam.extractBlInfoBody(srcBody); if (!blInfoBody) { return null; } - var info = Utils.parseBlInfo(blInfoBody); + var info = Blam.parseBlInfo(blInfoBody); if (!info) { return null; } - return BlAddon.validateBlInfo(info); + return Blam.validateBlInfo(info); } async buildAddonDB(cb) { @@ -261,7 +261,7 @@ export default class BlAddonDB repoInfoList.forEach( (elm) => { let name = elm['bl_info']['name']; let author = elm['bl_info']['author']; - let key = Utils.genBlAddonKey(name, author); + let key = Blam.genBlAddonKey(name, author); elm['key'] = key }); @@ -282,7 +282,7 @@ export default class BlAddonDB for (let i = 1; i < elms.length; ++i) { let ver1 = newest['bl_info']['version']; let ver2 = elms[i]['bl_info']['version']; - if (BlAddon.compareAddonVersion(ver1, ver2) == -1) { // ver1 < ver2 + if (Blam.compareAddonVersion(ver1, ver2) == -1) { // ver1 < ver2 newest = elms[i]; } } @@ -299,7 +299,7 @@ export default class BlAddonDB if (result) { let ver1 = result['bl_info']['version']; let ver2 = elm['bl_info']['version']; - if (BlAddon.compareAddonVersion(ver1, ver2) >= 0) { // ver1 >= ver2 + if (Blam.compareAddonVersion(ver1, ver2) >= 0) { // ver1 >= ver2 logger.category('lib').info("No need to updated (key=" + elm['key'] + ")"); continue; } diff --git a/src/lib/js/bl_addon_checker.js b/src/lib/js/blam-local.js similarity index 96% rename from src/lib/js/bl_addon_checker.js rename to src/lib/js/blam-local.js index b473f11..15f3bdd 100644 --- a/src/lib/js/bl_addon_checker.js +++ b/src/lib/js/blam-local.js @@ -5,12 +5,12 @@ import fs from 'fs'; import path from 'path'; import * as Utils from 'utils'; -import * as BlAddon from 'bl-addon'; +import * as Blam from 'blam'; import Logger from 'logger'; const logger = new Logger(); -export default class BlAddonChecker +export default class BlamLocal { constructor() { this['addonList'] = {}; @@ -171,11 +171,11 @@ export default class BlAddonChecker } let srcBody = fs.readFileSync(mainSrcPath).toString(); if (!Utils.isExistFile(mainSrcPath)) { throw new Error("File '" + mainSrcPath + "' does not exist"); } - let blInfoBody = Utils.extractBlInfoBody(srcBody); + let blInfoBody = Blam.extractBlInfoBody(srcBody); if (!blInfoBody) { continue; } // ignore - let info = Utils.parseBlInfo(blInfoBody); + let info = Blam.parseBlInfo(blInfoBody); if (!info) { continue; } // ignore - this['addonList'][key][i]['bl_info'] = BlAddon.validateBlInfo(info); + this['addonList'][key][i]['bl_info'] = Blam.validateBlInfo(info); this['addonList'][key][i]['main_src_path'] = mainSrcPath; this['addonList'][key][i]['src_path'] = path; diff --git a/src/lib/js/bl-addon.js b/src/lib/js/blam.js similarity index 79% rename from src/lib/js/bl-addon.js rename to src/lib/js/blam.js index 2fe6821..d9fcabf 100644 --- a/src/lib/js/bl-addon.js +++ b/src/lib/js/blam.js @@ -1,8 +1,13 @@ 'use strict'; import * as Utils from 'utils'; +import Logger from 'logger'; +const logger = new Logger(); +import PyDictParser from 'pydict-parser'; +const pyDictParser = new PyDictParser(); + +import {BL_INFO_UNDEF} from 'blam-constants'; -const BL_INFO_UNDEF = "626c5f696e666f5f@UNDEF"; // if there is undefined entry, fake data is used export function validateBlInfo(info) { @@ -22,7 +27,6 @@ export function validateBlInfo(info) { return out; } - export function compareAddonVersion(v1, v2) { if (v1 === BL_INFO_UNDEF) { if (v2 === BL_INFO_UNDEF) { @@ -119,6 +123,35 @@ export function filterAddons(addons, source, status, blVer, category, regex) { return keys; } +function _compareAddonsByName(a, b, list, order) +{ + if (a[list]['bl_info']['name'].toString() > b[list]['bl_info']['name'].toString()) { + return order == 'ASCEND' ? 1 : -1; + } + else { + return order == 'ASCEND' ? 1 : -1; + } +} + +function _compareAddons(a, b, list, item, order) +{ + switch (item) { + case 'NAME': + return _compareAddonsByName(a, b, list, order); + break; + } + + return 0; +} + +export function sortAddons(addons, keys, list, item, order) +{ + keys.sort( (a, b) => { + return _compareAddons(addons[a], addons[b], list, item, order); + }); + + return keys; +} export function updateAddonStatus(github, installed, blVers) { @@ -168,8 +201,8 @@ export function updateAddonStatus(github, installed, blVers) } // newest version is registered else { - let ver1 = addonStatus[installedKey]['installed'][blVer]['bl_info']['version'].split('.'); - let ver2 = installed[blVer][i]['bl_info']['version'].split('.'); + let ver1 = addonStatus[installedKey]['installed'][blVer]['bl_info']['version']; + let ver2 = installed[blVer][i]['bl_info']['version']; if (compareAddonVersion(ver1, ver2) == -1) { // ver1 < ver2 addonStatus[installedKey]['installed'][blVer] = installed[blVer][i]; } @@ -215,3 +248,43 @@ export function updateAddonStatus(github, installed, blVers) return addonStatus; } + +export function genBlAddonKey(name, author) { + return name + '@' + author; +} + + +export function extractBlInfoBody(srcBody) { + let result = srcBody.match(/\n*(bl_info\s*=\s*)([\s\S]*)$/); + if (!result || !result[2]) { return null; } + return result[2]; +} + +export function parseBlInfo(srcBody) { + let parsed = null; + + try { + parsed = pyDictParser.parse(srcBody); + } + catch (e) { + logger.category('lib').warn("==========Parse Error========="); + logger.category('lib').warn("---srcBody---"); + logger.category('lib').warn(srcBody); + logger.category('lib').warn("---Exception---"); + logger.category('lib').warn(e); + return null; + } + if (parsed == null) { + logger.category('lib').warn("Failed to parse source."); + return null; + } + + if (parsed['version']) { + parsed['version'] = parsed['version'].join('.'); + } + if (parsed['blender']) { + parsed['blender'] = parsed['blender'].join('.'); + } + + return parsed; +} diff --git a/src/lib/js/logger.js b/src/lib/js/logger.js index 615aebf..3882cb9 100644 --- a/src/lib/js/logger.js +++ b/src/lib/js/logger.js @@ -1,18 +1,21 @@ 'use strict'; +import fs from 'fs'; import path from 'path'; import log4js from 'log4js'; import log4jsExt from 'log4js-extend'; +import electron from 'electron'; import * as Utils from 'utils'; -const MAX_LOG_SIZE = 3 * 1024 * 1024; // 3MiB -const MAX_BACKUPS = 3; +import {USER_DIR, MAX_LOG_SIZE, MAX_BACKUPS, LOG_DIR} from 'blam-constants'; export default class Logger { constructor () { - let cwd = Utils.getCwd(); + if (!Utils.isExistFile(LOG_DIR)) { + fs.mkdirSync(LOG_DIR); + } let config = { "log4js": { "level": "ALL", @@ -23,14 +26,14 @@ export default class Logger "type": "file", "backups": MAX_BACKUPS, "maxLogSize": MAX_LOG_SIZE, - "filename": cwd + "/logs/lib.log" + "filename": LOG_DIR + "/lib.log" }, { "category": "app", "type": "file", "backups": MAX_BACKUPS, "maxLogSize": MAX_LOG_SIZE, - "filename": cwd + "/logs/app.log" + "filename": LOG_DIR + "/app.log" } ] } diff --git a/src/lib/js/pydict_parser.js b/src/lib/js/pydict-parser.js similarity index 100% rename from src/lib/js/pydict_parser.js rename to src/lib/js/pydict-parser.js diff --git a/src/lib/js/utils.js b/src/lib/js/utils.js index 88f4587..29106bd 100644 --- a/src/lib/js/utils.js +++ b/src/lib/js/utils.js @@ -5,11 +5,8 @@ import fs from 'fs'; import path from 'path'; import request from 'request'; import unzip from 'unzip'; +import electron from 'electron'; -import PyDictParser from 'pydict_parser'; -const pyDictParser = new PyDictParser(); -//import Logger from 'logger'; -//const logger = new Logger(); export function getCwd() { let type = os.type().toString(); @@ -21,8 +18,7 @@ export function getCwd() { cwd = process.cwd(); break; case 'Darwin': - cwd = path.dirname(require.main.filename); - cwd = cwd.slice(0, cwd.lastIndexOf('/Blender_Add-on_Manager.app/Contents/Resources') + 1); + cwd = electron.remote.app.getPath('userData'); break; } @@ -54,44 +50,6 @@ export function is(type, obj) { } -export function extractBlInfoBody(srcBody) { - let result = srcBody.match(/\n*(bl_info\s*=\s*)([\s\S]*)$/); - if (!result || !result[2]) { return null; } - return result[2]; -} - -export function parseBlInfo(srcBody) { - let parsed = null; - - try { - parsed = pyDictParser.parse(srcBody); - } - catch (e) { - /* - logger.category('lib').warn("==========Parse Error========="); - logger.category('lib').warn("---srcBody---"); - logger.category('lib').warn(srcBody); - logger.category('lib').warn("---Exception---"); - logger.category('lib').warn(e); - */ - return null; - } - if (parsed == null) { - /* - logger.category('lib').warn("Failed to parse source."); - */ - return null; - } - - if (parsed['version']) { - parsed['version'] = parsed['version'].join('.'); - } - if (parsed['blender']) { - parsed['blender'] = parsed['blender'].join('.'); - } - - return parsed; -} export function isProxyConfigValid(config) { if (!config) { return false; } @@ -197,10 +155,6 @@ export function extractZipFile(from_, to, deleteOriginal) { }); } -export function genBlAddonKey(name, author) { - return name + '@' + author; -} - export function getRemoteFileSize(config, url) { return new Promise( (resolve) => { let r; diff --git a/src/server/db.rb b/src/server/db.rb deleted file mode 100755 index a996686..0000000 --- a/src/server/db.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'openssl' -#OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE - -require 'nokogiri' -require 'mechanize' -require 'uri' -require 'json' - -CONFIG_FILE = 'config.json' - -config = open(CONFIG_FILE) do |io| - JSON.load(io) -end - -agent = Mechanize.new - -if config['proxy'] != nil then - proxy_conf = config['proxy'] - agent.set_proxy(proxy_conf['server'], proxy_conf['port'], proxy_conf['username_enc'], proxy_conf['password']) -end - -agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE -agent.get('https://github.com/login') do |page| - form = page.forms[0] - github_conf = config['github'] - form.login = github_conf['username'] - form.password = github_conf['password'] - login_page = form.submit form.buttons.first - #puts page.body - - params = URI.encode_www_form({ - q: 'bl_info', - type: 'Code', - ref: 'searchresults', - p: 1}) - url = URI.parse("https://github.com/search?#{params}") - agent.get(url) do |result| - puts result.body - doc = Nokogiri::HTML.parse(result, nil) - end - #h1_text = doc.xpath('//h1').text -end - diff --git a/src/server/js/bladdon_collector.js b/src/server/js/bladdon_collector.js index 68de9b9..91c0a2b 100644 --- a/src/server/js/bladdon_collector.js +++ b/src/server/js/bladdon_collector.js @@ -4,10 +4,9 @@ import fs from 'fs'; import path from 'path'; - -import BlAddonDB from 'bl_add-on_db'; -const builder = new BlAddonDB(); -import DBWriter from 'db_writer'; +import BlamDB from 'blam-db'; +const blamDB = new BlamDB(); +import DBWriter from 'blam-db-writer'; const dbWriter = new DBWriter(); dbWriter.init(); @@ -58,10 +57,10 @@ function getDate() { function collectBlAddon(startPage, endPage, startFileSize, endFileSize) { try { - builder.setPages(startPage, endPage); - builder.setFileSizes(startFileSize, endFileSize); - builder.buildAddonDB( () => { - builder.writeDB(dbWriter); + blamDB.setPages(startPage, endPage); + blamDB.setFileSizes(startFileSize, endFileSize); + blamDB.buildAddonDB( () => { + blamDB.writeDB(dbWriter); }); } catch (e) { @@ -101,6 +100,6 @@ console.log("Parsing configuration file ..."); config = JSON.parse(text); console.log("Parsed configuration file ..."); -builder.init(config, minPage, minPage, minFileSize, minFileSize); +blamDB.init(config, minPage, minPage, minFileSize, minFileSize); execCmd(minFileSize, minPage); diff --git a/src/server/js/test_db.js b/src/server/js/test_db.js deleted file mode 100644 index 393673f..0000000 --- a/src/server/js/test_db.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -import BlAddonDB from 'bl_add-on_db'; -const db = new BlAddonDB(); - -import DBWriter from 'db_writer'; -const writer = new DBWriter(); - -import fs from 'fs'; -import path from 'path'; - -const CONFIG_FILE = process.cwd() + '/config.json'; - -let text = fs.readFileSync(CONFIG_FILE, 'utf8'); -console.log("Parsing configuration file ..."); -let config = JSON.parse(text); -console.log("Parsed configuration file ..."); - -writer.init(); - -db.init(config, 1, 1, 0, 499); -db.buildAddonDB( () => { - db.writeDB(writer); - console.log("fin"); -}); - -loop(); - -function loop() { - console.log("loop"); - setTimeout(() => { loop() }, 10000); -} diff --git a/src/server/run.sh b/src/server/run.sh new file mode 100644 index 0000000..78ca5ab --- /dev/null +++ b/src/server/run.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +gunicorn -w 10 -b 0.0.0.0:5000 -n bladdondb_api --pythonpath ./ server:app + diff --git a/src/server/server.py b/src/server/server.py index ea44081..08ed805 100644 --- a/src/server/server.py +++ b/src/server/server.py @@ -10,7 +10,7 @@ api = Api(app) SERVICES = ['github'] -API_VERSION = "0.1.1" +API_VERSION = "0.1.2" class JSONEncoder(json.JSONEncoder):