diff --git a/lib/deepcode.js b/lib/deepcode.js index a160573..d6b83ab 100644 --- a/lib/deepcode.js +++ b/lib/deepcode.js @@ -26,11 +26,13 @@ export default { config, - async initialize(sharedState) { + async initialize() { const dbConnected = await DB.init(); Logger.log(`DB connected: ${dbConnected}`); + const sharedState = await DB.restoreState(true); const projectState = await DB.restoreState(); + Store.init(sharedState, projectState); Logger.log('Activating plugin'); @@ -109,6 +111,8 @@ export default { serialize() { const sharedState = Store.getSharedState(); + + CommonUtils.saveSharedStore(); CommonUtils.saveProjectStore(); const now = new Date(); diff --git a/lib/modules/Analyser.js b/lib/modules/Analyser.js index 691ce90..9462a13 100644 --- a/lib/modules/Analyser.js +++ b/lib/modules/Analyser.js @@ -72,7 +72,10 @@ class Analyser { return Promise.resolve({ status: ANALYSIS_STATUS.failed, completed: 0, - analysisResults: {}, + analysisResults: { + origin: {}, + table: [], + }, analysisURL: '', }); } diff --git a/lib/modules/CommonUtils.js b/lib/modules/CommonUtils.js index 44e47b9..3798951 100644 --- a/lib/modules/CommonUtils.js +++ b/lib/modules/CommonUtils.js @@ -1,6 +1,6 @@ 'use babel'; -import { groupBy, isArray, keys, values, find } from 'lodash'; +import { groupBy, keys, values, find } from 'lodash'; import { DB } from './Database'; import { Store } from './Store'; @@ -16,20 +16,30 @@ export class CommonUtils { }); } + static saveSharedStore() { + const sharedState = Store.getSharedState(); + + setTimeout(async () => { + try { + await DB.storeState(sharedState, true); + + } catch (err) { + Logger.log(err); + Logger.dbError(err); + } + }, 0); + } + static saveProjectStore() { const projectState = Store.getProjectState(); setTimeout(async () => { try { await DB.storeState(projectState); + } catch (err) { Logger.log(err); - let errors = localStorage.getItem('DeepCode:DB:Errors') || []; - if (!isArray(errors)) { - errors = []; - } - errors.unshift(`${new Date()}: ${err.message}`); - localStorage.setItem('DeepCode:DB:Errors', JSON.stringify(errors.slice(0, 10))); + Logger.dbError(err); } }, 0); } @@ -74,18 +84,23 @@ export class CommonUtils { // Others ----------------------------------------------------------------------------------------------------------- static getIndicators() { - const { table, origin } = Store.get(STORE_KEYS.analysisResults); - if (!isArray(table)) { - return { - info: 0, - warning: 0, - critical: 0, - total: 0, - files: 0, - }; + const defaultValue = { + info: 0, + warning: 0, + critical: 0, + total: 0, + files: 0, + }; + + const { origin } = Store.get(STORE_KEYS.analysisResults); + if (!origin) { + return defaultValue; } const { files, suggestions } = origin; + if (!files || !suggestions) { + return defaultValue; + } const filesCount = keys(files).length; const suggestionsList = values(suggestions); diff --git a/lib/modules/Database.js b/lib/modules/Database.js index 1af3052..5d85185 100644 --- a/lib/modules/Database.js +++ b/lib/modules/Database.js @@ -5,6 +5,7 @@ import { FileUtils } from './FileUtils'; import { Logger } from './Logger'; import { PLUGIN } from '../constants/common'; +import { STORE_KEYS } from '../constants/store'; const tName = 'projects'; @@ -53,12 +54,12 @@ class Database { return Promise.resolve(result); } - async storeState(state) { + async storeState(state, isShared = false) { if (!this.db) { return Promise.reject('DB is not running'); } - const path = FileUtils.getMainProjectPath(); + const path = isShared ? STORE_KEYS.state : FileUtils.getMainProjectPath(); if (!path) { Logger.log('No confirmed main project path. Storing project state failed'); return Promise.resolve(); @@ -79,12 +80,12 @@ class Database { }); } - async restoreState() { + async restoreState(isShared = false) { if (!this.db) { return Promise.reject('DB is not running'); } - const path = FileUtils.getMainProjectPath(); + const path = isShared ? STORE_KEYS.state : FileUtils.getMainProjectPath(); if (!path) { Logger.log('No confirmed main project path. Restoring project state failed'); return Promise.resolve({}); diff --git a/lib/modules/FileUtils.js b/lib/modules/FileUtils.js index fa93feb..e548292 100644 --- a/lib/modules/FileUtils.js +++ b/lib/modules/FileUtils.js @@ -29,6 +29,8 @@ class FileUtils { return []; } + this.projectPaths = projectPaths; + return projectPaths; } @@ -85,7 +87,9 @@ class FileUtils { getUnconfirmedProjectFolders() { const confirmedFolders = Store.get(STORE_KEYS.confirmedFolders); - return this.projectPaths.filter(projectFolder => !confirmedFolders.includes(projectFolder)); + const projectPaths = this.getProjectPaths(); + + return projectPaths.filter(projectFolder => !confirmedFolders.includes(projectFolder)); } isIgnored(filePath) { diff --git a/lib/modules/Logger.js b/lib/modules/Logger.js index 2e4280b..129c550 100644 --- a/lib/modules/Logger.js +++ b/lib/modules/Logger.js @@ -1,5 +1,6 @@ 'use babel'; +import { isArray } from 'lodash'; import { PLUGIN } from '../constants/common'; const format = (num) => (`0${num}`).slice(-2); @@ -25,4 +26,13 @@ export class Logger { // eslint-disable-next-line no-console console.log(time, ...args); } + + static dbError(err = {}) { + let errors = localStorage.getItem('DeepCode:DB:Errors') || []; + if (!isArray(errors)) { + errors = []; + } + errors.unshift(`${new Date()}: ${err.message}`); + localStorage.setItem('DeepCode:DB:Errors', JSON.stringify(errors.slice(0, 30))); + } } diff --git a/lib/modules/PluginManager.js b/lib/modules/PluginManager.js index a58e2d5..b9cf0f4 100644 --- a/lib/modules/PluginManager.js +++ b/lib/modules/PluginManager.js @@ -231,7 +231,7 @@ class PluginManager { } if (firstStart) { - atom.workspace.open(PLUGIN.problemsPanelURI); + // atom.workspace.open(PLUGIN.problemsPanelURI); Store.set(STORE_KEYS.firstStart, false); } }, 0); diff --git a/spec/deepcode-spec.js b/spec/deepcode-spec.js index d5d9f8e..89e2cf9 100644 --- a/spec/deepcode-spec.js +++ b/spec/deepcode-spec.js @@ -9,6 +9,7 @@ describe('Deepcode Plugin tests', () => { let workspaceElement; let activationPromise; let dcPackage; + let timerCallback; beforeEach(() => { workspaceElement = atom.views.getView(atom.workspace); @@ -23,6 +24,9 @@ describe('Deepcode Plugin tests', () => { return Promise.resolve(); } + + timerCallback = jasmine.createSpy('timerCallback'); + jasmine.Clock.useMock(); }); describe('Pre-test configuring', () => { @@ -62,24 +66,18 @@ describe('Deepcode Plugin tests', () => { }); it('fetched filters from server', () => { - dcPackage.setPluginState({ [STORE_KEYS.allowedFiles]: {}, }); - const checkFiltersPromise = new Promise(resolve => { + runs(() => { dcPackage.checkFilters(); + setTimeout(() => { - resolve(); - }, 100); + const state = dcPackage.getPluginState(); + expect(state[STORE_KEYS.allowedFiles]).toEqual(mockState[STORE_KEYS.allowedFiles]); + }, 1000); }); - - waitsForPromise(() => checkFiltersPromise); - - const state = dcPackage.getPluginState(); - console.log('deepcode-spec.js, [75]: ', { state }); - - expect(state[STORE_KEYS.allowedFiles]).toEqual(mockState[STORE_KEYS.allowedFiles]); }) }) });