Project Files
Cryptol supports specifying a project file that can accelerate the repeated loading and testing of a large, interconnected set of source files. Cryptol will remember the hashes of the files previously checked and use this to avoid type-checking and testing files that are unchanged since the previous loading of the project.
To use this feature a cryproject.toml
should be created in the root
directory of the cryptol source files that lists all of the top-level
modules of the project. The dependencies of these modules will implicitly
be added to the project.
To check a whole project, Cryptol can be invoked with the --project
or -p
flag using the directory containing the project as an
argument. This will type-check all of the modules in the project and
check the docstrings for all modules in the project.
All errors are reported to stdout. When all modules load and all tests
pass cryptol’s exit code will be 0
. When the project does not load
successfully the exit code is 1
.
For each module, which is processed, we report a line like this:
Successes: X, No fences: Y, Failures: Z
- where:
X
is the nubmer of docstring tests which completed successfully,Y
is the number of declarations that have no docstring tests, andZ
is the number of dcostring tests which resulted in an error.
Note that these are only reported for modules that are actually checked (i.e., either they were not checked before, or something changed).
After all modules are processed we also report a summay of the form:
Passing: X, Failing: Y, Missing: Z
- where:
X
is the number of modules that have no failing tests,Y
is the number of modules with at least one failing test, andZ
is the number of modules for which we did not run tests.
At present we do not run tests for built-in modules (e.g., Cryptol
or
Float
), so almost always there will be at least 1 “missing” module.
After loading a project the cache information is saved into a Cryptol-
managed file in the project root directory .cryproject/loadcache.toml
.
Example:
cryptol -p myproject/
To discard the previous cached results and reload a whole project use
--refresh-project
. This can be useful when versions of external
tools have changed or simply to get confidence that everything is still
in a working state.
Example:
cryptol -p myproject/ --refresh-project
cryproject.toml
Format
Project files are described by a TOML file using the following top-level key-value assignments:
root
- optional - string - can optionally be specified to override the directory that Cryptol files are located in. Otherwise modules are loaded relative to the directory containing thecryproject.toml
.modules
- required - list of strings - is a list of filenames patterns matching the top-level modules in a project. These modules, and all of their dependencies, will be loaded when the project is loaded. These patterns will match using the common*
,?
, and character class matching offnmatch
extended with**
matching for multiple directories as found in the Git format for.gitignore
Example directory structure:
project
├── Id.c
├── Id.cry
├── Id.dylib
├── Main.cry
└── cryproject.toml
Example cryproject.toml
:
modules = [
"Id.cry",
"Main.cry",
]
loadcache.toml
Format
After loading a project a cache file is generated and stored in
.cryproject/loadcache.toml
. This file contains a version number to
allow caches to automatically invalidate when the project subsystem
updates. Modules that fail to load at all are not listed in the cache
file and will be reprocessed on subsequent project loads even if unchanged.
version
- integer - specifies the cache file format version in order to allow old caches to be invalidated when Cryptol changes the meaning of this file.file
- string - specifies the absolute path to a Cryptol module for those stored in files.memory
- string - specifies the module name of a primitive module built into Cryptol.fingerprint
- string - specifies a SHA2-256 hash of the source file which is used to detect when the source file has changed from the previous run.foreign_fingerprints
- list of string - is a list of SHA2-256 hashes of dynamic libraries that this Cryptol file directly loads.include_fingerprints
- list of string - is a list of SHA2-256 hashes of pre-processor included files that this Cryptol files directly includes.docstring_result
- boolean - istrue
when:check-docstrings
previously succeeded for this module andfalse
when it previously failed. It will be missing if tests were never run on this module.
version = 1
[[modules]]
fingerprint = "2f671b21f2933a006b6a843c7f281388e6b8227f9944b111f87711dc9ca8448f"
foreign_fingerprints = []
include_fingerprints = []
memory = "Cryptol"
[[modules]]
docstring_result = true
file = "/path/to/project/Id.cry"
fingerprint = "a9e6f7a4b65ead6bd8e27442717d6b0dc54afc73e34b18c32f005ceb7a8f3c34"
foreign_fingerprints = [ "c7767a13281a56631c72b9b6f69a17746dc02213e7f2b24a8a4a6fe7afd9ee0a" ]
include_fingerprints = []
[[modules]]
docstring_result = true
file = "/path/to/project/Main.cry"
fingerprint = "6b36f965ebb1a68cf76d689a966806ec879540aa6576a76c1aaa7705a4af09d5"
foreign_fingerprints = []
include_fingerprints = []