From f03b2df46164c71f68eac4d900363a253b1b8e69 Mon Sep 17 00:00:00 2001 From: Daniel Felder Date: Sun, 1 Jun 2014 16:43:52 +0200 Subject: [PATCH 1/4] compile current file if top level document #42 --- .../app/coffee/Features/Compile/ClsiManager.coffee | 11 ++++++++--- .../coffee/Features/Compile/CompileController.coffee | 4 +++- .../app/coffee/Features/Compile/CompileManager.coffee | 2 +- services/web/public/coffee/pdf/CompiledView.coffee | 7 ++++++- services/web/public/coffee/pdf/PdfManager.coffee | 9 ++++++--- 5 files changed, 24 insertions(+), 9 deletions(-) mode change 100644 => 100755 services/web/app/coffee/Features/Compile/ClsiManager.coffee mode change 100644 => 100755 services/web/app/coffee/Features/Compile/CompileController.coffee mode change 100644 => 100755 services/web/app/coffee/Features/Compile/CompileManager.coffee mode change 100644 => 100755 services/web/public/coffee/pdf/CompiledView.coffee diff --git a/services/web/app/coffee/Features/Compile/ClsiManager.coffee b/services/web/app/coffee/Features/Compile/ClsiManager.coffee old mode 100644 new mode 100755 index b7930f5cf3..639511154e --- a/services/web/app/coffee/Features/Compile/ClsiManager.coffee +++ b/services/web/app/coffee/Features/Compile/ClsiManager.coffee @@ -8,8 +8,8 @@ logger = require "logger-sharelatex" url = require("url") module.exports = ClsiManager = - sendRequest: (project_id, callback = (error, success) ->) -> - ClsiManager._buildRequest project_id, (error, req) -> + sendRequest: (project_id, settingsOverride = {}, callback = (error, success) ->) -> + ClsiManager._buildRequest project_id, settingsOverride, (error, req) -> return callback(error) if error? logger.log project_id: project_id, "sending compile to CLSI" ClsiManager._postToClsi project_id, req, (error, response) -> @@ -52,7 +52,7 @@ module.exports = ClsiManager = return outputFiles VALID_COMPILERS: ["pdflatex", "latex", "xelatex", "lualatex"] - _buildRequest: (project_id, callback = (error, request) ->) -> + _buildRequest: (project_id, settingsOverride={}, callback = (error, request) ->) -> Project.findById project_id, {compiler: 1, rootDoc_id: 1}, (error, project) -> return callback(error) if error? return callback(new Errors.NotFoundError("project does not exist: #{project_id}")) if !project? @@ -67,6 +67,7 @@ module.exports = ClsiManager = resources = [] rootResourcePath = null + rootResourcePathOverride = null for path, doc of docs path = path.replace(/^\//, "") # Remove leading / @@ -75,6 +76,10 @@ module.exports = ClsiManager = content: doc.lines.join("\n") if project.rootDoc_id? and doc._id.toString() == project.rootDoc_id.toString() rootResourcePath = path + if settingsOverride.rootDoc_id? and doc._id.toString() == settingsOverride.rootDoc_id.toString() + rootResourcePathOverride = path + + rootResourcePath = rootResourcePathOverride if rootResourcePathOverride? for path, file of files path = path.replace(/^\//, "") # Remove leading / diff --git a/services/web/app/coffee/Features/Compile/CompileController.coffee b/services/web/app/coffee/Features/Compile/CompileController.coffee old mode 100644 new mode 100755 index aa4fab9e30..c1071c32cd --- a/services/web/app/coffee/Features/Compile/CompileController.coffee +++ b/services/web/app/coffee/Features/Compile/CompileController.coffee @@ -11,9 +11,11 @@ module.exports = CompileController = compile: (req, res, next = (error) ->) -> project_id = req.params.Project_id isAutoCompile = !!req.query?.auto_compile + settingsOverride = req.body.settingsOverride ? {}; + logger.log "root doc overriden" if settingsOverride.rootDoc_id? AuthenticationController.getLoggedInUserId req, (error, user_id) -> return next(error) if error? - CompileManager.compile project_id, user_id, { isAutoCompile }, (error, status, outputFiles) -> + CompileManager.compile project_id, user_id, { isAutoCompile, settingsOverride }, (error, status, outputFiles) -> return next(error) if error? res.contentType("application/json") res.send 200, JSON.stringify { diff --git a/services/web/app/coffee/Features/Compile/CompileManager.coffee b/services/web/app/coffee/Features/Compile/CompileManager.coffee old mode 100644 new mode 100755 index a0b242e95f..92480917ad --- a/services/web/app/coffee/Features/Compile/CompileManager.coffee +++ b/services/web/app/coffee/Features/Compile/CompileManager.coffee @@ -30,7 +30,7 @@ module.exports = CompileManager = return callback(error) if error? DocumentUpdaterHandler.flushProjectToMongo project_id, (error) -> return callback(error) if error? - ClsiManager.sendRequest project_id, (error, status, outputFiles) -> + ClsiManager.sendRequest project_id, opt.settingsOverride, (error, status, outputFiles) -> return callback(error) if error? logger.log files: outputFiles, "output files" callback(null, status, outputFiles) diff --git a/services/web/public/coffee/pdf/CompiledView.coffee b/services/web/public/coffee/pdf/CompiledView.coffee old mode 100644 new mode 100755 index 4f12007379..74afc1e11b --- a/services/web/public/coffee/pdf/CompiledView.coffee +++ b/services/web/public/coffee/pdf/CompiledView.coffee @@ -204,7 +204,12 @@ define [ recompilePdf: () -> @options.manager.trigger "compile:pdf" - @options.manager.refreshPdf() + rootDocOverride_id = null + for line in @ide.editor.getLines() + match = line.match /(.*)\\documentclass/ + if match and !match[1].match /%/ + rootDocOverride_id = @ide.editor.getCurrentDocId() + @options.manager.refreshPdf {rootDocOverride_id} toggleFlatViewButton: () -> @$("#flatViewButton").button("toggle") toggleSplitViewButton: () -> @$("#splitViewButton").button("toggle") diff --git a/services/web/public/coffee/pdf/PdfManager.coffee b/services/web/public/coffee/pdf/PdfManager.coffee index 04bb682bf9..d988797904 100644 --- a/services/web/public/coffee/pdf/PdfManager.coffee +++ b/services/web/public/coffee/pdf/PdfManager.coffee @@ -143,7 +143,7 @@ define [ @view.onCompiling() @syncButtonsView?.hide() @compiling = true - @_doCompile opts.isAutoCompile, (error, status, outputFiles) => + @_doCompile opts, (error, status, outputFiles) => @compiling = false doneCompiling() @@ -172,16 +172,19 @@ define [ if outputFiles? @view.showOutputFileDownloadLinks(outputFiles) - _doCompile: (isAutoCompile, callback = (error, status, outputFiles) ->) -> + _doCompile: (opts, callback = (error, status, outputFiles) ->) -> url = "/project/#{@ide.project_id}/compile" - if isAutoCompile + if opts.isAutoCompile url += "?auto_compile=true" $.ajax( url: url type: "POST" headers: "X-CSRF-Token": window.csrfToken + contentType: "application/json; charset=utf-8" dataType: 'json' + data: JSON.stringify settingsOverride: + rootDoc_id: opts.rootDocOverride_id ? null success: (body, status, response) -> callback null, body.status, body.outputFiles error: (error) -> From 5ad0ca08f914a40d8cea158330ce64f9fe171082 Mon Sep 17 00:00:00 2001 From: Daniel Felder Date: Sun, 1 Jun 2014 18:16:05 +0200 Subject: [PATCH 2/4] adjusting unit tests --- .../coffee/Features/Compile/CompileController.coffee | 2 +- .../coffee/Features/Compile/CompileManager.coffee | 2 +- .../UnitTests/coffee/Compile/ClsiManagerTests.coffee | 12 ++++++------ .../coffee/Compile/CompileManagerTests.coffee | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/web/app/coffee/Features/Compile/CompileController.coffee b/services/web/app/coffee/Features/Compile/CompileController.coffee index c1071c32cd..0d919fbd75 100755 --- a/services/web/app/coffee/Features/Compile/CompileController.coffee +++ b/services/web/app/coffee/Features/Compile/CompileController.coffee @@ -11,7 +11,7 @@ module.exports = CompileController = compile: (req, res, next = (error) ->) -> project_id = req.params.Project_id isAutoCompile = !!req.query?.auto_compile - settingsOverride = req.body.settingsOverride ? {}; + settingsOverride = req.body?.settingsOverride ? {}; logger.log "root doc overriden" if settingsOverride.rootDoc_id? AuthenticationController.getLoggedInUserId req, (error, user_id) -> return next(error) if error? diff --git a/services/web/app/coffee/Features/Compile/CompileManager.coffee b/services/web/app/coffee/Features/Compile/CompileManager.coffee index 92480917ad..a245fff101 100755 --- a/services/web/app/coffee/Features/Compile/CompileManager.coffee +++ b/services/web/app/coffee/Features/Compile/CompileManager.coffee @@ -30,7 +30,7 @@ module.exports = CompileManager = return callback(error) if error? DocumentUpdaterHandler.flushProjectToMongo project_id, (error) -> return callback(error) if error? - ClsiManager.sendRequest project_id, opt.settingsOverride, (error, status, outputFiles) -> + ClsiManager.sendRequest project_id, opt.settingsOverride ? null, (error, status, outputFiles) -> return callback(error) if error? logger.log files: outputFiles, "output files" callback(null, status, outputFiles) diff --git a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee index 6791443c9a..236a483214 100644 --- a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee @@ -24,7 +24,7 @@ describe "ClsiManager", -> describe "sendRequest", -> beforeEach -> - @ClsiManager._buildRequest = sinon.stub().callsArgWith(1, null, @request = "mock-request") + @ClsiManager._buildRequest = sinon.stub().callsArgWith(2, null, @request = "mock-request") describe "with a successful compile", -> beforeEach -> @@ -39,7 +39,7 @@ describe "ClsiManager", -> type: "log" }] }) - @ClsiManager.sendRequest @project_id, @callback + @ClsiManager.sendRequest @project_id, {}, @callback it "should build the request", -> @ClsiManager._buildRequest @@ -67,7 +67,7 @@ describe "ClsiManager", -> compile: status: @status = "failure" }) - @ClsiManager.sendRequest @project_id, @callback + @ClsiManager.sendRequest @project_id, {}, @callback it "should call the callback with a failure statue", -> @callback.calledWith(null, @status).should.equal true @@ -121,7 +121,7 @@ describe "ClsiManager", -> describe "with a valid project", -> beforeEach (done) -> - @ClsiManager._buildRequest @project_id, (error, request) => + @ClsiManager._buildRequest @project_id, null, (error, request) => @request = request done() @@ -162,7 +162,7 @@ describe "ClsiManager", -> describe "when the project has an invalid compiler", -> beforeEach (done) -> @project.compiler = "context" - @ClsiManager._buildRequest @project, (error, request) => + @ClsiManager._buildRequest @project, null, (error, request) => @request = request done() @@ -172,7 +172,7 @@ describe "ClsiManager", -> describe "when there is no valid root document", -> beforeEach (done) -> @project.rootDoc_id = "not-valid" - @ClsiManager._buildRequest @project, (@error, @request) => + @ClsiManager._buildRequest @project, null, (@error, @request) => done() it "should return an error", -> diff --git a/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee index f1b963a8c5..c284341bf2 100644 --- a/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/CompileManagerTests.coffee @@ -36,7 +36,7 @@ describe "CompileManager", -> @CompileManager._checkIfRecentlyCompiled = sinon.stub().callsArgWith(2, null, false) @CompileManager._ensureRootDocumentIsSet = sinon.stub().callsArgWith(1, null) @DocumentUpdaterHandler.flushProjectToMongo = sinon.stub().callsArgWith(1, null) - @ClsiManager.sendRequest = sinon.stub().callsArgWith(1, null, @status = "mock-status") + @ClsiManager.sendRequest = sinon.stub().callsArgWith(2, null, @status = "mock-status") describe "succesfully", -> beforeEach -> From 4320b790bd2f2e8c8834d766d635ed964b525afc Mon Sep 17 00:00:00 2001 From: Daniel Felder Date: Sun, 1 Jun 2014 19:26:33 +0200 Subject: [PATCH 3/4] adjusting unit tests --- .../web/app/coffee/Features/Compile/CompileManager.coffee | 4 ++-- .../UnitTests/coffee/Compile/CompileControllerTests.coffee | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/web/app/coffee/Features/Compile/CompileManager.coffee b/services/web/app/coffee/Features/Compile/CompileManager.coffee index a245fff101..972b7d3286 100755 --- a/services/web/app/coffee/Features/Compile/CompileManager.coffee +++ b/services/web/app/coffee/Features/Compile/CompileManager.coffee @@ -25,12 +25,12 @@ module.exports = CompileManager = return callback(error) if error? if recentlyCompiled return callback new Error("project was recently compiled so not continuing") - + CompileManager._ensureRootDocumentIsSet project_id, (error) -> return callback(error) if error? DocumentUpdaterHandler.flushProjectToMongo project_id, (error) -> return callback(error) if error? - ClsiManager.sendRequest project_id, opt.settingsOverride ? null, (error, status, outputFiles) -> + ClsiManager.sendRequest project_id, opt.settingsOverride, (error, status, outputFiles) -> return callback(error) if error? logger.log files: outputFiles, "output files" callback(null, status, outputFiles) diff --git a/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee b/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee index 0820c0431c..fe456995ad 100644 --- a/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee @@ -44,7 +44,7 @@ describe "CompileController", -> it "should do the compile without the auto compile flag", -> @CompileManager.compile - .calledWith(@project_id, @user_id, { isAutoCompile: false }) + .calledWith(@project_id, @user_id, { isAutoCompile: false, settingsOverride:{} }) .should.equal true it "should set the content-type of the response to application/json", -> @@ -71,7 +71,7 @@ describe "CompileController", -> it "should do the compile with the auto compile flag", -> @CompileManager.compile - .calledWith(@project_id, @user_id, { isAutoCompile: true }) + .calledWith(@project_id, @user_id, { isAutoCompile: true, settingsOverride:{} }) .should.equal true describe "downloadPdf", -> From 66dcb376a4ec78bfb7a2c25236066effcf4970b9 Mon Sep 17 00:00:00 2001 From: Daniel Felder Date: Sun, 1 Jun 2014 22:28:19 +0200 Subject: [PATCH 4/4] added unit tests --- .../coffee/Compile/ClsiManagerTests.coffee | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee index 236a483214..6915529b95 100644 --- a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee @@ -159,6 +159,28 @@ describe "ClsiManager", -> }] ) + + describe "when root doc override is valid", -> + beforeEach (done) -> + @ClsiManager._buildRequest @project_id, {rootDoc_id:"mock-doc-id-2"}, (error, request) => + @request = request + done() + + it "should change root path", -> + @request.compile.rootResourcePath.should.equal "chapters/chapter1.tex" + + + describe "when root doc override is invalid", -> + beforeEach (done) -> + @ClsiManager._buildRequest @project_id, {rootDoc_id:"invalid-id"}, (error, request) => + @request = request + done() + + it "should fallback to default root doc", -> + @request.compile.rootResourcePath.should.equal "main.tex" + + + describe "when the project has an invalid compiler", -> beforeEach (done) -> @project.compiler = "context"