Skip to content

Instantly share code, notes, and snippets.

View kaspth's full-sized avatar

Kasper Timm Hansen kaspth

View GitHub Profile
@kaspth
kaspth / method_chain.rb
Created December 18, 2022 17:48
A half written-up implementation of progressively enhancing an options hash through method chaining on a context object.
class Method::Chain
def initialize(descriptor, **options)
@descriptor, @options = descriptor, options
end
def self.define(context, *methods, &block)
instance = new Definition.new(&block)
instance.apply context, *methods
instance
end
# app/controllers/feeds_controller.rb
class FeedsController < ApplicationController
before_action :set_feed
def show
# Not sure if I like this but there could be something similar to interactors?
action do
_1.success.html { redirect_to @feed, notice: "Success" }
_1.success.json
_1.unprocessible { render :new }
# Add a module builder that'll mask each class method?
def self.required_condition_via(scopes)
prepend RequiredCondition.new(scopes)
end
module RequiredCondition
def initialize(scopes)
@scopes = scopes
end
@kaspth
kaspth / routes.rb
Last active April 6, 2023 16:57
`draw` method to explore routes in the console
# All these requires are just for running via `irb`, if using `bin/rails console` you probably just need the method.
require "active_support/all" # Got an inflector NoMethodError, so I'm just being lazy here.
require "action_dispatch"
require "action_dispatch/routing/route_set"
require "action_dispatch/routing/inspector"
require "action_controller" # For the ActionController::Parameters autoload, which any route helper uses.
# Console helper play around with the routing DSL and tweak an individual route you're building.
@kaspth
kaspth / scope_with_class_methods.rb
Created July 1, 2022 11:22
`scope` extension to allow marking a class method as a scope.
# In Active Record, class method scopes have to remember to return `all` otherwise they're break the call chain.
#
# def self.some_scope = nil # Assume more complex conditions that would result in a branch that accidentally didn't return `all`.
#
# User.some_scope.first # => raises NoMethodError `first' for NilClass
#
# Note: Active Record ensures a `scope :some_scope, -> { nil }` returns `all` via `|| all` here:
# https://github.com/rails/rails/blob/c704da66de59262f4e88824589ae4eddefb6ed4a/activerecord/lib/active_record/scoping/named.rb#L181
#
# Now, this extension allows you to mark a class method as a scope, so you don't have to remember and the code is more clearly demarcated too.
@kaspth
kaspth / output.rb
Last active June 6, 2019 21:30
Playground: test `segment` as a more broad `partition`.
# Ruby's Enumerable has `partition` to split it into true and false groups.
evens, odds = 1.upto(5).partition(&:even?)
evens # => [ 2, 4 ]
odds # => [ 1, 3, 5 ]
# But what if you have more than 2 segments? Well, here I'm playing with one way to do it.
# Respectively outputs:
# [[:first, :first], [:second, :second], [:third, :third]]
# [[:first, :first], [:second, :third, :second, :third]]
@kaspth
kaspth / after_runnable.rb
Created September 14, 2017 16:49
`Minitest.after_runnable` callbacks to execute after every test class method has been run… it might even work!
# minitest uses Gem.find_files, so this should be somewhere on the load path:
# $LOAD_PATH/minitest/after_runnable_plugin.rb
class Minitest
class AfterRunnableReporter < AbstractReporter
def initialize(after_runnable, methods)
@after_runnable, @methods = after_runnable, methods
end
def prerecord(klass, name)
@methods[klass].delete(name)
@kaspth
kaspth / upgrade_encrypted_secrets.rb
Last active December 6, 2022 12:23
A script to update encrypted secrets to use improved encryption.
# Download this to your Rails app directory and run with:
# bin/rails runner upgrade_encrypted_secrets.rb
# Everything below here is private API and not something your app should use.
Rails::Secrets.singleton_class.prepend Module.new {
def decrypt(data)
cipher = OpenSSL::Cipher.new("aes-256-cbc").decrypt
cipher.key = key
cipher.update(data) << cipher.final
end
# This:
class String
def to_proc
split('.').to_proc
end
end
class Array
def to_proc
lambda do |obj|
@kaspth
kaspth / Event.m
Last active August 29, 2015 13:57 — forked from sdbeng/Event.m
#import "Event.h"
#import "AFNetworking.h" // it does not depend of AFNetworking at the moment, so I'd delete it
@implementation Event
// change the id here to instancetype, read more here http://nshipster.com/instancetype/
- (id)init
{
return [self initWithTitle:@"defaultTitle" detail:@"defaultDetail"]; // don't need to assign self
}