From f6e94801fa687ceb2e3857bd6843ecff76a8b19c Mon Sep 17 00:00:00 2001 From: Houtan Bastani <houtan@dynare.org> Date: Mon, 2 Sep 2019 16:25:13 +0200 Subject: [PATCH] add `directory` option to report class --- src/@graph/graph.m | 7 ++----- src/@graph/write.m | 19 ++++++++++--------- src/@graph/writeGraphFile.m | 24 ++++++++++++++---------- src/@page/page.m | 2 +- src/@page/write.m | 13 +++++++++---- src/@report/compile.m | 10 +++++++--- src/@report/report.m | 2 ++ src/@report/write.m | 7 +++++-- src/@report_table/report_table.m | 7 ++----- src/@report_table/write.m | 19 ++++++++++--------- src/@report_table/writeTableFile.m | 24 ++++++++++++++---------- src/@section/section.m | 2 +- src/@section/write.m | 7 ++++--- test/createReport.m | 4 ++-- 14 files changed, 83 insertions(+), 64 deletions(-) diff --git a/src/@graph/graph.m b/src/@graph/graph.m index 8170e27..4fd6dc9 100644 --- a/src/@graph/graph.m +++ b/src/@graph/graph.m @@ -203,18 +203,15 @@ classdef graph < handle end o.seriesToUse = ''; o.data = ''; - if ~exist(o.graphDirName, 'file') - mkdir(o.graphDirName); - end end end methods (Access = ?section, Hidden = true) o = addSeries(o, varargin) - write(o, fid, pg, sec, row, col) + write(o, fid, pg, sec, row, col, rep_dir) end methods (Access = private) % Methods defined in separate files lastIndex = end(o, k, n) - graphName = writeGraphFile(o, pg, sec, row, col) + graphName = writeGraphFile(o, pg, sec, row, col, rep_dir) end end diff --git a/src/@graph/write.m b/src/@graph/write.m index e00cd9a..4454a6c 100644 --- a/src/@graph/write.m +++ b/src/@graph/write.m @@ -1,14 +1,15 @@ -function write(o, fid, pg, sec, row, col) -%function write(o, fid, pg, sec, row, col) +function write(o, fid, pg, sec, row, col, rep_dir) +%function write(o, fid, pg, sec, row, col, rep_dir) % Write a Graph object % % INPUTS -% o [graph] graph object -% fid [integer] file id -% pg [integer] this page number -% sec [integer] this section number -% row [integer] this row number -% col [integer] this col number +% o [graph] graph object +% fid [integer] file id +% pg [integer] this page number +% sec [integer] this section number +% row [integer] this row number +% col [integer] this col number +% rep_dir [string] directory containing report.tex % % OUTPUTS % o [graph] graph object @@ -34,6 +35,6 @@ function write(o, fid, pg, sec, row, col) % along with Dynare. If not, see <http://www.gnu.org/licenses/>. assert(fid ~= -1); -graphName = writeGraphFile(o, pg, sec, row, col); +graphName = writeGraphFile(o, pg, sec, row, col, rep_dir); fprintf(fid, '\\input{%s}', graphName); end \ No newline at end of file diff --git a/src/@graph/writeGraphFile.m b/src/@graph/writeGraphFile.m index d8d0d84..a660ffe 100644 --- a/src/@graph/writeGraphFile.m +++ b/src/@graph/writeGraphFile.m @@ -1,13 +1,14 @@ -function graphName = writeGraphFile(o, pg, sec, row, col) -%function graphName = writeGraphFile(o, pg, sec, row, col) +function graphName = writeGraphFile(o, pg, sec, row, col, rep_dir) +%function graphName = writeGraphFile(o, pg, sec, row, col, rep_dir) % Write the tikz file that contains the graph % % INPUTS -% o [graph] graph object -% pg [integer] this page number -% sec [integer] this section number -% row [integer] this row number -% col [integer] this col number +% o [graph] graph object +% pg [integer] this page number +% sec [integer] this section number +% row [integer] this row number +% col [integer] this col number +% rep_dir [string] directory containing report.tex % % OUTPUTS % graphName [string] name of graph written @@ -38,13 +39,16 @@ if ne < 1 return end +if exist([rep_dir filesep o.graphDirName], 'file') ~= 7 + mkdir([rep_dir filesep o.graphDirName]) +end if isempty(o.graphName) - graphName = sprintf('%s/graph_pg%d_sec%d_row%d_col%d.tex', o.graphDirName, pg, sec, row, col); + graphName = sprintf([o.graphDirName filesep 'graph_pg%d_sec%d_row%d_col%d.tex'], pg, sec, row, col); else - graphName = [o.graphDirName '/' o.graphName]; + graphName = [o.graphDirName filesep o.graphName]; end -[fid, msg] = fopen(graphName, 'w'); +[fid, msg] = fopen([rep_dir filesep graphName], 'w'); if fid == -1 error(['@graph.writeGraphFile: ' msg]); end diff --git a/src/@page/page.m b/src/@page/page.m index 44635f4..9a7910c 100644 --- a/src/@page/page.m +++ b/src/@page/page.m @@ -117,7 +117,7 @@ classdef page < handle o = addSection(o, varargin) o = addVspace(o, varargin) o = addTable(o, varargin) - write(o, fid, pg) + write(o, fid, pg, rep_dir) lastIndex = end(o, k, n) ns = numSections(p) end diff --git a/src/@page/write.m b/src/@page/write.m index 274942e..1138521 100644 --- a/src/@page/write.m +++ b/src/@page/write.m @@ -1,11 +1,12 @@ -function write(o, fid, pg) -%function write(o, fid, pg) +function write(o, fid, pg, rep_dir) +%function write(o, fid, pg, rep_dir) % Write a Page object % % INPUTS % o [page] page object % fid [integer] file id % pg [integer] this page number +% rep_dir [string] directory containing report.tex % % OUTPUTS % o [page] page object @@ -46,7 +47,11 @@ if ~isempty(o.latex) if ~exist(o.pageDirName, 'dir') mkdir(o.pageDirName) end - pagename = [o.pageDirName '/page_' num2str(pg) '.tex']; + dir = [rep_dir filesep o.pageDirName]; + if exist(dir, 'file') ~= 7 + mkdir(dir) + end + pagename = [dir filesep 'page_' num2str(pg) '.tex']; [fidp, msg] = fopen(pagename, 'w'); if fidp == -1 error(['@page.write: ' msg]); @@ -68,7 +73,7 @@ else end for i = 1:length(o.sections) - o.sections{i}.write(fid, pg, i); + o.sections{i}.write(fid, pg, i, rep_dir); end fprintf(fid, '\\end{tabular}\n'); end diff --git a/src/@report/compile.m b/src/@report/compile.m index 106e80c..6ad6e98 100644 --- a/src/@report/compile.m +++ b/src/@report/compile.m @@ -13,7 +13,7 @@ function o = compile(o, varargin) % SPECIAL REQUIREMENTS % none -% Copyright (C) 2013-2017 Dynare Team +% Copyright (C) 2013-2019 Dynare Team % % This file is part of Dynare. % @@ -57,7 +57,7 @@ assert(ischar(opts.compiler), '@report.compile: compiler file must be a string') assert(islogical(opts.showReport), '@report.compile: showReport must be either true or false'); assert(islogical(opts.showOutput), '@report.compile: showOutput must be either true or false'); -if ~exist(o.fileName, 'file') +if exist([o.directory filesep o.fileName], 'file') ~= 2 o.write(); end @@ -90,6 +90,8 @@ if isempty(opts.compiler) end end +orig_dir = pwd; +cd(o.directory) options = '-synctex=1 -halt-on-error'; if opts.showOutput if isoctave @@ -104,6 +106,7 @@ end [~, rfn, ~] = fileparts(o.fileName); if status ~= 0 + cd(orig_dir) error(['@report.compile: There was an error in compiling ' rfn '.pdf.' ... ' ' opts.compiler ' returned the error code: ' num2str(status)]); end @@ -115,6 +118,7 @@ if o.showOutput || opts.showOutput disp(''); end if opts.showReport && ~isoctave - open([pwd filesep rfn '.pdf']); + open([rfn '.pdf']); end +cd(orig_dir) end diff --git a/src/@report/report.m b/src/@report/report.m index 7cac59d..fdbf65c 100644 --- a/src/@report/report.m +++ b/src/@report/report.m @@ -21,6 +21,7 @@ classdef report < handle pages = {} end properties (SetAccess = private) + directory = '.' % Directory in which to write/compile the report. Default: '.' title = '' % Report Title. Default: none. orientation = 'portrait' % Paper orientation: Default: `portrait'. paper = 'a4' % Paper size. Default: `a4'. @@ -77,6 +78,7 @@ classdef report < handle end % Check options provided by user + assert(ischar(o.directory), '@report.report: directory must be a string'); assert(ischar(o.title), '@report.report: title must be a string'); assert(ischar(o.fileName), '@report.report: fileName must be a string'); assert(ischar(o.compiler), '@report.report: compiler file must be a string'); diff --git a/src/@report/write.m b/src/@report/write.m index 063f8ee..c4958e7 100644 --- a/src/@report/write.m +++ b/src/@report/write.m @@ -28,7 +28,10 @@ function o = write(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <http://www.gnu.org/licenses/>. -[fid, msg] = fopen(o.fileName, 'w'); +if exist(o.directory, 'file') ~= 7 + mkdir(o.directory) +end +[fid, msg] = fopen([o.directory filesep o.fileName], 'w'); if fid == -1 error(['@report.write: ' msg]); end @@ -88,7 +91,7 @@ for i = 1:length(o.pages) if o.showOutput fprintf(1, 'Writing Page: %d\n', i); end - o.pages{i}.write(fid, i); + o.pages{i}.write(fid, i, o.directory); end fprintf(fid, '\\end{document}\n'); diff --git a/src/@report_table/report_table.m b/src/@report_table/report_table.m index 0855011..8a44e98 100644 --- a/src/@report_table/report_table.m +++ b/src/@report_table/report_table.m @@ -148,18 +148,15 @@ classdef report_table < handle end o.data = ''; o.seriesToUse = ''; - if ~exist(o.tableDirName, 'file') - mkdir(o.tableDirName); - end end end methods (Access = ?section, Hidden = true) o = addData(o, varargin) o = addSeries(o, varargin) - write(o, fid, pg, sec, row, col) + write(o, fid, pg, sec, row, col, rep_dir) end methods (Access = private) - o = writeTableFile(o, pg, sec, row, col) + o = writeTableFile(o, pg, sec, row, col, rep_dir) end end diff --git a/src/@report_table/write.m b/src/@report_table/write.m index 2e51b75..9b5315a 100644 --- a/src/@report_table/write.m +++ b/src/@report_table/write.m @@ -1,14 +1,15 @@ -function write(o, fid, pg, sec, row, col) -%function write(o, fid, pg, sec, row, col) +function write(o, fid, pg, sec, row, col, rep_dir) +%function write(o, fid, pg, sec, row, col, rep_dir) % Write a Table object % % INPUTS -% o [table] table object -% fid [integer] file id -% pg [integer] this page number -% sec [integer] this section number -% row [integer] this row number -% col [integer] this col number +% o [table] table object +% fid [integer] file id +% pg [integer] this page number +% sec [integer] this section number +% row [integer] this row number +% col [integer] this col number +% rep_dir [string] directory containing report.tex % % OUTPUTS % o [table] table object @@ -34,6 +35,6 @@ function write(o, fid, pg, sec, row, col) % along with Dynare. If not, see <http://www.gnu.org/licenses/>. assert(fid ~= -1); -tableName = writeTableFile(o, pg, sec, row, col); +tableName = writeTableFile(o, pg, sec, row, col, rep_dir); fprintf(fid, '\\input{%s}', tableName); end diff --git a/src/@report_table/writeTableFile.m b/src/@report_table/writeTableFile.m index 93780a5..695b26c 100644 --- a/src/@report_table/writeTableFile.m +++ b/src/@report_table/writeTableFile.m @@ -1,13 +1,14 @@ -function tableName = writeTableFile(o, pg, sec, row, col) -%function tableName = writeTableFile(o, pg, sec, row, col) +function tableName = writeTableFile(o, pg, sec, row, col, rep_dir) +%function tableName = writeTableFile(o, pg, sec, row, col, rep_dir) % Write a Report_Table object % % INPUTS -% o [report_table] report_table object -% pg [integer] this page number -% sec [integer] this section number -% row [integer] this row number -% col [integer] this col number +% o [report_table] report_table object +% pg [integer] this page number +% sec [integer] this section number +% row [integer] this row number +% col [integer] this col number +% rep_dir [string] directory containing report.tex % % OUTPUTS % tableName [string] name of table written @@ -39,13 +40,16 @@ if ne == 0 && ~is_data_table return end +if exist([rep_dir filesep o.tableDirName], 'file') ~= 7 + mkdir([rep_dir filesep o.tableDirName]) +end if isempty(o.tableName) - tableName = sprintf('%s/table_pg%d_sec%d_row%d_col%d.tex', o.tableDirName, pg, sec, row, col); + tableName = sprintf([o.tableDirName filesep 'table_pg%d_sec%d_row%d_col%d.tex'], pg, sec, row, col); else - tableName = [o.tableDirName '/' o.tableName]; + tableName = [o.tableDirName filesep o.tableName]; end -[fid, msg] = fopen(tableName, 'w'); +[fid, msg] = fopen([rep_dir filesep tableName], 'w'); if fid == -1 error(['@report_table.writeTableFile: ' msg]); end diff --git a/src/@section/section.m b/src/@section/section.m index 59ba9f1..10edefb 100644 --- a/src/@section/section.m +++ b/src/@section/section.m @@ -81,6 +81,6 @@ classdef section < handle o = addVspace(o, varargin) lastIndex = end(o, k, n) n = numElements(o) - write(o, fid, pg, sec) + write(o, fid, pg, sec, rep_dir) end end diff --git a/src/@section/write.m b/src/@section/write.m index b250997..aec369b 100644 --- a/src/@section/write.m +++ b/src/@section/write.m @@ -1,5 +1,5 @@ -function write(o, fid, pg, sec) -%function write(o, fid, pg, sec) +function write(o, fid, pg, sec, rep_dir) +%function write(o, fid, pg, sec, rep_dir) % Write Section object % % INPUTS @@ -7,6 +7,7 @@ function write(o, fid, pg, sec) % fid [integer] file id % pg [integer] this page number % sec [integer] this section number +% rep_dir [string] directory containing report.tex % % OUTPUTS % o [section] section object @@ -77,7 +78,7 @@ for i=1:ne if isa(o.elements{i}, 'paragraph') o.elements{i}.write(fid); else - o.elements{i}.write(fid, pg, sec, row, col); + o.elements{i}.write(fid, pg, sec, row, col, rep_dir); end if col ~= o.cols fprintf(fid, ' & '); diff --git a/test/createReport.m b/test/createReport.m index 930e491..64630c8 100644 --- a/test/createReport.m +++ b/test/createReport.m @@ -34,7 +34,7 @@ longNames = {'Coca Cola', 'Kinder Bueno', 'Pizza', ... 'Vegetarianism Is Good', 'OS X', 'Dothraki'}; %% Begin Report -rep = report(); +rep = report('directory', 'my/report/dir'); %% Page 1: GDP @@ -107,7 +107,7 @@ rep.addVspace('number', 2); % Table 2 rep.addTable('title', 'Output Gap', 'range', larange, ... - 'vlineAfter', dates('2011y')); + 'vlineAfter', dates('2011y'), 'tableDirName', 'page4table2'); db_a = db_a.tex_rename('Y_WORLD', 'World'); rep.addSeries('data', db_a{'Y_WORLD'}); delta = db_a{'Y_WORLD'}-dc_a{'Y_WORLD'}; -- GitLab