simple_presenter 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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