showcase 0.2.0.beta.5 → 0.2.0.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f9f2fdb7c485fa431bdc844dfa1e90c19df2327
4
- data.tar.gz: f82059c06749b78396057a4902ba5ce305d51804
3
+ metadata.gz: 72574756357dcfeea3882c9cc85310c932bc272d
4
+ data.tar.gz: 98f5d60b67e5dba3f0d870ae033b9dacc6ffad28
5
5
  SHA512:
6
- metadata.gz: a870589ee0807ebf648ba0f77032ec9dda5ef459314099c9fc7ec1b61e1f1f1c74ee839ec519fb757875be0fede89f65d2f5ac95f24cb69041aa1ffc9ae81c89
7
- data.tar.gz: dfd4c857afb37106f3d6f61562a2a3efe3304a5f29881e6e759cbfc679633299c67f7d470afbc5cae0858d03ca729a51ede348fbac355002da41861a772ef31c
6
+ metadata.gz: 7b49b695ea0301b22c47239c144ceaf4ccfa7a22c6ec1ab809f7660581792c196953060183064a7a9e2d61a230d2fbd7ceccc3ce9ce2289e617f6457e39d1b86
7
+ data.tar.gz: dcfd53204bc986fc2389707a130afe5d7395b110f34d30b63cd562375f12140a7f03474f07c2d88a987304da6bc9fac29d81875eec3dcc8e45c25ba624886a2a
data/.gitignore CHANGED
@@ -15,5 +15,3 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- gemfiles/*.gemfile.lock
19
-
data/.travis.yml CHANGED
@@ -1,12 +1,6 @@
1
1
  language: ruby
2
-
3
2
  rvm:
4
3
  - "1.9.3"
5
4
  - "2.0.0"
6
-
7
- gemfile:
8
- - "gemfiles/rails_32.gemfile"
9
- - "gemfiles/rails_4.gemfile"
10
-
11
- script: "bundle exec rake spec"
5
+ script: "bundle exec rspec spec"
12
6
 
data/Gemfile CHANGED
@@ -2,6 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in basic_presenter.gemspec
4
4
  gemspec
5
-
6
- gem "appraisal"
7
-
data/README.md CHANGED
@@ -3,42 +3,36 @@
3
3
  A simple (< 100 lines of code) but powerful exhibit/presenter implementation.
4
4
  It's framework agnostic: works with Rails, Padrino or just Sinatra.
5
5
 
6
- Since version 0.2.0 Showcase is bundled with [a set of optional "traits"](https://github.com/stefanoverna/showcase#traits)
6
+ Since version 0.2.0 Showcase is bundled with [a set of "traits"](https://github.com/stefanoverna/showcase#traits)
7
7
  you can pick and choose to augment your presenters with additional sugar
8
- (available in Rails 3+ only).
8
+ (available in Rails only).
9
9
 
10
- ## Why should I use presenters in my Rails app?
10
+ ## Why should I use the Exhibit pattern in my Rails app?
11
11
 
12
- See [Avdi's Exhibits introductory post](http://devblog.avdi.org/2012/06/04/displaycase-gem-now-available/).
12
+ See [Avdi's introductory post](http://devblog.avdi.org/2012/06/04/displaycase-gem-now-available/).
13
13
 
14
14
  ## Installation
15
15
 
16
16
  Add this line to your application's Gemfile:
17
17
 
18
- ```ruby
19
- gem 'showcase'
20
- ```
18
+ gem 'showcase'
21
19
 
22
20
  And then execute:
23
21
 
24
- ```
25
- $ bundle
26
- ```
22
+ $ bundle
27
23
 
28
24
  Or install it yourself as:
29
25
 
30
- ```
31
- $ gem install showcase
32
- ```
26
+ $ gem install showcase
33
27
 
34
28
  ## Usage
35
29
 
36
- With Rails, you're already set, move on! With Padrino, include `Showcase::Helpers::Present`
30
+ With Rails, you're already set, move on! With Padrino, include `Showcase::Helpers`
37
31
  in your app `helpers` block.
38
32
 
39
33
  ```ruby
40
34
  helpers do
41
- include Showcase::Helpers::Present
35
+ include Showcase::Helpers
42
36
  end
43
37
  ```
44
38
 
@@ -88,15 +82,16 @@ end
88
82
 
89
83
  ### Generators
90
84
 
91
- Showcase comes with a generator to create new presenters a little faster:
85
+ Showcase comes with a generator to make the Presenter creation process a little
86
+ faster:
92
87
 
93
88
  ```
94
89
  rails generate showcase:presenter User
95
90
  ```
96
91
 
97
- Will generate `app/presenters/user_presenter.rb`. If your Rails app has the file
92
+ Will generate `app/presenters/user_presenter.rb`. If your app has a file called
98
93
  `app/presenters/base_presenter.rb`, the newly created presenter will inherit
99
- from `BasePresenter` instead of `Showcase::Presenter`.
94
+ form `BasePresenter` instead of `Shocase::Presenter`.
100
95
 
101
96
  ### Traits
102
97
 
@@ -132,7 +127,7 @@ Super useful in acceptance testing to check the presence of a record inside a
132
127
  view:
133
128
 
134
129
  ```erb
135
- <% present(@project, class: 'big').box do %>
130
+ <% present(@project).box do %>
136
131
  <p>Hi there!</p>
137
132
  <% end %>
138
133
  ```
@@ -140,24 +135,11 @@ view:
140
135
  Produces the following:
141
136
 
142
137
  ```html
143
- <div class="project big" id="project_12">
138
+ <div class="project" id="project_12">
144
139
  <p>Hi there</p>
145
140
  </div>
146
141
  ```
147
142
 
148
- Additional HTML attributes can be optionally specified within a config block
149
- inside the presenter:
150
-
151
- ```ruby
152
- class ProjectPresenter < Showcase::Presenter
153
- include Showcase::Traits::Record
154
-
155
- box do |c|
156
- c.html_options class: 'another-class', role: 'project'
157
- end
158
- end
159
- ```
160
-
161
143
  #### `Showcase::Traits::LinkTo`
162
144
 
163
145
  Adds a nice DSL to declare links within your presenter.
@@ -167,16 +149,15 @@ class ProjectPresenter < Showcase::Presenter
167
149
  include Showcase::Traits::LinkTo
168
150
 
169
151
  link_to do |c|
170
- c.url h.project_path(self)
171
- c.label name
172
- c.active h.controller_name == 'projects'
173
- c.active_class 'current'
174
- c.html_options role: 'label'
152
+ c.url h.project_path(self)
153
+ c.label name
154
+ c.active h.controller_name == 'projects'
175
155
  end
176
156
 
177
157
  link_to :tasks do
178
158
  c.url h.project_tasks_path(self)
179
159
  c.label "Tasks"
160
+ c.active h.controller_name == 'tasks'
180
161
  end
181
162
  end
182
163
  ```
@@ -235,7 +216,7 @@ In your views:
235
216
  #### `Showcase::Traits::Seo`
236
217
 
237
218
  Useful to produce SEO meta tags (title, description, Facebook OpenGraph,
238
- Twitter cards, and canonical URLs):
219
+ Twitter cards, and canonical URL):
239
220
 
240
221
  ```ruby
241
222
  class ProjectPresenter < Showcase::Presenter
@@ -249,7 +230,6 @@ class ProjectPresenter < Showcase::Presenter
249
230
  end
250
231
  end
251
232
  ```
252
-
253
233
  In your views:
254
234
 
255
235
  ```erb
data/Rakefile CHANGED
@@ -1,14 +1 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'appraisal'
4
-
5
- desc 'Default: run specs'
6
- task default: :spec
7
-
8
- require 'rspec/core/rake_task'
9
- RSpec::Core::RakeTask.new do |t|
10
- t.pattern = "spec/**/*_spec.rb"
11
- end
12
-
13
- Bundler::GemHelper.install_tasks
14
-
1
+ require "bundler/gem_tasks"
@@ -12,40 +12,26 @@ module Showcase
12
12
  title += options[:title_suffix] if options[:title_suffix]
