Skip to content

Instantly share code, notes, and snippets.

@1gor
1gor / app.rb
Created February 16, 2019 13:35 — forked from jgaskins/app.rb
Compositional Components with Clearwater
require 'opal'
require 'clearwater'
require 'profile_page'
class Layout
include Clearwater::Component
def render
ProfilePage.new('yoxtb')
@1gor
1gor / example.rb
Created February 16, 2019 13:32 — forked from jgaskins/example.rb
React Router v4-style routing
require 'opal'
require 'clearwater'
require 'routing'
class Layout
include Clearwater::Component
include Routing
def render
div([
@1gor
1gor / renderable.rb
Created February 16, 2019 13:30 — forked from jgaskins/renderable.rb
"Functional" components in Clearwater
require 'clearwater/component'
# Renderable is just a component factory that makes heavy
# use of Ruby metaprogramming
module Renderable
include Clearwater::Component
# Return a Struct-like component class. It isn't an Enumerable like Structs
# are, but arguments to the factory methods become methods on instances of
# the component.
@1gor
1gor / class.rb
Created February 16, 2019 13:28 — forked from jgaskins/class.rb
Class declarations in Ruby with lexical scopes vs closures
require 'primalize'
# Because TicketOwnerSerializer is a constant, it is available
# anywhere in the app. We could nest it inside of TicketSerializer,
# but it has to exist before TicketSerializer's attributes declaration,
# so it would push that down.
class TicketOwnerSerializer < Primalize::Single
attributes(
id: string,
name: string,
@1gor
1gor / app.rb
Created February 16, 2019 13:27 — forked from jgaskins/app.rb
API app with Roda
require 'authentication'
class MyApp < Roda
include Authentication
plugin :json
route do |r|
r.on('docs') { r.run Docs }
@1gor
1gor / worker.rb
Created February 16, 2019 13:27 — forked from jgaskins/worker.rb
Distribute a large Sidekiq job across many smaller ones
class ProcessThings
include Sidekiq::Worker
def perform(ids: Thing.ids)
ids.each(&Individual.method(:perform_async))
end
class Individual
include Sidekiq::Worker
@1gor
1gor / master_detail_component.rb
Created February 16, 2019 13:26 — forked from jgaskins/master_detail_component.rb
Composable styles in Clearwater
class MasterDetailComponent
include Clearwater::Component
def initialize master, detail
@master = master
@detail = detail
end
def render
div([
@1gor
1gor / gantt_chart.rb
Created February 16, 2019 13:25 — forked from jgaskins/gantt_chart.rb
Nested render caching in Clearwater
class GanttChart
include Clearwater::Component
include Clearwater::CachedRender
attr_reader :tasks
def initialize(tasks)
@tasks = tasks
end
@1gor
1gor / render_promise.rb
Created February 16, 2019 13:21 — forked from jgaskins/render_promise.rb
Rendering a promise with Clearwater
require 'clearwater/black_box_node'
require 'clearwater/component'
require 'clearwater/application'
class RenderPromise
include Clearwater::BlackBoxNode
DEFAULT = proc { Clearwater::Component.span }
Wrapper = Struct.new(:render).include(Clearwater::Component)
@1gor
1gor / hooks.rb
Created February 16, 2019 13:16 — forked from jgaskins/hooks.rb
Hooks implementation for Clearwater
module Hooks
def self.component *attrs, &render
Class.new(Component) do
attr_reader *attrs
define_method :initialize do |**props|
super()
attrs.each { |attr| `self[#{attr}] = #{props[attr]}` }
end