-
Notifications
You must be signed in to change notification settings - Fork 2
Developer docs #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Developer docs #11
Changes from all commits
85ba15a
96c8cb7
466957d
54c5e4d
aa24d84
f2d91a4
365ff5d
3a5f68e
ed8bbe4
ab91145
e69d005
77bb0de
9b48f6e
d167c03
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
| @@ -1,69 +1,146 @@ | ||||||||
| # Exercism ReScript Track | ||||||||
|
|
||||||||
| [](https://github.com/exercism/rescript/actions/workflows/configlet.yml) [](https://github.com/exercism/rescript/actions/workflows/test.yml) | ||||||||
| [](https://github.com/exercism/rescript/actions/workflows/configlet.yml) | ||||||||
| [](https://github.com/exercism/rescript/actions/workflows/test.yml) | ||||||||
|
|
||||||||
| Exercism exercises in ReScript. | ||||||||
|
|
||||||||
| ## Testing | ||||||||
| ## Installation | ||||||||
|
|
||||||||
| Track exercises target [ReScript] 12.2.0 using the [ReScript Test][ReScriptTest] testing framework on [Node.js] 22+. If you're contributing to the track, you will also need [make]. | ||||||||
|
|
||||||||
| ### Setting up the development environment | ||||||||
|
|
||||||||
| To test all exercises, run `./bin/verify-exercises`. | ||||||||
| This command will iterate over all exercises and check to see if their exemplar/example implementation passes all the tests. | ||||||||
| Run the following commands from inside the project root directory to install the required tools: | ||||||||
|
|
||||||||
| ```shell | ||||||||
| npm install | ||||||||
| git submodule update --init --recursive # add/update a local copy of the problem-specification submodule | ||||||||
| ``` | ||||||||
|
|
||||||||
| To test a single exercise, run `./bin/verify-exercises <exercise-slug>`. | ||||||||
| To automate the creation of practice exercise tests, our track tooling consumes data from the the [problem specifications][exercism-problem-specifications-link] submodule. Because these specifications serve as the canonical source for all Exercism tracks, any upstream updates ensure our test cases remain consistent with the global exercise standard. | ||||||||
|
|
||||||||
| ### Using Docker | ||||||||
| If you have format on save enabled for JSON files, it is recommended to disable this feature. Alternatively save JSON files with `Ctrl+K s` to save without applying formatting rules. | ||||||||
|
|
||||||||
| If your track has a working [test runner](https://exercism.org/docs/building/tooling/test-runners), the `./bin/verify-exercises-in-docker` script can also be used to test all exercises. | ||||||||
| This script pulls (_downloads_) the test runner's [Docker image](https://exercism.org/docs/building/tooling/test-runners/docker) and then uses Docker to run that image to test an exercise. | ||||||||
| ### Running the development environment | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is subordinate to installing the development environment, but this is a separate step. We'd only set up the environment once, but we'd run it multiple times potentially so this should be under a separate header than installation |
||||||||
|
|
||||||||
| ```exercism/note | ||||||||
| The main benefit of this approach is that it best mimics how exercises are tested in production (on the website). | ||||||||
| Another benefit is that you don't have to install track-specific dependencies (e.g. an SDK) locally, you just need Docker installed. | ||||||||
| Open up two terminals. By running the commands below, files will compile on save and re-run the test suite. | ||||||||
|
|
||||||||
| ```shell | ||||||||
| # Terminal 1 | ||||||||
| npm run res:start | ||||||||
|
|
||||||||
| # Terminal 2 | ||||||||
| npm run test | ||||||||
| ``` | ||||||||
|
|
||||||||
| To test a single exercise, run `./bin/verify-exercises-in-docker <exercise-slug>`. | ||||||||
| ## Adding Exercises | ||||||||
|
|
||||||||
| ### Linting | ||||||||
| Documentation on contributing to Exercism can be found [here][exercism-contributing-docs-link]. | ||||||||
|
|
||||||||
| [`configlet`](https://exercism.org/docs/building/configlet) is an Exercism-wide tool for working with tracks. You can download it by running: | ||||||||
| New practice exercises can be added via: | ||||||||
|
|
||||||||
| ```shell | ||||||||
| $ ./bin/fetch-configlet | ||||||||
| bin/add-practice-exercise <exercise-slug> | ||||||||
|
|
||||||||
| # Optionally, you can also specify the exercise's difficulty (via `-d`) and/or author's GitHub username (via `-a`): | ||||||||
| bin/add-practice-exercise -a foobar -d 3 <exercise-slug> | ||||||||
| ``` | ||||||||
|
|
||||||||
| Run its [`lint` command](https://exercism.org/docs/building/configlet/lint) to verify if exercises have the required files and if config files are correct: | ||||||||
| Now complete the following steps: | ||||||||
|
|
||||||||
| - `config.json` - ensure that the new exercise data is correctly placed in order of difficulty and then alphabetically within that difficulty rating. | ||||||||
| - implement exercise test cases, detailed in the [testing](#testing) section below. | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should be clear here that they need to make a template file first for the test generator to run. They then need to run the generator, making sure it runs a compilable ReScriptTest suite. Tests may need to be excluded from the tests.toml as well so that should be done as well. However, test generator may need to be rerun after you start working on the example solution and find a test for make sense for ReScript. Therefore we should mention or link out about the toml and how to skip a test there. Most of that is in the below section but it should be inlined here or introduced beforehand. Perhaps we break this into task-related sections: Generating Tests?Do this... Updating An Existing Exercise?Do this... Adding A New Exercise?Do this...
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The latest commit is draft 1 of this section. Please review. It is likely rough around the edges. I have commented out the old version for now, for reference.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we remove the old version? Generally, it's old for a reason, and it's hard for me to skim through the file since I need to track regularly whether I'm in a commented-out section or not. The old versions if we need them are in the commit history.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes i will do that this evening, and start working on the suggestions |
||||||||
| - `exercises/practice/<exercise-slug>/.meta/<exercise-name>.res` - write an example of code here that will pass all test cases. This does not need to be the finest example of how to complete this exercise, but it must pass all the test cases. Update the interface file with the exposed function signatures in the `.resi` file. | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Update which interface file? This list switches between file paths and steps. I think each list element should be an action and then you mention the files affected. |
||||||||
| - `exercises/practice/<exercise-slug>/wrc/<exercise-name>.res` - create an exercise stub here which returns `panic("'<function-name>' has not been implemented")`. Update the interface file with the function signatures, so that the student has a reference to what names and types are used. | ||||||||
|
|
||||||||
| ## Testing | ||||||||
|
|
||||||||
| Tests are written using [rescript-test][ReScriptTest]. There is a test templating system in place to reduce the amount of work needed by a developer. Follow these steps when writing tests: | ||||||||
|
|
||||||||
| - `exercises/practice/<exercise-slug>/.meta/tests.toml` - if any of these test cases are not relevant to the language, add `ignore = true` on a newline below the description | ||||||||
|
TheRealOwenRees marked this conversation as resolved.
|
||||||||
| - `exercises/practice/<exercise-slug>/.meta/testTemplate.js` - edit this file to allow the test generator to automatically create test files. | ||||||||
| - you must write your comparator functions - https://bloodyowl.github.io/rescript-test/assertions. | ||||||||
| - common assertions with comparator functions are located at `test_generator/assertions.js`. Pass the required ones into the `assertionFunctions` array. | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
| - edit the `template` function so that it will generate the test cases. The `c` variable refers to a test case in `problem-specifications/exercises/<exercise-slug>/canonical-data.json`. Look at other exercise test templates for inspiration. | ||||||||
|
|
||||||||
| Run all exercise tests: | ||||||||
|
|
||||||||
| ```shell | ||||||||
| $ ./bin/configlet lint | ||||||||
|
|
||||||||
| The lint command is under development. | ||||||||
| Please re-run this command regularly to see if your track passes the latest linting rules. | ||||||||
|
|
||||||||
| Basic linting finished successfully: | ||||||||
| - config.json exists and is valid JSON | ||||||||
| - config.json has these valid fields: | ||||||||
| language, slug, active, blurb, version, status, online_editor, key_features, tags | ||||||||
| - Every concept has the required .md files | ||||||||
| - Every concept has a valid links.json file | ||||||||
| - Every concept has a valid .meta/config.json file | ||||||||
| - Every concept exercise has the required .md files | ||||||||
| - Every concept exercise has a valid .meta/config.json file | ||||||||
| - Every practice exercise has the required .md files | ||||||||
| - Every practice exercise has a valid .meta/config.json file | ||||||||
| - Required track docs are present | ||||||||
| - Required shared exercise docs are present | ||||||||
| make test | ||||||||
| ``` | ||||||||
|
|
||||||||
| ## Adding exercises | ||||||||
| This command will iterate over all exercises and check to see if their example implementation passes all the tests. | ||||||||
|
|
||||||||
| New (practice) exercises can be added via: | ||||||||
| To test that all exercises will pass in the CI/CD environment, run: | ||||||||
|
|
||||||||
| ```shell | ||||||||
| bin/add-practice-exercise <exercise-slug> | ||||||||
| ./bin/verify-exercises | ||||||||
|
|
||||||||
| # test a single exercise: | ||||||||
| ./bin/verify-exercises <exercise-slug> | ||||||||
| ``` | ||||||||
|
|
||||||||
| ## Coding Style | ||||||||
|
|
||||||||
| Use `PascalCase.res` for ReScript implementation file names. | ||||||||
| A ReScript interface file (`.resi`) should be included with every exercise to help the user get started. | ||||||||
|
|
||||||||
| Run `make format` on your code before pushing. | ||||||||
|
|
||||||||
| If you are using VS Code, install the official [ReScript VS Code extension][rescript-vs-code-extension] for syntax highlighting and code formatting. | ||||||||
|
|
||||||||
| ## Linting & Formatting | ||||||||
|
|
||||||||
| [`configlet`][configlet] is an Exercism-wide tool for working with tracks. You can download it by running: | ||||||||
|
|
||||||||
| ```shell | ||||||||
| ./bin/fetch-configlet | ||||||||
| ``` | ||||||||
|
|
||||||||
| Optionally, you can also specify the exercise's difficulty (via `-d`) and/or author's GitHub username (via `-a`): | ||||||||
| Run the [`lint` command][configlet-link-link] to verify if exercises have the required files and if config files are correct. Address any issues before pushing your changes: | ||||||||
|
TheRealOwenRees marked this conversation as resolved.
|
||||||||
|
|
||||||||
| ```shell | ||||||||
| bin/add-practice-exercise -a foobar -d 3 <exercise-slug> | ||||||||
| ./bin/configlet lint | ||||||||
| ``` | ||||||||
|
|
||||||||
| Run the [`fmt` command][configlet-fmt-link] to verify if exercises and configuration files are formatted correctly. Address any issues before pushing your changes: | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||
|
|
||||||||
| ```shell | ||||||||
| ./bin/configlet fmt | ||||||||
|
|
||||||||
| # check a single exercise | ||||||||
| ./bin/configlet fmt -e <exercise-slug> | ||||||||
|
|
||||||||
| # auto format files | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. configlet fmt -u prompts you on formatting the exercise. |
||||||||
| ./bin/configlet fmt -u | ||||||||
| ``` | ||||||||
|
|
||||||||
| If you are auto formatting files, only commit the files relevant to your pull request. | ||||||||
|
|
||||||||
| ## Pull Requests | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure this section adds much value unless we're providing track-specific guidance. We're currently giving the steps to something potential contributors may already know or can readily find elsewhere. |
||||||||
|
|
||||||||
| Familiarise yourself with the Exercism [documentation][exercism-pr-docs-link] on pull requests. | ||||||||
|
|
||||||||
| Make sure your work is commited on a new branch. When you are ready to submit your changes, push your changes to your forked repository and open a pull request on the language track [repository]. | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
|
|
||||||||
| More details on how to create pull requests from a fork can be found [here][github-fork-pr-link]. | ||||||||
|
|
||||||||
| ## Feedback | ||||||||
|
|
||||||||
| If you find this documentation is inaccurate or incomplete, or can be improved in any way, please don't hesitate to raise an [issue][issue-link] or submit a pull request. | ||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should direct contributors to the forums by default unless we're explicitly a track accepting community contributions. |
||||||||
|
|
||||||||
| [ReScript]: https://rescript-lang.org/ | ||||||||
| [ReScriptTest]: https://bloodyowl.github.io/rescript-test/ | ||||||||
| [Node.js]: https://nodejs.org/ | ||||||||
| [repository]: https://github.com/exercism/rescript | ||||||||
| [issue-link]: https://github.com/exercism/rescript/issues | ||||||||
| [configlet-lint-link]: https://exercism.org/docs/building/configlet/lint | ||||||||
| [configlet-fmt-link]: https://exercism.org/docs/building/configlet/fmt | ||||||||
| [github-fork-pr-link]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork | ||||||||
| [exercism-pr-docs-link]: https://exercism.org/docs/building/github/contributors-pull-request-guide | ||||||||
| [exercism-contributing-docs-link]: https://exercism.org/docs/building | ||||||||
| [exercism-problem-specifications-link]: https://github.com/exercism/problem-specifications | ||||||||
| [configlet]: https://exercism.org/docs/building/configlet | ||||||||
| [make]: https://www.gnu.org/software/make/ | ||||||||
| [rescript-vs-code-extension]: https://marketplace.visualstudio.com/items?itemName=chenglou92.rescript-vscode | ||||||||
Uh oh!
There was an error while loading. Please reload this page.