13
13
 
14
14
  context.content_tag(:title, title) <<
15
- seo_meta_tags('og:title', 'twitter:title', values)
15
+ seo_meta_tags(:og_title, :twitter_title, values)
16
16
  end
17
17
 
18
18
  def description(values, options = {})
19
- seo_meta_tags('description', 'og:description', 'twitter:description', values)
19
+ seo_meta_tags(:description, :og_description, :twitter_description, values)
20
20
  end
21
21
 
22
22
  def image_url(image_url, options = {})
23
- seo_meta_tags('og:image', 'twitter:image', image_url)
24
- end
25
-
26
- def iframe_video_url(video_url, options = {})
27
- seo_meta_tags('og:video:url', 'twitter:player', video_url) <<
28
- seo_meta_tags('og:video:type', 'text/html')
29
- end
30
-
31
- def stream_video_url(video_url, options = {})
32
- seo_meta_tags('og:video:url', 'twitter:player:stream', video_url) <<
33
- seo_meta_tags('og:video:type', 'video/mp4')
34
- end
35
-
36
- def site_name(name, options = {})
37
- seo_meta_tags('og:site_name', name)
23
+ seo_meta_tags(:og_image, :twitter_image, image_url)
38
24
  end
39
25
 
40
26
  def canonical_url(url, options = {})
41
- seo_meta_tags('og:url', url) <<
27
+ seo_meta_tags(:og_url, url) <<
42
28
  context.tag(:link, rel: "canonical", "href" => url)
43
29
  end
44
30
 
45
31
  private
46
32
 
47
33
  def first_nonblank(values)
