ruby '2.7.1' | |
gem 'rails', github: 'rails/rails' | |
gem 'tzinfo-data', '>= 1.2016.7' # Don't rely on OSX/Linux timezone data | |
# Action Text | |
gem 'actiontext', github: 'basecamp/actiontext', ref: 'okra' | |
gem 'okra', github: 'basecamp/okra' | |
# Drivers | |
gem 'mysql2' | |
gem 'sqlite3' # Used for asset generation in BK | |
gem 'redis', '~> 4.0' | |
gem 'redis_connectable', github: 'basecamp/redis_connectable' | |
gem 'redis-namespace' | |
gem 'connection_pool' | |
gem 'image_processing', '~> 1.2' | |
gem 'puma', '>= 4.3.3', github: 'puma/puma' | |
# JavaScript and assets | |
gem 'webpacker', '~> 5.1.1' | |
gem 'sprockets', github: 'rails/sprockets' | |
gem 'sprockets-rails', github: 'rails/sprockets-rails' | |
gem 'jbuilder', '~> 2.9', '>= 2.9.1', github: 'rails/jbuilder' | |
gem 'sassc-rails', '~> 2.1' | |
gem 'sassc', '<= 2.1' | |
gem 'local_time', '~> 2.0' | |
gem 'turbo', github: 'basecamp/turbo' | |
# Security | |
gem 'bcrypt', '~> 3.1.7' | |
gem 'pwned', '~> 2.0' | |
gem 'rotp' | |
gem 'webauthn' | |
gem 'rack-ratelimit', github: 'jeremy/rack-ratelimit' | |
# Jobs | |
gem 'resque', '~> 2.0.0' | |
gem 'resque-multi-job-forks', '~> 0.5' | |
gem 'resque-pool', github: 'nevans/resque-pool' | |
gem 'resque-scheduler', github: 'resque/resque-scheduler' | |
gem 'resque-pause', github: 'basecamp/resque-pause' | |
gem 'resque-web', require: 'resque_web' | |
gem 'resque-scheduler-web', github: 'mattgibson/resque-scheduler-web' | |
gem 'sinatra', github: 'sinatra/sinatra' | |
# Storage | |
gem 'aws-sdk-s3', '~> 1.48.0' | |
gem 'activestorage-redundancy', github: 'basecamp/activestorage-redundancy' | |
gem 'activestorage-office-previewer', '~> 0.1' | |
# Search | |
gem 'elasticsearch-model', github: 'elastic/elasticsearch-rails', branch: '6.x' | |
gem 'elasticsearch-rails', github: 'elastic/elasticsearch-rails', branch: '6.x' | |
gem 'html_scrubber', github: 'basecamp/html_scrubber' | |
# Push notifications | |
gem 'aws-sdk-pinpoint' | |
# Monitoring | |
gem 'easymon', '~> 1.4.2' | |
gem 'sentry-raven' | |
# Logging/instrumentation | |
gem 'rails_structured_logging', github: 'basecamp/rails-structured-logging' | |
gem 'full_request_logger', github: 'basecamp/full_request_logger' | |
gem 'critter', '~> 0.3.0', github: 'basecamp/critter', require: false | |
gem 'activejob-stats', github: 'basecamp/activejob-stats' | |
# Profiling/troubleshooting | |
gem 'rbtrace' | |
gem 'stackprof' | |
gem 'rack-mini-profiler' | |
gem 'flamegraph' | |
# Queenbee | |
gem 'queenbee', github: 'basecamp/queenbee-plugin' | |
gem 'actionpack-xml_parser' | |
gem 'countries' | |
# vCard parsing | |
gem 'pdi', github: 'basecamp/pdi', branch: 'utf-8-default' | |
# Supervised rails console in production environments | |
gem 'console1984', github: 'basecamp/console1984' | |
# Other | |
gem 'rake', github: 'ruby/rake' | |
gem 'platform_agent' | |
gem 'useragent', github: 'basecamp/useragent' | |
gem 'geared_pagination', '>= 1.0.0' | |
gem 'rqrcode' | |
gem 'base32' | |
gem 'httparty' | |
gem 'bootsnap', '>= 1.4.2', require: false # Reduces boot times through caching; required in config/boot.rb | |
gem 'rspamd', github: 'basecamp/rspamd-ruby' | |
gem 'redis_object', github: 'basecamp/redis_object' | |
gem 'ruby-progressbar', require: false | |
gem 'rinku', require: 'rails_rinku' | |
gem 'active_record_encryption', github: 'basecamp/active_record_encryption' | |
gem 'simpleidn' | |
group :development, :test do | |
gem 'byebug' | |
gem 'break' | |
gem 'spring' | |
# Code critics | |
gem 'rubocop', '>= 0.72', require: false | |
gem 'rubocop-performance', require: false | |
gem 'rubocop-rails', require: false | |
gem 'scss_lint', '~> 0.50', require: false | |
gem 'bundler-audit', '~> 0.4', github: 'basecamp/bundler-audit', branch: 'thor-bump', require: false | |
gem 'brakeman', '>= 4.0', require: false | |
gem 'benchmark-ips', require: false | |
end | |
group :development do | |
gem 'web-console' | |
gem 'listen', '>= 3.0.5', '< 3.2' | |
gem 'faker', require: false | |
# Deploys, local CI | |
gem 'haybales', github: 'basecamp/haybales' | |
end | |
group :test do | |
gem 'mocha' | |
gem 'capybara', '>= 2.15', github: 'teamcapybara/capybara' | |
gem 'selenium-webdriver' | |
gem 'webmock', github: 'bblimke/webmock' | |
gem 'vcr' | |
end |
@dhh what is your package.json
?
Why Resque and not Sidekiq?
Interesting! Thanks!!
Why Resque and not Sidekiq?
@fabioperrella
https://twitter.com/dhh/status/1252329322582388736
Don't need any features from Sidekiq. Happy with Resque.
Why Resque and not Sidekiq?
@fabioperrella
https://twitter.com/dhh/status/1252329322582388736Don't need any features from Sidekiq. Happy with Resque.
Nice, thanks!
Thanks!
Any cool stuff in this closed gems to be open one day?
# Drivers
gem 'redis_connectable', github: 'basecamp/redis_connectable'
# Search
gem 'html_scrubber', github: 'basecamp/html_scrubber'
# Logging/instrumentation
gem 'rails_structured_logging', github: 'basecamp/rails-structured-logging'
gem 'critter', '~> 0.3.0', github: 'basecamp/critter', require: false
# Other
gem 'useragent', github: 'basecamp/useragent'
gem 'rspamd', github: 'basecamp/rspamd-ruby'
# shouldn't be in in Drivers close to redis?
gem 'redis_object', github: 'basecamp/redis_object'
# shouldn't be in in Security?
gem 'active_record_encryption', github: 'basecamp/active_record_encryption'
# Deploys, local CI
gem 'haybales', github: 'basecamp/haybales'
Alphabetical order is way more efficient than creating categories
why no simplecov?
@dhh what is your
package.json
?
That's a good question. These days, it's almost as telling as the Gemfile.
What do you use from mocha? Something you can't do with Minitest::Mock?
mocha is for client side javascript testing, and minitest is not in the same level
That's a different mocha... The mocha Ruby gem is for mocking and stubbing: https://mocha.jamesmead.org/
I would love to see structured logging as a Rails default in production.
Obviously very interested to peek into
gem 'rails_structured_logging', github: 'basecamp/rails-structured-logging'
@codextremist Gemfiles are required in the order you define and gems can have order-dependant logic. Alphabetical ordering is a bad idea.
@dhh Do you plan to open source the rspamd gem at some point? I'd have a use case for it. :)
@codextremist Gemfiles are required in the order you define and gems can have order-dependant logic. Alphabetical ordering is a bad idea.
@krainboltgreene some example please
@codextremist Gemfiles are required in the order you define and gems can have order-dependant logic. Alphabetical ordering is a bad idea.
@krainboltgreene Never had that problem before, after dealing with at least dozens of Rails projects at least.
I just feel so pointless to organize gems by categories. If you need to lookup your Gemfile for a specific gem, I doubt that these categories will be of any help.
Don't see any authentication gem such as Devise... is it done totally "manually" ?
@dhh why use a "more-lightweight-than-Rails" framework Sinatra on top of already having Rails gem installed ?
I would understand if you were using Sinatra for Jobs in antoher codebase/repo/server for specific "thinner" needs, but as you're using a Majestic Monolith, why use Sinatra on top of Rails ? What was Rails missing in terms of jobs management that you'd need to use Sinatra on the same server ?
@codextremist Gemfiles are required in the order you define and gems can have order-dependant logic. Alphabetical ordering is a bad idea.
@krainboltgreene some example please
dot-env gem need to be loaded before rails
@misner I do not think he added Sinatra for the sake of adding Sinatra to the project. It's used by other gems such as Resque (check their repo here: https://github.com/resque/resque). You will notice that they are using it to offer you a "nice dashboard".
@dhh any chance of an update to this? would be interesting to see how it's evolved
FAQ:
Q: Why MySQL?
A: https://twitter.com/dhh/status/1275909837793062912