Skip to content
Snippets Groups Projects
Commit b4568f07 authored by Dóra Kocsis's avatar Dóra Kocsis
Browse files

enforce use of jsonlab only when MATLAB < 9.1 and Unix end-of-line convention

parent a95329e1
Branches
No related tags found
No related merge requests found
Pipeline #3776 passed
......@@ -21,8 +21,7 @@ function initialize_mdbnomics()
mdbnomics_src_root = strrep(which('initialize_mdbnomics'), 'initialize_mdbnomics.m', '');
% Set the subfolders to be added in the path.
p = {'utils' ; ...
'/../contrib/jsonlab'};
p = {'utils'};
% Add missing routines if dynare is not in the path
if ~exist('OCTAVE_VERSION', 'builtin') || ~exist('contains','builtin')
......@@ -49,9 +48,14 @@ end
P = cellfun(@(c)[mdbnomics_src_root c], p, 'uni', false);
addpath(P{:});
% Check minimal MATLAB and Octave requirements.
% Check minimal MATLAB requirements.
if matlab_ver_less_than('8.5')
error('The minimum MATLAB requirement of this package is R2015a.');
end
% Add jsonlab if MATLAB version < R2016b
if matlab_ver_less_than('9.1')
addpath([mdbnomics_src_root '/../contrib/jsonlab']);
end
assignin('caller', 'mdbnomics_src_root', mdbnomics_src_root);
function series = flatten_editor_series(series, dbnomics_series)
% function flatten_editor_series(series, dbnomics_series)
% Adapts Time Series Editor series attributes to ease cell array construction.
%
% INPUTS
% series [struct] struct of the filtered series returned by the POST request
% dbnomics_series [struct] struct of the original series returned by the API request
%
% OUTPUTS
% series
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2020 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
series = normalize_period(series);
series = normalize_value(series);
series.x_frequency = series.frequency;
series = rmfield(series, 'frequency');
orig_fields = {'provider_code', 'dataset_code', 'dataset_name'};
for ii = 1:length(orig_fields)
series.(orig_fields{ii}) = dbnomics_series.(orig_fields{ii});
end
series.series_code = [dbnomics_series.series_code '_filtered'];
if isfield(dbnomics_series, 'series_name')
series.series_name = [dbnomics_series.series_name, ' (filtered)'];
end
series.filtered = true;
end
\ No newline at end of file
function series = flatten_editor_series(series, dbnomics_series)
% function flatten_editor_series(series, dbnomics_series)
% Adapts Time Series Editor series attributes to ease cell array construction.
%
% INPUTS
% series [struct] struct of the filtered series returned by the POST request
% dbnomics_series [struct] struct of the original series returned by the API request
%
% OUTPUTS
% series
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2020 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
series = normalize_period(series);
series = normalize_value(series);
series.x_frequency = series.frequency;
series = rmfield(series, 'frequency');
orig_fields = {'provider_code', 'dataset_code', 'dataset_name'};
for ii = 1:length(orig_fields)
series.(orig_fields{ii}) = dbnomics_series.(orig_fields{ii});
end
series.series_code = [dbnomics_series.series_code '_filtered'];
if isfield(dbnomics_series, 'series_name')
series.series_name = [dbnomics_series.series_name, ' (filtered)'];
end
series.filtered = true;
end
function filtered_series_list = iter_filtered_series(series_list, dbnomics_filters, apply_endpoint_url)
% function iter_filtered_series(series_list, dbnomics_filters, apply_endpoint_url)
% Adapts series to make POST request. Returns cell array of filtered series.
%
% INPUTS
% series_list [cell array] cell array of series previously requested
% dbnomics_filters [string] string array of filters to apply on series
% apply_endpoint_url [string] modified editor API link
%
% OUTPUTS
% filtered_series_list
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2020 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
editor_apply_endpoint_nb_series_per_post = 100;
opts = weboptions('ContentType','json', 'MediaType','application/json', 'RequestMethod','POST');
if size(series_list, 2) > editor_apply_endpoint_nb_series_per_post
grouped_series = mat2cell(series_list,1,repmat(editor_apply_endpoint_nb_series_per_post, size(series_list,1), size(series_list,2)));
else
grouped_series = {series_list};
end
for gg = 1:size(grouped_series, 2)
series_list = grouped_series{gg};
posted_series_list = cell(1,size(series_list,2));
series_fields = {'x_frequency', 'period_start_day', 'value'};
posted_series_fields = {'frequency', 'period_start_day', 'value'};
for series = 1:size(series_list, 2)
if ~iscell(series_list{series}.value)
series_list{series}.value = num2cell(series_list{series}.value);
end
for ii = 1:length(posted_series_fields)
posted_series.(posted_series_fields{ii}) = series_list{series}.(series_fields{ii});
end
posted_series_list{series} = posted_series;
end
if matlab_ver_less_than('9.8')
posted_series_list = savejson('',posted_series_list, 'Compact', 1);
posted_series_list = regexprep(posted_series_list,{' [[',']]'},{'[',']'});
else
posted_series_list = jsonencode(posted_series_list);
end
json_request = sprintf('{"filters":%s,"series":%s}', dbnomics_filters, posted_series_list);
try
response = webwrite(apply_endpoint_url, json_request, opts);
catch ME
error_message = ['Could not fetch data from URL: ' apply_endpoint_url ' because: ' ME.identifier];
if strcmp(ME.identifier, 'MATLAB:webservices:HTTP400StatusCodeError')
error_message = sprintf('%s.\nPlease revise your input for the filter.', error_message);
end
error(error_message);
end
filtered_series_list = cell(1,size(series_list,2));
for ii = 1:length(response.filter_results)
filtered_series = flatten_editor_series(response.filter_results(ii).series, series_list{ii});
filtered_series_list{ii} = filtered_series;
end
end
end
\ No newline at end of file
function filtered_series_list = iter_filtered_series(series_list, dbnomics_filters, apply_endpoint_url)
% function iter_filtered_series(series_list, dbnomics_filters, apply_endpoint_url)
% Adapts series to make POST request. Returns cell array of filtered series.
%
% INPUTS
% series_list [cell array] cell array of series previously requested
% dbnomics_filters [string] string array of filters to apply on series
% apply_endpoint_url [string] modified editor API link
%
% OUTPUTS
% filtered_series_list
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2020 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
editor_apply_endpoint_nb_series_per_post = 100;
opts = weboptions('ContentType','json', 'MediaType','application/json', 'RequestMethod','POST');
if size(series_list, 2) > editor_apply_endpoint_nb_series_per_post
grouped_series = mat2cell(series_list,1,repmat(editor_apply_endpoint_nb_series_per_post, size(series_list,1), size(series_list,2)));
else
grouped_series = {series_list};
end
for gg = 1:size(grouped_series, 2)
series_list = grouped_series{gg};
posted_series_list = cell(1,size(series_list,2));
series_fields = {'x_frequency', 'period_start_day', 'value'};
posted_series_fields = {'frequency', 'period_start_day', 'value'};
for series = 1:size(series_list, 2)
if ~iscell(series_list{series}.value)
series_list{series}.value = num2cell(series_list{series}.value);
end
for ii = 1:length(posted_series_fields)
posted_series.(posted_series_fields{ii}) = series_list{series}.(series_fields{ii});
end
posted_series_list{series} = posted_series;
end
if matlab_ver_less_than('9.1')
posted_series_list = savejson('',posted_series_list, 'Compact', 1);
posted_series_list = regexprep(posted_series_list,{' [[',']]'},{'[',']'});
else
posted_series_list = jsonencode(posted_series_list);
end
json_request = sprintf('{"filters":%s,"series":%s}', dbnomics_filters, posted_series_list);
try
response = webwrite(apply_endpoint_url, json_request, opts);
catch ME
error_message = ['Could not fetch data from URL: ' apply_endpoint_url ' because: ' ME.identifier];
if strcmp(ME.identifier, 'MATLAB:webservices:HTTP400StatusCodeError')
error_message = sprintf('%s.\nPlease revise your input for the filter.', error_message);
end
error(error_message);
end
filtered_series_list = cell(1,size(series_list,2));
for ii = 1:length(response.filter_results)
filtered_series = flatten_editor_series(response.filter_results(ii).series, series_list{ii});
filtered_series_list{ii} = filtered_series;
end
end
end
function runalltests()
% Copyright (C) 2020 Dynare Team
%
% This code is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare dseries submodule is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
mdbnomics_src_root = []; % Will be updated by calling initialize_dseries_class().
opath = path();
system('rm -f failed');
system('rm -f pass');
% Check that the m-unit-tests module is available.
try
initialize_unit_tests_toolbox;
catch
error('Missing dependency: m-unit-tests module is not available.')
end
% Get path to the current script
unit_tests_root = strrep(which('runalltests'),'runalltests.m','');
% Initialize the mdbnomics module
try
initialize_mdbnomics();
catch
addpath([unit_tests_root '../src']);
initialize_mdbnomics();
end
warning off
if isoctave()
if ~user_has_octave_forge_package('io')
error('Missing dependency: io package is not available.')
end
more off;
end
r = run_unitary_tests_in_directory(mdbnomics_src_root(1:end-1));
delete('*.log');
if any(~[r{:,3}])
system('touch failed');
else
system('touch pass');
end
warning on
path(opath);
display_report(r);
function runalltests()
% Copyright (C) 2020 Dynare Team
%
% This code is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare dseries submodule is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
mdbnomics_src_root = []; % Will be updated by calling initialize_dseries_class().
opath = path();
system('rm -f failed');
system('rm -f pass');
% Check that the m-unit-tests module is available.
try
initialize_unit_tests_toolbox;
catch
error('Missing dependency: m-unit-tests module is not available.')
end
% Get path to the current script
unit_tests_root = strrep(which('runalltests'),'runalltests.m','');
% Initialize the mdbnomics module
try
initialize_mdbnomics();
catch
addpath([unit_tests_root '../src']);
initialize_mdbnomics();
end
warning off
if isoctave()
if ~user_has_octave_forge_package('io')
error('Missing dependency: io package is not available.')
end
more off;
end
r = run_unitary_tests_in_directory(mdbnomics_src_root(1:end-1));
delete('*.log');
if any(~[r{:,3}])
system('touch failed');
else
system('touch pass');
end
warning on
path(opath);
display_report(r);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment