showcase 0.2.4 → 0.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bedbd67bc3e6d05ad13f3605a4a2c01f1e384288
4
- data.tar.gz: 2b6113d2cd3e94191a183b64ef9d185b5276f6c4
3
+ metadata.gz: 626e99ee876822033c08da67fa23f579028dec83
4
+ data.tar.gz: 6cb9d3be74ea269b752ed3e4fe3704fd7cdada5f
5
5
  SHA512:
6
- metadata.gz: 942132f75d1ffaccb55b5f02d33c54e8cdbc2bf8affeb8e9d808aa55fff92fd6861ce2456406a6e3d854a27737f0b9d7965e9238127691d0feabf4c3aeec5f39
7
- data.tar.gz: 1bec04a1151f63a00bda00d897e3c0b7e2e8135ccc1e7d7f0bc8620d79072029272e557ed202b21312006549d46d951b2141b57ee67f1ede77b2d94bdec5de73
6
+ metadata.gz: a1cfcacd185e4376c897629400c1c322141dad7cc536c7c54d8f153a56b8b6b4e1e805075b97e24ebbe06fe1db5b72a7921489cbde244dfc7fdd64f1481e4f2e
7
+ data.tar.gz: c5a14c96b7baa1fe72615ce98c17f7dc1fb71136fecaa4ce95e162ff982661ae44ae2c4f9a044c4082b5d9549763a2e24daeb5122d7616ceb6963beb9b5b680e
@@ -1,3 +1,7 @@
1
+ # Version 0.2.5
2
+
3
+ * Smarter HtmlOptions (extracted CSS class logic to HtmlClassAttribute)
4
+
1
5
  # Version 0.2.4
2
6
 
3
7
  * Added missing ActiveSupport requires
@@ -0,0 +1,23 @@
1
+ module Showcase
2
+ module Helpers
3
+ class HtmlClassAttribute
4
+ def initialize(value = nil)
5
+ @css_classes = value.to_s.strip.split(/\s+/)
6
+ end
7
+
8
+ def <<(value)
9
+ value = value.to_s.strip.split(/\s+/)
10
+ @css_classes += value
11
+ end
12
+
13
+ def to_html_attribute
14
+ if @css_classes.any?
15
+ @css_classes.uniq.join(' ')
16
+ else
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -1,3 +1,5 @@
1
+ require 'showcase/helpers/html_class_attribute'
2
+
1
3
  module Showcase
2
4
  module Helpers
3
5
  class HtmlOptions
@@ -6,15 +8,19 @@ module Showcase
6
8
  end
7
9
 
8
10
  def add_class!(css_class)
9
- @options[:class] ||= ""
10
- css_classes = @options[:class].split(/\s+/)
11
- css_classes << css_class
12
- @options[:class] = css_classes.join(" ")
11
+ merge_attrs!(class: css_class)
13
12
  end
14
13
 
15
14
  def merge_attrs!(options = {})
16
- options = (options || {}).symbolize_keys
17
- @options.merge!(options)
15
+ new_options = (options || {}).symbolize_keys
16
+
17
+ if new_options[:class]
18
+ class_attr = HtmlClassAttribute.new(@options[:class])
19
+ class_attr << new_options[:class]
20
+ new_options[:class] = class_attr.to_html_attribute
21
+ end
22
+
23
+ @options.merge!(new_options)
18
24
  end
19
25
 
20
26
  def to_h
@@ -38,7 +38,7 @@ module Showcase
38
38
  private
39
39
 
40
40
  def presenter_class(obj)
41
- obj.class.ancestors.each do |k|
41
+ (obj.class.ancestors - obj.class.included_modules).each do |k|
42
42
  klass = "#{k.name}Presenter".safe_constantize
43
43
  return klass if klass
44
44
  end
