def load_project(self, projdir): ''' Activate the project in the specified directory; instantiate a file manager and projdirfactory. ''' _clear_insts() self.cleanup() try: # Start a new log file. logging.getLogger().handlers[0].doRollover() self.files = FileManager('files', path=projdir, publish_updates=self.publish_updates) self.projdirfactory = ProjDirFactory(projdir, observer=self.files.observer) register_class_factory(self.projdirfactory) self.proj = Project(projdir) repo = get_repo(projdir) if repo is None: find_vcs()[0](projdir).init_repo() self.proj.activate() except Exception as err: self._error(err, sys.exc_info())
def test_project_export_import(self): proj = Project(os.path.join(self.tdir, 'proj1')) self.assertEqual(proj.config.items('info'), [('version', '0'), ('description', '')]) new_info = [('version', 'stinky'), ('description', 'Frobozz rulz!')] proj.set_info(dict(new_info)) proj.activate() self._fill_project(proj) proj.export(destdir=self.tdir) proj.deactivate() newproj = project_from_archive(os.path.join(self.tdir, 'proj1%s' % PROJ_FILE_EXT), proj_name='proj2', dest_dir=self.tdir) self.assertEqual(newproj.path, os.path.join(self.tdir, 'proj2')) self.assertEqual(newproj.config.items('info'), new_info) try: newproj = project_from_archive(os.path.join( self.tdir, 'proj1%s' % PROJ_FILE_EXT), dest_dir=self.tdir) except Exception, err: self.assertTrue(str(err).endswith(' already exists'))
def post(self, project_id): forms = {} for field in ['projectname', 'description', 'version']: if field in self.request.arguments.keys(): forms[field] = self.request.arguments[field][0] pdb = Projects() # Existing project. if int(project_id) != pdb.predict_next_rowid(): project = pdb.get(project_id) project_is_new = False # New project else: project = {} project['active'] = 0 project['projpath'] = None project_is_new = True if 'projectname' not in forms or \ len(forms['projectname']) == 0: project['projectname'] = "Unnamed Project" else: project['projectname'] = forms['projectname'].strip() if 'description' in forms: project['description'] = forms['description'].strip() else: project['description'] = '' if 'version' in forms: project['version'] = forms['version'].strip() else: project['version'] = '' # if there's no proj dir yet, create an empty one if not project['projpath']: directory = self.get_project_dir() pname = project['projectname'] project['projpath'] = _get_unique_name(directory, pname) if project_is_new: pdb.new(project) os.mkdir(project['projpath']) else: for key, value in project.iteritems(): pdb.set(project_id, key, value) pdb.modified(project_id) # Update project settings. proj = Project(project['projpath']) dummy = proj.get_info() # Just to get required keys. info = {} for key in dummy: info[key] = project[key] proj.set_info(info) self.redirect("/workspace/project?projpath=" + project['projpath'])
def test_using(self): proj = Project('a_proj') self._fill_project(proj.top) proj.top.run() self.assertEqual(proj.top.comp1.rval_out, 10.) self.assertEqual(proj.top.comp2.rval_out, 40.) proj.top.comp1.rval_in = 0.5 os.chdir(self.tdir) proj.export(projname='fooproj') fooproj = project_from_archive('fooproj.proj') self.assertEqual(fooproj.top.comp1.rval_in, proj.top.comp1.rval_in) fooproj.top.run() self.assertEqual(fooproj.top.comp1.rval_out, 1.) self.assertEqual(fooproj.top.comp2.rval_out, 4.)
def post(self): pdb = Projects() forms = {} for field in ['projectname', 'description', 'version']: if field in self.request.arguments.keys(): forms[field] = self.request.arguments[field][0] project = {} project['projectname'] = forms['projectname'].strip() project['description'] = forms['description'].strip() project['version'] = forms['version'].strip() project['id'] = pdb.predict_next_rowid() project['active'] = 1 # figure out a unique directory name for the project using # the project name and version string directory = self.get_project_dir() version = project['version'] pname = project['projectname'] if len(version): filename = clean_filename('%s-%s' % (pname, version)) else: filename = clean_filename(pname) unique = filename i = 1 while os.path.exists(os.path.join(directory, unique)): unique = '%s_%s' % (filename, str(i)) i = i + 1 project['projpath'] = os.path.join(directory, unique) pdb.new(project) os.mkdir(project['projpath']) # Update project settings. proj = Project(project['projpath']) dummy = proj.get_info() # Just to get required keys. info = {} for key in dummy: info[key] = project[key] proj.set_info(info) self.redirect("/workspace/project?projpath=" + quote_plus(project['projpath']))
def test_using(self): proj = Project('a_proj') proj.activate() self._fill_project(proj) top = proj.get('top') top.run() self.assertEqual(top.comp1.rval_out, 10.) self.assertEqual(top.comp2.rval_out, 40.) proj.command("top.comp1.rval_in = 0.5") os.chdir(self.tdir) proj.export(projname='fooproj') fooproj = project_from_archive('fooproj.proj') fooproj.activate() footop = fooproj.get('top') self.assertEqual(footop.comp1.rval_in, top.comp1.rval_in) footop.run() self.assertEqual(footop.comp1.rval_out, 1.) self.assertEqual(footop.comp2.rval_out, 4.)
def test_project_export_import(self): proj = Project(os.path.join(self.tdir, 'proj1')) self._fill_project(proj.top) proj.export(destdir=self.tdir) proj.deactivate() newproj = project_from_archive(os.path.join(self.tdir, 'proj1%s' % PROJ_FILE_EXT), proj_name='proj2', dest_dir=self.tdir) self.assertEqual(newproj.path, os.path.join(self.tdir, 'proj2')) try: newproj = project_from_archive(os.path.join( self.tdir, 'proj1%s' % PROJ_FILE_EXT), dest_dir=self.tdir) except Exception, err: self.assertTrue(str(err).endswith(' already exists'))
def get(self, project_id): ''' Browser download of a project file ''' pdb = Projects() project = pdb.get(project_id) if project['projpath']: dirname = project['projpath'] if os.path.isdir(dirname): proj = Project(dirname) tdir = mkdtemp() try: filename = proj.export(destdir=tdir) proj_file = open(filename, 'rb') self.set_header('content_type', 'application/octet-stream') self.set_header('Content-Length', str(os.path.getsize(filename))) form_proj = clean_filename(project['projectname']) form_ver = clean_filename(project['version']) form_date = strftime('%Y-%m-%d_%H%M%S') self.set_header( 'Content-Disposition', 'attachment; filename=%s-%s-%s.proj' % (form_proj, form_ver, form_date)) try: self.write(proj_file.read()) finally: proj_file.close() finally: try: shutil.rmtree(tdir, onerror=onerror) except: pass else: raise HTTPError(dirname, 403, "%s is not a directory" % dirname, None, None) else: raise HTTPError(filename, 403, "no file found for %s" % project['projectname'], None, None)
def post(self, project_id): forms = {} for field in ['projectname', 'description', 'version']: if field in self.request.arguments.keys(): forms[field] = self.request.arguments[field][0] pdb = Projects() # Existing project. if int(project_id) != pdb.predict_next_rowid(): project = pdb.get(project_id) project_is_new = False # New project else: project = {} project['active'] = 0 project['projpath'] = None project_is_new = True if 'projectname' not in forms or \ len(forms['projectname']) == 0: project['projectname'] = "Unnamed Project" else: project['projectname'] = forms['projectname'].strip() if 'description' in forms: project['description'] = forms['description'].strip() else: project['description'] = '' if 'version' in forms: project['version'] = forms['version'].strip() else: project['version'] = '' directory = forms.get('directory', self.get_project_dir()) # if there's no proj dir yet, create an empty one if not project['projpath']: version = project['version'] pname = project['projectname'] if len(version): filename = clean_filename('%s-%s' % (pname, version)) else: filename = clean_filename(pname) unique = filename i = 1 while os.path.exists(os.path.join(directory, unique)): unique = '%s_%s' % (filename, str(i)) i = i+1 project['projpath'] = os.path.join(directory, unique) if project_is_new: pdb.new(project) os.mkdir(project['projpath']) else: for key, value in project.iteritems(): pdb.set(project_id, key, value) pdb.modified(project_id) # Update project settings. proj = Project(project['projpath']) dummy = proj.get_info() # Just to get required keys. info = {} for key in dummy: info[key] = project[key] proj.set_info(info) self.redirect("/workspace/project?projpath=" + project['projpath'])
def post(self): if not self.request.arguments.has_key( "projectname" ): # First step in the import process. # Just get the name, description and version of the # project the user wants to import. # Then pass this to the form so the user can change it. # Go through the process of creating a new project directory # so we can read the name, description and version from the # settings file. sourcefile = self.request.files['projectfile'][0] if sourcefile: filename = sourcefile['filename'] if len(filename) > 0: unique = _get_unique_name(self.get_project_dir(), parse_archive_name(filename)) os.mkdir(unique) buff = StringIO.StringIO(sourcefile['body']) archive = tarfile.open(fileobj=buff, mode='r:gz') archive.extractall(path=unique) vcslist = find_vcs() if vcslist: vcs = vcslist[0](unique) else: vcs = DumbVCS(unique) vcs.init_repo() # Update project dict with info section of config file. proj = Project(unique) shutil.rmtree(unique) project_info = proj.get_info() self.render('projdb/import-metadata-fields.html', projectname=parse_archive_name(unique), description=project_info['description'], version=project_info['version'] ) self.redirect("/") else: forms = {} for field in ['projectname', 'description', 'version']: if field in self.request.arguments.keys(): forms[field] = self.request.arguments[field][0] sourcefile = self.request.files['projectfile'][0] if sourcefile: filename = sourcefile['filename'] if len(filename) > 0: unique = _get_unique_name(self.get_project_dir(), parse_archive_name(filename)) pdb = Projects() project = {} project['id'] = pdb.predict_next_rowid() project['active'] = 1 project['projectname'] = forms['projectname'].strip() project['description'] = forms['description'].strip() project['version'] = forms['version'].strip() project['projpath'] = unique os.mkdir(unique) buff = StringIO.StringIO(sourcefile['body']) archive = tarfile.open(fileobj=buff, mode='r:gz') archive.extractall(path=unique) vcslist = find_vcs() if vcslist: vcs = vcslist[0](unique) else: vcs = DumbVCS(unique) vcs.init_repo() # Update project settings. proj = Project(project['projpath']) dummy = proj.get_info() # Just to get required keys. info = {} for key in dummy: info[key] = project[key] proj.set_info(info) pdb.new(project) self.redirect("/workspace/project?projpath=" + project['projpath']) self.redirect("/")
def test_localfile_factory(self): proj = Project(os.path.join(self.tdir, 'proj2')) proj.activate() self._fill_project(proj)
def post(self): # The project file is uploaded once to extract the metadata. # It is then deleted and the metadata is used to populate another # import dialog, giving the user an opportunity to edit the # info before importing or cancel the import. if not 'projectname' in self.request.arguments: # First upload sourcefile = self.request.files['projectfile'][0] try: filename = sourcefile['filename'] if len(filename) > 0: unique = _get_unique_name(self.get_project_dir(), parse_archive_name(filename)) tdir = mkdtemp(prefix=unique) buff = StringIO.StringIO(sourcefile['body']) archive = tarfile.open(fileobj=buff, mode='r:gz') archive.extractall(path=tdir) proj = Project(tdir) project_info = proj.get_info() try: shutil.rmtree(tdir, onerror=onerror) except: pass self.render('projdb/import-metadata-fields.html', projectname=parse_archive_name(unique), description=project_info['description'], version=project_info['version']) except Exception as err: print 'ERROR: could not get metadata from', sourcefile exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) self.redirect('/') else: # second upload forms = {} for field in ['projectname', 'description', 'version']: if field in self.request.arguments.keys(): forms[field] = self.request.arguments[field][0] sourcefile = self.request.files['projectfile'][0] try: filename = sourcefile['filename'] if len(filename) > 0: unique = _get_unique_name(self.get_project_dir(), parse_archive_name(filename)) pdb = Projects() project = {} project['id'] = pdb.predict_next_rowid() project['active'] = 1 project['projectname'] = forms['projectname'].strip() project['description'] = forms['description'].strip() project['version'] = forms['version'].strip() project['projpath'] = unique os.mkdir(unique) buff = StringIO.StringIO(sourcefile['body']) archive = tarfile.open(fileobj=buff, mode='r:gz') archive.extractall(path=unique) vcslist = find_vcs() if vcslist: vcs = vcslist[0](unique) else: vcs = DumbRepo(unique) vcs.init_repo() # Update project settings. proj = Project(project['projpath']) dummy = proj.get_info() # Just to get required keys. info = {} for key in dummy: info[key] = project[key] proj.set_info(info) pdb.new(project) self.redirect("/workspace/project?projpath=" + quote_plus(project['projpath'])) except Exception as err: print 'ERROR: could not get import project from', sourcefile exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) self.redirect('/')
def commit(self, comment=''): p = Project(self.dirpath) p.export(destdir=self.repodir)
def test_new_project_is_valid(self): proj = Project(os.path.join(self.tdir, 'proj1')) self._fill_project(proj.top) self.assertEqual(proj.path, os.path.join(self.tdir, 'proj1')) self.assertTrue(_is_valid_project_dir(proj.path))