Skip to content

Instantly share code, notes, and snippets.

@jaydorsey
jaydorsey / date_parsing.rb
Created May 12, 2025 16:08
Date parsing alternative
# A lot of times, dates will be handled like this:
#
# parsed_date = Date.parse(maybe_date) rescue nil
#
# This is an alternative, faster strategy that doesn't rely on a catch-all, less performant
# (in error conditions at at least; backtraces aren't generated), rescue behavior
def parse_date_string(maybe_date)
return if maybe_date.blank?
catch(:date) do
@jaydorsey
jaydorsey / docker-compose.yml
Created January 23, 2025 14:30
localstack + opensearch + opensearch-dashboards docker compose
---
# NOTE: This was, for some reason, way too hard for me to piece together quickly
services:
opensearch:
container_name: opensearch
image: opensearchproject/opensearch:latest
environment:
- node.name=opensearch
- cluster.name=opensearch-docker-cluster
@jaydorsey
jaydorsey / active_record_stuff.rb
Last active April 30, 2025 15:01
ActiveRecord stuff
# frozen_string_literal: true
# Brief overview of ActiveRecord preload, eager_load, includes, and joins
# TODO: Add a joins/eager_load example
# TODO: Add actual SQL output for every single one of these
# id
# email
class Foo < ApplicationRecord
@jaydorsey
jaydorsey / change_record_matcher.rb
Created December 2, 2024 14:08
RSpec change record matcher
# frozen_string_literal: true
# This custom matcher is designed to make record changes easy
#
# Without this matcher you'd typically do one of:
#
# # I believe these won't always work, depends on object reloading, what is changed, how it's changed,
# # the order things got loaded, etc.
# expect { update }.to change(foo, :method)...
# expect { update }.to change { foo.method }...
@jaydorsey
jaydorsey / flakey_spec.rb
Created August 21, 2024 13:33
Rescueing a flakey spec to debug
RSpec.describe MyClass do
let(:my_value) { 1 }
let(:other_value) { 2 }
it 'does a thing' do
expect(my_value).to eq(other_value) # failure condition, something flakey though
rescue RSpec::Expectations::ExpectationNotMetError
$ERROR_INFO.message << <<~MSG
@jaydorsey
jaydorsey / ruby_hash_error.md
Created August 16, 2024 13:30
unexpected '\n', expecting =>

Ruby is expecting a Hash, but you forgot something (maybe a key name?)

Example:

# wrong
foo: { # Start of the new hash
  :bar # You're missing your key OR value
}
@jaydorsey
jaydorsey / flakey_spec.rb
Created July 30, 2024 19:28
How to write flakey specs with rails, rspec, factory_bot, and faker
# frozen_string_literal: true
# 1. Put this in your spec folder as spec/flakey_spec.rb
# 2. Run it with `rspec spec/flakey_spec.rb`
#
# Assumptions:
#
# 1. You're using rails, rspec, factory_bot, faker
# 2. You have a standard-ish User model (has create_at, updated_at, etc. integer ID primary key, etc)
# 3. User has a last_name field/column/attribute
@jaydorsey
jaydorsey / factory_example.rb
Last active July 30, 2024 14:48
FactoryBot factories that share a relationship
# frozen_string_literal: true
# I often find myself wanting to codify relationships/associations in a factory by default, so the
# factory doesn't require myself or other engineers to retain the knowledge about the complex relationships
# and define those relationships in every part of the test
#
# In this contrived example, our models are tenant-aware via a company_id FK on each model:
# - Widget belongs_to a company
# - User belongs to a company
# - A widget has a creator; the creator of the widget and the widget itself must belong to the same company
@jaydorsey
jaydorsey / app_models_user.rb
Created March 25, 2024 12:44
Add a Trait to skip callbacks in a FactoryBot factory
# app/models/user.rb
#
class User
after_create :foo
private
def foo
# ..something we don't do very often
end
@jaydorsey
jaydorsey / gist:b56529c2403bf4162cd9e51a025be045
Created February 26, 2024 20:34
Remove annotate gem annotations
For some reason, I couldn't get the annotate gem to remove the file annotations
I used SublimeText w/ the following regex:
Find: `(?s)# == Schema Information\n(.*?)\n((# :nodoc:\n)?class)`
Replace: `class` (just adds back what I grabbed above)