@@ -1,4 +1,4 @@
1
1
  module Showcase
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
4
4
 
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ module Showcase
4
+ module Helpers
5
+ describe HtmlClassAttribute do
6
+ let(:attribute) { HtmlClassAttribute.new(string) }
7
+ let(:string) { nil }
8
+
9
+ describe '.to_html_attribute' do
10
+ subject { attribute.to_html_attribute }
11
+
12
+ context 'nil' do
13
+ let(:string) { nil }
14
+ it { should be_nil }
15
+ end
16
+
17
+ context 'empty' do
18
+ let(:string) { '' }
19
+ it { should be_nil }
20
+ end
21
+
22
+ context 'whitespaces only' do
23
+ let(:string) { ' ' }
24
+ it { should be_nil }
25
+ end
26
+
27
+ context 'with trailing spaces' do
28
+ let(:string) { ' foo ' }
29
+ it { should eq 'foo' }
30
+ end
31
+
32
+ context 'with multiple classes' do
33
+ let(:string) { ' foo bar ' }
34
+ it { should eq 'foo bar' }
35
+ end
36
+ end
37
+
38
+ describe '#<<' do
39
+ before do
40
+ attribute << addition
41
+ end
42
+
43
+ subject { attribute.to_html_attribute }
44
+
45
+ context 'with no existing class attribute' do
46
+ let(:string) { nil }
47
+ let(:addition) { ' foo ' }
48
+
49
+ it { should eq 'foo' }
50
+ end
51
+
52
+ context 'with empty class attribute' do
53
+ let(:string) { '' }
54
+ let(:addition) { 'foo' }
55
+
56
+ it { should eq 'foo' }
57
+ end
58
+
59
+ context 'with existing class attribute' do
60
+ let(:string) { 'bar' }
61
+ let(:addition) { 'foo' }
62
+
63
+ it { should eq 'bar foo' }
64
+ end
65
+
66
+ context 'with the same css class' do
67
+ let(:string) { 'foo bar' }
68
+ let(:addition) { 'foo' }
69
+
70
+ it { should eq 'foo bar' }
71
+ end
72
+
73
+ context 'multiple additions' do
74
+ let(:string) { 'foo bar' }
75
+ let(:addition) { 'foo qux' }
76
+
77
+ it { should eq 'foo bar qux' }
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ module Showcase
4
+ module Helpers
5
+ describe HtmlOptions do
6
+ let(:options) { HtmlOptions.new(attributes) }
7
+ let(:attributes) { {} }
8
+
9
+ it 'takes a hash of attributes' do
10
+ expect(options.to_h).to eq attributes
11
+ end
12
+
13
+ describe '#merge_attrs!' do
14
+ let(:attributes) { { 'id' => 'bar', 'data-alert' => 'true' } }
15
+
16
+ it 'merges attributes with the passed ones' do
17
+ options.merge_attrs!('data-method' => 'post', 'id' => 'foo')
18
+ expect(options.to_h).to eq({
19
+ :'data-alert' => 'true',
20
+ :'data-method' => 'post',
21
+ :'id' => 'foo'
22
+ })
23
+ end
24
+
25
+ context 'css classes' do
26
+ let(:attributes) { { 'class' => 'foo bar' } }
27
+
28
+ it 'merges them appropriately' do
29
+ options.merge_attrs!('class' => 'foo qux')
30
+ expect(options.to_h).to eq(class: 'foo bar qux')
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ module Showcase
4
+ module Helpers
5
+ describe Present do
6
+ let(:object) { Person.new('Steve Ballmer') }
7
+ let(:subclass_object) { EnterpriseCustomer.new('Tito Traves') }
8
+ let(:object_with_no_presenter) { Shop.new }
9
+ let(:context) { Context.new }
10
+
11
+ describe '.present' do
12
+ it 'instantiates a new presenter, inferring the presenter class' do
13
+ PersonPresenter.stub(:new).with(object, context).and_return 'Presenter'
14
+ context.present(object).should == 'Presenter'
15
+ end
16
+ context 'with a superclass presenter' do
17
+ it "instantiates a new presenter, searching presenter class in object ancestors chain" do
18
+ PersonPresenter.stub(:new).with(subclass_object, context).and_return 'Presenter'
19
+ context.present(subclass_object).should == 'Presenter'
20
+ end
21
+ end
22
+ context 'with no existing presenter class' do
23
+ it "raises a PresenterClassNotFound error" do
24
+ expect {
25
+ context.present(object_with_no_presenter)
26
+ }.to raise_error(Showcase::PresenterClassNotFound)
27
+ end
28
+ end
29
+ it 'uses the specified presenter class, when passed' do
30
+ ProjectPresenter.stub(:new).with(object, context).and_return 'Presenter'
31
+ context.present(object, ProjectPresenter).should == 'Presenter'
32
+ end
33
+ it 'uses the specified context, when passed' do
34
+ different_context = double
35
+ context.present(object, ProjectPresenter, different_context).view_context.should == different_context
36
+ end
37
+ end
38
+
39
+ describe '.present_collection' do
40
+ it 'returns a presenter for each object in the collection' do
41
+ collection = [ Person.new('Mark'), Person.new('Luke') ]
42
+
43
+ PersonPresenter.stub(:new).with(collection[0], context).and_return 'foo'
44
+ PersonPresenter.stub(:new).with(collection[1], context).and_return 'bar'
45
+
46
+ presented_collection = context.present_collection(collection)
47
+ presented_collection.should == [ 'foo', 'bar' ]
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: showcase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-12 00:00:00.000000000 Z
11
+ date: 2014-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -105,6 +105,7 @@ files:
105
105
  - lib/showcase/errors.rb
