simple_presenter 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_presenter (0.1.2)
4
+ simple_presenter (0.1.3)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -16,17 +16,17 @@ GEM
16
16
  ruby_parser (>= 2.3.1)
17
17
  slop (~> 2.1.0)
18
18
  rake (0.9.2.2)
19
- rspec (2.7.0)
20
- rspec-core (~> 2.7.0)
21
- rspec-expectations (~> 2.7.0)
22
- rspec-mocks (~> 2.7.0)
23
- rspec-core (2.7.1)
24
- rspec-expectations (2.7.0)
19
+ rspec (2.8.0)
20
+ rspec-core (~> 2.8.0)
21
+ rspec-expectations (~> 2.8.0)
22
+ rspec-mocks (~> 2.8.0)
23
+ rspec-core (2.8.0)
24
+ rspec-expectations (2.8.0)
25
25
  diff-lcs (~> 1.1.2)
26
- rspec-mocks (2.7.0)
26
+ rspec-mocks (2.8.0)
27
27
  ruby_parser (2.3.1)
28
28
  sexp_processor (~> 3.0)
29
- sexp_processor (3.0.9)
29
+ sexp_processor (3.0.10)
30
30
  slop (2.1.0)
31
31
 
32
32
  PLATFORMS
@@ -8,8 +8,8 @@ module SimplePresenter
8
8
  #
9
9
  # class CommentPresenter < Presenter
10
10
  # subjects :comment, :post
11
- # expose :body # will expose comment.body
12
- # expose :title, :with => :post # will expose post.title
11
+ # expose :body # will expose comment.body through CommentPresenter#body
12
+ # expose :title, :with => :post # will expose post.title through CommentPresenter#post_title
13
13
  # end
14
14
  #
15
15
  def self.subjects(*names)
@@ -22,6 +22,32 @@ module SimplePresenter
22
22
  alias_method :subject, :subjects
23
23
  end
24
24
 
25
+ # Propagate inherited subjects and attributes.
26
+ #
27
+ def self.inherited(child)
28
+ child.subjects(*subjects)
29
+ attributes.each_value do |attr_name, options|
30
+ child.expose(attr_name, options)
31
+ end
32
+ end
33
+
34
+ # Store all attributes and options that have been exposed.
35
+ #
36
+ # class UserPresenter < Presenter
37
+ # expose :name
38
+ # expose :street, with: "address"
39
+ # end
40
+ #
41
+ # UserPresenter.attributes
42
+ # #=> {
43
+ # #=> name: [:name, {}],
44
+ # #=> address_street: [:street, {with: "address"}]
45
+ # #=> }
46
+ #
47
+ def self.attributes
48
+ @attributes ||= {}
49
+ end
50
+
25
51
  # This method will return a presenter for each item of collection.
26
52
  #
27
53
  # users = UserPresenter.map(User.all)
@@ -57,6 +83,7 @@ module SimplePresenter
57
83
  attrs.each do |attr_name|
58
84
  subject = options.fetch(:with, nil)
59
85
  method_name = [subject, attr_name].compact.join("_")
86
+ attributes[method_name.to_sym] = [attr_name, options]
60
87
 
61
88
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
62
89
  def #{method_name}(&block) # def user_name(&block)
@@ -2,7 +2,7 @@ module SimplePresenter
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- PATCH = 2
5
+ PATCH = 3
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
8
8
  end
data/spec/base_spec.rb CHANGED
@@ -30,6 +30,26 @@ describe SimplePresenter::Base do
30
30
  end
31
31
  end
32
32
 
33
+ describe ".attributes" do
34
+ context "using defaults" do
35
+ let(:presenter) { UserPresenter }
36
+ subject { presenter.attributes }
37
+
38
+ it { should have(2).items }
39
+ its([:name]) { should eql([:name, {}]) }
40
+ its([:email]) { should eql([:email, {}]) }
41
+ end
42
+
43
+ context "using provided options" do
44
+ let(:presenter) { CommentPresenter }
45
+ subject { presenter.attributes }
46
+
47
+ it { should have(3).items }
48
+ its([:user_name]) { should eql([:name, {with: :user}]) }
49
+ its([:post_title]) { should eql([:title, {with: :post}]) }
50
+ end
51
+ end
52
+
33
53
  describe ".subjects" do
34
54
  it "is aliased as .subject" do
35
55
  thing = mock("Thing")
@@ -96,4 +116,24 @@ describe SimplePresenter::Base do
96
116
  subject.instance_variable_get("@subject").should == user
97
117
  end
98
118
  end
119
+
120
+ describe "inherited presenter" do
121
+ let(:presenter) { Class.new(CommentPresenter) }
122
+
123
+ context "subjects" do
124
+ subject { presenter.subjects }
125
+
126
+ specify { subject.should have(2).items }
127
+ specify { subject.first.should eql(:comment) }
128
+ specify { subject.last.should eql(:post) }
129
+ end
130
+
131
+ context "attributes" do
132
+ subject { presenter.attributes }
133
+
134
+ it { should have(3).items }
135
+ its([:user_name]) { should eql([:name, {with: :user}]) }
136
+ its([:post_title]) { should eql([:title, {with: :post}]) }
137
+ end
138
+ end
99
139
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-28 00:00:00.000000000 Z
12
+ date: 2012-01-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70152287621280 !ruby/object:Gem::Requirement
16
+ requirement: &70320251210820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70152287621280
24
+ version_requirements: *70320251210820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70152287620700 !ruby/object:Gem::Requirement
27
+ requirement: &70320251209440 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.7'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70152287620700
35
+ version_requirements: *70320251209440
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pry
38
- requirement: &70152287620200 !ruby/object:Gem::Requirement
38
+ requirement: &70320251208760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70152287620200
46
+ version_requirements: *70320251208760
47
47
  description: A simple presenter/facade/decorator/whatever implementation.
48
48
  email:
49
49
  - fnando.vieira@gmail.com
@@ -85,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
85
85
  version: '0'
86
86
  segments:
87
87
  - 0
88
- hash: -545131197897244804
88
+ hash: 3392146763706068876
89
89
  required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  none: false
91
91
  requirements:
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  version: '0'
95
95
  segments:
96
96
  - 0
97
- hash: -545131197897244804
97
+ hash: 3392146763706068876
98
98
  requirements: []
99
99
  rubyforge_project:
100
100
  rubygems_version: 1.8.11