Thanks for taking the time to contribute 😁
We would like the Astuto community to be a welcoming environment for both seasoned programmers and absolute beginners. The following guidelines should help you get started regardless of your skill level.
There are many ways to contribute to Astuto, not just coding. In this section we list the most common ones:
- Getting involved in the community: we love to hear opinions about our product. Dropping a comment on an open issue or pull request or joining the discussion on the Discord server is an easy yet impactful way to contribute.
- Reporting bugs or proposing features: open a new issue on GitHub. Before posting, check if a similar issue has already been reported. Try to be concise but also unambiguous.
- Translating Astuto into a new language: we want Astuto to speak all languages and we need contributors to achieve this goal! If you're interested, join our Crowdin project, the platform we use to manage translations.
- Coding: open a pull request with your bug fix or feature implementation. Before diving into coding, you may find the coding and testing section useful.
If you still have any doubt, feel free to join our Discord and drop a message! And remember: there are no stupid questions 😉
If you're interested in translating, we suggest to visit and register to our Crowdin project, the place where we manage translations. If the language you want to contribute is not present in Crowdin, just open an issue on GitHub and let us know!
Locales are stored in YAML files under config/locales
. Translations are splitted in 3 files:
[lang].yml
: contains frontend translationsbackend/backend.[lang].yml
: contains backend translations, e.g. mailers, error messages, entity namesdevise/devise.[lang].yml
: contains translations for the authentication system (which is based on Devise gem). Usually, this file is not manually translated, because ready-made translations are already available at this page.
In order to contribute to Astuto, you need to run Astuto on your computer in development mode. In order to do so, please follow these instructions:
- Ensure you have Docker and Docker Compose installed
- Clone this repository
- Edit
docker-compose.yml
if you want to change the value of some environment variables. Note that thisdocker-compose.yml
is already configured to run Astuto in development mode (target: dev
). - Run
docker compose build
- Run
docker compose up
- You should now have a running instance of Astuto at
localhost:3000
. A default user account has been created with credentials email:[email protected]
, password:password
.
Depending on the task you're working on, you need to know one or more of these technologies:
- Ruby on Rails: Ruby framework for the backend
- React: UI library used for most of the frontend views
- Redux: state management library for React
- TypeScript
The project is broadly structured as follows:
app
models
: Rails ActiveRecord models. These models are mapped by ActiveRecord to database tables.controllers
: Rails controllers. Web requests will be handled here. Here you can query the database, return HTML/JSON, etc. We try to keep controllers as small as possible.views
: Rails views. Some of these views render HTML directly, whereas others render React components. Ideally, we'd like to move the entire frontend to React.javascript
actions
: Redux actionscomponents
: React componentscontainers
: React components that connect to Redux state. See this article to learn more.reducers
: Redux reducersstylesheets
: all CSS files are stored here
mailers
: mail templates that are sent to notify usersworkflows
: classes that contains some complex logic. Usually that logic was originally in a controller, but has been refactored and delegated to a workflow. In fact, workflows are usually called inside controllers.policies
: policies used by Pundit for resource authorization
config
locales
: locales files for internationalization. See this section for additional information.routes.rb
: backend routes, i.e. mapping requests to controller actions
db
migrate
: contains migration filesschema.rb
: database schema
spec
: RSpec tests
If you need to work with the Rails console, just attach a shell to the web
container. From there, type rails c
to run the console. You may notice that every query you run (e.g. Post.all
) fails with error Current::MissingCurrentTenant (Current tenant is not set)
: that's because Astuto implements multi tenancy at the database level. In order to fix this error, supposing you're in single tenant mode, just run Current.tenant = Tenant.first
as the first command inside the Rails console. After that, everything should work as expected.
Tests are done using RSpec, a testing framework for Ruby on Rails:
- To execute all specs, run
rspec
command inside theweb
container. System specs relies on Google Chrome to run, so you may need to rebuild Astuto image uncommenting lines 9-11 in Dockerfile. - If you want to run all specs except for system specs, you can run the script
script/rspec-no-system-specs.sh
.