oprah 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 26a96344756574d8119d0171b91825dc5d2cd53f
4
- data.tar.gz: 9ab78bcdfb45de66e8421ab5eba4f6f97af438b7
3
+ metadata.gz: 6048029155d1591854e537043b35c7c72742fd59
4
+ data.tar.gz: c03f08916c9fdc6cbb75b721dac71c61024adfc9
5
5
  SHA512:
6
- metadata.gz: c3becf1ce157b8ada831fe4c016b2135a266fb09ed1d9a1beebf23c06edd571c19ecfd6fe118b54a79029656213c79b281606c7037e69aaa8eaac72d874fe316
7
- data.tar.gz: 159bd51082ddfb1d43ab193d692d1aecb2db132c9101929d613aebaa90c4d84d82e8a3bb46c6aa9ba5bd5caae9a4a7a00dbfde8478bf842c76bcd7086e08358c
6
+ metadata.gz: 80f6c0a2e13ba81d6e959a9bc8230bd086e95fa2aa971a3ca0a6c4a15c2522a69b0f091efb739d1443d7af860315043665bdecccbdebf87edf3b3a0907422af3
7
+ data.tar.gz: 22b8e7a0bbd4bbf8a97d20acf4b8cbe6d54aa3323dfe6c92b01fa8be629a526dd3bcb3a39e7cf5f064a583f6662606638ad98db27b5b5da05af0e9a220aebeb5
@@ -1,3 +1,10 @@
1
+ 0.3.0
2
+ -----
3
+
4
+ - Presenter now inherits from SimpleDelegator
5
+ - Support for anonymous ancestors [#9]
6
+
7
+
1
8
  0.2.1
2
9
  -----
3
10
 
data/README.md CHANGED
@@ -35,7 +35,7 @@ locate, hard to test and not terribly expressive.
35
35
  So why another presenter/decorator library? Oprah was written with a few simple
36
36
  goals in mind only covered partially (or not at all) by other gems:
37
37
 
38
- - Lightweight
38
+ - Thin, lightweight layer over Ruby's `SimpleDelegator`
39
39
  - Presenters should be easy to test
40
40
  - Avoid monkey patching, where possible :monkey::gun:
41
41
  - Embrace convention over configuration
@@ -1,6 +1,5 @@
1
1
  # stdlib
2
- require 'forwardable'
3
- require 'singleton'
2
+ require 'delegate'
4
3
 
5
4
  # gems
6
5
  require 'active_support/cache'
@@ -1,10 +1,5 @@
1
1
  module Oprah
2
- class Presenter
3
- extend Forwardable
4
-
5
- # @return [Object] The presented object
6
- attr_reader :object
7
-
2
+ class Presenter < SimpleDelegator
8
3
  # @return [ActionView::Base] The view context
9
4
  attr_reader :view_context
10
5
 
@@ -13,14 +8,6 @@ module Oprah
13
8
  # @!visibility private
14
9
  @@cache = ActiveSupport::Cache::MemoryStore.new
15
10
 
16
- # @!method inspect
17
- # @see Object#inspect
18
- # @return [String]
19
- # @!method to_s
20
- # @see Object#to_s
21
- # @return [String]
22
- def_delegators :@object, :inspect, :to_s
23
-
24
11
  class << self
25
12
  # Returns the shared presenter cache object.
26
13
  #
@@ -38,7 +25,7 @@ module Oprah
38
25
  # @return [Presenter] Presented object
39
26
  def present(object, view_context: default_view_context, only: nil)
40
27
  presenters = presenter_classes_for(object)
41
- presenters = presenters & (only.kind_of?(Array) ? only : [only]) if only
28
+ presenters &= Array(only) if only
42
29
 
43
30
  presenters.inject(object) do |memo, presenter|
44
31
  presenter.new(memo, view_context: view_context)
@@ -60,11 +47,13 @@ module Oprah
60
47
  # Presenters will re-use the parent's assigned view context.
61
48
  #
62
49
  # @param association [Symbol] Name of the association
63
- # @return [Boolean]
50
+ # @return [Symbol] Name of the association
64
51
  def presents_one(association)
65
52
  define_method association do
66
- present(object.__send__(association), view_context: view_context)
53
+ present(__getobj__.__send__(association))
67
54
  end
55
+
56
+ association
68
57
  end
69
58
 
70
59
  # Automatically wrap the objects returned by the given one-to-many
@@ -73,13 +62,13 @@ module Oprah
73
62
  # Presenters will re-use the parent's assigned view context.
74
63
  #
75
64
  # @param association [Symbol] Name of the association
76
- # @return [Boolean]
65
+ # @return [Symbol] Name of the association
77
66
  def presents_many(association)
78
67
  define_method association do
79
- present_many(object.__send__(association), view_context: view_context)
68
+ present_many(__getobj__.__send__(association))
80
69
  end
81
70
 
82
- true
71
+ association
83
72
  end
84
73
 
85
74
  # Returns the default view context to use if no view context is explicitly
@@ -97,8 +86,8 @@ module Oprah
97
86
  klass = object.class
98
87
 
99
88
  @@cache.fetch klass.name do
100
- klass.ancestors.map do |klass|
101
- (klass.name + "Presenter").safe_constantize
89
+ klass.ancestors.map do |ancestor|
90
+ (ancestor.name + "Presenter").safe_constantize if ancestor.name
102
91
  end.compact.reverse
103
92
  end
104
93
  end
@@ -109,19 +98,10 @@ module Oprah
109
98
  # @param object [Object] The object to present
110
99
  # @param view_context [ActionView::Context] View context to assign
111
100
  def initialize(object, view_context: self.class.default_view_context)
112
- @object = object
101
+ __setobj__(object)
113
102
  @view_context = view_context
114
103
  end
115
104
 
116
- # Delegates all method calls not handled by the presenter to `object`.
117
- def method_missing(meth, *args, &block)
118
- if respond_to?(meth)
119
- object.__send__(meth, *args, &block)
120
- else
121
- super
122
- end
123
- end
124
-
125
105
  # Presents a single object.
126
106
  #
127
107
  # Will re-use the presenter's assigned view context if no `view_context`:
@@ -144,43 +124,26 @@ module Oprah
144
124
  self.class.present_many(*args, **kwargs, &block)
145
125
  end
146
126
 
147
- # Returns true if either `object` or `self` responds to the given method
148
- # name.
149
- #
150
- # @param method [Symbol] Name of the method
151
- # @param include_private [Boolean] Whether to include private methods
152
- # @return [Boolean] result
153
- def respond_to?(method, include_private = false)
154
- super || object.respond_to?(method, include_private)
155
- end
156
-
157
- # Returns true if `klass` is the class of `object` or the presenter, or
158
- # if `#class` is one of the superclasses of `object`, the presenter or
159
- # modules included in `object` or the presenter.
127
+ # Returns true if `klass` is the class of the presented object or the
128
+ # presenter, or if `#class` is one of the superclasses of the presented
129
+ # object, the presenter or modules included in the presented object or the
130
+ # presenter.
160
131
  #
161
132
  # @param other [Module]
162
133
  # @return [Boolean] result
163
134
  def kind_of?(other)
164
- super || object.kind_of?(other)
135
+ super || __getobj__.kind_of?(other)
165
136
  end
166
137
 
167
138
  alias :is_a? :kind_of?
168
139
 
169
- # Returns `true` if `object` or the presenter is an instance of the given
170
- # `class`.
140
+ # Returns `true` if the presented object or the presenter is an instance
141
+ # of the given `class`.
171
142
  #
172
143
  # @param klass [Class]
173
144
  # @return [Boolean] result
174
145
  def instance_of?(klass)
175
- super || object.instance_of?(klass)
176
- end
177
-
178
- # Returns `true` if `object` or the presenter tests positive for equality.
179
- #
180
- # @param other [Object]
181
- # @return [Boolean] result
182
- def ==(other)
183
- super || object == other
146
+ super || __getobj__.instance_of?(klass)
184
147
  end
185
148
  end
186
149
  end
@@ -1,4 +1,4 @@
1
1
  module Oprah
2
2
  # @return [String] The Oprah library version.
3
- VERSION = "0.2.1"
3
+ VERSION = "0.3.0"
4
4
  end
@@ -72,4 +72,13 @@ module Fixtures
72
72
  presents_many :comments
73
73
  presents_one :owner
74
74
  end
75
+
76
+ # EigenUser contains eigen class in ancestors list.
77
+ #
78
+ # > EigenUser.ancestors
79
+ # => [Fixtures::EigenUser, #<Module:0x007faa79b128f0>, Object, ... , Kernel, BasicObject]
80
+ #
81
+ class EigenUser
82
+ include Module.new
83
+ end
75
84
  end
@@ -14,6 +14,10 @@ module Oprah
14
14
  assert_presented present(User.new)
15
15
  end
16
16
 
17
+ def test_present_with_eigenclass
18
+ assert_equal false, present(EigenUser.new).nil?
19
+ end
20
+
17
21
  def test_present_no_matching_presenter
18
22
  object = Object.new
19
23
  presented = present(object)
@@ -50,6 +54,8 @@ module Oprah
50
54
  project.comments.each do |comment|
51
55
  assert_kind_of Comment, comment
52
56
  assert_kind_of CommentPresenter, comment
57
+ assert_equal project.view_context.object_id,
58
+ comment.view_context.object_id
53
59
  end
54
60
  end
55
61
 
@@ -91,6 +97,8 @@ module Oprah
91
97
 
92
98
  assert_kind_of UserPresenter, owner
93
99
  assert_kind_of User, owner
100
+ assert_equal project.view_context.object_id,
101
+ owner.view_context.object_id
94
102
  end
95
103
 
96
104
  def test_presenter_stack_ordering
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oprah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Svensson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-25 00:00:00.000000000 Z
11
+ date: 2016-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport