adorn 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/adorn/abstract_presenter.rb +7 -1
- data/lib/adorn/cache.rb +36 -3
- data/lib/adorn/delegate.rb +12 -0
- data/lib/adorn/display_context.rb +2 -0
- data/lib/adorn/helpers.rb +29 -20
- data/lib/adorn/middleware.rb +1 -0
- data/lib/adorn/object_decorator.rb +2 -0
- data/lib/adorn/presenter.rb +22 -0
- data/lib/adorn/version.rb +1 -1
- data/test/test_adorn_cache.rb +13 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a856199ed966d40cc4030d5e386ddb163f2cf677
|
4
|
+
data.tar.gz: a396250bf6f4a17855e22d9b8f28c2d668cba872
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c91111ae02408676c852c0e20ee9de70065f3825a41e84d586b901e00f6a32c6c9bf29596f0e55d1e7f680bc1b5367ede1edbb77c4b560e771bc0bea41f8146
|
7
|
+
data.tar.gz: fdfa4a711f668212af484060486346dad9f2d013ec83d4a4da624cde7a548b499d6c8c3ac0860dd77dfe1eb84ba8f94a77cce85dae0accdf287e50e70e330e80
|
@@ -1,11 +1,17 @@
|
|
1
1
|
module Adorn
|
2
2
|
class AbstractPresenter
|
3
3
|
|
4
|
+
# Macro used to create an instance method that wraps the underlying
|
5
|
+
# object passed to the decorator
|
6
|
+
#
|
7
|
+
# @param [Symbol]
|
8
|
+
# @return [Method] Adorn instance.
|
4
9
|
def self.presents(name)
|
5
10
|
define_method(name) { @object }
|
6
11
|
end
|
7
12
|
|
8
|
-
#
|
13
|
+
# Check both the context and the object before passing exception along
|
14
|
+
# @return [Method, StandardError]
|
9
15
|
def method_missing(method, *args, &block)
|
10
16
|
@context.send(method, *args, &block) if @context.respond_to?(method)
|
11
17
|
@object.send(method, *args, &block) if @object.respond_to?(method)
|
data/lib/adorn/cache.rb
CHANGED
@@ -1,13 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# A threadsafe (on write), cache for storing objects during the request response cycle.
|
2
|
+
# User responsibility to provide a serialization | deserialization strategy to set
|
3
|
+
# get items from the hash.
|
4
|
+
#
|
5
|
+
# ex. setting data in Adorn::Cache can be acheieved like so:
|
6
|
+
# Adorn::Cache.append!(:foo, serialized_object)
|
7
|
+
#
|
8
|
+
# ex. retrieving data in Adorn::Cache can be acheieved like so:
|
9
|
+
# Adorn::Cache[:foo] #=> serialized_object
|
4
10
|
module Adorn
|
5
11
|
module Cache
|
6
12
|
class << self
|
13
|
+
# Used to create a critical area during writes to Adorn::Cache
|
14
|
+
#
|
15
|
+
# @return [Mutex]
|
7
16
|
def semaphore
|
8
17
|
Thread.current[:semaphore] ||= Mutex.new
|
9
18
|
end
|
10
19
|
|
20
|
+
# Instantiate or read from Adorn::Cache.
|
21
|
+
# Provide an interface to append to Adorn::Cache during request
|
22
|
+
#
|
23
|
+
# @param [Symbol, *]
|
24
|
+
# @return [Hash]
|
11
25
|
def append!(key, value)
|
12
26
|
Thread.current[:adorn_cache] ||= Hash.new
|
13
27
|
|
@@ -16,6 +30,25 @@ module Adorn
|
|
16
30
|
end rescue nil #rescue ThreadError
|
17
31
|
end
|
18
32
|
|
33
|
+
# Return value at given key from the Adorn::Cache.
|
34
|
+
#
|
35
|
+
# @param [Symbol, String]
|
36
|
+
# @return [Hash]
|
37
|
+
def [](key)
|
38
|
+
case key.class.to_s
|
39
|
+
when 'String'
|
40
|
+
Thread.current[:adorn_cache][key]
|
41
|
+
when 'Symbol'
|
42
|
+
Thread.current[:adorn_cache][key.to_s]
|
43
|
+
else
|
44
|
+
raise 'Unable to read key'
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
# Remove all values from the Adorn::Cache.
|
50
|
+
#
|
51
|
+
# @return [Hash]
|
19
52
|
def clear!
|
20
53
|
semaphore.synchronize do
|
21
54
|
Thread.current[:adorn_cache].clear
|
data/lib/adorn/delegate.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
|
+
# Provides decorator descendants with the #extensions macro, which returns a module.
|
2
|
+
# Useful for endowing decorated object with methods from modules
|
3
|
+
# set the modules to extend the decorated object with the :with option.
|
4
|
+
#
|
5
|
+
# Adorn::Delegate.extensions { {with: [AwesomePower, GreatResponsibility]} }
|
6
|
+
#
|
1
7
|
module Adorn
|
2
8
|
module Delegate
|
3
9
|
|
10
|
+
# Creates and anonymous module and passes the result of the given block
|
11
|
+
# back to the context, extending the named @object instance variable.
|
12
|
+
# Provide an interface to append to Adorn::Cache during request
|
13
|
+
#
|
14
|
+
# @param [Module, Object, Proc]
|
15
|
+
# @return [Module]
|
4
16
|
def self.extensions(m=Module.new, context=self, &block)
|
5
17
|
return unless block_given?
|
6
18
|
m.instance_eval do
|
data/lib/adorn/helpers.rb
CHANGED
@@ -1,26 +1,35 @@
|
|
1
|
-
# API: Use this method to present objects from the application to the view that require the presenter abstraction. The
|
2
|
-
# method will accept single or multiple objects for dynamic presentation.
|
3
|
-
#
|
4
|
-
# Ex: Single Object, dynamic presenter loading
|
5
|
-
# views/homes/foo.html.haml
|
6
|
-
#
|
7
|
-
# presenting @bar do |bar_presenter|
|
8
|
-
# responds to methods found in BarPresenter class
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# Ex: Single Object, explicit Presenter Class
|
12
|
-
#
|
13
|
-
# presenting @bar, BazPresenter do |bar_presenter|
|
14
|
-
# responds to methods found in BazPresenter class
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# Ex: Multiple Objects NOTE: implicit detection only
|
18
|
-
#
|
19
|
-
# presenting([@foo, @bar]) do |foo_presenter, bar_presenter|
|
20
|
-
# end
|
21
1
|
module Adorn
|
22
2
|
module Helper
|
23
3
|
|
4
|
+
# A helper method to present objects with an implicit or explicilty set Adorn::Decorator
|
5
|
+
# Accepts single or multiple objects and Decorators for presentation.
|
6
|
+
#
|
7
|
+
# ex: Single Object, dynamic presenter loading
|
8
|
+
# presenting @bar do |bar_presenter|
|
9
|
+
#
|
10
|
+
# bar_presenter will respond to methods from the BarPresenter
|
11
|
+
#
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# ex: Single Object, explicit Decorator Class
|
15
|
+
#
|
16
|
+
# presenting @bar, BazPresenter do |bar_presenter|
|
17
|
+
#
|
18
|
+
# bar_presenter will respond to methods from the BazPresenter
|
19
|
+
#
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# ex: Multiple Objects NOTE: implicit detection only
|
23
|
+
#
|
24
|
+
# presenting([@foo, @bar]) do |foo_presenter, bar_presenter|
|
25
|
+
#
|
26
|
+
# @foo will respond to methods from the FooPresenter
|
27
|
+
# @bar will respond to methods from the BarPresenter
|
28
|
+
#
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# @param [Object, Class, Hash]
|
32
|
+
# @return [Adorn::Decorator]
|
24
33
|
def presenting(object, klass=nil, options={})
|
25
34
|
if object.is_a?(Array)
|
26
35
|
object.each do |presentable|
|
data/lib/adorn/middleware.rb
CHANGED
data/lib/adorn/presenter.rb
CHANGED
@@ -1,7 +1,29 @@
|
|
1
|
+
# Provides interface for subclassing decorators. Methods on the decorated object will
|
2
|
+
# be passed through the method that is defined using the ::presents method. Every object must
|
3
|
+
# provide an object to decorate and a context object, options are passed through having no effect
|
4
|
+
# on the presented object. The context object is implicit, when using the helper method #presenting
|
5
|
+
# provided by Adorn::Helpers
|
6
|
+
#
|
7
|
+
# ex. Interface
|
8
|
+
#
|
9
|
+
# require 'adorn'
|
10
|
+
# class WelcomePresernter < Adorn::Presenter
|
11
|
+
# Adorn::Delegate.extensions { {with: [ImportantModule, NeededBehavior]} }
|
12
|
+
#
|
13
|
+
# presents :welcomer
|
14
|
+
#
|
15
|
+
# def welcome
|
16
|
+
# welomer.english_greeting # => 'Hello there!'
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
|
1
20
|
module Adorn
|
2
21
|
class Presenter < AbstractPresenter
|
3
22
|
include Adorn::Delegate
|
4
23
|
|
24
|
+
|
25
|
+
#@param [Object, Object, Hash]
|
26
|
+
#@return [Adorn::Presenter]
|
5
27
|
def initialize(*args)
|
6
28
|
object, context, options = args
|
7
29
|
@object = ObjectDecorator.new(object)
|
data/lib/adorn/version.rb
CHANGED
data/test/test_adorn_cache.rb
CHANGED
@@ -4,7 +4,7 @@ require 'adorn/cache'
|
|
4
4
|
|
5
5
|
ImportantObject = Struct.new(:name, :age) do
|
6
6
|
def name
|
7
|
-
print "
|
7
|
+
print "my name is #{@name}"
|
8
8
|
end
|
9
9
|
|
10
10
|
def age
|
@@ -32,6 +32,18 @@ class TestAdornedCache < Adorn::TestCase
|
|
32
32
|
assert_same me_or_someone_like_me, Thread.current[:adorn_cache]['person']
|
33
33
|
end
|
34
34
|
|
35
|
+
def test_read_key
|
36
|
+
me_or_someone_like_me = ImportantObject.new('rhodee', 42)
|
37
|
+
Adorn::Cache.append! :person, me_or_someone_like_me
|
38
|
+
|
39
|
+
assert_same me_or_someone_like_me, Thread.current[:adorn_cache]['person']
|
40
|
+
assert_equal me_or_someone_like_me, Adorn::Cache[:person]
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_read_unknown_key
|
44
|
+
assert_raises(NoMethodError) { Adorn::Cache[:unknown_key] }
|
45
|
+
end
|
46
|
+
|
35
47
|
def test_clear_key
|
36
48
|
another_person = ImportantObject.new('snuggs', 10)
|
37
49
|
Adorn::Cache.append! :peep, another_person
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rhodee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|