Skip to content

Commit

Permalink
Merge pull request #203 from robertasg/master
Browse files Browse the repository at this point in the history
Enable value resolving for Hashes and the parameters option.
  • Loading branch information
pokonski committed Mar 13, 2015
2 parents 36d4d4e + cac8b09 commit 234a03b
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 15 deletions.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,21 @@ class Comment < ActiveRecord::Base
end
```

### Resolve parameters from a Symbol or Proc

```ruby
class Post < ActiveRecord::Base
include PublicActivity::Model
tracked only: [:update], parameters: :tracked_values
def tracked_values
{}.tap do |hash|
hash[:tags] = tags if tags_changed?
end
end
end
```

#### Setup

**Skip this step if you are using ActiveRecord in Rails 4 or Mongoid**
Expand Down
19 changes: 14 additions & 5 deletions lib/public_activity/common.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ def self.resolve_value(context, thing)
context.__send__(thing)
when Proc
thing.call(PublicActivity.get_controller, context)
when Hash
thing.dup.tap do |hash|
hash.each do |key, value|
hash[key] = PublicActivity.resolve_value(context, value)
end
end
else
thing
end
Expand Down Expand Up @@ -242,13 +248,16 @@ def prepare_custom_fields(options)
end

# Prepares i18n parameters that will
# be serialized into the Activity#parameters column
# be serialized into the Activity#parameters column.
# If a Symbol or a Proc is passed, it will be resolved
# expecting to return a Hash.
# @api private
def prepare_parameters(parameters)
params = {}
params.merge!(self.class.activity_parameters_global)
.merge!(parameters || {})
params.each { |k, v| params[k] = PublicActivity.resolve_value(self, v) }
parameters ||= {}

[self.class.activity_parameters_global, parameters].reduce({}) do |params, value|
params.merge!(PublicActivity.resolve_value(self, value))
end
end

# Prepares relation to be saved
Expand Down
50 changes: 40 additions & 10 deletions test/test_common.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,15 @@
subject.activities.last.nonstandard.must_equal "true"
end

it 'allows resolving parameters' do
subject.save
subject.expects(:custom_parameters).returns({ type: 'News' })

subject.create_activity :update, parameters: :custom_parameters

subject.activities.last.parameters[:type].must_equal 'News'
end

it 'accepts owner as a symbol' do
klass = article(:owner => :user)
@article = klass.new(:user => @owner)
Expand Down Expand Up @@ -121,22 +130,43 @@ def self.name; 'MyNamespace::CamelCase' end
end

# no key implicated or given
specify { ->{subject.prepare_settings}.must_raise PublicActivity::NoKeyProvided }
specify { -> { subject.prepare_settings }.must_raise PublicActivity::NoKeyProvided }

describe 'resolving values' do
let(:context) { mock('context') }
let(:controller) { mock('controller') }
let(:closure) do
proc do |controller, model|
assert_equal :cu, controller.current_user
assert_equal 5, model.accessor
end
end

before do
PublicActivity.set_controller(controller)
end

it 'allows procs with models and controllers' do
context = mock('context')
context.expects(:accessor).times(2).returns(5)
controller = mock('controller')
controller.expects(:current_user).returns(:cu)
PublicActivity.set_controller(controller)
p = proc {|controller, model|
assert_equal :cu, controller.current_user
assert_equal 5, model.accessor
}
PublicActivity.resolve_value(context, p)

PublicActivity.resolve_value(context, closure)
PublicActivity.resolve_value(context, :accessor)
end
end

describe 'passing hash values' do
it 'allows procs with controllers' do
context.expects(:accessor).returns(5)
controller.expects(:current_user).returns(:cu)

PublicActivity.resolve_value(context, { value: closure }).must_equal({ value: true })
end

it 'allows symbols' do
context.expects(:accessor).returns(5)

PublicActivity.resolve_value(context, { value: :accessor }).must_equal({ value: 5 })
end
end
end
end

0 comments on commit 234a03b

Please sign in to comment.