def _db_for_path(path=None): if path is not_set: if os.getenv("HYPOTHESIS_DATABASE_FILE") is not None: # pragma: no cover raise HypothesisException( "The $HYPOTHESIS_DATABASE_FILE environment variable no longer has any " "effect. Configure your database location via a settings profile instead.\n" "https://hypothesis.readthedocs.io/en/latest/settings.html#settings-profiles" ) # Note: storage_directory attempts to create the dir in question, so # if os.access fails there *must* be a fatal permissions issue. path = storage_directory("examples") if os.access(path, os.R_OK | os.W_OK | os.X_OK): return _db_for_path(path) else: # pragma: no cover warnings.warn( HypothesisWarning( "The database setting is not configured, and the default " "location is unusable - falling back to an in-memory " "database for this session. path=%r" % (path,) ) ) return InMemoryExampleDatabase() if path in (None, ":memory:"): return InMemoryExampleDatabase() return DirectoryBasedExampleDatabase(str(path))
def charmap(): """Return a dict that maps a Unicode category, to a tuple of 2-tuples covering the codepoint intervals for characters in that category. >>> charmap()['Co'] ((57344, 63743), (983040, 1048573), (1048576, 1114109)) """ global _charmap # Best-effort caching in the face of missing files and/or unwritable # filesystems is fairly simple: check if loaded, else try loading, # else calculate and try writing the cache. if _charmap is None: f = charmap_file() try: with gzip.GzipFile(f, "rb") as i: tmp_charmap = dict(json.loads(i)) except Exception: tmp_charmap = {} for i in range(0, sys.maxunicode + 1): cat = unicodedata.category(hunichr(i)) rs = tmp_charmap.setdefault(cat, []) if rs and rs[-1][-1] == i - 1: rs[-1][-1] += 1 else: rs.append([i, i]) try: # Write the Unicode table atomically tmpdir = storage_directory("tmp") mkdir_p(tmpdir) fd, tmpfile = tempfile.mkstemp(dir=tmpdir) os.close(fd) # Explicitly set the mtime to get reproducible output with gzip.GzipFile(tmpfile, "wb", mtime=1) as o: result = json.dumps(sorted(tmp_charmap.items())) o.write(result.encode()) os.renames(tmpfile, f) except Exception: pass # convert between lists and tuples _charmap = { k: tuple(tuple(pair) for pair in pairs) for k, pairs in tmp_charmap.items() } # each value is a tuple of 2-tuples (that is, tuples of length 2) # and that both elements of that tuple are integers. for vs in _charmap.values(): ints = list(sum(vs, ())) assert all([isinstance(x, int) for x in ints]) assert ints == sorted(ints) assert all([len(tup) == 2 for tup in vs]) assert _charmap is not None return _charmap
def _db_for_path(path=None): if path is not_set: if os.getenv( "HYPOTHESIS_DATABASE_FILE") is not None: # pragma: no cover raise HypothesisException( "The $HYPOTHESIS_DATABASE_FILE environment variable no longer has any " "effect. Configure your database location via a settings profile instead.\n" "https://hypothesis.readthedocs.io/en/latest/settings.html#settings-profiles" ) path = storage_directory("examples") if not _usable_dir(path): # pragma: no cover warnings.warn( HypothesisWarning( "The database setting is not configured, and the default " "location is unusable - falling back to an in-memory " f"database for this session. path={path!r}")) return InMemoryExampleDatabase() if path in (None, ":memory:"): return InMemoryExampleDatabase() return DirectoryBasedExampleDatabase(str(path))
def _db_for_path(path=None): if path is not_set: path = os.getenv('HYPOTHESIS_DATABASE_FILE') if path is not None: # pragma: no cover # Note: we should retain an explicit deprecation warning for a # further period after this is removed, to ease debugging for # anyone migrating to a new version. note_deprecation( 'The $HYPOTHESIS_DATABASE_FILE environment variable is ' 'deprecated, and will be ignored by a future version of ' 'Hypothesis. Configure your database location via a ' 'settings profile instead.' ) return _db_for_path(path) # Note: storage_directory attempts to create the dir in question, so # if os.access fails there *must* be a fatal permissions issue. path = storage_directory('examples') if os.access(path, os.R_OK | os.W_OK | os.X_OK): return _db_for_path(path) else: # pragma: no cover warnings.warn(HypothesisWarning( 'The database setting is not configured, and the default ' 'location is unusable - falling back to an in-memory ' 'database for this session. path=%r' % (path,) )) return InMemoryExampleDatabase() if path in (None, ':memory:'): return InMemoryExampleDatabase() path = str(path) if os.path.isdir(path): return DirectoryBasedExampleDatabase(path) if os.path.exists(path): return SQLiteExampleDatabase(path) if SQLITE_PATH.search(path): return SQLiteExampleDatabase(path) else: return DirectoryBasedExampleDatabase(path)
def charmap_file(): return os.path.join( storage_directory('unicodedata', unicodedata.unidata_version), 'charmap.pickle.gz')
def charmap(): """Return a dict that maps a Unicode category, to a tuple of 2-tuples covering the codepoint intervals for characters in that category. >>> charmap()['Co'] ((57344, 63743), (983040, 1048573), (1048576, 1114109)) """ global _charmap # Best-effort caching in the face of missing files and/or unwritable # filesystems is fairly simple: check if loaded, else try loading, # else calculate and try writing the cache. if _charmap is None: f = charmap_file() try: with gzip.GzipFile(f, "rb") as i: # When the minimum Python 3 version becomes 3.6, this can be # simplified to `json.load(i)` without needing to decode first. data = i.read().decode() tmp_charmap = dict(json.loads(data)) except Exception: # This loop is reduced to using only local variables for performance; # indexing and updating containers is a ~3x slowdown. This doesn't fix # https://github.com/HypothesisWorks/hypothesis/issues/2108 but it helps. category = unicodedata.category # Local variable -> ~20% speedup! tmp_charmap = {} last_cat = category(chr(0)) last_start = 0 for i in range(1, sys.maxunicode + 1): cat = category(chr(i)) if cat != last_cat: tmp_charmap.setdefault(last_cat, []).append([last_start, i - 1]) last_cat, last_start = cat, i tmp_charmap.setdefault(last_cat, []).append([last_start, sys.maxunicode]) try: # Write the Unicode table atomically tmpdir = storage_directory("tmp") mkdir_p(tmpdir) fd, tmpfile = tempfile.mkstemp(dir=tmpdir) os.close(fd) # Explicitly set the mtime to get reproducible output with gzip.GzipFile(tmpfile, "wb", mtime=1) as o: result = json.dumps(sorted(tmp_charmap.items())) o.write(result.encode()) os.renames(tmpfile, f) except Exception: pass # convert between lists and tuples _charmap = { k: tuple(tuple(pair) for pair in pairs) for k, pairs in tmp_charmap.items() } # each value is a tuple of 2-tuples (that is, tuples of length 2) # and that both elements of that tuple are integers. for vs in _charmap.values(): ints = list(sum(vs, ())) assert all(isinstance(x, int) for x in ints) assert ints == sorted(ints) assert all(len(tup) == 2 for tup in vs) assert _charmap is not None return _charmap
def eval_directory(): return storage_directory('eval_source')
def charmap_file(): return os.path.join( storage_directory('unicodedata', unicodedata.unidata_version), 'charmap.pickle.gz' )
def charmap_file(): return storage_directory("unicode_data", unicodedata.unidata_version, "charmap.json.gz")
def eval_directory(): return storage_directory("eval_source")
def test_storage_directories_are_created_automatically(tmpdir): fs.set_hypothesis_home_dir(str(tmpdir)) assert os.path.exists(fs.storage_directory(u'badgers'))
def charmap_file(): return os.path.join( storage_directory("unicodedata", unicodedata.unidata_version), "charmap.json.gz")
def charmap_file(): return os.path.join( storage_directory("unicodedata", unicodedata.unidata_version), "charmap.json.gz" )
def test_will_pick_up_location_from_env(monkeypatch, tmpdir): tmpdir = str(tmpdir) monkeypatch.setattr(os, "environ", {"HYPOTHESIS_STORAGE_DIRECTORY": tmpdir}) assert fs.storage_directory() == tmpdir
def test_can_set_homedir_and_it_will_exist(tmpdir): fs.set_hypothesis_home_dir(str(tmpdir.mkdir("kittens"))) d = fs.storage_directory() assert "kittens" in d assert os.path.exists(d)
def test_defaults_to_the_default(): assert fs.storage_directory() == fs.__hypothesis_home_directory_default
def setup_function(function): global previous_home_dir previous_home_dir = fs.storage_directory() fs.set_hypothesis_home_dir(None)