48
- Array(values).find(&:presence)
34
+ Array(values).map(&:presence).compact.first
49
35
  end
50
36
 
51
37
  def seo_meta_tags(*args)
@@ -54,14 +40,8 @@ module Showcase
54
40
  return nil unless value.present?
55
41
 
56
42
  args.map do |name|
57
- chunks = name.to_s.split(":")
58
- attr_name = if chunks.first == 'og'
59
- 'property'
60
- else
61
- 'name'
62
- end
63
- name = chunks.join(':')
64
- context.tag(:meta, attr_name => name, content: value)
43
+ name = name.to_s.sub(/_/, ":")
44
+ context.tag(:meta, name: name, content: value)
65
45
  end.join.html_safe
66
46
  end
67
47
  end
@@ -0,0 +1,33 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/inflector'
3
+ require 'active_support/core_ext/hash/keys'
4
+
5
+ module Showcase
6
+ module Helpers
7
+ extend ActiveSupport::Concern
8
+
9
+ def presenter_context
10
+ if respond_to? :view_context
11
+ view_context
12
+ else
13
+ self
14
+ end
15
+ end
16
+
17
+ def present(obj, klass = nil, context = presenter_context, options = {})
18
+ options.assert_valid_keys(:nil_presenter)
19
+
20
+ if obj || options.fetch(:nil_presenter, false)
21
+ klass ||= "#{obj.class.name}Presenter".constantize
22
+ klass.new(obj, context)
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ def present_collection(obj, klass = nil, context = presenter_context, options = {})
29
+ obj.map { |o| present(o, klass, context, options) }
30
+ end
31
+ end
32
+ end
33
+
@@ -1,20 +1,17 @@
1
1
  require 'delegate'
2
- require 'showcase/helpers/present'
3
- require 'showcase/helpers/module_method_builder'
2
+ require 'showcase/helpers'
4
3
  require 'active_support/core_ext/array/extract_options'
5
4
  require 'active_support/core_ext/hash/keys'
6
5
 
7
6
  module Showcase
8
7
  class Presenter < SimpleDelegator
9
- include Helpers::Present
10
- extend Helpers::ModuleMethodBuilder
8
+ include Helpers
11
9
 
12
10
  attr_reader :view_context
13
11
 
14
12
  alias_method :object, :__getobj__
15
13
  alias_method :h, :view_context
16
14
  alias_method :try, :__send__
17
- alias_method :__decorator_class__, :class
18
15
 
19
16
  def initialize(obj, context)
20
17
  super(obj)
@@ -49,15 +46,19 @@ module Showcase
49
46
  options.assert_valid_keys(:with, :nil_presenter)
50
47
  presenter_klass = options.fetch(:with, nil)
51
48
 
52
- args.each do |attr|
53
- define_module_method attr do
54
- send(method,
55
- object.send(attr),
56
- presenter_klass,
57
- view_context,
58
- options.slice(:nil_presenter))
49
+ methods_module = Module.new do
50
+ args.each do |attr|
51
+ define_method attr do
52
+ send(method,
53
+ object.send(attr),
54
+ presenter_klass,
55
+ view_context,
56
+ options.slice(:nil_presenter))
57
+ end
59
58
  end
60
59
  end
60
+
61
+ include(methods_module)
61
62
  end
62
63
  end
63
64
  end
@@ -4,7 +4,7 @@ module Showcase
4
4
  class Railtie < Rails::Railtie
5
5
  initializer "action_view.initialize_showcase" do
6
6
  ActiveSupport.on_load(:action_view) do
7
- ActionView::Base.send :include, Showcase::Helpers::Present
7
+ ActionView::Base.send :include, Showcase::Helpers
8
8
  end
9
9
  end
10
10
  end
@@ -3,9 +3,20 @@ module Showcase
3
3
  module Base
4
4
  extend ActiveSupport::Concern
5
5
 
6
- included do
7
- extend Helpers::ModuleMethodBuilder
6
+ module ClassMethods
7
+ private
8
+
9
+ def define_method?(name_chunks, &block)
10
+ method_name = Array(name_chunks).map(&:to_s).map(&:presence).compact.join("_")
11
+ if method_defined?(method_name)
12
+ false
13
+ else
14
+ define_method(method_name, &block)
15
+ true
16
+ end
17
+ end
8
18
  end
19
+
9
20
  end
10
21
  end
11
22
  end
@@ -1,5 +1,4 @@
1
1
  require 'showcase/helpers/config_object'
2
- require 'showcase/helpers/html_options'
3
2
 
4
3
  module Showcase
5
4
  module Traits
@@ -10,24 +9,31 @@ module Showcase
10
9
 
11
10
  module ClassMethods
12
11
  def link_to(name = nil, &block)
13
- define_module_method [name, :url] do
12
+
13
+ define_method? [name, :url] do
14
14
  Helpers::ConfigObject.new(self, &block).to_struct.url
