def load_or_compute(name, function): """ Helper to load a cached value or compute it INPUT: - ``name`` -- string. Part of the cache filename - ``function`` -- function. To compute the value if not cached. OUTPUT: The value of ``function``, possibly cached. EXAMPLES:: sage: from sage.libs.gap.assigned_names import GLOBALS sage: len(GLOBALS) > 1000 # indirect doctest True sage: from sage.libs.gap.saved_workspace import workspace sage: workspace(name='globals') ('...', True) """ filename, up_to_date = workspace(name=name) if up_to_date: with open(filename, 'rb') as f: return cPickle.load(f) else: value = function() from sage.misc.temporary_file import atomic_write with atomic_write(filename, binary=True) as f: cPickle.dump(value, f) return value
def load_or_compute(name, function): """ Helper to load a cached value or compute it INPUT: - ``name`` -- string. Part of the cache filename - ``function`` -- function. To compute the value if not cached. OUTPUT: The value of ``function``, possibly cached. EXAMPLES:: sage: from sage.libs.gap.assigned_names import GLOBALS sage: len(GLOBALS) > 1000 # indirect doctest True sage: from sage.libs.gap.saved_workspace import workspace sage: workspace(name='globals') ('...', True) """ filename, up_to_date = workspace(name=name) if up_to_date: with open(filename, 'rb') as f: return cPickle.load(f) else: value = function() from sage.misc.temporary_file import atomic_write with atomic_write(filename) as f: cPickle.dump(value, f) return value
def _save(self, obj, filename): """ TESTS: Check that interrupting ``_save`` is safe:: sage: from sagenb.storage.filesystem_storage import FilesystemDatastore sage: D = FilesystemDatastore("") sage: fn = tmp_filename() sage: s = "X" * 100000 sage: D._save(s, fn) sage: try: # long time ....: alarm(1) ....: while True: ....: D._save(s, fn) ....: except (AlarmInterrupt, OSError): ....: # OSError could happen due to a double close() in ....: # Python's tempfile module. ....: pass sage: len(D._load(fn)) 100000 """ s = cPickle.dumps(obj) if len(s) == 0: raise ValueError("Invalid Pickle") with atomic_write(self._abspath(filename)) as f: f.write(s)
def save_worksheet(self, worksheet, conf_only=False): """ INPUT: - ``worksheet`` -- a Sage worksheet - ``conf_only`` -- default: False; if True, only save the config file, not the actual body of the worksheet EXAMPLES:: sage: from sagenb.notebook.worksheet import Worksheet sage: tmp = tmp_dir() sage: W = Worksheet('test', 2, tmp, system='gap', owner='sageuser') sage: from sagenb.storage import FilesystemDatastore sage: DS = FilesystemDatastore(tmp) sage: DS.save_worksheet(W) """ username = worksheet.owner() id_number = worksheet.id_number() basic = self._worksheet_to_basic(worksheet) if not hasattr(worksheet, '_last_basic') or worksheet._last_basic != basic: # only save if changed self._save(basic, self._worksheet_conf_filename(username, id_number)) worksheet._last_basic = basic if not conf_only and worksheet.body_is_loaded(): # only save if loaded # todo -- add check if changed filename = self._worksheet_html_filename(username, id_number) with atomic_write(self._abspath(filename)) as f: f.write(worksheet.body().encode('utf-8', 'ignore'))
def save_worksheet(self, worksheet, conf_only=False): """ INPUT: - ``worksheet`` -- a Sage worksheet - ``conf_only`` -- default: False; if True, only save the config file, not the actual body of the worksheet EXAMPLES:: sage: from sagenb.notebook.worksheet import Worksheet sage: tmp = tmp_dir() sage: W = Worksheet('test', 2, tmp, system='gap', owner='sageuser') sage: from sagenb.storage import FilesystemDatastore sage: DS = FilesystemDatastore(tmp) sage: DS.save_worksheet(W) """ username = worksheet.owner(); id_number = worksheet.id_number() basic = self._worksheet_to_basic(worksheet) if not hasattr(worksheet, '_last_basic') or worksheet._last_basic != basic: # only save if changed self._save(basic, self._worksheet_conf_filename(username, id_number)) worksheet._last_basic = basic if not conf_only and worksheet.body_is_loaded(): # only save if loaded # todo -- add check if changed filename = self._worksheet_html_filename(username, id_number) with atomic_write(self._abspath(filename)) as f: f.write(worksheet.body().encode('utf-8', 'ignore'))
def _save(self, obj, filename): """ TESTS: Check that interrupting ``_save`` is safe:: sage: from sagenb.storage.filesystem_storage import FilesystemDatastore sage: D = FilesystemDatastore(tmp_dir()) sage: fn = tmp_filename() sage: s = "X" * 100000 sage: D._save(s, fn) sage: try: # long time ....: alarm(1) ....: while True: ....: D._save(s, fn) ....: except (AlarmInterrupt, OSError, AttributeError): ....: # OSError could happen due to a double close() in ....: # Python's tempfile module. ....: # AttributeError could happen due to interrupting ....: # in _TemporaryFileWrapper.__init__ ....: # (see https://trac.sagemath.org/ticket/22423) ....: pass sage: len(D._load(fn)) 100000 """ s = pickle.dumps(obj) if len(s) == 0: raise ValueError("Invalid Pickle") with atomic_write(self._abspath(filename)) as f: f.write(s)
def _save(self, obj, filename): """ TESTS: Check that interrupting ``_save`` is safe:: sage: from sagenb.storage.filesystem_storage import FilesystemDatastore sage: D = FilesystemDatastore(tmp_dir()) sage: fn = tmp_filename() sage: s = "X" * 100000 sage: D._save(s, fn) sage: try: # long time ....: alarm(1) ....: while True: ....: D._save(s, fn) ....: except (AlarmInterrupt, OSError, AttributeError): ....: # OSError could happen due to a double close() in ....: # Python's tempfile module. ....: # AttributeError could happen due to interrupting ....: # in _TemporaryFileWrapper.__init__ ....: # (see https://trac.sagemath.org/ticket/22423) ....: pass sage: len(D._load(fn)) 100000 """ s = pickle.dumps(obj) if len(s) == 0: raise ValueError("Invalid Pickle") with atomic_write(self._abspath(filename), binary=True) as f: f.write(s)
def write_citations(app, citations): """ Pickle the citation in a file. """ from sage.misc.temporary_file import atomic_write outdir = citation_dir(app) with atomic_write(os.path.join(outdir, CITE_FILENAME)) as f: cPickle.dump(citations, f) app.info("Saved pickle file: %s"%CITE_FILENAME)
def write_citations(app, citations): """ Pickle the citation in a file. """ from sage.misc.temporary_file import atomic_write outdir = citation_dir(app) with atomic_write(os.path.join(outdir, CITE_FILENAME), binary=True) as f: cPickle.dump(citations, f) app.info("Saved pickle file: %s" % CITE_FILENAME)
def write_citations(app: Sphinx, citations): """ Pickle the citation in a file. """ from sage.misc.temporary_file import atomic_write outdir = citation_dir(app) with atomic_write(outdir / CITE_FILENAME, binary=True) as f: pickle.dump(citations, f) logger.info("Saved pickle file: %s" % CITE_FILENAME)
def save_history(self): if not hasattr(self, 'history'): return import misc # late import if misc.notebook is None: return history_file = "%s/worksheets/%s/history.sobj"%(misc.notebook.directory(), self._username) try: his = cPickle.dumps(self.history) except AttributeError: his = cPickle.dumps([]) with atomic_write(history_file) as f: f.write(his)
def save_history(self): if not hasattr(self, 'history'): return import misc # late import if misc.notebook is None: return history_file = "%s/worksheets/%s/history.sobj" % ( misc.notebook.directory(), self._username) try: his = cPickle.dumps(self.history) except AttributeError: his = cPickle.dumps([]) with atomic_write(history_file) as f: f.write(his)
def save_stats(self, filename): """ Save stats from the most recent run as a JSON file. WARNING: This function overwrites the file. EXAMPLES:: sage: from sage.doctest.control import DocTestDefaults, DocTestController sage: DC = DocTestController(DocTestDefaults(), []) sage: DC.stats['sage.doctest.control'] = {u'walltime':1.0r} sage: filename = tmp_filename() sage: DC.save_stats(filename) sage: import json sage: D = json.load(open(filename)) sage: D['sage.doctest.control'] {u'walltime': 1.0} """ from sage.misc.temporary_file import atomic_write with atomic_write(filename) as stats_file: json.dump(self.stats, stats_file)