├── .gitmodules ├── LICENSE └── README.md /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "apps/whenever"] 2 | path = apps/whenever 3 | url = git@github.com:javan/whenever.git 4 | branch = main 5 | [submodule "apps/rufus-scheduler"] 6 | path = apps/rufus-scheduler 7 | url = git@github.com:jmettraux/rufus-scheduler.git 8 | branch = master 9 | [submodule "apps/resque-scheduler"] 10 | path = apps/resque-scheduler 11 | url = git@github.com:resque/resque-scheduler.git 12 | branch = master 13 | [submodule "apps/clockwork"] 14 | path = apps/clockwork 15 | url = git@github.com:Rykian/clockwork.git 16 | branch = master 17 | [submodule "apps/foreman"] 18 | path = apps/foreman 19 | url = git@github.com:ddollar/foreman.git 20 | branch = main 21 | [submodule "apps/resque"] 22 | path = apps/resque 23 | url = git@github.com:resque/resque.git 24 | branch = master 25 | [submodule "apps/sidekiq"] 26 | path = apps/sidekiq 27 | url = git@github.com:sidekiq/sidekiq.git 28 | branch = main 29 | [submodule "apps/rubocop"] 30 | path = apps/rubocop 31 | url = git@github.com:rubocop/rubocop.git 32 | branch = master 33 | [submodule "apps/premailer"] 34 | path = apps/premailer 35 | url = git@github.com:premailer/premailer.git 36 | branch = master 37 | [submodule "apps/roadie"] 38 | path = apps/roadie 39 | url = git@github.com:Mange/roadie.git 40 | branch = master 41 | [submodule "apps/lolcat"] 42 | path = apps/lolcat 43 | url = git@github.com:busyloop/lolcat.git 44 | branch = master 45 | [submodule "apps/homebrew"] 46 | path = apps/homebrew 47 | url = git@github.com:Homebrew/brew.git 48 | branch = master 49 | [submodule "apps/jekyll"] 50 | path = apps/jekyll 51 | url = git@github.com:jekyll/jekyll.git 52 | branch = master 53 | [submodule "apps/middleman"] 54 | path = apps/middleman 55 | url = git@github.com:middleman/middleman.git 56 | branch = main 57 | [submodule "apps/pry"] 58 | path = apps/pry 59 | url = git@github.com:pry/pry.git 60 | branch = master 61 | [submodule "apps/githug"] 62 | path = apps/githug 63 | url = git@github.com:Gazler/githug.git 64 | branch = master 65 | [submodule "apps/dotenv"] 66 | path = apps/dotenv 67 | url = git@github.com:bkeepers/dotenv.git 68 | branch = main 69 | [submodule "apps/ruco"] 70 | path = apps/ruco 71 | url = git@github.com:grosser/ruco.git 72 | branch = master 73 | [submodule "apps/rake"] 74 | path = apps/rake 75 | url = git@github.com:ruby/rake.git 76 | branch = master 77 | [submodule "apps/rdoc"] 78 | path = apps/rdoc 79 | url = git@github.com:ruby/rdoc.git 80 | branch = master 81 | [submodule "apps/rouge"] 82 | path = apps/rouge 83 | url = git@github.com:rouge-ruby/rouge.git 84 | branch = master 85 | [submodule "apps/coderay"] 86 | path = apps/coderay 87 | url = git@github.com:rubychan/coderay.git 88 | branch = master 89 | [submodule "apps/markup"] 90 | path = apps/markup 91 | url = git@github.com:github/markup.git 92 | branch = master 93 | [submodule "apps/kramdown"] 94 | path = apps/kramdown 95 | url = git@github.com:gettalong/kramdown.git 96 | branch = master 97 | [submodule "apps/haml"] 98 | path = apps/haml 99 | url = git@github.com:haml/haml.git 100 | branch = main 101 | [submodule "apps/reek"] 102 | path = apps/reek 103 | url = git@github.com:troessner/reek.git 104 | branch = master 105 | [submodule "apps/capistrano"] 106 | path = apps/capistrano 107 | url = git@github.com:capistrano/capistrano.git 108 | branch = master 109 | [submodule "apps/mina"] 110 | path = apps/mina 111 | url = git@github.com:mina-deploy/mina.git 112 | branch = master 113 | [submodule "apps/vagrant"] 114 | path = apps/vagrant 115 | url = git@github.com:hashicorp/vagrant.git 116 | branch = main 117 | [submodule "apps/puppet"] 118 | path = apps/puppet 119 | url = git@github.com:puppetlabs/puppet.git 120 | branch = main 121 | [submodule "apps/thin"] 122 | path = apps/thin 123 | url = git@github.com:macournoyer/thin.git 124 | branch = master 125 | [submodule "apps/unicorn"] 126 | path = apps/unicorn 127 | url = git@github.com:defunkt/unicorn.git 128 | branch = master 129 | [submodule "apps/puma"] 130 | path = apps/puma 131 | url = git@github.com:puma/puma.git 132 | branch = master 133 | [submodule "apps/chef"] 134 | path = apps/chef 135 | url = git@github.com:chef/chef.git 136 | branch = main 137 | [submodule "apps/brakeman"] 138 | path = apps/brakeman 139 | url = git@github.com:presidentbeef/brakeman.git 140 | branch = main 141 | [submodule "apps/geocoder"] 142 | path = apps/geocoder 143 | url = git@github.com:alexreisner/geocoder.git 144 | branch = master 145 | [submodule "apps/tmuxinator"] 146 | path = apps/tmuxinator 147 | url = git@github.com:tmuxinator/tmuxinator.git 148 | branch = master 149 | [submodule "apps/colorls"] 150 | path = apps/colorls 151 | url = git@github.com:athityakumar/colorls.git 152 | branch = main 153 | [submodule "apps/image_optim"] 154 | path = apps/image_optim 155 | url = git@github.com:toy/image_optim.git 156 | branch = main 157 | [submodule "apps/github-changelog-generator"] 158 | path = apps/github-changelog-generator 159 | url = git@github.com:github-changelog-generator/github-changelog-generator.git 160 | branch = master 161 | [submodule "apps/ruby-warrior"] 162 | path = apps/ruby-warrior 163 | url = git@github.com:ryanb/ruby-warrior.git 164 | branch = master 165 | [submodule "apps/optcarrot"] 166 | path = apps/optcarrot 167 | url = git@github.com:mame/optcarrot.git 168 | branch = master 169 | [submodule "apps/procodile"] 170 | path = apps/procodile 171 | url = git@github.com:adamcooke/procodile.git 172 | branch = master 173 | [submodule "apps/pru"] 174 | path = apps/pru 175 | url = git@github.com:grosser/pru.git 176 | branch = master 177 | [submodule "apps/friends"] 178 | path = apps/friends 179 | url = git@github.com:JacobEvelyn/friends.git 180 | branch = main 181 | [submodule "apps/whois"] 182 | path = apps/whois 183 | url = git@github.com:weppos/whois.git 184 | branch = main 185 | [submodule "apps/htty"] 186 | path = apps/htty 187 | url = git@github.com:htty/htty.git 188 | branch = main 189 | [submodule "apps/word-to-markdown"] 190 | path = apps/word-to-markdown 191 | url = git@github.com:benbalter/word-to-markdown.git 192 | branch = main 193 | [submodule "apps/reverse_markdown"] 194 | path = apps/reverse_markdown 195 | url = git@github.com:xijo/reverse_markdown.git 196 | branch = master 197 | [submodule "apps/beats"] 198 | path = apps/beats 199 | url = git@github.com:jstrait/beats.git 200 | branch = master 201 | [submodule "apps/hue"] 202 | path = apps/hue 203 | url = git@github.com:soffes/hue.git 204 | branch = main 205 | [submodule "apps/cowsay"] 206 | path = apps/cowsay 207 | url = git@github.com:johnnyt/cowsay.git 208 | branch = master 209 | [submodule "apps/t"] 210 | path = apps/t 211 | url = git@github.com:sferik/t.git 212 | branch = master 213 | [submodule "apps/CocoaPods"] 214 | path = apps/CocoaPods 215 | url = git@github.com:CocoaPods/CocoaPods.git 216 | branch = master 217 | [submodule "apps/youplot"] 218 | path = apps/youplot 219 | url = git@github.com:red-data-tools/YouPlot.git 220 | branch = main 221 | [submodule "apps/licensee"] 222 | path = apps/licensee 223 | url = git@github.com:licensee/licensee.git 224 | branch = main 225 | [submodule "apps/rubygems"] 226 | path = apps/rubygems 227 | url = git@github.com:rubygems/rubygems.git 228 | branch = master 229 | [submodule "apps/t-ruby"] 230 | path = apps/t-ruby 231 | url = git@github.com:sferik/t-ruby.git 232 | branch = master 233 | [submodule "apps/docsplit"] 234 | path = apps/docsplit 235 | url = git@github.com:documentcloud/docsplit.git 236 | branch = master 237 | [submodule "apps/haiti"] 238 | path = apps/haiti 239 | url = git@github.com:noraj/haiti.git 240 | branch = master 241 | [submodule "apps/yard"] 242 | path = apps/yard 243 | url = git@github.com:lsegal/yard.git 244 | branch = main 245 | [submodule "apps/rbtrace"] 246 | path = apps/rbtrace 247 | url = git@github.com:tmm1/rbtrace.git 248 | branch = master 249 | [submodule "apps/linguist"] 250 | path = apps/linguist 251 | url = git@github.com:github-linguist/linguist.git 252 | branch = master 253 | [submodule "apps/mdless"] 254 | path = apps/mdless 255 | url = git@github.com:ttscoff/mdless.git 256 | branch = develop 257 | [submodule "apps/gist"] 258 | path = apps/gist 259 | url = git@github.com:defunkt/gist.git 260 | branch = master 261 | [submodule "apps/LicenseFinder"] 262 | path = apps/LicenseFinder 263 | url = git@github.com:pivotal/LicenseFinder.git 264 | branch = master 265 | [submodule "apps/ronn"] 266 | path = apps/ronn 267 | url = git@github.com:rtomayko/ronn.git 268 | branch = master 269 | [submodule "apps/standard"] 270 | path = apps/standard 271 | url = git@github.com:standardrb/standard.git 272 | branch = main 273 | [submodule "apps/asciidoctor"] 274 | path = apps/asciidoctor 275 | url = git@github.com:asciidoctor/asciidoctor.git 276 | branch = main 277 | [submodule "apps/syntax_tree"] 278 | path = apps/syntax_tree 279 | url = git@github.com:ruby-syntax-tree/syntax_tree.git 280 | branch = main 281 | [submodule "apps/bashly"] 282 | path = apps/bashly 283 | url = git@github.com:DannyBen/bashly.git 284 | branch = master 285 | [submodule "apps/WhatWeb"] 286 | path = apps/WhatWeb 287 | url = git@github.com:urbanadventurer/WhatWeb.git 288 | branch = master 289 | [submodule "apps/doomfire"] 290 | path = apps/doomfire 291 | url = git@github.com:marcinruszkiewicz/doomfire.git 292 | branch = master 293 | [submodule "apps/fpm"] 294 | path = apps/fpm 295 | url = git@github.com:jordansissel/fpm.git 296 | branch = main 297 | [submodule "apps/git-fame-rb"] 298 | path = apps/git-fame-rb 299 | url = git@github.com:oleander/git-fame-rb.git 300 | branch = main 301 | [submodule "apps/textbringer"] 302 | path = apps/textbringer 303 | url = git@github.com:shugo/textbringer.git 304 | branch = main 305 | [submodule "apps/httpclient"] 306 | path = apps/httpclient 307 | url = git@github.com:nahi/httpclient.git 308 | branch = master 309 | [submodule "apps/git_curate"] 310 | path = apps/git_curate 311 | url = git@github.com:matt-harvey/git_curate.git 312 | branch = master 313 | [submodule "apps/gemsmith"] 314 | path = apps/gemsmith 315 | url = git@github.com:bkuhlmann/gemsmith.git 316 | branch = main 317 | [submodule "apps/kamal"] 318 | path = apps/kamal 319 | url = git@github.com:basecamp/kamal.git 320 | branch = main 321 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Jerome Dalbert 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Real world Ruby apps 2 | 3 | > Real World Ruby apps and their open source codebases for developers to learn from 4 | 5 | You'll find the source code in the [`apps/`](apps/) subdirectory. These apps 6 | are: 7 | 8 | - Executable via the command line 9 | - Not based on any framework (see [other 10 | repos](#other-real-world-codebase-collections) for Rails, Sinatra, etc.) 11 | 12 | Thank you to every developer who has worked on a project this repo links to, 13 | your work is helping developers learn Ruby. 14 | 15 | ## How to install on your computer 16 | 17 | ```bash 18 | # Clone this git repo: 19 | git clone git@github.com:jeromedalbert/real-world-ruby-apps.git 20 | 21 | cd real-world-ruby-apps/ 22 | 23 | # The apps are linked to as git submodules. 24 | # This will take some time... 25 | git submodule update --init --single-branch --jobs 4 26 | ``` 27 | 28 | ## Other Real World codebase collections 29 | 30 | - Real World Rails https://github.com/eliotsykes/real-world-rails 31 | - Real World Sinatra https://github.com/jeromedalbert/real-world-sinatra 32 | - Real World RSpec https://github.com/pirj/real-world-rspec 33 | - Real World Django https://github.com/ckrybus/real-world-django 34 | - Real World Phoenix https://github.com/szTheory/real-world-phoenix 35 | - Know any others? Please open a PR and add the link here 36 | 37 | ## Information for contributors 38 | 39 | #### Is your app the right fit? 40 | 41 | - The majority of the codebase should not be based on any framework, like Rails 42 | or Sinatra. There are dedicated Real World repos for these. 43 | - The vast majority of the codebase should be written in Ruby. 44 | - The main app should be executable via a binary. 45 | - The app should be somewhat popular, in order to limit the apps in this repo 46 | to a manageable amount. There is some leeway in what constitutes a popular 47 | app. A possible indicator can be GitHub stars compared to similar apps. 48 | 49 | Don't hesitate to submit a pull request if you meet the criteria! 50 | 51 | #### How to add a Real World app 52 | 53 | Given a GitHub repo for an app `githubuser/foo`: 54 | 55 | ```bash 56 | # Inside the project root: 57 | # Replace with correct branch (probably 'main'). 58 | git submodule add -b git@github.com:githubuser/foo.git apps/foo 59 | ``` 60 | 61 | #### Updating the apps submodules to latest 62 | 63 | The apps in `apps/` are git submodules. Git submodules are locked to a revision 64 | and don't stay in sync with the latest revision. 65 | 66 | To update the revisions, run: 67 | 68 | ```bash 69 | # This will take some time: 70 | git submodule update --remote --single-branch --jobs 4 71 | ``` 72 | 73 | --- 74 | 75 | # Contributors 76 | 77 | - Jerome Dalbert http://jeromedalbert.com 78 | - Contributions are welcome, fork the GitHub repo, make your changes, then 79 | submit your pull request! Reach out if you'd like some help. 80 | --------------------------------------------------------------------------------