Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion lib/perspectives/properties.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ def _resolve_partial_class_name(name)
Perspectives.resolve_partial_class_name(self.class.to_s.split('::').first, name)
end

def _default_collection_param_name(collection_class)
if collection_class.respond_to?(:base_class)
collection_class.base_class.demodulize.downcase
else
collection_class.name.demodulize.downcase
end
end

module ClassMethods
def property(name, *names, &block)
unless names.empty?
Expand Down Expand Up @@ -108,7 +116,10 @@ def _setup_nested(name, locals, options, &block)
collection = instance_exec(self, &options[:collection])
return unless collection.present?

as = options.fetch(:as, collection.first.class.base_class.name.downcase).to_sym
default_as_name = _default_collection_param_name(collection.first.class)

as = options.fetch(:as, default_as_name).to_sym

Collection.new(collection.map { |o| klass.new(context, realized_locals.merge(as => o)) })
else
klass.new(context, realized_locals)
Expand Down
33 changes: 32 additions & 1 deletion spec/lib/perspectives/properties_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ class Properties < Perspectives::Base
property(:name) { user.name }

nested 'profile'

nested_collection '/some_name_space/groups/show',
collection: proc { user.groups },
property: :groups
end
end

Expand All @@ -17,15 +21,42 @@ class Profile < Perspectives::Base
end
end

module ::SomeNameSpace
class Group
def name
"a group"
end
end
module Groups
class Show < Perspectives::Base
param :group
end
end
end

let(:context) { {} }
let(:name) { 'Andrew Warner' }
let(:blog_url) { 'a-warner.github.io' }
let(:user) { OpenStruct.new :name => name }
let(:groups) do
[
SomeNameSpace::Group.new,
SomeNameSpace::Group.new
]
end
let(:user) do
OpenStruct.new :name => name, :groups => groups
end

let(:params) { {:user => user} }

subject { ::Users::Properties.new(context, params) }

its(:name) { should == 'Andrew Warner' }
its(:profile) { should_not be_nil }

describe '#groups' do
it 'should return a non-nil value' do
expect(subject.groups).not_to be_nil
end
end
end