bourgeois 1.0 → 1.0.1
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/.rubocop.yml +42 -0
- data/.travis.yml +8 -0
- data/README.md +2 -2
- data/bourgeois.gemspec +1 -0
- data/lib/bourgeois.rb +1 -1
- data/lib/bourgeois/presenter.rb +24 -20
- data/lib/bourgeois/version.rb +1 -1
- data/lib/bourgeois/view_helper.rb +13 -12
- data/spec/bourgeois/presenter_spec.rb +1 -1
- data/spec/bourgeois/view_helper_spec.rb +71 -0
- data/spec/spec_helper.rb +1 -1
- metadata +35 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9b43bb505e57adbf599131cc6bdd4cad655630c
|
4
|
+
data.tar.gz: 06e720c2028ef5ba363f670106a820ea6057d2d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee3c41269548658fc037843c9c57a94edf01ce021e03a8c7d6f60b0d21b9a0b097bf1b245689f22288213a27b64e88ac7ce0ed6c15db4114b5b2c3e64f50d760
|
7
|
+
data.tar.gz: ce66af27e40e000b56f78b68ebf22d8c7f23ca4a23449317e78abc6c22931af644cfcaf464d08dcae6bf105076f5933e9e41a97b57735326454ae926777dc35a
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
AllCops:
|
2
|
+
Includes:
|
3
|
+
- Gemfile
|
4
|
+
- Rakefile
|
5
|
+
|
6
|
+
Documentation:
|
7
|
+
Enabled: false
|
8
|
+
|
9
|
+
Encoding:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
LineLength:
|
13
|
+
Max: 200
|
14
|
+
|
15
|
+
AccessModifierIndentation:
|
16
|
+
EnforcedStyle: outdent
|
17
|
+
|
18
|
+
IfUnlessModifier:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
CaseIndentation:
|
22
|
+
IndentWhenRelativeTo: case
|
23
|
+
IndentOneStep: true
|
24
|
+
|
25
|
+
MethodLength:
|
26
|
+
CountComments: false
|
27
|
+
Max: 20
|
28
|
+
|
29
|
+
SignalException:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
ColonMethodCall:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
AsciiComments:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Lambda:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
RegexpLiteral:
|
42
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -9,3 +9,11 @@ gemfile:
|
|
9
9
|
- gemfiles/Gemfile.activemodel-3.2.x
|
10
10
|
|
11
11
|
script: "echo 'DO IT' && bundle exec rake spec"
|
12
|
+
|
13
|
+
notifications:
|
14
|
+
hipchat:
|
15
|
+
rooms:
|
16
|
+
secure: "Xo3Uv+mvgPuQjF5J5T05mGoxE8LeoTrBjBRvnFSnX2tmrKvKoBLG0LMIg0A8TpI0usohnk7xF3FbAFq4n3xTnkCsrU3KAWOIw5c7Hh0wVTM67A8qh26+RVJSE/8oSUebCJxdiC2uSQcAsz405RR23FP/z8luKLtc6xKkqNMrJSM="
|
17
|
+
template:
|
18
|
+
- '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (<a href="%{build_url}">Build</a>/<a href="%{compare_url}">Changes</a>)'
|
19
|
+
format: 'html'
|
data/README.md
CHANGED
@@ -98,6 +98,6 @@ Bourgeois was inspired by some code [@rafBM](https://twitter.com/rafBM) wrote fo
|
|
98
98
|
|
99
99
|
## About Mirego
|
100
100
|
|
101
|
-
Mirego is a team of passionate people who believe that work is a place where you can innovate and have fun. We
|
101
|
+
[Mirego](http://mirego.com) is a team of passionate people who believe that work is a place where you can innovate and have fun. We're a team of [talented people](http://life.mirego.com) who imagine and build beautiful Web and mobile applications. We come together to share ideas and [change the world](http://mirego.org).
|
102
102
|
|
103
|
-
We also love
|
103
|
+
We also [love open-source software](http://open.mirego.com) and we try to give back to the community as much as we can.
|
data/bourgeois.gemspec
CHANGED
data/lib/bourgeois.rb
CHANGED
data/lib/bourgeois/presenter.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module Bourgeois
|
2
2
|
class Presenter < ::SimpleDelegator
|
3
|
+
# Return the original delegated object
|
4
|
+
attr_reader :object
|
5
|
+
|
3
6
|
def initialize(object, view = nil)
|
4
7
|
@view = view
|
5
8
|
super(@object = object)
|
@@ -40,36 +43,37 @@ module Bourgeois
|
|
40
43
|
# end
|
41
44
|
def self.helper(name, opts = {})
|
42
45
|
define_method(name) do |&block|
|
43
|
-
|
44
|
-
|
45
|
-
if opts[:if]
|
46
|
-
execute = execute && self.instance_exec(&opts[:if])
|
47
|
-
end
|
48
|
-
|
49
|
-
if opts[:unless]
|
50
|
-
execute = execute && !self.instance_exec(&opts[:unless])
|
51
|
-
end
|
52
|
-
|
53
|
-
block.call if execute
|
46
|
+
execute_helper(block, opts)
|
54
47
|
end
|
55
48
|
end
|
56
49
|
|
57
50
|
private
|
58
51
|
|
59
52
|
# Return the view from where the presenter was created
|
60
|
-
|
61
|
-
@view
|
62
|
-
end
|
63
|
-
|
64
|
-
# Return the original delegated object
|
65
|
-
def object
|
66
|
-
@object
|
67
|
-
end
|
53
|
+
attr_reader :view
|
68
54
|
|
69
55
|
# Return the original object class based on the presenter class name
|
70
56
|
# We would be able to use `@object.class` but we need this in class methods
|
71
57
|
def self.klass
|
72
|
-
@klass ||=
|
58
|
+
@klass ||= name.split(/Presenter$/).first.constantize
|
59
|
+
end
|
60
|
+
|
61
|
+
# Execute a helper block if it matches conditions
|
62
|
+
def execute_helper(block, opts)
|
63
|
+
if_condition = execute_helper_condition(opts[:if])
|
64
|
+
unless_condition = !execute_helper_condition(opts[:unless], false)
|
65
|
+
|
66
|
+
block.call if if_condition && unless_condition
|
67
|
+
end
|
68
|
+
|
69
|
+
# Execute a block within the context of the instance and return
|
70
|
+
# the result. Return a default value if the passed block is blank
|
71
|
+
def execute_helper_condition(block, default = true)
|
72
|
+
if block.blank?
|
73
|
+
default
|
74
|
+
else
|
75
|
+
instance_exec(&block)
|
76
|
+
end
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
data/lib/bourgeois/version.rb
CHANGED
@@ -8,19 +8,13 @@ module Bourgeois
|
|
8
8
|
# puts user.name # => Remi
|
9
9
|
# end
|
10
10
|
def present(object, klass = nil, &blk)
|
11
|
-
return
|
11
|
+
return if object.nil?
|
12
|
+
return object.map { |o| present(o, klass, &blk) } if object.respond_to?(:to_a) && !object.is_a?(Struct)
|
12
13
|
|
13
|
-
if
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
begin
|
18
|
-
klass_name = "#{object.class}Presenter"
|
19
|
-
klass = klass_name.constantize
|
20
|
-
rescue ::NameError
|
21
|
-
raise UnknownPresenter.new(klass_name)
|
22
|
-
end
|
23
|
-
end
|
14
|
+
if object.is_a?(Bourgeois::Presenter)
|
15
|
+
presenter = object
|
16
|
+
else
|
17
|
+
klass ||= ViewHelper.presenter_class(object)
|
24
18
|
end
|
25
19
|
|
26
20
|
presenter ||= klass.new(object, self)
|
@@ -28,5 +22,12 @@ module Bourgeois
|
|
28
22
|
|
29
23
|
presenter
|
30
24
|
end
|
25
|
+
|
26
|
+
def self.presenter_class(object)
|
27
|
+
klass_name = "#{object.class}Presenter"
|
28
|
+
klass_name.constantize
|
29
|
+
rescue ::NameError
|
30
|
+
raise UnknownPresenter, klass_name
|
31
|
+
end
|
31
32
|
end
|
32
33
|
end
|
@@ -14,6 +14,22 @@ describe Bourgeois::ViewHelper do
|
|
14
14
|
class User < OpenStruct; end
|
15
15
|
end
|
16
16
|
|
17
|
+
context 'on a Nil object' do
|
18
|
+
context 'without a block' do
|
19
|
+
it { expect { view.present(nil) }.not_to raise_error }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'with a block' do
|
23
|
+
before { UserPresenter.any_instance.should_receive(:formatted_name).never }
|
24
|
+
|
25
|
+
specify do
|
26
|
+
expect do
|
27
|
+
view.present(nil) { |obj| obj.formatted_name }
|
28
|
+
end.not_to raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
17
33
|
context 'on a single resource' do
|
18
34
|
let(:user) { User.new first_name: 'Patrick', last_name: 'Bourgeois' }
|
19
35
|
|
@@ -83,5 +99,60 @@ describe Bourgeois::ViewHelper do
|
|
83
99
|
let(:project) { Project.new name: 'Les B.B.' }
|
84
100
|
it { expect { view.present(project) }.to raise_error(Bourgeois::UnknownPresenter, 'unknown presenter class ProjectPresenter') }
|
85
101
|
end
|
102
|
+
|
103
|
+
context 'on a resource with a custom presenter class' do
|
104
|
+
before do
|
105
|
+
class Article < OpenStruct; end
|
106
|
+
class CustomArticlePresenter < Bourgeois::Presenter
|
107
|
+
def name
|
108
|
+
super.upcase
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
let(:article) { Article.new name: 'Les B.B.' }
|
114
|
+
let(:presented_article) { view.present(article, CustomArticlePresenter) }
|
115
|
+
|
116
|
+
it { expect { presented_article }.not_to raise_error }
|
117
|
+
it { expect(presented_article.name).to eql 'LES B.B.' }
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'on a Struct-based resource' do
|
121
|
+
before do
|
122
|
+
class Band < Struct.new(:name)
|
123
|
+
end
|
124
|
+
|
125
|
+
class BandPresenter < Bourgeois::Presenter
|
126
|
+
def name
|
127
|
+
super.upcase
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
let(:band) { Band.new('Les B.B.') }
|
133
|
+
let(:presented_band) { view.present(band) }
|
134
|
+
|
135
|
+
it { expect(presented_band.name).to eql 'LES B.B.' }
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'on a collection of resources with a custom presenter class' do
|
139
|
+
before do
|
140
|
+
class Article < OpenStruct; end
|
141
|
+
class CustomArticlePresenter < Bourgeois::Presenter
|
142
|
+
def name
|
143
|
+
super.upcase
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
let(:articles) { [Article.new(name: 'Les B.B.'), Article.new(name: 'Rock et Belles Oreilles')] }
|
149
|
+
|
150
|
+
specify do
|
151
|
+
output = []
|
152
|
+
view.present(articles, CustomArticlePresenter) { |u| output << u.name }
|
153
|
+
|
154
|
+
expect(output).to eql ['LES B.B.', 'ROCK ET BELLES OREILLES']
|
155
|
+
end
|
156
|
+
end
|
86
157
|
end
|
87
158
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,97 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bourgeois
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rémi Prévost
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: actionpack
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 3.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 3.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '2.13'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.13'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: coveralls
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
description: Bourgeois is a Ruby library that makes using presenters a very simple
|
@@ -102,9 +116,10 @@ executables: []
|
|
102
116
|
extensions: []
|
103
117
|
extra_rdoc_files: []
|
104
118
|
files:
|
105
|
-
- .gitignore
|
106
|
-
- .rspec
|
107
|
-
- .
|
119
|
+
- ".gitignore"
|
120
|
+
- ".rspec"
|
121
|
+
- ".rubocop.yml"
|
122
|
+
- ".travis.yml"
|
108
123
|
- Gemfile
|
109
124
|
- LICENSE.md
|
110
125
|
- README.md
|
@@ -131,17 +146,17 @@ require_paths:
|
|
131
146
|
- lib
|
132
147
|
required_ruby_version: !ruby/object:Gem::Requirement
|
133
148
|
requirements:
|
134
|
-
- -
|
149
|
+
- - ">="
|
135
150
|
- !ruby/object:Gem::Version
|
136
151
|
version: '0'
|
137
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
153
|
requirements:
|
139
|
-
- -
|
154
|
+
- - ">="
|
140
155
|
- !ruby/object:Gem::Version
|
141
156
|
version: '0'
|
142
157
|
requirements: []
|
143
158
|
rubyforge_project:
|
144
|
-
rubygems_version: 2.
|
159
|
+
rubygems_version: 2.2.2
|
145
160
|
signing_key:
|
146
161
|
specification_version: 4
|
147
162
|
summary: Bourgeois is a Ruby library that makes using presenters a very simple thing.
|