Skip to content

Instantly share code, notes, and snippets.

View baweaver's full-sized avatar
📝
Documenting things

Brandon Weaver baweaver

📝
Documenting things
View GitHub Profile
@baweaver
baweaver / code_migration_hypothetical.rb
Created March 9, 2022 07:05
Experimentation on what a code migration syntax might look like, ideally
module CodeMigrations
# Number isn't important, vague syntax, and not all
# of these are specifically Rails examples
version from: 4.0, to: 5.0
# The easiest case, literally A to B direct translation.
class FilterToAction < Migration
expect_translation(
"after_filter" => "after_action",
# ...snipped excess for example
@baweaver
baweaver / tree_difference.rb
Last active February 16, 2022 08:43
Tree differences, naive initial version, need to see if there's a nicer way to approach this....
require "rubocop"
def tree_distance(object_a, object_b)
tree_distance_matrix(object_a, object_b).last.last
end
def tree_distance_matrix(object_a, object_b)
a_size, b_size = object_a.size, object_b.size
# Rows and columns ascend from 0 to size + 1
@baweaver
baweaver / proc_ast_sql.rb
Created February 3, 2022 09:56
Proc to AST applied to potential foundation for SQL hackery
require 'proc_to_ast'
def where(&fn)
ast = fn.to_ast
source = fn.to_source
pp ast:, source:
end
where { age > 18 && occupation.downcase == 'plumber' }
@baweaver
baweaver / ruby_without_e.rb
Created February 2, 2022 02:10
I present to you a horror from the depths, programming Ruby without the letter "e"
c = '' << 101
SUB = /___/
subs = -> s { s.gsub(SUB, c) }
fn = "/tmp/runs.rb"
# Patch it in for fun
`#{c}cho 'alias run #{subs['___val']}' > #{fn}`
load fn
mm = <<~ABC
# Pattern to match a link: <a/>
node in { name: 'a' }
# Pattern for a link with a class: <a class="foo"/>
node in { name: 'a', class: 'foo' }
# Pattern to select that link: <a class="foo">{.}</a>
node => { name: 'a', class: 'foo', children: }
# Pattern to select the target URL: <a class="foo" href="{.}"/>
@baweaver
baweaver / html_rb.rb
Last active August 3, 2021 19:58
Quick HTML builder idea
module HTML
VALID_TAGS = %i(html p div span a ol ul li strong em table thead tr td th tbody article aside)
SELF_CLOSING_TAGS = %i(img br hr)
# Evaluates a block passed to it for HTML tags. This is done to isolate
# defined tag methods from the outside world, hence `instance_eval` to
# evaluate that block in the context of an HTML structure.
class Evaluator
attr_reader :contents
require 'benchmark/ips'
class TimeFilter
attr_reader :start, :finish
def initialize(start, finish)
@start = start
@finish = finish
end
@baweaver
baweaver / ruby_galaxy_poker_pattern_matching.rb
Created January 28, 2021 19:53
Variant of pattern matching example from RubyGalaxy talk
class Card
SUITS = %w(S H D C).freeze
RANKS = %w(2 3 4 5 6 7 8 9 10 J Q K A).freeze
RANKS_SCORES = RANKS.each_with_index.to_h
include Comparable
attr_reader :suit, :rank
def initialize(suit, rank)
@baweaver
baweaver / serializer_benchmarks.rb
Created March 19, 2021 06:04 — forked from aishfenton/serializer_benchmarks.rb
Performance comparison of different ruby serializer methods
# sudo gem install bson
# sudo gem install bson_ext
# sudo gem install yajl-ruby
# sudo gem install json
# sudo gem install msgpack
require 'rubygems'
require 'benchmark'
require 'yaml'
require 'bson'
divisible_by = -> n, v { v % n == 0 }.curry
(1..100).each { |v|
puts case v
when divisible_by[15] then 'FizzBuzz'
when divisible_by[3] then 'Fizz'
when divisible_by[5] then 'Buzz'
else
v
end