oprah 0.1.3 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -8
- data/lib/oprah.rb +2 -1
- data/lib/oprah/presenter.rb +16 -3
- data/lib/oprah/railtie.rb +5 -1
- data/lib/oprah/version.rb +1 -1
- data/test/controllers/posts_controller_test.rb +0 -1
- data/test/helper.rb +7 -0
- data/test/oprah/presenter_test.rb +1 -1
- data/test/oprah/railtie_test.rb +18 -0
- metadata +4 -3
- data/lib/oprah/cache.rb +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba7c8bb10a7c5315fa5db9c50d99e67b1ad8cccd
|
4
|
+
data.tar.gz: 427b1dde4525a16e5f0c1120c0a1d810bd74bf0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35f838726cbab68a99dce830b8252c7e707cb2c093935073ad35eb54aeba6ad108adb544167f4e990dbf093f9dbbb253f5e5700e5448958cc4220167e9b1f2d0
|
7
|
+
data.tar.gz: 3986a517a7d8619255e805a922eedf63ff20b5bd5cdad8b36b83b8b0aafa5f13cb89a05d0353ecb914907c39131c5d06cc5433be300a59a270747e83665cc8fa
|
data/CHANGELOG.md
CHANGED
@@ -1,20 +1,25 @@
|
|
1
|
+
0.2.0
|
2
|
+
-----
|
3
|
+
|
4
|
+
- Replace `Oprah::Cache` with `ActiveSupport::Cache::MemoryStore` [#3]
|
5
|
+
|
1
6
|
0.1.3
|
2
7
|
-----
|
3
8
|
|
4
|
-
- Presenters can now be specified using the `only:` keyword
|
5
|
-
|
9
|
+
- Presenters can now be specified using the `only:` keyword argument, which
|
10
|
+
takes either a Class or an Array of classes
|
6
11
|
- Replace repeated method default arguments with splats
|
7
12
|
- Add assertions to TestHelper
|
8
|
-
- Delegate to most recent view context in presenters created
|
9
|
-
|
10
|
-
- Add
|
13
|
+
- Delegate to most recent view context in presenters created from within Rails
|
14
|
+
controllers [#1]
|
15
|
+
- Add `#present` and `#present_many` methods to Presenter [#2]
|
11
16
|
|
12
17
|
0.1.2
|
13
18
|
-----
|
14
19
|
|
15
|
-
- Explicitly rescue NameError in Cache#presenter_classes_for
|
16
|
-
- Add Oprah::TestHelpers
|
17
|
-
- Delegate
|
20
|
+
- Explicitly rescue `NameError` in `Cache#presenter_classes_for`
|
21
|
+
- Add `Oprah::TestHelpers`
|
22
|
+
- Delegate `#to_s` and `#inspect` to the presented object
|
18
23
|
|
19
24
|
0.1.1
|
20
25
|
-----
|
data/lib/oprah.rb
CHANGED
@@ -3,13 +3,13 @@ require 'forwardable'
|
|
3
3
|
require 'singleton'
|
4
4
|
|
5
5
|
# gems
|
6
|
+
require 'active_support/cache'
|
6
7
|
require 'active_support/concern'
|
7
8
|
require 'active_support/inflector'
|
8
9
|
require 'active_support/proxy_object'
|
9
10
|
require 'action_controller'
|
10
11
|
|
11
12
|
# internal
|
12
|
-
require 'oprah/cache'
|
13
13
|
require 'oprah/controller_helpers'
|
14
14
|
require 'oprah/presenter'
|
15
15
|
require 'oprah/version'
|
@@ -41,3 +41,4 @@ module Oprah
|
|
41
41
|
|
42
42
|
extend self
|
43
43
|
end
|
44
|
+
|
data/lib/oprah/presenter.rb
CHANGED
@@ -11,7 +11,7 @@ module Oprah
|
|
11
11
|
alias :h :view_context
|
12
12
|
|
13
13
|
# @!visibility private
|
14
|
-
@@cache =
|
14
|
+
@@cache = ActiveSupport::Cache::MemoryStore.new
|
15
15
|
|
16
16
|
# @!method inspect
|
17
17
|
# @see Object#inspect
|
@@ -24,7 +24,7 @@ module Oprah
|
|
24
24
|
class << self
|
25
25
|
# Returns the shared presenter cache object.
|
26
26
|
#
|
27
|
-
# @return [Cache]
|
27
|
+
# @return [ActiveSupport::Cache::MemoryStore]
|
28
28
|
def cache
|
29
29
|
@@cache
|
30
30
|
end
|
@@ -37,7 +37,7 @@ module Oprah
|
|
37
37
|
# @param only [Class] Class or Array of presenters to use
|
38
38
|
# @return [Presenter] Presented object
|
39
39
|
def present(object, view_context: default_view_context, only: nil)
|
40
|
-
presenters =
|
40
|
+
presenters = presenter_classes_for(object)
|
41
41
|
presenters = presenters & (only.kind_of?(Array) ? only : [only]) if only
|
42
42
|
|
43
43
|
presenters.inject(object) do |memo, presenter|
|
@@ -89,6 +89,19 @@ module Oprah
|
|
89
89
|
def default_view_context
|
90
90
|
ActionController::Base.new.view_context
|
91
91
|
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
# @since 0.2.0
|
96
|
+
def presenter_classes_for(object)
|
97
|
+
klass = object.class
|
98
|
+
|
99
|
+
@@cache.fetch klass.name do
|
100
|
+
klass.ancestors.map do |klass|
|
101
|
+
(klass.name + "Presenter").safe_constantize
|
102
|
+
end.compact.reverse
|
103
|
+
end
|
104
|
+
end
|
92
105
|
end
|
93
106
|
|
94
107
|
# Initializes a new Presenter.
|
data/lib/oprah/railtie.rb
CHANGED
@@ -4,7 +4,11 @@ module Oprah
|
|
4
4
|
class Railtie < Rails::Railtie
|
5
5
|
initializer "oprah.configure_cache_clear_on_code_reload" do
|
6
6
|
ActiveSupport::Reloader.to_run do
|
7
|
-
Oprah::Presenter.cache.clear
|
7
|
+
Oprah::Presenter.cache.clear
|
8
|
+
|
9
|
+
if Oprah.debug?
|
10
|
+
Rails.logger.debug "Oprah cache cleared"
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
10
14
|
|
data/lib/oprah/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'minitest/pride'
|
3
3
|
require 'oprah'
|
4
|
+
require 'oprah/railtie'
|
4
5
|
require 'oprah/test_helpers'
|
6
|
+
require 'dummy/init'
|
5
7
|
|
6
8
|
class Minitest::Test
|
7
9
|
include Oprah::TestHelpers
|
10
|
+
|
11
|
+
def setup
|
12
|
+
super
|
13
|
+
Oprah::Presenter.cache.clear
|
14
|
+
end
|
8
15
|
end
|
9
16
|
|
10
17
|
module Fixtures
|
@@ -5,7 +5,7 @@ module Oprah
|
|
5
5
|
include Fixtures
|
6
6
|
|
7
7
|
def test_cache
|
8
|
-
assert_kind_of
|
8
|
+
assert_kind_of ActiveSupport::Cache::MemoryStore, Presenter.cache
|
9
9
|
assert_equal Presenter.cache, Presenter.cache
|
10
10
|
assert_equal UserPresenter.cache, Presenter.cache
|
11
11
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module Oprah
|
4
|
+
class RailtieTest < Minitest::Test
|
5
|
+
include Fixtures
|
6
|
+
|
7
|
+
def test_cache_invalidation
|
8
|
+
present User.new
|
9
|
+
refute_nil Presenter.cache.fetch(User.name)
|
10
|
+
Rails.application.reloader.reload!
|
11
|
+
assert_nil Presenter.cache.fetch(User.name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_controller_helper_inclusion
|
15
|
+
assert_includes ActionController::Base, ControllerHelpers
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
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.
|
4
|
+
version: 0.2.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-
|
11
|
+
date: 2016-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -152,7 +152,6 @@ files:
|
|
152
152
|
- README.md
|
153
153
|
- Rakefile
|
154
154
|
- lib/oprah.rb
|
155
|
-
- lib/oprah/cache.rb
|
156
155
|
- lib/oprah/controller_helpers.rb
|
157
156
|
- lib/oprah/presenter.rb
|
158
157
|
- lib/oprah/railtie.rb
|
@@ -177,6 +176,7 @@ files:
|
|
177
176
|
- test/oprah/controller_helpers_test.rb
|
178
177
|
- test/oprah/oprah_test.rb
|
179
178
|
- test/oprah/presenter_test.rb
|
179
|
+
- test/oprah/railtie_test.rb
|
180
180
|
homepage: https://github.com/endofunky/oprah
|
181
181
|
licenses:
|
182
182
|
- MIT
|
@@ -216,3 +216,4 @@ test_files:
|
|
216
216
|
- test/oprah/controller_helpers_test.rb
|
217
217
|
- test/oprah/oprah_test.rb
|
218
218
|
- test/oprah/presenter_test.rb
|
219
|
+
- test/oprah/railtie_test.rb
|
data/lib/oprah/cache.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Oprah
|
2
|
-
# A cache store to keep Object-to-Presenter mappings. This class is
|
3
|
-
# thread-safe.
|
4
|
-
class Cache
|
5
|
-
def initialize
|
6
|
-
@mutex = Mutex.new
|
7
|
-
@mapping = {}
|
8
|
-
end
|
9
|
-
|
10
|
-
# Looks up presenters matching to `object` and stores them in the cache.
|
11
|
-
#
|
12
|
-
# @param object [Object] The presentable object
|
13
|
-
# @return [Array] An array of Presenter classes
|
14
|
-
def lookup(object)
|
15
|
-
@mutex.synchronize do
|
16
|
-
key = class_name_for(object)
|
17
|
-
|
18
|
-
cached = @mapping[key]
|
19
|
-
return cached if cached
|
20
|
-
|
21
|
-
@mapping[key] = presenter_classes_for(object)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Clears the presenter cache.
|
26
|
-
#
|
27
|
-
# @return [Boolean]
|
28
|
-
def clear!
|
29
|
-
@mutex.synchronize do
|
30
|
-
@mapping = {}
|
31
|
-
end
|
32
|
-
|
33
|
-
Rails.logger.debug "Oprah cache cleared." if Oprah.debug?
|
34
|
-
|
35
|
-
true
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def presenter_classes_for(object)
|
41
|
-
class_for(object).ancestors.map do |klass|
|
42
|
-
begin
|
43
|
-
(klass.name + "Presenter").constantize
|
44
|
-
rescue NameError
|
45
|
-
end
|
46
|
-
end.compact.reverse
|
47
|
-
end
|
48
|
-
|
49
|
-
def class_name_for(object)
|
50
|
-
class_for(object).name
|
51
|
-
end
|
52
|
-
|
53
|
-
def class_for(object)
|
54
|
-
object.kind_of?(Class) ? object : object.class
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|