15
15
  end
16
16
 
17
- define_module_method [name, :link_active?] do
17
+ define_method? [name, :link_active?] do
18
18
  Helpers::ConfigObject.new(self, &block).to_struct.active
19
19
  end
20
20
 
21
- define_module_method [name, :link] do |*args, &link_block|
21
+ define_method? [name, :link] do |*args, &link_block|
22
22
  config = Helpers::ConfigObject.new(self, &block).to_struct
23
+ options = args.extract_options!.symbolize_keys
24
+ options.reverse_merge!(config.html_options) if config.html_options
23
25
 
24
- html_options = HtmlOptions.new(config.html_options)
25
- html_options.merge_attrs!(args.extract_options!)
26
- html_options.add_class!(config.active_class || 'active') if config.active
26
+ if config.active
27
+ options[:class] ||= ""
28
+ css_classes = options[:class].split(/\s+/)
29
+ css_classes << "active"
30
+ options[:class] = css_classes.join(" ")
31
+ end
27
32
 
28
33
  args = Array(config.label) if args.empty? && !link_block
29
- h.link_to *args, config.url, html_options.to_h, &link_block
34
+ h.link_to *args, config.url, options, &link_block
30
35
  end
36
+
31
37
  end
32
38
  end
33
39
  end
@@ -1,59 +1,35 @@
1
+ require 'action_view/record_identifier'
2
+
1
3
  module Showcase
2
4
  module Traits
3
5
 
4
6
  module Record
5
7
  extend ActiveSupport::Concern
6
8
 
7
- module ClassMethods
8
- def box(&block)
9
- @box_config_block = block
10
- end
11
-
12
- def __box_config_block__
13
- @box_config_block
14
- end
15
- end
16
-
17
9
  def dom_id
18
- record_identifier.dom_id(self)
10
+ ActionView::RecordIdentifier.dom_id(self)
19
11
  end
20
12
 
21
13
  def dom_class
22
- record_identifier.dom_class(self)
14
+ ActiveModel::Naming.param_key(self)
23
15
  end
24
16
 
25
17
  def box(*args, &block)
26
18
  options = args.extract_options!
19
+ options.symbolize_keys!
20
+
27
21
  tag = args.pop || :div
28
22
 
29
- config_block = self.__decorator_class__.__box_config_block__
30
- config_options = if config_block
31
- Helpers::ConfigObject.new(self, &config_block).to_struct.html_options
32
- else
33
- {}
34
- end
23
+ options[:class] ||= ""
24
+ css_classes = options[:class].split(/\s+/) << dom_class
25
+ options[:class] = css_classes.join(" ")
35
26
 
36
- html_options = HtmlOptions.new(config_options)
37
- html_options.merge_attrs!(options)
38
- html_options.add_class!(dom_class)
39
- html_options.merge_attrs!(id: dom_id)
27
+ options[:id] = dom_id
40
28
 
41
- h.content_tag(tag, html_options.to_h) do
29
+ h.content_tag(tag, options) do
42
30
  h.capture(self, &block)
43
31
  end
44
32
  end
45
-
46
- private
47
-
48
- def record_identifier
49
- if defined?(ActionView::RecordIdentifier)
50
- ActionView::RecordIdentifier
51
- elsif defined?(ActionController::RecordIdentifier)
52
- ActionController::RecordIdentifier
53
- else
54
- raise 'No RecordIdentifier found!'
55
- end
56
- end
57
33
  end
58
34
 
59
35
  end
@@ -9,27 +9,13 @@ module Showcase
9
9
 
10
10
  module ClassMethods
11
11
 
12
- def default_seo_options(&block)
13
- define_module_method :default_seo_options do
14
- Helpers::ConfigObject.new(self, &block).to_hash
15
- end
16
- end
17
-
18
12
  def seo(name = nil, options = {}, &block)
19
- define_module_method [name, :seo_tags] do |options = {}|
20
- meta = respond_to?(:default_seo_options) ? default_seo_options : {}
21
- meta.merge!(Helpers::ConfigObject.new(self, &block).to_hash)
22
- meta.merge!(options.symbolize_keys) if options
23
-
13
+ define_method? [name, :seo_tags] do |options = {}|
14
+ meta = Helpers::ConfigObject.new(self, &block).to_hash
24
15
  builder = Helpers::SeoMetaBuilder.new(view_context)
25
- parts = %w(
26
- title description site_name
27
- canonical_url
28
- image_url iframe_video_url stream_video_url
29
- ).map(&:to_sym)
30
-
16
+ parts = %w(title description canonical_url image_url canonical_url).map(&:to_sym)
31
17
  parts.map do |tag|
32
- builder.send(tag, meta[tag], meta.except(*parts)) if meta[tag]
18
+ builder.send(tag, meta[tag], options) if meta[tag]
33
19
  end.compact.join.html_safe
34
20
  end
35
21
  end
