Consul 0.4.0 released

Updated . Posted . Visible to the public.

Consul 0.4.0 comes with some new features.

Dependencies

  • Consul no longer requires assignable_values, it's optional for when you want to use the authorize_values_for macro.
  • Consul no longer uses ActiveSupport::Memoizable because that's deprecated in newer Railses. Consul now uses Memoizer for this.

Temporarily change the current power

When you set Power.current to a power in an RSpec example, you must remember to nilify it afterwards. Otherwise other examples will see your global changes.

A better way is to use the .with_power method to change the current power for the duration of a block:

admin = User.new(:role => 'admin')
admin_power = Power.new(admin)

Power.with_power(admin_power) do
  # run code that uses Power.current
end

Power.current will be nil (or its former value) after the block has ended.

A nice shortcut is that when you call with_power with an argument that is not already a Power, Consul will instantiate a Power for you:

admin = User.new(:role => 'admin')

Power.with_power(admin) do
  # run code that uses Power.current
end

Support for Ruby collections as powers

Powers can now be vanilla Ruby collections such as arrays or sets:

class Power
  ...
  power :key_figures do
    [:amount, :working_costs, :shared_costs] if admin?
  end
  
end

Power.current.key_figures # => [:amount, :working_costs, :shared_costs] for admins
Power.current.key_figures? # => true for admins
Power.current.key_figure?(:amount) # => true for admins
Power.current.key_figure?(:xyz) # => false for everyone
Power.current.key_figures! # does nothing for admins, raises Consul::Powerless otherwise
Power.current.key_figure!(:amount) # does nothing for admins, raises Consul::Powerless otherwise

That means you can also write your assignable_values Show archive.org snapshot value sources like this:

power :key_figures
  [:amount, :working_costs, :shared_costs] if admin?
end

(But you can still use def)

Support for arbitrary Ruby objects as powers

Any Ruby object can now be a power:

class Power
  ...
  power :api_key do
    'secret-123' if admin?
  end
  
end

Power.current.api_key # => 'secret-123' for admins
Power.current.api_key? # => true for admins
Power.current.api_key! # does nothing for admins, raises Consul::Powerless otherwise
Profile picture of Henning Koch
Henning Koch
Last edit
License
Source code in this card is licensed under the MIT License.
Posted by Henning Koch to makandra dev (2012-08-01 13:46)