rspec erb lint standardrb lint brakeman npm lint
Maintainability Test Coverage Snyk Vulnerabilities Average time to resolve an issue
A CASA (Court Appointed Special Advocate) is a role where a volunteer advocates on behalf of a youth in their county's foster care system. CASA is also the namesake role of the national organization, CASA, which exists to cultivate and supervise volunteers carrying out this work β with county level chapters (operating relatively independently of each other) across the country.
Table of Contents
- Welcome contributors!
- Tech Stack
- Resources
- Developing!
- Contributors
- Other Documentation
- Acknowledgements
- Feedback
We are very happy to have you! CASA and Ruby for Good are committed to welcoming new contributors of all skill levels.
Start with the contributing guide for setup, issue claiming, testing, and pull request expectations.
Find issues to work on here on the issue board. Issues on the project's TODO column are another way to browse issues. Check to see that no one is assigned to the issue. Then comment on it to claim the issue. Commenting on an issue doesn't automatically get the issue assigned so double check the comments on an issue to see that no one is requesting assignment.
Pull requests which are not for an issue but which improve the codebase are also welcome! Feel free to make GitHub issues for bugs and improvements. A maintainer will be keeping an eye on issues and PRs every day or three.
We highly recommend that you join us in slack in the #casa channel so you can get fast help for any questions you may have.
Check out our google calendar to see when office hours and stakeholder meetings are.
You can also open an issue or comment on an issue on GitHub and a maintainer will reply to you.
CASA is a national organization with many regional chapters. We currently work with Prince George's County CASA in Maryland, Montgomery CASA Maryland, and Howard County Maryland
This system provides value by:
- providing volunteers with a portal for logging activity
- allow supervisors to oversee volunteer activity
- generate reports on volunteer activity for admins to use in grant proposals
Read about the product sense that guides our approach to this work.
How CASA works:
- A foster youth is represented as a CASA case.
- The CASA case is assigned to a volunteer.
- The volunteer records their efforts spent on the CASA case as case contacts.
- Supervisors oversee CASA volunteers by monitoring, tracking, and advising them on CASA case activities.
- At PG CASA, the minimum volunteer commitment is one year (this varies by CASA chapter, in San Francisco the minimum commitment is ~ two years). A volunteer's lifecycle is very long, so there's a lot of activity for chapters to organize.
Project Considerations
- PG CASA is operating under a very tight budget. Right now, they manually input volunteer data into a volunteer management software built specifically for CASA, but upgrading their account for multiple user licenses to allow volunteers to self-log activity data is beyond their budget. Hence why we are building as lightweight a solution as possible that can sustain itself with Ruby for Good's support.
- While the scope of this platform's use is currently for PG County CASA and Montgomery county CASA, we are building with a mind toward multitenancy so this platform could prospectively be used by other CASA chapters across the country.
More information:
The complete role description of a CASA volunteer in Prince George's County.
| Technology | Version |
|---|---|
| Ruby | 4.0.6 (see .ruby-version) |
| Rails | 7.2 |
| PostgreSQL | 14+ |
| Node.js | LTS/Krypton (see .nvmrc) |
Key libraries: Hotwire Turbo, Stimulus, RSpec, StandardRB
- Architecture decisions β ADRs explaining key technical choices and entity relationship diagrams
- DB diagram β import
schema.rbinto dbdiagram.io for a live model diagram - Product sense β mission and product philosophy (recommended reading for leads and product contributors)
- Wiki β additional guides and who's who
- Google Calendar β office hours and stakeholder meetings
See our contributing guide π β¨
- Follow the link above or follow instructions to create a new Codespace.; You can use the web editor, or even better open the Codespace in VSCode
- Wait for the container to start. This will take a few (10-15) minutes since Ruby needs to be installed, the database needs to be created, and the
bin/setupscript needs to run - Run
bin/devand visit the URL that pops in VSCode up to see the CASA page - Login as a sample user β see Logging in with seed users for credentials (the same credentials also work on the QA environment)
Downloading the Project (on a Mac or Linux machine)
git clone https://github.com/rubyforgood/casa.gitclone the repo to your local machine.- You can ask a maintainer for permission to make a branch on this repo.
- You can also create a fork on GitHub and make a pull request from the fork.
Ruby
- Install a ruby version manager: rvm or rbenv
- when you cd into the project directory, let your version manager install the ruby version in
.ruby-version. Right now that's Ruby 4.0.3 gem install bundler
node.js
- (Recommended) Install nvm, which is a node version manager.
- If you use asdf, the node version from
.tool-versionswill be used, but may be out of sync with the codename version in.nvmrc. To use the version from.nvmrc, see one of these options: legacy file codename support or installing via custom script.
- If you use asdf, the node version from
- Install a current LTS version of Node. Running
nvm installfrom this directory will read the.nvmrcfile to install the correct version.
PostgreSQL ("postgres")
- Make sure that postgres is installed.
- If you're on Ubuntu/WSL, use
sudo apt-get install libpq-devso the gem can install. Use the Postgres repo for Ubuntu or WSL to get the server and client tools. - If you're on Fedora/Cent Os use
sudo dnf install libpq-devel. If you prefer choose package of libpq-devel via rpm - If you're on Windows, use the official installer and accept all defaults. Alternatively, a Chocolatey package is available with
choco install postgresql.
Chrome Browser
- The Spec tests uses Chrome Browser and Chromedriver for some of the tests. A current version of chromedriver will be installed when
bundle installis run. TO install Chrome, see Chrome Install.
Another option is to install the Chromium browser for your operating system so the browser-based Ruby feature/integration tests can run. Installing chromium-browser is enough, including for many WSL (Windows subsystem for Linux) distributions.
If you are using Ubuntu on WSL and receive the following message when trying to run the test suite...
Command '/usr/bin/chromium-browser' requires the chromium snap to be installed. Please install it with:
snap install chromium
...check out the instructions on installing google-chrome and chromedriver for WSL Ubuntu.
- Docker
- Linux
- Mac
- Windows β see the WSL setup guide for the recommended Windows path
- Windows Subsystem for Linux (WSL)
- Nix
Rails/rake commands hang forever instead of running
Run: rails app:update:bin
No option for a user to sign up through the UI
This is intentional. Use a pre-seeded user account β see Logging in with seed users.
Windows error: "Requirements support for mingw is not implemented yet"
Use RubyInstaller instead.
Images not displaying locally
Install imagemagick: https://imagemagick.org/script/download.php
M1 Mac installation issues
Run these commands before starting the installation process:
- Set the architecture:
$env /usr/bin/arch -arm64 /bin/zsh ---login - Remove all gems:
gem uninstall -aIx
bin/setup fails with a credentials error
- Open the
.envfile. - Update
POSTGRES_USERandPOSTGRES_PASSWORDto match your PostgreSQL credentials. - Run
bin/setup
cd casa/- Run
bin/setup - Run
bin/devand visit http://localhost:3000/ to see the app running.
A publicly accessible QA environment is available at https://casa-qa.herokuapp.com/ . You can log in using the same seed credentials below β useful for exploring the app without any local setup.
Local: http://localhost:3000/users/sign_in β QA: https://casa-qa.herokuapp.com/users/sign_in
| Role | Password | |
|---|---|---|
| volunteer1@example.com | Volunteer | 12345678 |
| supervisor1@example.com | Supervisor | 12345678 |
| casa_admin1@example.com | Admin | 12345678 |
| casa_admin2-1@example.com | Admin (different org) | 12345678 |
All CASA admin login at http://localhost:3000/all_casa_admins/sign_in (QA: https://casa-qa.herokuapp.com/all_casa_admins/sign_in):
| Role | Password | |
|---|---|---|
| allcasaadmin@example.com | All CASA Admin | 12345678 |
We are using Letter Opener in development to receive mail. All emails sent in development should open in a new tab in the browser.
To see local email previews, check out http://localhost:3000/rails/mailers
- run the ruby test suite
bin/rails spec - run the javascript test suite
npm run test
If you have trouble running tests, check out CI scripts in .github/workflows/ for sample commands.
Test coverage is run by simplecov on all builds and aggregated by CodeClimate
Run bin/lint to run all linters and fix issues. This will run:
bundle exec standardrb --fixauto-fix Ruby linting issues more linter infobundle exec erb_lint --lint-all --autocorrectERB linternpm run lint:fixto run the JS linter and fix issuesrake factory_bot:lintif you have been editing factories and want to find factories and traits which produce invalid objects
If additional work arises from your pull request that is outside the scope of the issue it resolves, please open a new issue.
The frontend uses Hotwire β specifically Turbo for page navigation and form handling, and Stimulus for lightweight JavaScript controllers attached to DOM elements.
Issue 5016 tracks the ongoing migration from inline JavaScript to Stimulus. Stimulus controllers live in app/javascript/controllers/. To verify Stimulus is working in your local environment, navigate to /casa_cases and check your browser console for Stimulus is working!
After pulling new changes from main, run:
bin/update
This runs any pending database migrations, updates gems and node packages, and executes post-deployment tasks in one step.
Post-deployment tasks
We use After Party for post-deployment tasks that may include one-time database updates. To run them manually:
bundle exec rake after_party:run
We welcome contributions of all kinds! To request attribution for your work, comment on your pull request with:
@all-contributors please add @<username> for <contributions>.
Replace <contributions> with code, review, doc, bug, or see the emoji key for all contribution types.
compwron
π» FireLemons
FireLemons
π» littleforest
littleforest
π» xihai01
xihai01
π» librod89
librod89
π» efgalvao
efgalvao
π» DrewAPeterson7671
DrewAPeterson7671
π»
seanmarcia
π» harsohailB
harsohailB
π» mussajoop
mussajoop
π» ErinClaudio
ErinClaudio
π» crespire
crespire
π» ShamiTomita
ShamiTomita
π» 7riumph
7riumph
π»
AudTheCodeWitch
π» colinsoleim
colinsoleim
π» vasconsaurus
vasconsaurus
π» thejonroberts
thejonroberts
π» elasticspoon
elasticspoon
π» rhian-cs
rhian-cs
π» jmkoni
jmkoni
π»
elhalvers
π» scottolsen
scottolsen
π» Learningstuff98
Learningstuff98
π» keithrbennett
keithrbennett
π» cliftonmcintosh
cliftonmcintosh
π» aedwardg
aedwardg
π» marmitoTH
marmitoTH
π»
pollygee
π» stefannibrasil
stefannibrasil
π» Garbar
Garbar
π» erik-trantt
erik-trantt
π» Thrillberg
Thrillberg
π» sarvaiyanidhi
sarvaiyanidhi
π» amygurski
amygurski
π»
schoork
π» armahillo
armahillo
π» hairedfox
hairedfox
π» ryanmrodriguez
ryanmrodriguez
π» gmfvpereira
gmfvpereira
π» jesselasalle
jesselasalle
π» arthur1041
arthur1041
π»
carrollsa
π» caitmich
caitmich
π» LeGorge
LeGorge
π» abachman
abachman
π» codewithjulie
codewithjulie
π» MikeRose151
MikeRose151
π» casadei
casadei
π»
aboongm
π» dpaola2
dpaola2
π» internetroger
internetroger
π» roxannecojocariu
roxannecojocariu
π» patrickarnett
patrickarnett
π» andrew-k9
andrew-k9
π» alindeman
alindeman
π»
nehaabraham
π» alex-yi37
alex-yi37
π» MclPio
MclPio
π» cam-benfield
cam-benfield
π» cjilbert504
cjilbert504
π» drborges
drborges
π» metamoni
metamoni
π»
PuZZleDucK
π» AravindSelvamani
AravindSelvamani
π» jp524
jp524
π» guswhitten
guswhitten
π» llewis-ut
llewis-ut
π» rpolley
rpolley
π» lisavogtsf
lisavogtsf
π»
fchagasjr
π» hatsu38
hatsu38
π» italomatos
italomatos
π» dominiquecuevas
dominiquecuevas
π» ciaranc78
ciaranc78
π» haydenrou
haydenrou
π» afogel
afogel
π»
exgin
π» tundal45
tundal45
π» marc
marc
π» andreLumor
andreLumor
π» johncarlocerna
johncarlocerna
π» ThomasNathan
ThomasNathan
π» matisnape
matisnape
π»
NickSchimek
π» tonyaraujop
tonyaraujop
π» cliiint
cliiint
π» DeadlockDruid
DeadlockDruid
π» KatherineMuedas
KatherineMuedas
π» Rafael-Martins
Rafael-Martins
π» geeksilva97
geeksilva97
π»
mecastelom
π» iamronakgupta
iamronakgupta
π» freestylebit
freestylebit
π» joaovitoras
joaovitoras
π» albertchae
albertchae
π» bjthompson805
bjthompson805
π» ashwinisukale
ashwinisukale
π»
RobGentile17
π» scantisani-ut
scantisani-ut
π» GALTdea
GALTdea
π» rae-stanton
rae-stanton
π» dominiclizarraga
dominiclizarraga
π» acrosman
acrosman
π» alanparmenter
alanparmenter
π»
lisale0
π» danaguilar
danaguilar
π» davidgumberg
davidgumberg
π» ginasekhar
ginasekhar
π» FeminismIsAwesome
FeminismIsAwesome
π» josephmsmith
josephmsmith
π» acasarsa
acasarsa
π»
SajjadAhmad14
π» josearmandojacq
josearmandojacq
π» ycorredius
ycorredius
π» tamara-builds
tamara-builds
π» trevor-jameson
trevor-jameson
π» arku
arku
π» Salanoid
Salanoid
π»
hiendinhngoc
π» zspencer
zspencer
π» sandfortw
sandfortw
π» BrianBorge
BrianBorge
π» fchatterji
fchatterji
π» carolyn-manning
carolyn-manning
π» ptrela
ptrela
π»
Zrrrpy
π» ChaelCodes
ChaelCodes
π» mdchaney
mdchaney
π» JoshDevHub
JoshDevHub
π» derricklannaman
derricklannaman
π» aisayo
aisayo
π» iraline
iraline
π»
ludamillion
π» rebecarancan
rebecarancan
π» valeriecodes
valeriecodes
π» Iverick
Iverick
π» gabrielbaldao
gabrielbaldao
π» CovenantHuman
CovenantHuman
π» brodyf42
brodyf42
π»
eclectic-coding
π» sstacey
sstacey
π» cassianoblonski
cassianoblonski
π» datadaveshin
datadaveshin
π» edwja
edwja
π» isaacm
isaacm
π» khiga8
khiga8
π»
amuta
π» RomanTurner
RomanTurner
π» chahmedejaz
chahmedejaz
π» tiff-o
tiff-o
π» stephenandersondev
stephenandersondev
π» yosefbennywidyo
yosefbennywidyo
π» steph-hickman9
steph-hickman9
π»
notapatch
π» jorgedjr21
jorgedjr21
π» costajohnt
costajohnt
π» Budmin
Budmin
π» CraigTreptow
CraigTreptow
π» arzezak
arzezak
π» tacoda
tacoda
π»
zeeshan-haidar
π» aubzie305
aubzie305
π» big-meel
big-meel
π» hroulston
hroulston
π» dhhuynh2
dhhuynh2
π» GuillermoCoding
GuillermoCoding
π» HeitorMC
HeitorMC
π»
FranConcaro
π» colefortner
colefortner
π» JustinTan-1
JustinTan-1
π» leesharma
leesharma
π» leilaevans
leilaevans
π» maebeale
maebeale
π» marcelkooi
marcelkooi
π»
steve-meyers
π» solebared
solebared
π» Natblow
Natblow
π» bacchist
bacchist
π» talya19
talya19
π» kanishk333gupta
kanishk333gupta
π» alexmalik
alexmalik
π»
ATMartin
π» raychiranjib1
raychiranjib1
π» muydanny
muydanny
π» dvsconcept1986
dvsconcept1986
π» gskifstad
gskifstad
π» gregblake
gregblake
π» jamesh38
jamesh38
π»
thejwuscript
π» s-espinosa
s-espinosa
π» marcoroth
marcoroth
π» yagosansz
yagosansz
π» frankljin
frankljin
π» mdr-uma
mdr-uma
π» ashstewart7
ashstewart7
π»
Malinimr
π» shacon
shacon
π» tpham0123
tpham0123
π» Nwabor
Nwabor
π» gasperno
gasperno
π» fabioxgn
fabioxgn
π» h-m-m
h-m-m
π»
Kerman07
π» lubc
lubc
π» kcdragon
kcdragon
π» bklang
bklang
π» BrunoViveiros
BrunoViveiros
π» gabrielcnunez
gabrielcnunez
π» Isaac-alencar
Isaac-alencar
π»
JadeDickinson
π» jamgar
jamgar
π» Jontar-code
Jontar-code
π» jimnanney
jimnanney
π» tmr08c
tmr08c
π» Tscasady
Tscasady
π» rtkimz
rtkimz
π»
renatamarques97
π» Rockenfels
Rockenfels
π» peaonunes
peaonunes
π» Oli0li
Oli0li
π» nizam12khan
nizam12khan
π» cattywampus
cattywampus
π» soc-man
soc-man
π»
sean-dickinson
π» rogesson
rogesson
π» rishijain
rishijain
π» svileshina
svileshina
π» grazirs
grazirs
π» carters-code
carters-code
π» aerrin99
aerrin99
π»
wthurston-ut
π» AlexWheeler
AlexWheeler
π» renugasaraswathy
renugasaraswathy
π» Craggar
Craggar
π» AdamSajdakMck
AdamSajdakMck
π» zvwm
zvwm
π» farrelld09
farrelld09
π»
jdsoteldo
π» allenjd3
allenjd3
π» Jaskaran2
Jaskaran2
π» JenMcD-star
JenMcD-star
π» JuanVqz
JuanVqz
π» katmlane
katmlane
π» mononoken
mononoken
π»
Math-O5
π» moizafzal936
moizafzal936
π» rjbeers
rjbeers
π» rafaeelaudibert
rafaeelaudibert
π» jemcodes
jemcodes
π» bmanek
bmanek
π» zgagnon
zgagnon
π»
vishaltps
π» leevic31
leevic31
π» thiantonello
thiantonello
π» tjaRoxasXIII
tjaRoxasXIII
π» tanja-veljan
tanja-veljan
π» stufro
stufro
π» stephenmckeon
stephenmckeon
π»
kazuhirodk
π» kinduff
kinduff
π» r-mckeith
r-mckeith
π» shuaixiaoqiang
shuaixiaoqiang
π» strangeforloop
strangeforloop
π» xcelr8
xcelr8
π» xeniabarreto
xeniabarreto
π»
yyelleww70
π» kasugaijin
kasugaijin
π» Naraveni
Naraveni
π» kyle-apex
kyle-apex
π» LeslieKornes
LeslieKornes
π» AlyBadawy
AlyBadawy
π» alexandremartins-glitch
alexandremartins-glitch
π»
amycommits
π» spotswoodb
spotswoodb
π» dcslagel
dcslagel
π» Daniel-Penaloza
Daniel-Penaloza
π» panacotar
panacotar
π» DianaLiao
DianaLiao
π» EduardoSCosta
EduardoSCosta
π»
ElisaRmz
π» fisanchez
fisanchez
π» FionaDL
FionaDL
π» Gabe-Torres
Gabe-Torres
π» jonathanmeneses
jonathanmeneses
π» jyeharry
jyeharry
π» likevi54
likevi54
π»
lautarol
π» choznerol
choznerol
π» leslie-seeberger
leslie-seeberger
π» mateusdeap
mateusdeap
π» ncala
ncala
π» melvynsng
melvynsng
π» stephenagreer
stephenagreer
π»
mattzollinhofer
π» jolenehayes
jolenehayes
π» jordano159
jordano159
π» izaguirrejoe
izaguirrejoe
π» kassandraleyba
kassandraleyba
π» kellyeryan
kellyeryan
π» JoelLau
JoelLau
π»
ec1971
π» jasperfurniss
jasperfurniss
π» jasonodoom
jasonodoom
π» shkm
shkm
π» 96RadhikaJadhav
96RadhikaJadhav
π» vega28
vega28
π» kenny-luong
kenny-luong
π»
EfeAgare
π» lsparlin
lsparlin
π» lucia-w
lucia-w
π» ekulz
ekulz
π» malsmr
malsmr
π» msespos
msespos
π» mgrigoriev8109
mgrigoriev8109
π»
naomiyocum
π» cashmann
cashmann
π» nepaakash
nepaakash
π» msalli
msalli
π» heyapricot
heyapricot
π» Benabik
Benabik
π» apocosipadrino
apocosipadrino
π»
invacuo
π» uzorjchibuzor
uzorjchibuzor
π» cflannagan
cflannagan
π» dalmaboros
dalmaboros
π» dmcarmo
dmcarmo
π» etagwerker
etagwerker
π» fransan6
fransan6
π»
This project follows the all-contributors specification. Contributions of any kind welcome!
Check out the wiki
There is a doc directory at the top level that includes:
- an
architecture-decisionsdirectory containing important architectural decisions and entity relationship diagrams of various models (see the article Architectural Decision Records describing this approach). - Code of Conduct
- productsense.md(for team leads & product interested contributors)
- SECURITY.md
Thank you to Scout for letting us use their dashboard for free!
Join info for all public meetings is posted in the rubyforgood slack in the #casa channel
We are very interested in your feedback! Please give us some :) https://forms.gle/1D5ACNgTs2u9gSdh9