@@ -1,5 +1,4 @@
1
1
  require 'showcase/helpers/config_object'
2
- require 'active_support/core_ext/object/to_query'
3
2
 
4
3
  module Showcase
5
4
  module Traits
@@ -42,17 +41,14 @@ module Showcase
42
41
 
43
42
  link_to link_name do |c|
44
43
  meta = Helpers::ConfigObject.new(self, &block).to_struct
45
- html_options = meta.html_options || {}
46
44
  params = Hash[
47
45
  settings[:params].map do |param, meta_key|
48
- values = [:"#{social}_#{meta_key}", meta_key].map { |key| meta.send(key) }
49
- [ param, values.find(&:presence) ]
46
+ [ param, meta.send(meta_key) ]
50
47
  end
51
48
  ]
52
-
53
49
  c.url "#{settings[:url]}?#{params.to_query}"
54
50
  c.label settings[:label]
55
- c.html_options = html_options.reverse_merge(target: '_blank')
51
+ c.html_options = { target: :blank }
56
52
  end
57
53
  end
58
54
  end
@@ -1,4 +1,4 @@
1
1
  module Showcase
2
- VERSION = "0.2.0.beta.5"
2
+ VERSION = "0.2.0.pre"
3
3
  end
4
4
 
data/showcase.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.name = 'showcase'
8
8
  gem.version = Showcase::VERSION
9
9
  gem.authors = ['Stefano Verna']
10
- gem.email = ['stefano.verna@gmail.com']
10
+ gem.email = ['stefano.verna@welaika.com']
11
11
  gem.description = %q{A barebone and framework agnostic presenter implementation}
12
12
  gem.summary = %q{A barebone and framework agnostic presenter implementation}
13
13
  gem.homepage = 'https://github.com/welaika/showcase'
data/spec/fixtures.rb CHANGED
@@ -87,7 +87,7 @@ class NilClassPresenter < Showcase::Presenter
87
87
  end
88
88
 
89
89
  class Context
90
- include Showcase::Helpers::Present
90
+ include Showcase::Helpers
91
91
 
92
92
  def bold(text)
93
93
  "**#{text}**"
@@ -13,8 +13,8 @@ module Showcase::Helpers
13
13
  expect(subject.title('foo')).to have_tag(:title, text: 'foo')
14
14
  end
15
15
 
16
- it 'produces a og:title meta tag' do
17
- expect(subject.title('foo')).to have_tag(:meta, with: { property: 'og:title', content: 'foo' })
16
+ it 'produces a ug:title meta tag' do
17
+ expect(subject.title('foo')).to have_tag(:meta, with: { name: 'og:title', content: 'foo' })
18
18
  end
19
19
 
20
20
  it 'produces a twitter:title meta tag' do
@@ -32,7 +32,7 @@ module Showcase::Helpers
32
32
  expect(subject.title('foo', title_suffix: ' - bar')).to have_tag(:title, text: 'foo - bar')
33
33
  end
34
34
  it 'does not suffix meta tags' do
35
- expect(subject.title('foo')).to have_tag(:meta, with: { property: 'og:title', content: 'foo' })
35
+ expect(subject.title('foo')).to have_tag(:meta, with: { name: 'og:title', content: 'foo' })
36
36
  expect(subject.title('foo')).to have_tag(:meta, with: { name: 'twitter:title', content: 'foo' })
37
37
  end
38
38
  end
@@ -44,7 +44,7 @@ module Showcase::Helpers
44
44
  end
45
45
 
46
46
  it 'produces a og:description meta tag' do
47
- expect(subject.description('foo')).to have_tag(:meta, with: { property: 'og:description', content: 'foo' })
47
+ expect(subject.description('foo')).to have_tag(:meta, with: { name: 'og:description', content: 'foo' })
48
48
  end
49
49
 
50
50
  it 'produces a twitter:description meta tag' do
@@ -60,7 +60,7 @@ module Showcase::Helpers
60
60
 
61
61
  describe '#image_url' do
62
62
  it 'produces a og:image meta tag' do
63
- expect(subject.image_url('foo')).to have_tag(:meta, with: { property: 'og:image', content: 'foo' })
63
+ expect(subject.image_url('foo')).to have_tag(:meta, with: { name: 'og:image', content: 'foo' })
64
64
  end
65
65
 
66
66
  it 'produces a twitter:image meta tag' do
@@ -69,14 +69,14 @@ module Showcase::Helpers
69
69
 
70
70
  context 'with multiple values' do
71
71
  it 'uses the first non-blank' do
72
- expect(subject.image_url(['', nil, 'foo'])).to have_tag(:meta, with: { property: 'og:image', content: 'foo' })
72
+ expect(subject.image_url(['', nil, 'foo'])).to have_tag(:meta, with: { name: 'og:image', content: 'foo' })
73
73
  end
74
74
  end
75
75
  end
76
76
 
