frosting 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/README.md +12 -1
- data/frosting.gemspec +1 -1
- data/lib/frosting/repository.rb +38 -7
- data/lib/frosting/version.rb +1 -1
- data/spec/frosting/repository_spec.rb +40 -6
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZTE1MGNhNmFhOTgwMzhhMTE2YTk3MGUxNDMyYmU3Y2JiYTg5MGUzMw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a3f915322b680a3177a849297f6bf97406e1868a
|
4
|
+
data.tar.gz: a51935fa917ae9d576dda07dc2d52a07f35f0b3f
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
N2FmMzdjZjgxODIxNzAyMTBhNTI1MGI0ZjhjMDk4NjE5NDljMzc3NGE5MTU2
|
11
|
-
YjkxY2E2OWViY2I4M2EzNjc4NTQzZmJhOTg5ZTM2NDFjYWJjOTM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
M2I4NTM2NjgzZDQ2ZDcwNDkxNTBjN2U5N2MzNGE3MjAzMTA3NmM1YTYxZGU4
|
14
|
-
MGNkZDE5NDE3MzU2NDE2MzEzODFjOWMwMTFjYmY2Y2U3M2E5N2I4N2IyYmM0
|
15
|
-
ZTI1NWRmZjdjYjAyMzM5YmM2ZTU0Y2NhMDQ5NmU1NDBjODk3OWE=
|
6
|
+
metadata.gz: 8609a7b47ffaa1acc0ed0b7e721e4dbf0de7f83887db66060f00b44c6352099fa7f4697563e7bc8cc95fae4f1c65462d12fe73d6f6540c6416bdfcfd7d1dae35
|
7
|
+
data.tar.gz: c616b450eb926e2955db63272f40395781dc3f3659e45cb00ae07ce9f0d0d5166685921423e37f3d0df476cbc87a14b42e5c89899279fbca7fa611e498ad7803
|
data/README.md
CHANGED
@@ -32,4 +32,15 @@ end
|
|
32
32
|
|
33
33
|
You defined `#old?` in your model because it's not a presentation concern. Good job.
|
34
34
|
|
35
|
-
`Frosting::BasePresenter` delegates to the resource you're presenting, and it also has access to the view context. It
|
35
|
+
`Frosting::BasePresenter` delegates to the resource you're presenting, and it also has access to the view context. It doesn't delegate anything by default, but you can delegate things like `link_to` and `content_tag` if it makes your life easier. You should probably make your own base presenter that inherits from frosting's base. It's your life, and you should do what you want to.
|
36
|
+
|
37
|
+
You can also call `present_collection @posts` should you be dealing with a collection of posts and want them all to be presented.
|
38
|
+
|
39
|
+
## About Foraker Labs
|
40
|
+
|
41
|
+
![Foraker Logo](http://assets.foraker.com/attribution_logo.png)
|
42
|
+
|
43
|
+
Foraker Labs builds exciting web and mobile apps in Boulder, CO. Our work powers a wide variety of businesses with many different needs. We love open source software, and we're proud to contribute where we can. Interested to learn more? [Contact us today](https://www.foraker.com/contact-us).
|
44
|
+
|
45
|
+
This project is maintained by Foraker Labs. The names and logos of Foraker Labs are fully owned and copyright Foraker Design, LLC.
|
46
|
+
|
data/frosting.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'frosting'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.6'
|
4
4
|
s.date = '2014-02-04'
|
5
5
|
s.summary = "Let's make presenters easy."
|
6
6
|
s.description = "Adds some methods to your controllers and a base presenter. Get that presentation logic out of your models."
|
data/lib/frosting/repository.rb
CHANGED
@@ -1,18 +1,49 @@
|
|
1
1
|
require "active_support/core_ext/string/inflections"
|
2
|
+
require "active_support/core_ext/module/delegation"
|
2
3
|
|
3
4
|
module Frosting
|
4
5
|
class Repository
|
6
|
+
class PresenterMissingError < StandardError; end
|
7
|
+
|
5
8
|
def self.present(resource, options = {})
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
9
|
+
klass = options.fetch(:presenter) { infer_presenter(resource) }
|
10
|
+
klass = procify(klass).call(resource)
|
11
|
+
klass.new(resource, options[:context])
|
12
|
+
rescue LoadError, NameError
|
13
|
+
raise PresenterMissingError.new("No such presenter: #{klass}")
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.present_collection(collection, options = {})
|
15
|
-
|
17
|
+
PresentedCollection.new(collection, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.infer_presenter(resource)
|
21
|
+
"Presenters::#{resource.class.name}".constantize
|
22
|
+
end
|
23
|
+
private_class_method :infer_presenter
|
24
|
+
|
25
|
+
def self.procify(arg)
|
26
|
+
arg.respond_to?(:call) ? arg : lambda { |_| arg }
|
27
|
+
end
|
28
|
+
private_class_method :procify
|
29
|
+
end
|
30
|
+
|
31
|
+
class PresentedCollection < SimpleDelegator
|
32
|
+
include Enumerable
|
33
|
+
|
34
|
+
delegate :each, to: :presented_collection
|
35
|
+
|
36
|
+
def initialize(collection, options)
|
37
|
+
@options = options
|
38
|
+
super(collection)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def presented_collection
|
44
|
+
__getobj__.map do |resource|
|
45
|
+
Repository.present(resource, @options)
|
46
|
+
end
|
16
47
|
end
|
17
48
|
end
|
18
49
|
end
|
data/lib/frosting/version.rb
CHANGED
@@ -35,20 +35,54 @@ module Frosting
|
|
35
35
|
its(:context) { should eq context }
|
36
36
|
end
|
37
37
|
|
38
|
+
context "specifying a presenter class via proc" do
|
39
|
+
subject do
|
40
|
+
described_class.present(resource, {
|
41
|
+
context: context,
|
42
|
+
presenter: ->(resource) { Presenters::Test::Alternative }
|
43
|
+
})
|
44
|
+
end
|
45
|
+
|
46
|
+
it { should be_instance_of(Presenters::Test::Alternative) }
|
47
|
+
its(:resource) { should eq resource }
|
48
|
+
its(:context) { should eq context }
|
49
|
+
end
|
50
|
+
|
38
51
|
it "throws an exception when the resource has no presenter" do
|
39
52
|
class Test::OtherResource ; end
|
40
53
|
resource = Test::OtherResource.new
|
41
|
-
expect {
|
54
|
+
expect {
|
55
|
+
described_class.present(resource, context: context)
|
56
|
+
}.to raise_error(Frosting::Repository::PresenterMissingError)
|
42
57
|
end
|
43
58
|
end
|
44
59
|
|
45
60
|
describe ".present_collection" do
|
46
|
-
|
47
|
-
|
48
|
-
|
61
|
+
class Collection < Array
|
62
|
+
def test_method
|
63
|
+
"cats"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
let(:resource) { double }
|
68
|
+
let(:presented_resource) { double }
|
69
|
+
let(:presented_collection) do
|
70
|
+
described_class.present_collection(Collection.new.push(resource), {option: :val})
|
71
|
+
end
|
72
|
+
|
73
|
+
before do
|
74
|
+
allow(described_class).to receive(:present)
|
49
75
|
.with(resource, {option: :val})
|
50
|
-
|
76
|
+
.and_return(presented_resource)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "presents each item in the collection with options" do
|
80
|
+
expect(presented_collection.each.to_a).to eq [presented_resource]
|
81
|
+
end
|
82
|
+
|
83
|
+
it "still acts like the original collection" do
|
84
|
+
expect(presented_collection.test_method).to eq "cats"
|
51
85
|
end
|
52
86
|
end
|
53
87
|
end
|
54
|
-
end
|
88
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frosting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Eddy
|
@@ -15,42 +15,42 @@ dependencies:
|
|
15
15
|
name: activesupport
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: bundler
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '1.3'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - ~>
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '1.3'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rspec
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - ~>
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '2.0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - ~>
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '2.0'
|
56
56
|
description: Adds some methods to your controllers and a base presenter. Get that
|
@@ -82,17 +82,17 @@ require_paths:
|
|
82
82
|
- lib
|
83
83
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- -
|
85
|
+
- - ">="
|
86
86
|
- !ruby/object:Gem::Version
|
87
87
|
version: '0'
|
88
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
89
|
requirements:
|
90
|
-
- -
|
90
|
+
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.5.1
|
96
96
|
signing_key:
|
97
97
|
specification_version: 4
|
98
98
|
summary: Let's make presenters easy.
|