106
106
  - lib/showcase/helpers/config_object.rb
107
107
  - lib/showcase/helpers/first_nonblank.rb
108
+ - lib/showcase/helpers/html_class_attribute.rb
108
109
  - lib/showcase/helpers/html_options.rb
109
110
  - lib/showcase/helpers/module_method_builder.rb
110
111
  - lib/showcase/helpers/present.rb
@@ -122,7 +123,9 @@ files:
122
123
  - spec/fixtures.rb
123
124
  - spec/helpers/config_object_spec.rb
124
125
  - spec/helpers/seo_meta_builder_spec.rb
125
- - spec/showcase/helpers_spec.rb
126
+ - spec/showcase/helpers/html_class_attribute_spec.rb
127
+ - spec/showcase/helpers/html_options_spec.rb
128
+ - spec/showcase/helpers/present_spec.rb
126
129
  - spec/showcase/presenter_spec.rb
127
130
  - spec/showcase/traits/base_spec.rb
128
131
  - spec/showcase/traits/link_to_spec.rb
@@ -157,7 +160,9 @@ test_files:
157
160
  - spec/fixtures.rb
158
161
  - spec/helpers/config_object_spec.rb
159
162
  - spec/helpers/seo_meta_builder_spec.rb
160
- - spec/showcase/helpers_spec.rb
163
+ - spec/showcase/helpers/html_class_attribute_spec.rb
164
+ - spec/showcase/helpers/html_options_spec.rb
165
+ - spec/showcase/helpers/present_spec.rb
161
166
  - spec/showcase/presenter_spec.rb
162
167
  - spec/showcase/traits/base_spec.rb
163
168
  - spec/showcase/traits/link_to_spec.rb
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Showcase::Helpers do
4
- let(:object) { Person.new('Steve Ballmer') }
5
- let(:subclass_object) { EnterpriseCustomer.new('Tito Traves') }
6
- let(:object_with_no_presenter) { Shop.new }
7
- let(:context) { Context.new }
8
-
9
- describe '.present' do
10
- it 'instantiates a new presenter, inferring the presenter class' do
11
- PersonPresenter.stub(:new).with(object, context).and_return 'Presenter'
12
- context.present(object).should == 'Presenter'
13
- end
14
- context 'with a superclass presenter' do
15
- it "instantiates a new presenter, searching presenter class in object ancestors chain" do
16
- PersonPresenter.stub(:new).with(subclass_object, context).and_return 'Presenter'
17
- context.present(subclass_object).should == 'Presenter'
18
- end
19
- end
20
- context 'with no existing presenter class' do
21
- it "raises a PresenterClassNotFound error" do
22
- expect {
23
- context.present(object_with_no_presenter)
24
- }.to raise_error(Showcase::PresenterClassNotFound)
25
- end
26
- end
27
- it 'uses the specified presenter class, when passed' do
28
- ProjectPresenter.stub(:new).with(object, context).and_return 'Presenter'
29
- context.present(object, ProjectPresenter).should == 'Presenter'
30
- end
31
- it 'uses the specified context, when passed' do
32
- different_context = double
33
- context.present(object, ProjectPresenter, different_context).view_context.should == different_context
34
- end
35
- end
36
-
37
- describe '.present_collection' do
38
- it 'returns a presenter for each object in the collection' do
39
- collection = [ Person.new('Mark'), Person.new('Luke') ]
40
-
41
- PersonPresenter.stub(:new).with(collection[0], context).and_return 'foo'
42
- PersonPresenter.stub(:new).with(collection[1], context).and_return 'bar'
43
-
44
- presented_collection = context.present_collection(collection)
45
- presented_collection.should == [ 'foo', 'bar' ]
46
- end
47
- end
48
- end
49
-