77
77
  describe '#canonical_url' do
78
78
  it 'produces a og:url meta tag' do
79
- expect(subject.canonical_url('foo')).to have_tag(:meta, with: { property: 'og:url', content: 'foo' })
79
+ expect(subject.canonical_url('foo')).to have_tag(:meta, with: { name: 'og:url', content: 'foo' })
80
80
  end
81
81
 
82
82
  it 'produces a canonical link tag' do
@@ -85,44 +85,11 @@ module Showcase::Helpers
85
85
 
86
86
  context 'with multiple values' do
87
87
  it 'uses the first non-blank' do
88
- expect(subject.canonical_url(['', nil, 'foo'])).to have_tag(:meta, with: { property: 'og:url', content: 'foo' })
88
+ expect(subject.canonical_url(['', nil, 'foo'])).to have_tag(:meta, with: { name: 'og:url', content: 'foo' })
89
89
  end
90
90
  end
91
91
  end
92
92
 
93
- describe '#iframe_video_url' do
94
- it 'produces a og:video:url meta tag' do
95
- expect(subject.iframe_video_url('foo')).to have_tag(:meta, with: { property: 'og:video:url', content: 'foo' })
96
- end
97
-
98
- it 'produces a twitter:player meta tag' do
99
- expect(subject.iframe_video_url('foo')).to have_tag(:meta, with: { name: 'twitter:player', content: 'foo' })
100
- end
101
-
102
- it 'produces a og:video:type meta tag' do
103
- expect(subject.iframe_video_url('foo')).to have_tag(:meta, with: { property: 'og:video:type', content: 'text/html' })
104
- end
105
- end
106
-
107
- describe '#stream_video_url' do
108
- it 'produces a og:video:url meta tag' do
109
- expect(subject.stream_video_url('foo')).to have_tag(:meta, with: { property: 'og:video:url', content: 'foo' })
110
- end
111
-
112
- it 'produces a twitter:player:stream meta tag' do
113
- expect(subject.stream_video_url('foo')).to have_tag(:meta, with: { name: 'twitter:player:stream', content: 'foo' })
114
- end
115
-
116
- it 'produces a og:video:type meta tag' do
117
- expect(subject.stream_video_url('foo')).to have_tag(:meta, with: { property: 'og:video:type', content: 'video/mp4' })
118
- end
119
- end
120
-
121
- describe '#site_name' do
122
- it 'produces a og:site_name meta tag' do
123
- expect(subject.site_name('foo')).to have_tag(:meta, with: { property: 'og:site_name', content: 'foo' })
124
- end
125
- end
126
93
  end
127
94
  end
128
95
 
@@ -2,12 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  module Showcase::Traits
4
4
  describe Base do
5
- describe '.define_module_method' do
5
+ describe '.define_method?' do
6
6
 
7
7
  it 'defines an instance method' do
8
8
  klass = Class.new do
9
9
  include Base
10
- define_module_method :foo do
10
+ define_method? :foo do
11
11
  true
12
12
  end
13
13
  end
@@ -15,22 +15,6 @@ module Showcase::Traits
15
15
  expect(klass.new.foo).to be_true
16
16
  end
17
17
 
18
- it 'overriding the method allows to call super' do
19
- klass = Class.new do
20
- include Base
21
-
22
- define_module_method :foo do
23
- true
24
- end
25
-
26
- def foo
27
- super
28
- end
29
- end
30
-
31
- expect(klass.new.foo).to be_true
32
- end
33
-
34
18
  context 'if the method is already present' do
35
19
  it 'no-ops ' do
36
20
  klass = Class.new do
@@ -46,7 +30,7 @@ module Showcase::Traits
46
30
  it 'joins them in snake case' do
47
31
  klass = Class.new do
48
32
  include Base
49
- define_module_method [:foo, :bar] do
33
+ define_method? [:foo, :bar] do
50
34
  true
51
35
  end
52
36
  end
@@ -57,7 +41,7 @@ module Showcase::Traits
57
41
  it 'ignores blank chunks' do
58
42
  klass = Class.new do
59
43
  include Base
60
- define_module_method ["", :bar] do
44
+ define_method? ["", :bar] do
61
45
  true
62
46
  end
63
47
  end
@@ -20,13 +20,10 @@ module Showcase::Traits
20
20
  c.url = url
21
21
  c.label = 'Label'
22
22
  c.active = active
23
- c.html_options role: 'label'
24
23
  end
25
24
 
26
- link_to :foo do |c|
25
+ link_to :foo do
27
26
  c.url = '#foo'
28
- c.active_class = 'current'
29
- c.active = active
30
27
  end
31
28
 
32
29
  def url
@@ -46,10 +43,6 @@ module Showcase::Traits
46
43
  expect(subject.link).to have_tag(:a, text: 'Label')
47
44
  end
48
45
 
