I hereby claim:
- I am sevos on github.
- I am sevos (https://keybase.io/sevos) on keybase.
- I have a public key ASAnWvwdcqTcBoAhocP3U5ugAXF9rJMkfsh7RVo9CDcOjAo
To claim this, I am signing this object:
I hereby claim:
To claim this, I am signing this object:
| # TODO: ValueObject should be immutable. Setter should return new instance. | |
| class ValueObject < Struct | |
| def self.new(*fields) | |
| all_fields, optional_fields = if fields.last.is_a?(Hash) | |
| optional_fields = fields.pop | |
| [fields + optional_fields.keys, optional_fields] | |
| else | |
| [fields, {}] | |
| end |
| #!/usr/bin/env ruby | |
| # encoding: utf-8 | |
| Person = Struct.new(:name, :email) do | |
| def activate | |
| `git config user.name '#{name}'` | |
| `git config user.email '#{email}'` | |
| end | |
| end |
| require 'spec_helper' | |
| require 'timebacus/use_cases/report_activity' | |
| describe Timebacus::ReportActivity do | |
| context 'with valid data' do | |
| let(:activity) { mock(id: 5, duration: 1800, description: 'remote work') } | |
| mock_const Timebacus::ReportActivity, 'Activity' do |activity_class| | |
| activity_class.stub(new: activity) |
This gist show problem with Ruby 1.9.3 on my Mac OS X Lion (10.7.2).
I've tried RVM and Rbenv+ruby-build. I tried linking with system openssl, rvm-openssl and homebrew-openssl. Even if linking succeeded, the error when requiring digest/sha1 appeared.
Problem with requiring digest/sha1 causes bundler not working at all.
This gist contains:
| module Inviter | |
| def invite(invitee) | |
| open_profile(me) | |
| within ".header" do | |
| fill_in "Invite", with: invitee.email | |
| click_link "Invite" | |
| end | |
| def invite(invitee) | |
| Factory(:invitation, inviter: me, invitee_email: invitee.email) |
| module ApplicationHelper | |
| def present(object, klass = nil) | |
| klass ||= "#{object.class}Presenter".constantize | |
| presenter = klass.new(object, self) | |
| yield presenter if block_given? | |
| presenter | |
| end | |
| end |
| class User | |
| def initialize(context) | |
| @context = context | |
| end | |
| def profile | |
| @context.system.collections.profiles.where(id: @context.session[:current_user_id]).first | |
| end | |
| end |
MVC is not enough for backend apps. It's time for car (t)rap!
C as Context (former controllers). Assigns roles to actors, runs the play.
A as Actor - user, system, external system
R as Role - DCI role injected to Actor by Context. User: [buyer, inviter], system: [shop, blog]
T as Template - html, json, xml, whatever. It's optional, sometimes Presenter does the job
R as Router - we need something parsing requests and passing them to proper context
A as Artifact - product of actor's action. Order, invoice, product, post, profile. Persistence goes here
P as Presenter (former helpers)
| class BasePresenter | |
| def initialize(object, template) | |
| @object = object | |
| @template = template | |
| end | |
| private | |
| def self.inherited(klass) | |
| name = klass.name.match(/(\w+)Presenter/).captures.first.underscore | |
| klass.instance_eval do |