adorn 0.0.4
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 +7 -0
- data/README.md +13 -0
- data/Rakefile +40 -0
- data/adorn.gemspec +39 -0
- data/lib/adorn.rb +43 -0
- data/lib/adorn/abstract_presenter.rb +23 -0
- data/lib/adorn/cache.rb +26 -0
- data/lib/adorn/delegate.rb +27 -0
- data/lib/adorn/display_context.rb +18 -0
- data/lib/adorn/helpers.rb +48 -0
- data/lib/adorn/middleware.rb +16 -0
- data/lib/adorn/object_decorator.rb +18 -0
- data/lib/adorn/presenter.rb +12 -0
- data/lib/adorn/railtie.rb +13 -0
- data/lib/adorn/version.rb +10 -0
- data/test/test_adorn_cache.rb +59 -0
- data/test/test_adorn_helper.rb +46 -0
- data/test/test_adorn_middleware.rb +29 -0
- data/test/test_adorned_object.rb +57 -0
- data/test/test_display_context.rb +29 -0
- data/test/test_helper.rb +11 -0
- data/test/test_object_decorator.rb +29 -0
- metadata +193 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 74658299c2b97f2148f863e4a0d02bdd800c5f49
|
4
|
+
data.tar.gz: 037a64e3129e9fdb4fb3105e6bc137e0b0eecd75
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 90bf1f8055f3bc83a8b68e2e674d2fa14e756c8828a1aeae7badfd4be3ebab6969722cc468dbc028f96a8221ed2381749e2df0359f36254d59b605bca5618cbd
|
7
|
+
data.tar.gz: ea6a4588ffd4b22b45d60ee7c875e05df9e61579e8a672a25376d8600eca186bdce0366833ee6401026f5b24b70ff24887d29b7b804807d9292c14f0f3df4712
|
data/README.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Adorn
|
2
|
+
|
3
|
+
A take on decorating objects based on the very valued work done by the [Draper](http://github.com/drapergem/draper) gem.
|
4
|
+
|
5
|
+
Run bundle exec rake -T for list of rake tasks.
|
6
|
+
|
7
|
+
## Contributing
|
8
|
+
|
9
|
+
1. Fork it ( https://github.com/rhodee/adorn/fork )
|
10
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
11
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
12
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
13
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
Rake::TestTask.new do |t|
|
5
|
+
t.pattern = 'test/test_*.rb'
|
6
|
+
end
|
7
|
+
|
8
|
+
namespace :stats do
|
9
|
+
Analyzers = [:flay, :flog, :reek]
|
10
|
+
|
11
|
+
desc 'Run flog to report your most tortured code'
|
12
|
+
task :flog do
|
13
|
+
puts "*" * 50
|
14
|
+
puts "Running flog..."
|
15
|
+
system './vendor/bundle/bin/flog -g lib/**'
|
16
|
+
puts " "
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'Run reek to examine ruby code for any code smells'
|
20
|
+
task :reek do
|
21
|
+
puts "*" * 50
|
22
|
+
puts "Running reek..."
|
23
|
+
system './vendor/bundle/bin/reek lib/**'
|
24
|
+
puts " "
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Run flay for analyzing code for structural similarities.'
|
28
|
+
task :flay do
|
29
|
+
puts "*" * 50
|
30
|
+
puts "Running flay..."
|
31
|
+
system './vendor/bundle/bin/flay lib/**'
|
32
|
+
puts " "
|
33
|
+
end
|
34
|
+
|
35
|
+
desc 'Run tests and all analyzers'
|
36
|
+
task :all do
|
37
|
+
system 'bundle exec rake test'
|
38
|
+
Analyzers.each { |analyzer| Rake::Task["stats:#{analyzer}"].invoke }
|
39
|
+
end
|
40
|
+
end
|
data/adorn.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
require 'adorn/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = 'adorn'
|
9
|
+
s.version = Adorn::Version::String
|
10
|
+
s.authors = ['rhodee']
|
11
|
+
s.email = ['info@rhodee.us']
|
12
|
+
s.summary = %q{ Object decoration with caching }
|
13
|
+
s.description = %q{ A take on decorating objects based on the very valued work done by the [Draper](http://github.com/drapergem/draper) gem. }
|
14
|
+
s.homepage = 'https://github.com/rhodee/adorn'
|
15
|
+
s.license = 'MIT'
|
16
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
s.platform = Gem::Platform::RUBY
|
19
|
+
s.required_ruby_version = '>= 2.0.0'
|
20
|
+
s.files = Dir[
|
21
|
+
'LICENSE',
|
22
|
+
'AUTHORS',
|
23
|
+
'README.md',
|
24
|
+
'Rakefile',
|
25
|
+
'lib/**/*.rb',
|
26
|
+
'*.gemspec',
|
27
|
+
'test/**/*.rb'
|
28
|
+
]
|
29
|
+
|
30
|
+
s.add_development_dependency 'yard', '~> 0.8.7'
|
31
|
+
s.add_development_dependency 'pry', '~> 0.9'
|
32
|
+
s.add_development_dependency 'bundler', '~> 1.5'
|
33
|
+
s.add_development_dependency 'rake', '~> 10.1'
|
34
|
+
s.add_development_dependency 'rack-test', '~> 0.6.1'
|
35
|
+
s.add_development_dependency 'minitest', '~> 5.2'
|
36
|
+
s.add_development_dependency 'reek', '~> 1.3'
|
37
|
+
s.add_development_dependency 'flay', '~> 2.4'
|
38
|
+
s.add_development_dependency 'flog', '~> 4.2'
|
39
|
+
end
|
data/lib/adorn.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright 2014 Denis Rhoden Jr.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
#
|
23
|
+
# See https://github.com/rhodee/adorn for updates.
|
24
|
+
#
|
25
|
+
#
|
26
|
+
|
27
|
+
#stdlib
|
28
|
+
require 'thread'
|
29
|
+
require 'delegate'
|
30
|
+
|
31
|
+
module Adorn
|
32
|
+
#modules
|
33
|
+
autoload :AbstractPresenter, 'adorn/abstract_presenter'
|
34
|
+
autoload :Cache, 'adorn/cache'
|
35
|
+
autoload :Delegate, 'adorn/delegate'
|
36
|
+
autoload :DisplayContext, 'adorn/display_context'
|
37
|
+
autoload :Helpers, 'adorn/helpers'
|
38
|
+
autoload :Middleware, 'adorn/middleware'
|
39
|
+
autoload :ObjectDecorator, 'adorn/object_decorator'
|
40
|
+
autoload :Presenter, 'adorn/presenter'
|
41
|
+
autoload :Railtie, 'adorn/railtie'
|
42
|
+
autoload :Version, 'adorn/version'
|
43
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Adorn
|
2
|
+
class AbstractPresenter
|
3
|
+
|
4
|
+
def self.presents(name)
|
5
|
+
define_method(name) { @object }
|
6
|
+
end
|
7
|
+
|
8
|
+
# delegate to context
|
9
|
+
def method_missing(method, *args, &block)
|
10
|
+
@context.send(method, *args, &block) if @context.respond_to?(method)
|
11
|
+
@object.send(method, *args, &block) if @object.respond_to?(method)
|
12
|
+
rescue => e
|
13
|
+
super(method, *args, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def respond_to_missing?(method,*)
|
17
|
+
method =~ /#{method.to_s}/ || super
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def initialize(*);end
|
22
|
+
end
|
23
|
+
end
|
data/lib/adorn/cache.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'adorn/middleware'
|
2
|
+
require 'adorn/railtie' if defined?(Rails::Railtie)
|
3
|
+
|
4
|
+
module Adorn
|
5
|
+
module Cache
|
6
|
+
class << self
|
7
|
+
def semaphore
|
8
|
+
Thread.current[:semaphore] ||= Mutex.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def append!(key, value)
|
12
|
+
Thread.current[:adorn_cache] ||= Hash.new
|
13
|
+
|
14
|
+
semaphore.synchronize do
|
15
|
+
Thread.current[:adorn_cache].merge!({ "#{key}" => value })
|
16
|
+
end rescue nil #rescue ThreadError
|
17
|
+
end
|
18
|
+
|
19
|
+
def clear!
|
20
|
+
semaphore.synchronize do
|
21
|
+
Thread.current[:adorn_cache].clear
|
22
|
+
end rescue nil #rescue ThreadError
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Adorn
|
2
|
+
module Delegate
|
3
|
+
|
4
|
+
def self.extensions(m=Module.new, context=self, &block)
|
5
|
+
return unless block_given?
|
6
|
+
m.instance_eval do
|
7
|
+
extensions = block.call # destructure this to handle more options
|
8
|
+
if extensions.has_key?(:with)
|
9
|
+
mods = extensions[:with]
|
10
|
+
include *mods
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context.instance_eval do
|
15
|
+
define_method(:initialize) do |*args|
|
16
|
+
|
17
|
+
obj, context, options = args
|
18
|
+
@object = obj
|
19
|
+
@context = context
|
20
|
+
@options = options if options
|
21
|
+
@object.extend(m)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Adorn
|
2
|
+
class DisplayContext
|
3
|
+
|
4
|
+
def initialize(context)
|
5
|
+
@context = SimpleDelegator.new(context)
|
6
|
+
end
|
7
|
+
|
8
|
+
def method_missing(method, *args, &block)
|
9
|
+
@context.send(method, *args, &block)
|
10
|
+
rescue => e
|
11
|
+
super(method, *args, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def respond_to_missing?(method,*)
|
15
|
+
method =~ /#{method.to_s}/ || super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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
|
+
module Adorn
|
22
|
+
module Helper
|
23
|
+
|
24
|
+
def presenting(object, klass=nil, options={})
|
25
|
+
if object.is_a?(Array)
|
26
|
+
object.each do |presentable|
|
27
|
+
|
28
|
+
proxy = "#{presentable.class}Presenter"
|
29
|
+
yield Object.const_get(proxy.to_s).new(object, self, options) if Object.const_defined?(proxy.to_s)
|
30
|
+
|
31
|
+
provided_klass = Object.const_get(proxy.to_s, false)
|
32
|
+
presenter = provided_klass.new(presentable, self, options) # self is context
|
33
|
+
yield presenter
|
34
|
+
proxy = nil
|
35
|
+
end
|
36
|
+
nil
|
37
|
+
else
|
38
|
+
proxy = klass || "#{object.class}Presenter"
|
39
|
+
yield Object.const_get(proxy.to_s).new(object, self, options) if Object.const_defined?(proxy.to_s)
|
40
|
+
|
41
|
+
provided_klass = Object.const_get(proxy.to_s, false)
|
42
|
+
presenter = provided_klass.new(object, self, options) # self is context
|
43
|
+
yield presenter
|
44
|
+
proxy = nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Adorn
|
2
|
+
class ObjectDecorator
|
3
|
+
|
4
|
+
def initialize(object)
|
5
|
+
@object = SimpleDelegator.new(object)
|
6
|
+
end
|
7
|
+
|
8
|
+
def method_missing(method, *args, &block)
|
9
|
+
@object.send(method, *args, &block)
|
10
|
+
rescue => e
|
11
|
+
super(method, *args, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def respond_to_missing?(method,*)
|
15
|
+
method =~ /#{method.to_s}/ || super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Adorn
|
2
|
+
class Presenter < AbstractPresenter
|
3
|
+
include Adorn::Delegate
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
object, context, options = args
|
7
|
+
@object = ObjectDecorator.new(object)
|
8
|
+
@context = DisplayContext.new(context)
|
9
|
+
super(@object, @context, options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'adorn/helpers'
|
2
|
+
|
3
|
+
module Adorn
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
initializer 'adorn.insert_middleware' do |app|
|
6
|
+
app.config.middleware.use Adorn::Middleware
|
7
|
+
end
|
8
|
+
|
9
|
+
ActiveSupport.on_load(:action_view) do
|
10
|
+
include Adorn::Helpers
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative './test_helper'
|
2
|
+
require 'adorn'
|
3
|
+
require 'adorn/cache'
|
4
|
+
|
5
|
+
ImportantObject = Struct.new(:name, :age) do
|
6
|
+
def name
|
7
|
+
print "I am #{@name}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def age
|
11
|
+
@age
|
12
|
+
end
|
13
|
+
|
14
|
+
def kindergarten_greeting
|
15
|
+
puts "Hi #{name} and I am #{age}."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestAdornedCache < Adorn::TestCase
|
20
|
+
def setup
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
Adorn::Cache.clear!
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_insert_key
|
28
|
+
me_or_someone_like_me = ImportantObject.new('rhodee', 42)
|
29
|
+
Adorn::Cache.append! :person, me_or_someone_like_me
|
30
|
+
|
31
|
+
refute_equal true, Thread.current[:adorn_cache].keys.empty?
|
32
|
+
assert_same me_or_someone_like_me, Thread.current[:adorn_cache]['person']
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_clear_key
|
36
|
+
another_person = ImportantObject.new('snuggs', 10)
|
37
|
+
Adorn::Cache.append! :peep, another_person
|
38
|
+
|
39
|
+
refute_equal true, Thread.current[:adorn_cache].keys.empty?
|
40
|
+
|
41
|
+
Adorn::Cache.clear!
|
42
|
+
|
43
|
+
assert_equal true, Thread.current[:adorn_cache].empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_cache_objects
|
47
|
+
me_or_someone_like_me = ImportantObject.new('rhodee', 42)
|
48
|
+
Adorn::Cache.append! :person, me_or_someone_like_me
|
49
|
+
|
50
|
+
4.times do
|
51
|
+
Thread.new do
|
52
|
+
me_or_someone_like_me = ImportantObject.new('rhodee', 42)
|
53
|
+
Adorn::Cache.append! :person, me_or_someone_like_me
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
assert_equal me_or_someone_like_me.object_id, Thread.current[:adorn_cache]['person'].object_id
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative './test_helper'
|
2
|
+
require 'adorn'
|
3
|
+
require 'adorn/helpers'
|
4
|
+
|
5
|
+
Foo = Struct.new(:name)
|
6
|
+
FooPresenter = Struct.new(:object, :context, :options)
|
7
|
+
|
8
|
+
Adorned = Struct.new(:name)
|
9
|
+
AdornedPresenter = Struct.new(:object, :context, :options)
|
10
|
+
|
11
|
+
module FakeHelper
|
12
|
+
extend Adorn::Helper
|
13
|
+
end
|
14
|
+
|
15
|
+
class TestAdornHelper < Adorn::TestCase
|
16
|
+
|
17
|
+
def helper
|
18
|
+
FakeHelper
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_no_presenter_raises_error
|
22
|
+
broken_bit = Adorned.new('Bar')
|
23
|
+
|
24
|
+
assert_raises(NameError) { helper.presenting(broken_bit, BarPresenter) {|_|} }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_second_parameter_to_find_presenter
|
28
|
+
adorned_bits = Adorned.new('Bar')
|
29
|
+
|
30
|
+
assert true, helper.presenting(adorned_bits, AdornedPresenter) { |a_pres| a_pres.is_a?(AdornedPresenter) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_string_interpolation_to_find_presenter
|
34
|
+
foo_bit = Foo.new('Foo')
|
35
|
+
|
36
|
+
assert true, helper.presenting(foo_bit) { |foo_pres| foo_pres.is_a?(FooPresenter) }
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def test_multiple_objects_to_present
|
41
|
+
foo_bit = Foo.new('Foo')
|
42
|
+
bar_bit = Adorned.new('Bar')
|
43
|
+
|
44
|
+
assert true, helper.presenting([foo_bit, bar_bit]) {|f,b| f.is_a?(FooPresenter) && b.is_a?(AdornedPresenter) }
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative './test_helper'
|
2
|
+
require 'adorn'
|
3
|
+
require 'adorn/middleware'
|
4
|
+
require 'adorn/cache'
|
5
|
+
|
6
|
+
class TestAdornedCache < Adorn::TestCase
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
def setup
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
app = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def app
|
17
|
+
|
18
|
+
Rack::Builder.new do
|
19
|
+
use Adorn::Middleware
|
20
|
+
run lambda { |env| [200, {}, [Adorn::Cache.append!('foo', Object.new)] ] }
|
21
|
+
end.to_app
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_object_appended_in_response
|
25
|
+
get '/', {}, { 'Content-Type' => 'text/html' }
|
26
|
+
|
27
|
+
refute_equal true, Thread.current[:adorn_cache].empty?
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative './test_helper'
|
2
|
+
require 'adorn'
|
3
|
+
|
4
|
+
AdornedWithUsefulMethods = Module.new do
|
5
|
+
def calculate; return 1 + 2; end
|
6
|
+
end
|
7
|
+
|
8
|
+
MoreUsefulMethods = Module.new do
|
9
|
+
def subtract; return 1 - 2; end
|
10
|
+
end
|
11
|
+
|
12
|
+
DecoratedClass = Struct.new(:time)
|
13
|
+
DummyContext = Struct.new(:path)
|
14
|
+
|
15
|
+
class Proxy < Adorn::Presenter
|
16
|
+
Adorn::Delegate.extensions { {with: [AdornedWithUsefulMethods, MoreUsefulMethods]} }
|
17
|
+
presents :model
|
18
|
+
|
19
|
+
def model_value
|
20
|
+
print "That's a big number #{model.calculate}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestAdornedObject < Adorn::TestCase
|
25
|
+
def setup
|
26
|
+
@obj_proxy = DecoratedClass.new(Time.now)
|
27
|
+
@dummy_context = DummyContext.new('path/to/context')
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
@obj_proxy = nil
|
32
|
+
@dummy_context = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_present_helper
|
36
|
+
proxy = Proxy.new(@obj_proxy, @dummy_context)
|
37
|
+
|
38
|
+
assert true, proxy.model.is_a?(DecoratedClass)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_object_extension
|
42
|
+
proxy = Proxy.new(@obj_proxy, @dummy_context)
|
43
|
+
|
44
|
+
assert_includes proxy.model.methods, :calculate
|
45
|
+
assert_includes proxy.model.methods, :subtract
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_method_lookup_error
|
49
|
+
proxy = Proxy.new(@obj_proxy, @dummy_context)
|
50
|
+
|
51
|
+
assert_raises(NoMethodError) { proxy.not_a_method }
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_decoration
|
55
|
+
assert_output("That's a big number 3") { Proxy.new(@obj_proxy, @dummy_context).model_value }
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative './test_helper'
|
2
|
+
require 'adorn'
|
3
|
+
require 'adorn/display_context'
|
4
|
+
|
5
|
+
TestContext = Struct.new(:path)
|
6
|
+
|
7
|
+
class TestDisplayContext < Adorn::TestCase
|
8
|
+
def setup
|
9
|
+
@context = TestContext.new('way/to/display/things')
|
10
|
+
@proxy = Adorn::DisplayContext.new(@context)
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
@context = nil
|
15
|
+
@proxy = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_display_context
|
19
|
+
assert true, @proxy.is_a?(Adorn::DisplayContext)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_raises_error_for_unadorned
|
23
|
+
assert_raises(NoMethodError) { @proxy.not_a_method }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_fetches_from_unadorned_object
|
27
|
+
assert_includes @proxy.instance_variable_get(:@context).methods, :path
|
28
|
+
end
|
29
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
lib = File.expand_path(File.expand_path('../lib', File.dirname(__FILE__)))
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'minitest/pride'
|
6
|
+
require 'rack/test'
|
7
|
+
|
8
|
+
module Adorn
|
9
|
+
class TestCase < Minitest::Test
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative './test_helper'
|
2
|
+
require 'adorn'
|
3
|
+
require 'adorn/object_decorator'
|
4
|
+
|
5
|
+
ProxyableObject = Struct.new(:value)
|
6
|
+
|
7
|
+
class TestObjectDecorator < Adorn::TestCase
|
8
|
+
def setup
|
9
|
+
@object = ProxyableObject.new(10)
|
10
|
+
@proxy = Adorn::ObjectDecorator.new(@object)
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
@object = nil
|
15
|
+
@proxy = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_display_context
|
19
|
+
assert true, @proxy.is_a?(Adorn::ObjectDecorator)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_raises_error_for_unadorned
|
23
|
+
assert_raises(NoMethodError) { @proxy.not_a_method }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_fetches_from_unadorned_object
|
27
|
+
assert_includes @proxy.instance_variable_get(:@object).methods, :value
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: adorn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- rhodee
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: yard
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.8.7
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.8.7
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.9'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack-test
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.6.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.6.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '5.2'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '5.2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: reek
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: flay
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.4'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.4'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: flog
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '4.2'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '4.2'
|
139
|
+
description: " A take on decorating objects based on the very valued work done by
|
140
|
+
the [Draper](http://github.com/drapergem/draper) gem. "
|
141
|
+
email:
|
142
|
+
- info@rhodee.us
|
143
|
+
executables: []
|
144
|
+
extensions: []
|
145
|
+
extra_rdoc_files: []
|
146
|
+
files:
|
147
|
+
- README.md
|
148
|
+
- Rakefile
|
149
|
+
- adorn.gemspec
|
150
|
+
- lib/adorn.rb
|
151
|
+
- lib/adorn/abstract_presenter.rb
|
152
|
+
- lib/adorn/cache.rb
|
153
|
+
- lib/adorn/delegate.rb
|
154
|
+
- lib/adorn/display_context.rb
|
155
|
+
- lib/adorn/helpers.rb
|
156
|
+
- lib/adorn/middleware.rb
|
157
|
+
- lib/adorn/object_decorator.rb
|
158
|
+
- lib/adorn/presenter.rb
|
159
|
+
- lib/adorn/railtie.rb
|
160
|
+
- lib/adorn/version.rb
|
161
|
+
- test/test_adorn_cache.rb
|
162
|
+
- test/test_adorn_helper.rb
|
163
|
+
- test/test_adorn_middleware.rb
|
164
|
+
- test/test_adorned_object.rb
|
165
|
+
- test/test_display_context.rb
|
166
|
+
- test/test_helper.rb
|
167
|
+
- test/test_object_decorator.rb
|
168
|
+
homepage: https://github.com/rhodee/adorn
|
169
|
+
licenses:
|
170
|
+
- MIT
|
171
|
+
metadata: {}
|
172
|
+
post_install_message:
|
173
|
+
rdoc_options: []
|
174
|
+
require_paths:
|
175
|
+
- lib
|
176
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 2.0.0
|
181
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
requirements: []
|
187
|
+
rubyforge_project:
|
188
|
+
rubygems_version: 2.2.2
|
189
|
+
signing_key:
|
190
|
+
specification_version: 4
|
191
|
+
summary: Object decoration with caching
|
192
|
+
test_files: []
|
193
|
+
has_rdoc:
|