49
- it 'with the specified html attributes' do
50
- expect(subject.link).to have_tag(:a, with: { role: 'label' })
51
- end
52
-
53
46
  context 'with a different label as parameter' do
54
47
  it 'uses it' do
55
48
  expect(subject.link('Foo')).to have_tag(:a, text: 'Foo')
@@ -72,18 +65,12 @@ module Showcase::Traits
72
65
  let(:active) { true }
73
66
 
74
67
  it 'adds an active class to the link' do
75
- expect(subject.link('label')).to have_tag(:a, with: { class: 'active' })
68
+ expect(subject.link).to have_tag(:a, with: { class: 'active' })
76
69
  end
77
70
 
78
71
  context 'with additional classes' do
79
72
  it 'it sums them' do
80
- expect(subject.link('label', class: 'extra')).to have_tag(:a, with: { class: 'extra active' })
81
- end
82
- end
83
-
84
- context 'if a different CSS class was specified' do
85
- it 'adds it to the link' do
86
- expect(subject.foo_link('label')).to have_tag(:a, with: { class: 'current' })
73
+ expect(subject.link(class: 'extra')).to have_tag(:a, with: { class: 'extra active' })
87
74
  end
88
75
  end
89
76
  end
@@ -8,10 +8,6 @@ module Showcase::Traits
8
8
  let(:presenter) {
9
9
  Class.new(Showcase::Presenter) do
10
10
  include Record
11
-
12
- box do |c|
13
- c.html_options role: 'actor', class: 'first'
14
- end
15
11
  end
16
12
  }
17
13
  subject { presenter.new(record, view) }
@@ -34,11 +30,6 @@ module Showcase::Traits
34
30
  expect(result).to have_tag(:div, with: { class: 'model', id: 'model_1' })
35
31
  end
36
32
 
37
- it 'adds attributes specified within box block' do
38
- result = subject.box { "foo" }
39
- expect(result).to have_tag(:div, with: { role: 'actor', class: 'first' })
40
- end
41
-
42
33
  context 'with a specified tag' do
43
34
  it 'uses it' do
44
35
  result = subject.box(:span) { "foo" }
@@ -12,10 +12,6 @@ module Showcase::Traits
12
12
  Class.new(Showcase::Presenter) do
13
13
  include Seo
14
14
 
15
- default_seo_options do |c|
16
- c.title_suffix = ' - qux'
17
- end
18
-
19
15
  seo do |c|
20
16
  c.title = 'foo'
21
17
  c.description 'bar'
@@ -23,27 +19,16 @@ module Showcase::Traits
23
19
  end
24
20
  }
25
21
 
26
- describe '.seo' do
27
- let(:expected_options) { { title_suffix: ' - qux' } }
28
- let(:expected_description) { 'bar' }
29
- let(:expected_title) { 'foo' }
30
-
22
+ describe '#seo' do
23
+ let(:options) { double('options') }
31
24
  before do
32
25
  Showcase::Helpers::SeoMetaBuilder.stub(:new).with(view).and_return(builder)
33
- builder.stub(:title).with(expected_title, expected_options).and_return('<title>')
34
- builder.stub(:description).with(expected_description, expected_options).and_return('<description>')
26
+ builder.stub(:title).with('foo', options).and_return('<title>')
27
+ builder.stub(:description).with('bar', options).and_return('<description>')
35
28
  end
36
29
 
37
30
  it 'defines a seo_tags method that ouputs seo meta tags' do
38
- expect(subject.seo_tags).to eq '<title><description>'
39
- end
40
-
41
- describe '#seo_tags' do
42
- let(:expected_title) { 'other' }
43
-
44
- it 'allows to override options' do
45
- expect(subject.seo_tags(title: 'other')).to eq '<title><description>'
46
- end
31
+ expect(subject.seo_tags(options)).to eq '<title><description>'
47
32
  end
48
33
  end
49
34
 
@@ -14,9 +14,7 @@ module Showcase::Traits
14
14
  share do |c|
15
15
  c.url = 'url'
16
16
  c.text = 'text'
17
- c.twitter_text = 'twitter text'
18
17
  c.image_url = 'image'
19
- c.html_options = { role: 'share' }
20
18
  end
21
19
 
22
20
  share :foo do |c|
@@ -30,7 +28,7 @@ module Showcase::Traits
30
28
 
31
29
  describe '#social_share' do
