diff m-toolbox/classes/+utils/@models/makeBuiltInModel.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@models/makeBuiltInModel.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,174 @@
+% MAKEBUILTINMODEL prepares a new built-in model template
+%
+% DESCRIPTION:  This utility creates a new built-in model file according to
+% the standard template. It also creates a unit-test directory inheriting
+% the standard built-in model tests. The tests are run at the end of the
+% creation process.
+% 
+% 
+% CALL:
+%            utils.models.makeBuiltInModel(extension_dir, class, name)
+% 
+% INPUTS:
+%       extension_dir - the directory where the extension module resides
+%               class - the LTPDA user-object class that this model belongs
+%                       to. 
+%                name - the name of the new model
+% 
+% If you are making a new model in an existing extension module, then a
+% typical call would be:
+% 
+% utils.models.makeBuiltInModel('path/to/extension', ...
+%                               'ao', ...
+%                               'myNewModel');
+% 
+% 
+% VERSION: $Id: makeBuiltInModel.m,v 1.4 2011/05/16 06:55:51 hewitson Exp $
+% 
+
+function makeBuiltInModel(varargin)
+  
+  if nargin ~= 3
+    help('utils.models.makeBuiltInModel')
+    error('Incorrect inputs');
+  end
+  
+  extDir  = varargin{1};
+  mclass  = varargin{2};
+  mname   = varargin{3};
+  
+  % check mclass is one of the known LTPDA uo classes
+  if ~utils.helper.isSubclassOf(mclass, 'ltpda_uo')
+    error('The specified class must be an LTPDA user-object subclass (i.e. a subclass of ltpda_uo).');
+  end
+  
+  % remove bad characters from the model name
+  mname = genvarname(mname);
+  
+  % read the template file
+  lines = readModelTemplateFile(mclass, mname);
+  
+  % write the lines back out to the destination file
+  fullmname = [mclass '_model_' mname];
+  mdlfile = [fullmname '.m'];
+  dstDir  = fullfile(extDir, 'models', mclass);
+  dstFile = fullfile(dstDir, mdlfile);
+  fprintf('+ Writing model file %s...\n', dstFile);
+  % Check if the destination file for the new model exists
+  if exist(dstFile, 'file') == 2
+    r = input(sprintf('A file exists at the chosen location (%s). \nDo you want to overwrite it? (yes/no) ', dstFile), 's');
+    if ~strcmpi(r, 'yes')
+      return;
+    end
+  end
+  [success,message,messageid] = mkdir(dstDir);
+  if ~success
+    error('Failed to create model directory %s [%s]', dstDir, message);
+  end
+  addpath(dstDir);
+  savepath;
+  writeFile(dstFile, lines);
+  
+  % read test-class template file
+  lines = readTestClassTemplateFile(mclass, mname);
+  
+  % write test class
+  testClass = ['@test_' fullmname];
+  testName = ['test_' fullmname];
+  testConstructor = [testName '.m'];
+  testClassPath = fullfile(extDir, 'tests', 'models', mclass);
+  testClassDir = fullfile(testClassPath, testClass);
+  [success,message,messageid] = mkdir(testClassDir);
+  if ~success
+    error('Failed to create unit-test directory %s [%s]', testClassDir, message);
+  end
+  addpath(testClassPath);
+  savepath;
+  
+  testClassFilePath = fullfile(testClassDir, testConstructor);  
+  fprintf('+ Writing model test-class constructor file %s...\n', testClassFilePath);
+  % Check if the destination test class file for the new model exists
+  if exist(testClassFilePath, 'file') == 2
+    r = input(sprintf('A file exists at the chosen location (%s). \nDo you want to overwrite it? (yes/no) ', testClassFilePath), 's');
+    if ~strcmpi(r, 'yes')
+      return;
+    end
+  end
+  writeFile(testClassFilePath, lines);
+  
+  runner = ltpda_test_runner();
+  runner.run_tests(testName)
+  
+  if all([runner.results.passed])
+    fprintf('** successfully created model %s and test class %s\n', mname, testName);
+    fprintf('** All tests passed. You can now edit your new model file.\n');
+  else
+    fprintf(2, 'Created model file %s\n', dstFile);
+    fprintf(2, 'Created model test class at %s\n', testClassFilePath);
+    fprintf(2, 'One or more tests failed. Please review the written files.\n');
+  end
+  
+  edit(dstFile);  
+  
+end
+
+function writeFile(filename, lines)
+  fd = fopen(filename, 'w+');
+  if fd < 0
+    error('Could not open destination file for writing: %s', filename);
+  end
+  
+  for kk=1:numel(lines)
+    l = lines{kk};
+    fprintf(fd, '%s\n', l);
+  end
+  
+  fclose(fd);
+  
+  fprintf('   - wrote model file %s\n', filename);
+end
+
+function lines = readTestClassTemplateFile(mclass, mname)
+  
+  path = fileparts(which('utils.models.makeBuiltInModel'));
+  templateFile = fullfile(path, 'built_in_model_unittest_template.m');
+  lines = readFile(templateFile, mclass, mname);
+
+end
+
+
+function lines = readModelTemplateFile(mclass, mname)
+  
+  path = fileparts(which('utils.models.makeBuiltInModel'));
+  templateFile = fullfile(path, 'built_in_model_template.m');
+  lines = readFile(templateFile, mclass, mname);
+
+end
+
+function lines = readFile(filename, mclass, mname)
+  fd = fopen(filename, 'r');
+  if fd < 0
+    error('Failed to read template file %s', filename);
+  end
+  
+  lines = {};
+  while ~feof(fd)
+    l = makeSubstitutions(fgetl(fd), mclass, mname);
+    lines = [lines {l}];
+  end
+  
+  % close file
+  fclose(fd);
+end
+
+
+function s = makeSubstitutions(s, mclass, mname)
+  
+  s = strrep(s, '<CLASS>', mclass);
+  s = strrep(s, '<NAME>', mname);
+  
+  
+end
+
+% END
+