-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Roadmap
This roadmap defines the things that we definitely want to have in the language and plan to do. It can grow over time, but it can only shrink once we do the tasks.
Stuff that has to do with the language syntax, semantic and runtime.
- Define how to do channel select
- Fix/check
IO.select
- Fix/check
Process.run
(waitpid must not block) - Run fibers on multiple threads, with a single IO loop and job stealing
- Add concurrency primitives like
WorkGroup
- Implement context switch in assembly
- For 32 bits
- For 64 bits
- Stack overflows should be detected and shown (https://github.com/manastech/crystal/issues/271)
- Decide how to execute external processes (
Process.run
). There are already three different pull requests about this.
Stuff that has to do with where and how Crystal runs.
- Fix wrong assumptions about C types
- Fix broken specs (BigInt, etc.)
- Add to omnibus
- Add Vagrant config
- Find out a way to automatically run specs for 32 bits (travis doesn't support it)
Built-in tools integrated to the crystal
command.
Crystal will provide a built-in package manager. We really want this to be the only package manager so it's easier to build a collaborative community.
We want a truly decentralized package manager. These ideas could make it work:
- No global directory where all deps are installed: it's local to each project (lib/libs directory)
- Each repo has a special branch (maybe
_releases
) with metadata for dependencies for each version. These are cummulative, so version 0.2 contains metadata for 0.1 and 0.2. - Crystal provides a command to release a new version, pushing to that special branch, and creating a tag
- Use Semantic Versioning
- Automatically download recursive dependencies
- Resolve conflicts
- Remove
Projecfile
, use YAML, both forproject.yml
and for the metadata file - Include name and version in
project.yml
- The name above is used for the directory in which it is installed, and used by
require "..."
, so for example "webmock.cr" will be installed in "lib/webmock", and that directory will contain the direct checkout of the project (so it has thesrc
directory in it) - The
require
logic changes to that if you dorequire "foo"
, we check if there'sfoo.cr
in CRYSTAL_PATH, orfoo/foo.cr
, orfoo/src/foo.cr
(this last one is the one that will be used for dependencies installed via the package manager). With this logic, the current CRYSTAL_PATH value doesn't need to change - Probably rename "libs" to "lib"
With the above, when you do crystal deps install
, all first-level dependencies are gathered. From there we go to each depednency's repository and check out the special _releases
branch to get all metadata for all versions of that first-level dependency. We apply this recursively until we get all the metadata for all involved libraries. The previous process should be fast, because only that metadata branch must be checked out, and only once for each library (and we can parallelize the requests). Then we can solve conflicts and install what's needed.
For discoverability, we can list github/bitbucket repositories that have crystal code and that also have that special _releases
branch, which in turn contains all the information for every version of the library.
For all of this, the easiest thing would be to build on top of @ysbaddaden's shards, which already has the desired YAML format, probably has some logic for semver, etc.
It would be awesome if you could download a project and just do crystal build
or crystal run
without arguments, and that builds/runs the default executable.
For this, we can use the name of the project (specified in project.yml
) and use ./src/{{name}}/{{name}}.cr
.
This argless version also executes crystal deps
, so that doing crystal build/run
works out of the box (given you have the necessary dependencies).
- Improve the docs viewer
- Nicer style
- Allow searching types
- Allow searching methods
- Show inherited methods from superclasses and included modules
- Don't use HTML frames because they are deprecated/discouraged (optional)
- Support inter-linking between docs (we can start with http://www.docrystal.org/)
- Allow specifying a different README for the docs (so that we can, for example, have a better intro for the standard library)
This section needs to be defined.
Stuff provided by the standard library. If you wish to tackle some of these, please let us know! But first open an issue so we can discuss the best way to do it (and we'll link the issue in this page.)
Some types listed here might already exist but have incomplete functionality, or must be reviewed (we might need to mark this in the code somehow, similar to how, for example, Rust does it.)
- zlib (integrate @datanoise's, eventually)
- openssl (integrate @datanoise's, eventually)
- File
- FileUtils
- IO timeout
- Encoding support
- HTTP::Client streaming
- HTTP::Server streaming
- WebSocket
- Time
- TimeSpan
- TimeWithZone
- TimeZone
- Logger
- FTP
- SMTP
- DB interface
- Random interface
- SecureRandom
- JSON
- XML