32
30
  expected_urls = {
33
- twitter: "https://twitter.com/intent/tweet?text=twitter+text&url=url",
31
+ twitter: "https://twitter.com/intent/tweet?text=text&url=url",
34
32
  facebook: "http://www.facebook.com/sharer/sharer.php?u=url",
35
33
  gplus: "https://plus.google.com/share?url=url",
36
34
  pinterest: "http://www.pinterest.com/pin/create/button/?media=image&title=text&url=url",
@@ -41,19 +39,10 @@ module Showcase::Traits
41
39
  it "produces a #{provider} share link" do
42
40
  expect(subject.send("#{provider}_share_link")).to have_tag(:a)
43
41
  end
44
-
45
42
  it "produces a #{provider} share url" do
46
43
  expect(subject.send("#{provider}_share_url")).to eq url
47
44
  end
48
45
 
49
- it "adds a target :blank to the link" do
50
- expect(subject.send("#{provider}_share_link")).to have_tag(:a, with: { target: '_blank' })
51
- end
52
-
53
- it "merges additional html_options" do
54
- expect(subject.send("#{provider}_share_link")).to have_tag(:a, with: { role: 'share' })
55
- end
56
-
57
46
  context 'with prefix' do
58
47
  it 'prefixes link method' do
59
48
  expect(subject).to respond_to "foo_#{provider}_share_link"
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.0.beta.5
4
+ version: 0.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-28 00:00:00.000000000 Z
11
+ date: 2013-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -82,7 +82,7 @@ dependencies:
82
82
  version: '0'
83
83
  description: A barebone and framework agnostic presenter implementation
84
84
  email:
85
- - stefano.verna@gmail.com
85
+ - stefano.verna@welaika.com
86
86
  executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
@@ -90,21 +90,16 @@ files:
90
90
  - .gitignore
91
91
  - .rspec
92
92
  - .travis.yml
93
- - Appraisals
94
93
  - Gemfile
95
94
  - LICENSE.txt
96
95
  - README.md
97
96
  - Rakefile
98
- - gemfiles/rails_32.gemfile
99
- - gemfiles/rails_4.gemfile
100
97
  - lib/generators/showcase/presenter/USAGE
101
98
  - lib/generators/showcase/presenter/presenter_generator.rb
102
99
  - lib/generators/showcase/presenter/templates/presenter.rb
103
100
  - lib/showcase.rb
101
+ - lib/showcase/helpers.rb
104
102
  - lib/showcase/helpers/config_object.rb
105
- - lib/showcase/helpers/html_options.rb
106
- - lib/showcase/helpers/module_method_builder.rb
107
- - lib/showcase/helpers/present.rb
108
103
  - lib/showcase/helpers/seo_meta_builder.rb
109
104
  - lib/showcase/presenter.rb
110
105
  - lib/showcase/railtie.rb
data/Appraisals DELETED
@@ -1,8 +0,0 @@
1
- appraise "rails-32" do
2
- gem "rails", "3.2.14"
3
- end
4
-
5
- appraise "rails-4" do
6
- gem "rails", "4.0.0"
7
- end
8
-
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "appraisal"
6
- gem "rails", "3.2.14"
7
-
8
- gemspec :path=>"../"
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "appraisal"
6
- gem "rails", "4.0.0"
7
-
8
- gemspec :path=>"../"
@@ -1,22 +0,0 @@
1
- class HtmlOptions
2
- def initialize(options = {})
3
- @options = (options || {}).symbolize_keys
4
- end
5
-
6
- def add_class!(css_class)
7
- @options[:class] ||= ""
8
- css_classes = @options[:class].split(/\s+/)
9
- css_classes << css_class
10
- @options[:class] = css_classes.join(" ")
11
- end
12
-
13
- def merge_attrs!(options = {})
14
- options = (options || {}).symbolize_keys
15
- @options.merge!(options)
16
- end
17
-
18
- def to_h
19
- @options.dup
20
- end
21
- end
22
-
@@ -1,19 +0,0 @@
1
- module Showcase
2
- module Helpers
3
- module ModuleMethodBuilder
4
- def define_module_method(name_chunks, &block)
5
- method_name = Array(name_chunks).map(&:to_s).map(&:presence).compact.join("_")
6
- if method_defined?(method_name)
7
- false
8
- else
9
- method_module = Module.new do
10
- define_method(method_name, &block)
11
- end
12
- include(method_module)
13
- true
14
- end
15
- end
16
- end
17
- end
18
- end
19
-
@@ -1,35 +0,0 @@
1
- require 'active_support/concern'
2
- require 'active_support/inflector'
3
- require 'active_support/core_ext/hash/keys'
4
-
5
- module Showcase
6
- module Helpers
7
- module Present
8
- extend ActiveSupport::Concern
9
-
10
- def presenter_context
11
- if respond_to? :view_context
12
- view_context
13
- else
14
- self
15
- end
16
- end
17
-
18
- def present(obj, klass = nil, context = presenter_context, options = {})
19
- options.assert_valid_keys(:nil_presenter)
20
-
21
- if obj || options.fetch(:nil_presenter, false)
22
- klass ||= "#{obj.class.name}Presenter".constantize
23
- klass.new(obj, context)
24
- else
25
- nil
26
- end
27
- end
28
-
29
- def present_collection(obj, klass = nil, context = presenter_context, options = {})
30
- obj.map { |o| present(o, klass, context, options) }
31
- end
32
- end
33
- end
34
- end
35
-