poser 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/lib/poser.rb +4 -2
- data/lib/poser/context.rb +11 -0
- data/lib/poser/presentable.rb +25 -0
- data/lib/poser/presenter.rb +1 -17
- data/lib/poser/util.rb +28 -0
- data/lib/poser/version.rb +1 -1
- data/spec/poser/context_spec.rb +31 -0
- data/spec/poser/presentable_spec.rb +44 -0
- data/spec/poser/presenter_spec.rb +7 -4
- metadata +8 -2
- data/lib/poser/presenter/helper.rb +0 -13
data/.gitignore
CHANGED
data/lib/poser.rb
CHANGED
@@ -2,6 +2,8 @@ module Poser
|
|
2
2
|
end
|
3
3
|
|
4
4
|
require "poser/version"
|
5
|
-
require 'poser/enumerable_presenter'
|
6
5
|
require 'poser/presenter'
|
7
|
-
require 'poser/
|
6
|
+
require 'poser/enumerable_presenter'
|
7
|
+
require 'poser/presentable'
|
8
|
+
require 'poser/context'
|
9
|
+
require 'poser/util'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'poser/util'
|
2
|
+
|
3
|
+
module Poser
|
4
|
+
module Presentable
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def presenter_class
|
12
|
+
Util.first_available_class [
|
13
|
+
"#{self}::Presenter",
|
14
|
+
"#{self}Presenter",
|
15
|
+
"Poser::Presenter"
|
16
|
+
]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_presenter(context)
|
21
|
+
self.class.presenter_class.new self, context
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/poser/presenter.rb
CHANGED
@@ -10,23 +10,7 @@ module Poser
|
|
10
10
|
elsif object.respond_to? :to_presenter
|
11
11
|
object.to_presenter context
|
12
12
|
else
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def presents(name)
|
18
|
-
alias_method name, :__getobj__
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def determine_presenter_class(object)
|
24
|
-
object.class::Presenter
|
25
|
-
rescue NameError
|
26
|
-
if object.is_a?(Enumerable) || (defined?(ActiveRecord) && object.is_a?(ActiveRecord::Relation))
|
27
|
-
EnumerablePresenter
|
28
|
-
else
|
29
|
-
self
|
13
|
+
new object, context
|
30
14
|
end
|
31
15
|
end
|
32
16
|
end
|
data/lib/poser/util.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Poser
|
2
|
+
class Util
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def first_available_class(class_names)
|
6
|
+
if class_name = class_names.shift
|
7
|
+
constantize_string class_name
|
8
|
+
end
|
9
|
+
rescue NameError
|
10
|
+
retry
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def constantize_string(camel_cased_word)
|
16
|
+
camel_cased_word.constantize if camel_cased_word.respond_to?(:constantize)
|
17
|
+
|
18
|
+
names = camel_cased_word.split('::')
|
19
|
+
names.shift if names.empty? || names.first.empty?
|
20
|
+
|
21
|
+
names.inject(Object) do |constant, name|
|
22
|
+
constant.const_get(name, false)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/poser/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Poser::Context do
|
4
|
+
subject { Class.new { include Poser::Context }.new }
|
5
|
+
|
6
|
+
describe "instance methods" do
|
7
|
+
describe "present" do
|
8
|
+
before do
|
9
|
+
@object = Object.new
|
10
|
+
@result = Object.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns the result of telling Poser::Presenter to present the given object in the given context" do
|
14
|
+
cntxt = Object.new
|
15
|
+
Poser::Presenter.stub(:present) do |object, context|
|
16
|
+
@result if object == @object && context == cntxt
|
17
|
+
end
|
18
|
+
|
19
|
+
subject.present(@object, cntxt).should == @result
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns the result of telling Poser::Presenter to present the given object, using itself as the context when a context isn't given" do
|
23
|
+
Poser::Presenter.stub(:present) do |object, context|
|
24
|
+
@result if object == @object && context == subject
|
25
|
+
end
|
26
|
+
|
27
|
+
subject.present(@object).should == @result
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Poser::Presentable do
|
4
|
+
before(:all) { C = Class.new { include Poser::Presentable } }
|
5
|
+
after(:all) { Object.send :remove_const, :C }
|
6
|
+
|
7
|
+
describe "class methods" do
|
8
|
+
subject { C }
|
9
|
+
|
10
|
+
describe "presenter_class" do
|
11
|
+
after :all do
|
12
|
+
Object.send :remove_const, :CPresenter
|
13
|
+
C.send :remove_const, :Presenter
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns Poser::Presenter when no presenter classes are available for this class" do
|
17
|
+
subject.presenter_class.should == Poser::Presenter
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns CPresenter if it exists" do
|
21
|
+
CPresenter = Class.new
|
22
|
+
subject.presenter_class.should == CPresenter
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns the Presenter class namespaced under this class if it exists" do
|
26
|
+
C::Presenter = Class.new
|
27
|
+
subject.presenter_class.should == C::Presenter
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "instance methods" do
|
33
|
+
subject { C.new }
|
34
|
+
|
35
|
+
describe "to_presenter" do
|
36
|
+
it "presents itself within the context given using the appropriate class" do
|
37
|
+
context = Object.new
|
38
|
+
c = Class.new Poser::Presenter
|
39
|
+
C.stub(:presenter_class) { c }
|
40
|
+
subject.to_presenter(context).should == c.new(subject, context)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -20,6 +20,10 @@ describe Poser::Presenter do
|
|
20
20
|
@object.stub(:to_presenter) { result }
|
21
21
|
subject.present(@object, @context).should == result
|
22
22
|
end
|
23
|
+
|
24
|
+
it "otherwise returns an instance of itself" do
|
25
|
+
subject.present(@object, @context).should == subject.new(@object, @context)
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
@@ -31,6 +35,9 @@ describe Poser::Presenter do
|
|
31
35
|
@context = Object.new
|
32
36
|
end
|
33
37
|
|
38
|
+
it { should be_presented }
|
39
|
+
its(:context) { should == @context }
|
40
|
+
|
34
41
|
describe "==" do
|
35
42
|
it "is true given a #{described_class} instantiated with the same presentee and context" do
|
36
43
|
subject.should == described_class.new(@presentee, @context)
|
@@ -49,8 +56,6 @@ describe Poser::Presenter do
|
|
49
56
|
end
|
50
57
|
end
|
51
58
|
|
52
|
-
it { should be_presented }
|
53
|
-
|
54
59
|
describe "present" do
|
55
60
|
it "returns the result of telling the #{described_class} to present the given object with the same context" do
|
56
61
|
result = Object.new
|
@@ -63,7 +68,5 @@ describe Poser::Presenter do
|
|
63
68
|
subject.present(object).should == result
|
64
69
|
end
|
65
70
|
end
|
66
|
-
|
67
|
-
its(:context) { should == @context }
|
68
71
|
end
|
69
72
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -40,11 +40,15 @@ files:
|
|
40
40
|
- README.md
|
41
41
|
- Rakefile
|
42
42
|
- lib/poser.rb
|
43
|
+
- lib/poser/context.rb
|
43
44
|
- lib/poser/enumerable_presenter.rb
|
45
|
+
- lib/poser/presentable.rb
|
44
46
|
- lib/poser/presenter.rb
|
45
|
-
- lib/poser/
|
47
|
+
- lib/poser/util.rb
|
46
48
|
- lib/poser/version.rb
|
47
49
|
- poser.gemspec
|
50
|
+
- spec/poser/context_spec.rb
|
51
|
+
- spec/poser/presentable_spec.rb
|
48
52
|
- spec/poser/presenter_spec.rb
|
49
53
|
- spec/poser_spec.rb
|
50
54
|
- spec/spec_helper.rb
|
@@ -73,6 +77,8 @@ signing_key:
|
|
73
77
|
specification_version: 3
|
74
78
|
summary: A minimal implementation of the presenter pattern.
|
75
79
|
test_files:
|
80
|
+
- spec/poser/context_spec.rb
|
81
|
+
- spec/poser/presentable_spec.rb
|
76
82
|
- spec/poser/presenter_spec.rb
|
77
83
|
- spec/poser_spec.rb
|
78
84
|
- spec/spec_helper.rb
|